From fd2fe4fb6fcf8387868ce71cca7766e220fad396 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Mon, 3 Feb 2020 08:59:22 +0000 Subject: [PATCH 01/30] Add routes and UI elements to add compatible battery to vehicle. #323 --- config/routes/battery.yaml | 5 ++ src/Controller/BatteryController.php | 26 ++++++ src/Controller/VehicleController.php | 8 ++ templates/vehicle/form.html.twig | 115 +++++++++++++++++++++------ 4 files changed, 130 insertions(+), 24 deletions(-) diff --git a/config/routes/battery.yaml b/config/routes/battery.yaml index 04a9d952..f8c31836 100644 --- a/config/routes/battery.yaml +++ b/config/routes/battery.yaml @@ -39,6 +39,11 @@ battery_delete: controller: App\Controller\BatteryController::destroy methods: [DELETE] +battery_get: + path: /ajax/battery_find + controller: App\Controller\BatteryController::getBattery + methods: [GET] + # battery manufacturers bmfg_list: diff --git a/src/Controller/BatteryController.php b/src/Controller/BatteryController.php index 059d8b57..bea9eafd 100644 --- a/src/Controller/BatteryController.php +++ b/src/Controller/BatteryController.php @@ -415,6 +415,32 @@ class BatteryController extends Controller ]); } + public function getBattery(Request $req) + { + // no access check, grant all for this ajax call + + error_log($req->query->get('id')); + // parse the id: model size + $batt_specs = explode(" ", $req->query->get('id')); + $bmodel_id = $batt_specs[0]; + $bsize_id = $batt_specs[1]; + + // find the battery using model and size + $em = $this->getDoctrine()->getManager(); + $query = $em->createQuery('select b from App\Entity\Battery b join b.model bm + join b.size bs + where bm.id = :bm_id and bs.id = :bs_id') + ->setParameter('bm_id', $bmodel_id) + ->setParameter('bs_id', $bsize_id); + + $result = $query->getResult(); + + foreach ($result as $row) + { + error_log('id ' . $row->getID()); + } + } + // check if datatable filter is present and append to query protected function setQueryFilters($datatable, &$query) { if (isset($datatable['query']['data-rows-search']) && !empty($datatable['query']['data-rows-search'])) { diff --git a/src/Controller/VehicleController.php b/src/Controller/VehicleController.php index 2df6ec74..f7f8c625 100644 --- a/src/Controller/VehicleController.php +++ b/src/Controller/VehicleController.php @@ -4,7 +4,10 @@ namespace App\Controller; use App\Entity\Vehicle; use App\Entity\VehicleManufacturer; +use App\Entity\BatteryManufacturer; use App\Entity\Battery; +use App\Entity\BatteryModel; +use App\Entity\BatterySize; use Doctrine\ORM\Query; use Symfony\Component\HttpFoundation\Request; @@ -225,6 +228,11 @@ class VehicleController extends Controller $params['years'] = $this->generateYearOptions(); $params['obj'] = $row; + // get battery information for compatible batteries + $params['bmfgs'] = $em->getRepository(BatteryManufacturer::class)->findAll(); + $params['bmodels'] = $em->getRepository(BatteryModel::class)->findAll(); + $params['bsizes'] = $em->getRepository(BatterySize::class)->findAll(); + // response return $this->render('vehicle/form.html.twig', $params); } diff --git a/templates/vehicle/form.html.twig b/templates/vehicle/form.html.twig index 4669d1c2..fdfa1a64 100644 --- a/templates/vehicle/form.html.twig +++ b/templates/vehicle/form.html.twig @@ -96,23 +96,50 @@ {% if mode == 'update' %} -
- -
-
-

- Compatible Batteries -

-
-
-
-
-
-
-
+
+
+
+

+ Compatible Batteries +

