From abe1b8bb3d12f61a7a237bddd880eb0d6d5f43aa Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Wed, 18 Apr 2018 11:51:45 +0800 Subject: [PATCH] Add open edit JO feature #93 --- config/acl.yaml | 2 + config/routes/job_order.yaml | 10 ++ src/Controller/JobOrderController.php | 198 ++++++++++++++++++++++++ src/Entity/Invoice.php | 2 +- src/Ramcar/JOEventType.php | 2 + templates/job-order/form.html.twig | 31 ++-- templates/job-order/list.open.html.twig | 6 +- 7 files changed, 234 insertions(+), 17 deletions(-) diff --git a/config/acl.yaml b/config/acl.yaml index f531102b..f8a5febc 100644 --- a/config/acl.yaml +++ b/config/acl.yaml @@ -201,6 +201,8 @@ access_keys: label: View All - id: jo_pdf.list label: PDF + - id: jo_open.edit + label: Edit - id: joborder.cancel label: Cancel diff --git a/config/routes/job_order.yaml b/config/routes/job_order.yaml index f15163bd..14375bcb 100644 --- a/config/routes/job_order.yaml +++ b/config/routes/job_order.yaml @@ -160,3 +160,13 @@ jo_pdf_form: path: /job-order/pdf/{id} controller: App\Controller\JobOrderController::pdfForm methods: [GET] + +jo_open_edit_form: + path: /job-order/{id}/open-edit + controller: App\Controller\JobOrderController::openEditForm + methods: [GET] + +jo_open_edit_submit: + path: /job-order/{id}/open-edit + controller: App\Controller\JobOrderController::openEditSubmit + methods: [POST] diff --git a/src/Controller/JobOrderController.php b/src/Controller/JobOrderController.php index c3c14da0..a0d8bdac 100644 --- a/src/Controller/JobOrderController.php +++ b/src/Controller/JobOrderController.php @@ -143,6 +143,44 @@ class JobOrderController extends BaseController $params['sources'] = TransactionOrigin::getCollection(); } + protected function initFormTags(&$params) + { + // default to editing, as we have more forms editing than creating + $params['ftags'] = [ + 'title' => 'Job Order Form', + 'vehicle_dropdown' => false, + 'invoice_edit' => false, + 'set_map_coordinate' => true, + 'preset_vehicle' => false, + 'ticket_table' => true, + ]; + } + + protected function fillFormTags(&$params) + { + $this->initFormTags($params); + + switch ($params['mode']) + { + case 'create': + $params['ftags']['vehicle_dropdown'] = true; + $params['ftags']['set_map_coordinate'] = false; + $params['ftags']['invoice_edit'] = true; + $params['ftags']['ticket_table'] = false; + break; + case 'create_vehicle': + $params['ftags']['set_map_coordinate'] = false; + $params['ftags']['invoice_edit'] = true; + $params['ftags']['preset_vehicle'] = true; + $params['ftags']['ticket_table'] = false; + break; + case 'open_edit': + $params['ftags']['invoice_edit'] = true; + $params['ftags']['preset_vehicle'] = true; + break; + } + } + public function incomingForm() { $this->denyAccessUnlessGranted('jo_in.list', null, 'No access.'); @@ -156,11 +194,162 @@ class JobOrderController extends BaseController $em = $this->getDoctrine()->getManager(); $this->fillDropdownParameters($params); + $this->fillFormTags($params); // response return $this->render('job-order/form.html.twig', $params); } + public function openEditForm($id) + { + $this->denyAccessUnlessGranted('jo_open.edit', null, 'No access.'); + + $em = $this->getDoctrine()->getManager(); + $jo = $em->getRepository(JobOrder::class)->find($id); + + + $params = $this->initParameters('jo_in'); + $params['obj'] = $jo; + $params['mode'] = 'open_edit'; + $params['submit_url'] = $this->generateUrl('jo_open_edit_submit', ['id' => $id]); + $params['return_url'] = $this->generateUrl('jo_open'); + $params['cvid'] = $jo->getCustomerVehicle()->getID(); + $params['vid'] = $jo->getCustomerVehicle()->getVehicle()->getID(); + + $em = $this->getDoctrine()->getManager(); + + $this->fillDropdownParameters($params); + $this->fillFormTags($params); + + // response + return $this->render('job-order/form.html.twig', $params); + } + + public function openEditSubmit(Request $req, ValidatorInterface $validator, InvoiceCreator $ic, $id) + { + $this->denyAccessUnlessGranted('jo_open.edit', null, 'No access.'); + + // get object data + $em = $this->getDoctrine()->getManager(); + $obj = $em->getRepository(JobOrder::class)->find($id); + $user = $this->getUser(); + + // initialize error list + $error_array = []; + + // 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')); + + $stype = $req->request->get('service_type'); + + // 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($stype) + ->setWarrantyClass($req->request->get('warranty_class')) + ->setSource($req->request->get('source')) + ->setStatus(JOStatus::RIDER_ASSIGN) + ->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')); + + // did they change invoice? + $invoice_items = $req->request->get('invoice_items'); + if (!empty($invoice_items)) + { + // instantiate invoice criteria + $criteria = new InvoiceCriteria(); + $criteria->setServiceType($stype); + + $ierror = $this->invoicePromo($em, $criteria, $req->request->get('invoice_promo')); + + if (!$ierror) + $ierror = $this->invoiceBatteries($em, $criteria, $invoice_items); + + if ($ierror) + { + $error_array['invoice'] = $ierror; + } + else + { + // generate the invoice + $iobj = $ic->processCriteria($criteria); + $iobj->setStatus(InvoiceStatus::DRAFT) + ->setCreatedBy($this->getUser()); + + // validate + $ierrors = $validator->validate($iobj); + + // add errors to list + foreach ($ierrors as $error) { + $error_array[$error->getPropertyPath()] = $error->getMessage(); + } + + // remove previous invoice + $old_invoice = $obj->getInvoice(); + $em->remove($old_invoice); + $em->flush(); + + // add invoice to JO + $obj->setInvoice($iobj); + + // persist invoice + $em->persist($iobj); + } + } + + + // validate + $errors = $validator->validate($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)) { + // return validation failure response + return $this->json([ + 'success' => false, + 'errors' => $error_array + ], 422); + } + + // the event + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::OPEN_EDIT) + ->setUser($this->getUser()) + ->setJobOrder($obj); + $em->persist($event); + + // validated! save the entity + $em->flush(); + + // return successful response + return $this->json([ + 'success' => 'Changes have been saved!' + ]); + } + public function incomingVehicleForm($cvid) { $this->denyAccessUnlessGranted('jo_in.list', null, 'No access.'); @@ -190,6 +379,7 @@ class JobOrderController extends BaseController $params['obj'] = $jo; $this->fillDropdownParameters($params); + $this->fillFormTags($params); // response return $this->render('job-order/form.html.twig', $params); @@ -581,6 +771,7 @@ class JobOrderController extends BaseController { $row['meta']['reassign_hub_url'] = $this->generateUrl('jo_open_hub_form', ['id' => $row['id']]); $row['meta']['reassign_rider_url'] = $this->generateUrl('jo_open_rider_form', ['id' => $row['id']]); + $row['meta']['edit_url'] = $this->generateUrl('jo_open_edit_form', ['id' => $row['id']]); } else { @@ -659,6 +850,7 @@ class JobOrderController extends BaseController $params['status_cancelled'] = JOStatus::CANCELLED; $this->fillDropdownParameters($params); + $this->fillFormTags($params); // get closest hubs $hubs = $map_tools->getClosestHubs($obj->getCoordinates(), 20, date("H:i:s")); @@ -859,6 +1051,7 @@ class JobOrderController extends BaseController } $this->fillDropdownParameters($params); + $this->fillFormTags($params); $params['obj'] = $obj; $params['status_cancelled'] = JOStatus::CANCELLED; @@ -997,6 +1190,7 @@ class JobOrderController extends BaseController } $this->fillDropdownParameters($params); + $this->fillFormTags($params); $params['obj'] = $obj; $params['status_cancelled'] = JOStatus::CANCELLED; @@ -1189,6 +1383,7 @@ class JobOrderController extends BaseController } $this->fillDropdownParameters($params); + $this->fillFormTags($params); // get closest hubs $hubs = $map_tools->getClosestHubs($obj->getCoordinates(), 10, date("H:i:s")); @@ -1349,6 +1544,7 @@ class JobOrderController extends BaseController } $this->fillDropdownParameters($params); + $this->fillFormTags($params); $params['obj'] = $obj; $params['status_cancelled'] = JOStatus::CANCELLED; @@ -1464,6 +1660,7 @@ class JobOrderController extends BaseController throw $this->createNotFoundException('The job order does not exist'); $this->fillDropdownParameters($params); + $this->fillFormTags($params); $params['obj'] = $obj; $params['status_cancelled'] = JOStatus::CANCELLED; @@ -1520,6 +1717,7 @@ class JobOrderController extends BaseController throw $this->createNotFoundException('The job order does not exist'); $this->fillDropdownParameters($params); + $this->fillFormTags($params); $params['obj'] = $obj; $params['status_cancelled'] = JOStatus::CANCELLED; diff --git a/src/Entity/Invoice.php b/src/Entity/Invoice.php index 0fdc01ea..305c7d84 100644 --- a/src/Entity/Invoice.php +++ b/src/Entity/Invoice.php @@ -55,7 +55,7 @@ class Invoice // invoice items /** - * @ORM\OneToMany(targetEntity="InvoiceItem", mappedBy="invoice", cascade={"persist"}) + * @ORM\OneToMany(targetEntity="InvoiceItem", mappedBy="invoice", cascade={"persist", "remove"}) */ protected $items; diff --git a/src/Ramcar/JOEventType.php b/src/Ramcar/JOEventType.php index c7ade56f..defa6d3b 100644 --- a/src/Ramcar/JOEventType.php +++ b/src/Ramcar/JOEventType.php @@ -9,6 +9,7 @@ class JOEventType extends NameValue const RIDER_ASSIGN = 'rider_assign'; const CANCEL = 'cancel'; const FULFILL = 'fulfill'; + const OPEN_EDIT = 'open_edit'; const COLLECTION = [ 'create' => 'Created', @@ -16,5 +17,6 @@ class JOEventType extends NameValue 'rider_assign' => 'Assigned Rider', 'cancel' => 'Cancelled', 'fulfill' => 'Fulfilled', + 'open_edit' => 'Open Edit', ]; } diff --git a/templates/job-order/form.html.twig b/templates/job-order/form.html.twig index ce03c714..d79b000a 100644 --- a/templates/job-order/form.html.twig +++ b/templates/job-order/form.html.twig @@ -47,7 +47,7 @@
- {% if mode == 'create' %} + {% if ftags.vehicle_dropdown %}
@@ -72,7 +72,10 @@
- {% elseif obj.getReferenceJO %} + {% elseif cvid|default(false) %} + + {% endif %} + {% if obj.getReferenceJO %}
@@ -82,9 +85,7 @@
- {% elseif mode == 'create_vehicle' %} - - {% endif %} + {% endif %}
@@ -203,7 +204,7 @@
- +
@@ -382,7 +383,7 @@
-
+

Invoice @@ -403,7 +404,7 @@
- {% if mode == 'create' or mode == 'create_vehicle' %} + {% if ftags.invoice_edit %}