From af85a632e5a531090d94cfac1e712e197f4faa2f Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Fri, 15 May 2020 08:48:58 +0000 Subject: [PATCH 1/7] Add acl entry for display of DPA Consent. Add checking when adding/updating customer for DPA consent. #408 --- config/acl.yaml | 2 ++ .../CustomerHandler/ResqCustomerHandler.php | 22 ++++++++++++++----- templates/customer/form.html.twig | 8 ++++--- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/config/acl.yaml b/config/acl.yaml index 25e04dbc..392696df 100644 --- a/config/acl.yaml +++ b/config/acl.yaml @@ -156,6 +156,8 @@ access_keys: label: Update - id: customer.delete label: Delete + - id: customer.dpa + label: Display DPA - id: location diff --git a/src/Service/CustomerHandler/ResqCustomerHandler.php b/src/Service/CustomerHandler/ResqCustomerHandler.php index e27399e3..151f13fe 100644 --- a/src/Service/CustomerHandler/ResqCustomerHandler.php +++ b/src/Service/CustomerHandler/ResqCustomerHandler.php @@ -163,17 +163,22 @@ class ResqCustomerHandler implements CustomerHandlerInterface // add new customer and customer vehicle, if any public function addCustomer(Request $req) { - // create new row - $em = $this->em; - $row = new Customer(); - - $this->setObject($row, $req); - // initialize error lists $error_array = []; $nerror_array = []; $verror_array = []; + // create new row + $em = $this->em; + $row = new Customer(); + + // check if dpa consent is unticked + $is_dpa_checked = $req->request->get('flag_dpa_consent'); + if (!$is_dpa_checked) + $error_array['flag_dpa_consent'] = 'DPA consent should be checked.'; + + $this->setObject($row, $req); + // custom validation for vehicles $vehicles = json_decode($req->request->get('vehicles')); @@ -325,6 +330,11 @@ class ResqCustomerHandler implements CustomerHandlerInterface $nerror_array = []; $verror_array = []; + // check if dpa consent is unticked + $is_dpa_checked = $req->request->get('flag_dpa_consent'); + if (!$is_dpa_checked) + $error_array['flag_dpa_consent'] = 'DPA consent should be checked.'; + // TODO: validate mobile numbers // TODO: validate vehicles diff --git a/templates/customer/form.html.twig b/templates/customer/form.html.twig index cb07b5a3..7adcf52c 100644 --- a/templates/customer/form.html.twig +++ b/templates/customer/form.html.twig @@ -122,9 +122,11 @@
- - - + {% if is_granted('customer.dpa') %} + + + + {% endif %}
From bbebdb04c8bf16805b36d6f079a77154365543ae Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Fri, 15 May 2020 09:24:31 +0000 Subject: [PATCH 2/7] Add checking for email address if email checkbox is checked. #408 --- .../CustomerHandler/ResqCustomerHandler.php | 19 +++++++++++++++++++ templates/customer/form.html.twig | 1 + 2 files changed, 20 insertions(+) diff --git a/src/Service/CustomerHandler/ResqCustomerHandler.php b/src/Service/CustomerHandler/ResqCustomerHandler.php index 151f13fe..0618a4ed 100644 --- a/src/Service/CustomerHandler/ResqCustomerHandler.php +++ b/src/Service/CustomerHandler/ResqCustomerHandler.php @@ -177,6 +177,15 @@ class ResqCustomerHandler implements CustomerHandlerInterface if (!$is_dpa_checked) $error_array['flag_dpa_consent'] = 'DPA consent should be checked.'; + // check if email marketing promo is checked + $is_email_promo_checked = $req->request->get('flag_promo_email'); + if ($is_email_promo_checked) + { + // check email field + if (empty($req->request->get('email'))) + $error_array['email'] = 'Email address required.'; + } + $this->setObject($row, $req); // custom validation for vehicles @@ -335,6 +344,16 @@ class ResqCustomerHandler implements CustomerHandlerInterface if (!$is_dpa_checked) $error_array['flag_dpa_consent'] = 'DPA consent should be checked.'; + // check if email marketing promo is checked + $is_email_promo_checked = $req->request->get('flag_promo_email'); + if ($is_email_promo_checked) + { + // check email field + if (empty($req->request->get('email'))) + $error_array['email'] = 'Email address required.'; + } + + // TODO: validate mobile numbers // TODO: validate vehicles diff --git a/templates/customer/form.html.twig b/templates/customer/form.html.twig index 7adcf52c..97b80884 100644 --- a/templates/customer/form.html.twig +++ b/templates/customer/form.html.twig @@ -80,6 +80,7 @@ E-mail +
From 25997ae11ebf9af55a5c00f9861288fc9d86e706 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Tue, 19 May 2020 03:30:50 +0000 Subject: [PATCH 3/7] Add acl, menu item, template, and route for Hub View. #410 --- config/acl.yaml | 2 + config/menu.yaml | 4 + config/resq.menu.yaml | 3 + config/routes/job_order.yaml | 5 + src/Controller/JobOrderController.php | 15 ++ .../JobOrderHandler/ResqJobOrderHandler.php | 4 + templates/job-order/list.hubview.html.twig | 175 ++++++++++++++++++ 7 files changed, 208 insertions(+) create mode 100644 templates/job-order/list.hubview.html.twig diff --git a/config/acl.yaml b/config/acl.yaml index 25e04dbc..36f0b2b3 100644 --- a/config/acl.yaml +++ b/config/acl.yaml @@ -266,6 +266,8 @@ access_keys: label: Walk-in Edit - id: jo_autoassign.test label: Autoassign Test + - id: jo_hub.view + label: Hub View - id: support label: Customer Support Access diff --git a/config/menu.yaml b/config/menu.yaml index b0096cf5..0adf524b 100644 --- a/config/menu.yaml +++ b/config/menu.yaml @@ -122,6 +122,10 @@ main_menu: acl: jo_all.list label: View All parent: joborder + - id: jo_hub_view + acl: jo_hub.view + label: Hub View + parent: joborder - id: support acl: support.menu diff --git a/config/resq.menu.yaml b/config/resq.menu.yaml index b0096cf5..69f0b806 100644 --- a/config/resq.menu.yaml +++ b/config/resq.menu.yaml @@ -122,6 +122,9 @@ main_menu: acl: jo_all.list label: View All parent: joborder + - id: jo_hub.view + label: Hub View + parent: joborder - id: support acl: support.menu diff --git a/config/routes/job_order.yaml b/config/routes/job_order.yaml index f239402d..ab505c42 100644 --- a/config/routes/job_order.yaml +++ b/config/routes/job_order.yaml @@ -235,3 +235,8 @@ jo_autoassign_test_submit: path: /job-order/autoassign controller: App\Controller\JobOrderController::autoAssignSubmit methods: [POST] + +jo_hub_view: + path: /job-order/hub-view + controller: App\Controller\JobOrderController::hubView + methods: [GET] diff --git a/src/Controller/JobOrderController.php b/src/Controller/JobOrderController.php index d8866203..bd9c67ad 100644 --- a/src/Controller/JobOrderController.php +++ b/src/Controller/JobOrderController.php @@ -1065,6 +1065,21 @@ class JobOrderController extends Controller ]); } + /** + * @Menu(selected="jo_hub_view") + */ + public function hubView(JobOrderHandlerInterface $jo_handler) + { + $this->denyAccessUnlessGranted('jo_hub.view', null, 'No access.'); + + $template = $jo_handler->getTwigTemplate('jo_hub_list'); + + $params = $jo_handler->getOtherParameters(); + $params['table_refresh_rate'] = $this->container->getParameter('job_order_refresh_interval'); + + return $this->render($template, $params); + } + /** * @Menu(selected="jo_autoassign") */ diff --git a/src/Service/JobOrderHandler/ResqJobOrderHandler.php b/src/Service/JobOrderHandler/ResqJobOrderHandler.php index 54deda2f..e8693945 100644 --- a/src/Service/JobOrderHandler/ResqJobOrderHandler.php +++ b/src/Service/JobOrderHandler/ResqJobOrderHandler.php @@ -2341,6 +2341,9 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface // get riders for dropdown $params['riders'] = $this->em->getRepository(Rider::class)->findAll(); + // get hubs for dropdown + $params['hubs'] = $this->em->getRepository(Hub::class)->findAll(); + return $params; } @@ -2509,6 +2512,7 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface $this->template_hash['jo_list_open'] = 'job-order/list.open.html.twig'; $this->template_hash['jo_list_all'] = 'job-order/list.all.html.twig'; $this->template_hash['jo_popup'] = 'job-order/popup.html.twig'; + $this->template_hash['jo_hub_list'] = 'job-order/list.hubview.html.twig'; } protected function checkTier($tier) diff --git a/templates/job-order/list.hubview.html.twig b/templates/job-order/list.hubview.html.twig new file mode 100644 index 00000000..c0c69003 --- /dev/null +++ b/templates/job-order/list.hubview.html.twig @@ -0,0 +1,175 @@ +{% extends 'base.html.twig' %} + +{% block body %} + +
+
+
+

