denyAccessUnlessGranted('report.reject', null, 'No access.'); return $this->render('report/rejection/summary_form.html.twig'); } public function rejectSummarySubmit(Request $req) { $this->denyAccessUnlessGranted('report.reject', null, 'No access.'); // get query builder $qb = $this->getDoctrine() ->getRepository(JORejection::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') ->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 $jors = $query->getResult(); // initialize counter $counter = []; // get results $res = []; foreach ($jors as $jor) { $jo = $jor->getJobOrder(); $hub = $jor->getHub(); $hub_id = $hub->getID(); $hub_name = $hub->getName() . ' - ' . $hub->getBranch(); $reason = $jor->getReason(); if (!isset($counter[$hub_id])) $counter[$hub_id] = [ 'reasons' => [], 'name' => $hub_name, ]; if (!isset($counter[$hub_id][$reason])) { $counter[$hub_id]['reasons'][$reason]['name'] = JORejectionReason::getName($reason); $counter[$hub_id]['reasons'][$reason]['counter'] = 1; } else { $counter[$hub_id]['reasons'][$reason]['counter'] += 1; } $res[] = [ 'jo_id' => $jo->getID(), 'jo_date_time' => $jo->getDateSchedule(), 'jor_date_create' => $jo->getDateCreate(), 'hub' => $hub->getName() . ' - ' . $hub->getBranch(), 'reason' => JORejectionReason::getName($jor->getReason()), 'contact' => $jor->getContactPerson(), 'remarks' => $jor->getRemarks(), ]; } // response $resp = new StreamedResponse(); $resp->setCallback(function() use ($counter) { // csv output $csv_handle = fopen('php://output', 'w+'); fputcsv($csv_handle, ['Enrollee', 'Reason', 'Count']); foreach ($counter as $centry) { $first = true; foreach ($centry['reasons'] as $creason) { // first line has hub name if ($first) { fputcsv($csv_handle, [ $centry['name'], $creason['name'], $creason['counter'], ]); $first = false; } else { fputcsv($csv_handle, [ '', $creason['name'], $creason['counter'], ]); } } } fclose($csv_handle); }); $filename = 'reject_' . $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; /* return $this->json([ 'result' => $res, 'counter' => $counter, ]); */ } /** * @Menu(selected="outlet_list") */ public function rejectDetailForm() { $this->denyAccessUnlessGranted('report.reject', null, 'No access.'); return $this->render('report/rejection/detail_form.html.twig'); } public function rejectDetailSubmit(Request $req) { $this->denyAccessUnlessGranted('report.reject', null, 'No access.'); // get query builder $qb = $this->getDoctrine() ->getRepository(JORejection::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') ->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 $jors = $query->getResult(); // initialize counter $counter = []; // get results $res = []; foreach ($jors as $jor) { $jo = $jor->getJobOrder(); $hub = $jor->getHub(); $hub_id = $hub->getID(); $hub_name = $hub->getName() . ' - ' . $hub->getBranch(); /* // check if created by app $create_user = $jo->getCreatedBy(); if ($create_user == null) $create_user_text = 'Application'; else $create_user_text = $create_user->getFullName(); */ $reason = $jor->getReason(); $res[] = [ $jo->getID(), $jo->getDateSchedule()->format('m/d/Y H:i'), $jor->getDateCreate()->format('m/d/Y H:i'), $hub->getName() . ' - ' . $hub->getBranch(), JORejectionReason::getName($jor->getReason()), $jor->getContactPerson(), $jor->getRemarks(), $jor->getUser()->getFullName(), ServiceType::getName($jo->getServiceType()), ]; } // response $resp = new StreamedResponse(); $resp->setCallback(function() use ($res) { // csv output $csv_handle = fopen('php://output', 'w+'); fputcsv($csv_handle, [ 'Order #', 'Order Date and Time', 'Date and Time Rejected', 'Enrollee', 'Reason', 'Contact Person', 'Remarks', 'Dispatched By', 'Type of Service', ]); foreach ($res as $row) { fputcsv($csv_handle, $row); } fclose($csv_handle); }); $filename = 'reject_' . $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; /* return $this->json([ 'result' => $res, 'counter' => $counter, ]); */ } /** * @Menu(selected="outlet_list") */ public function batteryConflictForm() { $this->denyAccessUnlessGranted('report.battery.conflict', null, 'No access.'); return $this->render('report/battery/batt_conflict_form.html.twig'); } public function batteryConflictSubmit(Request $req) { $this->denyAccessUnlessGranted('report.battery.conflict', null, 'No access.'); // get job order query builder $job_qb = $this->getDoctrine() ->getRepository(JobOrder::class) ->createQueryBuilder('jo'); $em = $this->getDoctrine()->getManager(); // 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 for job order $jo_query = $job_qb->where('jo.date_create >= :start') ->andWhere('jo.date_create <= :end') ->andWhere('jo.status != :status') ->setParameter('start', $date_start->format('Y-m-d') . ' 00:00:00') ->setParameter('end', $date_end->format('Y-m-d') . ' 23:59:59') ->setParameter('status', JOStatus::CANCELLED) ->getQuery(); // run queries $jos = $jo_query->getResult(); $batteries = $em->getRepository(Battery::class)->findAll(); // create compatibility matrix for battery and vehicle $comp_matrix = []; foreach ($batteries as $batt) { $vehicles = $batt->getVehicles(); foreach ($vehicles as $vehicle) { $comp_matrix[$batt->getID()][$vehicle->getID()] = true; } } // go through the job orders to find the conflicts $results = []; foreach ($jos as $jo) { $invoice_items = $jo->getInvoice()->getItems(); foreach ($invoice_items as $item) { // check if the item is a battery if ($item->getBattery() != null) { $batt_id = $item->getBattery()->getID(); $vehicle_id = $jo->getCustomerVehicle()->getVehicle()->getID(); if (isset($comp_matrix[$batt_id][$vehicle_id]) && $comp_matrix[$batt_id][$vehicle_id]) { continue; } else { // get the compatible batteries for the customer vehicle $batteries = []; foreach($jo->getCustomerVehicle()->getVehicle()->getBatteries() as $comp_batt) { //$batteries[] = [ // 'mfg_name' => $comp_batt->getManufacturer()->getName(), // 'model_name' => $comp_batt->getModel()->getName(), // 'size_name' => $comp_batt->getSize()->getName(), //]; $batteries[] = $comp_batt->getManufacturer()->getName() . ' ' . $comp_batt->getModel()->getName() . ' ' . $comp_batt->getSize()->getName(); } $results[] = [ 'jo_id' => $jo->getID(), 'jo_date_create' => $jo->getDateCreate()->format('m/d/Y H:i'), 'cus_vehicle_manufacturer' => $jo->getCustomerVehicle()->getVehicle()->getManufacturer()->getName(), 'cus_vehicle_make' => $jo->getCustomerVehicle()->getVehicle()->getMake(), 'cus_vehicle_model' => $jo->getCustomerVehicle()->getModelYear(), 'battery_model_ordered' => $item->getBattery()->getModel()->getName(), 'battery_size_ordered' => $item->getBattery()->getSize()->getName(), 'compatible_batt' => implode(', ', $batteries), ]; } } } } $resp = new StreamedResponse(); $resp->setCallback(function() use ($results) { // csv output $csv_handle = fopen('php://output', 'w+'); fputcsv($csv_handle, [ 'Order #', 'Order Date and Time', 'Manufacturer', 'Make', 'Year', 'Battery Model', 'Battery Size', 'Compatible Batteries' ]); foreach ($results as $row) { fputcsv($csv_handle, $row); } fclose($csv_handle); }); $filename = 'battery_conflict_' . $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 popappComparisonForm() { $this->denyAccessUnlessGranted('report.popapp.comparison', null, 'No access.'); $params['mode'] = 'form'; return $this->render('report/popapp/form.html.twig', $params); } /** * @Menu(selected="outlet_list") */ /* public function popappComparisonSubmit(Request $req) { // retrieve temporary info for file $file = $req->files->get('csv_file'); // process the csv file $data = $this->processPopappFile($file); // return response //return $this->json([ // 'success' => true, // 'data' => $data, //]); $params['mode'] = 'results'; $params['data'] = $data; return $this->render('report/popapp/form.html.twig', $params); } */ /** * @Menu(selected="outlet_list") */ public function popappExportCSV(Request $req, EntityManagerInterface $em) { // retrieve temporary info for file $file = $req->files->get('csv_file'); // process the csv file $data = $this->processPopappFile($file, $em); $resp = new StreamedResponse(); $resp->setCallback(function() use ($data) { // csv output $csv_handle = fopen('php://output', 'w+'); fputcsv($csv_handle, [ 'Size/Model', 'SKU', 'Serial Number', 'Created Date', 'Branch Name', 'Branch Code', 'Customer ID', 'Customer Last Name', 'Customer First Name', 'Customer Mobile Number', 'Warranty Last Name', 'Warranty First Name', 'Plate Number', 'Warranty Create Date', 'Activation Status', 'Has Mobile App?', 'Date Mobile App Downloaded', 'Mobile Number Using Mobile App', ]); foreach ($data as $row) { fputcsv($csv_handle, $row); } fclose($csv_handle); }); $filename = 'popapp_comparison_report' . '.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 mehCustomerForm() { $this->denyAccessUnlessGranted('report.meh.customer', null, 'No access.'); $params['mode'] = 'form'; return $this->render('report/meh/form.html.twig', $params); } /** * @Menu(selected="outlet_list") */ public function mehCustomerExportCSV(Request $req, EntityManagerInterface $em) { $data = $this->getMEHCustomerData($em); $resp = new StreamedResponse(); $resp->setCallback(function() use ($data) { // csv output $csv_handle = fopen('php://output', 'w+'); fputcsv($csv_handle, [ 'Last Name', 'First Name', 'Mobile Number', 'Landline Number', 'Office Number', 'Fax Number', 'Plate Number', 'Date Mobile App Downloaded', 'Mobile Number Using Mobile App', ]); foreach ($data as $row) { fputcsv($csv_handle, $row); } fclose($csv_handle); }); $filename = 'resq_meh_customer_report' . '.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 try { $fh = fopen($csv_file, "r"); } catch (Exception $e) { throw new Exception('The file "' . $csv_file . '" could be read.'); } // loop through the rows $row_num = 0; $results = []; while(($fields = fgetcsv($fh)) !== false) { //error_log($row_num . ' ' . trim($fields[2])); if ($row_num < 1) { $row_num++; continue; } // pre-populate the result array $results[] = [ 'model_size' => trim($fields[0]), 'sku' => trim($fields[1]), 'serial' => trim($fields[2]), 'created_date' => trim($fields[3]), 'branch_name' => trim($fields[4]), 'branch_code' => trim($fields[5]), 'cust_id' => '', 'cust_lastname' => '', 'cust_firstname' => '', 'cust_mobile_number' => '', 'warr_lastname' => '', 'warr_firstname' => '', 'plate_num' => '', 'warr_date_create' => '', 'warr_activation_status' => '', 'has_mobile' => '', 'date_mobile' => '', 'mobile_number' => '', ]; } foreach($results as $key => $data) { //error_log($results[$key]['model_size']); // get the serial $serial = $results[$key]['serial']; // if serial is empty, move to next element if (!empty($serial)) { // get the warranty for serial $warr_qb = $this->getDoctrine() ->getRepository(Warranty::class) ->createQueryBuilder('q'); $warranty_query = $warr_qb->select('q') ->where('q.serial = :serial') ->setParameter('serial', $serial); $warranty = $warranty_query->getQuery()->getOneOrNullResult(); if ($warranty != null) { $isValid = InvalidPlateNumber::isInvalid($warranty->getPlateNumber()); if ($isValid) { // get customer vehicles using plate number $customer_vehicles = $em->getRepository(CustomerVehicle::class)->findBy(['plate_number' => $warranty->getPlateNumber()]); // check if customer vehicle is empty if (count($customer_vehicles) != 0) { $has_mobile = false; $mobile_date = ''; $mobile_number = ''; // get the first customer vehicle, store as best_cv until we find one with a mobile session $best_cv = current($customer_vehicles); foreach($customer_vehicles as $cv) { // get mobile session of customer //error_log($cv->getCustomer()->getLastName() . ' ' . $cv->getCustomer()->getFirstName()); $mobile_session = $em->getRepository(MobileSession::class) ->findOneBy(['customer' => $cv->getCustomer()->getID()], ['date_generated' => 'ASC']); if ($mobile_session != null) { // get mobile data $has_mobile = true; $mobile_date = $mobile_session->getDateGenerated()->format("d M Y"); $mobile_number = $mobile_session->getPhoneNumber(); // set best_cv to this customer vehicle with mobile session $best_cv = $cv; } } // set the customer data in results $results[$key]['cust_id'] = $best_cv->getCustomer()->getID(); $results[$key]['cust_lastname'] = $best_cv->getCustomer()->getLastName(); $results[$key]['cust_firstname'] = $best_cv->getCustomer()->getFirstName(); $results[$key]['cust_mobile_number'] = $best_cv->getCustomer()->getPhoneMobile(); $results[$key]['plate_num'] = $best_cv->getPlateNumber(); $results[$key]['has_mobile'] = ($has_mobile ? 'Yes' : 'No'); $results[$key]['date_mobile'] = $mobile_date; $results[$key]['mobile_number'] = $mobile_number; } } // set the warranty data in results $results[$key]['warr_lastname'] = $warranty->getLastName(); $results[$key]['warr_firstname'] = $warranty->getFirstName(); $results[$key]['warr_date_create'] = $warranty->getDateCreate()->format("d M Y"); $results[$key]['warr_activation_status'] = ($warranty->isActivated() ? 'Active' : 'Inactive'); } } } return $results; } protected function getMEHCustomerData(EntityManagerInterface $em) { $results = []; $conn = $em->getConnection(); $sql = 'SELECT c.id, c.last_name, c.first_name, c.phone_mobile, c.phone_landline, c.phone_office, c.phone_fax, cv.plate_number, jo.source FROM job_order jo, customer_vehicle cv, customer c WHERE c.id = cv.customer_id AND jo.cvehicle_id = cv.id AND c.policy_mobile_app_id IS NOT NULL AND jo.source != :source'; $stmt = $conn->prepare($sql); $stmt->execute(array('source' => 'mobile_app')); $query_results = $stmt->fetchAll(); foreach($query_results as $row) { $mobile_date = ''; $mobile_number = ''; $mobile_session = $em->getRepository(MobileSession::class) ->findOneBy(['customer' => $row['id']], ['date_generated' => 'ASC']); if ($mobile_session != null) { $mobile_date = $mobile_session->getDateGenerated()->format("d M Y"); $mobile_number = $mobile_session->getPhoneNumber(); } $results[] = [ 'last_name' => $row['last_name'], 'first_name' => $row['first_name'], 'cust_mobile_number' => $row['phone_mobile'], 'landline_number' => $row['phone_landline'], 'office_number' => $row['phone_office'], 'fax_number' => $row['phone_fax'], 'plate_number' => $row['plate_number'], 'date_mobile' => $mobile_date, 'mobile_number' => $mobile_number, ]; } return $results; } }