From ac56f59350689ca02a38b6eba65e1f8e45107e8f Mon Sep 17 00:00:00 2001 From: heama Date: Wed, 21 Feb 2024 17:17:34 +0530 Subject: [PATCH] dashboard-report-subscription --- app/Controllers/Invoice.php | 149 +++++++++++++++----- app/Models/InvoiceModel.php | 9 +- app/Views/customer_form.php | 8 +- app/Views/dashboard.php | 180 ++++++++----------------- app/Views/invoice_pdf_template.php | 6 +- app/Views/report_book_publish.php | 171 +++++++++++++---------- app/Views/report_expired_customers.php | 80 ++++++----- app/Views/report_general_invoice.php | 85 +++++++----- app/Views/report_itemwise.php | 165 ++++++++++++----------- app/Views/template/header.php | 2 +- app/Views/user_form.php | 1 + 11 files changed, 466 insertions(+), 390 deletions(-) diff --git a/app/Controllers/Invoice.php b/app/Controllers/Invoice.php index 2f0b6b36..1e826af3 100644 --- a/app/Controllers/Invoice.php +++ b/app/Controllers/Invoice.php @@ -291,15 +291,33 @@ class Invoice extends BaseController 'created_by' =>get_logged_user_id(), 'is_renew' => $renewal ]; - + if ($invoice_status == 'Draft') { $get_subscription_draft_dtl_where = ['S.customer_id'=>$customer_id,'I.status'=>$invoice_status]; // $get_subscription_draft_dtl_id = $model->InactiveSubscriptionDraftDetails($get_subscription_draft_dtl_where,get_logged_user_id()); // $this->logger->info($msg_flag_name.": has been Inactived. Inv ID = ".implode(", ", $get_subscription_draft_dtl_id)); $get_subscription_draft_dtl_id = $model->deleteSubscriptionDraftDetails($get_subscription_draft_dtl_where,get_logged_user_id()); $this->logger->info($msg_flag_name.": has been Deleted. Inv ID = ".implode(", ", $get_subscription_draft_dtl_id)); - $subscriptionModel->insertSubscriptionData($subscription_data); + // $subscriptionModel->insertSubscriptionData($subscription_data); + } + else{ + // Check if there is a draft entry for the customer_id and scheme_id + $get_subscription_draft_dtl_where = [ + 'S.customer_id' => $customer_id, + 'S.scheme_id' => $scheme_id, // Assuming scheme_id is available here + 'I.status' => 'Draft' + ]; + + $get_subscription_draft_dtl_id = $model->deleteSubscriptionDraftDetails($get_subscription_draft_dtl_where, get_logged_user_id()); + + $this->logger->info($msg_flag_name . ": Draft entry has been deleted. Inv ID = " . implode(", ", $get_subscription_draft_dtl_id)); + + // Now insert the new entry + } } + $subscriptionModel->insertSubscriptionData($subscription_data); + } + ## Notification For Approve.. $this->logger->info($msg_flag_name.": ID = " . $invoice_id.", Status =".$invoice_status); @@ -735,18 +753,21 @@ $encodedUrl = urlencode($url); $toDate = $dateParts[1]; // Update date conversion format using the global namespace - $fromDate = \DateTime::createFromFormat('d/m/Y', $fromDate)->format('Y-m-d'); - $toDate = \DateTime::createFromFormat('d/m/Y', $toDate)->format('Y-m-d'); - + $fromDate = \DateTime::createFromFormat('d/m/Y', $dateParts[0])->format('Y-m-d'); + $toDate = \DateTime::createFromFormat('d/m/Y', $dateParts[1])->format('Y-m-d'); + // Debugging statements for date range - var_dump($fromDate, $toDate); + // var_dump($fromDate, $toDate);die; $data['report_data'] = $model->get_general_invoice_data($fromDate, $toDate); - $data['selected_data'] = $this->request->getVar('date'); + $data['selected_data'] = ($this->request->getVar('date')) ? $this->request->getVar('date') : ''; + // var_dump( $data['selected_data']);die; + } + // Debugging statement for report data - // var_dump($data['report_data']); + // print_r($data['selected_data']);die; $data['page_name'] = 'Sales Report'; $this->render_page('report_general_invoice', $data); @@ -786,7 +807,7 @@ $encodedUrl = urlencode($url); { $model = new InvoiceModel(); $data['expired_customers'] = $model->getExpiredCustomers(); - + $data['selected_data'] = ""; $this->logger->info("'Membership Renewals Report'"); $data['page_name'] = 'Membership Renewals Report'; $this->render_page('report_expired_customers', $data); @@ -797,10 +818,11 @@ $encodedUrl = urlencode($url); $fromDate = $dateParts[0]; $toDate = $dateParts[1]; - $dateTime = \DateTime::createFromFormat('m/d/Y', $fromDate); - $dateTime1 = \DateTime::createFromFormat('m/d/Y', $toDate); + $dateTime = \DateTime::createFromFormat('d/m/Y', $fromDate); + $dateTime1 = \DateTime::createFromFormat('d/m/Y', $toDate); $model = new InvoiceModel(); $data['expired_customers'] = $model->getExpiredCustomers( $dateTime->format('Y-m-d') , $dateTime1->format('Y-m-d') ); + $data['selected_data'] = $this->request->getVar('date'); $this->logger->info("Itemwise Report "); $this->logger->info("'Membership Renewals Report'"); $data['page_name'] = 'Membership Renewals Report'; @@ -808,33 +830,85 @@ $encodedUrl = urlencode($url); } } - public function itemwise_report() - { - if($this->request->getmethod() == 'get') - { +public function itemwise_report() +{ + if ($this->request->getmethod() == 'get') + { + $model = new InvoiceModel(); + $data['report_data'] = $model->itemwise_report_data(); + $this->logger->info("Itemwise Report "); + $data['page_name'] = 'Bookswise Report'; + $this->render_page('report_itemwise', $data); + } + else + { + if ($this->request->getPost('export_csv')) { + // Handle CSV export + $this->exportCsv(); + } else { + // Handle date range filter + + $model = new InvoiceModel(); $data['report_data'] = $model->itemwise_report_data(); $this->logger->info("Itemwise Report "); - $data['page_name'] = 'Bookswise Report'; - $this->render_page('report_itemwise', $data); - } - else - { - $dateParts = explode(' - ', $this->request->getVar('date') ); - $fromDate = $dateParts[0]; - $toDate = $dateParts[1]; - - $dateTime = \DateTime::createFromFormat('m/d/Y', $fromDate); - $dateTime1 = \DateTime::createFromFormat('m/d/Y', $toDate); - $model = new InvoiceModel(); - $data['report_data'] = $model->itemwise_report_data( $dateTime->format('Y-m-d') , $dateTime1->format('Y-m-d') ); - $this->logger->info("Itemwise Report "); $data['page_name'] = 'Bookswise Report'; - $data['selected_data'] = $this->request->getVar('date'); + $this->exportCsv(); $this->render_page('report_itemwise', $data); } - } +} + +private function exportCsv() +{ + $model = new InvoiceModel(); + $reportData = $model->itemwise_report_data(); + + $csvFileName = 'itemwise_report.csv'; + + // Set appropriate headers for CSV download + header('Content-Type: text/csv; charset=UTF-8'); + header('Content-Disposition: attachment; filename="' . $csvFileName . '"'); + header('Pragma: no-cache'); + header('Expires: 0'); + + // Open a PHP output stream for writing CSV data + $output = fopen('php://output', 'w'); + + // Add UTF-8 BOM to the CSV file + fprintf($output, chr(0xEF).chr(0xBB).chr(0xBF)); + + // Write the CSV headers + fputcsv($output, ['Publisher Code', 'Book Name', 'Item Count', 'Total Cost']); + + // Write the CSV data + foreach ($reportData as $row) { + foreach ($row->books as $book) { + $rowData = [ + $row->publisher_code, + $book->book_name, + $book->item_count, + $book->total_cost, + ]; + + // Convert each field to UTF-8 using iconv + $rowData = array_map(function ($field) { + return iconv('UTF-8', 'UTF-8//IGNORE', $field); + }, $rowData); + + fputcsv($output, $rowData); + } + } + + // Close the PHP output stream + fclose($output); + + // Terminate the script to prevent further output + exit(); +} + + + private function calculateTotalBookQuantity(&$reportData) { // Calculate the total book quantity for each publisher @@ -849,8 +923,9 @@ $encodedUrl = urlencode($url); { $model = new InvoiceModel(); $data['report_data'] = $model->itemwise_report_data_with_publish_code(); + $data['selected_data'] = ""; $this->logger->info("Itemwise Report "); - $data['page_name'] = 'Bookswise Report'; + $data['page_name'] = 'Books Published'; // print_r($data);die; $this->render_page('report_book_publish', $data); } @@ -858,14 +933,14 @@ $encodedUrl = urlencode($url); { $dateParts = explode(' - ', $this->request->getVar('date') ); $fromDate = $dateParts[0]; - $toDate = $dateParts[1]; - - $dateTime = \DateTime::createFromFormat('m/d/Y', $fromDate); - $dateTime1 = \DateTime::createFromFormat('m/d/Y', $toDate); + + $toDate = $dateParts[1]; + $dateTime = \DateTime::createFromFormat('d/m/Y', $fromDate); + $dateTime1 = \DateTime::createFromFormat('d/m/Y', $toDate); $model = new InvoiceModel(); $data['report_data'] = $model->itemwise_report_data_with_publish_code( $dateTime->format('Y-m-d') , $dateTime1->format('Y-m-d') ); $this->logger->info("Itemwise Report "); - $data['page_name'] = 'Bookswise Report'; + $data['page_name'] = 'Books Published'; $data['selected_data'] = $this->request->getVar('date'); $this->render_page('report_book_publish', $data); } diff --git a/app/Models/InvoiceModel.php b/app/Models/InvoiceModel.php index f4f91763..140ab62c 100644 --- a/app/Models/InvoiceModel.php +++ b/app/Models/InvoiceModel.php @@ -399,25 +399,24 @@ public function get_mem_invoice_data($f_date = null, $t_date = null) // return $result; // } -public function itemwise_report_data($f_date = null, $t_date = null) +public function itemwise_report_data() { // Fetch invoice data $query = $this->db->table('invoice') ->select('books.publishers_code, COUNT(invoiceitems.product) as publisher_item_count, books.title as book_name, COUNT(invoiceitems.product) as item_count, SUM(invoiceitems.quantity * invoiceitems.unit_price) as total_cost') ->where('invoice.isactive', 1) + ->where('invoice.invoice_type',1) ->where('books.isactive', 1); // Add date range filter if provided - if ($f_date !== null && $t_date !== null) { - $query->where('invoice.invoice_date >=', $f_date) - ->where('invoice.invoice_date <=', $t_date); - } + $result = $query->join('invoiceitems', 'invoiceitems.invoice_id = invoice.invoice_id', 'left') ->join('books', 'books.book_id = invoiceitems.product', 'left') ->groupBy('books.publishers_code, books.title') ->get() ->getResult(); + // print_r($result); // Group by publisher_code and include books $groupedResult = []; diff --git a/app/Views/customer_form.php b/app/Views/customer_form.php index 0f5356a9..eb41b5f5 100644 --- a/app/Views/customer_form.php +++ b/app/Views/customer_form.php @@ -272,10 +272,12 @@ - subscription_in_days; - $fromDateTime = (new DateTime($subscription->from_subscription))->format('Y-m-d'); - $toDateTime = (new DateTime($subscription->to_subscription))->format('Y-m-d'); + $fromDateTime = (new DateTime($subscription->formatted_from_subscription))->format('Y-m-d'); + $toDateTime = (new DateTime($subscription->formatted_from_subscription))->format('Y-m-d'); $currentDate = (new DateTime())->format('Y-m-d'); if ($currentDate === $toDateTime) { $class = 'text-danger'; diff --git a/app/Views/dashboard.php b/app/Views/dashboard.php index 5171f9d8..b3150fe2 100644 --- a/app/Views/dashboard.php +++ b/app/Views/dashboard.php @@ -1,49 +1,5 @@ - +
@@ -142,72 +98,13 @@
+ - - - +
@@ -247,6 +144,7 @@ New :
Renewed:
+
@@ -302,7 +200,56 @@ + +
+
+
+ + + +

+ +
+
+
+ + +
+
+

+

Total Subscriber

+
+ +
+
+
+ New :
+ Renewed:
+ +
+
+
+
+ + @@ -358,22 +305,7 @@ - + diff --git a/app/Views/invoice_pdf_template.php b/app/Views/invoice_pdf_template.php index f0e934af..62eaec85 100644 --- a/app/Views/invoice_pdf_template.php +++ b/app/Views/invoice_pdf_template.php @@ -216,7 +216,7 @@ td.invoice-number { Item Name Qty Rate - Discount + Total @@ -251,9 +251,7 @@ td.invoice-number { Subtotal :   ₹subtotal, 2, '.', ',') ?> - - Discount :   ₹discount, 2, '.', ',') ?> - + shipping_label != '') : ?> shipping_label?> :   ₹shipping_charge, 2, '.', ',') ?> diff --git a/app/Views/report_book_publish.php b/app/Views/report_book_publish.php index e2125077..0eb35fb8 100644 --- a/app/Views/report_book_publish.php +++ b/app/Views/report_book_publish.php @@ -39,13 +39,12 @@ - + - @@ -53,13 +52,12 @@ - + - @@ -84,15 +82,16 @@ Author
- Cost -

