Move retrieval of job order rows to the job service. #270

This commit is contained in:
Korina Cordero 2019-10-01 08:35:55 +00:00
parent 2f555483be
commit 7989f6b6d6
4 changed files with 638 additions and 172 deletions

View file

@ -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
]);
}

View file

@ -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)

View file

@ -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)

View file

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