resq/src/Controller/ReportController.php
2021-03-29 05:48:26 +00:00

2161 lines
74 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\Ramcar\SMSStatus;
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 App\Entity\SMSMessage;
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;
use PDO;
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;
}
/**
* @Menu(selected="outlet_list")
*/
public function smsMessagesForm()
{
$this->denyAccessUnlessGranted('report.sms_messages', null, 'No access.');
return $this->render('report/sms-messages/form.html.twig');
}
public function smsMessagesSubmit(Request $req, EntityManagerInterface $em)
{
$data = $this->getSMSMessagesDetails($req, $em);
$resp = new StreamedResponse();
$resp->setCallback(function() use ($data) {
// csv output
$csv_handle = fopen('php://output', 'w+');
fputcsv($csv_handle, [
'Date Create',
'Source',
'Source Alias',
'Destination',
'Message',
'Status',
'Reason Code',
]);
// write sms messages data
foreach ($data as $row)
{
fputcsv($csv_handle, $row);
}
fclose($csv_handle);
});
$filename = 'sms_messages_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 jobOrderAutoAssignForm()
{
$this->denyAccessUnlessGranted('report.jo.auto_assign', null, 'No access.');
return $this->render('report/jo-auto-assign/form.html.twig');
}
public function jobOrderAutoAssignSubmit(Request $req, EntityManagerInterface $em)
{
// 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);
$data = $this->getAutoAssignedJODetails($req, $em);
$resp = new StreamedResponse();
$resp->setCallback(function() use ($data) {
// csv output
$csv_handle = fopen('php://output', 'w+');
fputcsv($csv_handle, [
'Job Order ID',
'Customer Name',
'Customer Mobile Number',
'Plate Number',
'Service Type',
'Date Created',
'Date Scheduled',
'Distributor', //hub
'Is Advanced Order?',
'Auto Assign Status',
'Status',
]);
foreach ($data as $row)
{
fputcsv($csv_handle, $row);
}
fclose($csv_handle);
});
$filename = 'auto_assigned_job_orders_' . $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 jobOrderAdvanceOrderForm()
{
$this->denyAccessUnlessGranted('report.jo.advance_order', null, 'No access.');
return $this->render('report/jo-advance-order/form.html.twig');
}
public function jobOrderAdvanceOrderSubmit(Request $req, EntityManagerInterface $em)
{
// 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);
$data = $this->getAdvanceOrderJODetails($req, $em);
$resp = new StreamedResponse();
$resp->setCallback(function() use ($data) {
// csv output
$csv_handle = fopen('php://output', 'w+');
fputcsv($csv_handle, [
'Job Order ID',
'Customer Name',
'Customer Mobile Number',
'Plate Number',
'Service Type',
'Date Created',
'Date Scheduled',
'Distributor', //hub
'Auto Assign Status',
'Status',
]);
foreach ($data as $row)
{
fputcsv($csv_handle, $row);
}
fclose($csv_handle);
});
$filename = 'advance_order_job_orders_' . $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 customerSourceForm()
{
$this->denyAccessUnlessGranted('report.customer.source', null, 'No access.');
return $this->render('report/customer-source/form.html.twig');
}
public function customerSourceSubmit(Request $req, EntityManagerInterface $em)
{
// 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);
$data = $this->getCustomerSourceDetails($req, $em);
$resp = new StreamedResponse();
$resp->setCallback(function() use ($data) {
// csv output
$csv_handle = fopen('php://output', 'w+');
fputcsv($csv_handle, [
'Customer ID',
'First Name',
'Last Name',
'Mobile Phone',
'Landline',
'Office Phone',
'Fax',
'Email Address',
'Vehicle Manufacturer',
'Vehicle Make',
'Model Year',
'Plate Number',
'Source',
'Date Created',
]);
foreach ($data as $row)
{
fputcsv($csv_handle, $row);
}
fclose($csv_handle);
});
$filename = 'customer_source_' . $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;
}
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;
}
protected function getSMSMessagesDetails(Request $req, EntityManagerInterface $em)
{
// get query builder
$qb = $this->getDoctrine()
->getRepository(SMSMessage::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
$sms_messages = $query->getResult();
$result = [];
foreach($sms_messages as $sms_message)
{
$datetime_create = $sms_message->getDateCreate();
$date_create = $datetime_create->format('M-d-Y H:i');
$result[] = [
$date_create,
$sms_message->getFrom(),
$sms_message->getFromAlias(),
$sms_message->getTo(),
$sms_message->getMessage(),
$sms_message->getStatus(),
$sms_message->getReasonCode(),
];
}
return $result;
}
protected function getAutoAssignedJODetails(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')
->andWhere('r.status_autoassign IS NOT NULL')
->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 customer information
$cust_name = '';
$cust_mobile_number = '';
$plate_number = '';
$customer = $jo->getCustomer();
if ($customer != null)
{
$cust_name = $customer->getNameDisplay();
// 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();
// get hub name
$hub_name = '';
if ($jo->getHub() != null)
$hub_name = $jo->getHub()->getName();
// get jo date create
$datetime_create_jo = '';
$jo_create = $jo->getDateCreate();
$datetime_create_jo = $jo_create->format('d-M-Y H:i');
// get jo date schedule if any
$datetime_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;
}
else
$datetime_sked_jo = $jo_date_scheduled->format('d-M-Y H:i');
$result[] = [
$jo->getID(),
$cust_name,
$cust_mobile_number,
$plate_number,
$jo->getServiceType(),
$datetime_create_jo,
$datetime_sked_jo,
$hub_name,
$jo->isAdvanceOrder() ? 'Yes' : 'No',
$jo->getStatusAutoAssign(),
$jo->getStatus(),
];
}
return $result;
}
protected function getAdvanceOrderJODetails(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')
->andWhere('r.flag_advance = :flag_advance')
->setParameter('start', $date_start->format('Y-m-d') . ' 00:00:00')
->setParameter('end', $date_end->format('Y-m-d') . ' 23:59:59')
->setParameter('flag_advance', true)
->getQuery();
// run query
$jos = $query->getResult();
$result = [];
foreach($jos as $jo)
{
// get customer information
$cust_name = '';
$cust_mobile_number = '';
$plate_number = '';
$customer = $jo->getCustomer();
if ($customer != null)
{
$cust_name = $customer->getNameDisplay();
// 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();
// get hub name
$hub_name = '';
if ($jo->getHub() != null)
$hub_name = $jo->getHub()->getName();
// get jo date create
$datetime_create_jo = '';
$jo_create = $jo->getDateCreate();
$datetime_create_jo = $jo_create->format('d-M-Y H:i');
// get jo date schedule if any
$datetime_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;
}
else
$datetime_sked_jo = $jo_date_scheduled->format('d-M-Y H:i');
$result[] = [
$jo->getID(),
$cust_name,
$cust_mobile_number,
$plate_number,
$jo->getServiceType(),
$datetime_create_jo,
$datetime_sked_jo,
$hub_name,
$jo->getStatusAutoAssign(),
$jo->getStatus(),
];
}
return $result;
}
protected function getCustomerSourceDetails(Request $req, EntityManagerInterface $em)
{
// 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);
// change to this format: Y-m-d H:i:s
$new_date_start = $date_start->format('Y-m-d H:i:s');
$new_date_end = $date_end->format('Y-m-d H:i:s');
// get all mobile user customer id hash
$resq_cust_ids = $this->getRESQCustomerIDs($em);
// pdo connection
$db = $em->getConnection();
// get all customers
$sql = 'select c.id, c.first_name, c.last_name, c.phone_mobile, c.phone_landline, c.phone_office, c.phone_fax, c.email, c.flag_mobile_app, vm.name, v.make, cv.model_year, cv.plate_number, c.date_create from customer c, customer_vehicle cv, vehicle v, vehicle_manufacturer vm where c.date_create >= :date_start and c.date_create <= :date_end and c.id = cv.customer_id and cv.vehicle_id = v.id and v.manufacturer_id = vm.id';
$stmt = $db->prepare($sql);
$stmt->execute([
'date_start' => $new_date_start,
'date_end' => $new_date_end,
]);
$result = [];
// go through rows
while ($row = $stmt->fetch(PDO::FETCH_NUM))
{
// TODO: find customer source
// NOTE: flag_mobile_app is 0 for some reason
// customer source
if (isset($resq_cust_ids[$row[0]]))
$source = 'resq';
else
$source = 'crm / owr';
$result[] = [
$row[0], // id
$row[1], // first name
$row[2], // last name
$row[3], // phone - mobile
$row[4], // phone - landline
$row[5], // phone - office
$row[6], // phone - fax
$row[7], // email
$row[9], // vehicle manufacturer
$row[10], // vehicle make
$row[11], // vehicle model
$row[12], // plate number
$source, // customer source
$row[13],
];
}
return $result;
}
protected function getRESQCustomerIDs(EntityManagerInterface $em)
{
// pdo connection
$db = $em->getConnection();
// get all customer ids of all mobile sessions
$sql = 'select distinct customer_id from mobile_session';
$stmt = $db->prepare($sql);
$stmt->execute();
$res = $stmt->fetchAll();
$cust_ids = [];
foreach ($res as $cust)
{
$cust_ids[$cust['customer_id']] = $cust['customer_id'];
}
return $cust_ids;
}
}