Add api calls: payment, complete, cancel, reject for job orders. #421

This commit is contained in:
Korina Cordero 2020-06-03 10:34:56 +00:00
parent 0e69eb4943
commit b6c54615ad
4 changed files with 332 additions and 312 deletions

View file

@ -109,3 +109,8 @@ cmb_rapi_jo_set_active:
path: /cmbrapi/joborderactive
controller: App\Controller\CMBRAPIController::setActiveJobOrder
methods: [POST]
cmb_rapi_jo_reject:
path: /cmbrapi/joborderreject
controller: App\Controller\CMBRAPIController::rejectJobOrder
methods: [POST]

View file

@ -503,5 +503,26 @@ class CMBRAPIController extends Controller
return $res->getReturnResponse();
}
public function rejectJobOrder(Request $req, RiderAPIHandlerInterface $rapi_handler)
{
$res = new APIResult();
$data = $rapi_handler->rejectJobOrder($req);
if (isset($data['error']))
{
$message = $data['error'];
$res->setError(true)
->setErrorMessage($message);
}
else
{
$res->setData($data);
}
// response
return $res->getReturnResponse();
}
}

View file

@ -15,8 +15,8 @@ class CMBJOEventType extends NameValue
const RIDER_IN_TRANSIT = 'rider_in_transit';
const RIDER_ARRIVE = 'arrive';
const RIDER_START = 'rider_start';
const RIDER_COMPLETE = 'rider_complete';
const RIDER_EDIT = 'rider_edit';
const PAID = 'paid';
const COLLECTION = [
'create' => 'Created',
@ -30,7 +30,7 @@ class CMBJOEventType extends NameValue
'rider_in_transit' => 'Rider in Transit',
'arrive' => 'Rider Arrive',
'rider_start' => 'Rider Start',
'rider_complete' => 'Rider Complete',
'rider_edit' => 'Rider Edit',
'paid' => 'Paid',
];
}

View file

