diff --git a/src/Controller/CustomerController.php b/src/Controller/CustomerController.php
index 379dd146..37a2b391 100644
--- a/src/Controller/CustomerController.php
+++ b/src/Controller/CustomerController.php
@@ -45,99 +45,24 @@ class CustomerController extends Controller
return $this->render($template);
}
- public function rows(Request $req)
+ public function rows(Request $req, CustomerHandlerInterface $cust_handler)
{
$this->denyAccessUnlessGranted('customer.list', null, 'No access.');
- // build query
- $tqb = $this->getDoctrine()
- ->getRepository(Customer::class)
- ->createQueryBuilder('q');
-
- $qb = $this->getDoctrine()
- ->getRepository(Customer::class)
- ->createQueryBuilder('q');
-
- // get datatable params
- $datatable = $req->request->get('datatable');
-
- // count total records
- $tquery = $tqb->select('COUNT(q)');
-
- // add filters to count query
- $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');
-
- // add filters to query
- $this->setQueryFilters($datatable, $query);
-
- // 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.first_name', 'asc');
- }
-
- // get rows for this page
- $obj_rows = $query->setFirstResult($offset)
- ->setMaxResults($perpage)
- ->getQuery()
- ->getResult();
+ $params = $cust_handler->getCustomers($req);
+ $meta = $params['meta'];
+ $rows = $params['rows'];
// process rows
- $rows = [];
- foreach ($obj_rows as $orow) {
- // add row data
- $row['id'] = $orow->getID();
- $row['title'] = $orow->getTitle();
- $row['first_name'] = $orow->getFirstName();
- $row['last_name'] = $orow->getLastName();
- $row['customer_classification'] = CustomerClassification::getName($orow->getCustomerClassification());
- $row['flag_mobile_app'] = $orow->hasMobileApp();
- $row['app_mobile_number'] = $orow->hasMobileApp() && !empty($orow->getMobileSessions()) ? $orow->getMobileSessions()[0]->getPhoneNumber() : '';
- $row['flag_active'] = $orow->isActive();
- $row['flag_csat'] = $orow->isCSAT();
-
- // TODO: properly add mobile numbers and plate numbers as searchable/sortable fields, use doctrine events
- $row['mobile_numbers'] = implode("
", $orow->getMobileNumberList());
- $row['plate_numbers'] = implode("
", $orow->getPlateNumberList());
-
- // add row metadata
- $row['meta'] = [
- 'update_url' => '',
- 'delete_url' => ''
- ];
-
+ foreach ($rows as $key => $data) {
// add crud urls
- if ($this->isGranted('customer.update'))
- $row['meta']['update_url'] = $this->generateUrl('customer_update', ['id' => $row['id']]);
- if ($this->isGranted('customer.delete'))
- $row['meta']['delete_url'] = $this->generateUrl('customer_delete', ['id' => $row['id']]);
+ $cust_id = $rows[$key]['id'];
- $rows[] = $row;
+ if ($this->isGranted('customer.update'))
+ $rows[$key]['meta']['update_url'] = $this->generateUrl('customer_update', ['id' => $cust_id]);
+ if ($this->isGranted('customer.delete'))
+ $rows[$key]['meta']['delete_url'] = $this->generateUrl('customer_delete', ['id' => $cust_id]);
}
// response
@@ -440,16 +365,4 @@ class CustomerController extends Controller
'data' => $row
]);
}
-
- // check if datatable filter is present and append to query
- protected function setQueryFilters($datatable, &$query) {
- if (isset($datatable['query']['data-rows-search']) && !empty($datatable['query']['data-rows-search'])) {
- $query->join('q.vehicles', 'cv')
- ->where('q.first_name LIKE :filter')
- ->orWhere('q.last_name LIKE :filter')
- ->orWhere('q.customer_classification LIKE :filter')
- ->orWhere('cv.plate_number LIKE :filter')
- ->setParameter('filter', $datatable['query']['data-rows-search'] . '%');
- }
- }
}
diff --git a/src/Service/CustomerHandler/CMBCustomerHandler.php b/src/Service/CustomerHandler/CMBCustomerHandler.php
index a4bf5118..0d63cce8 100644
--- a/src/Service/CustomerHandler/CMBCustomerHandler.php
+++ b/src/Service/CustomerHandler/CMBCustomerHandler.php
@@ -46,6 +46,91 @@ class CMBCustomerHandler implements CustomerHandlerInterface
return $params;
}
+ // get customers
+ public function getCustomers(Request $req)
+ {
+ // build query
+ $tqb = $this->em->getRepository(Customer::class)
+ ->createQueryBuilder('q');
+
+ $qb = $this->em->getRepository(Customer::class)
+ ->createQueryBuilder('q');
+
+ // get datatable params
+ $datatable = $req->request->get('datatable');
+
+ // count total records
+ $tquery = $tqb->select('COUNT(q)');
+
+ // add filters to count query
+ $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');
+
+ // add filters to query
+ $this->setQueryFilters($datatable, $query);
+
+ // 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.first_name', 'asc');
+ }
+
+ // get rows for this page
+ $obj_rows = $query->setFirstResult($offset)
+ ->setMaxResults($perpage)
+ ->getQuery()
+ ->getResult();
+
+ // process rows
+ $rows = [];
+ foreach ($obj_rows as $orow) {
+ // add row data
+ $row['id'] = $orow->getID();
+ $row['title'] = $orow->getTitle();
+ $row['first_name'] = $orow->getFirstName();
+ $row['last_name'] = $orow->getLastName();
+ $row['customer_classification'] = CustomerClassification::getName($orow->getCustomerClassification());
+ $row['flag_mobile_app'] = $orow->hasMobileApp();
+ $row['app_mobile_number'] = $orow->hasMobileApp() && !empty($orow->getMobileSessions()) ? $orow->getMobileSessions()[0]->getPhoneNumber() : '';
+ $row['flag_active'] = $orow->isActive();
+ $row['flag_csat'] = $orow->isCSAT();
+
+ // TODO: properly add mobile numbers and plate numbers as searchable/sortable fields, use doctrine events
+ $row['mobile_numbers'] = implode("
", $orow->getMobileNumberList());
+ $row['plate_numbers'] = implode("
", $orow->getPlateNumberList());
+
+ $rows[] = $row;
+ }
+
+ $params['meta'] = $meta;
+ $params['rows'] = $rows;
+
+ return $params;
+ }
+
// initialize add customer form
public function initializeAddCustomerForm()
{
@@ -404,4 +489,16 @@ class CMBCustomerHandler implements CustomerHandlerInterface
}
}
}
+
+ // check if datatable filter is present and append to query
+ protected function setQueryFilters($datatable, &$query) {
+ if (isset($datatable['query']['data-rows-search']) && !empty($datatable['query']['data-rows-search'])) {
+ $query->join('q.vehicles', 'cv')
+ ->where('q.first_name LIKE :filter')
+ ->orWhere('q.last_name LIKE :filter')
+ ->orWhere('q.customer_classification LIKE :filter')
+ ->orWhere('cv.plate_number LIKE :filter')
+ ->setParameter('filter', $datatable['query']['data-rows-search'] . '%');
+ }
+ }
}
diff --git a/src/Service/CustomerHandler/ResqCustomerHandler.php b/src/Service/CustomerHandler/ResqCustomerHandler.php
index cb38b16b..9529c673 100644
--- a/src/Service/CustomerHandler/ResqCustomerHandler.php
+++ b/src/Service/CustomerHandler/ResqCustomerHandler.php
@@ -48,6 +48,92 @@ class ResqCustomerHandler implements CustomerHandlerInterface
return $params;
}
+ // get customers
+ public function getCustomers(Request $req)
+ {
+ // build query
+ $tqb = $this->em->getRepository(Customer::class)
+ ->createQueryBuilder('q');
+
+ $qb = $this->em->getRepository(Customer::class)
+ ->createQueryBuilder('q');
+
+ // get datatable params
+ $datatable = $req->request->get('datatable');
+
+ // count total records
+ $tquery = $tqb->select('COUNT(q)');
+
+ // add filters to count query
+ $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');
+
+ // add filters to query
+ $this->setQueryFilters($datatable, $query);
+
+ // 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.first_name', 'asc');
+ }
+
+ // get rows for this page
+ $obj_rows = $query->setFirstResult($offset)
+ ->setMaxResults($perpage)
+ ->getQuery()
+ ->getResult();
+
+
+ // process rows
+ $rows = [];
+ foreach ($obj_rows as $orow) {
+ // add row data
+ $row['id'] = $orow->getID();
+ $row['title'] = $orow->getTitle();
+ $row['first_name'] = $orow->getFirstName();
+ $row['last_name'] = $orow->getLastName();
+ $row['customer_classification'] = CustomerClassification::getName($orow->getCustomerClassification());
+ $row['flag_mobile_app'] = $orow->hasMobileApp();
+ $row['app_mobile_number'] = $orow->hasMobileApp() && !empty($orow->getMobileSessions()) ? $orow->getMobileSessions()[0]->getPhoneNumber() : '';
+ $row['flag_active'] = $orow->isActive();
+ $row['flag_csat'] = $orow->isCSAT();
+
+ // TODO: properly add mobile numbers and plate numbers as searchable/sortable fields, use doctrine events
+ $row['mobile_numbers'] = implode("
", $orow->getMobileNumberList());
+ $row['plate_numbers'] = implode("
", $orow->getPlateNumberList());
+
+ $rows[] = $row;
+ }
+
+ $params['meta'] = $meta;
+ $params['rows'] = $rows;
+
+ return $params;
+ }
+
// initialize add customer form
public function initializeAddCustomerForm()
{
@@ -408,4 +494,17 @@ class ResqCustomerHandler implements CustomerHandlerInterface
}
}
}
+
+ // check if datatable filter is present and append to query
+ protected function setQueryFilters($datatable, &$query) {
+ if (isset($datatable['query']['data-rows-search']) && !empty($datatable['query']['data-rows-search'])) {
+ $query->join('q.vehicles', 'cv')
+ ->where('q.first_name LIKE :filter')
+ ->orWhere('q.last_name LIKE :filter')
+ ->orWhere('q.customer_classification LIKE :filter')
+ ->orWhere('cv.plate_number LIKE :filter')
+ ->setParameter('filter', $datatable['query']['data-rows-search'] . '%');
+ }
+ }
+
}
diff --git a/src/Service/CustomerHandlerInterface.php b/src/Service/CustomerHandlerInterface.php
index 7c2448ff..eac3f2d8 100644
--- a/src/Service/CustomerHandlerInterface.php
+++ b/src/Service/CustomerHandlerInterface.php
@@ -9,6 +9,9 @@ interface CustomerHandlerInterface
// initialize form to display customer list
public function initializeCustomerIndexForm();
+ // get customers
+ public function getCustomers(Request $req);
+
// initialize add customer form
public function initializeAddCustomerForm();