From 7989f6b6d65a2eb6e66cf18a92489e7e5493cdf4 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Tue, 1 Oct 2019 08:35:55 +0000 Subject: [PATCH] Move retrieval of job order rows to the job service. #270 --- src/Controller/JobOrderController.php | 194 ++--------- .../JobOrderHandler/CMBJobOrderHandler.php | 305 ++++++++++++++++++ .../JobOrderHandler/ResqJobOrderHandler.php | 305 ++++++++++++++++++ src/Service/JobOrderHandlerInterface.php | 6 + 4 files changed, 638 insertions(+), 172 deletions(-) diff --git a/src/Controller/JobOrderController.php b/src/Controller/JobOrderController.php index d2b24be5..33084485 100644 --- a/src/Controller/JobOrderController.php +++ b/src/Controller/JobOrderController.php @@ -35,12 +35,10 @@ use App\Service\APNSClient; use Doctrine\ORM\Query; use Doctrine\DBAL\Connection; -use Doctrine\DBAL\LockMode; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Bundle\FrameworkBundle\Controller\Controller; -use Symfony\Contracts\Translation\TranslatorInterface; use Catalyst\MenuBundle\Annotation\Menu; @@ -48,77 +46,16 @@ use Mosquitto\Client as MosquittoClient; use DateTime; use DateInterval; -use FPDF; - class JobOrderController extends Controller { - public function getJobOrders(Request $req) + public function getJobOrders(Request $req, JobOrderHandlerInterface $jo_handler) { $this->denyAccessUnlessGranted('jo_in.list', null, 'No access.'); - // get search term - $term = $req->query->get('search'); + $params = $jo_handler->getJobOrders($req); - // get querybuilder - $qb = $this->getDoctrine() - ->getRepository(JobOrder::class) - ->createQueryBuilder('q'); - - // build expression now since we're reusing it - $jo_label = $qb->expr()->concat($qb->expr()->literal('#'), 'q.id', $qb->expr()->literal(' - '), 'c.first_name', $qb->expr()->literal(' '), 'c.last_name', $qb->expr()->literal(' (Plate No: '), 'v.plate_number', $qb->expr()->literal(')')); - - // count total records - $tquery = $qb->select('COUNT(q)') - ->join('q.customer', 'c') - ->join('q.cus_vehicle', 'v'); - - // add filters to count query - if (!empty($term)) { - $tquery->where($jo_label . ' LIKE :filter') - ->setParameter('filter', '%' . $term . '%'); - } - - $total = $tquery->getQuery() - ->getSingleScalarResult(); - - // pagination vars - $page = $req->query->get('page') ?? 1; - $perpage = 20; - $offset = ($page - 1) * $perpage; - $pages = ceil($total / $perpage); - $has_more_pages = $page < $pages ? true : false; - - // build main query - $query = $qb->select('q') - ->addSelect($jo_label . ' as jo_label') - ->addSelect('c.first_name as cust_first_name') - ->addSelect('c.last_name as cust_last_name') - ->addSelect('v.plate_number as vehicle_plate_number'); - - // add filters if needed - if (!empty($term)) { - $query->where($jo_label . ' LIKE :filter') - ->setParameter('filter', '%' . $term . '%'); - } - - // get rows - $obj_rows = $query->orderBy('q.id', 'asc') - ->setFirstResult($offset) - ->setMaxResults($perpage) - ->getQuery() - ->getResult(); - - // build job order array - $job_orders = []; - - foreach ($obj_rows as $jo) { - $service_type = ServiceType::getName($jo[0]->getServiceType()); - - $job_orders[] = [ - 'id' => $jo[0]->getID(), - 'text' => $jo['jo_label'] . ' - ' . $service_type - ]; - } + $job_orders = $params['job_orders']; + $has_more_pages = $params['has_more_pages']; // response return $this->json([ @@ -381,131 +318,44 @@ class JobOrderController extends Controller } */ - public function getRows(Request $req, $tier) + public function getRows(Request $req, $tier, JobOrderHandlerInterface $jo_handler) { - // check which job order tier is being called for and confirm access - $tier_params = $this->checkTier($tier); - - // get current user - $user = $this->getUser(); - $hubs = $user->getHubs(); - - // get query builder - $qb = $this->getDoctrine() - ->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->getDoctrine() - ->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'); + try + { + $params = $jo_handler->getRows($req, $tier); + } + catch (AccessDeniedHttpException $e) + { + throw $this->createAccessDeniedException($e->getMessage()); } - // get rows for this page - $query_obj = $query->setFirstResult($offset) - ->setMaxResults($perpage) - ->getQuery(); + $obj_rows = $params['rows']; + $meta = $params['meta']; + $tier_params = $params['tier_params']; - // error_log($query_obj->getSQL()); - - $obj_rows = $query_obj->getResult(); - /* - $obj_rows = $query->setFirstResult($offset) - ->setMaxResults($perpage) - ->getQuery() - ->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(); - // add crud urls if ($tier == 'open') { - $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']]); + $orow['meta']['reassign_hub_url'] = $this->generateUrl('jo_open_hub_form', ['id' => $orow['id']]); + $orow['meta']['reassign_rider_url'] = $this->generateUrl('jo_open_rider_form', ['id' => $orow['id']]); + $orow['meta']['edit_url'] = $this->generateUrl('jo_open_edit_form', ['id' => $orow['id']]); } else { - $row['meta']['update_url'] = $this->generateUrl($tier_params['edit_route'], ['id' => $row['id']]); - $row['meta']['pdf_url'] = $this->generateUrl('jo_pdf_form', ['id' => $row['id']]); + $orow['meta']['update_url'] = $this->generateUrl($tier_params['edit_route'], ['id' => $orow['id']]); + $orow['meta']['pdf_url'] = $this->generateUrl('jo_pdf_form', ['id' => $orow['id']]); } if ($tier_params['unlock_route'] != '') - $row['meta']['unlock_url'] = $this->generateUrl($tier_params['unlock_route'], ['id' => $row['id']]); + $orow['meta']['unlock_url'] = $this->generateUrl($tier_params['unlock_route'], ['id' => $orow['id']]); - $rows[] = $row; } // response return $this->json([ 'meta' => $meta, - 'data' => $rows + 'data' => $obj_rows ]); } diff --git a/src/Service/JobOrderHandler/CMBJobOrderHandler.php b/src/Service/JobOrderHandler/CMBJobOrderHandler.php index f8d89c0a..a415ff75 100644 --- a/src/Service/JobOrderHandler/CMBJobOrderHandler.php +++ b/src/Service/JobOrderHandler/CMBJobOrderHandler.php @@ -71,6 +71,189 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface $this->translator = $translator; } + // get job order rows + public function getRows(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(); + + $row['meta'] = []; + + $rows[] = $row; + } + + $params['meta'] = $meta; + $params['rows'] = $rows; + $params['tier_params'] = $tier_params; + + return $params; + + } + + // get job orders + public function getJobOrders(Request $req) + { + // get search term + $term = $req->query->get('search'); + + // get querybuilder + $qb = $this->em->getRepository(JobOrder::class) + ->createQueryBuilder('q'); + + // build expression now since we're reusing it + $jo_label = $qb->expr()->concat($qb->expr()->literal('#'), 'q.id', $qb->expr()->literal(' - '), 'c.first_name', $qb->expr()->literal(' '), 'c.last_name', $qb->expr()->literal(' (Plate No: '), 'v.plate_number', $qb->expr()->literal(')')); + + // count total records + $tquery = $qb->select('COUNT(q)') + ->join('q.customer', 'c') + ->join('q.cus_vehicle', 'v'); + + // add filters to count query + if (!empty($term)) { + $tquery->where($jo_label . ' LIKE :filter') + ->setParameter('filter', '%' . $term . '%'); + } + + $total = $tquery->getQuery() + ->getSingleScalarResult(); + + // pagination vars + $page = $req->query->get('page') ?? 1; + $perpage = 20; + $offset = ($page - 1) * $perpage; + $pages = ceil($total / $perpage); + $has_more_pages = $page < $pages ? true : false; + + // build main query + $query = $qb->select('q') + ->addSelect($jo_label . ' as jo_label') + ->addSelect('c.first_name as cust_first_name') + ->addSelect('c.last_name as cust_last_name') + ->addSelect('v.plate_number as vehicle_plate_number'); + + // add filters if needed + if (!empty($term)) { + $query->where($jo_label . ' LIKE :filter') + ->setParameter('filter', '%' . $term . '%'); + } + + // get rows + $obj_rows = $query->orderBy('q.id', 'asc') + ->setFirstResult($offset) + ->setMaxResults($perpage) + ->getQuery() + ->getResult(); + + // build job order array + $job_orders = []; + + foreach ($obj_rows as $jo) { + $service_type = ServiceType::getName($jo[0]->getServiceType()); + + $job_orders[] = [ + 'id' => $jo[0]->getID(), + 'text' => $jo['jo_label'] . ' - ' . $service_type + ]; + } + + $params['job_orders'] = $job_orders; + $params['has_more_pages'] = $has_more_pages; + + return $params; + } + // creates/updates job order public function generateJobOrder(Request $req, $id) { @@ -1799,6 +1982,78 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface } } + protected function checkTier($tier) + { + // check specified tier + switch ($tier) { + case 'proc': + $tier_key = 'jo_proc'; + $tier_name = 'Dispatch'; + $rows_route = 'jo_proc_rows'; + $edit_route = 'jo_proc_form'; + $unlock_route = 'jo_proc_unlock'; + $jo_status = JOStatus::PENDING; + break; + case 'assign': + $tier_key = 'jo_assign'; + $tier_name = 'Assigning'; + $rows_route = 'jo_assign_rows'; + $edit_route = 'jo_assign_form'; + $unlock_route = 'jo_assign_unlock'; + $jo_status = JOStatus::RIDER_ASSIGN; + break; + case 'fulfill': + $tier_key = 'jo_fulfill'; + $tier_name = 'Fullfillment'; + $rows_route = 'jo_fulfill_rows'; + $edit_route = 'jo_fulfill_form'; + $unlock_route = ''; + $jo_status = [ + JOStatus::ASSIGNED, + JOStatus::IN_PROGRESS + ]; + break; + case 'open': + $tier_key = 'jo_open'; + $tier_name = 'Open'; + $rows_route = 'jo_open_rows'; + $edit_route = ''; + $unlock_route = ''; + $jo_status = [ + JOStatus::PENDING, + JOStatus::RIDER_ASSIGN, + JOStatus::ASSIGNED, + JOStatus::IN_PROGRESS, + JOStatus::IN_TRANSIT, + ]; + break; + case 'all': + $tier_key = 'jo_open'; + $tier_name = 'Open'; + $rows_route = 'jo_open_rows'; + $edit_route = 'jo_all_form'; + $unlock_route = ''; + $jo_status = ''; + break; + default: + throw new AccessDeniedHttpException('No access.'); + } + + // check acl + if (!($this->security->isGranted($tier_key . '.list'))) + throw new AccessDeniedHttpException('No access.'); + + // return params if allowed access + return [ + 'key' => $tier_key, + 'name' => $tier_name, + 'rows_route' => $rows_route, + 'edit_route' => $edit_route, + 'unlock_route' => $unlock_route, + 'jo_status' => $jo_status + ]; + } + protected function updateVehicleBattery(JobOrder $jo) { // check if new battery @@ -1851,6 +2106,56 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface ->setWarrantyExpiration($warr_date); } + // TODO: re-enable search, figure out how to group the orWhere filters into one, so can execute that plus the pending filter + // check if datatable filter is present and append to query + protected function setQueryFilters($datatable, &$query, $qb, $hubs, $tier, $status) + { + switch ($tier) + { + case 'fulfill': + $query->where('q.status IN (:statuses)') + ->andWhere('q.hub IN (:hubs)') + ->setParameter('statuses', $status, Connection::PARAM_STR_ARRAY) + ->setParameter('hubs', $hubs, Connection::PARAM_STR_ARRAY); + break; + case 'assign': + $query->where('q.status = :status') + ->andWhere('q.hub IN (:hubs)') + ->setParameter('status', $status) + ->setParameter('hubs', $hubs, Connection::PARAM_STR_ARRAY); + break; + case 'open': + if (isset($datatable['query']['data-rows-search'])) + { + $query->innerJoin('q.cus_vehicle', 'cv') + ->innerJoin('q.customer', 'c') + ->where('q.status IN (:statuses)') + ->andWhere('cv.plate_number like :filter or c.first_name like :filter or c.last_name like :filter or c.phone_mobile like :filter') + ->setParameter('statuses', $status, Connection::PARAM_STR_ARRAY) + ->setParameter('filter', $datatable['query']['data-rows-search'] . '%'); + } + else + { + $query->where('q.status IN (:statuses)') + ->setParameter('statuses', $status, Connection::PARAM_STR_ARRAY); + } + break; + case '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'] . '%'); + } + break; + default: + $query->where('q.status = :status') + ->setParameter('status', $status); + } + } // TODO: move this to InvoiceGenerator protected function processInvoice($jo, $promo_id, $invoice_items, &$error_array) diff --git a/src/Service/JobOrderHandler/ResqJobOrderHandler.php b/src/Service/JobOrderHandler/ResqJobOrderHandler.php index 3a045d27..2f0a10a2 100644 --- a/src/Service/JobOrderHandler/ResqJobOrderHandler.php +++ b/src/Service/JobOrderHandler/ResqJobOrderHandler.php @@ -71,6 +71,189 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface $this->translator = $translator; } + // get job order rows + public function getRows(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(); + + $row['meta'] = []; + + $rows[] = $row; + } + + $params['meta'] = $meta; + $params['rows'] = $rows; + $params['tier_params'] = $tier_params; + + return $params; + + } + + // get job orders + public function getJobOrders(Request $req) + { + // get search term + $term = $req->query->get('search'); + + // get querybuilder + $qb = $this->em->getRepository(JobOrder::class) + ->createQueryBuilder('q'); + + // build expression now since we're reusing it + $jo_label = $qb->expr()->concat($qb->expr()->literal('#'), 'q.id', $qb->expr()->literal(' - '), 'c.first_name', $qb->expr()->literal(' '), 'c.last_name', $qb->expr()->literal(' (Plate No: '), 'v.plate_number', $qb->expr()->literal(')')); + + // count total records + $tquery = $qb->select('COUNT(q)') + ->join('q.customer', 'c') + ->join('q.cus_vehicle', 'v'); + + // add filters to count query + if (!empty($term)) { + $tquery->where($jo_label . ' LIKE :filter') + ->setParameter('filter', '%' . $term . '%'); + } + + $total = $tquery->getQuery() + ->getSingleScalarResult(); + + // pagination vars + $page = $req->query->get('page') ?? 1; + $perpage = 20; + $offset = ($page - 1) * $perpage; + $pages = ceil($total / $perpage); + $has_more_pages = $page < $pages ? true : false; + + // build main query + $query = $qb->select('q') + ->addSelect($jo_label . ' as jo_label') + ->addSelect('c.first_name as cust_first_name') + ->addSelect('c.last_name as cust_last_name') + ->addSelect('v.plate_number as vehicle_plate_number'); + + // add filters if needed + if (!empty($term)) { + $query->where($jo_label . ' LIKE :filter') + ->setParameter('filter', '%' . $term . '%'); + } + + // get rows + $obj_rows = $query->orderBy('q.id', 'asc') + ->setFirstResult($offset) + ->setMaxResults($perpage) + ->getQuery() + ->getResult(); + + // build job order array + $job_orders = []; + + foreach ($obj_rows as $jo) { + $service_type = ServiceType::getName($jo[0]->getServiceType()); + + $job_orders[] = [ + 'id' => $jo[0]->getID(), + 'text' => $jo['jo_label'] . ' - ' . $service_type + ]; + } + + $params['job_orders'] = $job_orders; + $params['has_more_pages'] = $has_more_pages; + + return $params; + } + // creates/updates job order public function generateJobOrder(Request $req, $id) { @@ -1799,6 +1982,78 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface } } + protected function checkTier($tier) + { + // check specified tier + switch ($tier) { + case 'proc': + $tier_key = 'jo_proc'; + $tier_name = 'Dispatch'; + $rows_route = 'jo_proc_rows'; + $edit_route = 'jo_proc_form'; + $unlock_route = 'jo_proc_unlock'; + $jo_status = JOStatus::PENDING; + break; + case 'assign': + $tier_key = 'jo_assign'; + $tier_name = 'Assigning'; + $rows_route = 'jo_assign_rows'; + $edit_route = 'jo_assign_form'; + $unlock_route = 'jo_assign_unlock'; + $jo_status = JOStatus::RIDER_ASSIGN; + break; + case 'fulfill': + $tier_key = 'jo_fulfill'; + $tier_name = 'Fullfillment'; + $rows_route = 'jo_fulfill_rows'; + $edit_route = 'jo_fulfill_form'; + $unlock_route = ''; + $jo_status = [ + JOStatus::ASSIGNED, + JOStatus::IN_PROGRESS + ]; + break; + case 'open': + $tier_key = 'jo_open'; + $tier_name = 'Open'; + $rows_route = 'jo_open_rows'; + $edit_route = ''; + $unlock_route = ''; + $jo_status = [ + JOStatus::PENDING, + JOStatus::RIDER_ASSIGN, + JOStatus::ASSIGNED, + JOStatus::IN_PROGRESS, + JOStatus::IN_TRANSIT, + ]; + break; + case 'all': + $tier_key = 'jo_open'; + $tier_name = 'Open'; + $rows_route = 'jo_open_rows'; + $edit_route = 'jo_all_form'; + $unlock_route = ''; + $jo_status = ''; + break; + default: + throw new AccessDeniedHttpException('No access.'); + } + + // check acl + if (!($this->security->isGranted($tier_key . '.list'))) + throw new AccessDeniedHttpException('No access.'); + + // return params if allowed access + return [ + 'key' => $tier_key, + 'name' => $tier_name, + 'rows_route' => $rows_route, + 'edit_route' => $edit_route, + 'unlock_route' => $unlock_route, + 'jo_status' => $jo_status + ]; + } + protected function updateVehicleBattery(JobOrder $jo) { // check if new battery @@ -1851,6 +2106,56 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface ->setWarrantyExpiration($warr_date); } + // TODO: re-enable search, figure out how to group the orWhere filters into one, so can execute that plus the pending filter + // check if datatable filter is present and append to query + protected function setQueryFilters($datatable, &$query, $qb, $hubs, $tier, $status) + { + switch ($tier) + { + case 'fulfill': + $query->where('q.status IN (:statuses)') + ->andWhere('q.hub IN (:hubs)') + ->setParameter('statuses', $status, Connection::PARAM_STR_ARRAY) + ->setParameter('hubs', $hubs, Connection::PARAM_STR_ARRAY); + break; + case 'assign': + $query->where('q.status = :status') + ->andWhere('q.hub IN (:hubs)') + ->setParameter('status', $status) + ->setParameter('hubs', $hubs, Connection::PARAM_STR_ARRAY); + break; + case 'open': + if (isset($datatable['query']['data-rows-search'])) + { + $query->innerJoin('q.cus_vehicle', 'cv') + ->innerJoin('q.customer', 'c') + ->where('q.status IN (:statuses)') + ->andWhere('cv.plate_number like :filter or c.first_name like :filter or c.last_name like :filter or c.phone_mobile like :filter') + ->setParameter('statuses', $status, Connection::PARAM_STR_ARRAY) + ->setParameter('filter', $datatable['query']['data-rows-search'] . '%'); + } + else + { + $query->where('q.status IN (:statuses)') + ->setParameter('statuses', $status, Connection::PARAM_STR_ARRAY); + } + break; + case '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'] . '%'); + } + break; + default: + $query->where('q.status = :status') + ->setParameter('status', $status); + } + } // TODO: move this to InvoiceGenerator protected function processInvoice($jo, $promo_id, $invoice_items, &$error_array) diff --git a/src/Service/JobOrderHandlerInterface.php b/src/Service/JobOrderHandlerInterface.php index 272d5b20..707b27fd 100644 --- a/src/Service/JobOrderHandlerInterface.php +++ b/src/Service/JobOrderHandlerInterface.php @@ -10,6 +10,12 @@ use App\Service\MapTools; interface JobOrderHandlerInterface { + // get job order rows + public function getRows(Request $req, string $tier); + + // get job orders + public function getJobOrders(Request $req); + // generate job order public function generateJobOrder(Request $req, int $id);