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); } protected function processPopappFile(UploadedFile $csv_file) { // 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 $serial_numbers = []; $row_num = 0; while(($fields = fgetcsv($fh)) !== false) { if ($row_num <= 2) { $row_num++; continue; } // get the serial numbers $serial_numbers[] = trim($fields[2]); } // get the warranty for serial $warr_qb = $this->getDoctrine() ->getRepository(Warranty::class) ->createQueryBuilder('q'); $warranty_query = $warr_qb->select('q') ->where('q.serial IN(:serials)') ->setParameter('serials', $serial_numbers, Connection::PARAM_STR_ARRAY); $warr_results = $warranty_query->getQuery()->getResult(); // get the plate numbers $results = []; foreach ($warr_results as $warranty) { //error_log($warranty->getPlateNumber()); // validate the plate number $isValid = InvalidPlateNumber::isInvalid($warranty->getPlateNumber()); if ($isValid) { // get customer vehicle using plate number $em = $this->getDoctrine()->getManager(); $cust_vehicles = $em->getRepository(CustomerVehicle::class)->findBy(['plate_number' => $warranty->getPlateNumber()]); foreach ($cust_vehicles as $cv) { // get customer info // get mobile session of customer //error_log($cv->getCustomer()->getLastName() . ' ' . $cv->getCustomer()->getFirstName()); $has_mobile = false; $mobile_session = $em->getRepository(MobileSession::class)->findBy(['customer' => $cv->getCustomer()->getID()]); foreach ($mobile_session as $mobile) { error_log($mobile->getID()); $has_mobile = true; } $results[] = [ 'cust_id' => $cv->getCustomer()->getID(), 'cust_lastname' => $cv->getCustomer()->getLastName(), 'cust_firstname' => $cv->getCustomer()->getFirstName(), 'plate_num' => $cv->getPlateNumber(), 'serial' => $warranty->getSerial(), 'warr_date_create' => $warranty->getDateCreate()->format("d M Y"), 'has_mobile' => $has_mobile, 'warr_activation_status' => $warranty->isActivated(), ]; } } } return $results; } }