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/Controller/RoleController.php b/src/Controller/RoleController.php index 754ab40c..da4de74c 100644 --- a/src/Controller/RoleController.php +++ b/src/Controller/RoleController.php @@ -248,7 +248,7 @@ class RoleController extends Controller if (!$row->isSuperAdmin()) { // clear first - $row->clearACLAttributes(); + $row->clearACLAccess(); // then add $acl_attribs = $req->request->get('acl'); 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 = [ diff --git a/src/Entity/Warranty.php b/src/Entity/Warranty.php index 113fbb93..d2143966 100644 --- a/src/Entity/Warranty.php +++ b/src/Entity/Warranty.php @@ -149,7 +149,7 @@ class Warranty return $this->id; } - public function setSerial($serial) + public function setSerial($serial = null) { $this->serial = $serial; return $this; diff --git a/src/EventListener/JobOrderActiveCacheListener.php b/src/EventListener/JobOrderActiveCacheListener.php index 541ce158..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,22 +85,55 @@ 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') { + error_log('got inactive jo, sending mqtt message for ' . $jo->getID()); // 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 + ); + } } } diff --git a/src/Service/JobOrderHandler/CMBJobOrderHandler.php b/src/Service/JobOrderHandler/CMBJobOrderHandler.php index ee08568a..40265ac2 100644 --- a/src/Service/JobOrderHandler/CMBJobOrderHandler.php +++ b/src/Service/JobOrderHandler/CMBJobOrderHandler.php @@ -160,6 +160,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(); @@ -171,6 +190,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) @@ -2803,7 +2825,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/src/Service/WarrantyHandler.php b/src/Service/WarrantyHandler.php index 281464bf..6d01eb10 100644 --- a/src/Service/WarrantyHandler.php +++ b/src/Service/WarrantyHandler.php @@ -73,8 +73,11 @@ class WarrantyHandler } // set and save values - $warranty->setSerial($serial) - ->setPlateNumber($plate_number) + if (trim($serial) == '') + $warranty->setSerial(null); + else + $warranty->setSerial($serial); + $warranty->setPlateNumber($plate_number) ->setFirstName($first_name) ->setLastName($last_name) ->setMobileNumber($mobile_number) 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' }, 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 %} 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'