diff --git a/config/routes/job_order.yaml b/config/routes/job_order.yaml
index 473c8353..b9e44c16 100644
--- a/config/routes/job_order.yaml
+++ b/config/routes/job_order.yaml
@@ -18,6 +18,11 @@ jo_in_submit:
controller: App\Controller\JobOrderController::incomingSubmit
methods: [POST]
+jo_proc_form:
+ path: /job-order/processing/{id}
+ controller: App\Controller\JobOrderController::processingForm
+ methods: [GET]
+
jo_proc_submit:
path: /job-order/processing
controller: App\Controller\JobOrderController::processingSubmit
diff --git a/src/Controller/JobOrderController.php b/src/Controller/JobOrderController.php
index f93ccf49..17d438f7 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,135 @@ 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(Request $req)
+ {
+ $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.cus_vehicle', 'cv')
+ ->join('q.customer', 'c');
+
+ $this->setQueryFilters($datatable, $tquery, $qb);
+
+ $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 customer_name')
+ ->addSelect('c.last_name as cust_last_name');
+
+ $this->setQueryFilters($datatable, $query, $qb);
+
+ // 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', 'customer_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();
+
+ // process rows
+ $rows = [];
+ foreach ($obj_rows as $orow) {
+ // get service type name
+ $service_type = false;
+ $service_types = ServiceType::getCollection();
+ foreach ($service_types as $key => $service) {
+ if ($key == $orow[0]->getServiceType()) {
+ $service_type = $service;
+ break;
+ }
+ }
+
+ // add row data
+ $row['id'] = $orow[0]->getID();
+ $row['date_schedule'] = $orow[0]->getDateSchedule()->format("d M Y");
+ $row['date_schedule_time'] = $orow[0]->getDateSchedule()->format("h:i A");
+ $row['service_type'] = $service_type;
+ $row['plate_number'] = $orow['plate_number'];
+ $row['customer_name'] = $orow['customer_name'] . " " . $orow['cust_last_name'];
+ $row['mobile_numbers'] = implode("
", $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
+ ]);
+ }
+
+ // 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) {
+ $query->where('q.status = :status')
+ ->setParameter('status', 'pending');
+
+ // get only pending rows
+ /*
+ $query->where($qb->expr()->orX(
+ $qb->expr()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
diff --git a/templates/job-order/list.html.twig b/templates/job-order/list.html.twig
new file mode 100644
index 00000000..ae9209ab
--- /dev/null
+++ b/templates/job-order/list.html.twig
@@ -0,0 +1,123 @@
+{% extends 'base.html.twig' %}
+
+{% block body %}
+
+