resq/src/Controller/ReportController.php
2020-04-23 08:16:09 +00:00

1622 lines
56 KiB
PHP

<?php
namespace App\Controller;
use App\Ramcar\JORejectionReason;
use App\Ramcar\ServiceType;
use App\Ramcar\JOStatus;
use App\Ramcar\InvalidPlateNumber;
use App\Ramcar\JOEventType;
use App\Entity\JORejection;
use App\Entity\Battery;
use App\Entity\JobOrder;
use App\Entity\JOEvent;
use App\Entity\Warranty;
use App\Entity\CustomerVehicle;
use App\Entity\MobileSession;
use App\Entity\Customer;
use App\Entity\BatteryModel;
use App\Entity\BatterySize;
use Doctrine\ORM\Query;
use Doctrine\ORM\QueryBuilder;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\DBAL\Connection;
use Doctrine\Common\Collections\ArrayCollection;
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
{
const PREREGISTER_PREFIX = '9';
/**
* @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);
} */
/**
* @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',
'Warranty Class',
'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;
}
/**
* @Menu(selected="outlet_list")
*/
public function warrantyClassForm()
{
$this->denyAccessUnlessGranted('report.warranty.class', null, 'No access.');
$params['mode'] = 'form';
return $this->render('report/warranty-class/form.html.twig', $params);
}
/**
* @Menu(selected="outlet_list")
*/
public function warrantyClassExportCSV(Request $req, EntityManagerInterface $em)
{
$data = $this->getWarrantyClassData($em);
$resp = new StreamedResponse();
$resp->setCallback(function() use ($data) {
// csv output
$csv_handle = fopen('php://output', 'w+');
fputcsv($csv_handle, [
'Customer Last Name',
'Customer First Name',
'Vehicle Manufacturer',
'Vehicle Make',
'Model Year',
'Vehicle Color',
'Warranty Serial',
'Warranty Class',
'Plate Number',
'Warranty Last Name',
'Warranty First Name',
'Warranty Mobile Number',
'Warranty Battery Model',
'Warranty Battery Size',
'Warranty SAP Battery',
'Warranty Status',
'Warranty Created',
'Warranty Purchased',
'Warranty Expiry Date',
'Warranty Claim Date',
'Warranty Claimed From',
'Warranty Privacy Policy',
'Is Warranty Activated?',
]);
foreach ($data as $row)
{
fputcsv($csv_handle, $row);
}
fclose($csv_handle);
});
$filename = 'warranty_class_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 vehicleBatteryCompatibilityForm()
{
$this->denyAccessUnlessGranted('report.vehicle.battery.compatibility', null, 'No access.');
$params['mode'] = 'form';
return $this->render('report/vehicle-battery-compatibility/form.html.twig', $params);
}
/**
* @Menu(selected="outlet_list")
*/
public function vehicleBatteryCompatibilityExportCSV(Request $req, EntityManagerInterface $em)
{
$data = $this->getVehicleBatteryCompatibilityData($em);
$resp = new StreamedResponse();
$resp->setCallback(function() use ($data) {
// csv output
$csv_handle = fopen('php://output', 'w+');
fputcsv($csv_handle, [
'Vehicle Manufacturer',
'Vehicle Make',
'Vehicle Model Year From',
'Vehicle Model Year To',
'Battery Manufacturer',
'Battery Model',
'Battery Size',
'Battery SAP Code',
]);
foreach ($data as $row)
{
fputcsv($csv_handle, $row);
}
fclose($csv_handle);
});
$filename = 'vehicle_battery_compatibility_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 warrantyDetailsForm()
{
$this->denyAccessUnlessGranted('report.warranty.details', null, 'No access.');
$params['mode'] = 'form';
return $this->render('report/warranty-details/form.html.twig', $params);
}
/**
* @Menu(selected="outlet_list")
*/
public function warrantyDetailsExportCSV(Request $resq, EntityManagerInterface $em)
{
$data = $this->getWarrantyDetailsData($em);
$resp = new StreamedResponse();
$resp->setCallback(function() use ($data) {
// csv output
$csv_handle = fopen('php://output', 'w+');
fputcsv($csv_handle, [
'Warranty ID',
'Serial',
'Battery Model',
'Battery Size',
'Warranty Class',
'Plate Number',
'Status',
'Date Created',
'Date Purchased',
'Expiry Date',
'Date Claimed',
'SAP Battery ID',
'Claim ID',
'Last Name',
'First Name',
'Mobile Number',
'Privacy Policy Number',
'Activated?',
]);
foreach ($data as $row)
{
fputcsv($csv_handle, $row);
}
fclose($csv_handle);
});
$filename = 'warranty_details_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 jobOrderDetailsForm()
{
$this->denyAccessUnlessGranted('report.jo.details', null, 'No access.');
return $this->render('report/jo-details/form.html.twig');
}
public function jobOrderDetailsSubmit(Request $req, EntityManagerInterface $em)
{
$data = $this->getJobOrderDetails($req, $em);
$resp = new StreamedResponse();
$resp->setCallback(function() use ($data) {
// csv output
$csv_handle = fopen('php://output', 'w+');
fputcsv($csv_handle, [
'Month',
'Scheduled Date and Time',
'Scheduled Date',
'Scheduled Time',
'Distributor', // hub
'Battery Facilitated By', // facilitated_hub
'Job Order Number',
'Service Type',
'Customer Name',
'Customer Mobile Number',
'Plate Number',
'SKU',
'Serial Number',
'Invoice/DR No.',
'Existing Battery',
'Rider Name',
'DPA',
'Created Date and Time',
'Date Created',
'Time Created',
'Date and Time Dispatched',
'Date Dispatched',
'Time Dispatched',
'Date and Time Arrived',
'Date Arrived',
'Time Arrived',
'Created vs Arrival',
'Customer Latitude',
'Customer Longitude',
'Hub Latitude',
'Hub Longitude',
'Facilitated Hub Latitude',
'Facilitated Hub Longitude',
'Dispatcher',
'Agent (Created)',
'Date Create (Invoice)',
'Source',
'Status',
'Flag Advance',
]);
foreach ($data as $row)
{
fputcsv($csv_handle, $row);
}
fclose($csv_handle);
});
$filename = 'job_order_details_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 jobOrderEventsForm()
{
$this->denyAccessUnlessGranted('report.jo_events', null, 'No access.');
return $this->render('report/jo-events/form.html.twig');
}
public function jobOrderEventsSubmit(Request $req, EntityManagerInterface $em)
{
$hub_events = $this->getJobOrderEvents($req, JOEventType::HUB_ASSIGN);
$arrive_events = $this->getJobOrderEvents($req, JOEventType::RIDER_ARRIVE);
$accept_events = $this->getJobOrderEvents($req, JOEventType::RIDER_ACCEPT);
$blanks = [];
array_push($blanks, array("\t","\t","\t","\t"));
$data = array_merge($hub_events, $blanks, $arrive_events, $blanks, $accept_events);
$resp = new StreamedResponse();
$resp->setCallback(function() use ($data) {
// csv output
$csv_handle = fopen('php://output', 'w+');
fputcsv($csv_handle, [
'Job Order ID',
'Date and Time Created for JO',
'Date Created for JO',
'Time Created for JO',
'Service Type',
'Type ID',
]);
// write hub events
foreach ($data as $row)
{
fputcsv($csv_handle, $row);
}
fclose($csv_handle);
});
$filename = 'job_order_events_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' => '',
'warr_class' => '',
'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
$warranties = $em->getRepository(Warranty::class)->findBy(['serial' => $serial]);
if (!empty($warranties))
{
foreach ($warranties as $warranty)
{
//error_log('found warranty for serial ' . $serial);
$plate_number = $warranty->getPlateNumber();
$isValid = InvalidPlateNumber::isInvalid($plate_number);
if ($isValid)
{
// get customer vehicles using plate number
$customer_vehicles = $em->getRepository(CustomerVehicle::class)->findBy(['plate_number' => $plate_number]);
// check if customer vehicle is empty
if (count($customer_vehicles) != 0)
{
//error_log('found customer vehicle for plate number ' . $plate_number);
$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());
$cust_id = $cv->getCustomer()->getID();
$mobile_session = $em->getRepository(MobileSession::class)
->findOneBy(['customer' => $cust_id], ['date_generated' => 'ASC']);
if ($mobile_session != null)
{
// get mobile data
//error_log('found mobile session for customer id ' . $cv->getCustomer()->getID());
$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');
$results[$key]['warr_class'] = $warranty->getWarrantyClass();
}
}
}
}
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;
}
protected function getWarrantyClassData(EntityManagerInterface $em)
{
$results = [];
// query preregistered ustomers using search term '%9'
$cust_query = $em->createQuery('select c from App\Entity\Customer c where c.phone_mobile like :search_mobile')
->setParameter('search_mobile', "%" . self::PREREGISTER_PREFIX);
$customers = $cust_query->iterate();
foreach($customers as $crow)
{
$cust = $crow[0];
//error_log('Processing customer ' . $cust->getID());
// get list of customer vehicles
$c_vehicles = $cust->getVehicles();
foreach($c_vehicles as $cv)
{
if (!empty($c_vehicles))
{
// find warranty for plate number
$clean_cv_plate = $this->cleanPlateNumber($cv->getPlateNumber());
$warranties = $em->getRepository(Warranty::class)->findBy(['plate_number' => $clean_cv_plate]);
foreach ($warranties as $warr)
{
//error_log('Found warranty for plate number ' . $warr->getPlateNumber());
// form the result row
$results[] = $this->formWarrantyClassResult($cust, $cv, $warr);
}
}
}
$em->clear();
}
return $results;
}
protected function cleanPlateNumber($plate)
{
// remove spaces and make upper case
return strtoupper(str_replace(' ', '', $plate));
}
protected function formWarrantyClassResult($cust, $cv, $warr)
{
$batt_model = '';
$batt_size = '';
$sap_batt = '';
$policy = '';
$date_purchased = '';
$date_expire = '';
$date_claim = '';
$create_date = $warr->getDateCreate();
$date_create = $create_date->format('d/M/y');
if ($warr->getDatePurchase() != null)
{
$p_date = $warr->getDatePurchase();
$date_purchased = $p_date->format('d/M/y');
}
if ($warr->getDateClaim() != null)
{
$c_date = $warr->getDateClaim();
$date_claim = $c_date->format('d/M/y');
}
if ($warr->getDateExpire() != null)
{
$e_date = $warr->getDateExpire();
$date_expire = $e_date->format('d/M/y');
}
if ($warr->getBatteryModel() != null)
{
$batt_model = $warr->getBatteryModel()->getName();
}
if ($warr->getBatterySize() != null)
{
$batt_size = $warr->getBatterySize()->getName();
}
if ($warr->getSAPBattery() != null)
{
$sap_batt = $warr->getSAPBattery()->getBrand()->getName();
}
if ($warr->getPrivacyPolicy() != null)
{
$policy = $warr->getPrivacyPolicy()->getName();
}
$data = [
'c_last_name' => $cust->getLastName(),
'c_first_name' => $cust->getFirstName(),
'manufacturer' => $cv->getVehicle()->getManufacturer()->getName(),
'make' => $cv->getVehicle()->getMake(),
'model_year' => $cv->getModelYear(),
'color' => $cv->getColor(),
'serial' => $warr->getSerial(),
'class' => $warr->getWarrantyClass(),
'plate_number' => $warr->getPlateNumber(),
'w_last_name' => $warr->getLastName(),
'w_first_name' => $warr->getFirstName(),
'w_mobile_num' => $warr->getMobileNumber(),
'w_batt_model' => $batt_model,
'w_batt_size' => $batt_size,
'w_sap_batt' => $sap_batt,
'w_status' => $warr->getStatus(),
'w_date_create' => $date_create,
'w_date_purchase' => $date_purchased,
'w_date_expire' => $date_expire,
'w_date_claim' => $date_claim,
'w_claimed_from' => $warr->getClaimedFrom(),
'w_privacy_policy' => $policy,
'w_activated' => ($warr->isActivated() ? 'Active' : 'Inactive'),
];
return $data;
}
protected function getVehicleBatteryCompatibilityData(EntityManagerInterface $em)
{
$results = [];
$conn = $em->getConnection();
$sql = 'SELECT vm.name AS vm_name, v.make,
v.model_year_from, v.model_year_to,
bm.name AS bm_name, bmodel.name AS bmodel_name,
bsize.name AS bsize_name,
b.sap_code
FROM vehicle_manufacturer vm, vehicle v, battery_vehicle bv,
battery b, battery_manufacturer bm, battery_model bmodel,
battery_size bsize
WHERE vm.id = v.manufacturer_id
AND v.id = bv.vehicle_id
AND bv.battery_id = b.id
AND b.manufacturer_id = bm.id
AND b.model_id = bmodel.id
AND b.size_id = bsize.id
ORDER BY vm.name, v.make';
$stmt = $conn->prepare($sql);
$stmt->execute();
$query_results = $stmt->fetchAll();
foreach($query_results as $row)
{
$results[] = [
'vehicle_manufacturer' => $row['vm_name'],
'vehicle_make' => $row['make'],
'vehicle_model_year_from' => $row['model_year_from'],
'vehicle_model_year_to' => $row['model_year_to'],
'battery_manufacturer' => $row['bm_name'],
'battery_model' => $row['bmodel_name'],
'battery_size' => $row['bsize_name'],
'battery_sap_code' => $row['sap_code'],
];
}
return $results;
}
protected function getWarrantyDetailsData(EntityManagerInterface $em)
{
$bm_hash = $this->loadBatteryModels($em);
$bs_hash = $this->loadBatterySizes($em);
$results = [];
$conn = $em->getConnection();
$sql = 'SELECT w.id, w.serial, w.warranty_class, w.plate_number,
w.status, w.date_create, w.date_purchase, w.date_expire,
w.date_claim, w.sap_bty_id, w.claim_id, w.first_name,
w.last_name, w.mobile_number, w.flag_activated,
w.warranty_privacy_policy, w.bty_model_id, w.bty_size_id
FROM warranty w';
$stmt = $conn->prepare($sql);
$stmt->execute();
$query_results = $stmt->fetchAll();
foreach ($query_results as $row)
{
// get battery model and size names
$bmodel_name = '';
$bm_id = $row['bty_model_id'];
if (!empty($bm_id))
{
if (isset($bm_hash[$bm_id]))
$bmodel_name = $bm_hash[$bm_id];
}
$bsize_name = '';
$bs_id = $row['bty_size_id'];
if (!empty($bs_id))
{
if (isset($bs_hash[$bs_id]))
$bsize_name = $bs_hash[$bs_id];
}
$results[] = [
'id' => $row['id'],
'serial' => $row['serial'],
'battery_model' => $bmodel_name,
'battery_size' => $bsize_name,
'warranty_class' => $row['warranty_class'],
'plate_number' => $row['plate_number'],
'status' => $row['status'],
'date_create' => $row['date_create'],
'date_purchase' => $row['date_purchase'],
'date_expire' => $row['date_expire'],
'date_claim' => $row['date_claim'],
'sap_bty_id' => $row['sap_bty_id'],
'claim_id' => $row['claim_id'],
'last_name' => $row['last_name'],
'first_name' => $row['first_name'],
'mobile_number' => $row['mobile_number'],
'privacy_policy' => $row['warranty_privacy_policy'],
'flag_activated' => (boolean) $row['flag_activated'],
];
}
return $results;
}
protected function loadBatteryModels(EntityManagerInterface $em)
{
$bmodel_hash = [];
$models = $em->getRepository(BatteryModel::class)->findAll();
foreach ($models as $model)
{
$bmodel_id = $model->getID();
$bmodel_hash[$bmodel_id] = $model->getName();
}
return $bmodel_hash;
}
protected function loadBatterySizes(EntityManagerInterface $em)
{
$bsize_hash = [];
$sizes = $em->getRepository(BatterySize::class)->findAll();
foreach ($sizes as $size)
{
$bsize_id = $size->getID();
$bsize_hash[$bsize_id] = $size->getName();
}
return $bsize_hash;
}
protected function getJobOrderDetails(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')
->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 dispatcher if any
$dispatcher_name = '';
$dispatcher = $jo->getProcessedBy();
if ($dispatcher != null)
$dispatcher_name = $dispatcher->getFullName();
// get agent if any
$agent_name = '';
$agent = $jo->getCreatedBy();
if ($agent != null)
$agent_name = $agent->getFullName();
// get customer coordinates
$coord_long = $jo->getCoordinates()->getLongitude();
$coord_lat = $jo->getCoordinates()->getLatitude();
// get hub and hub coordinates, if any
$hub_name = '';
$hub_coord_long = '';
$hub_coord_lat = '';
$hub = $jo->getHub();
if ($hub != null)
{
$hub_name = $hub->getName();
$hub_coord_long = $hub->getCoordinates()->getLongitude();
$hub_coord_lat = $hub->getCoordinates()->getLatitude();
}
// get facilitated hub coordinates if any
$fac_hub_name = '';
$fac_hub_coord_long = '';
$fac_hub_coord_lat = '';
$fac_hub = $jo->getFacilitatedBy();
if ($fac_hub != null)
{
$fac_hub_name = $fac_hub->getName();
$fac_hub_coord_long = $fac_hub->getCoordinates()->getLongitude();
$fac_hub_coord_lat = $fac_hub->getCoordinates()->getLatitude();
}
// find date and time when JO was assigned a hub
$datetime_hub_assign_jo = '';
$date_hub_assign_jo = '';
$time_hub_assign_jo = '';
$hub_assign_event_type = JOEventType::HUB_ASSIGN;
$hub_assign_events = $em->getRepository(JOEvent::class)->findBy(['job_order' => $jo, 'type_id'=> $hub_assign_event_type], ['date_happen' => 'DESC']);
if ($hub_assign_events != null)
{
// TODO: what happens if JO was reassigned a hub multiple times?
// right now, this gets the last time hub was assigned.
foreach ($hub_assign_events as $hub_assign_event)
{
$datetime_hub_assign_jo = $hub_assign_event->getDateHappen()->format('d-M-Y H:i');
$date_hub_assign_jo = $hub_assign_event->getDateHappen()->format('d-M-Y');
$time_hub_assign_jo = $hub_assign_event->getDateHappen()->format('H:i');
}
}
// find date and time when JO was assigned a rider
/*
$datetime_rider_assign_jo = '';
$date_rider_assign_jo = '';
$time_rider_assign_jo = '';
$rider_assign_event_type = JOEventType::RIDER_ASSIGN;
$rider_assign_events = $em->getRepository(JOEvent::class)->findBy(['job_order' => $jo, 'type_id'=> $rider_assign_event_type], ['date_happen' => 'DESC']);
if ($rider_assign_events != null)
{
foreach ($rider_assign_events as $rider_assign_event)
{
// TODO: what happens if JO was reassigned a rider multiple times?
// right now, this gets the last time rider was assigned.
$datetime_rider_assign_jo = $rider_assign_event->getDateHappen()->format('d-M-Y H:i');
$date_rider_assign_jo = $rider_assign_event->getDateHappen()->format('d-M-Y');
$time_rider_assign_jo = $rider_assign_event->getDateHappen()->format('H:i');
}
} */
// find date and time when rider arrived at customer
$datetime_rider_arrive_jo = '';
$date_rider_arrive_jo = '';
$time_rider_arrive_jo = '';
$rider_arrive_event_type = JOEventType::RIDER_ARRIVE;
$dt_rider_arrive = null;
$rider_arrive_events = $em->getRepository(JOEvent::class)->findBy(['job_order' => $jo, 'type_id'=> $rider_arrive_event_type], ['date_happen' => 'DESC']);
if ($rider_arrive_events != null)
{
foreach ($rider_arrive_events as $rider_arrive_event)
{
$dt_rider_arrive = $rider_arrive_event->getDateHappen();
$datetime_rider_arrive_jo = $rider_arrive_event->getDateHappen()->format('d-M-Y H:i');
$date_rider_arrive_jo = $rider_arrive_event->getDateHappen()->format('d-M-Y');
$time_rider_arrive_jo = $rider_arrive_event->getDateHappen()->format('H:i');
}
}
// compute time difference between jo creation and rider arrival
$time_diff_create_arrive = '';
if ($dt_rider_arrive != null)
{
$jo_create_time = $jo->getDateCreate();
// get time difference
$interval = $dt_rider_arrive->diff($jo_create_time);
$time_diff_create_arrive = $interval->format('%h:%i');
}
// get invoice date create and item sku if any
$datetime_create_invoice = '';
$sku = '';
$invoice = $jo->getInvoice();
if ($invoice != null)
{
$invoice_create = $invoice->getDateCreate();
$datetime_create_invoice = $invoice_create->format('d-M-Y H:i');
// get item sku
$invoice_items = $invoice->getItems();
foreach ($invoice_items as $item)
{
$battery = $item->getBattery();
if ($battery != null)
$sku = $battery->getModel()->getName() . ' ' . $battery->getSize()->getName();
}
}
// get jo date create
$datetime_create_jo = '';
$date_create_jo = '';
$time_create_jo = '';
$jo_create = $jo->getDateCreate();
$datetime_create_jo = $jo_create->format('d-M-Y H:i');
$date_create_jo = $jo_create->format('d-M-Y');
$time_create_jo = $jo_create->format('H:i');
// get jo date schedule if any
$datetime_sked_jo = '';
$date_sked_jo = '';
$time_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;
$date_sked_jo = $date_create_jo;
$time_sked_jo = $time_create_jo;
}
else
{
$datetime_sked_jo = $jo_date_scheduled->format('d-M-Y H:i');
$date_sked_jo = $jo_date_scheduled->format('d-M-Y');
$time_sked_jo = $jo_date_scheduled->format('H:i');
}
// get month from date_create
$month = $jo_create->format('M');
// get rider if any
$rider_name = '';
$rider = $jo->getRider();
if ($rider != null)
$rider_name = $rider->getFullName();
// get customer information
$cust_name = '';
$cust_mobile_number = '';
$plate_number = '';
$dpa = 'No';
$existing_batt = '';
$serial = '';
$customer = $jo->getCustomer();
if ($customer != null)
{
$cust_name = $customer->getNameDisplay();
if ($customer->isDpaConsent())
$dpa = 'Yes';
// 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();
$curr_batt = $cust_vehicle->getCurrentBattery();
if ($curr_batt != null)
{
$existing_batt = $curr_batt->getModel()->getName() . ' ' . $curr_batt->getSize()->getName();
$serial = $cust_vehicle->getWarrantyCode();
}
}
$result[] = [
$month,
$datetime_sked_jo,
$date_sked_jo,
$time_sked_jo,
$hub_name,
$fac_hub_name,
$jo->getID(),
$jo->getServiceType(),
$cust_name,
$cust_mobile_number,
$plate_number,
$sku,
$serial,
$jo->getORName(),
$existing_batt,
$rider_name,
$dpa,
$datetime_create_jo,
$date_create_jo,
$time_create_jo,
$datetime_hub_assign_jo,
$date_hub_assign_jo,
$time_hub_assign_jo,
$datetime_rider_arrive_jo,
$date_rider_arrive_jo,
$time_rider_arrive_jo,
$time_diff_create_arrive,
$coord_lat,
$coord_long,
$hub_coord_lat,
$hub_coord_long,
$fac_hub_coord_lat,
$fac_hub_coord_long,
$dispatcher_name,
$agent_name,
$datetime_create_invoice,
$jo->getSource(),
$jo->getStatus(),
$jo->isAdvanceOrder() ? 'Yes' : 'No'
];
}
return $result;
}
protected function getJobOrderEvents(Request $req, $event_type)
{
// get query builder
$qb = $this->getDoctrine()
->getRepository(JOEvent::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.type_id = :event_type')
->setParameter('start', $date_start->format('Y-m-d') . ' 00:00:00')
->setParameter('end', $date_end->format('Y-m-d') . ' 23:59:59')
->setParameter('event_type', $event_type)
->getQuery();
// run query
$jo_events = $query->getResult();
$result = [];
foreach ($jo_events as $jo_event)
{
$datetime_jo_create = '';
$date_jo_create = '';
$time_jo_create = '';
$jo = $jo_event->getJobOrder();
$jo_date_create = $jo->getDateCreate();
$datetime_jo_create = $jo_date_create->format('m-d-Y H:i');
$date_jo_create = $jo_date_create->format('m-d-Y');
$time_jo_create = $jo_date_create->format('H:i');
$result[] = [
$jo->getID(),
$datetime_jo_create,
$date_jo_create,
$time_jo_create,
$jo->getServiceType(),
$jo_event->getTypeID(),
];
}
return $result;
}
}