container->getParameter('job_order_refresh_interval'); return $this->render('resq-job-order/list.processing.html.twig', $params); } /** * @IsGranted("jo_resq_proc.list") */ public function datatableRows(EntityManagerInterface $em, Request $req, $tier, JobOrderHandlerInterface $jo_handler) { // 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)'); // right now, tier is either proc or all if ($tier == 'proc') $this->setQueryFilters($datatable, $tquery, $qb, $tier); else { // default to all $this->setQueryFilters($datatable, $tquery, $qb, $tier); } $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 = $em->getRepository(JobOrder::class) ->createQueryBuilder('q'); $query = $qb->select('q'); if ($tier == 'proc') $this->setQueryFilters($datatable, $query, $qb, $tier); else { // default to all $this->setQueryFilters($datatable, $query, $qb, $tier); } // 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(); $obj_rows = $query_obj->getResult(); $statuses = JOStatus::getCollection(); $service_types = ServiceType::getCollection(); // process rows $rows = []; foreach ($obj_rows as $orow) { $is_vip = false; $is_emergency = false; // check if customer is vip $cust_class = $orow->getCustomer()->getCustomerClassification(); if ($cust_class == CustomerClassification::VIP) $is_vip = true; // check if customer is not willing to wait $will_not_wait = $orow->getWillWait(); if ($will_not_wait == WillingToWaitContent::NOT_WILLING_TO_WAIT) { // check if reason is emergency or rush $reason = $orow->getReasonNotWait(); if (($reason == CustomerNotWaitReason::EMERGENCY) || ($reason == CustomerNotWaitReason::RUSH_REQUEST)) $is_emergency = true; } // 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; $row['is_vip'] = $is_vip; $row['is_emergency'] = $is_emergency; $row['flag_cust_new'] = $orow->isCustNew(); $row['date_assign'] = !empty($orow->getDateAssign()) ? $orow->getDateAssign()->format("c") : null; $row['date_fulfill'] = !empty($orow->getDateFulfill()) ? $orow->getDateFulfill()->format("c") : null; $processor = $orow->getProcessedBy(); if ($processor == null) $row['processor'] = ''; else $row['processor'] = $orow->getProcessedBy()->getFullName(); // get the assigned hub, if any $assigned_hub = $orow->getHub(); if ($assigned_hub == null) $row['assigned_hub'] = ''; else $row['assigned_hub'] = $orow->getHub()->getName(); // add the items for Actions $jo_id = $orow->getID(); if ($tier == 'proc') { $row['meta']['update_url'] = $this->generateUrl('jo_proc_form', ['id' => $jo_id, 'origin' => 'resq']); $row['meta']['unlock_url'] = $this->generateUrl('jo_proc_unlock', ['id' => $jo_id, 'origin' => 'resq']); } else { // default to all $row['meta']['update_url'] = $this->generateUrl('jo_all_form', ['id' => $jo_id, 'origin' => 'resq']); $row['meta']['pdf_url'] = $this->generateUrl('jo_pdf_form', ['id' => $jo_id, 'origin' => 'resq']); $row['meta']['view_url'] = $this->generateUrl('jo_all_view_form',['id' => $jo_id, 'origin' => 'resq']); } $rows[] = $row; } // response return $this->json([ 'meta' => $meta, 'data' => $rows ]); } /** * @Menu(selected="jo_resq_all") * @IsGranted("jo_resq_all.list") */ public function listAll(EntityManagerInterface $em) { $params['table_refresh_rate'] = $this->container->getParameter('job_order_refresh_interval'); // get riders for dropdown $params['riders'] = $em->getRepository(Rider::class)->findAll(); return $this->render('resq-job-order/list.all.html.twig', $params); } protected function setQueryFilters($datatable, &$query, $qb, $tier) { switch ($tier) { case 'proc': $query->where('q.status = :status') ->andWhere('q.source = :source') ->setParameter('status', JOStatus::PENDING) ->setParameter('source', TransactionOrigin::MOBILE_APP); if (isset($datatable['query']['data-rows-search'])) { $query->andWhere('q.plate_number like :filter') ->orWhere('q.phone_mobile like :filter') ->orWhere('q.first_name like :filter') ->orWhere('q.last_name like :filter') ->setParameter('filter', $datatable['query']['data-rows-search'] . '%'); } break; case 'all': if (isset($datatable['query']['data-rows-search'])) { $query->andWhere('q.plate_number like :filter') ->orWhere('q.phone_mobile like :filter') ->orWhere('q.first_name like :filter') ->orWhere('q.last_name like :filter') ->setParameter('filter', $datatable['query']['data-rows-search'] . '%'); } if (isset($datatable['query']['rider'])) { $query->innerJoin('q.rider', 'r') ->andWhere('r.id = :rider_id') ->setParameter('rider_id', $datatable['query']['rider']); } if (isset($datatable['query']['schedule_date'])) { $start = $datatable['query']['schedule_date'][0] . ' ' . '00:00:00'; $end = $datatable['query']['schedule_date'][1] . ' ' . '23:59:00'; $date_start = DateTime::createFromFormat('m/d/Y H:i:s', $start); $date_end = DateTime::createFromFormat('m/d/Y H:i:s', $end); $query->andWhere('q.date_schedule >= :date_start') ->andWhere('q.date_schedule <= :date_end') ->setParameter('date_start', $date_start) ->setParameter('date_end', $date_end); } $query->andWhere('q.source = :source') ->setParameter('source', TransactionOrigin::MOBILE_APP); break; default: $query->where('q.source = :source') ->setParameter('source', TransactionOrigin::MOBILE_APP); break; } } }