From 19ec112bd2f0b6da294b2b0fd0503bdc9ca0561f Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Mon, 19 Jul 2021 10:08:38 +0000 Subject: [PATCH] Move JO event creation to job order service. #591 --- config/services.yaml | 7 + src/Controller/ResqAPI/JobOrderController.php | 56 +---- .../JobOrderHandler/ResqJobOrderHandler.php | 234 ++++++++++-------- src/Service/JobOrderManager.php | 89 ++++++- 4 files changed, 229 insertions(+), 157 deletions(-) diff --git a/config/services.yaml b/config/services.yaml index 41bd65ab..87fa1e05 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -304,3 +304,10 @@ services: App\Service\MobileAPIHandler: arguments: $em: "@doctrine.orm.entity_manager" + + # job order service + App\Service\JobOrderManager: + arguments: + $em: "@doctrine.orm.entity_manager" + $rah: "@App\\Service\\RiderAssignmentHandlerInterface" + diff --git a/src/Controller/ResqAPI/JobOrderController.php b/src/Controller/ResqAPI/JobOrderController.php index 73c7d835..6f2805c6 100644 --- a/src/Controller/ResqAPI/JobOrderController.php +++ b/src/Controller/ResqAPI/JobOrderController.php @@ -39,6 +39,7 @@ use App\Service\HubFilterLogger; use App\Service\HubFilteringGeoChecker; use App\Service\MobileAPIHandler; use App\Service\RiderTracker; +use App\Service\JobOrderManager; use App\Entity\JobOrder; use App\Entity\CustomerVehicle; @@ -47,6 +48,7 @@ use App\Entity\Battery; use App\Entity\JOEvent; use App\Entity\Customer; use App\Entity\Hub; +use App\Entity\Invoice; use Catalyst\APIBundle\Access\Generator as ACLGenerator; @@ -66,7 +68,7 @@ class JobOrderController extends APIController InventoryManager $im, MQTTClient $mclient, RiderAssignmentHandlerInterface $rah, PromoLogger $promo_logger, EntityManagerInterface $em, HubSelector $hub_select, HubDistributor $hub_dist, HubFilterLogger $hub_filter_logger, HubFilteringGeoChecker $hub_geofence, - MobileAPIHandler $mah) + MobileAPIHandler $mah, JobOrderManager $jo_manager) { $this->denyAccessUnlessGranted('mobile_jo.request', null, 'No access.'); @@ -134,7 +136,7 @@ class JobOrderController extends APIController $em->persist($invoice); // create JO event logs - $this->processEvents($em, $jo, $rah, $mclient, JOEventType::CREATE); + $jo_manager->processJobOrderEvents($jo, JOEventType::CREATE); // send mqtt events $payload = [ @@ -162,7 +164,7 @@ class JobOrderController extends APIController RiderAssignmentHandlerInterface $rah, PromoLogger $promo_logger, HubSelector $hub_select, HubDistributor $hub_dist, HubFilterLogger $hub_filter_logger, HubFilteringGeoChecker $hub_geofence, EntityManagerInterface $em, - MobileAPIHandler $mah) + MobileAPIHandler $mah, JobOrderManager $jo_manager) { $this->denyAccessUnlessGranted('mobile_jo.request', null, 'No access.'); @@ -260,7 +262,7 @@ class JobOrderController extends APIController $em->persist($invoice); // create JO event logs - $this->processEvents($em, $jo, $rah, $mclient, JOEventType::CREATE); + $jo_manager->processJobOrderEvents($jo, JOEventType::CREATE); // send mqtt events $payload = [ @@ -376,7 +378,8 @@ class JobOrderController extends APIController } public function cancelJobOrder(Request $req, MQTTClient $mclient, EntityManagerInterface $em, - MobileAPIHandler $mah, RiderAssignmentHandlerInterface $rah) + MobileAPIHandler $mah, RiderAssignmentHandlerInterface $rah, + JobOrderManager $jo_manager) { $this->denyAccessUnlessGranted('mobile_jo.cancel', null, 'No access.'); @@ -420,7 +423,7 @@ class JobOrderController extends APIController $jo->cancel($cancel_reason); // create event logs - $this->processEvents($em, $jo, $rah, $mclient, JOEventType::CANCEL); + $jo_manager->processJobOrderEvents($jo, JOEventType::CANCEL); // send mqtt events $payload = [ @@ -1110,47 +1113,6 @@ class JobOrderController extends APIController } } - protected function processEvents(EntityManagerInterface $em, JobOrder $jo, - RiderAssignmentHandlerInterface $rah, MQTTClient $mclient, - $jo_event_type) - { - // add event log for JO - $event = new JOEvent(); - $event->setDateHappen(new DateTime()) - ->setTypeID($jo_event_type) - ->setJobOrder($jo); - $em->persist($event); - - // check JO status - if ($jo->getStatus() == JOStatus::ASSIGNED) - { - // add event logs for hub and rider assignments - $hub_assign_event = new JOEvent(); - $hub_assign_event->setDateHappen(new DateTime()) - ->setTypeID(JOEventType::HUB_ASSIGN) - ->setJobOrder($jo); - - $em->persist($hub_assign_event); - - $rider_assign_event = new JOEvent(); - $rider_assign_event->setDateHappen(new DateTime()) - ->setTypeID(JOEventType::RIDER_ASSIGN) - ->setJobOrder($jo); - - $em->persist($rider_assign_event); - } - if ($jo->getStatus() == JOStatus::RIDER_ASSIGN) - { - // add event logs for hub assignments - $hub_assign_event = new JOEvent(); - $hub_assign_event->setDateHappen(new DateTime()) - ->setTypeID(JOEventType::HUB_ASSIGN) - ->setJobOrder($jo); - - $em->persist($hub_assign_event); - } - } - protected function processMQTTEvents(JobOrder $jo, $payload, MQTTClient $mclient, RiderAssignmentHandlerInterface$rah) { diff --git a/src/Service/JobOrderHandler/ResqJobOrderHandler.php b/src/Service/JobOrderHandler/ResqJobOrderHandler.php index 6785ab0e..fcc3b6b0 100644 --- a/src/Service/JobOrderHandler/ResqJobOrderHandler.php +++ b/src/Service/JobOrderHandler/ResqJobOrderHandler.php @@ -56,6 +56,7 @@ use App\Service\PromoLogger; use App\Service\HubSelector; use App\Service\HubDistributor; use App\Service\HubFilteringGeoChecker; +use App\Service\JobOrderManager; use CrEOF\Spatial\PHP\Types\Geometry\Point; @@ -80,6 +81,8 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface protected $promo_logger; protected $hub_dist; protected $hub_geofence; + protected $mclient; + protected $jo_manager; protected $template_hash; @@ -87,7 +90,8 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface InvoiceGeneratorInterface $ic, ValidatorInterface $validator, TranslatorInterface $translator, RiderAssignmentHandlerInterface $rah, string $country_code, WarrantyHandler $wh, RisingTideGateway $rt, - PromoLogger $promo_logger, HubDistributor $hub_dist, HubFilteringGeoChecker $hub_geofence) + PromoLogger $promo_logger, HubDistributor $hub_dist, HubFilteringGeoChecker $hub_geofence, + MQTTClient $mclient, JobOrderManager $jo_manager) { $this->em = $em; $this->ic = $ic; @@ -101,6 +105,8 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface $this->promo_logger = $promo_logger; $this->hub_dist = $hub_dist; $this->hub_geofence = $hub_geofence; + $this->mclient = $mclient; + $this->jo_manager = $jo_manager; $this->loadTemplates(); } @@ -342,106 +348,18 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface ->setDpaConsent($is_dpa_checked); } - // 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 customer vehicle is set - if (empty($req->request->get('customer_vehicle'))) { - $error_array['customer_vehicle'] = 'No vehicle selected.'; - } else { + // validate and set job order object + $this->validateJobOrder($req, $error_array); + if (empty($error_array)) + { // get customer vehicle $cust_vehicle = $em->getRepository(CustomerVehicle::class)->find($req->request->get('customer_vehicle')); + // TODO: check status before saving since JO might already + // have a status that needs to be retained + $this->setJobOrderObject($req, $jo, $cust_vehicle); - if (empty($cust_vehicle)) { - $error_array['customer_vehicle'] = 'Invalid vehicle specified.'; - } - } - - // check if landmark is set - if (empty($req->request->get('landmark'))) - $error_array['landmark'] = 'Landmark is required.'; - - // check if customer is not willing to wait - $will_wait = $req->request->get('flag_willing_to_wait'); - $reason = ''; - $more_reason = ''; - if ($will_wait == WillingToWaitContent::NOT_WILLING_TO_WAIT) - { - // get the reason and text - $reason = $req->request->get('no_wait_reason'); - $more_reason = $req->request->get('not_wait_notes'); - } - - // check if service is battery sales - $stype = $req->request->get('service_type'); - $no_trade_in_reason = ''; - if ($stype == ServiceType::BATTERY_REPLACEMENT_NEW) - { - // check if trade in - $is_trade_in = $req->request->get('invoice_trade_in_type'); - if (empty($is_trade_in)) - { - $no_trade_in_reason = $req->request->get('no_trade_in_reason'); - - if (empty($no_trade_in_reason)) - $error_array['no_trade_in_reason'] = 'No trade in reason required.'; - } - } - - // TODO: check status before saving since JO might already - // have a status that needs to be retained - - 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')); - - // set and save values - $jo->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')) - ->setCustomer($cust_vehicle->getCustomer()) - ->setCustomerVehicle($cust_vehicle) - ->setSource($req->request->get('source')) - ->setStatus(JOStatus::PENDING) - ->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')) - ->setWillWait($req->request->get('flag_willing_to_wait')) - ->setReasonNotWait($reason) - ->setNotWaitingNotes($more_reason) - ->setNoTradeInReason($no_trade_in_reason); - - // check if user is null, meaning call to create came from API - if ($user != null) - { - $jo->setCreatedBy($user); - } - - // check if reference JO is set and validate - if (!empty($req->request->get('ref_jo'))) { - // get reference JO - $ref_jo = $em->getRepository(JobOrder::class)->find($req->request->get('ref_jo')); - - if (empty($ref_jo)) { - $error_array['ref_jo'] = 'Invalid reference job order specified.'; - } else { - $jo->setReferenceJO($ref_jo); - } - } - - // call service to generate job order and invoice + // call service to generate invoice $invoice_items = $req->request->get('invoice_items', []); $promo_id = $req->request->get('invoice_promo'); $invoice_change = $req->request->get('invoice_change', 0); @@ -467,18 +385,8 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface $em->persist($jo); $em->persist($customer); - // the event - $event = new JOEvent(); - $event->setDateHappen(new DateTime()) - ->setTypeID(JOEventType::CREATE) - ->setJobOrder($jo); + $this->jo_manager->processJobOrderEvents($jo, JOEventType::CREATE); - if ($user != null) - { - $event->setUser($user); - } - - $em->persist($event); $em->flush(); } } @@ -3004,6 +2912,116 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface } } + protected function validateJobOrder(Request $req, &$error_array) + { + // 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 customer vehicle is set + if (empty($req->request->get('customer_vehicle'))) { + $error_array['customer_vehicle'] = 'No vehicle selected.'; + } else { + // get customer vehicle + $cust_vehicle = $this->em->getRepository(CustomerVehicle::class)->find($req->request->get('customer_vehicle')); + + if (empty($cust_vehicle)) { + $error_array['customer_vehicle'] = 'Invalid vehicle specified.'; + } + } + + // check if landmark is set + if (empty($req->request->get('landmark'))) + $error_array['landmark'] = 'Landmark is required.'; + + // check if service is battery sales + $stype = $req->request->get('service_type'); + if ($stype == ServiceType::BATTERY_REPLACEMENT_NEW) + { + // check if trade in + $is_trade_in = $req->request->get('invoice_trade_in_type'); + if (empty($is_trade_in)) + { + if (empty($req->request->get('no_trade_in_reason'))) + $error_array['no_trade_in_reason'] = 'No trade in reason required.'; + } + } + + // check if reference JO is set and validate + if (!empty($req->request->get('ref_jo'))) { + // get reference JO + $ref_jo = $em->getRepository(JobOrder::class)->find($req->request->get('ref_jo')); + + if (empty($ref_jo)) { + $error_array['ref_jo'] = 'Invalid reference job order specified.'; + } + } + } + + protected function setJobOrderObject(Request $req, JobOrder $jo, $cust_vehicle) + { + // check if customer is not willing to wait + $will_wait = $req->request->get('flag_willing_to_wait'); + $reason = ''; + $more_reason = ''; + if ($will_wait == WillingToWaitContent::NOT_WILLING_TO_WAIT) + { + // get the reason and text + $reason = $req->request->get('no_wait_reason'); + $more_reason = $req->request->get('not_wait_notes'); + } + + // check if service is battery sales + $stype = $req->request->get('service_type'); + $no_trade_in_reason = ''; + if ($stype == ServiceType::BATTERY_REPLACEMENT_NEW) + { + // check if trade in + $is_trade_in = $req->request->get('invoice_trade_in_type'); + if (empty($is_trade_in)) + $no_trade_in_reason = $req->request->get('no_trade_in_reason'); + } + + // coordinates + $point = new Point($req->request->get('coord_lng'), $req->request->get('coord_lat')); + + // set and save values + $jo->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')) + ->setCustomer($cust_vehicle->getCustomer()) + ->setCustomerVehicle($cust_vehicle) + ->setSource($req->request->get('source')) + ->setStatus(JOStatus::PENDING) + ->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')) + ->setWillWait($req->request->get('flag_willing_to_wait')) + ->setReasonNotWait($reason) + ->setNotWaitingNotes($more_reason) + ->setNoTradeInReason($no_trade_in_reason); + + // get current user + $user = $this->security->getUser(); + if ($user != null) + $jo->setCreatedBy($user); + + // check if reference JO is set + if (!empty($req->request->get('ref_jo'))) { + // get reference JO + $ref_jo = $em->getRepository(JobOrder::class)->find($req->request->get('ref_jo')); + $jo->setReferenceJO($ref_jo); + } + } + public function getEditRoute($jo_id, $tier) { if (empty($tier)) diff --git a/src/Service/JobOrderManager.php b/src/Service/JobOrderManager.php index c54557d6..6d35fc74 100644 --- a/src/Service/JobOrderManager.php +++ b/src/Service/JobOrderManager.php @@ -2,19 +2,34 @@ namespace App\Service; +use Doctrine\ORM\EntityManagerInterface; + +use Symfony\Component\Security\Core\Security; + use App\Entity\JobOrder; +use App\Entity\JOEvent; +use App\Entity\User; use App\Ramcar\ServiceType; +use App\Ramcar\JOStatus; +use App\Ramcar\JOEventType; -use Doctrine\ORM\EntityManagerInterface; +use DateTime; class JobOrderManager { protected $em; + protected $security; + protected $rah; + protected $mclient; - public function __construct(EntityManagerInterface $em) + public function __construct(EntityManagerInterface $em, Security $security, + RiderAssignmentHandlerInterface $rah, MQTTClient $mclient) { $this->em = $em; + $this->security = $security; + $this->rah = $rah; + $this->mclient = $mclient; } public function fulfillJobOrder($jo_id) @@ -51,4 +66,74 @@ class JobOrderManager $this->em->flush(); } } + + public function processJobOrderEvents(JobOrder $jo, $jo_event_type) + { + $em = $this->em; + + // check for the jo event type + if ($jo_event_type == JOEventType::CREATE) + { + // add event log for JO + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID($jo_event_type) + ->setJobOrder($jo); + + $user = $this->security->getUser(); + // check if user is User or APIUser + if ($user instanceof User) + $event->setUser($user); + + $em->persist($event); + + // check for JO status for additional events + // (1) when mobile app gets a new JO, finds a hub and assigns a rider + if ($jo->getStatus() == JOStatus::ASSIGNED) + { + // add event logs for hub and rider assignments + $hub_assign_event = new JOEvent(); + $hub_assign_event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::HUB_ASSIGN) + ->setJobOrder($jo); + + $em->persist($hub_assign_event); + + $rider_assign_event = new JOEvent(); + $rider_assign_event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::RIDER_ASSIGN) + ->setJobOrder($jo); + + $em->persist($rider_assign_event); + } + // (2) when mobile app gets a new JO, finds a hub but no rider + if ($jo->getStatus() == JOStatus::RIDER_ASSIGN) + { + // add event logs for hub assignments + $hub_assign_event = new JOEvent(); + $hub_assign_event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::HUB_ASSIGN) + ->setJobOrder($jo); + + $em->persist($hub_assign_event); + } + } + // TODO: check for other JO event types + if ($jo_event_type == JOEventType::CANCEL) + { + // add event log for JO + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID($jo_event_type) + ->setJobOrder($jo); + + $user = $this->security->getUser(); + // check if user is User or APIUser + if ($user instanceof User) + $event->setUser($user); + + $em->persist($event); + } + } + }