resq/src/Controller/ReportController.php

2385 lines
84 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 App\Entity\HubFilterLog;
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 warrantyDetailsSubmit(Request $req, EntityManagerInterface $em)
{
$data = $this->getWarrantyDetailsData($req, $em);
$resp = new StreamedResponse();
$resp->setCallback(function() use ($data) {
// csv output
$csv_handle = fopen('php://output', 'w+');
fputcsv($csv_handle, [
'Customer ID',
'Customer First Name',
'Customer Last Name',
'Customer Is Confirmed?',
'Customer Classification',
'Customer Has Mobile App?',
'Customer Title',
'Customer Is Active?',
'Customer Mobile Phone',
'Customer Landline Phone',
'Customer Office Phone',
'Customer Fax Phone',
'Customer Email Address',
'Customer Notes',
'Customer Has Third Party Privacy Policy?',
'Customer Has Promo Privacy Policy?',
'Customer Is CSAT',
'Customer Mobile App Privacy Policy ID',
'Customer Third Party Policy ID',
'Customer Promo Privacy ID',
'Customer DPA Consent',
'Customer Date Created',
'Customer SMS Research Flag',
'Customer Email Research Flag',
'Customer Create Source',
'Vehicle ID',
'Vehicle Manufacturer ID',
'Vehicle Make',
'Vehicle Model Year From',
'Vehicle Model Year To',
'Vehicle Mobile App Flag',
'Warranty ID',
'Warranty Battery Model ID',
'Warranty Battery Size ID',
'Warranty Serial',
'Warranty Class',
'Warranty Plate Number',
'Warranty Status',
'Warranty Date Created',
'Warranty Date Purchased',
'Warranty Expiry Date',
'Warranty Date Claimed',
'Warranty SAP Battery ID',
'Warranty Claim ID',
'Warranty First Name',
'Warranty Last Name',
'Warranty Mobile Number',
'Warranty Is Activated?',
'Warranty Privacy Policy Number',
'Warranty Email Address',
'Warranty Vehicle ID',
'Warranty Customer ID',
'Warranty File Invoice',
'Warranty File Card',
'Warranty Vehicle Model Year',
'Warranty Odometer',
'Warranty Dealer Branch Code',
'Warranty Dealer Name',
'Warranty Dealer Address',
'Warranty Contact Number',
'Warranty Customer Address',
'Warranty Customer Date Purchase',
'Warranty Is Validated?',
'Warranty Province ID',
'Warranty Municipality ID',
'Warranty Create Source',
]);
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;
}
/**
* @Menu(selected="outlet_list")
*/
public function hubFilterForm()
{
$this->denyAccessUnlessGranted('report.hub.filter', null, 'No access.');
return $this->render('report/hub-filter/form.html.twig');
}
public function hubFilterSubmit(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->getHubFilterData($req, $em, $raw_date_start, $raw_date_end);
$resp = new StreamedResponse();
$resp->setCallback(function() use ($data) {
// csv output
$csv_handle = fopen('php://output', 'w+');
fputcsv($csv_handle, [
'Filtered Hub ID',
'Hub Name',
'Job Order ID',
'Customer ID',
'Customer Last Name',
'Customer First Name',
'Customer Mobile Number',
'Date Created',
'Reason',
'Date of Rejection',
]);
foreach ($data as $row)
{
fputcsv($csv_handle, $row);
}
fclose($csv_handle);
});
$filename = 'hub_filter_' . $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(Request $req, EntityManagerInterface $em)
{
$bm_hash = $this->loadBatteryModels($em);
$bs_hash = $this->loadBatterySizes($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);
$date_start->setTime(0,0);
$date_end->setTime(23,59);
// convert to string in the correct format so we can plug it in the query
$str_date_start = $date_start->format('Y-m-d H:i:s');
$str_date_end = $date_end->format('Y-m-d H:i:s');
$results = [];
$conn = $em->getConnection();
$sql = 'SELECT w.id AS w_id, w.serial, w.warranty_class, w.plate_number,
w.status, w.date_create as 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,
w.email as w_email, w.vehicle_id, w.customer_id, w.file_invoice,
w.file_warr_card, w.v_model_year, w.odometer, w.dealer_name,
w.dealer_address, w.dealer_branch_code, w.contact_num, w.cust_address,
w.date_purchase_cust, w.flag_validated, w.province_id,
w.municipality_id, w.create_source AS w_create_source, c.id AS c_id,
c.first_name AS c_fname, c.last_name AS c_lname, c.flag_confirmed,
c.customer_classification, c.flag_mobile_app, c.title, c.flag_active,
c.phone_mobile, c.phone_landline, c.phone_office, c.phone_fax,
c.email AS c_email, c.customer_notes, c.priv_third_party, c.priv_promo,
c.flag_csat, c.policy_mobile_app_id, c.policy_third_party_id,
c.policy_promo_id, c.flag_dpa_consent, c.date_create AS c_date_create,
c.flag_research_sms, c.flag_research_email, c.create_source AS c_create_source,
v.id AS v_id, v.manufacturer_id, v.make, v.model_year_from,
v.model_year_to, v.flag_mobile
FROM warranty w LEFT JOIN customer c ON w.customer_id = c.id
LEFT JOIN vehicle v ON w.vehicle_id = v.id
WHERE w.date_create >= :start_date
AND w.date_create <= :end_date';
$stmt = $conn->prepare($sql);
$stmt->execute(['start_date' => $str_date_start, 'end_date' => $str_date_end]);
$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[] = [
'cust_id' => $row['c_id'],
'cust_first_name' => $row['c_fname'],
'cust_last_name' => $row['c_lname'],
'cust_flag_confirm' => $row['flag_confirmed'],
'cust_classification' => $row['customer_classification'],
'cust_flag_mobile_app' => $row['flag_mobile_app'],
'cust_title' => $row['title'],
'cust_flag_active' => $row['flag_active'],
'cust_phone_mobile' => $row['phone_mobile'],
'cust_phone_landline' => $row['phone_landline'],
'cust_phone_office' => $row['phone_office'],
'cust_phone_fax' => $row['phone_fax'],
'cust_email' => $row['c_email'],
'cust_notes' => $row['customer_notes'],
'cust_priv_third_party' => $row['priv_third_party'],
'cust_priv_promo' => $row['priv_promo'],
'cust_flag_csat' => $row['flag_csat'],
'cust_policy_mobile_app_id' => $row['policy_mobile_app_id'],
'cust_policy_third_party_id' => $row['policy_third_party_id'],
'cust_policy_promo_id' => $row['policy_promo_id'],
'cust_flag_dpa_consent' => $row['flag_dpa_consent'],
'cust_date_create' => $row['c_date_create'],
'cust_flag_research_sms' => $row['flag_research_sms'],
'cust_flag_research_email' => $row['flag_research_email'],
'cust_create_source' => $row['c_create_source'],
'v_id' => $row['v_id'],
'v_manufacturer_id' => $row['manufacturer_id'],
'v_make' => $row['make'],
'v_model_year_from' => $row['model_year_from'],
'v_model_year_to' => $row['model_year_to'],
'v.flag_mobile' => $row['flag_mobile'],
'warr_id' => $row['w_id'],
'warr_battery_model' => $bmodel_name,
'warr_battery_size' => $bsize_name,
'warr_serial' => $row['serial'],
'warr_class' => $row['warranty_class'],
'warr_plate_number' => $row['plate_number'],
'warr_status' => $row['status'],
'warr_date_create' => $row['w_date_create'],
'warr_date_purchase' => $row['date_purchase'],
'warr_date_expire' => $row['date_expire'],
'warr_date_claim' => $row['date_claim'],
'warr_sap_bty_id' => $row['sap_bty_id'],
'warr_claim_id' => $row['claim_id'],
'warr_first_name' => $row['first_name'],
'warr_last_name' => $row['last_name'],
'warr_mobile_number' => $row['mobile_number'],
'warr_flag_activated' => (boolean) $row['flag_activated'],
'warr_privacy_policy' => $row['warranty_privacy_policy'],
'warr_email' => $row['w_email'],
'warr_vehicle_id' =>$row['vehicle_id'],
'warr_customer_id' => $row['customer_id'],
'warr_file_invoice' => $row['file_invoice'],
'warr_file_warr_card' => $row['file_warr_card'],
'warr_v_model_year' => $row['v_model_year'],
'warr_odometer' => $row['odometer'],
'warr_dealer_branch_code' => $row['dealer_branch_code'],
'warr_dealer_name' => $row['dealer_name'],
'warr_dealer_address' => $row['dealer_address'],
'warr_contact_number' => $row['contact_num'],
'warr_customer_address' => $row['cust_address'],
'warr_customer_date_purchase' => $row['date_purchase_cust'],
'warr_flag_validated' => $row['flag_validated'],
'warr_province_id' => $row['province_id'],
'warr_municipality_id' => $row['municipality_id'],
'warr_create_source' => $row['w_create_source'],
];
}
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 getHubFilterData($req, $em, $raw_date_start, $raw_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');
// pdo connection. Table gets big very fast.
$db = $em->getConnection();
// get hub filter logs
$sql = 'SELECT hf.hub_filtered_id, h.name, hf.jo_id, hf.customer_id, c.last_name, c.first_name, c.phone_mobile, hf.date_create, hf.filter_type_id FROM hub_filter_log hf, hub h, customer c WHERE hf.hub_filtered_id=h.id AND c.id=hf.customer_id AND hf.date_create >= :date_start AND hf.date_create <= :date_end ORDER BY hf.date_create';
$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))
{
$result[] = [
$row[0], // filtered hub id
$row[1], // hub name
$row[2], // job order id
$row[3], // customer id
$row[4], // customer last name
$row[5], // customer first name
$row[6], // customer mobile
$row[7], // date create
$row[8], // filter type id
$row[7], // date of rejection
];
}
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;
}
}