+ Job Orders (Hub View) +

+
+
+
+ +
+ +
+
+
+
+
+
+
+
+
+
+ + + + +
+
+
+
+
+ +
+
+
+
+
+
+
+ +
+ +
+
+
+
+
+{% endblock %} + +{% block scripts %} + +{% endblock %} From ef3f5d5ceca40093f9b8d40bdd289268350767e5 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Tue, 19 May 2020 06:55:55 +0000 Subject: [PATCH 4/7] Add route to edit hub view form. Remove pdf link from hub view. Filter JOs based on selected hub. #410 --- config/acl.yaml | 2 +- config/menu.yaml | 2 +- config/routes/job_order.yaml | 13 ++ src/Controller/JobOrderController.php | 76 ++++++- .../JobOrderHandler/ResqJobOrderHandler.php | 199 ++++++++++++++++++ templates/job-order/list.hubview.html.twig | 29 +-- 6 files changed, 292 insertions(+), 29 deletions(-) diff --git a/config/acl.yaml b/config/acl.yaml index 36f0b2b3..f95f9eb1 100644 --- a/config/acl.yaml +++ b/config/acl.yaml @@ -266,7 +266,7 @@ access_keys: label: Walk-in Edit - id: jo_autoassign.test label: Autoassign Test - - id: jo_hub.view + - id: jo_hub.list label: Hub View - id: support diff --git a/config/menu.yaml b/config/menu.yaml index 0adf524b..f04dd4f9 100644 --- a/config/menu.yaml +++ b/config/menu.yaml @@ -123,7 +123,7 @@ main_menu: label: View All parent: joborder - id: jo_hub_view - acl: jo_hub.view + acl: jo_hub.list label: Hub View parent: joborder diff --git a/config/routes/job_order.yaml b/config/routes/job_order.yaml index ab505c42..586ed81f 100644 --- a/config/routes/job_order.yaml +++ b/config/routes/job_order.yaml @@ -240,3 +240,16 @@ jo_hub_view: path: /job-order/hub-view controller: App\Controller\JobOrderController::hubView methods: [GET] + +jo_hub_view_rows: + path: /job-order/hub-view-rows + controller: App\Controller\JobOrderController::getHubViewRows + methods: [POST] + defaults: + tier: "hub_view_all" + +jo_hub_view_form: + path: /job-order/hub-view/{id} + controller: App\Controller\JobOrderController::hubViewForm + methods: [GET] + diff --git a/src/Controller/JobOrderController.php b/src/Controller/JobOrderController.php index bd9c67ad..f23fc73c 100644 --- a/src/Controller/JobOrderController.php +++ b/src/Controller/JobOrderController.php @@ -1070,7 +1070,7 @@ class JobOrderController extends Controller */ public function hubView(JobOrderHandlerInterface $jo_handler) { - $this->denyAccessUnlessGranted('jo_hub.view', null, 'No access.'); + $this->denyAccessUnlessGranted('jo_hub.list', null, 'No access.'); $template = $jo_handler->getTwigTemplate('jo_hub_list'); @@ -1080,6 +1080,80 @@ class JobOrderController extends Controller return $this->render($template, $params); } + public function getHubViewRows(Request $req, $tier, JobOrderHandlerInterface $jo_handler) + { + try + { + $params = $jo_handler->getHubViewRows($req, $tier); + } + catch (AccessDeniedHttpException $e) + { + throw $this->createAccessDeniedException($e->getMessage()); + } + + $rows = $params['rows']; + $meta = $params['meta']; + $tier_params = $params['tier_params']; + + foreach ($rows as $key => $data) { + // add crud urls + $jo_id = $rows[$key]['id']; + + if ($tier == 'open') + { + $rows[$key]['meta']['reassign_hub_url'] = $this->generateUrl('jo_open_hub_form', ['id' => $jo_id]); + $rows[$key]['meta']['reassign_rider_url'] = $this->generateUrl('jo_open_rider_form', ['id' => $jo_id]); + // $rows[$key]['meta']['edit_url'] = $this->generateUrl('jo_open_edit_form', ['id' => $jo_id]); + $rows[$key]['meta']['edit_url'] = $this->generateUrl($jo_handler->getEditRoute($jo_id, $tier_params['edit_route']), ['id' => $jo_id]); + } + else + { + // $rows[$key]['meta']['update_url'] = $this->generateUrl($tier_params['edit_route'], ['id' => $jo_id]); + $rows[$key]['meta']['update_url'] = $this->generateUrl($jo_handler->getEditRoute($jo_id, $tier_params['edit_route']), ['id' => $jo_id]); + } + + if ($tier_params['unlock_route'] != '') + $rows[$key]['meta']['unlock_url'] = $this->generateUrl($tier_params['unlock_route'], ['id' => $jo_id]); + + } + + // response + return $this->json([ + 'meta' => $meta, + 'data' => $rows + ]); + } + + /** + * @Menu(selected="jo_hub_view") + */ + public function hubViewForm($id, JobOrderHandlerInterface $jo_handler, + GISManagerInterface $gis, EntityManagerInterface $em) + { + $this->denyAccessUnlessGranted('jo_hub.list', null, 'No access.'); + + try + { + $params = $jo_handler->initializeHubViewForm($id); + } + catch (NotFoundHttpException $e) + { + throw $this->createNotFoundException($e->getMessage()); + } + + $params['vmfgs'] = $em->getRepository(VehicleManufacturer::class)->findAll(); + $params['vmakes'] = $em->getRepository(Vehicle::class)->findAll(); + $params['return_url'] = $this->generateUrl('jo_hub_view'); + $params['submit_url'] = ''; + $params['map_js_file'] = $gis->getJSJOFile(); + + $template = $params['template']; + + // response + return $this->render($template, $params); + } + + /** * @Menu(selected="jo_autoassign") */ diff --git a/src/Service/JobOrderHandler/ResqJobOrderHandler.php b/src/Service/JobOrderHandler/ResqJobOrderHandler.php index e8693945..b6971ce1 100644 --- a/src/Service/JobOrderHandler/ResqJobOrderHandler.php +++ b/src/Service/JobOrderHandler/ResqJobOrderHandler.php @@ -2513,6 +2513,7 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface $this->template_hash['jo_list_all'] = 'job-order/list.all.html.twig'; $this->template_hash['jo_popup'] = 'job-order/popup.html.twig'; $this->template_hash['jo_hub_list'] = 'job-order/list.hubview.html.twig'; + $this->template_hash['jo_hub_view_form'] = 'job-order/form.html.twig'; } protected function checkTier($tier) @@ -2568,6 +2569,14 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface $unlock_route = ''; $jo_status = ''; break; + case 'hub_view_all': + $tier_key = 'jo_hub'; + $tier_name = 'Open'; + $rows_route = 'jo_hub_view_rows'; + $edit_route = 'jo_hub_view_form'; + $unlock_route = ''; + $jo_status = ''; + break; default: throw new AccessDeniedHttpException('No access.'); } @@ -2699,6 +2708,35 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface ->setParameter('date_end', $date_end); } break; + case 'hub_view_all': + if (isset($datatable['query']['data-rows-search'])) + { + $query->innerJoin('q.cus_vehicle', 'cv') + ->innerJoin('q.customer', 'c') + ->where('cv.plate_number like :filter') + ->orWhere('c.phone_mobile like :filter') + ->orWhere('c.first_name like :filter or c.last_name like :filter') + ->setParameter('filter', $datatable['query']['data-rows-search'] . '%'); + } + if (isset($datatable['query']['hub'])) + { + $query->innerJoin('q.hub', 'h') + ->andWhere('h.id = :hub_id') + ->setParameter('hub_id', $datatable['query']['hub']); + } + + $c_date = new DateTime(); + $start_curr_date = $c_date->format('Y-m-d') . ' ' . '00:00:00'; + $end_curr_date = $c_date->format('Y-m-d') . ' ' . '23:59:00'; + + $start_current_date = DateTime::createFromFormat('Y-m-d H:i:s', $start_curr_date); + $end_current_date = DateTime::createFromFormat('Y-m-d H:i:s', $end_curr_date); + + $query->andWhere('q.date_schedule >= :start_current_date') + ->andWhere('q.date_schedule <= :end_current_date') + ->setParameter('start_current_date', $start_current_date) + ->setParameter('end_current_date', $end_current_date); + break; default: $query->where('q.status = :status') ->setParameter('status', $status); @@ -2712,4 +2750,165 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface return $tier; } + + public function getHubViewRows(Request $req, $tier) + { + // check which job order tier is being called for and confirm access + $tier_params = $this->checkTier($tier); + + // get current user + $user = $this->security->getUser(); + if ($user == null) + throw new AccessDeniedHttpException('No access.'); + + $hubs = $user->getHubs(); + + // get query builder + $qb = $this->em->getRepository(JobOrder::class) + ->createQueryBuilder('q'); + + // get datatable params + $datatable = $req->request->get('datatable'); + + // count total records + $tquery = $qb->select('COUNT(q)'); + + $this->setQueryFilters($datatable, $tquery, $qb, $hubs, $tier, $tier_params['jo_status']); + + $total = $tquery->getQuery() + ->getSingleScalarResult(); + + // get current page number + $page = $datatable['pagination']['page'] ?? 1; + + $perpage = $datatable['pagination']['perpage']; + $offset = ($page - 1) * $perpage; + + // add metadata + $meta = [ + 'page' => $page, + 'perpage' => $perpage, + 'pages' => ceil($total / $perpage), + 'total' => $total, + 'sort' => 'asc', + 'field' => 'id' + ]; + + // build query + $qb = $this->em->getRepository(JobOrder::class) + ->createQueryBuilder('q'); + $query = $qb->select('q'); + + $this->setQueryFilters($datatable, $query, $qb, $hubs, $tier, $tier_params['jo_status']); + + // check if sorting is present, otherwise use default + if (isset($datatable['sort']['field']) && !empty($datatable['sort']['field'])) { + $order = $datatable['sort']['sort'] ?? 'asc'; + $query->orderBy('q.' . $datatable['sort']['field'], $order); + } else { + $query->orderBy('q.date_schedule', 'asc'); + } + + // get rows for this page + $query_obj = $query->setFirstResult($offset) + ->setMaxResults($perpage) + ->getQuery(); + + // error_log($query_obj->getSQL()); + + $obj_rows = $query_obj->getResult(); + + $statuses = JOStatus::getCollection(); + $service_types = ServiceType::getCollection(); + + // process rows + $rows = []; + foreach ($obj_rows as $orow) { + // add row data + $row['id'] = $orow->getID(); + $row['customer_name'] = $orow->getCustomer()->getFirstName() . ' ' . $orow->getCustomer()->getLastName(); + $row['delivery_address'] = $orow->getDeliveryAddress(); + $row['date_schedule'] = $orow->getDateSchedule()->format("d M Y g:i A"); + $row['type'] = $orow->isAdvanceOrder() ? 'Advanced Order' : 'Immediate'; + $row['service_type'] = $service_types[$orow->getServiceType()]; + $row['status'] = $statuses[$orow->getStatus()]; + $row['flag_advance'] = $orow->isAdvanceOrder(); + $row['plate_number'] = $orow->getCustomerVehicle()->getPlateNumber(); + $row['is_mobile'] = $orow->getSource() == TransactionOrigin::MOBILE_APP; + + $processor = $orow->getProcessedBy(); + if ($processor == null) + $row['processor'] = ''; + else + $row['processor'] = $orow->getProcessedBy()->getFullName(); + + $assignor = $orow->getAssignedBy(); + if ($assignor == null) + $row['assignor'] = ''; + else + $row['assignor'] = $orow->getAssignedBy()->getFullName(); + + $rows[] = $row; + } + + $params['meta'] = $meta; + $params['rows'] = $rows; + $params['tier_params'] = $tier_params; + + return $params; + } + + public function initializeHubViewForm($id) + { + $em = $this->em; + + $params['mode'] = 'update-all'; + + // get row data + $obj = $em->getRepository(JobOrder::class)->find($id); + + // make sure this row exists + if (empty($obj)) + throw new NotFoundHttpException('The job order does not exist'); + + $this->fillDropdownParameters($params); + $this->fillFormTags($params); + + // get template to display + $params['template'] = $this->getTwigTemplate('jo_hub_view_form'); + + $params['obj'] = $obj; + $params['status_cancelled'] = JOStatus::CANCELLED; + + // timeline stuff (descending by time) + $params['timeline'] = [ + [ + 'date' => date("M j"), + 'time' => date("g:i A"), + 'event' => "Event 4", + 'color' => "#f4516c" + ], + [ + 'date' => date("M j"), + 'time' => date("g:i A"), + 'event' => "Event 3", + 'color' => "#34bfa3" + ], + [ + 'date' => date("M j"), + 'time' => date("g:i A"), + 'event' => "Event 2", + 'color' => "#716aca" + ], + [ + 'date' => date("M j"), + 'time' => date("g:i A"), + 'event' => "Event 1", + 'color' => "#ffb822" + ], + ]; + + return $params; + } + } diff --git a/templates/job-order/list.hubview.html.twig b/templates/job-order/list.hubview.html.twig index c0c69003..d59a76dc 100644 --- a/templates/job-order/list.hubview.html.twig +++ b/templates/job-order/list.hubview.html.twig @@ -59,16 +59,12 @@ {% block scripts %} From c5eaf348a8c0c6d4195dfac6f4c1d9431e8a1d57 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Wed, 20 May 2020 05:22:08 +0000 Subject: [PATCH 5/7] Filter hubs in hubs dropdown to those with flag_hub_view set to true. Add flag_hub_view to Hub entity. Filter JOs whose status are not cancelled or fulfilled. #411 --- src/Controller/HubController.php | 5 +++-- src/Entity/Hub.php | 19 ++++++++++++++++++ .../JobOrderHandler/ResqJobOrderHandler.php | 20 ++++++++++++++++--- templates/hub/form.html.twig | 9 +++++++++ 4 files changed, 48 insertions(+), 5 deletions(-) diff --git a/src/Controller/HubController.php b/src/Controller/HubController.php index 5c8adb04..edc6e599 100644 --- a/src/Controller/HubController.php +++ b/src/Controller/HubController.php @@ -152,8 +152,9 @@ class HubController extends Controller ->setTimeClose($time_close) ->setCoordinates($point) ->setBranchCode($req->request->get('branch_code', '')) - ->setStatusOpen($req->request->get('status_open') ?? false) - ->setRiderSlots($req->request->get('rider_slots', 0)); + ->setStatusOpen($req->request->get('status_open', false)) + ->setRiderSlots($req->request->get('rider_slots', 0)) + ->setHubViewFlag($req->request->get('flag_hub_view', false)); } protected function setQueryFilters($datatable, QueryBuilder $query) diff --git a/src/Entity/Hub.php b/src/Entity/Hub.php index 9edcb88a..0b1769b2 100644 --- a/src/Entity/Hub.php +++ b/src/Entity/Hub.php @@ -62,6 +62,12 @@ class Hub */ protected $rider_slots; + // flag to see if hub will be displayed in Hub View + /** + * @ORM\Column(type="boolean") + */ + protected $flag_hub_view; + public function __construct() { $this->time_open = new DateTime(); @@ -69,6 +75,7 @@ class Hub $this->riders = new ArrayCollection(); $this->outlets = new ArrayCollection(); $this->status_open = true; + $this->flag_hub_view = false; } public function getRiders() @@ -167,4 +174,16 @@ class Hub return $this->rider_slots; } + public function setHubViewFlag($flag_hub_view = true) + { + $this->flag_hub_view = $flag_hub_view; + return $this; + } + + public function isHubView() + { + return $this->flag_hub_view; + } + + } diff --git a/src/Service/JobOrderHandler/ResqJobOrderHandler.php b/src/Service/JobOrderHandler/ResqJobOrderHandler.php index b6971ce1..6a44b954 100644 --- a/src/Service/JobOrderHandler/ResqJobOrderHandler.php +++ b/src/Service/JobOrderHandler/ResqJobOrderHandler.php @@ -2342,7 +2342,7 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface $params['riders'] = $this->em->getRepository(Rider::class)->findAll(); // get hubs for dropdown - $params['hubs'] = $this->em->getRepository(Hub::class)->findAll(); + $params['hubs'] = $this->em->getRepository(Hub::class)->findBy(['flag_hub_view' => true]); return $params; } @@ -2575,7 +2575,13 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface $rows_route = 'jo_hub_view_rows'; $edit_route = 'jo_hub_view_form'; $unlock_route = ''; - $jo_status = ''; + $jo_status = [ + JOStatus::PENDING, + JOStatus::RIDER_ASSIGN, + JOStatus::ASSIGNED, + JOStatus::IN_PROGRESS, + JOStatus::IN_TRANSIT, + ]; break; default: throw new AccessDeniedHttpException('No access.'); @@ -2724,6 +2730,12 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface ->andWhere('h.id = :hub_id') ->setParameter('hub_id', $datatable['query']['hub']); } + else + { + $query->innerJoin('q.hub', 'h') + ->andWhere('h.flag_hub_view = :flag_hub_view') + ->setParameter('flag_hub_view', true); + } $c_date = new DateTime(); $start_curr_date = $c_date->format('Y-m-d') . ' ' . '00:00:00'; @@ -2734,8 +2746,10 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface $query->andWhere('q.date_schedule >= :start_current_date') ->andWhere('q.date_schedule <= :end_current_date') + ->andWhere('q.status IN (:statuses)') ->setParameter('start_current_date', $start_current_date) - ->setParameter('end_current_date', $end_current_date); + ->setParameter('end_current_date', $end_current_date) + ->setParameter('statuses', $status, Connection::PARAM_STR_ARRAY); break; default: $query->where('q.status = :status') diff --git a/templates/hub/form.html.twig b/templates/hub/form.html.twig index b47b546d..d7101260 100644 --- a/templates/hub/form.html.twig +++ b/templates/hub/form.html.twig @@ -132,6 +132,15 @@
+
+ + + +
From c2ca48c40244a6371085ddc34230c55775da2ae0 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Wed, 20 May 2020 07:40:18 +0000 Subject: [PATCH 6/7] Add auto assigned job orders report. #412 --- config/acl.yaml | 2 + config/routes/report.yaml | 10 ++ src/Controller/ReportController.php | 153 ++++++++++++++++++ templates/base.html.twig | 10 ++ .../report/jo-auto-assign/form.html.twig | 82 ++++++++++ 5 files changed, 257 insertions(+) create mode 100644 templates/report/jo-auto-assign/form.html.twig diff --git a/config/acl.yaml b/config/acl.yaml index f95f9eb1..d6e1c186 100644 --- a/config/acl.yaml +++ b/config/acl.yaml @@ -334,6 +334,8 @@ access_keys: label: Job Order Events Report - id: report.sms_messages label: SMS Messages Report + - id: report.jo.auto_assign + label: Auto Assigned Job Order Report - id: service label: Other Services diff --git a/config/routes/report.yaml b/config/routes/report.yaml index 38a78059..4ddc4452 100644 --- a/config/routes/report.yaml +++ b/config/routes/report.yaml @@ -107,3 +107,13 @@ rep_sms_messages_submit: path: /report/sms_messages_report controller: App\Controller\ReportController::smsMessagesSubmit methods: [POST] + +rep_jo_auto_assign_form: + path: /report/jo_auto_assign_report + controller: App\Controller\ReportController::jobOrderAutoAssignForm + methods: [GET] + +rep_jo_auto_assign_submit: + path: /report/jo_auto_assign_report + controller: App\Controller\ReportController::jobOrderAutoAssignSubmit + methods: [POST] diff --git a/src/Controller/ReportController.php b/src/Controller/ReportController.php index ce989e46..3f392948 100644 --- a/src/Controller/ReportController.php +++ b/src/Controller/ReportController.php @@ -903,6 +903,63 @@ class ReportController extends Controller } + /** + * @Menu(selected="outlet_list") + */ + public function jobOrderAutoAssignForm() + { + $this->denyAccessUnlessGranted('report.jo.auto_assign', null, 'No access.'); + + return $this->render('report/jo-auto-assign/form.html.twig'); + } + + public function jobOrderAutoAssignSubmit(Request $req, EntityManagerInterface $em) + { + // get dates + $raw_date_start = $req->request->get('date_start'); + $raw_date_end = $req->request->get('date_end'); + + $date_start = DateTime::createFromFormat('m/d/Y', $raw_date_start); + $date_end = DateTime::createFromFormat('m/d/Y', $raw_date_end); + + $data = $this->getAutoAssignedJODetails($req, $em); + + $resp = new StreamedResponse(); + $resp->setCallback(function() use ($data) { + // csv output + $csv_handle = fopen('php://output', 'w+'); + fputcsv($csv_handle, [ + 'Job Order ID', + 'Customer Name', + 'Customer Mobile Number', + 'Plate Number', + 'Service Type', + 'Date Created', + 'Date Scheduled', + 'Distributor', //hub + 'Is Advanced Order?', + 'Auto Assign Status', + 'Status', + ]); + + foreach ($data as $row) + { + fputcsv($csv_handle, $row); + } + + fclose($csv_handle); + }); + + $filename = 'auto_assigned_job_orders_' . $date_start->format('Ymd') . '_' . $date_end->format('Ymd') . '.csv'; + + $resp->setStatusCode(200); + $resp->headers->set('Content-Type', 'text/csv; charset=utf-8'); + $resp->headers->set('Content-Disposition', 'attachment; filename="' . $filename . '"'); + + return $resp; + + } + protected function processPopappFile(UploadedFile $csv_file, EntityManagerInterface $em) { // attempt to open file @@ -1711,4 +1768,100 @@ class ReportController extends Controller return $result; } + + protected function getAutoAssignedJODetails(Request $req, EntityManagerInterface $em) + { + // get query builder + $qb = $this->getDoctrine() + ->getRepository(JobOrder::class) + ->createQueryBuilder('r'); + + // get dates + $raw_date_start = $req->request->get('date_start'); + $raw_date_end = $req->request->get('date_end'); + + $date_start = DateTime::createFromFormat('m/d/Y', $raw_date_start); + $date_end = DateTime::createFromFormat('m/d/Y', $raw_date_end); + + // build query + $query = $qb->where('r.date_create >= :start') + ->andWhere('r.date_create <= :end') + ->andWhere('r.status_autoassign IS NOT NULL') + ->setParameter('start', $date_start->format('Y-m-d') . ' 00:00:00') + ->setParameter('end', $date_end->format('Y-m-d') . ' 23:59:59') + ->getQuery(); + + // run query + $jos = $query->getResult(); + + $result = []; + foreach($jos as $jo) + { + // get customer information + $cust_name = ''; + $cust_mobile_number = ''; + $plate_number = ''; + + $customer = $jo->getCustomer(); + if ($customer != null) + { + $cust_name = $customer->getNameDisplay(); + + // get mobile number from mobile session + // find latest generated mobile session for customer + $mobile_sessions = $em->getRepository(MobileSession::class)->findBy(['customer' => $customer], ['date_generated' => 'DESC']); + if ($mobile_sessions != null) + { + foreach($mobile_sessions as $mobile_session) + { + $cust_mobile_number = $mobile_session->getPhoneNumber(); + } + } + } + + // get customer vehicle + $cust_vehicle = $jo->getCustomerVehicle(); + if ($cust_vehicle != null) + $plate_number = $cust_vehicle->getPlateNumber(); + + // get hub name + $hub_name = ''; + if ($jo->getHub() != null) + $hub_name = $jo->getHub()->getName(); + + // get jo date create + $datetime_create_jo = ''; + $jo_create = $jo->getDateCreate(); + + $datetime_create_jo = $jo_create->format('d-M-Y H:i'); + + // get jo date schedule if any + $datetime_sked_jo = ''; + $jo_date_scheduled = $jo->getDateSchedule(); + if (empty($jo_date_scheduled)) + { + // set to same date and time as date create of JO + $datetime_sked_jo = $datetime_create_jo; + } + else + $datetime_sked_jo = $jo_date_scheduled->format('d-M-Y H:i'); + + $result[] = [ + $jo->getID(), + $cust_name, + $cust_mobile_number, + $plate_number, + $jo->getServiceType(), + $datetime_create_jo, + $datetime_sked_jo, + $hub_name, + $jo->isAdvanceOrder() ? 'Yes' : 'No', + $jo->getStatusAutoAssign(), + $jo->getStatus(), + ]; + + } + + return $result; + } } diff --git a/templates/base.html.twig b/templates/base.html.twig index f4c36db7..6959e072 100644 --- a/templates/base.html.twig +++ b/templates/base.html.twig @@ -162,6 +162,16 @@ + +