+ Cost +
Published By

Inv Date

- + + @@ -112,10 +111,9 @@ \ No newline at end of file diff --git a/app/Views/report_expired_customers.php b/app/Views/report_expired_customers.php index 32cf4c05..993c49c5 100644 --- a/app/Views/report_expired_customers.php +++ b/app/Views/report_expired_customers.php @@ -11,7 +11,7 @@
- +
@@ -73,7 +73,7 @@ $(document).ready(function() { buttons: [ { extend: 'print', - title: 'Experiref\d Invoice Report', + title: 'Experired Invoice Report', text: 'Print', customize: function(win) { // Exclude the first and last columns @@ -127,40 +127,54 @@ $('#datatable-buttons thead tr:eq(1) th').each(function (i) { }); // Add date range filter for "Invoice Date" column -var dateRangeFilter = $('input.input-daterange-datepicker') - .daterangepicker({ - autoUpdateInput: false, - locale: { - format: 'DD/MM/YYYY', - cancelLabel: 'Clear' - }, - ranges: { - 'Today': [moment(), moment()], - 'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')], - 'This Month': [moment().startOf('month'), moment().endOf('month')] - } - }) - .on('apply.daterangepicker', function (ev, picker) { - $(this).val(picker.startDate.format('DD/MM/YYYY') + ' - ' + picker.endDate.format('DD/MM/YYYY')); - }) - .on('cancel.daterangepicker', function () { - $(this).val(''); - }); +moment.updateLocale('en', { + longDateFormat: { + L: 'DD/MM/YYYY', + // LTS: 'h:mm:ss A', + // LTS: 'h:mm A', + } +}); - // Add click events for "Today" and "Yesterday" buttons - $('.today-btn').on('click', function () { - var today = moment(); - dateRangeFilter.data('daterangepicker').setStartDate(today); - dateRangeFilter.data('daterangepicker').setEndDate(today); - dateRangeFilter.trigger('apply.daterangepicker'); +$(document).ready(function () { + var $select_data = ''; + + var dateRangeFilter = $('input.input-daterange-datepicker') + .daterangepicker({ + locale: { + format: 'DD/MM/YYYY', + cancelLabel: 'Clear' + }, + startDate: $select_data ? moment($select_data.split(' - ')[0], 'DD/MM/YYYY') : moment(), + endDate: $select_data ? moment($select_data.split(' - ')[1], 'DD/MM/YYYY') : moment(), + ranges: { + 'Today': [moment(), moment()], + 'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')], + 'This Month': [moment().startOf('month'), moment().endOf('month')] + } + }) + .on('apply.daterangepicker', function (ev, picker) { + var formattedStartDate = picker.startDate.format('DD/MM/YYYY'); + var formattedEndDate = picker.endDate.format('DD/MM/YYYY'); + var selectedDateRange = formattedStartDate + ' - ' + formattedEndDate; + $(this).val(selectedDateRange); + }) + .on('cancel.daterangepicker', function () { + $(this).val(''); }); - $('.yesterday-btn').on('click', function () { - var yesterday = moment().subtract(1, 'days'); - dateRangeFilter.data('daterangepicker').setStartDate(yesterday); - dateRangeFilter.data('daterangepicker').setEndDate(yesterday); - dateRangeFilter.trigger('apply.daterangepicker'); - }); + $('.today-btn').on('click', function () { + var today = moment(); + dateRangeFilter.data('daterangepicker').setStartDate(today); + dateRangeFilter.data('daterangepicker').setEndDate(today); + dateRangeFilter.val(today.format('DD/MM/YYYY') + ' - ' + today.format('DD/MM/YYYY')); + dateRangeFilter.trigger('apply.daterangepicker'); + }); + + // Trigger "Today" button click to set it as default if $select_data is empty + if ($select_data === '') { + $('.today-btn').trigger('click'); + } +}); }); diff --git a/app/Views/report_general_invoice.php b/app/Views/report_general_invoice.php index c0fb44c9..0d3923be 100644 --- a/app/Views/report_general_invoice.php +++ b/app/Views/report_general_invoice.php @@ -11,7 +11,8 @@
- + +
@@ -20,6 +21,8 @@
+ +
@@ -235,39 +238,57 @@ }); // Add date range filter for "Invoice Date" column - var dateRangeFilter = $('input.input-daterange-datepicker') - .daterangepicker({ - autoUpdateInput: false, - locale: { - format: 'DD/MM/YYYY', - cancelLabel: 'Clear' - }, - ranges: { - 'Today': [moment(), moment()], - 'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')], - 'This Month': [moment().startOf('month'), moment().endOf('month')] - } - }) - .on('apply.daterangepicker', function (ev, picker) { - $(this).val(picker.startDate.format('DD/MM/YYYY') + ' - ' + picker.endDate.format('DD/MM/YYYY')); - }) - .on('cancel.daterangepicker', function () { - $(this).val(''); - }); + // Set the default date format for moment.js globally +// Set the default date format for moment.js globally +moment.updateLocale('en', { + longDateFormat: { + L: 'DD/MM/YYYY', + // LTS: 'h:mm:ss A', + // LTS: 'h:mm A', + } +}); - // Add click events for "Today" and "Yesterday" buttons - $('.today-btn').on('click', function () { - var today = moment(); - dateRangeFilter.data('daterangepicker').setStartDate(today); - dateRangeFilter.data('daterangepicker').setEndDate(today); - dateRangeFilter.trigger('apply.daterangepicker'); +$(document).ready(function () { + var $select_data = ''; + + var dateRangeFilter = $('input.input-daterange-datepicker') + .daterangepicker({ + locale: { + format: 'DD/MM/YYYY', + cancelLabel: 'Clear' + }, + startDate: $select_data ? moment($select_data.split(' - ')[0], 'DD/MM/YYYY') : moment(), + endDate: $select_data ? moment($select_data.split(' - ')[1], 'DD/MM/YYYY') : moment(), + ranges: { + 'Today': [moment(), moment()], + 'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')], + 'This Month': [moment().startOf('month'), moment().endOf('month')] + } + }) + .on('apply.daterangepicker', function (ev, picker) { + var formattedStartDate = picker.startDate.format('DD/MM/YYYY'); + var formattedEndDate = picker.endDate.format('DD/MM/YYYY'); + var selectedDateRange = formattedStartDate + ' - ' + formattedEndDate; + $(this).val(selectedDateRange); + }) + .on('cancel.daterangepicker', function () { + $(this).val(''); }); - $('.yesterday-btn').on('click', function () { - var yesterday = moment().subtract(1, 'days'); - dateRangeFilter.data('daterangepicker').setStartDate(yesterday); - dateRangeFilter.data('daterangepicker').setEndDate(yesterday); - dateRangeFilter.trigger('apply.daterangepicker'); - }); + $('.today-btn').on('click', function () { + var today = moment(); + dateRangeFilter.data('daterangepicker').setStartDate(today); + dateRangeFilter.data('daterangepicker').setEndDate(today); + dateRangeFilter.val(today.format('DD/MM/YYYY') + ' - ' + today.format('DD/MM/YYYY')); + dateRangeFilter.trigger('apply.daterangepicker'); }); + + // Trigger "Today" button click to set it as default if $select_data is empty + if ($select_data === '') { + $('.today-btn').trigger('click'); + } +}); + }); + + \ No newline at end of file diff --git a/app/Views/report_itemwise.php b/app/Views/report_itemwise.php index e3ac34d9..8fbea667 100644 --- a/app/Views/report_itemwise.php +++ b/app/Views/report_itemwise.php @@ -1,33 +1,26 @@ + @@ -41,12 +34,10 @@
-
- -
+
- + +
@@ -61,43 +52,44 @@
Book Name Author Cost Published By Inv Date
title; ?> publisher; ?> price ?> publishers_code?> invoice_date ?>
- + - - - + + + + - - - - - - - - + + + + + + + +
Publisher CodePublisher Item CountPublisher Total CostPublisher CodePublisher Item CountPublisher Total Cost
publisher_code; ?>publisher_item_count; ?>publisher_total_cost; ?>
- - - - - - - - - - - books as $book) { ?> - - - - - - - -
Book NameItem CountTotal Cost
book_name; ?>item_count; ?>total_cost; ?>
-
publisher_code; ?>publisher_item_count; ?>publisher_total_cost; ?>
+ + + + + + + + + + + books as $book) { ?> + + + + + + + +
book_name; ?>item_count; ?>total_cost; ?>
+
@@ -108,25 +100,44 @@ + + \ No newline at end of file diff --git a/app/Views/template/header.php b/app/Views/template/header.php index 45f0d2c8..02fda9ee 100644 --- a/app/Views/template/header.php +++ b/app/Views/template/header.php @@ -222,7 +222,7 @@ ">Bookswise Report
  • - ">Bookswise Published + ">Books Published
  • diff --git a/app/Views/user_form.php b/app/Views/user_form.php index efd4fc35..951cd811 100644 --- a/app/Views/user_form.php +++ b/app/Views/user_form.php @@ -315,3 +315,4 @@ $(document).ready(function () { $('#role').change(); }); +