diff --git a/config/acl.yaml b/config/acl.yaml index 6da5b558..5e040130 100644 --- a/config/acl.yaml +++ b/config/acl.yaml @@ -348,6 +348,8 @@ access_keys: label: Customer Source Report - id: report.hub.filter label: Hub Filter Report + - id: report.jo.raffle + label: JO Raffle Report - id: service label: Other Services diff --git a/config/routes/report.yaml b/config/routes/report.yaml index bb9096b9..42dcbdc0 100644 --- a/config/routes/report.yaml +++ b/config/routes/report.yaml @@ -147,3 +147,13 @@ rep_hub_filter_submit: path: /report/hub_filter_report controller: App\Controller\ReportController::hubFilterSubmit methods: [POST] + +rep_jo_raffle_form: + path: /report/jo_raffle_report + controller: App\Controller\ReportController::joRaffleForm + methods: [GET] + +rep_jo_raffle_submit: + path: /report/jo_raffle_report + controller: App\Controller\ReportController::joRaffleSubmit + methods: [POST] diff --git a/src/Controller/ReportController.php b/src/Controller/ReportController.php index 51a874de..0d482f76 100644 --- a/src/Controller/ReportController.php +++ b/src/Controller/ReportController.php @@ -1222,6 +1222,62 @@ class ReportController extends Controller } + /** + * @Menu(selected="outlet_list") + */ + public function joRaffleForm() + { + $this->denyAccessUnlessGranted('report.jo.raffle', null, 'No access.'); + + return $this->render('report/jo-raffle/form.html.twig'); + } + + public function joRaffleSubmit(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->getJORaffleData($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, [ + 'Serial Number', + 'Product Name', + 'Transaction Number', // JO ID + 'Date', + 'Outlet', // Hub + 'Plate Number', + 'Warranty Class', + 'First Name', + 'Last Name', + 'Contact Number', + 'Email', + ]); + + foreach ($data as $row) + { + fputcsv($csv_handle, $row); + } + + fclose($csv_handle); + }); + + $filename = 'jo_raffle_' . $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 @@ -2598,4 +2654,88 @@ class ReportController extends Controller return $cust_ids; } + protected function getJORaffleData($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') . ' 00:00:00'; + $new_date_end = $date_end->format('Y-m-d H:i:s') . ' 23:59:59'; + + $db = $em->getConnection(); + + // get JOs that have been scheduled within the date range and are fulfilled + // and service type is battery sales + $jo_sql = 'SELECT jo.id AS jo_id, cv.warranty_code AS serial, jo.date_schedule AS date_schedule, + h.name AS hub_name, cv.plate_number AS plate_number, jo.warranty_class AS warranty_class, + c.first_name AS first_name, c.last_name AS last_name, c.phone_mobile AS mobile_number, + c.email AS email + FROM job_order jo, customer_vehicle cv, hub h, customer c + WHERE jo.cvehicle_id = cv.id + AND jo.customer_id = c.id + AND jo.hub_id = h.id + AND jo.status = :fulfilled + AND jo.service_type = :battery_sales + AND jo.date_schedule >= :date_start AND jo.date_schedule <= :date_end'; + $jo_stmt = $db->prepare($jo_sql); + $jo_stmt->bindValue('fulfilled', JOStatus::FULFILLED); + $jo_stmt->bindValue('battery_sales', ServiceType::BATTERY_REPLACEMENT_NEW); + $jo_stmt->bindValue('date_start', $new_date_start); + $jo_stmt->bindValue('date_end', $new_date_end); + + $jo_result = $jo_stmt->executeQuery(); + + $jo_data = []; + // go through rows + while($row = $jo_result->fetchAssociative()) + { + // need to get the battery ordered + $jo_id = $row['jo_id']; + + $b_sql = 'SELECT bmodel.name AS model_name, bsize.name AS size_name + FROM battery_model bmodel, battery_size bsize, battery b, + invoice i, invoice_item ii + WHERE b.model_id = bmodel.id + AND b.size_id = bsize.id + AND ii.invoice_id = i.id + AND ii.battery_id = b.id + AND i.job_order_id = :jo_id'; + + $b_stmt = $db->prepare($b_sql); + $b_stmt->bindValue('jo_id', $jo_id); + + $b_result = $b_stmt->executeQuery(); + + $b_data = []; + + $battery_name = ''; + while ($b_row = $b_result->fetchAssociative()) + { + $battery_name = $b_row['model_name'] . ' / ' . $b_row['size_name']; + } + + // get the date from the date schedule + $date_array = explode(' ' , $row['date_schedule']); + $date_schedule = $date_array[0]; + + $jo_data[] = [ + 'serial' => $row['serial'], + 'product_name' => $battery_name, + 'jo_id' => $jo_id, + 'date' => $date_schedule, + 'hub' => $row['hub_name'], + 'plate_number' => $row['plate_number'], + 'warranty_class' => $row['warranty_class'], + 'first_name' => $row['first_name'], + 'last_name' => $row['last_name'], + 'contact_number' => $row['mobile_number'], + 'email' => $row['email'] + ]; + } + + return $jo_data; + } + + } diff --git a/templates/base.html.twig b/templates/base.html.twig index ab5dfb77..7ef88f4f 100644 --- a/templates/base.html.twig +++ b/templates/base.html.twig @@ -182,6 +182,16 @@ +