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();