diff --git a/.env.dist b/.env.dist index b6766d67..509fee86 100644 --- a/.env.dist +++ b/.env.dist @@ -66,3 +66,6 @@ INVENTORY_API_AUTH_TOKEN=insert_auth_token_here # API logging API_LOGGING=set_to_true_or_false + +# customer distance limit in km +CUST_DISTANCE_LIMIT=set_to_number diff --git a/config/cmb.services.yaml b/config/cmb.services.yaml index d12b2acf..5f24e525 100644 --- a/config/cmb.services.yaml +++ b/config/cmb.services.yaml @@ -64,6 +64,7 @@ services: arguments: $em: "@doctrine.orm.entity_manager" $gmaps_api_key: "%env(GMAPS_API_KEY)%" + $cust_dist_limit: "%env(CUST_DISTANCE_LIMIT)%" App\Service\RisingTideGateway: arguments: @@ -227,3 +228,8 @@ services: $redis_prov: "@App\\Service\\RedisClientProvider" $loc_key: "%env(LOCATION_RIDER_ACTIVE_KEY)%" $status_key: "%env(STATUS_RIDER_KEY)%" + + # API logging + App\EventSubscriber\LogSubscriber: + arguments: + $api_log_flag: "%env(API_LOGGING)%" diff --git a/config/menu.yaml b/config/menu.yaml index 45ceab40..b0096cf5 100644 --- a/config/menu.yaml +++ b/config/menu.yaml @@ -122,10 +122,6 @@ main_menu: acl: jo_all.list label: View All parent: joborder - - id: jo_autoassign - acl: jo_autoassign.test - label: Autoassign Test - parent: joborder - id: support acl: support.menu diff --git a/config/resq.services.yaml b/config/resq.services.yaml index 0c927f98..284b7b73 100644 --- a/config/resq.services.yaml +++ b/config/resq.services.yaml @@ -64,6 +64,7 @@ services: arguments: $em: "@doctrine.orm.entity_manager" $gmaps_api_key: "%env(GMAPS_API_KEY)%" + $cust_dist_limit: "%env(CUST_DISTANCE_LIMIT)%" App\Service\RisingTideGateway: arguments: @@ -233,4 +234,9 @@ services: $api_url: "%env(INVENTORY_API_URL)%" $api_ocp_key: "%env(INVENTORY_API_OCP)%" $api_auth_prefix: "%env(INVENTORY_API_AUTH_TOKEN_PREFIX)%" - $api_auth_token: "%env(INVENTORY_API_AUTH_TOKEN)%" + $api_auth_token: "%env(INVENTORY_API_AUTH_TOKEN)%" + + # API logging + App\EventSubscriber\LogSubscriber: + arguments: + $api_log_flag: "%env(API_LOGGING)%" diff --git a/config/services.yaml b/config/services.yaml index 4bfaf95a..284b7b73 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -64,6 +64,7 @@ services: arguments: $em: "@doctrine.orm.entity_manager" $gmaps_api_key: "%env(GMAPS_API_KEY)%" + $cust_dist_limit: "%env(CUST_DISTANCE_LIMIT)%" App\Service\RisingTideGateway: arguments: @@ -231,7 +232,7 @@ services: App\Service\InventoryManager: arguments: $api_url: "%env(INVENTORY_API_URL)%" - $api_ocp_key: "%env(INVENTORY_API_OCP)%" + $api_ocp_key: "%env(INVENTORY_API_OCP)%" $api_auth_prefix: "%env(INVENTORY_API_AUTH_TOKEN_PREFIX)%" $api_auth_token: "%env(INVENTORY_API_AUTH_TOKEN)%" diff --git a/src/Controller/CustomerController.php b/src/Controller/CustomerController.php index fd9417cc..17f8e7bc 100644 --- a/src/Controller/CustomerController.php +++ b/src/Controller/CustomerController.php @@ -181,15 +181,13 @@ class CustomerController extends Controller public function getCustomerVehicles(Request $req, CustomerHandlerInterface $cust_handler) { - /* - // TODO: fix - if ((!$this->isGranted('jo_onestep.form')) || - (!$this->isGranted('jo_walkin.form')) || - (!$this->isGranted('jo_in.list'))) { + if (!(($this->isGranted('jo_onestep.form')) || + ($this->isGranted('jo_walkin.form')) || + ($this->isGranted('jo_in.list')))) + { $exception = $this->createAccessDeniedException('No access.'); throw $exception; } - */ $results = $cust_handler->getCustomerVehicles($req); diff --git a/src/Controller/JobOrderController.php b/src/Controller/JobOrderController.php index c92de36a..d8866203 100644 --- a/src/Controller/JobOrderController.php +++ b/src/Controller/JobOrderController.php @@ -98,7 +98,7 @@ class JobOrderController extends Controller $this->denyAccessUnlessGranted('jo_open.edit', null, 'No access.'); $error_array = []; - $result = $jo_handler->generateJobOrder($req, $id); + $result = $jo_handler->openEditJobOrder($req, $id); $error_array = $result['error_array']; @@ -939,12 +939,18 @@ class JobOrderController extends Controller /** * @ParamConverter("jo", class="App\Entity\JobOrder") */ - public function popupInfo(JobOrder $jo) + public function popupInfo(JobOrder $jo, JobOrderHandlerInterface $jo_handler) { if ($jo == null) return new Response('No job order data'); - return $this->render('job-order/popup.html.twig', [ 'jo' => $jo ]); + // get the right template + $template = $jo_handler->getTwigTemplate('jo_popup'); + + $params['jo'] = $jo; + + // response + return $this->render($template, $params); } /** diff --git a/src/Service/JobOrderHandler/CMBJobOrderHandler.php b/src/Service/JobOrderHandler/CMBJobOrderHandler.php index d490ce56..862d431b 100644 --- a/src/Service/JobOrderHandler/CMBJobOrderHandler.php +++ b/src/Service/JobOrderHandler/CMBJobOrderHandler.php @@ -2842,6 +2842,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface $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'; $this->template_hash['jo_walkin_edit_form'] = 'job-order/cmb.form.walkin.html.twig'; + $this->template_hash['jo_popup'] = 'job-order/cmb.popup.html.twig'; } protected function checkTier($tier) diff --git a/src/Service/JobOrderHandler/ResqJobOrderHandler.php b/src/Service/JobOrderHandler/ResqJobOrderHandler.php index deeea114..585c6135 100644 --- a/src/Service/JobOrderHandler/ResqJobOrderHandler.php +++ b/src/Service/JobOrderHandler/ResqJobOrderHandler.php @@ -266,7 +266,7 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface return $params; } - // creates/updates job order + // creates job order public function generateJobOrder(Request $req, $id) { // initialize error list @@ -415,6 +415,105 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface return $data; } + // updates job order + public function openEditJobOrder(Request $req, $id) + { + $em = $this->em; + + $obj = $em->getRepository(JobOrder::class)->find($id); + + // initialize error list + $error_array = []; + + // make sure this object exists + if (empty($obj)) + throw $this->createNotFoundException('The item does not exist'); + + // check if lat and lng are provided + if (empty($req->request->get('coord_lng')) || empty($req->request->get('coord_lat'))) { + $error_array['coordinates'] = 'No map coordinates provided. Please click on a location on the map.'; + } + + if (empty($error_array)) + { + // get current user + $user = $this->security->getUser(); + + // coordinates + $point = new Point($req->request->get('coord_lng'), $req->request->get('coord_lat')); + + $stype = $req->request->get('service_type'); + + // set and save values + $obj->setDateSchedule(DateTime::createFromFormat("d M Y h:i A", $req->request->get('date_schedule_date') . " " . $req->request->get('date_schedule_time'))) + ->setCoordinates($point) + ->setAdvanceOrder($req->request->get('flag_advance') ?? false) + ->setServiceType($stype) + ->setWarrantyClass($req->request->get('warranty_class')) + ->setSource($req->request->get('source')) + ->setDeliveryInstructions($req->request->get('delivery_instructions')) + ->setTier1Notes($req->request->get('tier1_notes')) + ->setTier2Notes($req->request->get('tier2_notes')) + ->setDeliveryAddress($req->request->get('delivery_address')) + ->setORName($req->request->get('or_name')) + ->setPromoDetail($req->request->get('promo_detail')) + ->setModeOfPayment($req->request->get('mode_of_payment')) + ->setLandmark($req->request->get('landmark')); + + // did they change invoice? + $invoice_items = $req->request->get('invoice_items', []); + $promo_id = $req->request->get('invoice_promo'); + $invoice_change = $req->request->get('invoice_change', 0); + if ($invoice_change) + { + $this->ic->generateInvoiceCriteria($obj, $promo_id, $invoice_items, $error_array); + } + + // validate + $errors = $this->validator->validate($obj); + + // add errors to list + foreach ($errors as $error) { + $error_array[$error->getPropertyPath()] = $error->getMessage(); + } + + // check if any errors were found + if (!empty($error_array)) { + // return validation failure response + return $this->json([ + 'success' => false, + 'errors' => $error_array + ], 422); + } + + // the event + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::OPEN_EDIT) + ->setJobOrder($obj); + + if ($user != null) + { + $event->setUser($user); + } + + $em->persist($event); + + // validated! save the entity + $em->flush(); + } + + $data['error_array'] = $error_array; + + if ($obj != null) + { + $data['job_order'] = $obj; + } + + return $data; + + } + // dispatch job order public function dispatchJobOrder(Request $req, int $id, MQTTClient $mclient) { @@ -2404,8 +2503,7 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface $this->template_hash['jo_list_fulfillment'] = 'job-order/list.fulfillment.html.twig'; $this->template_hash['jo_list_open'] = 'job-order/list.open.html.twig'; $this->template_hash['jo_list_all'] = 'job-order/list.all.html.twig'; - $this->template_hash['jo_onestep'] = 'job-order/form.onestep.html.twig'; - $this->template_hash['jo_onestep_edit_form'] = 'job-order/form.onestep.html.twig'; + $this->template_hash['jo_popup'] = 'job-order/popup.html.twig'; } protected function checkTier($tier) diff --git a/src/Service/MapTools.php b/src/Service/MapTools.php index 17511fba..b60130a0 100644 --- a/src/Service/MapTools.php +++ b/src/Service/MapTools.php @@ -17,10 +17,15 @@ class MapTools // google maps api key protected $gmaps_api_key; - public function __construct(EntityManagerInterface $em, $gmaps_api_key) + // customer distance limit + protected $cust_dist_limit; + + public function __construct(EntityManagerInterface $em, $gmaps_api_key, + $cust_dist_limit) { $this->em = $em; $this->gmaps_api_key = $gmaps_api_key; + $this->cust_dist_limit = $cust_dist_limit; } protected function mapGetDistances(Point $point, $hubs) @@ -148,7 +153,8 @@ class MapTools return $final_data; */ } - + + // NOTE: only the API calls this public function getClosestOpenHubs(Point $point, $limit, $time = false) { // get closest hubs based on st_distance function from db @@ -184,14 +190,18 @@ class MapTools // get distance in kilometers from customer point to hub point $dist = $this->distance($cust_lat, $cust_lng, $hub_lat, $hub_lng); - $final_data[] = [ - 'hub' => $row[0], - 'db_distance' => $row['dist'], - 'distance' => $dist, - 'duration' => 0, - ]; + if ($dist < $this->cust_dist_limit) + { + $final_data[] = [ + 'hub' => $row[0], + 'db_distance' => $row['dist'], + 'distance' => $dist, + 'duration' => 0, + ]; + } } + error_log('nearest open hubs count: ' . count($final_data)); return $final_data; } diff --git a/templates/job-order/cmb.popup.html.twig b/templates/job-order/cmb.popup.html.twig new file mode 100644 index 00000000..d4e67d48 --- /dev/null +++ b/templates/job-order/cmb.popup.html.twig @@ -0,0 +1,13 @@ +{% set cust = jo.getCustomer %} +{% set cv = jo.getCustomerVehicle %} +{{ cust.getNameDisplay }}
+{{ cv.getPlateNumber }}
+Job Order #{{ jo.getID }}
+{{ jo.getServiceTypeName }}
+{{ jo.getStatusText }} +{% if jo.getRider != null %} +

+{% set rider = jo.getRider %} +{{ rider.getFullName }}
+{{ rider.getPlateNumber }} +{% endif %} diff --git a/templates/job-order/popup.html.twig b/templates/job-order/popup.html.twig index d4e67d48..b7e96f04 100644 --- a/templates/job-order/popup.html.twig +++ b/templates/job-order/popup.html.twig @@ -2,7 +2,7 @@ {% set cv = jo.getCustomerVehicle %} {{ cust.getNameDisplay }}
{{ cv.getPlateNumber }}
-Job Order #{{ jo.getID }}
+Job Order #{{ jo.getID }}
{{ jo.getServiceTypeName }}
{{ jo.getStatusText }} {% if jo.getRider != null %}