From 2a811037736afef29a531ad9318e25a4b9125a49 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Mon, 16 Sep 2019 10:47:48 +0000 Subject: [PATCH 1/3] Add method and form for the report. #267 --- config/acl.yaml | 2 + config/routes/report.yaml | 10 ++++ src/Controller/ReportController.php | 79 +++++++++++++++++++++++++++++ templates/base.html.twig | 8 +++ templates/report/meh/form.html.twig | 50 ++++++++++++++++++ 5 files changed, 149 insertions(+) create mode 100644 templates/report/meh/form.html.twig diff --git a/config/acl.yaml b/config/acl.yaml index 64b53ad1..f48850f6 100644 --- a/config/acl.yaml +++ b/config/acl.yaml @@ -292,6 +292,8 @@ access_keys: label: Battery Conflict Report - id: report.popapp.comparison label: Popapp Comparison Report + - id: report.meh.customer + label: RESQ MEH Customer Report - id: service label: Other Services diff --git a/config/routes/report.yaml b/config/routes/report.yaml index 274a1268..5d815490 100644 --- a/config/routes/report.yaml +++ b/config/routes/report.yaml @@ -37,3 +37,13 @@ rep_popapp_export_csv: path: /report/popapp_export controller: App\Controller\ReportController::popappExportCSV methods: [POST] + +rep_resq_meh_form: + path: /report/meh_customer + controller: App\Controller\ReportController::mehCustomerForm + methods: [GET] + +rep_resq_meh_export_csv: + path: /report/meh_customer_export + controller: App\Controller\ReportController::mehCustomerExportCSV + methods: [POST] diff --git a/src/Controller/ReportController.php b/src/Controller/ReportController.php index 0c1ea33a..de2748bb 100644 --- a/src/Controller/ReportController.php +++ b/src/Controller/ReportController.php @@ -13,6 +13,7 @@ use App\Entity\JobOrder; use App\Entity\Warranty; use App\Entity\CustomerVehicle; use App\Entity\MobileSession; +use App\Entity\Customer; use Doctrine\ORM\Query; use Doctrine\ORM\QueryBuilder; @@ -26,6 +27,7 @@ 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; @@ -494,6 +496,55 @@ class ReportController extends Controller } + /** + * @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 = 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', + '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; + } + protected function processPopappFile(UploadedFile $csv_file, EntityManagerInterface $em) { // attempt to open file @@ -620,4 +671,32 @@ class ReportController extends Controller return $results; } + protected function getMEHCustomerData(EntityManagerInterface $em) + { + $results = []; + + //get the policy id for the mobile privacy policy from env + $dotenv = new Dotenv(); + $dotenv->loadEnv(__DIR__.'/../../.env'); + + $policy_mobile_id = $_ENV['POLICY_MOBILE']; + + // get all the customers with mobile privacy policy id + $customers = $em->getRepository(Customer::class)->findBy(['privpol_mobile_app' => $policy_mobile_id]): + + foreach ($customers as $customer) + { + // get plate numbers + $plate_numbers = $customer->getPlateNumberList(); + + // using plate number, get all customer vehicles with the plate number and the job orders with the plate number + + // get job orders of vehicles + + // check if source is not null. If not null, add customer to results + } + + return $results; + } + } diff --git a/templates/base.html.twig b/templates/base.html.twig index 9052bb17..d1875e70 100644 --- a/templates/base.html.twig +++ b/templates/base.html.twig @@ -157,6 +157,14 @@ Popapp Comparison Report + + + + + + RESQ MEH Customer Report + + diff --git a/templates/report/meh/form.html.twig b/templates/report/meh/form.html.twig new file mode 100644 index 00000000..8cfd9570 --- /dev/null +++ b/templates/report/meh/form.html.twig @@ -0,0 +1,50 @@ +{% extends 'base.html.twig' %} + +{% block body %} + +
+
+
+

+ RESQ MEH Customer Report +

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

+ Generate Customer CSV File +