+
+
+
+
+
+
+
+ +
+ +
+
+ +
+
+ +
+
+ +
+
+
{% endif %} - - +
@@ -201,19 +228,22 @@ $(function() { }); }); + // initialize battery arrays var battRows = []; var batteryIds = []; + var battModelSize = [] {% for batt in obj.getBatteries %} - trow = { - id: "{{ batt.getID }}", - model: "{{ batt.getModel.getName|default('') }}", - size: "{{ batt.getSize.getName|default('') }}", - sell_price: "{{ batt.getSellingPrice }}" - }; + trow = { + id: "{{ batt.getID }}", + model: "{{ batt.getModel.getName|default('') }}", + size: "{{ batt.getSize.getName|default('') }}", + sell_price: "{{ batt.getSellingPrice }}" + }; - battRows.push(trow); - batteryIds.push({{ batt.getID }}); + battRows.push(trow); + batteryIds.push({{ batt.getID }}); + battModelSize.push({{ batt.getModel.getID }} + ' ' + {{ batt.getSize.getID }}); {% endfor %} // remove battery from table @@ -237,6 +267,43 @@ $(function() { battTable.reload(); }); + // add a battery to the table + $("#btn-add-battery").click(function() { + var bmfg_id = $("#bmfg").val(); + var bmodel_id = $("#bmodel").val(); + var bsize_id = $("#bsize").val(); + + var bmodelsize = (bmodel_id + ' ' + bsize_id); + + console.log(bmodelsize); + + if (battModelSize.indexOf(bmodelsize) !== -1) { + swal({ + title: 'Whoops', + text: 'This battery is already on the list.', + type: 'warning' + }); + return true; + } + + // get the battery given the model and size + $.ajax({ + method: "GET", + url: "{{ url('battery_get') }}", + data: {id: bmodelsize} + }).done(function(response) { + + }) + + // add battery to arrays + battModelSize.push(bmodelsize); + + // refresh the data table + battTable.originalDataSet = battRows; + battTable.reload(); + + }); + // battery data table var battOptions = { data: { From 6bcdf70902b528039c0f615b9a487ad3708caa4a Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Mon, 3 Feb 2020 11:03:52 +0000 Subject: [PATCH 02/30] Display the battery to be added to the form. #323 --- src/Controller/BatteryController.php | 17 +++++++++++++++-- templates/vehicle/form.html.twig | 28 ++++++++++++++++++++-------- 2 files changed, 35 insertions(+), 10 deletions(-) diff --git a/src/Controller/BatteryController.php b/src/Controller/BatteryController.php index bea9eafd..5786945f 100644 --- a/src/Controller/BatteryController.php +++ b/src/Controller/BatteryController.php @@ -419,7 +419,6 @@ class BatteryController extends Controller { // no access check, grant all for this ajax call - error_log($req->query->get('id')); // parse the id: model size $batt_specs = explode(" ", $req->query->get('id')); $bmodel_id = $batt_specs[0]; @@ -435,10 +434,24 @@ class BatteryController extends Controller $result = $query->getResult(); + if (empty($result)) + throw $this->createNotFoundException('The item does not exist'); + + $batteries = []; + foreach ($result as $row) { - error_log('id ' . $row->getID()); + $batteries[] = [ + 'id' => $row->getID(), + 'model' => $row->getModel()->getName(), + 'size' => $row->getSize()->getName(), + 'price' => $row->getSellingPrice(), + ]; } + + return $this->json([ + 'data' => $batteries + ]); } // check if datatable filter is present and append to query diff --git a/templates/vehicle/form.html.twig b/templates/vehicle/form.html.twig index fdfa1a64..cabb658e 100644 --- a/templates/vehicle/form.html.twig +++ b/templates/vehicle/form.html.twig @@ -292,16 +292,28 @@ $(function() { url: "{{ url('battery_get') }}", data: {id: bmodelsize} }).done(function(response) { - - }) + if (response.data.length > 0) { + var batt = response.data[0]; - // add battery to arrays - battModelSize.push(bmodelsize); + batteryIds.push(batt.id); + + brow = { + id: batt.id, + model: batt.model, + size: batt.size, + sell_price: batt.price + }; + + battRows.push(brow); - // refresh the data table - battTable.originalDataSet = battRows; - battTable.reload(); - + // add battery to arrays + battModelSize.push(bmodelsize); + + // refresh the data table + battTable.originalDataSet = battRows; + battTable.reload(); + } + }) }); // battery data table From ac908e9bcd6106b8d6c69ecb363b1f013080fccc Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Mon, 3 Feb 2020 11:23:57 +0000 Subject: [PATCH 03/30] Add saving of battery to vehicle. #323 --- src/Controller/VehicleController.php | 35 ++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/Controller/VehicleController.php b/src/Controller/VehicleController.php index f7f8c625..d09d3752 100644 --- a/src/Controller/VehicleController.php +++ b/src/Controller/VehicleController.php @@ -310,6 +310,41 @@ class VehicleController extends Controller } } } + // need to check if a battery has been added + if (count($current_batteries) < count($batteries)) + { + // get the ids of current batteries + $cbatt_ids = []; + foreach ($current_batteries as $cbatt) + { + $cbatt_ids = [ + $cbatt->getID(), + ]; + } + + // find the battery to add + foreach ($batteries as $batt) + { + $batt_id = $batt; + if (in_array($batt_id, $cbatt_ids)) + { + // do nothing since battery already there + continue; + } + else + { + // batt is the new battery + $battery = $em->getRepository(Battery::class)->find($batt_id); + + if (!empty($battery)) + { + $battery->addVehicle($row); + + $em->persist($battery); + } + } + } + } } else { From 96efa32a124167e729e06f3c021f7ecd79f5de84 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Tue, 4 Feb 2020 01:39:14 +0000 Subject: [PATCH 04/30] Fixes for battery_ajax_get. #323 --- config/routes/battery.yaml | 2 +- src/Controller/BatteryController.php | 26 ++++++++++++++------ templates/vehicle/form.html.twig | 36 ++++++++++++++++++++-------- 3 files changed, 46 insertions(+), 18 deletions(-) diff --git a/config/routes/battery.yaml b/config/routes/battery.yaml index f8c31836..a32aa1b5 100644 --- a/config/routes/battery.yaml +++ b/config/routes/battery.yaml @@ -39,7 +39,7 @@ battery_delete: controller: App\Controller\BatteryController::destroy methods: [DELETE] -battery_get: +battery_ajax_get: path: /ajax/battery_find controller: App\Controller\BatteryController::getBattery methods: [GET] diff --git a/src/Controller/BatteryController.php b/src/Controller/BatteryController.php index 5786945f..e392dd6b 100644 --- a/src/Controller/BatteryController.php +++ b/src/Controller/BatteryController.php @@ -420,22 +420,33 @@ class BatteryController extends Controller // no access check, grant all for this ajax call // parse the id: model size - $batt_specs = explode(" ", $req->query->get('id')); - $bmodel_id = $batt_specs[0]; - $bsize_id = $batt_specs[1]; + $bmfg_id = $req->query->get('mfg_id'); + $bmodel_id = $req->query->get('model_id'); + $bsize_id = $req->query->get('size_id'); // find the battery using model and size $em = $this->getDoctrine()->getManager(); - $query = $em->createQuery('select b from App\Entity\Battery b join b.model bm - join b.size bs - where bm.id = :bm_id and bs.id = :bs_id') + $query = $em->createQuery('SELECT b FROM App\Entity\Battery b + JOIN b.model bm + JOIN b.size bs + JOIN b.manufacturer bmfg + WHERE bm.id = :bm_id + AND bs.id = :bs_id + AND bmfg.id = :bmfg_id') + ->setParameter('bmfg_id', $bmfg_id) ->setParameter('bm_id', $bmodel_id) ->setParameter('bs_id', $bsize_id); $result = $query->getResult(); if (empty($result)) - throw $this->createNotFoundException('The item does not exist'); + { + // TODO: will have to change from 422 to 404 + return $this->json([ + 'success' => false, + 'errors' => "Battery does not exist", + ], 422); + } $batteries = []; @@ -443,6 +454,7 @@ class BatteryController extends Controller { $batteries[] = [ 'id' => $row->getID(), + 'manufacturer' => $row->getManufacturer()->getName(), 'model' => $row->getModel()->getName(), 'size' => $row->getSize()->getName(), 'price' => $row->getSellingPrice(), diff --git a/templates/vehicle/form.html.twig b/templates/vehicle/form.html.twig index cabb658e..09bee95f 100644 --- a/templates/vehicle/form.html.twig +++ b/templates/vehicle/form.html.twig @@ -231,11 +231,12 @@ $(function() { // initialize battery arrays var battRows = []; var batteryIds = []; - var battModelSize = [] + var battMfgModelSize = [] {% for batt in obj.getBatteries %} trow = { id: "{{ batt.getID }}", + manufacturer: "{{ batt.getManufacturer.getName|default('') }} ", model: "{{ batt.getModel.getName|default('') }}", size: "{{ batt.getSize.getName|default('') }}", sell_price: "{{ batt.getSellingPrice }}" @@ -243,7 +244,7 @@ $(function() { battRows.push(trow); batteryIds.push({{ batt.getID }}); - battModelSize.push({{ batt.getModel.getID }} + ' ' + {{ batt.getSize.getID }}); + battMfgModelSize.push({{ batt.getManufacturer.getID }} + ' ' + {{ batt.getModel.getID }} + ' ' + {{ batt.getSize.getID }}); {% endfor %} // remove battery from table @@ -273,11 +274,9 @@ $(function() { var bmodel_id = $("#bmodel").val(); var bsize_id = $("#bsize").val(); - var bmodelsize = (bmodel_id + ' ' + bsize_id); + var batt_key = (bmfg_id + ' ' + bmodel_id + ' ' + bsize_id); - console.log(bmodelsize); - - if (battModelSize.indexOf(bmodelsize) !== -1) { + if (battMfgModelSize.indexOf(batt_key) !== -1) { swal({ title: 'Whoops', text: 'This battery is already on the list.', @@ -289,8 +288,8 @@ $(function() { // get the battery given the model and size $.ajax({ method: "GET", - url: "{{ url('battery_get') }}", - data: {id: bmodelsize} + url: "{{ url('battery_ajax_get') }}", + data: {mfg_id: bmfg_id, model_id: bmodel_id, size_id: bsize_id} }).done(function(response) { if (response.data.length > 0) { var batt = response.data[0]; @@ -299,6 +298,7 @@ $(function() { brow = { id: batt.id, + manufacturer: batt.manufacturer, model: batt.model, size: batt.size, sell_price: batt.price @@ -307,13 +307,25 @@ $(function() { battRows.push(brow); // add battery to arrays - battModelSize.push(bmodelsize); + battMfgModelSize.push(batt_key); // refresh the data table battTable.originalDataSet = battRows; battTable.reload(); } - }) + }).fail(function(response) { + // TODO: change response status to 404. For some strange reason, + // if status is set to 422, the swal does not display. + // Instead, we get the technical error box. + if (response.status == 422) { + swal({ + title: 'Whoops', + text: 'This battery does not exist.', + type: 'warning' + }); + return true; + } + }); }); // battery data table @@ -335,6 +347,10 @@ $(function() { title: 'ID', width: 50 }, + { + field: 'manufacturer', + title: 'Manufacturer', + }, { field: 'size', title: 'Size' From 56a797533d65e02f735dc1bc668c5fab8eb27b88 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Tue, 4 Feb 2020 01:54:43 +0000 Subject: [PATCH 05/30] Add processing of deleting and adding a battery in one request. #323 --- src/Controller/VehicleController.php | 56 ++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/src/Controller/VehicleController.php b/src/Controller/VehicleController.php index d09d3752..7c388062 100644 --- a/src/Controller/VehicleController.php +++ b/src/Controller/VehicleController.php @@ -286,6 +286,7 @@ class VehicleController extends Controller $batteries = $req->request->get('batteries'); if (!empty($batteries)) { + // TODO: need to move the checking for batteries to a function // need to check if a battery has been removed if (count($current_batteries) > count($batteries)) { @@ -345,6 +346,61 @@ class VehicleController extends Controller } } } + // check if battery was deleted then another one was added + if (count($current_batteries) == count($batteries)) + { + // find deleted battery + foreach ($current_batteries as $cbatt) + { + $cbatt_id = $cbatt->getID(); + if (in_array($cbatt_id, $batteries)) + { + // do nothing, move to next element + continue; + } + else + { + // cbatt_id has been deleted + $del_battery = $em->getRepository(Battery::class)->find($cbatt_id); + + if (!empty($del_battery)) + { + $del_battery->removeVehicle($row); + } + } + } + + // find the battery to add + $cbatt_ids = []; + foreach ($current_batteries as $cbatt) + { + $cbatt_ids = [ + $cbatt->getID(), + ]; + } + + foreach ($batteries as $batt) + { + $batt_id = $batt; + if (in_array($batt_id, $cbatt_ids)) + { + // do nothing since battery already there + continue; + } + else + { + // batt is the new battery + $new_battery = $em->getRepository(Battery::class)->find($batt_id); + + if (!empty($new_battery)) + { + $new_battery->addVehicle($row); + + $em->persist($new_battery); + } + } + } + } } else { From 0af69bd9633275fcca3562882f72e1a25f92b2ce Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Thu, 6 Feb 2020 03:08:51 +0000 Subject: [PATCH 06/30] Fix for payment bug. #327 --- src/Controller/RAPIController.php | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/Controller/RAPIController.php b/src/Controller/RAPIController.php index a1d709a6..89e06cff 100644 --- a/src/Controller/RAPIController.php +++ b/src/Controller/RAPIController.php @@ -45,7 +45,7 @@ use App\Entity\User; use App\Entity\JOEvent; use DateTime; - +use DateInterval; // Rider API controller class RAPIController extends Controller @@ -621,27 +621,27 @@ class RAPIController extends Controller // save to customer vehicle battery record // TODO: this has to move to JOHandler - $this->updateVehicleBattery($obj); + $this->updateVehicleBattery($jo); // create warranty - if ($obj->getServiceType() == ServiceType::BATTERY_REPLACEMENT_NEW) + if ($jo->getServiceType() == ServiceType::BATTERY_REPLACEMENT_NEW) { $serial = null; - $warranty_class = $obj->getWarrantyClass(); - $first_name = $obj->getCustomer()->getFirstName(); - $last_name = $obj->getCustomer()->getLastName(); - $mobile_number = $obj->getCustomer()->getPhoneMobile(); + $warranty_class = $jo->getWarrantyClass(); + $first_name = $jo->getCustomer()->getFirstName(); + $last_name = $jo->getCustomer()->getLastName(); + $mobile_number = $jo->getCustomer()->getPhoneMobile(); // check if date fulfilled is null - if ($obj->getDateFulfill() == null) - $date_purchase = $obj->getDateCreate(); + if ($jo->getDateFulfill() == null) + $date_purchase = $jo->getDateCreate(); else - $date_purchase = $obj->getDateFulfill(); + $date_purchase = $jo->getDateFulfill(); - $plate_number = $wh->cleanPlateNumber($obj->getCustomerVehicle()->getPlateNumber()); + $plate_number = $wh->cleanPlateNumber($jo->getCustomerVehicle()->getPlateNumber()); $batt_list = array(); - $invoice = $obj->getInvoice(); + $invoice = $jo->getInvoice(); if (!empty($invoice)) { // get battery @@ -945,6 +945,7 @@ class RAPIController extends Controller return; // warranty expiration + $warr_months = 0; $warr = $jo->getWarrantyClass(); if ($warr == WarrantyClass::WTY_PRIVATE) $warr_months = $battery->getWarrantyPrivate(); From 49d0e6b97e4dd5194246e7b4e9fe7d2823a7261f Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Thu, 6 Feb 2020 05:43:15 +0000 Subject: [PATCH 07/30] Resolve missed merge conflict. #329 --- src/Controller/RAPIController.php | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/Controller/RAPIController.php b/src/Controller/RAPIController.php index 65352647..e583de75 100644 --- a/src/Controller/RAPIController.php +++ b/src/Controller/RAPIController.php @@ -651,16 +651,9 @@ class RAPIController extends Controller // TODO: this has to move to JOHandler $this->updateVehicleBattery($jo); -<<<<<<< HEAD - // create warranty - if ($jo->getServiceType() == ServiceType::BATTERY_REPLACEMENT_NEW) -======= - $em->flush(); - // create warranty if (($jo->getServiceType() == ServiceType::BATTERY_REPLACEMENT_NEW) || ($jo->getServiceType() == CMBServiceType::BATTERY_REPLACEMENT_NEW)) ->>>>>>> 3e2d0db5cd7c0e67f7c41c61f98761d38e424adc { $serial = null; $warranty_class = $jo->getWarrantyClass(); From b7cae5afe2de958ccfa40bf07babbee9d32101ec Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Thu, 6 Feb 2020 07:21:39 +0000 Subject: [PATCH 08/30] Add getOtherParameters to Resq job order handler. #329 --- src/Service/JobOrderHandler/ResqJobOrderHandler.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/Service/JobOrderHandler/ResqJobOrderHandler.php b/src/Service/JobOrderHandler/ResqJobOrderHandler.php index b67011c0..7cb4650a 100644 --- a/src/Service/JobOrderHandler/ResqJobOrderHandler.php +++ b/src/Service/JobOrderHandler/ResqJobOrderHandler.php @@ -2212,6 +2212,13 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface return null; } + public function getOtherParameters() + { + // get riders for dropdown + $params['riders'] = $this->em->getRepository(Rider::class)->findAll(); + + return $params; + } protected function fillDropdownParameters(&$params) { From 8dbcd0478ded08ab1ca4be022c767b911ca91e15 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Thu, 6 Feb 2020 07:29:23 +0000 Subject: [PATCH 09/30] Add riders and dates to query filters. #329 --- .../JobOrderHandler/ResqJobOrderHandler.php | 69 ++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/src/Service/JobOrderHandler/ResqJobOrderHandler.php b/src/Service/JobOrderHandler/ResqJobOrderHandler.php index 7cb4650a..d04bcdff 100644 --- a/src/Service/JobOrderHandler/ResqJobOrderHandler.php +++ b/src/Service/JobOrderHandler/ResqJobOrderHandler.php @@ -2458,7 +2458,36 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface switch ($tier) { case 'fulfill': - $query->where('q.status IN (:statuses)') + if (isset($datatable['query']['data-rows-search'])) + { + $query->innerJoin('q.cus_vehicle', 'cv') + ->innerJoin('q.customer', 'c') + ->where('cv.plate_number like :filter') + ->orWhere('c.phone_mobile like :filter') + ->orWhere('c.first_name like :filter or c.last_name like :filter') + ->setParameter('filter', $datatable['query']['data-rows-search'] . '%'); + } + if (isset($datatable['query']['rider'])) + { + $query->innerJoin('q.rider', 'r') + ->andWhere('r.id = :rider_id') + ->setParameter('rider_id', $datatable['query']['rider']); + } + if (isset($datatable['query']['schedule_date'])) + { + $start = $datatable['query']['schedule_date'][0] . ' ' . '00:00:00'; + $end = $datatable['query']['schedule_date'][1] . ' ' . '23:59:00'; + + $date_start = DateTime::createFromFormat('m/d/Y H:i:s', $start); + $date_end = DateTime::createFromFormat('m/d/Y H:i:s', $end); + + $query->andWhere('q.date_schedule >= :date_start') + ->andWhere('q.date_schedule <= :date_end') + ->setParameter('date_start', $date_start) + ->setParameter('date_end', $date_end); + } + + $query->andWhere('q.status IN (:statuses)') ->andWhere('q.hub IN (:hubs)') ->setParameter('statuses', $status, Connection::PARAM_STR_ARRAY) ->setParameter('hubs', $hubs, Connection::PARAM_STR_ARRAY); @@ -2484,6 +2513,25 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface $query->where('q.status IN (:statuses)') ->setParameter('statuses', $status, Connection::PARAM_STR_ARRAY); } + if (isset($datatable['query']['rider'])) + { + $query->innerJoin('q.rider', 'r') + ->andWhere('r.id = :rider_id') + ->setParameter('rider_id', $datatable['query']['rider']); + } + if (isset($datatable['query']['schedule_date'])) + { + $start = $datatable['query']['schedule_date'][0] . ' ' . '00:00:00'; + $end = $datatable['query']['schedule_date'][1] . ' ' . '23:59:00'; + + $date_start = DateTime::createFromFormat('m/d/Y H:i:s', $start); + $date_end = DateTime::createFromFormat('m/d/Y H:i:s', $end); + + $query->andWhere('q.date_schedule >= :date_start') + ->andWhere('q.date_schedule <= :date_end') + ->setParameter('date_start', $date_start) + ->setParameter('date_end', $date_end); + } break; case 'all': if (isset($datatable['query']['data-rows-search'])) @@ -2495,6 +2543,25 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface ->orWhere('c.first_name like :filter or c.last_name like :filter') ->setParameter('filter', $datatable['query']['data-rows-search'] . '%'); } + if (isset($datatable['query']['rider'])) + { + $query->innerJoin('q.rider', 'r') + ->andWhere('r.id = :rider_id') + ->setParameter('rider_id', $datatable['query']['rider']); + } + if (isset($datatable['query']['schedule_date'])) + { + $start = $datatable['query']['schedule_date'][0] . ' ' . '00:00:00'; + $end = $datatable['query']['schedule_date'][1] . ' ' . '23:59:00'; + + $date_start = DateTime::createFromFormat('m/d/Y H:i:s', $start); + $date_end = DateTime::createFromFormat('m/d/Y H:i:s', $end); + + $query->andWhere('q.date_schedule >= :date_start') + ->andWhere('q.date_schedule <= :date_end') + ->setParameter('date_start', $date_start) + ->setParameter('date_end', $date_end); + } break; default: $query->where('q.status = :status') From eceb20f2b6ba10ac889c579b1bd21959c9eb67b6 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Thu, 6 Feb 2020 07:33:08 +0000 Subject: [PATCH 10/30] Add resq counterparts in services.yaml. #329 --- config/services.yaml | 55 ++++++++++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 25 deletions(-) diff --git a/config/services.yaml b/config/services.yaml index 5364d19a..dbe9698e 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -157,44 +157,49 @@ services: tags: - { name: kernel.event_listener, event: kernel.controller, method: onKernelController } - # invoice generator - App\Service\InvoiceGenerator\CMBInvoiceGenerator: ~ + # CMB invoice generator + #App\Service\InvoiceGenerator\CMBInvoiceGenerator: ~ + + # Resq invoice generator + App\Service\InvoiceGenerator\ResqInvoiceGenerator: ~ # invoice generator interface - App\Service\InvoiceGeneratorInterface: "@App\\Service\\InvoiceGenerator\\CMBInvoiceGenerator" - #App\Service\InvoiceGeneratorInterface: "@App\\Service\\InvoiceGenerator\\ResqInvoiceGenerator" + #App\Service\InvoiceGeneratorInterface: "@App\\Service\\InvoiceGenerator\\CMBInvoiceGenerator" + App\Service\InvoiceGeneratorInterface: "@App\\Service\\InvoiceGenerator\\ResqInvoiceGenerator" - # job order generator - #App\Service\JobOrderHandler\ResqJobOrderHandler: + # Resq job order generator + App\Service\JobOrderHandler\ResqJobOrderHandler: + arguments: + $country_code: "%env(COUNTRY_CODE)%" + + # CMB job order generator + #App\Service\JobOrderHandler\CMBJobOrderHandler: # arguments: - # $country_code: "%env(COUNTRY_CODE)%" + # $country_code: "%env(COUNTRY_CODE)%" - App\Service\JobOrderHandler\CMBJobOrderHandler: + #job order generator interface + #App\Service\JobOrderHandlerInterface: "@App\\Service\\JobOrderHandler\\CMBJobOrderHandler" + App\Service\JobOrderHandlerInterface: "@App\\Service\\JobOrderHandler\\ResqJobOrderHandler" + + # CMB customer generator + #App\Service\CustomerHandler\CMBCustomerHandler: + # arguments: + # $country_code: "%env(COUNTRY_CODE)%" + + # Resq customer generator + App\Service\CustomerHandler\ResqCustomerHandler: arguments: $country_code: "%env(COUNTRY_CODE)%" - #job order generator interface - App\Service\JobOrderHandlerInterface: "@App\\Service\\JobOrderHandler\\CMBJobOrderHandler" - #App\Service\JobOrderHandlerInterface: "@App\\Service\\JobOrderHandler\\ResqJobOrderHandler" - - # customer generator - App\Service\CustomerHandler\CMBCustomerHandler: - arguments: - $country_code: "%env(COUNTRY_CODE)%" - - #App\Service\CustomerHandler\ResqCustomerHandler: - # arguments: - # $country_code: "%env(COUNTRY_CODE)%" - # customer generator interface - App\Service\CustomerHandlerInterface: "@App\\Service\\CustomerHandler\\CMBCustomerHandler" - #App\Service\CustomerHandlerInterface: "@App\\Service\\CustomerHandler\\ResqCustomerHandler" + #App\Service\CustomerHandlerInterface: "@App\\Service\\CustomerHandler\\CMBCustomerHandler" + App\Service\CustomerHandlerInterface: "@App\\Service\\CustomerHandler\\ResqCustomerHandler" # rider assignment - App\Service\RiderAssignmentHandler\CMBRiderAssignmentHandler: ~ + #App\Service\RiderAssignmentHandler\CMBRiderAssignmentHandler: ~ # rider assignment interface - App\Service\RiderAssignmentHandlerInterface: "@App\\Service\\RiderAssignmentHandler\\CMBRiderAssignmentHandler" + #App\Service\RiderAssignmentHandlerInterface: "@App\\Service\\RiderAssignmentHandler\\CMBRiderAssignmentHandler" # map manager #App\Service\GISManager\Bing: ~ From 088dca5a11b9d85dbbd7c76878f5555b6ec49a0c Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Thu, 6 Feb 2020 07:53:56 +0000 Subject: [PATCH 11/30] Create two separate services.yaml for resq and cmb. #329 --- config/cmb.services.yaml | 221 ++++++++++++++++++++++++++++++++++++++ config/resq.services.yaml | 215 ++++++++++++++++++++++++++++++++++++ 2 files changed, 436 insertions(+) create mode 100644 config/cmb.services.yaml create mode 100644 config/resq.services.yaml diff --git a/config/cmb.services.yaml b/config/cmb.services.yaml new file mode 100644 index 00000000..4ea4926c --- /dev/null +++ b/config/cmb.services.yaml @@ -0,0 +1,221 @@ +# Put parameters here that don't need to change on each machine where the app is deployed +# https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration +parameters: + map_default: + latitude: 14.6091 + longitude: 121.0223 + image_upload_directory: '%kernel.project_dir%/public/uploads' + job_order_refresh_interval: 300000 + api_acl_file: 'api_acl.yaml' + api_access_key: 'api_access_keys' + app_acl_file: 'acl.yaml' + app_access_key: 'access_keys' + cvu_brand_id: "%env(CVU_BRAND_ID)%" + country_code: "%env(COUNTRY_CODE)%" + +services: + # default configuration for services in *this* file + _defaults: + autowire: true # Automatically injects dependencies in your services. + autoconfigure: true # Automatically registers your services as commands, event subscribers, etc. + public: false # Allows optimizing the container by removing unused services; this also means + # fetching services directly from the container via $container->get() won't work. + # The best practice is to be explicit about your dependencies anyway. + + # makes classes in src/ available to be used as services + # this creates a service per class whose id is the fully-qualified class name + App\: + resource: '../src/*' + exclude: '../src/{Entity,Migrations,Tests,Menu,Access}' + + # controllers are imported separately to make sure services can be injected + # as action arguments even if you don't extend any base controller class + App\Controller\: + resource: '../src/Controller' + tags: ['controller.service_arguments'] + + # add more service definitions when explicit configuration is needed + # please note that last definitions always *replace* previous ones + App\Menu\Generator: + arguments: + $router: "@router.default" + $cache_dir: "%kernel.cache_dir%" + $config_dir: "%kernel.root_dir%/../config" + + Catalyst\AuthBundle\Service\ACLGenerator: + arguments: + $router: "@router.default" + $cache_dir: "%kernel.cache_dir%" + $config_dir: "%kernel.root_dir%/../config" + $acl_file: "%app_acl_file%" + + Catalyst\AuthBundle\Service\ACLVoter: + arguments: + $user_class: "App\\Entity\\User" + tags: ['security.voter'] + + Catalyst\AuthBundle\Service\UserChecker: + + App\Service\FileUploader: + arguments: + $target_dir: '%image_upload_directory%' + + App\Service\MapTools: + arguments: + $em: "@doctrine.orm.entity_manager" + $gmaps_api_key: "%env(GMAPS_API_KEY)%" + + App\Service\RisingTideGateway: + arguments: + $em: "@doctrine.orm.entity_manager" + $user: "%env(RT_USER)%" + $pass: "%env(RT_PASS)%" + $usage_type: "%env(RT_USAGE_TYPE)%" + $shortcode: "%env(RT_SHORTCODE)%" + + App\Service\MQTTClient: + arguments: + $redis_client: "@App\\Service\\RedisClientProvider" + $key: "mqtt_events" + + App\Service\APNSClient: + arguments: + $redis_client: "@App\\Service\\RedisClientProvider" + + App\Service\RedisClientProvider: + arguments: + $scheme: "%env(REDIS_CLIENT_SCHEME)%" + $host: "%env(REDIS_CLIENT_HOST)%" + $port: "%env(REDIS_CLIENT_PORT)%" + $password: "%env(REDIS_CLIENT_PASSWORD)%" + + App\Service\GeofenceTracker: + arguments: + $geofence_flag: "%env(GEOFENCE_ENABLE)%" + + App\Service\WarrantyHandler: + arguments: + $em: "@doctrine.orm.entity_manager" + + App\Command\SetCustomerPrivacyPolicyCommand: + arguments: + $policy_promo: "%env(POLICY_PROMO)%" + $policy_third_party: "%env(POLICY_THIRD_PARTY)%" + $policy_mobile: "%env(POLICY_MOBILE)%" + + App\Command\CreateCustomerFromWarrantyCommand: + arguments: + $cvu_mfg_id: "%env(CVU_MFG_ID)%" + $cvu_brand_id: "%env(CVU_BRAND_ID)%" + + # rider tracker service + App\Service\RiderTracker: + arguments: + $redis_client: "@App\\Service\\RedisClientProvider" + + Catalyst\APIBundle\Security\APIKeyUserProvider: + arguments: + $em: "@doctrine.orm.entity_manager" + + Catalyst\APIBundle\Security\APIKeyAuthenticator: + arguments: + $em: "@doctrine.orm.entity_manager" + + Catalyst\APIBundle\Command\UserCreateCommand: + arguments: + $em: "@doctrine.orm.entity_manager" + tags: ['console.command'] + + Catalyst\APIBundle\Command\TestCommand: + tags: ['console.command'] + + Catalyst\APIBundle\Command\TestAPICommand: + tags: ['console.command'] + + Catalyst\APIBundle\Access\Voter: + arguments: + $acl_gen: "@Catalyst\\APIBundle\\Access\\Generator" + $user_class: "Catalyst\\APIBundle\\Entity\\User" + tags: ['security.voter'] + + Catalyst\APIBundle\Access\Generator: + arguments: + $router: "@router.default" + $cache_dir: "%kernel.cache_dir%" + $config_dir: "%kernel.root_dir%/../config" + $acl_file: "%api_acl_file%" + + Catalyst\MenuBundle\Menu\Generator: + arguments: + $router: "@router.default" + $cache_dir: "%kernel.cache_dir%" + $config_dir: "%kernel.root_dir%/../config" + + Catalyst\MenuBundle\Listener\MenuAnnotationListener: + arguments: + $menu_name: "main_menu" + tags: + - { name: kernel.event_listener, event: kernel.controller, method: onKernelController } + + # invoice generator + App\Service\InvoiceGenerator\CMBInvoiceGenerator: ~ + + # invoice generator interface + App\Service\InvoiceGeneratorInterface: "@App\\Service\\InvoiceGenerator\\CMBInvoiceGenerator" + + # job order generator + App\Service\JobOrderHandler\CMBJobOrderHandler: + arguments: + $country_code: "%env(COUNTRY_CODE)%" + + #job order generator interface + App\Service\JobOrderHandlerInterface: "@App\\Service\\JobOrderHandler\\CMBJobOrderHandler" + + # customer generator + App\Service\CustomerHandler\CMBCustomerHandler: + arguments: + $country_code: "%env(COUNTRY_CODE)%" + + # customer generator interface + App\Service\CustomerHandlerInterface: "@App\\Service\\CustomerHandler\\CMBCustomerHandler" + + # rider assignment + App\Service\RiderAssignmentHandler\CMBRiderAssignmentHandler: ~ + + # rider assignment interface + App\Service\RiderAssignmentHandlerInterface: "@App\\Service\\RiderAssignmentHandler\\CMBRiderAssignmentHandler" + + # map manager + #App\Service\GISManager\Bing: ~ + App\Service\GISManager\OpenStreet: ~ + #App\Service\GISManager\Google: ~ + + #App\Service\GISManagerInterface: "@App\\Service\\GISManager\\Bing" + App\Service\GISManagerInterface: "@App\\Service\\GISManager\\OpenStreet" + #App\Service\GISManagerInterface: "@App\\Service\\GISManager\\Google" + + App\EventListener\JobOrderActiveCacheListener: + arguments: + $jo_cache: "@App\\Service\\JobOrderCache" + $mqtt: "@App\\Service\\MQTTClient" + tags: + - name: 'doctrine.orm.entity_listener' + event: 'postUpdate' + entity: 'App\Entity\JobOrder' + - name: 'doctrine.orm.entity_listener' + event: 'postRemove' + entity: 'App\Entity\JobOrder' + - name: 'doctrine.orm.entity_listener' + event: 'postPersist' + entity: 'App\Entity\JobOrder' + + App\Service\JobOrderCache: + arguments: + $redis_prov: "@App\\Service\\RedisClientProvider" + $active_jo_key: "%env(LOCATION_JO_ACTIVE_KEY)%" + + App\Service\RiderCache: + arguments: + $redis_prov: "@App\\Service\\RedisClientProvider" + $loc_key: "%env(LOCATION_RIDER_ACTIVE_KEY)%" + $status_key: "%env(STATUS_RIDER_KEY)%" diff --git a/config/resq.services.yaml b/config/resq.services.yaml new file mode 100644 index 00000000..ee948f38 --- /dev/null +++ b/config/resq.services.yaml @@ -0,0 +1,215 @@ +# Put parameters here that don't need to change on each machine where the app is deployed +# https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration +parameters: + map_default: + latitude: 14.6091 + longitude: 121.0223 + image_upload_directory: '%kernel.project_dir%/public/uploads' + job_order_refresh_interval: 300000 + api_acl_file: 'api_acl.yaml' + api_access_key: 'api_access_keys' + app_acl_file: 'acl.yaml' + app_access_key: 'access_keys' + cvu_brand_id: "%env(CVU_BRAND_ID)%" + country_code: "%env(COUNTRY_CODE)%" + +services: + # default configuration for services in *this* file + _defaults: + autowire: true # Automatically injects dependencies in your services. + autoconfigure: true # Automatically registers your services as commands, event subscribers, etc. + public: false # Allows optimizing the container by removing unused services; this also means + # fetching services directly from the container via $container->get() won't work. + # The best practice is to be explicit about your dependencies anyway. + + # makes classes in src/ available to be used as services + # this creates a service per class whose id is the fully-qualified class name + App\: + resource: '../src/*' + exclude: '../src/{Entity,Migrations,Tests,Menu,Access}' + + # controllers are imported separately to make sure services can be injected + # as action arguments even if you don't extend any base controller class + App\Controller\: + resource: '../src/Controller' + tags: ['controller.service_arguments'] + + # add more service definitions when explicit configuration is needed + # please note that last definitions always *replace* previous ones + App\Menu\Generator: + arguments: + $router: "@router.default" + $cache_dir: "%kernel.cache_dir%" + $config_dir: "%kernel.root_dir%/../config" + + Catalyst\AuthBundle\Service\ACLGenerator: + arguments: + $router: "@router.default" + $cache_dir: "%kernel.cache_dir%" + $config_dir: "%kernel.root_dir%/../config" + $acl_file: "%app_acl_file%" + + Catalyst\AuthBundle\Service\ACLVoter: + arguments: + $user_class: "App\\Entity\\User" + tags: ['security.voter'] + + Catalyst\AuthBundle\Service\UserChecker: + + App\Service\FileUploader: + arguments: + $target_dir: '%image_upload_directory%' + + App\Service\MapTools: + arguments: + $em: "@doctrine.orm.entity_manager" + $gmaps_api_key: "%env(GMAPS_API_KEY)%" + + App\Service\RisingTideGateway: + arguments: + $em: "@doctrine.orm.entity_manager" + $user: "%env(RT_USER)%" + $pass: "%env(RT_PASS)%" + $usage_type: "%env(RT_USAGE_TYPE)%" + $shortcode: "%env(RT_SHORTCODE)%" + + App\Service\MQTTClient: + arguments: + $redis_client: "@App\\Service\\RedisClientProvider" + $key: "mqtt_events" + + App\Service\APNSClient: + arguments: + $redis_client: "@App\\Service\\RedisClientProvider" + + App\Service\RedisClientProvider: + arguments: + $scheme: "%env(REDIS_CLIENT_SCHEME)%" + $host: "%env(REDIS_CLIENT_HOST)%" + $port: "%env(REDIS_CLIENT_PORT)%" + $password: "%env(REDIS_CLIENT_PASSWORD)%" + + App\Service\GeofenceTracker: + arguments: + $geofence_flag: "%env(GEOFENCE_ENABLE)%" + + App\Service\WarrantyHandler: + arguments: + $em: "@doctrine.orm.entity_manager" + + App\Command\SetCustomerPrivacyPolicyCommand: + arguments: + $policy_promo: "%env(POLICY_PROMO)%" + $policy_third_party: "%env(POLICY_THIRD_PARTY)%" + $policy_mobile: "%env(POLICY_MOBILE)%" + + App\Command\CreateCustomerFromWarrantyCommand: + arguments: + $cvu_mfg_id: "%env(CVU_MFG_ID)%" + $cvu_brand_id: "%env(CVU_BRAND_ID)%" + + # rider tracker service + App\Service\RiderTracker: + arguments: + $redis_client: "@App\\Service\\RedisClientProvider" + + Catalyst\APIBundle\Security\APIKeyUserProvider: + arguments: + $em: "@doctrine.orm.entity_manager" + + Catalyst\APIBundle\Security\APIKeyAuthenticator: + arguments: + $em: "@doctrine.orm.entity_manager" + + Catalyst\APIBundle\Command\UserCreateCommand: + arguments: + $em: "@doctrine.orm.entity_manager" + tags: ['console.command'] + + Catalyst\APIBundle\Command\TestCommand: + tags: ['console.command'] + + Catalyst\APIBundle\Command\TestAPICommand: + tags: ['console.command'] + + Catalyst\APIBundle\Access\Voter: + arguments: + $acl_gen: "@Catalyst\\APIBundle\\Access\\Generator" + $user_class: "Catalyst\\APIBundle\\Entity\\User" + tags: ['security.voter'] + + Catalyst\APIBundle\Access\Generator: + arguments: + $router: "@router.default" + $cache_dir: "%kernel.cache_dir%" + $config_dir: "%kernel.root_dir%/../config" + $acl_file: "%api_acl_file%" + + Catalyst\MenuBundle\Menu\Generator: + arguments: + $router: "@router.default" + $cache_dir: "%kernel.cache_dir%" + $config_dir: "%kernel.root_dir%/../config" + + Catalyst\MenuBundle\Listener\MenuAnnotationListener: + arguments: + $menu_name: "main_menu" + tags: + - { name: kernel.event_listener, event: kernel.controller, method: onKernelController } + + # invoice generator + App\Service\InvoiceGenerator\ResqInvoiceGenerator: ~ + + # invoice generator interface + App\Service\InvoiceGeneratorInterface: "@App\\Service\\InvoiceGenerator\\ResqInvoiceGenerator" + + # job order generator + App\Service\JobOrderHandler\ResqJobOrderHandler: + arguments: + $country_code: "%env(COUNTRY_CODE)%" + + #job order generator interface + App\Service\JobOrderHandlerInterface: "@App\\Service\\JobOrderHandler\\ResqJobOrderHandler" + + # customer generator + App\Service\CustomerHandler\ResqCustomerHandler: + arguments: + $country_code: "%env(COUNTRY_CODE)%" + + # customer generator interface + App\Service\CustomerHandlerInterface: "@App\\Service\\CustomerHandler\\ResqCustomerHandler" + + # map manager + #App\Service\GISManager\Bing: ~ + App\Service\GISManager\OpenStreet: ~ + #App\Service\GISManager\Google: ~ + + #App\Service\GISManagerInterface: "@App\\Service\\GISManager\\Bing" + App\Service\GISManagerInterface: "@App\\Service\\GISManager\\OpenStreet" + #App\Service\GISManagerInterface: "@App\\Service\\GISManager\\Google" + + App\EventListener\JobOrderActiveCacheListener: + arguments: + $jo_cache: "@App\\Service\\JobOrderCache" + $mqtt: "@App\\Service\\MQTTClient" + tags: + - name: 'doctrine.orm.entity_listener' + event: 'postUpdate' + entity: 'App\Entity\JobOrder' + - name: 'doctrine.orm.entity_listener' + event: 'postRemove' + entity: 'App\Entity\JobOrder' + - name: 'doctrine.orm.entity_listener' + event: 'postPersist' + entity: 'App\Entity\JobOrder' + + App\Service\JobOrderCache: + arguments: + $redis_prov: "@App\\Service\\RedisClientProvider" + $active_jo_key: "%env(LOCATION_JO_ACTIVE_KEY)%" + + App\Service\RiderCache: + arguments: + $redis_prov: "@App\\Service\\RedisClientProvider" + $loc_key: "%env(LOCATION_RIDER_ACTIVE_KEY)%" + $status_key: "%env(STATUS_RIDER_KEY)%" From 0df0955cb3c690b4f3c8da564428d4bc388e8bd7 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Fri, 7 Feb 2020 08:19:51 +0000 Subject: [PATCH 12/30] Add rider assignment handler for resq. #333 --- config/resq.services.yaml | 6 ++ .../JobOrderHandler/CMBJobOrderHandler.php | 4 +- .../JobOrderHandler/ResqJobOrderHandler.php | 35 ++++----- src/Service/JobOrderHandlerInterface.php | 4 +- .../ResqRiderAssignmentHandler.php | 72 +++++++++++++++++++ 5 files changed, 94 insertions(+), 27 deletions(-) create mode 100644 src/Service/RiderAssignmentHandler/ResqRiderAssignmentHandler.php diff --git a/config/resq.services.yaml b/config/resq.services.yaml index ee948f38..eabe0b67 100644 --- a/config/resq.services.yaml +++ b/config/resq.services.yaml @@ -179,6 +179,12 @@ services: # customer generator interface App\Service\CustomerHandlerInterface: "@App\\Service\\CustomerHandler\\ResqCustomerHandler" + # rider assignment + App\Service\RiderAssignmentHandler\ResqRiderAssignmentHandler: ~ + + # rider assignment interface + App\Service\RiderAssignmentHandlerInterface: "@App\\Service\\RiderAssignmentHandler\\ResqRiderAssignmentHandler" + # map manager #App\Service\GISManager\Bing: ~ App\Service\GISManager\OpenStreet: ~ diff --git a/src/Service/JobOrderHandler/CMBJobOrderHandler.php b/src/Service/JobOrderHandler/CMBJobOrderHandler.php index 234d968f..534b986a 100644 --- a/src/Service/JobOrderHandler/CMBJobOrderHandler.php +++ b/src/Service/JobOrderHandler/CMBJobOrderHandler.php @@ -731,7 +731,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface } // assign job order - public function assignJobOrder(Request $req, $id, MQTTCLient $mclient, APNSClient $aclient) + public function assignJobOrder(Request $req, $id) { // get object data $em = $this->em; @@ -827,7 +827,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface } // fulfill job order - public function fulfillJobOrder(Request $req, $id, MQTTClient $mclient) + public function fulfillJobOrder(Request $req, $id) { // initialize error list $error_array = []; diff --git a/src/Service/JobOrderHandler/ResqJobOrderHandler.php b/src/Service/JobOrderHandler/ResqJobOrderHandler.php index f0d87fbe..497b6599 100644 --- a/src/Service/JobOrderHandler/ResqJobOrderHandler.php +++ b/src/Service/JobOrderHandler/ResqJobOrderHandler.php @@ -23,6 +23,7 @@ use App\Entity\Hub; use App\Entity\Promo; use App\Entity\Rider; use App\Entity\JORejection; +use App\Entity\Warranty; use App\Ramcar\InvoiceCriteria; use App\Ramcar\ServiceType; @@ -38,6 +39,7 @@ use App\Ramcar\JORejectionReason; use App\Service\InvoiceGeneratorInterface; use App\Service\JobOrderHandlerInterface; +use App\Service\RiderAssignmentHandlerInterface; use App\Service\WarrantyHandler; use App\Service\MQTTClient; use App\Service\APNSClient; @@ -59,6 +61,7 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface protected $security; protected $validator; protected $translator; + protected $rah; protected $country_code; protected $wh; @@ -66,14 +69,15 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface public function __construct(Security $security, EntityManagerInterface $em, InvoiceGeneratorInterface $ic, ValidatorInterface $validator, - TranslatorInterface $translator, string $country_code, - WarrantyHandler $wh) + TranslatorInterface $translator, RiderAssignmentHandlerInterface $rah, + string $country_code, WarrantyHandler $wh) { $this->em = $em; $this->ic = $ic; $this->security = $security; $this->validator = $validator; $this->translator = $translator; + $this->rah = $rah; $this->country_code = $country_code; $this->wh = $wh; @@ -515,7 +519,7 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface } // assign job order - public function assignJobOrder(Request $req, $id, MQTTCLient $mclient, APNSClient $aclient) + public function assignJobOrder(Request $req, $id) { // get object data $em = $this->em; @@ -606,22 +610,15 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface // validated! save the entity $em->flush(); - // send event to mobile app - $payload = [ - 'event' => 'driver_assigned' - ]; - $mclient->sendEvent($obj, $payload); - $mclient->sendRiderEvent($obj, $payload); - - // sned push notification - $aclient->sendPush($obj, "A RESQ rider is on his way to you."); + // call rider assignment handler's assignJobOrder + $this->rah->assignJobOrder($obj, $rider); } return $error_array; } // fulfill job order - public function fulfillJobOrder(Request $req, $id, MQTTClient $mclient) + public function fulfillJobOrder(Request $req, $id) { // initialize error list $error_array = []; @@ -697,16 +694,8 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface if ($rider->getImageFile() != null) $image_url = $req->getScheme() . '://' . $req->getHttpHost() . $req->getBasePath() . '/uploads/' . $rider->getImageFile(); - // send to mqtt - $payload = [ - 'event' => 'fulfilled', - 'jo_id' => $obj->getID(), - 'driver_image' => $image_url, - 'driver_name' => $rider->getFullName(), - 'driver_id' => $rider->getID(), - ]; - $mclient->sendEvent($obj, $payload); - $mclient->sendRiderEvent($obj, $payload); + // call rider assignment handler's fulfillJobOrder + $this->rah->fulfillJobOrder($obj, $image_url, $rider); // create the warranty if new battery only if ($obj->getServiceType () == ServiceType::BATTERY_REPLACEMENT_NEW) diff --git a/src/Service/JobOrderHandlerInterface.php b/src/Service/JobOrderHandlerInterface.php index 29939cb5..92eb40da 100644 --- a/src/Service/JobOrderHandlerInterface.php +++ b/src/Service/JobOrderHandlerInterface.php @@ -31,10 +31,10 @@ interface JobOrderHandlerInterface public function dispatchJobOrder(Request $req, int $id, MQTTClient $mclient); // assign job order - public function assignJobOrder(Request $req, int $id, MQTTCLient $mclient, APNSClient $aclient); + public function assignJobOrder(Request $req, int $id); // fulfill job order - public function fulfillJobOrder(Request $req, int $id, MQTTClient $mclient); + public function fulfillJobOrder(Request $req, int $id); // cancel job order public function cancelJobOrder(Request $req, int $id, MQTTClient $mclient); diff --git a/src/Service/RiderAssignmentHandler/ResqRiderAssignmentHandler.php b/src/Service/RiderAssignmentHandler/ResqRiderAssignmentHandler.php new file mode 100644 index 00000000..0b101a17 --- /dev/null +++ b/src/Service/RiderAssignmentHandler/ResqRiderAssignmentHandler.php @@ -0,0 +1,72 @@ +em = $em; + $this->mclient = $mclient; + $this->aclient = $aclient; + } + + // assign job order to rider + public function assignJobOrder(JobOrder $obj, Rider $rider) + { + // create the payload + $payload = [ + 'event' => 'driver_assigned' + ]; + + // send event + $this->mclient->sendEvent($obj, $payload); + + // check if rider is available + if ($rider->isAvailable()) + { + error_log('set rider availability to false'); + // set rider to unavailable + $rider->setAvailable(false); + + // send event to rider + $this->mclient->sendRiderEvent($obj, $payload); + + // send push notification + $this->aclient->sendPush($obj, "A RESQ rider is on his way to you."); + } + } + + // complete job order + public function fulfillJobOrder(JobOrder $obj, string $image_url, Rider $rider) + { + // send to mqtt + $payload = [ + 'event' => 'fulfilled', + 'jo_id' => $obj->getID(), + 'driver_image' => $image_url, + 'driver_name' => $rider->getFullName(), + 'driver_id' => $rider->getID(), + ]; + $this->mclient->sendEvent($obj, $payload); + + // send fulfill/complete event to rider + $this->mclient->sendRiderEvent($obj, $payload); + } +} From 52f075ccbaf2aa6cff59f0f9f47a31208e2a3561 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Mon, 10 Feb 2020 02:48:21 +0000 Subject: [PATCH 13/30] Add new fields to customer. #324 --- src/Entity/Customer.php | 50 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/src/Entity/Customer.php b/src/Entity/Customer.php index d9dd9b98..afad3ce9 100644 --- a/src/Entity/Customer.php +++ b/src/Entity/Customer.php @@ -165,6 +165,21 @@ class Customer */ protected $privpol_promo; + /** + * @ORM\Column(type="boolean") + */ + protected $flag_promo_email; + + /** + * @ORM\Column(type="boolean") + */ + protected $flag_promo_sms; + + /** + * @ORM\Column(type="boolean") + */ + protected $flag_dpa_consent; + public function __construct() { $this->numbers = new ArrayCollection(); @@ -191,6 +206,10 @@ class Customer $this->priv_promo = 0; $this->flag_csat = false; + + $this->flag_promo_email = false; + $this->flag_promo_sms = false; + $this->flag_dpa_consent = false; } public function getID() @@ -485,5 +504,36 @@ class Customer return $this->privpol_promo; } + public function setPromoEmail($flag_promo_email = true) + { + $this->flag_promo_email = $flag_promo_email; + return $this; + } + public function isPromoEmail() + { + return $this->flag_promo_email; + } + + public function setPromoSms($flag_promo_sms = true) + { + $this->flag_promo_sms = $flag_promo_sms; + return $this; + } + + public function isPromoSms() + { + return $this->flag_promo_sms; + } + + public function setDpaConsent($flag_dpa_consent = true) + { + $this->flag_dpa_consent = $flag_dpa_consent; + return $this; + } + + public function isDpaConsent() + { + return $this->flag_dpa_consent; + } } From e260edc80d7628fefb60dd7bf06609dd627ca6d2 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Mon, 10 Feb 2020 03:40:00 +0000 Subject: [PATCH 14/30] Add new fields to incoming job order form. #324 --- templates/job-order/form.html.twig | 36 +++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/templates/job-order/form.html.twig b/templates/job-order/form.html.twig index fe9f00ac..8b250b52 100644 --- a/templates/job-order/form.html.twig +++ b/templates/job-order/form.html.twig @@ -148,6 +148,10 @@
+
+ + +
@@ -295,8 +299,8 @@
-
-
+
+
-
+
@@ -331,6 +335,32 @@
+
+
+
+
+ +
+ + +
+
+
+
+
+ + + +
+