diff --git a/src/Controller/JobOrderController.php b/src/Controller/JobOrderController.php index f93ccf49..0fea75ae 100644 --- a/src/Controller/JobOrderController.php +++ b/src/Controller/JobOrderController.php @@ -42,7 +42,7 @@ class JobOrderController extends BaseController $params['statuses'] = JOStatus::getCollection(); // response - return $this->render('job-order/incoming.html.twig', $params); + return $this->render('job-order/form.html.twig', $params); } public function incomingSubmit(Request $req) @@ -127,5 +127,125 @@ class JobOrderController extends BaseController public function processingList() { $this->denyAccessUnlessGranted('jo_proc.list', null, 'No access.'); + + $params = $this->initParameters('jo_proc'); + + // response + return $this->render('job-order/list.html.twig', $params); + } + + public function processingRows() + { + $this->denyAccessUnlessGranted('jo_proc.list', null, 'No access.'); + + // 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)') + ->join('q.customer_vehicle', 'cv') + ->join('q.customer', 'c'); + + $this->setQueryFilters($datatable, $tquery); + + $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 + $query = $qb->select('q') + ->addSelect('cv.plate_number as plate_number') + ->addSelect('c.first_name as cust_first_name') + ->addSelect('c.last_name as cust_last_name'); + + $this->setQueryFilters($datatable, $query); + + // check if sorting is present, otherwise use default + if (isset($datatable['sort']['field']) && !empty($datatable['sort']['field'])) { + $prefix = ''; + + if (!in_array($datatable['sort']['field'], ['plate_number', 'cust_first_name', 'cust_last_name'])) + $prefix = 'q.'; + + $order = $datatable['sort']['sort'] ?? 'asc'; + $query->orderBy($prefix . $datatable['sort']['field'], $order); + } else { + $query->orderBy('q.date_schedule', 'asc'); + } + + // get rows for this page + $obj_rows = $query->setFirstResult($offset) + ->setMaxResults($perpage) + ->getQuery() + ->getResult(); + + // get service type name + $service_type = false; + $service_types = ServiceType::getCollection(); + foreach ($service_types as $key => $service) { + if ($key == $orow->getServiceType()) { + $service_type = $service; + break; + } + } + + // process rows + $rows = []; + foreach ($obj_rows as $orow) { + // add row data + $row['id'] = $orow[0]->getID(); + $row['date_schedule_date'] = $orow[0]->getDeliveryDate()->format("d M Y"); + $row['date_schedule_time'] = $orow[0]->getDeliveryDate()->format("h:i A"); + $row['service_type'] = $service_type; + $row['plate_number'] = $orow['plate_number']; + $row['customer_name'] = $orow['cust_first_name'] . " " . $orow['cust_last_name']; + $row['mobile_numbers'] = $orow[0]->getCustomer()->getMobileNumberList(); + $row['source'] = ucfirst($orow[0]->getSource()); + + // add crud urls + $row['meta']['update_url'] = $this->generateUrl('jo_proc_form', ['id' => $row['id']]); + + $rows[] = $row; + } + + // response + return $this->json([ + 'meta' => $meta, + 'data' => $rows + ]); + } + + // check if datatable filter is present and append to query + protected function setQueryFilters($datatable, &$query) { + // get only pending rows + $query->where('q.status', 'pending'); + + // apply filters + if (isset($datatable['query']['data-rows-search']) && !empty($datatable['query']['data-rows-search'])) { + $query->where('q.delivery_address LIKE :filter') + ->orWhere($qb->expr()->concat('c.first_name', $qb->expr()->literal(' '), 'c.last_name') . 'LIKE :filter') + ->orWhere('cv.plate_number LIKE :filter') + ->setParameter('filter', '%' . $datatable['query']['data-rows-search'] . '%'); + } } } diff --git a/templates/job-order/incoming.html.twig b/templates/job-order/form.html.twig similarity index 100% rename from templates/job-order/incoming.html.twig rename to templates/job-order/form.html.twig