+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+{% endblock %} + From 4a50729a4103ddc709534dfa6b876b5fe754a3a9 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Mon, 16 Sep 2019 15:28:53 +0000 Subject: [PATCH 2/3] Create command to generate report. #267 --- .../GenerateMEHCustomerReportCommand.php | 115 ++++++++++++++++++ src/Controller/ReportController.php | 53 +++++++- src/Entity/CustomerVehicle.php | 7 ++ 3 files changed, 169 insertions(+), 6 deletions(-) create mode 100644 src/Command/GenerateMEHCustomerReportCommand.php diff --git a/src/Command/GenerateMEHCustomerReportCommand.php b/src/Command/GenerateMEHCustomerReportCommand.php new file mode 100644 index 00000000..5d032937 --- /dev/null +++ b/src/Command/GenerateMEHCustomerReportCommand.php @@ -0,0 +1,115 @@ +em = $om; + + parent::__construct(); + } + + protected function configure() + { + $this->setName('customer:generateMEHReport') + ->setDescription('Generate MEH Customer Report.') + ->setHelp('Generate MEH Customer Report.'); + } + + protected function execute(InputInterface $input, OutputInterface $output) + { + $customer_outfile = fopen('/tmp/meh_customer_report.csv', 'w'); + + $data = $this->getMEHCustomerData($output); + + foreach($data as $row) + { + $line = $row['last_name'] . ',' . $row['first_name'] . ',' . + $row['cust_mobile_number'] . ',' . $row['landline_number'] . ',' . + $row['office_number'] . ',' . $row['fax_number'] . ',' . + $row['date_mobile'] . ',' . $row['mobile_number']; + $output->writeln("Writing " . $line); + fwrite($customer_outfile, $line . "\n"); + } + + fclose($customer_outfile); + + } + + protected function getMEHCustomerData($output) + { + $em = $this->em; + $results = []; + + $output->writeln("about to query"); + $rsm = new ResultSetMapping(); + + $query = $em->createNativeQuery('SELECT c.id, c.last_name, c.first_name, c.phone_mobile, c.phone_landline, + c.phone_office, c.phone_fax, 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 != \'mobile\'', $rsm); + + $results = $query->getResult(); + + $output->writeln("about to iterate"); + + foreach($results as $row) + { + // check if the source of the job order is not 'mobile' (meaning JO originated from MEH) + $output->writeln("checking job order source"); + //if ($row[0]->getSource() != 'mobile') + //{ + // $mobile_date = ''; + // $mobile_number = ''; + + // $mobile_session = $em->getRepository(MobileSession::class) + // ->findOneBy(['customer' => $row[1]->getID()], ['date_generated' => 'ASC']); + // if ($mobile_session != null) + // { + // $output->writeln("mobile session not null"); + // $mobile_date = $mobile_session->getDateGenerated()->format("d M Y"); + // $mobile_number = $mobile_session->getPhoneNumber(); + // } + + // $results[] = [ + // 'last_name' => $row[1]->getLastName(), + // 'first_name' => $row[1]->getFirstName(), + // 'cust_mobile_number' => $row[1]->getPhoneMobile(), + // 'landline_number' => $row[1]->getPhoneLandline(), + // 'office_number' => $row[1]->getPhoneOffice(), + // 'fax_number' => $row[1]->getPhoneFax(), + // 'date_mobile' => $mobile_date, + // 'mobile_number' => $mobile_number, + // ]; + //} + + //$this->em->detach($cv[0]); + //$this->em->detach($cv[1]); + } + + return $results; + } + +} diff --git a/src/Controller/ReportController.php b/src/Controller/ReportController.php index de2748bb..1a0a0c85 100644 --- a/src/Controller/ReportController.php +++ b/src/Controller/ReportController.php @@ -512,7 +512,7 @@ class ReportController extends Controller */ public function mehCustomerExportCSV(Request $req, EntityManagerInterface $em) { - $data = getMEHCustomerData($em); + $data = $this->getMEHCustomerData($em); $resp = new StreamedResponse(); $resp->setCallback(function() use ($data) { @@ -682,21 +682,62 @@ class ReportController extends Controller $policy_mobile_id = $_ENV['POLICY_MOBILE']; // get all the customers with mobile privacy policy id - $customers = $em->getRepository(Customer::class)->findBy(['privpol_mobile_app' => $policy_mobile_id]): + $customers = $em->getRepository(Customer::class)->findBy(['privpol_mobile_app' => $policy_mobile_id]); foreach ($customers as $customer) { // get plate numbers $plate_numbers = $customer->getPlateNumberList(); - // using plate number, get all customer vehicles with the plate number and the job orders with the plate number + // using plate number, get all customer vehicles with the plate numbers + //$cust_vehicles = $em->createQuery('SELECT cv from App\Entity\CustomerVehicle cv + // WHERE cv.plate_number in (:plate_numbers)') + // ->setParameter('plate_numbers', $plate_numbers) + // ->getResult(); + foreach ($plate_numbers as $plate_number) + { + $cust_vehicles = $em->getRepository(CustomerVehicle::class)->findBy(['plate_number' => $plate_number]); - // get job orders of vehicles + if ($cust_vehicles != null) + { + foreach($cust_vehicles as $cv) + { + // get the job orders for each cv + $job_orders = $cv->getJobOrders(); - // check if source is not null. If not null, add customer to results + foreach($job_orders as $jo) + { + // check if the source of the job order is not 'mobile' (meaning JO originated from MEH) + if ($jo->getSource() != 'mobile') + { + $mobile_date = ''; + $mobile_number = ''; + + $mobile_session = $em->getRepository(MobileSession::class) + ->findOneBy(['customer' => $customer->getID()], ['date_generated' => 'ASC']); + if ($mobile_session != null) + { + $mobile_date = $mobile_session->getDateGenerated()->format("d M Y"); + $mobile_number = $mobile_session->getPhoneNumber(); + } + + $results[] = [ + 'last_name' => $customer->getLastName(), + 'first_name' => $customer->getFirstName(), + 'cust_mobile_number' => $customer->getPhoneMobile(), + 'landline_number' => $customer->getPhoneLandline(), + 'office_number' => $customer->getPhoneOffice(), + 'fax_number' => $customer->getPhoneFax(), + 'date_mobile' => $mobile_date, + 'mobile_number' => $mobile_number, + ]; + } + } + } + } + } } return $results; } - } diff --git a/src/Entity/CustomerVehicle.php b/src/Entity/CustomerVehicle.php index 3af617ef..d73906fa 100644 --- a/src/Entity/CustomerVehicle.php +++ b/src/Entity/CustomerVehicle.php @@ -119,6 +119,8 @@ class CustomerVehicle public function __construct() { $this->flag_active = true; + + $this->job_orders = new ArrayCollection(); } public function getID() @@ -256,6 +258,11 @@ class CustomerVehicle return $this->curr_battery; } + public function getJobOrders() + { + return $this->job_orders; + } + public function setHasMotoliteBattery($flag_motolite_battery = true) { $this->flag_motolite_battery = $flag_motolite_battery; From bee8a0d9fecfa8e8906fea66cfc8e771fb0c4630 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Tue, 17 Sep 2019 03:32:37 +0000 Subject: [PATCH 3/3] Fix query to get customers for report. #267 --- .../GenerateMEHCustomerReportCommand.php | 115 ------------------ src/Controller/ReportController.php | 86 +++++-------- 2 files changed, 32 insertions(+), 169 deletions(-) delete mode 100644 src/Command/GenerateMEHCustomerReportCommand.php diff --git a/src/Command/GenerateMEHCustomerReportCommand.php b/src/Command/GenerateMEHCustomerReportCommand.php deleted file mode 100644 index 5d032937..00000000 --- a/src/Command/GenerateMEHCustomerReportCommand.php +++ /dev/null @@ -1,115 +0,0 @@ -em = $om; - - parent::__construct(); - } - - protected function configure() - { - $this->setName('customer:generateMEHReport') - ->setDescription('Generate MEH Customer Report.') - ->setHelp('Generate MEH Customer Report.'); - } - - protected function execute(InputInterface $input, OutputInterface $output) - { - $customer_outfile = fopen('/tmp/meh_customer_report.csv', 'w'); - - $data = $this->getMEHCustomerData($output); - - foreach($data as $row) - { - $line = $row['last_name'] . ',' . $row['first_name'] . ',' . - $row['cust_mobile_number'] . ',' . $row['landline_number'] . ',' . - $row['office_number'] . ',' . $row['fax_number'] . ',' . - $row['date_mobile'] . ',' . $row['mobile_number']; - $output->writeln("Writing " . $line); - fwrite($customer_outfile, $line . "\n"); - } - - fclose($customer_outfile); - - } - - protected function getMEHCustomerData($output) - { - $em = $this->em; - $results = []; - - $output->writeln("about to query"); - $rsm = new ResultSetMapping(); - - $query = $em->createNativeQuery('SELECT c.id, c.last_name, c.first_name, c.phone_mobile, c.phone_landline, - c.phone_office, c.phone_fax, 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 != \'mobile\'', $rsm); - - $results = $query->getResult(); - - $output->writeln("about to iterate"); - - foreach($results as $row) - { - // check if the source of the job order is not 'mobile' (meaning JO originated from MEH) - $output->writeln("checking job order source"); - //if ($row[0]->getSource() != 'mobile') - //{ - // $mobile_date = ''; - // $mobile_number = ''; - - // $mobile_session = $em->getRepository(MobileSession::class) - // ->findOneBy(['customer' => $row[1]->getID()], ['date_generated' => 'ASC']); - // if ($mobile_session != null) - // { - // $output->writeln("mobile session not null"); - // $mobile_date = $mobile_session->getDateGenerated()->format("d M Y"); - // $mobile_number = $mobile_session->getPhoneNumber(); - // } - - // $results[] = [ - // 'last_name' => $row[1]->getLastName(), - // 'first_name' => $row[1]->getFirstName(), - // 'cust_mobile_number' => $row[1]->getPhoneMobile(), - // 'landline_number' => $row[1]->getPhoneLandline(), - // 'office_number' => $row[1]->getPhoneOffice(), - // 'fax_number' => $row[1]->getPhoneFax(), - // 'date_mobile' => $mobile_date, - // 'mobile_number' => $mobile_number, - // ]; - //} - - //$this->em->detach($cv[0]); - //$this->em->detach($cv[1]); - } - - return $results; - } - -} diff --git a/src/Controller/ReportController.php b/src/Controller/ReportController.php index 1a0a0c85..72606601 100644 --- a/src/Controller/ReportController.php +++ b/src/Controller/ReportController.php @@ -675,69 +675,47 @@ class ReportController extends Controller { $results = []; - //get the policy id for the mobile privacy policy from env - $dotenv = new Dotenv(); - $dotenv->loadEnv(__DIR__.'/../../.env'); + $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, 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'; - $policy_mobile_id = $_ENV['POLICY_MOBILE']; + $stmt = $conn->prepare($sql); + $stmt->execute(array('source' => 'mobile_app')); - // get all the customers with mobile privacy policy id - $customers = $em->getRepository(Customer::class)->findBy(['privpol_mobile_app' => $policy_mobile_id]); + $query_results = $stmt->fetchAll(); - foreach ($customers as $customer) + foreach($query_results as $row) { - // get plate numbers - $plate_numbers = $customer->getPlateNumberList(); + $mobile_date = ''; + $mobile_number = ''; - // using plate number, get all customer vehicles with the plate numbers - //$cust_vehicles = $em->createQuery('SELECT cv from App\Entity\CustomerVehicle cv - // WHERE cv.plate_number in (:plate_numbers)') - // ->setParameter('plate_numbers', $plate_numbers) - // ->getResult(); - foreach ($plate_numbers as $plate_number) + $mobile_session = $em->getRepository(MobileSession::class) + ->findOneBy(['customer' => $row['id']], ['date_generated' => 'ASC']); + if ($mobile_session != null) { - $cust_vehicles = $em->getRepository(CustomerVehicle::class)->findBy(['plate_number' => $plate_number]); - - if ($cust_vehicles != null) - { - foreach($cust_vehicles as $cv) - { - // get the job orders for each cv - $job_orders = $cv->getJobOrders(); - - foreach($job_orders as $jo) - { - // check if the source of the job order is not 'mobile' (meaning JO originated from MEH) - if ($jo->getSource() != 'mobile') - { - $mobile_date = ''; - $mobile_number = ''; - - $mobile_session = $em->getRepository(MobileSession::class) - ->findOneBy(['customer' => $customer->getID()], ['date_generated' => 'ASC']); - if ($mobile_session != null) - { - $mobile_date = $mobile_session->getDateGenerated()->format("d M Y"); - $mobile_number = $mobile_session->getPhoneNumber(); - } - - $results[] = [ - 'last_name' => $customer->getLastName(), - 'first_name' => $customer->getFirstName(), - 'cust_mobile_number' => $customer->getPhoneMobile(), - 'landline_number' => $customer->getPhoneLandline(), - 'office_number' => $customer->getPhoneOffice(), - 'fax_number' => $customer->getPhoneFax(), - 'date_mobile' => $mobile_date, - 'mobile_number' => $mobile_number, - ]; - } - } - } - } + $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'], + 'date_mobile' => $mobile_date, + 'mobile_number' => $mobile_number, + ]; + } return $results; + } }