From 9125a0d2faf4c8b2cf0978e0fc185c0b6bcc7a5c Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Fri, 21 Feb 2020 03:22:17 +0000 Subject: [PATCH 01/18] Moved invoice code out of JO controller. #354 --- src/Controller/JobOrderController.php | 11 ++--------- .../InvoiceGenerator/CMBInvoiceGenerator.php | 19 +++++++++++++++++++ .../InvoiceGenerator/ResqInvoiceGenerator.php | 16 +++++++++++++++- src/Service/InvoiceGeneratorInterface.php | 3 +++ 4 files changed, 39 insertions(+), 10 deletions(-) diff --git a/src/Controller/JobOrderController.php b/src/Controller/JobOrderController.php index 44265309..3c8ad158 100644 --- a/src/Controller/JobOrderController.php +++ b/src/Controller/JobOrderController.php @@ -696,7 +696,7 @@ class JobOrderController extends Controller $items = $req->request->get('items'); $promo_id = $req->request->get('promo'); $cvid = $req->request->get('cvid'); - $service_charges = $req->request->get('service_charges'); + $service_charges = $req->request->get('service_charges', []); $em = $this->getDoctrine()->getManager(); @@ -740,14 +740,7 @@ class JobOrderController extends Controller } */ - // TODO: this snippet should be in the invoice generator - $error = $ic->validateDiscount($criteria, $promo_id); - - // process service charges - $error = $ic->invoiceServiceCharges($criteria, $service_charges); - - if (!$error) - $error = $ic->invoiceBatteries($criteria, $items); + $error = $ic->generateDraftInvoice($criteria, $promo_id, $service_charges, $items); if ($error) { diff --git a/src/Service/InvoiceGenerator/CMBInvoiceGenerator.php b/src/Service/InvoiceGenerator/CMBInvoiceGenerator.php index cc1cb020..534600fb 100644 --- a/src/Service/InvoiceGenerator/CMBInvoiceGenerator.php +++ b/src/Service/InvoiceGenerator/CMBInvoiceGenerator.php @@ -204,6 +204,25 @@ class CMBInvoiceGenerator implements InvoiceGeneratorInterface } } + // prepare draft for invoice + public function generateDraftInvoice($criteria, $discount, $service_charges, $items) + { + $ierror = $this->validateDiscount($criteria, $discount); + + if (!$ierror) + { + // process service charges + $ierror = $this->invoiceServiceCharges($criteria, $service_charges); + + if (!$ierror) + { + $ierror = $this->invoiceBatteries($criteria, $items); + } + } + + return $ierror; + } + protected function getTaxAmount($price) { $vat_ex_price = $this->getTaxExclusivePrice($price); diff --git a/src/Service/InvoiceGenerator/ResqInvoiceGenerator.php b/src/Service/InvoiceGenerator/ResqInvoiceGenerator.php index f9aad46a..2999d622 100644 --- a/src/Service/InvoiceGenerator/ResqInvoiceGenerator.php +++ b/src/Service/InvoiceGenerator/ResqInvoiceGenerator.php @@ -194,6 +194,20 @@ class ResqInvoiceGenerator implements InvoiceGeneratorInterface } } + // prepare draft for invoice + public function generateDraftInvoice($criteria, $promo_id, $service_charges, $items) + { + $ierror = $this->invoicePromo($criteria, $promo_id); + + if (!$ierror) + { + $ierror = $this->invoiceBatteries($criteria, $items); + } + + return $ierror; + } + + protected function getTaxAmount($price) { $vat_ex_price = $this->getTaxExclusivePrice($price); @@ -227,7 +241,7 @@ class ResqInvoiceGenerator implements InvoiceGeneratorInterface return 0; } - public function invoicePromo(InvoiceCriteria $criteria, $promo_id) + protected function invoicePromo(InvoiceCriteria $criteria, $promo_id) { // return error if there's a problem, false otherwise // check service type diff --git a/src/Service/InvoiceGeneratorInterface.php b/src/Service/InvoiceGeneratorInterface.php index 85407c30..3e1c5f88 100644 --- a/src/Service/InvoiceGeneratorInterface.php +++ b/src/Service/InvoiceGeneratorInterface.php @@ -15,4 +15,7 @@ interface InvoiceGeneratorInterface // generate invoice criteria public function generateInvoiceCriteria(JobOrder $jo, int $promo_id, array $invoice_items, array &$error_array); + // prepare draft for invoice + public function generateDraftInvoice(InvoiceCriteria $criteria, int $promo_id, array $service_charges, array $items); + } From e93e0dd9431d83290ee3d815a4f614b291dba132 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Fri, 21 Feb 2020 05:10:11 +0000 Subject: [PATCH 02/18] Bug fix for loading JO form for edit. #354 --- templates/job-order/form.html.twig | 3 +++ 1 file changed, 3 insertions(+) diff --git a/templates/job-order/form.html.twig b/templates/job-order/form.html.twig index a0e5985c..bba70b39 100644 --- a/templates/job-order/form.html.twig +++ b/templates/job-order/form.html.twig @@ -47,6 +47,9 @@
+ {% if mode in ['update-assigning', 'update-processing', 'update-reassign-hub', 'update-reassign-rider', 'update-all', 'open_edit'] %} + + {% endif %}
{% if ftags.vehicle_dropdown %} From 4700d2b84035597828d90a4b1e103832aa7fa0ec Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Mon, 24 Feb 2020 09:28:38 +0000 Subject: [PATCH 03/18] Remove link to list of JOs ready to be fulfilled. #270 --- config/cmb.menu.yaml | 4 ---- config/menu.yaml | 4 ---- 2 files changed, 8 deletions(-) diff --git a/config/cmb.menu.yaml b/config/cmb.menu.yaml index 7c6b4d82..9f28b315 100644 --- a/config/cmb.menu.yaml +++ b/config/cmb.menu.yaml @@ -110,10 +110,6 @@ main_menu: acl: jo_walkin.form label: Walk-in parent: joborder - - id: jo_fulfill - acl: jo_fulfill.list - label: Fulfillment - parent: joborder - id: jo_open acl: jo_open.list label: Open diff --git a/config/menu.yaml b/config/menu.yaml index 7c6b4d82..9f28b315 100644 --- a/config/menu.yaml +++ b/config/menu.yaml @@ -110,10 +110,6 @@ main_menu: acl: jo_walkin.form label: Walk-in parent: joborder - - id: jo_fulfill - acl: jo_fulfill.list - label: Fulfillment - parent: joborder - id: jo_open acl: jo_open.list label: Open From 22be1eaf5a29938d9fda1348a79d456935abe874 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Mon, 24 Feb 2020 10:33:13 +0000 Subject: [PATCH 04/18] Fix edit for walkin JOs. #270 --- src/Controller/JobOrderController.php | 8 ++++---- src/Service/JobOrderHandler/CMBJobOrderHandler.php | 12 ++++++++++-- templates/job-order/cmb.form.walkin.html.twig | 9 ++------- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/Controller/JobOrderController.php b/src/Controller/JobOrderController.php index edddc3f1..dad6a8d4 100644 --- a/src/Controller/JobOrderController.php +++ b/src/Controller/JobOrderController.php @@ -277,13 +277,13 @@ class JobOrderController extends Controller $rows[$key]['meta']['reassign_hub_url'] = $this->generateUrl('jo_open_hub_form', ['id' => $jo_id]); $rows[$key]['meta']['reassign_rider_url'] = $this->generateUrl('jo_open_rider_form', ['id' => $jo_id]); // $rows[$key]['meta']['edit_url'] = $this->generateUrl('jo_open_edit_form', ['id' => $jo_id]); - $rows[$key]['meta']['edit_url'] = $this->generateUrl($jo_handler->getEditRoute(), ['id' => $jo_id]); + $rows[$key]['meta']['edit_url'] = $this->generateUrl($jo_handler->getEditRoute($jo_id), ['id' => $jo_id]); $rows[$key]['meta']['onestep_edit_url'] = $this->generateUrl('jo_onestep_edit_form', ['id' => $jo_id]); } else { // $rows[$key]['meta']['update_url'] = $this->generateUrl($tier_params['edit_route'], ['id' => $jo_id]); - $rows[$key]['meta']['update_url'] = $this->generateUrl($jo_handler->getEditRoute(), ['id' => $jo_id]); + $rows[$key]['meta']['update_url'] = $this->generateUrl($jo_handler->getEditRoute($jo_id), ['id' => $jo_id]); $rows[$key]['meta']['onestep_edit_url'] = $this->generateUrl('jo_onestep_edit_form', ['id' => $jo_id]); $rows[$key]['meta']['pdf_url'] = $this->generateUrl('jo_pdf_form', ['id' => $jo_id]); } @@ -1037,12 +1037,12 @@ class JobOrderController extends Controller return $this->render($template, $params); } - public function walkInEditSubmit(Request $req, JobOrderHandlerInterface $jo_handler) + public function walkInEditSubmit(Request $req, JobOrderHandlerInterface $jo_handler, $id) { $this->denyAccessUnlessGranted('jo_walkin.edit', null, 'No access.'); $error_array = []; - $error_array = $jo_handler->processOneStepJobOrder($req, $id); + $error_array = $jo_handler->processWalkinJobOrder($req, $id); // check if any errors were found if (!empty($error_array)) { diff --git a/src/Service/JobOrderHandler/CMBJobOrderHandler.php b/src/Service/JobOrderHandler/CMBJobOrderHandler.php index d109d4c3..2e16f2e9 100644 --- a/src/Service/JobOrderHandler/CMBJobOrderHandler.php +++ b/src/Service/JobOrderHandler/CMBJobOrderHandler.php @@ -2997,8 +2997,16 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface } } - public function getEditRoute() + public function getEditRoute($jo_id) { - return 'jo_onestep_edit_form'; + $jo = $this->em->getRepository(JobOrder::class)->find($jo_id); + if (empty($jo)) + throw new NotFoundHttpException('The item does not exist'); + + // check transaction origin + if ($jo->getSource() == TransactionOrigin::WALK_IN) + return 'jo_walkin_edit_form'; + else + return 'jo_onestep_edit_form'; } } diff --git a/templates/job-order/cmb.form.walkin.html.twig b/templates/job-order/cmb.form.walkin.html.twig index f2e02e44..667d84e3 100644 --- a/templates/job-order/cmb.form.walkin.html.twig +++ b/templates/job-order/cmb.form.walkin.html.twig @@ -347,7 +347,7 @@ {% endif %} - +
@@ -557,7 +557,7 @@ function get_vehicle_makes(mfg_id, vid = 0) { $(function() { var form_in_process = false; - var selected_hub = ''; + var selected_hub = '{{ obj.getHub ? obj.getHub.getID : "" }}'; $(function() { $('#hubs-table').on('click', 'tr', function() { @@ -592,11 +592,6 @@ $(function() { // add invoice items to data fields['invoice_items'] = invoiceItems; - {% if mode in ['update-processing', 'update-reassign-hub'] %} - // add selected hub to data - fields['hub'] = selectedHub; - {% endif %} - e.preventDefault(); $.ajax({ From d534ce3241ab440d30646068e8da81cd8d798bd4 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Tue, 25 Feb 2020 03:37:58 +0000 Subject: [PATCH 05/18] Add getEditRoute for resq. #357 --- src/Controller/JobOrderController.php | 4 +-- .../JobOrderHandler/ResqJobOrderHandler.php | 27 ++++++++++++++++++- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/Controller/JobOrderController.php b/src/Controller/JobOrderController.php index dad6a8d4..da68cf5a 100644 --- a/src/Controller/JobOrderController.php +++ b/src/Controller/JobOrderController.php @@ -277,13 +277,13 @@ class JobOrderController extends Controller $rows[$key]['meta']['reassign_hub_url'] = $this->generateUrl('jo_open_hub_form', ['id' => $jo_id]); $rows[$key]['meta']['reassign_rider_url'] = $this->generateUrl('jo_open_rider_form', ['id' => $jo_id]); // $rows[$key]['meta']['edit_url'] = $this->generateUrl('jo_open_edit_form', ['id' => $jo_id]); - $rows[$key]['meta']['edit_url'] = $this->generateUrl($jo_handler->getEditRoute($jo_id), ['id' => $jo_id]); + $rows[$key]['meta']['edit_url'] = $this->generateUrl($jo_handler->getEditRoute($jo_id, $tier_params), ['id' => $jo_id]); $rows[$key]['meta']['onestep_edit_url'] = $this->generateUrl('jo_onestep_edit_form', ['id' => $jo_id]); } else { // $rows[$key]['meta']['update_url'] = $this->generateUrl($tier_params['edit_route'], ['id' => $jo_id]); - $rows[$key]['meta']['update_url'] = $this->generateUrl($jo_handler->getEditRoute($jo_id), ['id' => $jo_id]); + $rows[$key]['meta']['update_url'] = $this->generateUrl($jo_handler->getEditRoute($jo_id, $tier_params), ['id' => $jo_id]); $rows[$key]['meta']['onestep_edit_url'] = $this->generateUrl('jo_onestep_edit_form', ['id' => $jo_id]); $rows[$key]['meta']['pdf_url'] = $this->generateUrl('jo_pdf_form', ['id' => $jo_id]); } diff --git a/src/Service/JobOrderHandler/ResqJobOrderHandler.php b/src/Service/JobOrderHandler/ResqJobOrderHandler.php index 12995e56..9372b8a5 100644 --- a/src/Service/JobOrderHandler/ResqJobOrderHandler.php +++ b/src/Service/JobOrderHandler/ResqJobOrderHandler.php @@ -2588,7 +2588,32 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface } } - public function getEditRoute() + public function getEditRoute($jo_id, $tier) { + $edit_route = ''; + + if (empty($tier)) + return $edit_route; + + switch ($tier) + { + case 'proc': + $edit_route = 'jo_proc_form'; + break; + case 'assign': + $edit_route = 'jo_assign_form'; + break; + case 'fulfill': + $edit_route = 'jo_fulfill_form'; + break; + case 'all': + $edit_route = 'jo_all_form'; + break; + default: + // do nothing + // for 'open', edit route is blank + } + + return $edit_route; } } From 3d40bc62383f28982363681f0213bc9299d47ee2 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Tue, 25 Feb 2020 07:18:55 +0000 Subject: [PATCH 06/18] Remove links to onestep edit from templates for resq. Fix for getEditRoute issues found during testing. #357 --- src/Controller/JobOrderController.php | 4 +-- .../JobOrderHandler/ResqJobOrderHandler.php | 25 ++----------------- .../job-order/list.fulfillment.html.twig | 2 +- templates/job-order/list.open.html.twig | 3 --- 4 files changed, 5 insertions(+), 29 deletions(-) diff --git a/src/Controller/JobOrderController.php b/src/Controller/JobOrderController.php index 9388de32..1d1d84c1 100644 --- a/src/Controller/JobOrderController.php +++ b/src/Controller/JobOrderController.php @@ -277,13 +277,13 @@ class JobOrderController extends Controller $rows[$key]['meta']['reassign_hub_url'] = $this->generateUrl('jo_open_hub_form', ['id' => $jo_id]); $rows[$key]['meta']['reassign_rider_url'] = $this->generateUrl('jo_open_rider_form', ['id' => $jo_id]); // $rows[$key]['meta']['edit_url'] = $this->generateUrl('jo_open_edit_form', ['id' => $jo_id]); - $rows[$key]['meta']['edit_url'] = $this->generateUrl($jo_handler->getEditRoute($jo_id, $tier_params), ['id' => $jo_id]); + $rows[$key]['meta']['edit_url'] = $this->generateUrl($jo_handler->getEditRoute($jo_id, $tier_params['edit_route']), ['id' => $jo_id]); $rows[$key]['meta']['onestep_edit_url'] = $this->generateUrl('jo_onestep_edit_form', ['id' => $jo_id]); } else { // $rows[$key]['meta']['update_url'] = $this->generateUrl($tier_params['edit_route'], ['id' => $jo_id]); - $rows[$key]['meta']['update_url'] = $this->generateUrl($jo_handler->getEditRoute($jo_id, $tier_params), ['id' => $jo_id]); + $rows[$key]['meta']['update_url'] = $this->generateUrl($jo_handler->getEditRoute($jo_id, $tier_params['edit_route']), ['id' => $jo_id]); $rows[$key]['meta']['onestep_edit_url'] = $this->generateUrl('jo_onestep_edit_form', ['id' => $jo_id]); $rows[$key]['meta']['pdf_url'] = $this->generateUrl('jo_pdf_form', ['id' => $jo_id]); } diff --git a/src/Service/JobOrderHandler/ResqJobOrderHandler.php b/src/Service/JobOrderHandler/ResqJobOrderHandler.php index 9372b8a5..e98eaa45 100644 --- a/src/Service/JobOrderHandler/ResqJobOrderHandler.php +++ b/src/Service/JobOrderHandler/ResqJobOrderHandler.php @@ -2590,30 +2590,9 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface public function getEditRoute($jo_id, $tier) { - $edit_route = ''; - if (empty($tier)) - return $edit_route; + return 'jo_open_edit_form'; - switch ($tier) - { - case 'proc': - $edit_route = 'jo_proc_form'; - break; - case 'assign': - $edit_route = 'jo_assign_form'; - break; - case 'fulfill': - $edit_route = 'jo_fulfill_form'; - break; - case 'all': - $edit_route = 'jo_all_form'; - break; - default: - // do nothing - // for 'open', edit route is blank - } - - return $edit_route; + return $tier; } } diff --git a/templates/job-order/list.fulfillment.html.twig b/templates/job-order/list.fulfillment.html.twig index 8115866d..66d3c837 100644 --- a/templates/job-order/list.fulfillment.html.twig +++ b/templates/job-order/list.fulfillment.html.twig @@ -135,7 +135,7 @@ sortable: false, overflow: 'visible', template: function (row, index, datatable) { - var actions = '' + ''; + var actions = ''; return actions; }, diff --git a/templates/job-order/list.open.html.twig b/templates/job-order/list.open.html.twig index 451d8492..3a407009 100644 --- a/templates/job-order/list.open.html.twig +++ b/templates/job-order/list.open.html.twig @@ -148,9 +148,6 @@ {% if is_granted('jo_open.edit') %} actions += ''; {% endif %} - {% if is_granted('jo_onestep.edit') %} - actions += ''; - {% endif %} return actions; }, From 164e091c1571f0235666714efa90e36887d91070 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Tue, 25 Feb 2020 08:39:30 +0000 Subject: [PATCH 07/18] Remove color field from pdf form. #359 --- src/Service/JobOrderHandler/CMBJobOrderHandler.php | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/Service/JobOrderHandler/CMBJobOrderHandler.php b/src/Service/JobOrderHandler/CMBJobOrderHandler.php index 2e16f2e9..1d06a1c8 100644 --- a/src/Service/JobOrderHandler/CMBJobOrderHandler.php +++ b/src/Service/JobOrderHandler/CMBJobOrderHandler.php @@ -2069,13 +2069,6 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface $pdf->Cell($label_width, $line_height, 'Plate Number:'); $pdf->MultiCell($val_width, $line_height, $cv ? $cv->getPlateNumber() : '', 0, 'L'); - // get Y after left cell - $y1 = $pdf->GetY(); - - $pdf->SetXY($col2_x, $y); - $pdf->Cell($label_width, $line_height, 'Vehicle Color:'); - $pdf->MultiCell(0, $line_height, $cv ? $cv->getColor() : '', 0, 'L'); - // get Y after right cell $y2 = $pdf->GetY(); From 2ab0055286bdbe6b5504873875ac54223cece0e0 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Tue, 25 Feb 2020 09:09:51 +0000 Subject: [PATCH 08/18] Clear battery details when New Customer toggle is on. #358 --- templates/job-order/cmb.form.onestep.html.twig | 7 ++++--- templates/job-order/cmb.form.walkin.html.twig | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/templates/job-order/cmb.form.onestep.html.twig b/templates/job-order/cmb.form.onestep.html.twig index c5246ddb..acd88d56 100644 --- a/templates/job-order/cmb.form.onestep.html.twig +++ b/templates/job-order/cmb.form.onestep.html.twig @@ -206,17 +206,17 @@
- +
- +
- +
@@ -1270,6 +1270,7 @@ $(function() { $('.cust_field').val(''); $('.cv_field').val(''); $('#cv-make').val(''); + $('.battery_field').val(''); } else { $('.cust_field').prop('disabled', true); $('.cv_field').prop('disabled', true); diff --git a/templates/job-order/cmb.form.walkin.html.twig b/templates/job-order/cmb.form.walkin.html.twig index 667d84e3..a72973bd 100644 --- a/templates/job-order/cmb.form.walkin.html.twig +++ b/templates/job-order/cmb.form.walkin.html.twig @@ -206,17 +206,17 @@
- +
- +
- +
@@ -806,6 +806,7 @@ var vdata = false; $('.cust_field').val(''); $('.cv_field').val(''); $('#cv-make').val(''); + $('.battery_field').val(''); } else { $('.cust_field').prop('disabled', true); $('.cv_field').prop('disabled', true); From a0f7ca6abed210df3a6009c0119cf1f73ff0668c Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Thu, 27 Feb 2020 02:07:30 +0000 Subject: [PATCH 09/18] Fix editRoute parameters for CMB. #357 --- src/Service/JobOrderHandler/CMBJobOrderHandler.php | 2 +- src/Service/JobOrderHandler/ResqJobOrderHandler.php | 3 +++ src/Service/JobOrderHandlerInterface.php | 3 +++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Service/JobOrderHandler/CMBJobOrderHandler.php b/src/Service/JobOrderHandler/CMBJobOrderHandler.php index 2e16f2e9..422f5fb7 100644 --- a/src/Service/JobOrderHandler/CMBJobOrderHandler.php +++ b/src/Service/JobOrderHandler/CMBJobOrderHandler.php @@ -2997,7 +2997,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface } } - public function getEditRoute($jo_id) + public function getEditRoute($jo_id, $tier = null) { $jo = $this->em->getRepository(JobOrder::class)->find($jo_id); if (empty($jo)) diff --git a/src/Service/JobOrderHandler/ResqJobOrderHandler.php b/src/Service/JobOrderHandler/ResqJobOrderHandler.php index e98eaa45..a12e09d5 100644 --- a/src/Service/JobOrderHandler/ResqJobOrderHandler.php +++ b/src/Service/JobOrderHandler/ResqJobOrderHandler.php @@ -314,6 +314,9 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface } } + // TODO: check status before saving since JO might already + // have a status that needs to be retained + if (empty($error_array)) { // get current user $user = $this->security->getUser(); diff --git a/src/Service/JobOrderHandlerInterface.php b/src/Service/JobOrderHandlerInterface.php index 5593d10c..590a0926 100644 --- a/src/Service/JobOrderHandlerInterface.php +++ b/src/Service/JobOrderHandlerInterface.php @@ -98,4 +98,7 @@ interface JobOrderHandlerInterface // check if service type is new battery public function checkIfNewBattery(JobOrder $jo); + + // return the edit route, based on tier and form + public function getEditRoute(int $jo_id, $tier); } From 1ab5909dfd6722b03369abbec45764f1ad659ff1 Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Sat, 29 Feb 2020 23:38:05 +0800 Subject: [PATCH 10/18] Add priority field for JobOrder #360 --- src/Entity/JobOrder.php | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/Entity/JobOrder.php b/src/Entity/JobOrder.php index 36834cc1..faa427b0 100644 --- a/src/Entity/JobOrder.php +++ b/src/Entity/JobOrder.php @@ -280,6 +280,14 @@ class JobOrder */ protected $hub_rejections; + // priority order for riders + // NOTE: this is a workaround since changeing rider to jo rider assignment with details requires + // too many changes and may break too many things. + /** + * @ORM\Column(type="integer", options={"default": 0})) + */ + protected $priority; + public function __construct() { $this->date_create = new DateTime(); @@ -297,6 +305,8 @@ class JobOrder $this->trade_in_type = null; $this->flag_rider_rating = false; $this->flag_coolant = false; + + $this->priority = 0; } public function getID() @@ -802,4 +812,15 @@ class JobOrder { return $this->hub_rejections; } + + public function setPriority($priority) + { + $this->priority = $priority; + return $this; + } + + public function getPriority() + { + return $this->priority; + } } From 07753274c33d8e6acd879b8e5481ebaa5bd5af4a Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Sun, 1 Mar 2020 22:14:13 +0800 Subject: [PATCH 11/18] Add initial job order prioritization features #360 --- config/routes/rider.yaml | 10 +++++++ src/Controller/RiderController.php | 45 ++++++++++++++++++++++++++++++ src/Entity/Rider.php | 1 + templates/rider/form.html.twig | 10 +++++++ 4 files changed, 66 insertions(+) diff --git a/config/routes/rider.yaml b/config/routes/rider.yaml index 16a56993..1934a1b1 100644 --- a/config/routes/rider.yaml +++ b/config/routes/rider.yaml @@ -46,3 +46,13 @@ rider_active_jo: path: /riders/{id}/activejo/{jo_id} controller: App\Controller\RiderController::riderActiveJO methods: [GET] + +rider_priority_up_jo: + path: /riders/{id}/priority_up/{jo_id} + controller: App\Controller\RiderController::priorityUpJO + methods: [GET] + +rider_priority_down_jo: + path: /riders/{id}/priority_down/{jo_id} + controller: App\Controller\RiderController::priorityDownJO + methods: [GET] diff --git a/src/Controller/RiderController.php b/src/Controller/RiderController.php index ace84582..184a649d 100644 --- a/src/Controller/RiderController.php +++ b/src/Controller/RiderController.php @@ -534,6 +534,51 @@ class RiderController extends Controller $mclient->sendRiderEvent($jo, $payload); + return $this->redirecttoRoute('rider_update', ['id' => $rider->getID()]); + } + + /** + * @ParamConverter("rider", class="App\Entity\Rider") + * @ParamConverter("jo", class="App\Entity\JobOrder", options={"id": "jo_id"}) + */ + public function priorityUpJO(EntityManagerInterface $em, Rider $rider, JobOrder $jo) + { + error_log("HERE"); + error_log($rider->getID()); + error_log($jo->getID()); + + $jos = $rider->getOpenJobOrders(); + + $old_prio = $jo->getPriority(); + $new_prio = $old_prio - 1; + $jo->setPriority($new_prio); + + foreach ($jos as $rider_jo) + { + // check if it's the same + if ($rider_jo->getID() == $jo->getID()) + continue; + + // if priority is the same as old priority, move it down + if ($new_prio == $rider_jo->getPriority()) + $rider_jo->setPriority($rider_jo->getPriority() + 1); + } + + $em->flush(); + + return $this->redirecttoRoute('rider_update', ['id' => $rider->getID()]); + } + + /** + * @ParamConverter("rider", class="App\Entity\Rider") + * @ParamConverter("jo", class="App\Entity\JobOrder", options={"id": "jo_id"}) + */ + public function priorityDownJO(EntityManagerInterface $em, Rider $rider, JobOrder $jo) + { + error_log("HERE"); + error_log($rider->getID()); + error_log($jo->getID()); + return $this->redirecttoRoute('rider_update', ['id' => $rider->getID()]); } } diff --git a/src/Entity/Rider.php b/src/Entity/Rider.php index 53731475..c588cc77 100644 --- a/src/Entity/Rider.php +++ b/src/Entity/Rider.php @@ -61,6 +61,7 @@ class Rider // job orders that the rider has done /** * @ORM\OneToMany(targetEntity="JobOrder", mappedBy="rider") + * @ORM\OrderBy({"priority" = "ASC"}) */ protected $job_orders; diff --git a/templates/rider/form.html.twig b/templates/rider/form.html.twig index a9b0264c..c1c52708 100644 --- a/templates/rider/form.html.twig +++ b/templates/rider/form.html.twig @@ -180,6 +180,16 @@
{{ jo.getDeliveryAddress|default('') }} {% if jo.getID == active_jo_id %}Active{% endif %} + + + + + + + + + + {% if jo.getID != active_jo_id %} From 977559b88dd732279cdd7bbb77f8f3a8fed55461 Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Mon, 2 Mar 2020 08:33:50 +0800 Subject: [PATCH 12/18] Set priority properly for job order and handle priority down button #360 --- src/Controller/RiderController.php | 29 ++++++++++++++----- .../JobOrderHandler/CMBJobOrderHandler.php | 16 +++++++++- 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/src/Controller/RiderController.php b/src/Controller/RiderController.php index 184a649d..43f5d6d6 100644 --- a/src/Controller/RiderController.php +++ b/src/Controller/RiderController.php @@ -543,16 +543,14 @@ class RiderController extends Controller */ public function priorityUpJO(EntityManagerInterface $em, Rider $rider, JobOrder $jo) { - error_log("HERE"); - error_log($rider->getID()); - error_log($jo->getID()); - $jos = $rider->getOpenJobOrders(); + // set new priority $old_prio = $jo->getPriority(); $new_prio = $old_prio - 1; $jo->setPriority($new_prio); + // go through all rider open JOs and set priority when needed foreach ($jos as $rider_jo) { // check if it's the same @@ -575,9 +573,26 @@ class RiderController extends Controller */ public function priorityDownJO(EntityManagerInterface $em, Rider $rider, JobOrder $jo) { - error_log("HERE"); - error_log($rider->getID()); - error_log($jo->getID()); + $jos = $rider->getOpenJobOrders(); + + // set new priority + $old_prio = $jo->getPriority(); + $new_prio = $old_prio + 1; + $jo->setPriority($new_prio); + + // go through all rider open JOs and set priority when needed + foreach ($jos as $rider_jo) + { + // check if it's the same + if ($rider_jo->getID() == $jo->getID()) + continue; + + // if priority is the same as old priority, move it down + if ($new_prio == $rider_jo->getPriority()) + $rider_jo->setPriority($rider_jo->getPriority() - 1); + } + + $em->flush(); return $this->redirecttoRoute('rider_update', ['id' => $rider->getID()]); } diff --git a/src/Service/JobOrderHandler/CMBJobOrderHandler.php b/src/Service/JobOrderHandler/CMBJobOrderHandler.php index 0e676014..50ef719f 100644 --- a/src/Service/JobOrderHandler/CMBJobOrderHandler.php +++ b/src/Service/JobOrderHandler/CMBJobOrderHandler.php @@ -523,6 +523,19 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface } } + // set priority based on rider's existing open job orders + $rider_jos = $rider->getOpenJobOrders(); + + // get maximum priority then add 1 + // NOTE: this can be a bit buggy due to concurrency issues + // ideally have to lock jo table, but that isn't feasible right now + $priority = 0; + foreach ($rider_jos as $rider_jo) + { + if ($priority < $rider_jo->getPriority()) + $priority = $rider_jo->getPriority() + 1; + } + // get discount and set to meta $discount = $req->request->get('invoice_discount', []); @@ -560,7 +573,8 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface ->setModeOfPayment($req->request->get('mode_of_payment')) ->setLandmark($req->request->get('landmark')) ->setHub($hub) - ->setRider($rider); + ->setRider($rider) + ->setPriority($priority); $jo->addMeta('discount', $discount); $jo->addMeta('service_charges', $service_charges); From 2e3c879fd58470ebb5cc2b9cded4d1bf20e837b7 Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Thu, 5 Mar 2020 07:15:26 +0800 Subject: [PATCH 13/18] Support rider status changes in dashboard map #362 --- public/assets/js/dashboard_map.js | 39 +++++++++++++++++++ public/assets/js/map_mqtt.js | 29 +++++++++++++- .../JobOrderActiveCacheListener.php | 1 + templates/home.html.twig | 1 + 4 files changed, 68 insertions(+), 2 deletions(-) diff --git a/public/assets/js/dashboard_map.js b/public/assets/js/dashboard_map.js index 4691a11d..6cba7d68 100644 --- a/public/assets/js/dashboard_map.js +++ b/public/assets/js/dashboard_map.js @@ -51,6 +51,32 @@ class DashboardMap { return this.map; } + switchRiderStatus(rider_id, rider_status) { + console.log('switching rider ' + rider_id + ' to ' + rider_status); + + // find the marker + console.log(this.rider_markers); + if (this.rider_markers.hasOwnProperty(rider_id)) { + var marker = this.rider_markers[rider_id]; + } else { + // TODO: call ajax to get location and create marker + console.log('marker not found for rider'); + return true; + } + + // add it to proper layer group + console.log(rider_status); + if (rider_status == 'available') { + this.layer_groups.rider_active_jo.removeLayer(marker); + this.layer_groups.rider_available.addLayer(marker); + marker.setIcon(this.options.icons.rider_available); + } else if (rider_status == 'jo') { + this.layer_groups.rider_available.removeLayer(marker); + this.layer_groups.rider_active_jo.addLayer(marker); + marker.setIcon(this.options.icons.rider_active_jo); + } + } + putMarker(id, lat, lng, markers, icon, layer_group, popup_url) { var my = this; // existing marker @@ -131,6 +157,19 @@ class DashboardMap { ); } + removeRiderMarker(id) { + console.log('removing rider marker for ' + id); + var markers = this.rider_markers; + + if (!markers.hasOwnProperty(id)) { + console.log('no such marker to remove'); + return; + } + + this.layer_groups.rider_active_jo.removeLayer(markers[id]); + this.layer_groups.rider_available.removeLayer(markers[id]); + } + loadLocations(location_url) { console.log(this.rider_markers); var my = this; diff --git a/public/assets/js/map_mqtt.js b/public/assets/js/map_mqtt.js index 6eac1f65..8cf3a6af 100644 --- a/public/assets/js/map_mqtt.js +++ b/public/assets/js/map_mqtt.js @@ -27,18 +27,26 @@ class MapEventHandler { console.log('mqtt connected!'); var my = icontext.invocationContext; - // subscribe to rider locations if (my.options.track_rider) { + // subscribe to rider locations console.log('subscribing to ' + my.options.channels.rider_location); my.mqtt.subscribe(my.options.channels.rider_location); + + // subscribe to rider status + console.log('subscribing to ' + my.options.channels.rider_status); + my.mqtt.subscribe(my.options.channels.rider_status); } - // subscribe to jo locations if (my.options.track_jo) { + // subscribe to jo locations console.log('subscribing to ' + my.options.channels.jo_location); my.mqtt.subscribe(my.options.channels.jo_location); + + // subscribe to jo status + console.log('subscribing to ' + my.options.channels.jo_status); my.mqtt.subscribe(my.options.channels.jo_status); } + } onMessage(msg) { @@ -75,8 +83,24 @@ class MapEventHandler { var lat = parseFloat(pl_split[0]); var lng = parseFloat(pl_split[1]); + // TODO: check if available or not this.dashmap.putRiderAvailableMarker(chan_split[1], lat, lng); break; + case "status": + console.log("got status for rider " + chan_split[1] + " - " + payload); + switch (payload) { + case 'available': + this.dashmap.switchRiderStatus(chan_split[1], 'available'); + break; + case 'jo': + console.log('jo status'); + this.dashmap.switchRiderStatus(chan_split[1], 'jo'); + break; + case 'logout': + this.dashmap.removeRiderMarker(chan_split[1]); + break; + } + break; } } @@ -102,6 +126,7 @@ class MapEventHandler { this.dashmap.putCustomerMarker(id, lat, lng); break; case "status": + console.log("got status for jo " + payload); switch (payload) { case 'cancel': case 'fulfill': diff --git a/src/EventListener/JobOrderActiveCacheListener.php b/src/EventListener/JobOrderActiveCacheListener.php index 541ce158..b5dbbd83 100644 --- a/src/EventListener/JobOrderActiveCacheListener.php +++ b/src/EventListener/JobOrderActiveCacheListener.php @@ -92,6 +92,7 @@ class JobOrderActiveCacheListener protected function processInactiveJO($jo, $status = 'cancel') { + error_log('got inactive jo, sending mqtt message for ' . $jo->getID()); // remove from redis cache $this->jo_cache->removeActiveJobOrder($jo); diff --git a/templates/home.html.twig b/templates/home.html.twig index b7ac2c24..19e99011 100644 --- a/templates/home.html.twig +++ b/templates/home.html.twig @@ -51,6 +51,7 @@ function initEventHandler(dashmap) { 'track_rider': true, 'channels': { 'rider_location': 'rider/+/location', + 'rider_status': 'rider/+/status', 'jo_location': 'jo/+/location', 'jo_status': 'jo/+/status' }, From de9e803ad460f12b8ed8add3c74dec06478d2cb8 Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Thu, 5 Mar 2020 08:57:32 +0800 Subject: [PATCH 14/18] Update rider status when job order status is changed #362 --- .../JobOrderActiveCacheListener.php | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/src/EventListener/JobOrderActiveCacheListener.php b/src/EventListener/JobOrderActiveCacheListener.php index b5dbbd83..89eedd01 100644 --- a/src/EventListener/JobOrderActiveCacheListener.php +++ b/src/EventListener/JobOrderActiveCacheListener.php @@ -35,6 +35,7 @@ class JobOrderActiveCacheListener $this->processActiveJO($jo); break; // inactive + // NOTE: should never really get here since it's creation case JOStatus::CANCELLED: $this->processInactiveJO($jo, 'cancel'); break; @@ -84,10 +85,23 @@ class JobOrderActiveCacheListener $coords = $jo->getCoordinates(); // TODO: do we put the key in config? + // send jo location $this->mqtt->publish( 'jo/' . $jo->getID() . '/location', $coords->getLatitude() . ':' . $coords->getLongitude() ); + + // TODO: do we still need to send jo status? + + // send rider status + $rider = $jo->getRider(); + if ($rider != null) + { + $this->mqtt->publish( + 'rider/' . $rider->getID() . '/status', + 'jo' + ); + } } protected function processInactiveJO($jo, $status = 'cancel') @@ -96,11 +110,30 @@ class JobOrderActiveCacheListener // remove from redis cache $this->jo_cache->removeActiveJobOrder($jo); - // TODO: publich to mqtt + // publish to mqtt + // send jo status $this->mqtt->publish( 'jo/' . $jo->getID() . '/status', $status ); + + // send rider status + $rider = $jo->getRider(); + if ($rider != null) + { + // check if rider has any queued jobs + $open_jos = $rider->getOpenJobOrders(); + if (count($open_jos) > 0) + $rider_status = 'jo'; + else + $rider_status = 'available'; + + // send status + $this->mqtt->publish( + 'rider/' . $rider->getID() . '/status', + $rider_status + ); + } } } From bf535e37f5be0c3d919131043af40beee12ccff0 Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Thu, 5 Mar 2020 09:20:16 +0800 Subject: [PATCH 15/18] Make sure rider's active jo is in an open status #362 --- src/Entity/Rider.php | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/Entity/Rider.php b/src/Entity/Rider.php index c588cc77..502d93bc 100644 --- a/src/Entity/Rider.php +++ b/src/Entity/Rider.php @@ -320,7 +320,18 @@ class Rider { // check if we have set a custom active if ($this->active_job_order != null) - return $this->active_job_order; + { + switch ($this->active_job_order->getStatus()) + { + // if jo is open, return it + case JOStatus::ASSIGNED: + case JOStatus::IN_TRANSIT: + case JOStatus::IN_PROGRESS: + return $this->active_job_order; + } + + // if active jo is not open, get the next open one + } // no custom active job order $active_status = [ From e93b6432b0faa1d67e58ba0b061d0bcb1ee2c2f9 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Thu, 5 Mar 2020 06:26:50 +0000 Subject: [PATCH 16/18] Add view all form for cmb. #365 --- .../JobOrderHandler/CMBJobOrderHandler.php | 2 +- templates/job-order/cmb.list.all.html.twig | 202 ++++++++++++++++++ 2 files changed, 203 insertions(+), 1 deletion(-) create mode 100644 templates/job-order/cmb.list.all.html.twig diff --git a/src/Service/JobOrderHandler/CMBJobOrderHandler.php b/src/Service/JobOrderHandler/CMBJobOrderHandler.php index 50ef719f..61eb09b5 100644 --- a/src/Service/JobOrderHandler/CMBJobOrderHandler.php +++ b/src/Service/JobOrderHandler/CMBJobOrderHandler.php @@ -2807,7 +2807,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface $this->template_hash['jo_all_form'] = 'job-order/cmb.form.onestep.html.twig'; $this->template_hash['jo_list_fulfillment'] = 'job-order/cmb.list.fulfillment.html.twig'; $this->template_hash['jo_list_open'] = 'job-order/cmb.list.open.html.twig'; - $this->template_hash['jo_list_all'] = 'job-order/list.all.html.twig'; + $this->template_hash['jo_list_all'] = 'job-order/cmb.list.all.html.twig'; $this->template_hash['jo_onestep_form'] = 'job-order/cmb.form.onestep.html.twig'; $this->template_hash['jo_onestep_edit_form'] = 'job-order/cmb.form.onestep.html.twig'; $this->template_hash['jo_walkin_form'] = 'job-order/cmb.form.walkin.html.twig'; diff --git a/templates/job-order/cmb.list.all.html.twig b/templates/job-order/cmb.list.all.html.twig new file mode 100644 index 00000000..1e8b6511 --- /dev/null +++ b/templates/job-order/cmb.list.all.html.twig @@ -0,0 +1,202 @@ +{% extends 'base.html.twig' %} + +{% block body %} + +
+
+
+

+ Job Orders (All) +

+
+
+
+ +
+ +
+
+
+
+
+
+
+
+
+
+ + + + +
+
+
+
+
+ +
+
+
+
+
+
+ +
+ +
+ +
+
+
+
+
+
+
+ +
+ +
+
+
+
+
+{% endblock %} + +{% block scripts %} + +{% endblock %} From 624cf2fb7d0df61377c0a0cf9dd6ced463e91822 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Thu, 5 Mar 2020 07:17:03 +0000 Subject: [PATCH 17/18] Return the additional values to template. #365 --- .../JobOrderHandler/CMBJobOrderHandler.php | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/Service/JobOrderHandler/CMBJobOrderHandler.php b/src/Service/JobOrderHandler/CMBJobOrderHandler.php index 61eb09b5..f0c4437a 100644 --- a/src/Service/JobOrderHandler/CMBJobOrderHandler.php +++ b/src/Service/JobOrderHandler/CMBJobOrderHandler.php @@ -165,6 +165,25 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface // process rows $rows = []; foreach ($obj_rows as $orow) { + // get car model + $cv = $orow->getCustomerVehicle(); + + $cv_manufacturer = $cv->getVehicle()->getManufacturer()->getName(); + $cv_make = $cv->getVehicle()->getMake(); + $year = $cv->getModelYear(); + + $car_model = $cv_manufacturer . ' ' . $cv_make . ' ' . $year; + + // get rider information + $rider_name = ''; + $rider_plate_number = ''; + $rider = $orow->getRider(); + if (!empty($rider)) + { + $rider_name = $rider->getFullName(); + $rider_plate_number = $rider->getPlateNumber(); + } + // add row data $row['id'] = $orow->getID(); $row['customer_name'] = $orow->getCustomer()->getFirstName() . ' ' . $orow->getCustomer()->getLastName(); @@ -176,6 +195,9 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface $row['flag_advance'] = $orow->isAdvanceOrder(); $row['plate_number'] = $orow->getCustomerVehicle()->getPlateNumber(); $row['is_mobile'] = $orow->getSource() == TransactionOrigin::MOBILE_APP; + $row['car_model'] = $car_model; + $row['rider_name'] = $rider_name; + $row['rider_plate_number'] = $rider_plate_number; $processor = $orow->getProcessedBy(); if ($processor == null) From 2e884ff577034828465232ee6695a8da09d73617 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Thu, 5 Mar 2020 07:22:38 +0000 Subject: [PATCH 18/18] Add additional columns to list of open JOs. #365 --- templates/job-order/cmb.list.open.html.twig | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/templates/job-order/cmb.list.open.html.twig b/templates/job-order/cmb.list.open.html.twig index bffdfd6c..a575e645 100644 --- a/templates/job-order/cmb.list.open.html.twig +++ b/templates/job-order/cmb.list.open.html.twig @@ -111,10 +111,18 @@ field: 'plate_number', title: 'Plate #' }, + { + field: 'car_model', + title: 'Car Model' + }, { field: 'customer_name', title: 'Customer' }, + { + field: 'service_type', + title: 'Service Type', + }, { field: 'delivery_address', title: 'Area' @@ -127,6 +135,14 @@ field: 'date_schedule', title: 'Scheduled Date' }, + { + field: 'rider_name', + title: 'Rider' + }, + { + field: 'rider_plate_number', + title: 'Rider Plate #' + }, { field: 'status', title: 'Status'