From e6482d44f0d18251ec20c26b206bb859ec3f14df Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Tue, 1 Oct 2019 04:22:49 +0000 Subject: [PATCH] Move reassignment of hub and rider to the job order service. #270 --- src/Controller/JobOrderController.php | 90 ++----------- .../JobOrderHandler/CMBJobOrderHandler.php | 119 +++++++++++++++++- .../JobOrderHandler/ResqJobOrderHandler.php | 119 +++++++++++++++++- src/Service/JobOrderHandlerInterface.php | 3 + 4 files changed, 247 insertions(+), 84 deletions(-) diff --git a/src/Controller/JobOrderController.php b/src/Controller/JobOrderController.php index 30fb9398..e608ddd8 100644 --- a/src/Controller/JobOrderController.php +++ b/src/Controller/JobOrderController.php @@ -788,6 +788,9 @@ class JobOrderController extends Controller { $this->denyAccessUnlessGranted('jo_open.list', null, 'No access.'); + // initialize error list + $error_array = []; + try { $error_array = $jo_handler->setHub($req, $id, $mclient); @@ -835,75 +838,20 @@ class JobOrderController extends Controller return $this->render('job-order/form.html.twig', $params); } - public function openRiderSubmit(Request $req, ValidatorInterface $validator, MQTTClient $mclient, $id) + public function openRiderSubmit(Request $req, JobOrderHandlerInterface $jo_handler, MQTTClient $mclient, $id) { $this->denyAccessUnlessGranted('jo_open.list', null, 'No access.'); // initialize error list $error_array = []; - // get object data - $em = $this->getDoctrine()->getManager(); - $obj = $em->getRepository(JobOrder::class)->find($id); - - // 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.'; + try + { + $error_array = $jo_handler->setRider($req, $id, $mclient); } - - // check if rider is set - if (empty($req->request->get('rider'))) { - $error_array['rider'] = 'No rider selected.'; - } else { - // get rider - $rider = $em->getRepository(Rider::class)->find($req->request->get('rider')); - - if (empty($rider)) { - $error_array['rider'] = 'Invalid rider specified.'; - } - } - - if (empty($error_array)) { - // rider mqtt event - // NOTE: need to send this before saving because rider will be cleared - $rider_payload = [ - 'event' => 'cancelled', - 'reason' => 'Reassigned', - 'jo_id' => $obj->getID(), - ]; - $mclient->sendRiderEvent($obj, $rider_payload); - - // coordinates - $point = new Point($req->request->get('coord_lng'), $req->request->get('coord_lat')); - - // 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($req->request->get('service_type')) - ->setWarrantyClass($req->request->get('warranty_class')) - ->setSource($req->request->get('source')) - ->setStatus(JOStatus::ASSIGNED) - ->setDeliveryInstructions($req->request->get('delivery_instructions')) - ->setTier1Notes($req->request->get('tier1_notes')) - ->setTier2Notes($req->request->get('tier2_notes')) - ->setDeliveryAddress($req->request->get('delivery_address')) - ->setAssignedBy($this->getUser()) - ->setDateAssign(new DateTime()) - ->setAssignedBy($this->getUser()) - ->setRider($rider); - - // validate - $errors = $validator->validate($obj); - - // add errors to list - foreach ($errors as $error) { - $error_array[$error->getPropertyPath()] = $error->getMessage(); - } + catch (NotFoundHttpException $e) + { + throw $this->createNotFoundException($e->getMessage()); } // check if any errors were found @@ -915,24 +863,6 @@ class JobOrderController extends Controller ], 422); } - // add event - $event = new JOEvent(); - $event->setDateHappen(new DateTime()) - ->setTypeID(JOEventType::RIDER_ASSIGN) - ->setUser($this->getUser()) - ->setJobOrder($obj); - $em->persist($event); - - // validated! save the entity - $em->flush(); - - // send event to mobile app - $payload = [ - 'event' => 'driver_assigned' - ]; - $mclient->sendEvent($obj, $payload); - $mclient->sendRiderEvent($obj, $payload); - // return successful response return $this->json([ 'success' => 'Changes have been saved!' diff --git a/src/Service/JobOrderHandler/CMBJobOrderHandler.php b/src/Service/JobOrderHandler/CMBJobOrderHandler.php index 5c851279..caf79834 100644 --- a/src/Service/JobOrderHandler/CMBJobOrderHandler.php +++ b/src/Service/JobOrderHandler/CMBJobOrderHandler.php @@ -616,9 +616,13 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface ->setTier2Notes($req->request->get('tier2_notes')) ->setDeliveryAddress($req->request->get('delivery_address')) ->setHub($hub) - ->setProcessedBy($user) ->clearRider(); + if ($user != null) + { + $obj->setProcessedBy($user); + } + $em->persist($obj); // validate @@ -637,8 +641,13 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface $event = new JOEvent(); $event->setDateHappen(new DateTime()) ->setTypeID(JOEventType::HUB_ASSIGN) - ->setUser($user) ->setJobOrder($obj); + + if ($user != null) + { + $event->setUser($user); + } + $em->persist($event); // validated! save the entity @@ -654,6 +663,112 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface return $error_array; } + // set rider for job order + public function setRider($req, $id, $mclient) + { + // initialize error list + $error_array = []; + + // get object data + $em = $this->em; + $obj = $em->getRepository(JobOrder::class)->find($id); + $user = $this->security->getUser(); + + // make sure this object exists + if (empty($obj)) + throw new NotFoundHttpException('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.'; + } + + // check if rider is set + if (empty($req->request->get('rider'))) { + $error_array['rider'] = 'No rider selected.'; + } else { + // get rider + $rider = $em->getRepository(Rider::class)->find($req->request->get('rider')); + + if (empty($rider)) { + $error_array['rider'] = 'Invalid rider specified.'; + } + } + + if (empty($error_array)) { + // rider mqtt event + // NOTE: need to send this before saving because rider will be cleared + $rider_payload = [ + 'event' => 'cancelled', + 'reason' => 'Reassigned', + 'jo_id' => $obj->getID(), + ]; + $mclient->sendRiderEvent($obj, $rider_payload); + + // coordinates + $point = new Point($req->request->get('coord_lng'), $req->request->get('coord_lat')); + + // 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($req->request->get('service_type')) + ->setWarrantyClass($req->request->get('warranty_class')) + ->setSource($req->request->get('source')) + ->setStatus(JOStatus::ASSIGNED) + ->setDeliveryInstructions($req->request->get('delivery_instructions')) + ->setTier1Notes($req->request->get('tier1_notes')) + ->setTier2Notes($req->request->get('tier2_notes')) + ->setDeliveryAddress($req->request->get('delivery_address')) + ->setDateAssign(new DateTime()) + ->setRider($rider); + + if ($user != null) + { + $obj->setAssignedBy($user); + } + + // validate + $errors = $this->validator->validate($obj); + + $em->persist($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)) + { + // add event + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::RIDER_ASSIGN) + ->setJobOrder($obj); + + if ($user != null) + { + $event->setUser($user); + } + + $em->persist($event); + + // validated! save the entity + $em->flush(); + + // send event to mobile app + $payload = [ + 'event' => 'driver_assigned' + ]; + $mclient->sendEvent($obj, $payload); + $mclient->sendRiderEvent($obj, $payload); + } + + return $error_array; + } + // initialize incoming job order form public function initializeIncomingForm() { diff --git a/src/Service/JobOrderHandler/ResqJobOrderHandler.php b/src/Service/JobOrderHandler/ResqJobOrderHandler.php index 33afdb57..ab8898af 100644 --- a/src/Service/JobOrderHandler/ResqJobOrderHandler.php +++ b/src/Service/JobOrderHandler/ResqJobOrderHandler.php @@ -616,9 +616,13 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface ->setTier2Notes($req->request->get('tier2_notes')) ->setDeliveryAddress($req->request->get('delivery_address')) ->setHub($hub) - ->setProcessedBy($user) ->clearRider(); + if ($user != null) + { + $obj->setProcessedBy($user); + } + $em->persist($obj); // validate @@ -637,8 +641,13 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface $event = new JOEvent(); $event->setDateHappen(new DateTime()) ->setTypeID(JOEventType::HUB_ASSIGN) - ->setUser($user) ->setJobOrder($obj); + + if ($user != null) + { + $event->setUser($user); + } + $em->persist($event); // validated! save the entity @@ -654,6 +663,112 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface return $error_array; } + // set rider for job order + public function setRider($req, $id, $mclient) + { + // initialize error list + $error_array = []; + + // get object data + $em = $this->em; + $obj = $em->getRepository(JobOrder::class)->find($id); + $user = $this->security->getUser(); + + // make sure this object exists + if (empty($obj)) + throw new NotFoundHttpException('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.'; + } + + // check if rider is set + if (empty($req->request->get('rider'))) { + $error_array['rider'] = 'No rider selected.'; + } else { + // get rider + $rider = $em->getRepository(Rider::class)->find($req->request->get('rider')); + + if (empty($rider)) { + $error_array['rider'] = 'Invalid rider specified.'; + } + } + + if (empty($error_array)) { + // rider mqtt event + // NOTE: need to send this before saving because rider will be cleared + $rider_payload = [ + 'event' => 'cancelled', + 'reason' => 'Reassigned', + 'jo_id' => $obj->getID(), + ]; + $mclient->sendRiderEvent($obj, $rider_payload); + + // coordinates + $point = new Point($req->request->get('coord_lng'), $req->request->get('coord_lat')); + + // 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($req->request->get('service_type')) + ->setWarrantyClass($req->request->get('warranty_class')) + ->setSource($req->request->get('source')) + ->setStatus(JOStatus::ASSIGNED) + ->setDeliveryInstructions($req->request->get('delivery_instructions')) + ->setTier1Notes($req->request->get('tier1_notes')) + ->setTier2Notes($req->request->get('tier2_notes')) + ->setDeliveryAddress($req->request->get('delivery_address')) + ->setDateAssign(new DateTime()) + ->setRider($rider); + + if ($user != null) + { + $obj->setAssignedBy($user); + } + + // validate + $errors = $this->validator->validate($obj); + + $em->persist($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)) + { + // add event + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::RIDER_ASSIGN) + ->setJobOrder($obj); + + if ($user != null) + { + $event->setUser($user); + } + + $em->persist($event); + + // validated! save the entity + $em->flush(); + + // send event to mobile app + $payload = [ + 'event' => 'driver_assigned' + ]; + $mclient->sendEvent($obj, $payload); + $mclient->sendRiderEvent($obj, $payload); + } + + return $error_array; + } + // initialize incoming job order form public function initializeIncomingForm() { diff --git a/src/Service/JobOrderHandlerInterface.php b/src/Service/JobOrderHandlerInterface.php index df171492..5275b7cc 100644 --- a/src/Service/JobOrderHandlerInterface.php +++ b/src/Service/JobOrderHandlerInterface.php @@ -28,6 +28,9 @@ interface JobOrderHandlerInterface // set hub for job order public function setHub(Request $req, int $id, MQTTClient $mclient); + // set rider for job order + public function setRider(Request $req, int $id, MQTTClient $mclient); + // initialize incoming job order form public function initializeIncomingForm();