diff --git a/config/acl.yaml b/config/acl.yaml
index ea3e486f..cf0f4bbf 100644
--- a/config/acl.yaml
+++ b/config/acl.yaml
@@ -187,8 +187,12 @@ access_keys:
label: Incoming
- id: jo_proc.list
label: Processing
+ - id: jo_proc.unlock
+ label: Processing Unlock
- id: jo_assign.list
label: Assigning
+ - id: jo_assign.unlock
+ label: Assigning Unlock
- id: jo_fulfill.list
label: Fulfillment
- id: jo_open.list
diff --git a/config/routes/job_order.yaml b/config/routes/job_order.yaml
index 44838104..f5148406 100644
--- a/config/routes/job_order.yaml
+++ b/config/routes/job_order.yaml
@@ -121,4 +121,14 @@ jo_cancel:
jo_search:
path: /job-order/search
controller: App\Controller\JobOrderController::getJobOrders
- methods: [GET]
\ No newline at end of file
+ methods: [GET]
+
+jo_proc_unlock:
+ path: /job-order/{id}/unlock/processor
+ controller: App\Controller\JobOrderController::unlockProcessor
+ methods: [GET]
+
+jo_assign_unlock:
+ path: /job-order/{id}/unlock/assignor
+ controller: App\Controller\JobOrderController::unlockAssignor
+ methods: [GET]
diff --git a/src/Controller/JobOrderController.php b/src/Controller/JobOrderController.php
index 2c49b2e4..19784f52 100644
--- a/src/Controller/JobOrderController.php
+++ b/src/Controller/JobOrderController.php
@@ -278,6 +278,7 @@ class JobOrderController extends BaseController
$tier_name = 'Processing';
$rows_route = 'jo_proc_rows';
$edit_route = 'jo_proc_form';
+ $unlock_route = 'jo_proc_unlock';
$jo_status = JOStatus::PENDING;
break;
case 'assign':
@@ -285,6 +286,7 @@ class JobOrderController extends BaseController
$tier_name = 'Assigning';
$rows_route = 'jo_assign_rows';
$edit_route = 'jo_assign_form';
+ $unlock_route = 'jo_assign_unlock';
$jo_status = JOStatus::RIDER_ASSIGN;
break;
case 'fulfill':
@@ -292,6 +294,7 @@ class JobOrderController extends BaseController
$tier_name = 'Fullfillment';
$rows_route = 'jo_fulfill_rows';
$edit_route = 'jo_fulfill_form';
+ $unlock_route = '';
$jo_status = [
JOStatus::ASSIGNED,
JOStatus::IN_PROGRESS
@@ -323,6 +326,7 @@ class JobOrderController extends BaseController
'name' => $tier_name,
'rows_route' => $rows_route,
'edit_route' => $edit_route,
+ 'unlock_route' => $unlock_route,
'jo_status' => $jo_status
];
}
@@ -466,6 +470,9 @@ class JobOrderController extends BaseController
{
$row['meta']['update_url'] = $this->generateUrl($tier_params['edit_route'], ['id' => $row['id']]);
}
+
+ if ($tier_params['unlock_route'] != '')
+ $row['meta']['unlock_url'] = $this->generateUrl($tier_params['unlock_route'], ['id' => $row['id']]);
$rows[] = $row;
}
@@ -1402,4 +1409,39 @@ class JobOrderController extends BaseController
'invoice' => $invoice
]);
}
+
+ public function unlockProcessor($id)
+ {
+ $this->denyAccessUnlessGranted('jo_proc.unlock', null, 'No access.');
+
+ // clear lock
+ $em = $this->getDoctrine()->getManager();
+ $jo = $em->getRepository(JobOrder::class)->find($id);
+ if ($jo == null)
+ return $this->redirectToRoute('jo_proc');
+
+ $jo->setProcessedBy(null);
+
+ $em->flush();
+
+ // redirect to list
+ return $this->redirectToRoute('jo_proc');
+ }
+
+ public function unlockAssignor($id)
+ {
+ $this->denyAccessUnlessGranted('jo_assign.unlock', null, 'No access.');
+
+ // clear lock
+ $em = $this->getDoctrine()->getManager();
+ $jo = $em->getRepository(JobOrder::class)->find($id);
+ if ($jo == null)
+ return $this->redirectToRoute('jo_assign');
+
+ $jo->setAssignedBy(null);
+ $em->flush();
+
+ // redirect to list
+ return $this->redirectToRoute('jo_assign');
+ }
}
diff --git a/src/Entity/JobOrder.php b/src/Entity/JobOrder.php
index 5bec7ce1..50ffedaf 100644
--- a/src/Entity/JobOrder.php
+++ b/src/Entity/JobOrder.php
@@ -288,7 +288,7 @@ class JobOrder
return $this->created_by;
}
- public function setAssignedBy(User $assigned_by)
+ public function setAssignedBy(User $assigned_by = null)
{
$this->assigned_by = $assigned_by;
return $this;
@@ -299,7 +299,7 @@ class JobOrder
return $this->assigned_by;
}
- public function setProcessedBy(User $user)
+ public function setProcessedBy(User $user = null)
{
$this->processed_by = $user;
return $this;
diff --git a/templates/job-order/list.assigning.html.twig b/templates/job-order/list.assigning.html.twig
index ca7635bc..d1c32275 100644
--- a/templates/job-order/list.assigning.html.twig
+++ b/templates/job-order/list.assigning.html.twig
@@ -109,6 +109,10 @@
overflow: 'visible',
template: function (row, index, datatable) {
var actions = '';
+
+ {% if is_granted('jo_assign.unlock') %}
+ actions += '';
+ {% endif %}
return actions;
},
diff --git a/templates/job-order/list.html.twig b/templates/job-order/list.html.twig
index 2878f10a..114d45f0 100644
--- a/templates/job-order/list.html.twig
+++ b/templates/job-order/list.html.twig
@@ -105,6 +105,10 @@
overflow: 'visible',
template: function (row, index, datatable) {
var actions = '';
+
+ {% if row.meta.unlock_url != "" && is_granted('jo_proc.unlock') %}
+ actions += '';
+ {% endif %}
return actions;
},
diff --git a/templates/job-order/list.processing.html.twig b/templates/job-order/list.processing.html.twig
index 2878f10a..64d7fff8 100644
--- a/templates/job-order/list.processing.html.twig
+++ b/templates/job-order/list.processing.html.twig
@@ -105,6 +105,7 @@
overflow: 'visible',
template: function (row, index, datatable) {
var actions = '';
+ actions += '';
return actions;
},