diff --git a/config/acl.yaml b/config/acl.yaml index 25e04dbc..9d9fba7c 100644 --- a/config/acl.yaml +++ b/config/acl.yaml @@ -156,6 +156,8 @@ access_keys: label: Update - id: customer.delete label: Delete + - id: customer.dpa + label: Display DPA - id: location @@ -266,6 +268,8 @@ access_keys: label: Walk-in Edit - id: jo_autoassign.test label: Autoassign Test + - id: jo_hub.list + label: Hub View - id: support label: Customer Support Access @@ -332,6 +336,10 @@ access_keys: label: Job Order Events Report - id: report.sms_messages label: SMS Messages Report + - id: report.jo.auto_assign + label: Auto Assigned Job Order Report + - id: report.jo.advance_order + label: Advance Order Job Order Report - id: service label: Other Services diff --git a/config/menu.yaml b/config/menu.yaml index b0096cf5..f04dd4f9 100644 --- a/config/menu.yaml +++ b/config/menu.yaml @@ -122,6 +122,10 @@ main_menu: acl: jo_all.list label: View All parent: joborder + - id: jo_hub_view + acl: jo_hub.list + label: Hub View + parent: joborder - id: support acl: support.menu diff --git a/config/resq.menu.yaml b/config/resq.menu.yaml index b0096cf5..69f0b806 100644 --- a/config/resq.menu.yaml +++ b/config/resq.menu.yaml @@ -122,6 +122,9 @@ main_menu: acl: jo_all.list label: View All parent: joborder + - id: jo_hub.view + label: Hub View + parent: joborder - id: support acl: support.menu diff --git a/config/routes/job_order.yaml b/config/routes/job_order.yaml index f239402d..586ed81f 100644 --- a/config/routes/job_order.yaml +++ b/config/routes/job_order.yaml @@ -235,3 +235,21 @@ jo_autoassign_test_submit: path: /job-order/autoassign controller: App\Controller\JobOrderController::autoAssignSubmit methods: [POST] + +jo_hub_view: + path: /job-order/hub-view + controller: App\Controller\JobOrderController::hubView + methods: [GET] + +jo_hub_view_rows: + path: /job-order/hub-view-rows + controller: App\Controller\JobOrderController::getHubViewRows + methods: [POST] + defaults: + tier: "hub_view_all" + +jo_hub_view_form: + path: /job-order/hub-view/{id} + controller: App\Controller\JobOrderController::hubViewForm + methods: [GET] + diff --git a/config/routes/report.yaml b/config/routes/report.yaml index 38a78059..acb6cb18 100644 --- a/config/routes/report.yaml +++ b/config/routes/report.yaml @@ -107,3 +107,23 @@ rep_sms_messages_submit: path: /report/sms_messages_report controller: App\Controller\ReportController::smsMessagesSubmit methods: [POST] + +rep_jo_auto_assign_form: + path: /report/jo_auto_assign_report + controller: App\Controller\ReportController::jobOrderAutoAssignForm + methods: [GET] + +rep_jo_auto_assign_submit: + path: /report/jo_auto_assign_report + controller: App\Controller\ReportController::jobOrderAutoAssignSubmit + methods: [POST] + +rep_jo_advance_order_form: + path: /report/jo_advance_order_report + controller: App\Controller\ReportController::jobOrderAdvanceOrderForm + methods: [GET] + +rep_jo_advance_order_submit: + path: /report/jo_advance_order_report + controller: App\Controller\ReportController::jobOrderAdvanceOrderSubmit + methods: [POST] diff --git a/src/Controller/HubController.php b/src/Controller/HubController.php index 5c8adb04..edc6e599 100644 --- a/src/Controller/HubController.php +++ b/src/Controller/HubController.php @@ -152,8 +152,9 @@ class HubController extends Controller ->setTimeClose($time_close) ->setCoordinates($point) ->setBranchCode($req->request->get('branch_code', '')) - ->setStatusOpen($req->request->get('status_open') ?? false) - ->setRiderSlots($req->request->get('rider_slots', 0)); + ->setStatusOpen($req->request->get('status_open', false)) + ->setRiderSlots($req->request->get('rider_slots', 0)) + ->setHubViewFlag($req->request->get('flag_hub_view', false)); } protected function setQueryFilters($datatable, QueryBuilder $query) diff --git a/src/Controller/JobOrderController.php b/src/Controller/JobOrderController.php index d8866203..f23fc73c 100644 --- a/src/Controller/JobOrderController.php +++ b/src/Controller/JobOrderController.php @@ -1065,6 +1065,95 @@ class JobOrderController extends Controller ]); } + /** + * @Menu(selected="jo_hub_view") + */ + public function hubView(JobOrderHandlerInterface $jo_handler) + { + $this->denyAccessUnlessGranted('jo_hub.list', null, 'No access.'); + + $template = $jo_handler->getTwigTemplate('jo_hub_list'); + + $params = $jo_handler->getOtherParameters(); + $params['table_refresh_rate'] = $this->container->getParameter('job_order_refresh_interval'); + + return $this->render($template, $params); + } + + public function getHubViewRows(Request $req, $tier, JobOrderHandlerInterface $jo_handler) + { + try + { + $params = $jo_handler->getHubViewRows($req, $tier); + } + catch (AccessDeniedHttpException $e) + { + throw $this->createAccessDeniedException($e->getMessage()); + } + + $rows = $params['rows']; + $meta = $params['meta']; + $tier_params = $params['tier_params']; + + foreach ($rows as $key => $data) { + // add crud urls + $jo_id = $rows[$key]['id']; + + if ($tier == 'open') + { + $rows[$key]['meta']['reassign_hub_url'] = $this->generateUrl('jo_open_hub_form', ['id' => $jo_id]); + $rows[$key]['meta']['reassign_rider_url'] = $this->generateUrl('jo_open_rider_form', ['id' => $jo_id]); + // $rows[$key]['meta']['edit_url'] = $this->generateUrl('jo_open_edit_form', ['id' => $jo_id]); + $rows[$key]['meta']['edit_url'] = $this->generateUrl($jo_handler->getEditRoute($jo_id, $tier_params['edit_route']), ['id' => $jo_id]); + } + else + { + // $rows[$key]['meta']['update_url'] = $this->generateUrl($tier_params['edit_route'], ['id' => $jo_id]); + $rows[$key]['meta']['update_url'] = $this->generateUrl($jo_handler->getEditRoute($jo_id, $tier_params['edit_route']), ['id' => $jo_id]); + } + + if ($tier_params['unlock_route'] != '') + $rows[$key]['meta']['unlock_url'] = $this->generateUrl($tier_params['unlock_route'], ['id' => $jo_id]); + + } + + // response + return $this->json([ + 'meta' => $meta, + 'data' => $rows + ]); + } + + /** + * @Menu(selected="jo_hub_view") + */ + public function hubViewForm($id, JobOrderHandlerInterface $jo_handler, + GISManagerInterface $gis, EntityManagerInterface $em) + { + $this->denyAccessUnlessGranted('jo_hub.list', null, 'No access.'); + + try + { + $params = $jo_handler->initializeHubViewForm($id); + } + catch (NotFoundHttpException $e) + { + throw $this->createNotFoundException($e->getMessage()); + } + + $params['vmfgs'] = $em->getRepository(VehicleManufacturer::class)->findAll(); + $params['vmakes'] = $em->getRepository(Vehicle::class)->findAll(); + $params['return_url'] = $this->generateUrl('jo_hub_view'); + $params['submit_url'] = ''; + $params['map_js_file'] = $gis->getJSJOFile(); + + $template = $params['template']; + + // response + return $this->render($template, $params); + } + + /** * @Menu(selected="jo_autoassign") */ diff --git a/src/Controller/ReportController.php b/src/Controller/ReportController.php index ce989e46..73432964 100644 --- a/src/Controller/ReportController.php +++ b/src/Controller/ReportController.php @@ -903,6 +903,120 @@ class ReportController extends Controller } + /** + * @Menu(selected="outlet_list") + */ + public function jobOrderAutoAssignForm() + { + $this->denyAccessUnlessGranted('report.jo.auto_assign', null, 'No access.'); + + return $this->render('report/jo-auto-assign/form.html.twig'); + } + + public function jobOrderAutoAssignSubmit(Request $req, EntityManagerInterface $em) + { + // get dates + $raw_date_start = $req->request->get('date_start'); + $raw_date_end = $req->request->get('date_end'); + + $date_start = DateTime::createFromFormat('m/d/Y', $raw_date_start); + $date_end = DateTime::createFromFormat('m/d/Y', $raw_date_end); + + $data = $this->getAutoAssignedJODetails($req, $em); + + $resp = new StreamedResponse(); + $resp->setCallback(function() use ($data) { + // csv output + $csv_handle = fopen('php://output', 'w+'); + fputcsv($csv_handle, [ + 'Job Order ID', + 'Customer Name', + 'Customer Mobile Number', + 'Plate Number', + 'Service Type', + 'Date Created', + 'Date Scheduled', + 'Distributor', //hub + 'Is Advanced Order?', + 'Auto Assign Status', + 'Status', + ]); + + foreach ($data as $row) + { + fputcsv($csv_handle, $row); + } + + fclose($csv_handle); + }); + + $filename = 'auto_assigned_job_orders_' . $date_start->format('Ymd') . '_' . $date_end->format('Ymd') . '.csv'; + + $resp->setStatusCode(200); + $resp->headers->set('Content-Type', 'text/csv; charset=utf-8'); + $resp->headers->set('Content-Disposition', 'attachment; filename="' . $filename . '"'); + + return $resp; + + } + + /** + * @Menu(selected="outlet_list") + */ + public function jobOrderAdvanceOrderForm() + { + $this->denyAccessUnlessGranted('report.jo.advance_order', null, 'No access.'); + + return $this->render('report/jo-advance-order/form.html.twig'); + } + + public function jobOrderAdvanceOrderSubmit(Request $req, EntityManagerInterface $em) + { + // get dates + $raw_date_start = $req->request->get('date_start'); + $raw_date_end = $req->request->get('date_end'); + + $date_start = DateTime::createFromFormat('m/d/Y', $raw_date_start); + $date_end = DateTime::createFromFormat('m/d/Y', $raw_date_end); + + $data = $this->getAdvanceOrderJODetails($req, $em); + + $resp = new StreamedResponse(); + $resp->setCallback(function() use ($data) { + // csv output + $csv_handle = fopen('php://output', 'w+'); + fputcsv($csv_handle, [ + 'Job Order ID', + 'Customer Name', + 'Customer Mobile Number', + 'Plate Number', + 'Service Type', + 'Date Created', + 'Date Scheduled', + 'Distributor', //hub + 'Auto Assign Status', + 'Status', + ]); + + foreach ($data as $row) + { + fputcsv($csv_handle, $row); + } + + fclose($csv_handle); + }); + + $filename = 'advance_order_job_orders_' . $date_start->format('Ymd') . '_' . $date_end->format('Ymd') . '.csv'; + + $resp->setStatusCode(200); + $resp->headers->set('Content-Type', 'text/csv; charset=utf-8'); + $resp->headers->set('Content-Disposition', 'attachment; filename="' . $filename . '"'); + + return $resp; + + } + + protected function processPopappFile(UploadedFile $csv_file, EntityManagerInterface $em) { // attempt to open file @@ -1711,4 +1825,197 @@ class ReportController extends Controller return $result; } + + protected function getAutoAssignedJODetails(Request $req, EntityManagerInterface $em) + { + // get query builder + $qb = $this->getDoctrine() + ->getRepository(JobOrder::class) + ->createQueryBuilder('r'); + + // get dates + $raw_date_start = $req->request->get('date_start'); + $raw_date_end = $req->request->get('date_end'); + + $date_start = DateTime::createFromFormat('m/d/Y', $raw_date_start); + $date_end = DateTime::createFromFormat('m/d/Y', $raw_date_end); + + // build query + $query = $qb->where('r.date_create >= :start') + ->andWhere('r.date_create <= :end') + ->andWhere('r.status_autoassign IS NOT NULL') + ->setParameter('start', $date_start->format('Y-m-d') . ' 00:00:00') + ->setParameter('end', $date_end->format('Y-m-d') . ' 23:59:59') + ->getQuery(); + + // run query + $jos = $query->getResult(); + + $result = []; + foreach($jos as $jo) + { + // get customer information + $cust_name = ''; + $cust_mobile_number = ''; + $plate_number = ''; + + $customer = $jo->getCustomer(); + if ($customer != null) + { + $cust_name = $customer->getNameDisplay(); + + // get mobile number from mobile session + // find latest generated mobile session for customer + $mobile_sessions = $em->getRepository(MobileSession::class)->findBy(['customer' => $customer], ['date_generated' => 'DESC']); + if ($mobile_sessions != null) + { + foreach($mobile_sessions as $mobile_session) + { + $cust_mobile_number = $mobile_session->getPhoneNumber(); + } + } + } + + // get customer vehicle + $cust_vehicle = $jo->getCustomerVehicle(); + if ($cust_vehicle != null) + $plate_number = $cust_vehicle->getPlateNumber(); + + // get hub name + $hub_name = ''; + if ($jo->getHub() != null) + $hub_name = $jo->getHub()->getName(); + + // get jo date create + $datetime_create_jo = ''; + $jo_create = $jo->getDateCreate(); + + $datetime_create_jo = $jo_create->format('d-M-Y H:i'); + + // get jo date schedule if any + $datetime_sked_jo = ''; + $jo_date_scheduled = $jo->getDateSchedule(); + if (empty($jo_date_scheduled)) + { + // set to same date and time as date create of JO + $datetime_sked_jo = $datetime_create_jo; + } + else + $datetime_sked_jo = $jo_date_scheduled->format('d-M-Y H:i'); + + $result[] = [ + $jo->getID(), + $cust_name, + $cust_mobile_number, + $plate_number, + $jo->getServiceType(), + $datetime_create_jo, + $datetime_sked_jo, + $hub_name, + $jo->isAdvanceOrder() ? 'Yes' : 'No', + $jo->getStatusAutoAssign(), + $jo->getStatus(), + ]; + + } + + return $result; + } + + protected function getAdvanceOrderJODetails(Request $req, EntityManagerInterface $em) + { + // get query builder + $qb = $this->getDoctrine() + ->getRepository(JobOrder::class) + ->createQueryBuilder('r'); + + // get dates + $raw_date_start = $req->request->get('date_start'); + $raw_date_end = $req->request->get('date_end'); + + $date_start = DateTime::createFromFormat('m/d/Y', $raw_date_start); + $date_end = DateTime::createFromFormat('m/d/Y', $raw_date_end); + + // build query + $query = $qb->where('r.date_create >= :start') + ->andWhere('r.date_create <= :end') + ->andWhere('r.flag_advance = :flag_advance') + ->setParameter('start', $date_start->format('Y-m-d') . ' 00:00:00') + ->setParameter('end', $date_end->format('Y-m-d') . ' 23:59:59') + ->setParameter('flag_advance', true) + ->getQuery(); + + // run query + $jos = $query->getResult(); + + $result = []; + foreach($jos as $jo) + { + // get customer information + $cust_name = ''; + $cust_mobile_number = ''; + $plate_number = ''; + + $customer = $jo->getCustomer(); + if ($customer != null) + { + $cust_name = $customer->getNameDisplay(); + + // get mobile number from mobile session + // find latest generated mobile session for customer + $mobile_sessions = $em->getRepository(MobileSession::class)->findBy(['customer' => $customer], ['date_generated' => 'DESC']); + if ($mobile_sessions != null) + { + foreach($mobile_sessions as $mobile_session) + { + $cust_mobile_number = $mobile_session->getPhoneNumber(); + } + } + } + + // get customer vehicle + $cust_vehicle = $jo->getCustomerVehicle(); + if ($cust_vehicle != null) + $plate_number = $cust_vehicle->getPlateNumber(); + + // get hub name + $hub_name = ''; + if ($jo->getHub() != null) + $hub_name = $jo->getHub()->getName(); + + // get jo date create + $datetime_create_jo = ''; + $jo_create = $jo->getDateCreate(); + + $datetime_create_jo = $jo_create->format('d-M-Y H:i'); + + // get jo date schedule if any + $datetime_sked_jo = ''; + $jo_date_scheduled = $jo->getDateSchedule(); + if (empty($jo_date_scheduled)) + { + // set to same date and time as date create of JO + $datetime_sked_jo = $datetime_create_jo; + } + else + $datetime_sked_jo = $jo_date_scheduled->format('d-M-Y H:i'); + + $result[] = [ + $jo->getID(), + $cust_name, + $cust_mobile_number, + $plate_number, + $jo->getServiceType(), + $datetime_create_jo, + $datetime_sked_jo, + $hub_name, + $jo->getStatusAutoAssign(), + $jo->getStatus(), + ]; + + } + + return $result; + } + } diff --git a/src/Entity/Hub.php b/src/Entity/Hub.php index 9edcb88a..0b1769b2 100644 --- a/src/Entity/Hub.php +++ b/src/Entity/Hub.php @@ -62,6 +62,12 @@ class Hub */ protected $rider_slots; + // flag to see if hub will be displayed in Hub View + /** + * @ORM\Column(type="boolean") + */ + protected $flag_hub_view; + public function __construct() { $this->time_open = new DateTime(); @@ -69,6 +75,7 @@ class Hub $this->riders = new ArrayCollection(); $this->outlets = new ArrayCollection(); $this->status_open = true; + $this->flag_hub_view = false; } public function getRiders() @@ -167,4 +174,16 @@ class Hub return $this->rider_slots; } + public function setHubViewFlag($flag_hub_view = true) + { + $this->flag_hub_view = $flag_hub_view; + return $this; + } + + public function isHubView() + { + return $this->flag_hub_view; + } + + } diff --git a/src/Service/CustomerHandler/ResqCustomerHandler.php b/src/Service/CustomerHandler/ResqCustomerHandler.php index e27399e3..0618a4ed 100644 --- a/src/Service/CustomerHandler/ResqCustomerHandler.php +++ b/src/Service/CustomerHandler/ResqCustomerHandler.php @@ -163,17 +163,31 @@ class ResqCustomerHandler implements CustomerHandlerInterface // add new customer and customer vehicle, if any public function addCustomer(Request $req) { - // create new row - $em = $this->em; - $row = new Customer(); - - $this->setObject($row, $req); - // initialize error lists $error_array = []; $nerror_array = []; $verror_array = []; + // create new row + $em = $this->em; + $row = new Customer(); + + // check if dpa consent is unticked + $is_dpa_checked = $req->request->get('flag_dpa_consent'); + if (!$is_dpa_checked) + $error_array['flag_dpa_consent'] = 'DPA consent should be checked.'; + + // check if email marketing promo is checked + $is_email_promo_checked = $req->request->get('flag_promo_email'); + if ($is_email_promo_checked) + { + // check email field + if (empty($req->request->get('email'))) + $error_array['email'] = 'Email address required.'; + } + + $this->setObject($row, $req); + // custom validation for vehicles $vehicles = json_decode($req->request->get('vehicles')); @@ -325,6 +339,21 @@ class ResqCustomerHandler implements CustomerHandlerInterface $nerror_array = []; $verror_array = []; + // check if dpa consent is unticked + $is_dpa_checked = $req->request->get('flag_dpa_consent'); + if (!$is_dpa_checked) + $error_array['flag_dpa_consent'] = 'DPA consent should be checked.'; + + // check if email marketing promo is checked + $is_email_promo_checked = $req->request->get('flag_promo_email'); + if ($is_email_promo_checked) + { + // check email field + if (empty($req->request->get('email'))) + $error_array['email'] = 'Email address required.'; + } + + // TODO: validate mobile numbers // TODO: validate vehicles diff --git a/src/Service/JobOrderHandler/ResqJobOrderHandler.php b/src/Service/JobOrderHandler/ResqJobOrderHandler.php index 54deda2f..6a44b954 100644 --- a/src/Service/JobOrderHandler/ResqJobOrderHandler.php +++ b/src/Service/JobOrderHandler/ResqJobOrderHandler.php @@ -2341,6 +2341,9 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface // get riders for dropdown $params['riders'] = $this->em->getRepository(Rider::class)->findAll(); + // get hubs for dropdown + $params['hubs'] = $this->em->getRepository(Hub::class)->findBy(['flag_hub_view' => true]); + return $params; } @@ -2509,6 +2512,8 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface $this->template_hash['jo_list_open'] = 'job-order/list.open.html.twig'; $this->template_hash['jo_list_all'] = 'job-order/list.all.html.twig'; $this->template_hash['jo_popup'] = 'job-order/popup.html.twig'; + $this->template_hash['jo_hub_list'] = 'job-order/list.hubview.html.twig'; + $this->template_hash['jo_hub_view_form'] = 'job-order/form.html.twig'; } protected function checkTier($tier) @@ -2564,6 +2569,20 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface $unlock_route = ''; $jo_status = ''; break; + case 'hub_view_all': + $tier_key = 'jo_hub'; + $tier_name = 'Open'; + $rows_route = 'jo_hub_view_rows'; + $edit_route = 'jo_hub_view_form'; + $unlock_route = ''; + $jo_status = [ + JOStatus::PENDING, + JOStatus::RIDER_ASSIGN, + JOStatus::ASSIGNED, + JOStatus::IN_PROGRESS, + JOStatus::IN_TRANSIT, + ]; + break; default: throw new AccessDeniedHttpException('No access.'); } @@ -2695,6 +2714,43 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface ->setParameter('date_end', $date_end); } break; + case 'hub_view_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'] . '%'); + } + if (isset($datatable['query']['hub'])) + { + $query->innerJoin('q.hub', 'h') + ->andWhere('h.id = :hub_id') + ->setParameter('hub_id', $datatable['query']['hub']); + } + else + { + $query->innerJoin('q.hub', 'h') + ->andWhere('h.flag_hub_view = :flag_hub_view') + ->setParameter('flag_hub_view', true); + } + + $c_date = new DateTime(); + $start_curr_date = $c_date->format('Y-m-d') . ' ' . '00:00:00'; + $end_curr_date = $c_date->format('Y-m-d') . ' ' . '23:59:00'; + + $start_current_date = DateTime::createFromFormat('Y-m-d H:i:s', $start_curr_date); + $end_current_date = DateTime::createFromFormat('Y-m-d H:i:s', $end_curr_date); + + $query->andWhere('q.date_schedule >= :start_current_date') + ->andWhere('q.date_schedule <= :end_current_date') + ->andWhere('q.status IN (:statuses)') + ->setParameter('start_current_date', $start_current_date) + ->setParameter('end_current_date', $end_current_date) + ->setParameter('statuses', $status, Connection::PARAM_STR_ARRAY); + break; default: $query->where('q.status = :status') ->setParameter('status', $status); @@ -2708,4 +2764,165 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface return $tier; } + + public function getHubViewRows(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(); + + $rows[] = $row; + } + + $params['meta'] = $meta; + $params['rows'] = $rows; + $params['tier_params'] = $tier_params; + + return $params; + } + + public function initializeHubViewForm($id) + { + $em = $this->em; + + $params['mode'] = 'update-all'; + + // get row data + $obj = $em->getRepository(JobOrder::class)->find($id); + + // make sure this row exists + if (empty($obj)) + throw new NotFoundHttpException('The job order does not exist'); + + $this->fillDropdownParameters($params); + $this->fillFormTags($params); + + // get template to display + $params['template'] = $this->getTwigTemplate('jo_hub_view_form'); + + $params['obj'] = $obj; + $params['status_cancelled'] = JOStatus::CANCELLED; + + // timeline stuff (descending by time) + $params['timeline'] = [ + [ + 'date' => date("M j"), + 'time' => date("g:i A"), + 'event' => "Event 4", + 'color' => "#f4516c" + ], + [ + 'date' => date("M j"), + 'time' => date("g:i A"), + 'event' => "Event 3", + 'color' => "#34bfa3" + ], + [ + 'date' => date("M j"), + 'time' => date("g:i A"), + 'event' => "Event 2", + 'color' => "#716aca" + ], + [ + 'date' => date("M j"), + 'time' => date("g:i A"), + 'event' => "Event 1", + 'color' => "#ffb822" + ], + ]; + + return $params; + } + } diff --git a/templates/base.html.twig b/templates/base.html.twig index f4c36db7..5e5abfc2 100644 --- a/templates/base.html.twig +++ b/templates/base.html.twig @@ -162,6 +162,26 @@ + +