Move the assign rider, dispatch, fulfill, and cancel job order code to the service. #270

This commit is contained in:
Korina Cordero 2019-09-30 05:26:50 +00:00
parent bd8696311c
commit 7754ddc594
4 changed files with 408 additions and 132 deletions

View file

@ -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

View file

@ -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)
{

View file

@ -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)
{

View file

@ -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);
}