diff --git a/config/packages/catalyst_auth.yaml b/config/packages/catalyst_auth.yaml index f4e5461a..dfaf31e0 100644 --- a/config/packages/catalyst_auth.yaml +++ b/config/packages/catalyst_auth.yaml @@ -277,6 +277,8 @@ catalyst_auth: label: Fulfill Cancelled JO - id: jo_resq_proc.list label: RESQ Dispatch + - id: jo_resq_all.list + label: RESQ All - id: support label: Customer Support Access diff --git a/config/packages/catalyst_menu.yaml b/config/packages/catalyst_menu.yaml index 98bce994..deb8c43f 100644 --- a/config/packages/catalyst_menu.yaml +++ b/config/packages/catalyst_menu.yaml @@ -168,6 +168,10 @@ catalyst_menu: acl: jo_hub.list label: '[menu.joborder.hubview]' parent: joborder + - id: jo_resq_all + acl: jo_resq_all.list + label: '[menu.joborder.resqall]' + parent: joborder - id: support acl: support.menu diff --git a/config/routes/resq_job_order.yaml b/config/routes/resq_job_order.yaml index 5c506621..0d1ea9ba 100644 --- a/config/routes/resq_job_order.yaml +++ b/config/routes/resq_job_order.yaml @@ -7,3 +7,17 @@ jo_resq_proc_rows: path: /resq-job-order/processing-rows controller: App\Controller\ResqJobOrderController::datatableRows methods: [POST] + defaults: + tier: "proc" + +jo_resq_all: + path: /resq-job-order/all + controller: App\Controller\ResqJobOrderController::listAll + methods: [GET] + +jo_resq_all_rows: + path: /resq-job-orer/all + controller: App\Controller\ResqJobOrderController::datatableRows + methods: [POST] + defaults: + tier: "all" diff --git a/src/Controller/ResqJobOrderController.php b/src/Controller/ResqJobOrderController.php index 8295077d..2462706a 100644 --- a/src/Controller/ResqJobOrderController.php +++ b/src/Controller/ResqJobOrderController.php @@ -14,6 +14,7 @@ use Doctrine\ORM\EntityManagerInterface; use Catalyst\MenuBundle\Annotation\Menu; use App\Entity\JobOrder; +use App\Entity\Rider; use App\Service\JobOrderHandlerInterface; @@ -23,6 +24,8 @@ use App\Ramcar\ServiceType; use App\Ramcar\WillingToWaitContent; use App\Ramcar\CustomerClassification; +use DateTime; + class ResqJobOrderController extends Controller { /** @@ -39,7 +42,7 @@ class ResqJobOrderController extends Controller /** * @IsGranted("jo_resq_proc.list") */ - public function datatableRows(Request $req, JobOrderHandlerInterface $jo_handler) + public function datatableRows(EntityManagerInterface $em, Request $req, $tier, JobOrderHandlerInterface $jo_handler) { // get query builder $qb = $this->getDoctrine() @@ -52,7 +55,14 @@ class ResqJobOrderController extends Controller // count total records $tquery = $qb->select('COUNT(q)'); - $this->setQueryFilters($datatable, $tquery, $qb, JOStatus::PENDING, TransactionOrigin::MOBILE_APP); + // right now, tier is either proc or all + if ($tier == 'proc') + $this->setQueryFilters($datatable, $tquery, $qb, $tier); + else + { + // default to all + $this->setQueryFilters($datatable, $tquery, $qb, $tier); + } $total = $tquery->getQuery() ->getSingleScalarResult(); @@ -74,9 +84,17 @@ class ResqJobOrderController extends Controller ]; // build query + $qb = $em->getRepository(JobOrder::class) + ->createQueryBuilder('q'); $query = $qb->select('q'); - $this->setQueryFilters($datatable, $query, $qb, JOStatus::PENDING, TransactionOrigin::MOBILE_APP); + if ($tier == 'proc') + $this->setQueryFilters($datatable, $query, $qb, $tier); + else + { + // default to all + $this->setQueryFilters($datatable, $query, $qb, $tier); + } // check if sorting is present, otherwise use default if (isset($datatable['sort']['field']) && !empty($datatable['sort']['field'])) { @@ -110,7 +128,13 @@ class ResqJobOrderController extends Controller // check if customer is not willing to wait $will_not_wait = $orow->getWillWait(); if ($will_not_wait == WillingToWaitContent::NOT_WILLING_TO_WAIT) - $is_emergency = true; + { + // check if reason is emergency or rush + $reason = $orow->getReasonNotWait(); + if (($reason == CustomerNotWaitReason::EMERGENCY) || + ($reason == CustomerNotWaitReason::RUSH_REQUEST)) + $is_emergency = true; + } // add row data $row['id'] = $orow->getID(); @@ -125,6 +149,9 @@ class ResqJobOrderController extends Controller $row['is_mobile'] = $orow->getSource() == TransactionOrigin::MOBILE_APP; $row['is_vip'] = $is_vip; $row['is_emergency'] = $is_emergency; + $row['flag_cust_new'] = $orow->isCustNew(); + $row['date_assign'] = !empty($orow->getDateAssign()) ? $orow->getDateAssign()->format("c") : null; + $row['date_fulfill'] = !empty($orow->getDateFulfill()) ? $orow->getDateFulfill()->format("c") : null; $processor = $orow->getProcessedBy(); if ($processor == null) @@ -132,11 +159,28 @@ class ResqJobOrderController extends Controller else $row['processor'] = $orow->getProcessedBy()->getFullName(); + // get the assigned hub, if any + $assigned_hub = $orow->getHub(); + if ($assigned_hub == null) + $row['assigned_hub'] = ''; + else + $row['assigned_hub'] = $orow->getHub()->getName(); + // add the items for Actions $jo_id = $orow->getID(); - $row['meta']['update_url'] = $this->generateUrl('jo_proc_form', ['id' => $jo_id, 'origin' => 'resq']); - $row['meta']['unlock_url'] = $this->generateUrl('jo_proc_unlock', ['id' => $jo_id, 'origin' => 'resq']); + if ($tier == 'proc') + { + $row['meta']['update_url'] = $this->generateUrl('jo_proc_form', ['id' => $jo_id, 'origin' => 'resq']); + $row['meta']['unlock_url'] = $this->generateUrl('jo_proc_unlock', ['id' => $jo_id, 'origin' => 'resq']); + } + else + { + // default to all + $row['meta']['update_url'] = $this->generateUrl('jo_all_form', ['id' => $jo_id, 'origin' => 'resq']); + $row['meta']['pdf_url'] = $this->generateUrl('jo_pdf_form', ['id' => $jo_id, 'origin' => 'resq']); + $row['meta']['view_url'] = $this->generateUrl('jo_all_view_form',['id' => $jo_id, 'origin' => 'resq']); + } $rows[] = $row; } @@ -148,11 +192,77 @@ class ResqJobOrderController extends Controller ]); } - protected function setQueryFilters($datatable, &$query, $qb, $status, $source) + /** + * @Menu(selected="jo_resq_all") + * @IsGranted("jo_resq_all.list") + */ + public function listAll(EntityManagerInterface $em) { - $query->where('q.status = :status') - ->andWhere('q.source = :source') - ->setParameter('status', $status) - ->setParameter('source', $source); + $params['table_refresh_rate'] = $this->container->getParameter('job_order_refresh_interval'); + + // get riders for dropdown + $params['riders'] = $em->getRepository(Rider::class)->findAll(); + + return $this->render('resq-job-order/list.all.html.twig', $params); + } + + protected function setQueryFilters($datatable, &$query, $qb, $tier) + { + switch ($tier) + { + case 'proc': + $query->where('q.status = :status') + ->andWhere('q.source = :source') + ->setParameter('status', JOStatus::PENDING) + ->setParameter('source', TransactionOrigin::MOBILE_APP); + + if (isset($datatable['query']['data-rows-search'])) + { + $query->andWhere('q.plate_number like :filter') + ->orWhere('q.phone_mobile like :filter') + ->orWhere('q.first_name like :filter') + ->orWhere('q.last_name like :filter') + ->setParameter('filter', $datatable['query']['data-rows-search'] . '%'); + } + + break; + case 'all': + if (isset($datatable['query']['data-rows-search'])) + { + $query->andWhere('q.plate_number like :filter') + ->orWhere('q.phone_mobile like :filter') + ->orWhere('q.first_name like :filter') + ->orWhere('q.last_name like :filter') + ->setParameter('filter', $datatable['query']['data-rows-search'] . '%'); + } + if (isset($datatable['query']['rider'])) + { + $query->innerJoin('q.rider', 'r') + ->andWhere('r.id = :rider_id') + ->setParameter('rider_id', $datatable['query']['rider']); + } + if (isset($datatable['query']['schedule_date'])) + { + $start = $datatable['query']['schedule_date'][0] . ' ' . '00:00:00'; + $end = $datatable['query']['schedule_date'][1] . ' ' . '23:59:00'; + + $date_start = DateTime::createFromFormat('m/d/Y H:i:s', $start); + $date_end = DateTime::createFromFormat('m/d/Y H:i:s', $end); + + $query->andWhere('q.date_schedule >= :date_start') + ->andWhere('q.date_schedule <= :date_end') + ->setParameter('date_start', $date_start) + ->setParameter('date_end', $date_end); + } + + $query->andWhere('q.source = :source') + ->setParameter('source', TransactionOrigin::MOBILE_APP); + + break; + default: + $query->where('q.source = :source') + ->setParameter('source', TransactionOrigin::MOBILE_APP); + break; + } } } diff --git a/templates/resq-job-order/list.all.html.twig b/templates/resq-job-order/list.all.html.twig new file mode 100644 index 00000000..d33752f1 --- /dev/null +++ b/templates/resq-job-order/list.all.html.twig @@ -0,0 +1,287 @@ +{% extends 'base.html.twig' %} + +{% block body %} + +