diff --git a/config/acl.yaml b/config/acl.yaml index 1546a0d9..50ebbfb3 100644 --- a/config/acl.yaml +++ b/config/acl.yaml @@ -298,6 +298,10 @@ access_keys: label: RESQ MEH Customer Report - id: report.warranty.class label: Warranty Class Report + - id: report.call.volume + label: Call Volume Report + - id: report.rider.volume + label: Per Rider Volume Report - id: service label: Other Services diff --git a/config/routes/report.yaml b/config/routes/report.yaml index f847cfe5..9f367be0 100644 --- a/config/routes/report.yaml +++ b/config/routes/report.yaml @@ -57,3 +57,23 @@ rep_warranty_class_export_csv: path: /report/warranty_class_report controller: App\Controller\ReportController::warrantyClassExportCSV methods: [POST] + +rep_call_volume_form: + path: /report/call_volume_report + controller: App\Controller\ReportController::callVolumeForm + methods: [GET] + +rep_call_volume_export_csv: + path: /report/call_volume_report + controller: App\Controller\ReportController::callVolumeExportCSV + methods: [POST] + +rep_per_rider_volume_form: + path: /report/per_rider_volume_report + controller: App\Controller\ReportController::perRiderVolumeForm + methods: [GET] + +rep_per_rider_volume_export_csv: + path: /report/per_rider_volume_report + controller: App\Controller\ReportController::perRiderVolumeExportCSV + methods: [POST] diff --git a/src/Controller/ReportController.php b/src/Controller/ReportController.php index d1bd1bcd..7a7687ea 100644 --- a/src/Controller/ReportController.php +++ b/src/Controller/ReportController.php @@ -14,6 +14,7 @@ use App\Entity\Warranty; use App\Entity\CustomerVehicle; use App\Entity\MobileSession; use App\Entity\Customer; +use App\Entity\Rider; use Doctrine\ORM\Query; use Doctrine\ORM\QueryBuilder; @@ -27,7 +28,6 @@ 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 Symfony\Component\Dotenv\Dotenv; use Catalyst\MenuBundle\Annotation\Menu; @@ -614,6 +614,99 @@ class ReportController extends Controller } + /** + * @Menu(selected="outlet_list") + */ + public function callVolumeForm() + { + $this->denyAccessUnlessGranted('report.call.volume', null, 'No access.'); + $params['mode'] = 'form'; + + return $this->render('report/call-volume/form.html.twig', $params); + } + + /** + * @Menu(selected="outlet_list") + */ + public function callVolumeExportCSV(Request $req, EntityManagerInterface $em) + { + $data = $this->getCallVolumeData($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', + 'Plate Number', + 'Service Type', + 'Source', + 'Status', + ]); + foreach ($data as $row) + { + fputcsv($csv_handle, $row); + } + + fclose($csv_handle); + }); + + $filename = 'call_volume_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 perRiderVolumeForm() + { + $this->denyAccessUnlessGranted('report.rider.volume', null, 'No access.'); + $params['mode'] = 'form'; + + return $this->render('report/per-rider-volume/form.html.twig', $params); + } + + /** + * @Menu(selected="outlet_list") + */ + public function perRiderVolumeExportCSV(Request $req, EntityManagerInterface $em) + { + $data = $this->getPerRiderVolumeData($em); + + $resp = new StreamedResponse(); + $resp->setCallback(function() use ($data) { + // csv output + $csv_handle = fopen('php://output', 'w+'); + fputcsv($csv_handle, [ + ]); + foreach ($data as $row) + { + fputcsv($csv_handle, $row); + } + + fclose($csv_handle); + }); + + $filename = 'per_rider_volume_report' . '.csv'; + + $resp->setStatusCode(200); + $resp->headers->set('Content-Type', 'text/csv; charset=utf-8'); + $resp->headers->set('Content-Disposition', 'attachment; filename="' . $filename . '"'); + + return $resp; + + } + protected function processPopappFile(UploadedFile $csv_file, EntityManagerInterface $em) { // attempt to open file @@ -915,4 +1008,122 @@ class ReportController extends Controller return $data; } + + protected function getCallVolumeData(EntityManagerInterface $em) + { + $results = []; + + // get job orders with source = 'call' + //$jo_query = $em->createQuery('select jo from App\Entity\JobOrder jo where jo.source = :source_type') + // ->setParameter('source_type', self::SOURCE_TYPE_CALL); + //$jos = $jo_query->iterate(); + + $conn = $em->getConnection(); + $sql = 'SELECT c.last_name, c.first_name, + jo.source, jo.service_type, jo.status, + vmanu.name AS manufacturer_name, v.make, + cv.model_year, cv.plate_number + FROM job_order jo, customer c, + customer_vehicle cv, vehicle v, + vehicle_manufacturer vmanu + WHERE c.id = cv.customer_id + AND jo.cvehicle_id = cv.id + AND cv.vehicle_id = v.id + AND v.manufacturer_id = vmanu.id + AND jo.source = :source'; + + $stmt = $conn->prepare($sql); + $stmt->execute(array('source' => 'call')); + + $query_results = $stmt->fetchAll(); + + foreach($query_results as $row) + { + $results[] = [ + 'cust_last_name' => $row['last_name'], + 'cust_first_name' => $row['first_name'], + 'cust_vehicle_manu' => $row['manufacturer_name'], + 'cust_vehicle_make' => $row['make'], + 'cust_vehicle_year' => $row['model_year'], + 'cust_plate_number' => $row['plate_number'], + 'service_type' => $row['service_type'], + 'source' => $row['source'], + 'status' => $row['status'], + ]; + /* + $jo = $jorow[0]; + error_log('Processing job order ' . $jo->getID()); + + // get customer info + $last_name = $jo->getCustomer()->getLastName(); + $first_name = $jo->getCustomer()->getFirstName(); + + // get customer vehicle info + $cv_manufacturer = $jo->getCustomerVehicle()->getVehicle()->getManufacturer()->getName(); + $cv_make = $jo->getCustomerVehicle()->getVehicle()->getMake(); + $cv_model_year = $jo->getCustomerVehicle()->getModelYear(); + $cv_plate_number = $jo->getCustomerVehicle()->getPlateNumber(); + + // get job order info + $service_type = $jo->getServiceType(); + $source = $jo->getSource(); + $status = $jo->getStatus(); + + // get hub name, if any + $hub_name = ''; + $hub = $jo->getHub(); + if ($hub != null) + { + $hub_name = $jo->getHub()->getName(); + } + + $results[] = [ + 'cust_last_name' => $last_name, + 'cust_first_name' => $first_name, + 'cust_vehicle_manu' => $cv_manufacturer, + 'cust_vehicle_make' => $cv_make, + 'cust_vehicle_year' => $cv_model_year, + 'cust_plate_number' => $cv_plate_number, + 'service_type' => $service_type, + 'hub_name' => $hub_name, + 'source' => $source, + 'status' => $status, + ]; + + $em->clear(); + */ + } + + return $results; + } + + protected function getPerRiderVolumeData(EntityManagerInterface $em) + { + $results = []; + + // get riders + $riders = $em->getRepository(Rider::class)->findAll(); + + foreach($riders as $rider) + { + error_log('Processing rider ' . $rider->getID()); + // get rider information + $last_name = $rider->getLastName(); + $first_name = $rider->getFirstName(); + + // get rider's job orders + $rider_jos = $rider->getJobOrders(); + + foreach($rider_jos as $jo) + { + error_log('Processing job order ' . $jo->getID()); + + // TODO: process report data for per rider volume + } + + $em->clear(); + } + + return $results; + } } diff --git a/src/Entity/Rider.php b/src/Entity/Rider.php index 0f5a3116..f2f2e37e 100644 --- a/src/Entity/Rider.php +++ b/src/Entity/Rider.php @@ -319,4 +319,9 @@ class Rider { return $this->sessions; } + + public function getJobOrders() + { + return $this->job_orders; + } } diff --git a/templates/base.html.twig b/templates/base.html.twig index c6f1b9d5..8ebf269c 100644 --- a/templates/base.html.twig +++ b/templates/base.html.twig @@ -149,7 +149,7 @@ diff --git a/templates/report/call-volume/form.html.twig b/templates/report/call-volume/form.html.twig new file mode 100644 index 00000000..4baf3398 --- /dev/null +++ b/templates/report/call-volume/form.html.twig @@ -0,0 +1,50 @@ +{% extends 'base.html.twig' %} + +{% block body %} + +
+
+
+

+ Call Volume Report +

+
+
+
+ +
+ +
+
+
+
+
+
+ + + +

+ Generate Call Volume CSV File +

+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+{% endblock %} + diff --git a/templates/report/per-rider-volume/form.html.twig b/templates/report/per-rider-volume/form.html.twig new file mode 100644 index 00000000..e3b48f47 --- /dev/null +++ b/templates/report/per-rider-volume/form.html.twig @@ -0,0 +1,50 @@ +{% extends 'base.html.twig' %} + +{% block body %} + +
+
+
+

+ Per Rider Volume Report +

+
+
+
+ +
+ +
+
+
+
+
+
+ + + +

+ Generate Per Rider Volume CSV File +

+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+{% endblock %} +