@ -284,6 +284,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface
}
// TODO: this needs to be changed to get the JOs for this month and last month
public function getJobOrderHistory(Request $req)
{
$required_params = [];
@ -574,157 +575,113 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface
$required_params = [
'jo_id'
];
$data = $this->checkParamsAndKey($req, $required_params);
$data = $this->checkJO($req, $required_params, $jo);
if (isset($data['error']))
return $data;
// are we logged in?
if (!$this->session->hasRider())
$coord = $jo->getCoordinates();
$cust = $jo->getCustomer();
$cv = $jo->getCustomerVehicle();
$v = $cv->getVehicle();
$inv = $jo->getInvoice();
$promo = $inv->getPromo();
// invoice items
$inv_items = [];
foreach ($inv->getItems() as $item)
{
$data = [
'error' => 'No logged in rider.'
$item_batt = $item->getBattery();
if ($item_batt == null)
$batt_id = null;
else
$batt_id = $item_batt->getID();
$inv_items[] = [
'id' => $item->getID(),
'title' => $item->getTitle(),
'qty' => $item->getQuantity(),
'price' => $item->getPrice(),
'batt_id' => $batt_id,
];
return $data;
}
$rider = $this->session->getRider();
// get jo
$jo_id = $req->query->get('jo_id');
$jo = $this->em->getRepository(JobOrder::class)->find($jo_id);
if ($jo == null)
// promo
if ($promo != null)
{
$data = [
'job_order' => null
$promo_data = [
'id' => $promo->getID(),
'name' => $promo->getName(),
'code' => $promo->getCode(),
'discount_rate' => $promo->getDiscountRate(),
'discount_apply' => $promo->getDiscountApply(),
];
}
else
{
if ($jo->getRider() == null)
{
$data = [
'error' => 'Job order selected has no rider assigned.'
];
return $data;
}
// check if rider is assigned to JO
if ($rider->getID() != $jo->getRider()->getID())
{
$data = [
'error' => 'Job order selected is not assigned to rider'
];
return $data;
}
$coord = $jo->getCoordinates();
$cust = $jo->getCustomer();
$cv = $jo->getCustomerVehicle();
$v = $cv->getVehicle();
$inv = $jo->getInvoice();
$promo = $inv->getPromo();
// invoice items
$inv_items = [];
foreach ($inv->getItems() as $item)
{
$item_batt = $item->getBattery();
if ($item_batt == null)
$batt_id = null;
else
$batt_id = $item_batt->getID();
$inv_items[] = [
'id' => $item->getID(),
'title' => $item->getTitle(),
'qty' => $item->getQuantity(),
'price' => $item->getPrice(),
'batt_id' => $batt_id,
];
}
// promo
if ($promo != null)
{
$promo_data = [
'id' => $promo->getID(),
'name' => $promo->getName(),
'code' => $promo->getCode(),
'discount_rate' => $promo->getDiscountRate(),
'discount_apply' => $promo->getDiscountApply(),
];
}
else
{
$promo_data = null;
}
$trade_in_type = $jo->getTradeInType();
if (empty($trade_in_type))
$trade_in_type = 'none';
$data = [
'job_order' => [
'id' => $jo->getID(),
'service_type' => $jo->getServiceType(),
'date_schedule' => $jo->getDateSchedule()->format('Ymd H:i:s'),
'longitude' => $coord->getLongitude(),
'latitude' => $coord->getLatitude(),
'status' => $jo->getStatus(),
'customer' => [
'title' => $cust->getTitle(),
'first_name' => $cust->getFirstName(),
'last_name' => $cust->getLastName(),
'phone_mobile' => $this->country_code . $cust->getPhoneMobile(),
],
'vehicle' => [
'manufacturer' => $v->getManufacturer()->getName(),
'make' => $v->getMake(),
'model' => $cv->getModelYear(),
'plate_number' => $cv->getPlateNumber(),
'color' => $cv->getColor(),
],
'or_num' => $jo->getORNum(),
'or_name' => $jo->getORName(),
'delivery_instructions' => $jo->getDeliveryInstructions(),
'delivery_address' => $jo->getDeliveryAddress(),
'landmark' => $jo->getLandmark(),
'invoice' => [
'discount' => $inv->getDiscount(),
'trade_in' => $inv->getTradeIn(),
'total_price' => $inv->getTotalPrice(),
'vat' => $inv->getVat(),
'items' => $inv_items,
],
'mode_of_payment' => $jo->getModeOfPayment(),
'trade_in_type' => $trade_in_type,
'promo' => $promo_data,
// TODO: load the actual
'has_warranty_doc' => false,
'flag_coolant' => $jo->hasCoolant(),
'has_motolite' => $cv->hasMotoliteBattery(),
]
];
$promo_data = null;
}
$trade_in_type = $jo->getTradeInType();
if (empty($trade_in_type))
$trade_in_type = 'none';
$data = [
'job_order' => [
'id' => $jo->getID(),
'service_type' => $jo->getServiceType(),
'date_schedule' => $jo->getDateSchedule()->format('Ymd H:i:s'),
'longitude' => $coord->getLongitude(),
'latitude' => $coord->getLatitude(),
'status' => $jo->getStatus(),
'customer' => [
'title' => $cust->getTitle(),
'first_name' => $cust->getFirstName(),
'last_name' => $cust->getLastName(),
'phone_mobile' => $this->country_code . $cust->getPhoneMobile(),
],
'vehicle' => [
'manufacturer' => $v->getManufacturer()->getName(),
'make' => $v->getMake(),
'model' => $cv->getModelYear(),
'plate_number' => $cv->getPlateNumber(),
'color' => $cv->getColor(),
],
'or_num' => $jo->getORNum(),
'or_name' => $jo->getORName(),
'delivery_instructions' => $jo->getDeliveryInstructions(),
'delivery_address' => $jo->getDeliveryAddress(),
'landmark' => $jo->getLandmark(),
'invoice' => [
'discount' => $inv->getDiscount(),
'trade_in' => $inv->getTradeIn(),
'total_price' => $inv->getTotalPrice(),
'vat' => $inv->getVat(),
'items' => $inv_items,
],
'mode_of_payment' => $jo->getModeOfPayment(),
'trade_in_type' => $trade_in_type,
'promo' => $promo_data,
// TODO: load the actual
'has_warranty_doc' => false,
'flag_coolant' => $jo->hasCoolant(),
'has_motolite' => $cv->hasMotoliteBattery(),
]
];
return $data;
}
public function acceptJobOrder(Request $req)
{
$required_params = ['jo_id'];
$required_params = [
'jo_id'
];
$data = $this->checkJO($req, $required_params, $jo);
if (isset($data['error']))
return $data;
// TODO: refactor this into a jo handler class, so we don't have to repeat for control center
// set jo status to in transit
//$jo->setStatus(JOStatus::IN_TRANSIT);
// TODO: send mqtt event (?)
// add event log
$rider = $this->session->getRider();
$event = new JOEvent();
@ -742,7 +699,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface
public function setJobOrderInTransit(Request $req)
{
$required_params = ['jo_id'];
$data = $this->checkJO($req, $required_params, $jo);
$data = $this->checkActiveJO($req, $required_params, $jo);
if (isset($data['error']))
return $data;
@ -768,13 +725,41 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface
public function cancelJobOrder(Request $req)
{
$required_params = ['jo_id'];
$required_params = [
'jo_id',
'cancel_reason'
];
$data = $this->checkJO($req, $required_params, $jo);
if (isset($data['error']))
return $data;
$cancel_reason = $req->request->get('cancel_reason');
$jo->cancel($cancel_reason);
// add event log
$rider = $this->session->getRider();
$event = new JOEvent();
$event->setDateHappen(new DateTime())
->setTypeID(CMBJOEventType::REQUEUE)
->setJobOrder($jo)
->setRider($rider);
$this->em->persist($event);
$this->em->flush();
return $data;
}
public function rejectJobOrder(Request $req)
{
$required_params = [
'jo_id'
];
$data = $this->checkJO($req, $required_params, $jo);
if (isset($data['error']))
return $data;
// $jo->cancel("rider cancelled");
// requeue it, instead of cancelling it
$jo->requeue();
// add event log
@ -802,7 +787,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface
public function arrive(Request $req)
{
$required_params = ['jo_id'];
$data = $this->checkJO($req, $required_params, $jo);
$data = $this->checkActiveJO($req, $required_params, $jo);
if (isset($data['error']))
return $data;
@ -868,90 +853,24 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface
public function payment(Request $req)
{
$required_params = ['jo_id'];
$data = $this->checkJO($req, $required_params, $jo);
$data = $this->checkActiveJO($req, $required_params, $jo);
if (isset($data['error']))
return $data;
// set invoice to paid
$jo->getInvoice()->setStatus(InvoiceStatus::PAID);
/*
// set jo status to fulfilled
$jo->setStatus(JOStatus::FULFILLED);
*/
$jo->fulfill();
// add event log
$rider = $this->session->getRider();
$event = new JOEvent();
$event->setDateHappen(new DateTime())
->setTypeID(CMBJOEventType::FULFILL)
->setTypeID(CMBJOEventType::PAID)
->setJobOrder($jo)
->setRider($rider);
$this->em->persist($event);
// tag rider as unavailable
$rider->setAvailable(false);
// save to customer vehicle battery record
$this->jo_handler->updateVehicleBattery($jo);
$this->em->flush();
// create warranty
if($this->jo_handler->checkIfNewBattery($jo))
{
$serial = null;
$warranty_class = $jo->getWarrantyClass();
$first_name = $jo->getCustomer()->getFirstName();
$last_name = $jo->getCustomer()->getLastName();
$mobile_number = $jo->getCustomer()->getPhoneMobile();
// check if date fulfilled is null
//if ($jo->getDateFulfill() == null)
// $date_purchase = $jo->getDateCreate();
//else
// $date_purchase = $jo->getDateFulfill();
// use date_schedule for warranty expiration computation
$date_purchase = $jo->getDateSchedule();
$plate_number = $this->wh->cleanPlateNumber($jo->getCustomerVehicle()->getPlateNumber());
$batt_list = array();
$invoice = $jo->getInvoice();
if (!empty($invoice))
{
// get battery
$invoice_items = $invoice->getItems();
foreach ($invoice_items as $item)
{
$battery = $item->getBattery();
if ($battery != null)
{
$batt_list[] = $item->getBattery();
}
}
}
$this->wh->createWarranty($serial, $plate_number, $first_name, $last_name, $mobile_number, $batt_list, $date_purchase, $warranty_class);
}
// send mqtt event (fulfilled)
$rider = $this->session->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();
$payload = [
'event' => 'fulfilled',
'jo_id' => $jo->getID(),
'driver_image' => $image_url,
'driver_name' => $rider->getFullName(),
'driver_id' => $rider->getID(),
];
$this->mclient->sendEvent($jo, $payload);
return $data;
}
@ -1053,7 +972,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface
// allow rider to change service, promo, battery and trade-in options
$required_params = ['jo_id', 'stype_id', 'promo_id'];
$data = $this->checkJO($req, $required_params, $jo);
$data = $this->checkActiveJO($req, $required_params, $jo);
if (isset($data['error']))
return $data;
@ -1180,85 +1099,72 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface
public function generateInvoice(Request $req)
{
$required_params = ['jo_id'];
$data = $this->checkParamsAndKey($req, $required_params);
$data = $this->checkActiveJO($req, $required_params, $jo);
if (isset($data['error']))
return $data;
// get jo
$jo_id = $req->query->get('jo_id');
$inv = $jo->getInvoice();
$promo = $inv->getPromo();
$jo = $this->em->getRepository(JobOrder::class)->find($jo_id);
if ($jo == null)
// invoice items
$inv_items = [];
foreach ($inv->getItems() as $item)
{
$data = [
'invoice' => null
$item_batt = $item->getBattery();
if ($item_batt == null)
$batt_id = null;
else
$batt_id = $item_batt->getID();
$inv_items[] = [
'id' => $item->getID(),
'title' => $item->getTitle(),
'qty' => $item->getQuantity(),
'price' => $item->getPrice(),
'batt_id' => $batt_id,
];
}
// promo
if ($promo != null)
{
$promo_data = [
'id' => $promo->getID(),
'name' => $promo->getName(),
'code' => $promo->getCode(),
'discount_rate' => $promo->getDiscountRate(),
'discount_apply' => $promo->getDiscountApply(),
];
}
else
{
$inv = $jo->getInvoice();
$promo = $inv->getPromo();
// invoice items
$inv_items = [];
foreach ($inv->getItems() as $item)
{
$item_batt = $item->getBattery();
if ($item_batt == null)
$batt_id = null;
else
$batt_id = $item_batt->getID();
$inv_items[] = [
'id' => $item->getID(),
'title' => $item->getTitle(),
'qty' => $item->getQuantity(),
'price' => $item->getPrice(),
'batt_id' => $batt_id,
];
}
// promo
if ($promo != null)
{
$promo_data = [
'id' => $promo->getID(),
'name' => $promo->getName(),
'code' => $promo->getCode(),
'discount_rate' => $promo->getDiscountRate(),
'discount_apply' => $promo->getDiscountApply(),
];
}
else
{
$promo_data = null;
}
$trade_in_type = $jo->getTradeInType();
if (empty($trade_in_type))
$trade_in_type = 'none';
$data = [
'invoice' => [
'id' => $inv->getID(),
'discount' => $inv->getDiscount(),
'trade_in' => $inv->getTradeIn(),
'total_price' => $inv->getTotalPrice(),
'vat' => $inv->getVat(),
'items' => $inv_items,
'trade_in_type' => $trade_in_type,
'promo' => $promo_data,
]
];
$promo_data = null;
}
$trade_in_type = $jo->getTradeInType();
if (empty($trade_in_type))
$trade_in_type = 'none';
$data = [
'invoice' => [
'id' => $inv->getID(),
'discount' => $inv->getDiscount(),
'trade_in' => $inv->getTradeIn(),
'total_price' => $inv->getTotalPrice(),
'vat' => $inv->getVat(),
'items' => $inv_items,
'trade_in_type' => $trade_in_type,
'promo' => $promo_data,
]
];
return $data;
}
public function startJobOrder(Request $req)
{
$required_params = ['jo_id'];
$data = $this->checkJO($req, $required_params, $jo);
$data = $this->checkActiveJO($req, $required_params, $jo);
if (isset($data['error']))
return $data;
@ -1279,21 +1185,87 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface
public function completeJobOrder(Request $req)
{
$required_params = ['jo_id'];
$data = $this->checkJO($req, $required_params, $jo);
$data = $this->checkActiveJO($req, $required_params, $jo);
if (isset($data['error']))
return $data;
/*
// set jo status to fulfilled
$jo->setStatus(JOStatus::FULFILLED);
*/
$jo->fulfill();
// add event log
$rider = $this->session->getRider();
$event = new JOEvent();
$event->setDateHappen(new DateTime())
->setTypeID(CMBJOEventType::RIDER_COMPLETE)
->setTypeID(CMBJOEventType::FULFILL)
->setJobOrder($jo)
->setRider($rider);
$this->em->persist($event);
// tag rider as unavailable
$rider->setAvailable(false);
// save to customer vehicle battery record
$this->jo_handler->updateVehicleBattery($jo);
$this->em->flush();
// create warranty
if($this->jo_handler->checkIfNewBattery($jo))
{
$serial = null;
$warranty_class = $jo->getWarrantyClass();
$first_name = $jo->getCustomer()->getFirstName();
$last_name = $jo->getCustomer()->getLastName();
$mobile_number = $jo->getCustomer()->getPhoneMobile();
// check if date fulfilled is null
//if ($jo->getDateFulfill() == null)
// $date_purchase = $jo->getDateCreate();
//else
// $date_purchase = $jo->getDateFulfill();
// use date_schedule for warranty expiration computation
$date_purchase = $jo->getDateSchedule();
$plate_number = $this->wh->cleanPlateNumber($jo->getCustomerVehicle()->getPlateNumber());
$batt_list = array();
$invoice = $jo->getInvoice();
if (!empty($invoice))
{
// get battery
$invoice_items = $invoice->getItems();
foreach ($invoice_items as $item)
{
$battery = $item->getBattery();
if ($battery != null)
{
$batt_list[] = $item->getBattery();
}
}
}
$this->wh->createWarranty($serial, $plate_number, $first_name, $last_name, $mobile_number, $batt_list, $date_purchase, $warranty_class);
}
// TODO: Need to verify if needed.
// send mqtt event (fulfilled)
$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();
$payload = [
'event' => 'fulfilled',
'jo_id' => $jo->getID(),
'driver_image' => $image_url,
'driver_name' => $rider->getFullName(),
'driver_id' => $rider->getID(),
];
$this->mclient->sendEvent($jo, $payload);
return $data;
}
@ -1302,55 +1274,15 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface
$required_params = [
'jo_id'
];
$data = $this->checkParamsAndKey($req, $required_params);
$data = $this->checkJO($req, $required_params, $jo);
if (isset($data['error']))
return $data;
// are we logged in?
if (!$this->session->hasRider())
{
$data = [
'error' => 'No logged in rider.'
];
return $data;
}
$rider = $this->session->getRider();
$rider->setActiveJobOrder($jo);
// get jo
$jo_id = $req->request->get('jo_id');
$jo = $this->em->getRepository(JobOrder::class)->find($jo_id);
if ($jo == null)
{
$data = [
'job_order' => null
];
}
else
{
if ($jo->getRider() == null)
{
$data = [
'error' => 'Job order selected has no rider assigned.'
];
return $data;
}
// check if rider is assigned to JO
if ($rider->getID() != $jo->getRider()->getID())
{
$data = [
'error' => 'Job order selected is not assigned to rider.'
];
return $data;
}
$rider->setActiveJobOrder($jo);
$this->em->persist($rider);
$this->em->flush();
}
$this->em->persist($rider);
$this->em->flush();
return $data;
}
@ -1432,7 +1364,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface
return $session;
}
protected function checkJO(Request $req, $required_params, &$jo = null)
protected function checkActiveJO(Request $req, $required_params, &$jo = null)
{
// set jo status to in transit
$data = $this->checkParamsAndKey($req, $required_params);
@ -1459,9 +1391,14 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface
];
return $data;
}
$jo_id = '';
if ($req->getMethod() == 'GET')
$jo_id = $req->query->get('jo_id');
else
$jo_id = $req->request->get('jo_id');
// check if the jo_id sent is the same as our active jo
if ($req->request->get('jo_id') != $jo->getID())
if ($jo_id != $jo->getID())
{
$data = [
'error' => 'Job order selected is not active job order.'
@ -1472,6 +1409,63 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface
return $data;
}
protected function checkJO(Request $req, $required_params, &$jo = null)
{
// set jo status to in transit
$data = $this->checkParamsAndKey($req, $required_params);
if (isset($data['error']))
return $data;
// are we logged in?
if (!$this->session->hasRider())
{
$data = [
'error' => 'No logged in rider.'
];
return $data;
}
$rider = $this->session->getRider();
// get jo
$jo_id = '';
if ($req->getMethod() == 'GET')
$jo_id = $req->query->get('jo_id');
else
$jo_id = $req->request->get('jo_id');
$jo = $this->em->getRepository(JobOrder::class)->find($jo_id);
if ($jo == null)
{
$data = [
'error' => 'No job order found.'
];
return $data;
}
// check if rider assigned to jo is our rider
if ($jo->getRider() == null)
{
$data = [
'error' => 'Job order selected has no rider assigned.'
];
return $data;
}
// check if rider is assigned to JO
if ($rider->getID() != $jo->getRider()->getID())
{
$data = [
'error' => 'Job order selected is not assigned to rider'
];
return $data;
}
return $data;
}
protected function debugRequest(Request $req)
{
$all = $req->request->all();