diff --git a/src/Controller/JobOrderController.php b/src/Controller/JobOrderController.php index cf6dfdc9..cac71d96 100644 --- a/src/Controller/JobOrderController.php +++ b/src/Controller/JobOrderController.php @@ -963,54 +963,14 @@ class JobOrderController extends Controller ->setWarrantyExpiration($warr_date); } - public function fulfillmentSubmit(Request $req, ValidatorInterface $validator, MQTTClient $mclient, $id) + public function fulfillmentSubmit(Request $req, JobOrderHandlerInterface $jo_handler, MQTTClient $mclient, $id) { $this->denyAccessUnlessGranted('jo_fulfill.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.'; - } - - if (empty($error_array)) { - // 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::FULFILLED) - ->setDeliveryInstructions($req->request->get('delivery_instructions')) - ->setTier1Notes($req->request->get('tier1_notes')) - ->setTier2Notes($req->request->get('tier2_notes')) - ->setDeliveryAddress($req->request->get('delivery_address')); - // ->setDateFulfill(new DateTime()); - - // validate - $errors = $validator->validate($obj); - - // add errors to list - foreach ($errors as $error) { - $error_array[$error->getPropertyPath()] = $error->getMessage(); - } - } - - $obj->fulfill(); + $error_array = $jo_handler->fulfillJobOrder($req, $id, $mclient); // check if any errors were found if (!empty($error_array)) { @@ -1021,45 +981,6 @@ class JobOrderController extends Controller ], 422); } - /* - // set rider available - $rider = $obj->getRider(); - if ($rider != null) - $rider->setAvailable(); - */ - - // the event - $event = new JOEvent(); - $event->setDateHappen(new DateTime()) - ->setTypeID(JOEventType::FULFILL) - ->setUser($this->getUser()) - ->setJobOrder($obj); - $em->persist($event); - - // save to customer vehicle battery record - $this->updateVehicleBattery($obj); - - // validated! save the entity - $em->flush(); - - // get rider - $rider = $obj->getRider(); - - $image_url = $req->getScheme() . '://' . $req->getHttpHost() . $req->getBasePath() . '/assets/images/user.gif'; - 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); - // return successful response return $this->json([ 'success' => 'Changes have been saved!' @@ -1843,7 +1764,7 @@ class JobOrderController extends Controller ]); } - public function cancelJobOrder(Request $req, MQTTClient $mclient, $id) + public function cancelJobOrder(Request $req, JobOrderHandlerInterface $jo_handler, MQTTClient $mclient, $id) { $this->denyAccessUnlessGranted('joborder.cancel', null, 'No access.'); @@ -1858,52 +1779,13 @@ class JobOrderController extends Controller ], 422); } - // 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'); - - /* - // cancel job order - $obj->setStatus(JOStatus::CANCELLED) - ->setDateCancel(new DateTime()) - ->setCancelReason($cancel_reason); - - // set rider available - $rider = $obj->getRider(); - if ($rider != null) - $rider->setAvailable(); - */ - - $obj->cancel($cancel_reason); - - // the event - $event = new JOEvent(); - $event->setDateHappen(new DateTime()) - ->setTypeID(JOEventType::CANCEL) - ->setUser($this->getUser()) - ->setJobOrder($obj); - $em->persist($event); - - // save - $em->flush(); - - // send mobile app event - $payload = [ - 'event' => 'cancelled', - 'reason' => $cancel_reason, - 'jo_id' => $obj->getID(), - ]; - $mclient->sendEvent($obj, $payload); - $mclient->sendRiderEvent($obj, $payload); + $jo_handler->cancelJobOrder($req, $id, $mclient); // return successful response return $this->json([ 'success' => 'Job order has been cancelled!' ]); + } // TODO: re-enable search, figure out how to group the orWhere filters into one, so can execute that plus the pending filter diff --git a/src/Service/JobOrderHandler/CMBJobOrderHandler.php b/src/Service/JobOrderHandler/CMBJobOrderHandler.php index 3a204a67..2b7a31a8 100644 --- a/src/Service/JobOrderHandler/CMBJobOrderHandler.php +++ b/src/Service/JobOrderHandler/CMBJobOrderHandler.php @@ -13,12 +13,14 @@ use App\Entity\Battery; use App\Entity\JOEvent; use App\Entity\CustomerVehicle; use App\Entity\Hub; +use App\Entity\Rider; use App\Ramcar\InvoiceCriteria; use App\Ramcar\ServiceType; use App\Ramcar\TradeInType; use App\Ramcar\JOEventType; use App\Ramcar\JOStatus; +use App\Ramcar\WarrantyClass; use App\Service\InvoiceGeneratorInterface; use App\Service\JobOrderHandlerInterface; @@ -27,7 +29,10 @@ use App\Service\APNSClient; use CrEOF\Spatial\PHP\Types\Geometry\Point; +use Mosquitto\Client as MosquittoClient; + use DateTime; +use DateInterval; class CMBJobOrderHandler implements JobOrderHandlerInterface { @@ -185,7 +190,6 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface // initialize error list $error_array = []; - // make sure this object exists if (empty($obj)) throw $this->createNotFoundException('The item does not exist'); @@ -262,7 +266,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface ->setHub($hub); // validate - $errors = $validator->validate($obj); + $errors = $this->validator->validate($obj); // add errors to list foreach ($errors as $error) { @@ -298,13 +302,16 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface return $error_array; } - // assigning job order + // assign job order public function assignJobOrder(Request $req, $id, MQTTCLient $mclient, APNSClient $aclient) { // get object data $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'); @@ -359,7 +366,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface } // validate - $errors = $validator->validate($obj); + $errors = $this->validator->validate($obj); // add errors to list foreach ($errors as $error) { @@ -402,6 +409,193 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface return $error_array; } + // fulfill job order + public function fulfillJobOrder(Request $req, $id, MQTTClient $mclient) + { + // initialize error list + $error_array = []; + + // get object data + $em = $this->em; + $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.'; + } + + if (empty($error_array)) { + // 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')) + ->setDeliveryInstructions($req->request->get('delivery_instructions')) + ->setTier1Notes($req->request->get('tier1_notes')) + ->setTier2Notes($req->request->get('tier2_notes')) + ->setDeliveryAddress($req->request->get('delivery_address')); + + // validate + $errors = $this->validator->validate($obj); + + // add errors to list + foreach ($errors as $error) { + $error_array[$error->getPropertyPath()] = $error->getMessage(); + } + } + + $obj->fulfill(); + + if (empty($error_array)) + { + // the event + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::FULFILL) + ->setJobOrder($obj); + + // get current user + $user = $this->security->getUser(); + if ($user != null) + { + $event->setUser($user); + } + + $event->setUser($user); + $em->persist($event); + + // save to customer vehicle battery record + $this->updateVehicleBattery($obj); + + // validated! save the entity + $em->flush(); + + // get rider + $rider = $obj->getRider(); + + $image_url = $req->getScheme() . '://' . $req->getHttpHost() . $req->getBasePath() . '/assets/images/user.gif'; + 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); + } + } + + // cancel job order + public function cancelJobOrder(Request $req, int $id, MQTTClient $mclient) + { + // get object data + $em = $this->em; + $obj = $em->getRepository(JobOrder::class)->find($id); + + // make sure this object exists + if (empty($obj)) + throw $this->createNotFoundException('The item does not exist'); + + $cancel_reason = $req->request->get('cancel_reason'); + $obj->cancel($cancel_reason); + + // the event + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::CANCEL) + ->setJobOrder($obj); + + // get current user + $user = $this->security->getUser(); + if ($user != null) + { + $event->setUser($user); + } + + $event->setUser($user); + + $em->persist($event); + + // save + $em->flush(); + + // send mobile app event + $payload = [ + 'event' => 'cancelled', + 'reason' => $cancel_reason, + 'jo_id' => $obj->getID(), + ]; + $mclient->sendEvent($obj, $payload); + $mclient->sendRiderEvent($obj, $payload); + } + + protected function updateVehicleBattery(JobOrder $jo) + { + // check if new battery + if ($jo->getServiceType() != ServiceType::BATTERY_REPLACEMENT_NEW) + return; + + // customer vehicle + $cv = $jo->getCustomerVehicle(); + if ($cv == null) + return; + + // invoice + $invoice = $jo->getInvoice(); + if ($invoice == null) + return; + + // invoice items + $items = $invoice->getItems(); + if (count($items) <= 0) + return; + + // get first battery from invoice + $battery = null; + foreach ($items as $item) + { + $battery = $item->getBattery(); + if ($battery != null) + break; + } + + // no battery in order + if ($battery == null) + return; + + // warranty expiration + $warr = $jo->getWarrantyClass(); + if ($warr == WarrantyClass::WTY_PRIVATE) + $warr_months = $battery->getWarrantyPrivate(); + else if ($warr == WarrantyClass::WTY_COMMERCIAL) + $warr_months = $battery->getWarrantyCommercial(); + else if ($warr == WarrantyClass::WTY_TNV) + $warr_months = 12; + + $warr_date = new DateTime(); + $warr_date->add(new DateInterval('P' . $warr_months . 'M')); + + // update customer vehicle battery + $cv->setCurrentBattery($battery) + ->setHasMotoliteBattery(true) + ->setWarrantyExpiration($warr_date); + } + + // TODO: move this to InvoiceGenerator protected function processInvoice($jo, $promo_id, $invoice_items, &$error_array) { diff --git a/src/Service/JobOrderHandler/ResqJobOrderHandler.php b/src/Service/JobOrderHandler/ResqJobOrderHandler.php index cad5f639..8d521f99 100644 --- a/src/Service/JobOrderHandler/ResqJobOrderHandler.php +++ b/src/Service/JobOrderHandler/ResqJobOrderHandler.php @@ -13,12 +13,14 @@ use App\Entity\Battery; use App\Entity\JOEvent; use App\Entity\CustomerVehicle; use App\Entity\Hub; +use App\Entity\Rider; use App\Ramcar\InvoiceCriteria; use App\Ramcar\ServiceType; use App\Ramcar\TradeInType; use App\Ramcar\JOEventType; use App\Ramcar\JOStatus; +use App\Ramcar\WarrantyClass; use App\Service\InvoiceGeneratorInterface; use App\Service\JobOrderHandlerInterface; @@ -27,7 +29,10 @@ use App\Service\APNSClient; use CrEOF\Spatial\PHP\Types\Geometry\Point; +use Mosquitto\Client as MosquittoClient; + use DateTime; +use DateInterval; class ResqJobOrderHandler implements JobOrderHandlerInterface { @@ -185,7 +190,6 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface // initialize error list $error_array = []; - // make sure this object exists if (empty($obj)) throw $this->createNotFoundException('The item does not exist'); @@ -262,7 +266,7 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface ->setHub($hub); // validate - $errors = $validator->validate($obj); + $errors = $this->validator->validate($obj); // add errors to list foreach ($errors as $error) { @@ -298,13 +302,16 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface return $error_array; } - // assigning job order + // assign job order public function assignJobOrder(Request $req, $id, MQTTCLient $mclient, APNSClient $aclient) { // get object data $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'); @@ -359,7 +366,7 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface } // validate - $errors = $validator->validate($obj); + $errors = $this->validator->validate($obj); // add errors to list foreach ($errors as $error) { @@ -402,6 +409,193 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface return $error_array; } + // fulfill job order + public function fulfillJobOrder(Request $req, $id, MQTTClient $mclient) + { + // initialize error list + $error_array = []; + + // get object data + $em = $this->em; + $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.'; + } + + if (empty($error_array)) { + // 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')) + ->setDeliveryInstructions($req->request->get('delivery_instructions')) + ->setTier1Notes($req->request->get('tier1_notes')) + ->setTier2Notes($req->request->get('tier2_notes')) + ->setDeliveryAddress($req->request->get('delivery_address')); + + // validate + $errors = $this->validator->validate($obj); + + // add errors to list + foreach ($errors as $error) { + $error_array[$error->getPropertyPath()] = $error->getMessage(); + } + } + + $obj->fulfill(); + + if (empty($error_array)) + { + // the event + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::FULFILL) + ->setJobOrder($obj); + + // get current user + $user = $this->security->getUser(); + if ($user != null) + { + $event->setUser($user); + } + + $event->setUser($user); + $em->persist($event); + + // save to customer vehicle battery record + $this->updateVehicleBattery($obj); + + // validated! save the entity + $em->flush(); + + // get rider + $rider = $obj->getRider(); + + $image_url = $req->getScheme() . '://' . $req->getHttpHost() . $req->getBasePath() . '/assets/images/user.gif'; + 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); + } + } + + // cancel job order + public function cancelJobOrder(Request $req, int $id, MQTTClient $mclient) + { + // get object data + $em = $this->em; + $obj = $em->getRepository(JobOrder::class)->find($id); + + // make sure this object exists + if (empty($obj)) + throw $this->createNotFoundException('The item does not exist'); + + $cancel_reason = $req->request->get('cancel_reason'); + $obj->cancel($cancel_reason); + + // the event + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::CANCEL) + ->setJobOrder($obj); + + // get current user + $user = $this->security->getUser(); + if ($user != null) + { + $event->setUser($user); + } + + $event->setUser($user); + + $em->persist($event); + + // save + $em->flush(); + + // send mobile app event + $payload = [ + 'event' => 'cancelled', + 'reason' => $cancel_reason, + 'jo_id' => $obj->getID(), + ]; + $mclient->sendEvent($obj, $payload); + $mclient->sendRiderEvent($obj, $payload); + } + + protected function updateVehicleBattery(JobOrder $jo) + { + // check if new battery + if ($jo->getServiceType() != ServiceType::BATTERY_REPLACEMENT_NEW) + return; + + // customer vehicle + $cv = $jo->getCustomerVehicle(); + if ($cv == null) + return; + + // invoice + $invoice = $jo->getInvoice(); + if ($invoice == null) + return; + + // invoice items + $items = $invoice->getItems(); + if (count($items) <= 0) + return; + + // get first battery from invoice + $battery = null; + foreach ($items as $item) + { + $battery = $item->getBattery(); + if ($battery != null) + break; + } + + // no battery in order + if ($battery == null) + return; + + // warranty expiration + $warr = $jo->getWarrantyClass(); + if ($warr == WarrantyClass::WTY_PRIVATE) + $warr_months = $battery->getWarrantyPrivate(); + else if ($warr == WarrantyClass::WTY_COMMERCIAL) + $warr_months = $battery->getWarrantyCommercial(); + else if ($warr == WarrantyClass::WTY_TNV) + $warr_months = 12; + + $warr_date = new DateTime(); + $warr_date->add(new DateInterval('P' . $warr_months . 'M')); + + // update customer vehicle battery + $cv->setCurrentBattery($battery) + ->setHasMotoliteBattery(true) + ->setWarrantyExpiration($warr_date); + } + + // TODO: move this to InvoiceGenerator protected function processInvoice($jo, $promo_id, $invoice_items, &$error_array) { diff --git a/src/Service/JobOrderHandlerInterface.php b/src/Service/JobOrderHandlerInterface.php index 5955dc40..0295f96e 100644 --- a/src/Service/JobOrderHandlerInterface.php +++ b/src/Service/JobOrderHandlerInterface.php @@ -15,6 +15,12 @@ interface JobOrderHandlerInterface // dispatch job order public function dispatchJobOrder(Request $req, int $id, MQTTClient $mclient); - // assigning job order + // assign job order public function assignJobOrder(Request $req, int $id, MQTTCLient $mclient, APNSClient $aclient); + + // fulfill job order + public function fulfillJobOrder(Request $req, int $id, MQTTClient $mclient); + + // cancel job order + public function cancelJobOrder(Request $req, int $id, MQTTClient $mclient); }