resq/src/Controller/ReportController.php
2019-08-09 08:01:23 +00:00

520 lines
17 KiB
PHP

<?php
namespace App\Controller;
use App\Ramcar\JORejectionReason;
use App\Ramcar\ServiceType;
use App\Ramcar\JOStatus;
use App\Ramcar\InvalidPlateNumber;
use App\Entity\JORejection;
use App\Entity\Battery;
use App\Entity\JobOrder;
use App\Entity\Warranty;
use App\Entity\CustomerVehicle;
use App\Entity\MobileSession;
use Doctrine\ORM\Query;
use Doctrine\ORM\QueryBuilder;
use Doctrine\DBAL\Connection;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\StreamedResponse;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Catalyst\MenuBundle\Annotation\Menu;
use CrEOF\Spatial\PHP\Types\Geometry\Point;
use DateTime;
class ReportController extends Controller
{
/**
* @Menu(selected="outlet_list")
*/
public function rejectSummaryForm()
{
$this->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;
}
}