Move retrieval of job order rows to the job service. #270
This commit is contained in:
parent
2f555483be
commit
7989f6b6d6
4 changed files with 638 additions and 172 deletions
|
|
@ -35,12 +35,10 @@ use App\Service\APNSClient;
|
|||
|
||||
use Doctrine\ORM\Query;
|
||||
use Doctrine\DBAL\Connection;
|
||||
use Doctrine\DBAL\LockMode;
|
||||
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
|
||||
use Symfony\Contracts\Translation\TranslatorInterface;
|
||||
|
||||
use Catalyst\MenuBundle\Annotation\Menu;
|
||||
|
||||
|
|
@ -48,77 +46,16 @@ use Mosquitto\Client as MosquittoClient;
|
|||
use DateTime;
|
||||
use DateInterval;
|
||||
|
||||
use FPDF;
|
||||
|
||||
class JobOrderController extends Controller
|
||||
{
|
||||
public function getJobOrders(Request $req)
|
||||
public function getJobOrders(Request $req, JobOrderHandlerInterface $jo_handler)
|
||||
{
|
||||
$this->denyAccessUnlessGranted('jo_in.list', null, 'No access.');
|
||||
|
||||
// get search term
|
||||
$term = $req->query->get('search');
|
||||
$params = $jo_handler->getJobOrders($req);
|
||||
|
||||
// get querybuilder
|
||||
$qb = $this->getDoctrine()
|
||||
->getRepository(JobOrder::class)
|
||||
->createQueryBuilder('q');
|
||||
|
||||
// build expression now since we're reusing it
|
||||
$jo_label = $qb->expr()->concat($qb->expr()->literal('#'), 'q.id', $qb->expr()->literal(' - '), 'c.first_name', $qb->expr()->literal(' '), 'c.last_name', $qb->expr()->literal(' (Plate No: '), 'v.plate_number', $qb->expr()->literal(')'));
|
||||
|
||||
// count total records
|
||||
$tquery = $qb->select('COUNT(q)')
|
||||
->join('q.customer', 'c')
|
||||
->join('q.cus_vehicle', 'v');
|
||||
|
||||
// add filters to count query
|
||||
if (!empty($term)) {
|
||||
$tquery->where($jo_label . ' LIKE :filter')
|
||||
->setParameter('filter', '%' . $term . '%');
|
||||
}
|
||||
|
||||
$total = $tquery->getQuery()
|
||||
->getSingleScalarResult();
|
||||
|
||||
// pagination vars
|
||||
$page = $req->query->get('page') ?? 1;
|
||||
$perpage = 20;
|
||||
$offset = ($page - 1) * $perpage;
|
||||
$pages = ceil($total / $perpage);
|
||||
$has_more_pages = $page < $pages ? true : false;
|
||||
|
||||
// build main query
|
||||
$query = $qb->select('q')
|
||||
->addSelect($jo_label . ' as jo_label')
|
||||
->addSelect('c.first_name as cust_first_name')
|
||||
->addSelect('c.last_name as cust_last_name')
|
||||
->addSelect('v.plate_number as vehicle_plate_number');
|
||||
|
||||
// add filters if needed
|
||||
if (!empty($term)) {
|
||||
$query->where($jo_label . ' LIKE :filter')
|
||||
->setParameter('filter', '%' . $term . '%');
|
||||
}
|
||||
|
||||
// get rows
|
||||
$obj_rows = $query->orderBy('q.id', 'asc')
|
||||
->setFirstResult($offset)
|
||||
->setMaxResults($perpage)
|
||||
->getQuery()
|
||||
->getResult();
|
||||
|
||||
// build job order array
|
||||
$job_orders = [];
|
||||
|
||||
foreach ($obj_rows as $jo) {
|
||||
$service_type = ServiceType::getName($jo[0]->getServiceType());
|
||||
|
||||
$job_orders[] = [
|
||||
'id' => $jo[0]->getID(),
|
||||
'text' => $jo['jo_label'] . ' - ' . $service_type
|
||||
];
|
||||
}
|
||||
$job_orders = $params['job_orders'];
|
||||
$has_more_pages = $params['has_more_pages'];
|
||||
|
||||
// response
|
||||
return $this->json([
|
||||
|
|
@ -381,131 +318,44 @@ class JobOrderController extends Controller
|
|||
}
|
||||
*/
|
||||
|
||||
public function getRows(Request $req, $tier)
|
||||
public function getRows(Request $req, $tier, JobOrderHandlerInterface $jo_handler)
|
||||
{
|
||||
// check which job order tier is being called for and confirm access
|
||||
$tier_params = $this->checkTier($tier);
|
||||
|
||||
// get current user
|
||||
$user = $this->getUser();
|
||||
$hubs = $user->getHubs();
|
||||
|
||||
// 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)');
|
||||
|
||||
$this->setQueryFilters($datatable, $tquery, $qb, $hubs, $tier, $tier_params['jo_status']);
|
||||
|
||||
$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
|
||||
$qb = $this->getDoctrine()
|
||||
->getRepository(JobOrder::class)
|
||||
->createQueryBuilder('q');
|
||||
$query = $qb->select('q');
|
||||
|
||||
$this->setQueryFilters($datatable, $query, $qb, $hubs, $tier, $tier_params['jo_status']);
|
||||
|
||||
// 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.date_schedule', 'asc');
|
||||
try
|
||||
{
|
||||
$params = $jo_handler->getRows($req, $tier);
|
||||
}
|
||||
catch (AccessDeniedHttpException $e)
|
||||
{
|
||||
throw $this->createAccessDeniedException($e->getMessage());
|
||||
}
|
||||
|
||||
// get rows for this page
|
||||
$query_obj = $query->setFirstResult($offset)
|
||||
->setMaxResults($perpage)
|
||||
->getQuery();
|
||||
$obj_rows = $params['rows'];
|
||||
$meta = $params['meta'];
|
||||
$tier_params = $params['tier_params'];
|
||||
|
||||
// error_log($query_obj->getSQL());
|
||||
|
||||
$obj_rows = $query_obj->getResult();
|
||||
/*
|
||||
$obj_rows = $query->setFirstResult($offset)
|
||||
->setMaxResults($perpage)
|
||||
->getQuery()
|
||||
->getResult();
|
||||
*/
|
||||
|
||||
$statuses = JOStatus::getCollection();
|
||||
$service_types = ServiceType::getCollection();
|
||||
|
||||
// process rows
|
||||
$rows = [];
|
||||
foreach ($obj_rows as $orow) {
|
||||
// add row data
|
||||
$row['id'] = $orow->getID();
|
||||
$row['customer_name'] = $orow->getCustomer()->getFirstName() . ' ' . $orow->getCustomer()->getLastName();
|
||||
$row['delivery_address'] = $orow->getDeliveryAddress();
|
||||
$row['date_schedule'] = $orow->getDateSchedule()->format("d M Y g:i A");
|
||||
$row['type'] = $orow->isAdvanceOrder() ? 'Advanced Order' : 'Immediate';
|
||||
$row['service_type'] = $service_types[$orow->getServiceType()];
|
||||
$row['status'] = $statuses[$orow->getStatus()];
|
||||
$row['flag_advance'] = $orow->isAdvanceOrder();
|
||||
$row['plate_number'] = $orow->getCustomerVehicle()->getPlateNumber();
|
||||
$row['is_mobile'] = $orow->getSource() == TransactionOrigin::MOBILE_APP;
|
||||
|
||||
$processor = $orow->getProcessedBy();
|
||||
if ($processor == null)
|
||||
$row['processor'] = '';
|
||||
else
|
||||
$row['processor'] = $orow->getProcessedBy()->getFullName();
|
||||
|
||||
$assignor = $orow->getAssignedBy();
|
||||
if ($assignor == null)
|
||||
$row['assignor'] = '';
|
||||
else
|
||||
$row['assignor'] = $orow->getAssignedBy()->getFullName();
|
||||
|
||||
// add crud urls
|
||||
if ($tier == 'open')
|
||||
{
|
||||
$row['meta']['reassign_hub_url'] = $this->generateUrl('jo_open_hub_form', ['id' => $row['id']]);
|
||||
$row['meta']['reassign_rider_url'] = $this->generateUrl('jo_open_rider_form', ['id' => $row['id']]);
|
||||
$row['meta']['edit_url'] = $this->generateUrl('jo_open_edit_form', ['id' => $row['id']]);
|
||||
$orow['meta']['reassign_hub_url'] = $this->generateUrl('jo_open_hub_form', ['id' => $orow['id']]);
|
||||
$orow['meta']['reassign_rider_url'] = $this->generateUrl('jo_open_rider_form', ['id' => $orow['id']]);
|
||||
$orow['meta']['edit_url'] = $this->generateUrl('jo_open_edit_form', ['id' => $orow['id']]);
|
||||
}
|
||||
else
|
||||
{
|
||||
$row['meta']['update_url'] = $this->generateUrl($tier_params['edit_route'], ['id' => $row['id']]);
|
||||
$row['meta']['pdf_url'] = $this->generateUrl('jo_pdf_form', ['id' => $row['id']]);
|
||||
$orow['meta']['update_url'] = $this->generateUrl($tier_params['edit_route'], ['id' => $orow['id']]);
|
||||
$orow['meta']['pdf_url'] = $this->generateUrl('jo_pdf_form', ['id' => $orow['id']]);
|
||||
}
|
||||
|
||||
if ($tier_params['unlock_route'] != '')
|
||||
$row['meta']['unlock_url'] = $this->generateUrl($tier_params['unlock_route'], ['id' => $row['id']]);
|
||||
$orow['meta']['unlock_url'] = $this->generateUrl($tier_params['unlock_route'], ['id' => $orow['id']]);
|
||||
|
||||
$rows[] = $row;
|
||||
}
|
||||
|
||||
// response
|
||||
return $this->json([
|
||||
'meta' => $meta,
|
||||
'data' => $rows
|
||||
'data' => $obj_rows
|
||||
]);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -71,6 +71,189 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface
|
|||
$this->translator = $translator;
|
||||
}
|
||||
|
||||
// get job order rows
|
||||
public function getRows(Request $req, $tier)
|
||||
{
|
||||
// check which job order tier is being called for and confirm access
|
||||
$tier_params = $this->checkTier($tier);
|
||||
|
||||
// get current user
|
||||
$user = $this->security->getUser();
|
||||
if ($user == null)
|
||||
throw new AccessDeniedHttpException('No access.');
|
||||
|
||||
$hubs = $user->getHubs();
|
||||
|
||||
// get query builder
|
||||
$qb = $this->em->getRepository(JobOrder::class)
|
||||
->createQueryBuilder('q');
|
||||
|
||||
// get datatable params
|
||||
$datatable = $req->request->get('datatable');
|
||||
|
||||
// count total records
|
||||
$tquery = $qb->select('COUNT(q)');
|
||||
|
||||
$this->setQueryFilters($datatable, $tquery, $qb, $hubs, $tier, $tier_params['jo_status']);
|
||||
|
||||
$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
|
||||
$qb = $this->em->getRepository(JobOrder::class)
|
||||
->createQueryBuilder('q');
|
||||
$query = $qb->select('q');
|
||||
|
||||
$this->setQueryFilters($datatable, $query, $qb, $hubs, $tier, $tier_params['jo_status']);
|
||||
|
||||
// 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.date_schedule', 'asc');
|
||||
}
|
||||
|
||||
// get rows for this page
|
||||
$query_obj = $query->setFirstResult($offset)
|
||||
->setMaxResults($perpage)
|
||||
->getQuery();
|
||||
|
||||
// error_log($query_obj->getSQL());
|
||||
|
||||
$obj_rows = $query_obj->getResult();
|
||||
|
||||
$statuses = JOStatus::getCollection();
|
||||
$service_types = ServiceType::getCollection();
|
||||
|
||||
// process rows
|
||||
$rows = [];
|
||||
foreach ($obj_rows as $orow) {
|
||||
// add row data
|
||||
$row['id'] = $orow->getID();
|
||||
$row['customer_name'] = $orow->getCustomer()->getFirstName() . ' ' . $orow->getCustomer()->getLastName();
|
||||
$row['delivery_address'] = $orow->getDeliveryAddress();
|
||||
$row['date_schedule'] = $orow->getDateSchedule()->format("d M Y g:i A");
|
||||
$row['type'] = $orow->isAdvanceOrder() ? 'Advanced Order' : 'Immediate';
|
||||
$row['service_type'] = $service_types[$orow->getServiceType()];
|
||||
$row['status'] = $statuses[$orow->getStatus()];
|
||||
$row['flag_advance'] = $orow->isAdvanceOrder();
|
||||
$row['plate_number'] = $orow->getCustomerVehicle()->getPlateNumber();
|
||||
$row['is_mobile'] = $orow->getSource() == TransactionOrigin::MOBILE_APP;
|
||||
|
||||
$processor = $orow->getProcessedBy();
|
||||
if ($processor == null)
|
||||
$row['processor'] = '';
|
||||
else
|
||||
$row['processor'] = $orow->getProcessedBy()->getFullName();
|
||||
|
||||
$assignor = $orow->getAssignedBy();
|
||||
if ($assignor == null)
|
||||
$row['assignor'] = '';
|
||||
else
|
||||
$row['assignor'] = $orow->getAssignedBy()->getFullName();
|
||||
|
||||
$row['meta'] = [];
|
||||
|
||||
$rows[] = $row;
|
||||
}
|
||||
|
||||
$params['meta'] = $meta;
|
||||
$params['rows'] = $rows;
|
||||
$params['tier_params'] = $tier_params;
|
||||
|
||||
return $params;
|
||||
|
||||
}
|
||||
|
||||
// get job orders
|
||||
public function getJobOrders(Request $req)
|
||||
{
|
||||
// get search term
|
||||
$term = $req->query->get('search');
|
||||
|
||||
// get querybuilder
|
||||
$qb = $this->em->getRepository(JobOrder::class)
|
||||
->createQueryBuilder('q');
|
||||
|
||||
// build expression now since we're reusing it
|
||||
$jo_label = $qb->expr()->concat($qb->expr()->literal('#'), 'q.id', $qb->expr()->literal(' - '), 'c.first_name', $qb->expr()->literal(' '), 'c.last_name', $qb->expr()->literal(' (Plate No: '), 'v.plate_number', $qb->expr()->literal(')'));
|
||||
|
||||
// count total records
|
||||
$tquery = $qb->select('COUNT(q)')
|
||||
->join('q.customer', 'c')
|
||||
->join('q.cus_vehicle', 'v');
|
||||
|
||||
// add filters to count query
|
||||
if (!empty($term)) {
|
||||
$tquery->where($jo_label . ' LIKE :filter')
|
||||
->setParameter('filter', '%' . $term . '%');
|
||||
}
|
||||
|
||||
$total = $tquery->getQuery()
|
||||
->getSingleScalarResult();
|
||||
|
||||
// pagination vars
|
||||
$page = $req->query->get('page') ?? 1;
|
||||
$perpage = 20;
|
||||
$offset = ($page - 1) * $perpage;
|
||||
$pages = ceil($total / $perpage);
|
||||
$has_more_pages = $page < $pages ? true : false;
|
||||
|
||||
// build main query
|
||||
$query = $qb->select('q')
|
||||
->addSelect($jo_label . ' as jo_label')
|
||||
->addSelect('c.first_name as cust_first_name')
|
||||
->addSelect('c.last_name as cust_last_name')
|
||||
->addSelect('v.plate_number as vehicle_plate_number');
|
||||
|
||||
// add filters if needed
|
||||
if (!empty($term)) {
|
||||
$query->where($jo_label . ' LIKE :filter')
|
||||
->setParameter('filter', '%' . $term . '%');
|
||||
}
|
||||
|
||||
// get rows
|
||||
$obj_rows = $query->orderBy('q.id', 'asc')
|
||||
->setFirstResult($offset)
|
||||
->setMaxResults($perpage)
|
||||
->getQuery()
|
||||
->getResult();
|
||||
|
||||
// build job order array
|
||||
$job_orders = [];
|
||||
|
||||
foreach ($obj_rows as $jo) {
|
||||
$service_type = ServiceType::getName($jo[0]->getServiceType());
|
||||
|
||||
$job_orders[] = [
|
||||
'id' => $jo[0]->getID(),
|
||||
'text' => $jo['jo_label'] . ' - ' . $service_type
|
||||
];
|
||||
}
|
||||
|
||||
$params['job_orders'] = $job_orders;
|
||||
$params['has_more_pages'] = $has_more_pages;
|
||||
|
||||
return $params;
|
||||
}
|
||||
|
||||
// creates/updates job order
|
||||
public function generateJobOrder(Request $req, $id)
|
||||
{
|
||||
|
|
@ -1799,6 +1982,78 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface
|
|||
}
|
||||
}
|
||||
|
||||
protected function checkTier($tier)
|
||||
{
|
||||
// check specified tier
|
||||
switch ($tier) {
|
||||
case 'proc':
|
||||
$tier_key = 'jo_proc';
|
||||
$tier_name = 'Dispatch';
|
||||
$rows_route = 'jo_proc_rows';
|
||||
$edit_route = 'jo_proc_form';
|
||||
$unlock_route = 'jo_proc_unlock';
|
||||
$jo_status = JOStatus::PENDING;
|
||||
break;
|
||||
case 'assign':
|
||||
$tier_key = 'jo_assign';
|
||||
$tier_name = 'Assigning';
|
||||
$rows_route = 'jo_assign_rows';
|
||||
$edit_route = 'jo_assign_form';
|
||||
$unlock_route = 'jo_assign_unlock';
|
||||
$jo_status = JOStatus::RIDER_ASSIGN;
|
||||
break;
|
||||
case 'fulfill':
|
||||
$tier_key = 'jo_fulfill';
|
||||
$tier_name = 'Fullfillment';
|
||||
$rows_route = 'jo_fulfill_rows';
|
||||
$edit_route = 'jo_fulfill_form';
|
||||
$unlock_route = '';
|
||||
$jo_status = [
|
||||
JOStatus::ASSIGNED,
|
||||
JOStatus::IN_PROGRESS
|
||||
];
|
||||
break;
|
||||
case 'open':
|
||||
$tier_key = 'jo_open';
|
||||
$tier_name = 'Open';
|
||||
$rows_route = 'jo_open_rows';
|
||||
$edit_route = '';
|
||||
$unlock_route = '';
|
||||
$jo_status = [
|
||||
JOStatus::PENDING,
|
||||
JOStatus::RIDER_ASSIGN,
|
||||
JOStatus::ASSIGNED,
|
||||
JOStatus::IN_PROGRESS,
|
||||
JOStatus::IN_TRANSIT,
|
||||
];
|
||||
break;
|
||||
case 'all':
|
||||
$tier_key = 'jo_open';
|
||||
$tier_name = 'Open';
|
||||
$rows_route = 'jo_open_rows';
|
||||
$edit_route = 'jo_all_form';
|
||||
$unlock_route = '';
|
||||
$jo_status = '';
|
||||
break;
|
||||
default:
|
||||
throw new AccessDeniedHttpException('No access.');
|
||||
}
|
||||
|
||||
// check acl
|
||||
if (!($this->security->isGranted($tier_key . '.list')))
|
||||
throw new AccessDeniedHttpException('No access.');
|
||||
|
||||
// return params if allowed access
|
||||
return [
|
||||
'key' => $tier_key,
|
||||
'name' => $tier_name,
|
||||
'rows_route' => $rows_route,
|
||||
'edit_route' => $edit_route,
|
||||
'unlock_route' => $unlock_route,
|
||||
'jo_status' => $jo_status
|
||||
];
|
||||
}
|
||||
|
||||
protected function updateVehicleBattery(JobOrder $jo)
|
||||
{
|
||||
// check if new battery
|
||||
|
|
@ -1851,6 +2106,56 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface
|
|||
->setWarrantyExpiration($warr_date);
|
||||
}
|
||||
|
||||
// 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, $hubs, $tier, $status)
|
||||
{
|
||||
switch ($tier)
|
||||
{
|
||||
case 'fulfill':
|
||||
$query->where('q.status IN (:statuses)')
|
||||
->andWhere('q.hub IN (:hubs)')
|
||||
->setParameter('statuses', $status, Connection::PARAM_STR_ARRAY)
|
||||
->setParameter('hubs', $hubs, Connection::PARAM_STR_ARRAY);
|
||||
break;
|
||||
case 'assign':
|
||||
$query->where('q.status = :status')
|
||||
->andWhere('q.hub IN (:hubs)')
|
||||
->setParameter('status', $status)
|
||||
->setParameter('hubs', $hubs, Connection::PARAM_STR_ARRAY);
|
||||
break;
|
||||
case 'open':
|
||||
if (isset($datatable['query']['data-rows-search']))
|
||||
{
|
||||
$query->innerJoin('q.cus_vehicle', 'cv')
|
||||
->innerJoin('q.customer', 'c')
|
||||
->where('q.status IN (:statuses)')
|
||||
->andWhere('cv.plate_number like :filter or c.first_name like :filter or c.last_name like :filter or c.phone_mobile like :filter')
|
||||
->setParameter('statuses', $status, Connection::PARAM_STR_ARRAY)
|
||||
->setParameter('filter', $datatable['query']['data-rows-search'] . '%');
|
||||
}
|
||||
else
|
||||
{
|
||||
$query->where('q.status IN (:statuses)')
|
||||
->setParameter('statuses', $status, Connection::PARAM_STR_ARRAY);
|
||||
}
|
||||
break;
|
||||
case 'all':
|
||||
if (isset($datatable['query']['data-rows-search']))
|
||||
{
|
||||
$query->innerJoin('q.cus_vehicle', 'cv')
|
||||
->innerJoin('q.customer', 'c')
|
||||
->where('cv.plate_number like :filter')
|
||||
->orWhere('c.phone_mobile like :filter')
|
||||
->orWhere('c.first_name like :filter or c.last_name like :filter')
|
||||
->setParameter('filter', $datatable['query']['data-rows-search'] . '%');
|
||||
}
|
||||
break;
|
||||
default:
|
||||
$query->where('q.status = :status')
|
||||
->setParameter('status', $status);
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: move this to InvoiceGenerator
|
||||
protected function processInvoice($jo, $promo_id, $invoice_items, &$error_array)
|
||||
|
|
|
|||
|
|
@ -71,6 +71,189 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface
|
|||
$this->translator = $translator;
|
||||
}
|
||||
|
||||
// get job order rows
|
||||
public function getRows(Request $req, $tier)
|
||||
{
|
||||
// check which job order tier is being called for and confirm access
|
||||
$tier_params = $this->checkTier($tier);
|
||||
|
||||
// get current user
|
||||
$user = $this->security->getUser();
|
||||
if ($user == null)
|
||||
throw new AccessDeniedHttpException('No access.');
|
||||
|
||||
$hubs = $user->getHubs();
|
||||
|
||||
// get query builder
|
||||
$qb = $this->em->getRepository(JobOrder::class)
|
||||
->createQueryBuilder('q');
|
||||
|
||||
// get datatable params
|
||||
$datatable = $req->request->get('datatable');
|
||||
|
||||
// count total records
|
||||
$tquery = $qb->select('COUNT(q)');
|
||||
|
||||
$this->setQueryFilters($datatable, $tquery, $qb, $hubs, $tier, $tier_params['jo_status']);
|
||||
|
||||
$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
|
||||
$qb = $this->em->getRepository(JobOrder::class)
|
||||
->createQueryBuilder('q');
|
||||
$query = $qb->select('q');
|
||||
|
||||
$this->setQueryFilters($datatable, $query, $qb, $hubs, $tier, $tier_params['jo_status']);
|
||||
|
||||
// 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.date_schedule', 'asc');
|
||||
}
|
||||
|
||||
// get rows for this page
|
||||
$query_obj = $query->setFirstResult($offset)
|
||||
->setMaxResults($perpage)
|
||||
->getQuery();
|
||||
|
||||
// error_log($query_obj->getSQL());
|
||||
|
||||
$obj_rows = $query_obj->getResult();
|
||||
|
||||
$statuses = JOStatus::getCollection();
|
||||
$service_types = ServiceType::getCollection();
|
||||
|
||||
// process rows
|
||||
$rows = [];
|
||||
foreach ($obj_rows as $orow) {
|
||||
// add row data
|
||||
$row['id'] = $orow->getID();
|
||||
$row['customer_name'] = $orow->getCustomer()->getFirstName() . ' ' . $orow->getCustomer()->getLastName();
|
||||
$row['delivery_address'] = $orow->getDeliveryAddress();
|
||||
$row['date_schedule'] = $orow->getDateSchedule()->format("d M Y g:i A");
|
||||
$row['type'] = $orow->isAdvanceOrder() ? 'Advanced Order' : 'Immediate';
|
||||
$row['service_type'] = $service_types[$orow->getServiceType()];
|
||||
$row['status'] = $statuses[$orow->getStatus()];
|
||||
$row['flag_advance'] = $orow->isAdvanceOrder();
|
||||
$row['plate_number'] = $orow->getCustomerVehicle()->getPlateNumber();
|
||||
$row['is_mobile'] = $orow->getSource() == TransactionOrigin::MOBILE_APP;
|
||||
|
||||
$processor = $orow->getProcessedBy();
|
||||
if ($processor == null)
|
||||
$row['processor'] = '';
|
||||
else
|
||||
$row['processor'] = $orow->getProcessedBy()->getFullName();
|
||||
|
||||
$assignor = $orow->getAssignedBy();
|
||||
if ($assignor == null)
|
||||
$row['assignor'] = '';
|
||||
else
|
||||
$row['assignor'] = $orow->getAssignedBy()->getFullName();
|
||||
|
||||
$row['meta'] = [];
|
||||
|
||||
$rows[] = $row;
|
||||
}
|
||||
|
||||
$params['meta'] = $meta;
|
||||
$params['rows'] = $rows;
|
||||
$params['tier_params'] = $tier_params;
|
||||
|
||||
return $params;
|
||||
|
||||
}
|
||||
|
||||
// get job orders
|
||||
public function getJobOrders(Request $req)
|
||||
{
|
||||
// get search term
|
||||
$term = $req->query->get('search');
|
||||
|
||||
// get querybuilder
|
||||
$qb = $this->em->getRepository(JobOrder::class)
|
||||
->createQueryBuilder('q');
|
||||
|
||||
// build expression now since we're reusing it
|
||||
$jo_label = $qb->expr()->concat($qb->expr()->literal('#'), 'q.id', $qb->expr()->literal(' - '), 'c.first_name', $qb->expr()->literal(' '), 'c.last_name', $qb->expr()->literal(' (Plate No: '), 'v.plate_number', $qb->expr()->literal(')'));
|
||||
|
||||
// count total records
|
||||
$tquery = $qb->select('COUNT(q)')
|
||||
->join('q.customer', 'c')
|
||||
->join('q.cus_vehicle', 'v');
|
||||
|
||||
// add filters to count query
|
||||
if (!empty($term)) {
|
||||
$tquery->where($jo_label . ' LIKE :filter')
|
||||
->setParameter('filter', '%' . $term . '%');
|
||||
}
|
||||
|
||||
$total = $tquery->getQuery()
|
||||
->getSingleScalarResult();
|
||||
|
||||
// pagination vars
|
||||
$page = $req->query->get('page') ?? 1;
|
||||
$perpage = 20;
|
||||
$offset = ($page - 1) * $perpage;
|
||||
$pages = ceil($total / $perpage);
|
||||
$has_more_pages = $page < $pages ? true : false;
|
||||
|
||||
// build main query
|
||||
$query = $qb->select('q')
|
||||
->addSelect($jo_label . ' as jo_label')
|
||||
->addSelect('c.first_name as cust_first_name')
|
||||
->addSelect('c.last_name as cust_last_name')
|
||||
->addSelect('v.plate_number as vehicle_plate_number');
|
||||
|
||||
// add filters if needed
|
||||
if (!empty($term)) {
|
||||
$query->where($jo_label . ' LIKE :filter')
|
||||
->setParameter('filter', '%' . $term . '%');
|
||||
}
|
||||
|
||||
// get rows
|
||||
$obj_rows = $query->orderBy('q.id', 'asc')
|
||||
->setFirstResult($offset)
|
||||
->setMaxResults($perpage)
|
||||
->getQuery()
|
||||
->getResult();
|
||||
|
||||
// build job order array
|
||||
$job_orders = [];
|
||||
|
||||
foreach ($obj_rows as $jo) {
|
||||
$service_type = ServiceType::getName($jo[0]->getServiceType());
|
||||
|
||||
$job_orders[] = [
|
||||
'id' => $jo[0]->getID(),
|
||||
'text' => $jo['jo_label'] . ' - ' . $service_type
|
||||
];
|
||||
}
|
||||
|
||||
$params['job_orders'] = $job_orders;
|
||||
$params['has_more_pages'] = $has_more_pages;
|
||||
|
||||
return $params;
|
||||
}
|
||||
|
||||
// creates/updates job order
|
||||
public function generateJobOrder(Request $req, $id)
|
||||
{
|
||||
|
|
@ -1799,6 +1982,78 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface
|
|||
}
|
||||
}
|
||||
|
||||
protected function checkTier($tier)
|
||||
{
|
||||
// check specified tier
|
||||
switch ($tier) {
|
||||
case 'proc':
|
||||
$tier_key = 'jo_proc';
|
||||
$tier_name = 'Dispatch';
|
||||
$rows_route = 'jo_proc_rows';
|
||||
$edit_route = 'jo_proc_form';
|
||||
$unlock_route = 'jo_proc_unlock';
|
||||
$jo_status = JOStatus::PENDING;
|
||||
break;
|
||||
case 'assign':
|
||||
$tier_key = 'jo_assign';
|
||||
$tier_name = 'Assigning';
|
||||
$rows_route = 'jo_assign_rows';
|
||||
$edit_route = 'jo_assign_form';
|
||||
$unlock_route = 'jo_assign_unlock';
|
||||
$jo_status = JOStatus::RIDER_ASSIGN;
|
||||
break;
|
||||
case 'fulfill':
|
||||
$tier_key = 'jo_fulfill';
|
||||
$tier_name = 'Fullfillment';
|
||||
$rows_route = 'jo_fulfill_rows';
|
||||
$edit_route = 'jo_fulfill_form';
|
||||
$unlock_route = '';
|
||||
$jo_status = [
|
||||
JOStatus::ASSIGNED,
|
||||
JOStatus::IN_PROGRESS
|
||||
];
|
||||
break;
|
||||
case 'open':
|
||||
$tier_key = 'jo_open';
|
||||
$tier_name = 'Open';
|
||||
$rows_route = 'jo_open_rows';
|
||||
$edit_route = '';
|
||||
$unlock_route = '';
|
||||
$jo_status = [
|
||||
JOStatus::PENDING,
|
||||
JOStatus::RIDER_ASSIGN,
|
||||
JOStatus::ASSIGNED,
|
||||
JOStatus::IN_PROGRESS,
|
||||
JOStatus::IN_TRANSIT,
|
||||
];
|
||||
break;
|
||||
case 'all':
|
||||
$tier_key = 'jo_open';
|
||||
$tier_name = 'Open';
|
||||
$rows_route = 'jo_open_rows';
|
||||
$edit_route = 'jo_all_form';
|
||||
$unlock_route = '';
|
||||
$jo_status = '';
|
||||
break;
|
||||
default:
|
||||
throw new AccessDeniedHttpException('No access.');
|
||||
}
|
||||
|
||||
// check acl
|
||||
if (!($this->security->isGranted($tier_key . '.list')))
|
||||
throw new AccessDeniedHttpException('No access.');
|
||||
|
||||
// return params if allowed access
|
||||
return [
|
||||
'key' => $tier_key,
|
||||
'name' => $tier_name,
|
||||
'rows_route' => $rows_route,
|
||||
'edit_route' => $edit_route,
|
||||
'unlock_route' => $unlock_route,
|
||||
'jo_status' => $jo_status
|
||||
];
|
||||
}
|
||||
|
||||
protected function updateVehicleBattery(JobOrder $jo)
|
||||
{
|
||||
// check if new battery
|
||||
|
|
@ -1851,6 +2106,56 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface
|
|||
->setWarrantyExpiration($warr_date);
|
||||
}
|
||||
|
||||
// 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, $hubs, $tier, $status)
|
||||
{
|
||||
switch ($tier)
|
||||
{
|
||||
case 'fulfill':
|
||||
$query->where('q.status IN (:statuses)')
|
||||
->andWhere('q.hub IN (:hubs)')
|
||||
->setParameter('statuses', $status, Connection::PARAM_STR_ARRAY)
|
||||
->setParameter('hubs', $hubs, Connection::PARAM_STR_ARRAY);
|
||||
break;
|
||||
case 'assign':
|
||||
$query->where('q.status = :status')
|
||||
->andWhere('q.hub IN (:hubs)')
|
||||
->setParameter('status', $status)
|
||||
->setParameter('hubs', $hubs, Connection::PARAM_STR_ARRAY);
|
||||
break;
|
||||
case 'open':
|
||||
if (isset($datatable['query']['data-rows-search']))
|
||||
{
|
||||
$query->innerJoin('q.cus_vehicle', 'cv')
|
||||
->innerJoin('q.customer', 'c')
|
||||
->where('q.status IN (:statuses)')
|
||||
->andWhere('cv.plate_number like :filter or c.first_name like :filter or c.last_name like :filter or c.phone_mobile like :filter')
|
||||
->setParameter('statuses', $status, Connection::PARAM_STR_ARRAY)
|
||||
->setParameter('filter', $datatable['query']['data-rows-search'] . '%');
|
||||
}
|
||||
else
|
||||
{
|
||||
$query->where('q.status IN (:statuses)')
|
||||
->setParameter('statuses', $status, Connection::PARAM_STR_ARRAY);
|
||||
}
|
||||
break;
|
||||
case 'all':
|
||||
if (isset($datatable['query']['data-rows-search']))
|
||||
{
|
||||
$query->innerJoin('q.cus_vehicle', 'cv')
|
||||
->innerJoin('q.customer', 'c')
|
||||
->where('cv.plate_number like :filter')
|
||||
->orWhere('c.phone_mobile like :filter')
|
||||
->orWhere('c.first_name like :filter or c.last_name like :filter')
|
||||
->setParameter('filter', $datatable['query']['data-rows-search'] . '%');
|
||||
}
|
||||
break;
|
||||
default:
|
||||
$query->where('q.status = :status')
|
||||
->setParameter('status', $status);
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: move this to InvoiceGenerator
|
||||
protected function processInvoice($jo, $promo_id, $invoice_items, &$error_array)
|
||||
|
|
|
|||
|
|
@ -10,6 +10,12 @@ use App\Service\MapTools;
|
|||
|
||||
interface JobOrderHandlerInterface
|
||||
{
|
||||
// get job order rows
|
||||
public function getRows(Request $req, string $tier);
|
||||
|
||||
// get job orders
|
||||
public function getJobOrders(Request $req);
|
||||
|
||||
// generate job order
|
||||
public function generateJobOrder(Request $req, int $id);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue