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; },