From 64e74b8d67e88b588eedb98864f3041516fb7d4b Mon Sep 17 00:00:00 2001 From: dhanabalan Date: Sat, 10 May 2025 08:42:58 +0530 Subject: [PATCH] Updated completed invoice count chart query --- app/Filament/Widgets/InvoiceChart.php | 169 ++++++++++++++++++-------- 1 file changed, 117 insertions(+), 52 deletions(-) diff --git a/app/Filament/Widgets/InvoiceChart.php b/app/Filament/Widgets/InvoiceChart.php index 2d4d128..18fdd4d 100644 --- a/app/Filament/Widgets/InvoiceChart.php +++ b/app/Filament/Widgets/InvoiceChart.php @@ -30,15 +30,15 @@ class InvoiceChart extends ChartWidget // ]; // } - // if ($activeFilter === 'yesterday') { + // if ($activeFilter == 'yesterday') { // $startDate = now()->subDay()->setTime(8, 0, 0); // $endDate = now()->setTime(8, 0, 0); // $groupBy = 'none'; // No grouping by hour - // } elseif ($activeFilter === 'this_week') { + // } elseif ($activeFilter == 'this_week') { // $startDate = now()->startOfWeek()->setTime(8, 0, 0); // $endDate = now()->endOfWeek()->addDay()->setTime(8, 0, 0); // $groupBy = 'day_of_week'; - // } elseif ($activeFilter === 'this_month') { + // } elseif ($activeFilter == 'this_month') { // $startDate = now()->startOfMonth(); // $endDate = now()->endOfMonth(); // $groupBy = 'week_of_month'; @@ -49,7 +49,7 @@ class InvoiceChart extends ChartWidget // } // // Get fully scanned invoices - // if ($selectedInvoice === 'individual_material') { + // if ($selectedInvoice == 'individual_material') { // $allInvoiceNumbers = DB::table('invoice_validations') // ->select('invoice_number') @@ -66,7 +66,7 @@ class InvoiceChart extends ChartWidget // ->havingRaw("SUM(CASE WHEN serial_number IS NOT NULL AND serial_number != '' THEN 1 ELSE 0 END) = COUNT(*)") // ->pluck('invoice_number'); // } - // else if($selectedInvoice === 'serial_invoice') { + // else if($selectedInvoice == 'serial_invoice') { // $allInvoiceNumbers = DB::table('invoice_validations') // ->select('invoice_number') // ->where('plant_id', $selectedPlant) @@ -81,7 +81,7 @@ class InvoiceChart extends ChartWidget // ->havingRaw("SUM(CASE WHEN scanned_status = 'Scanned' THEN 1 ELSE 0 END) = COUNT(*)") // ->pluck('invoice_number'); // } - // if ($selectedInvoice === 'bundle_material') { + // if ($selectedInvoice == 'bundle_material') { // //Get all invoice numbers that contain bundle materials // $allInvoiceNumbers = DB::table('invoice_validations') @@ -193,12 +193,12 @@ class InvoiceChart extends ChartWidget // // } // // // Build x-axis labels and data arrays - // // if ($groupBy === 'hour') { + // // if ($groupBy == 'hour') { // // $shiftedKeys = array_merge(range(8, 23), range(0, 7)); // // $labels = array_map(fn($h) => date("g A", strtotime("$h:00")), $shiftedKeys); // // $scannedData = array_map(fn($h) => $scannedGrouped[$h] ?? 0, $shiftedKeys); // // $notScannedData = array_map(fn($h) => $notScannedGrouped[$h] ?? 0, $shiftedKeys); - // // } elseif ($groupBy === 'day_of_week') { + // // } elseif ($groupBy == 'day_of_week') { // // $labels = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']; // // $scannedData = array_fill(0, 7, 0); // // $notScannedData = array_fill(0, 7, 0); @@ -312,15 +312,15 @@ class InvoiceChart extends ChartWidget } // Define the date range based on the active filter - if ($activeFilter === 'yesterday') { + if ($activeFilter == 'yesterday') { $startDate = now()->subDay()->setTime(8, 0, 0); $endDate = now()->setTime(8, 0, 0); $groupBy = 'none'; // No grouping by hour - } elseif ($activeFilter === 'this_week') { + } elseif ($activeFilter == 'this_week') { $startDate = now()->startOfWeek()->setTime(8, 0, 0); $endDate = now()->endOfWeek()->addDay()->setTime(8, 0, 0); $groupBy = 'day_of_week'; - } elseif ($activeFilter === 'this_month') { + } elseif ($activeFilter == 'this_month') { $startDate = now()->startOfMonth()->setTime(8, 0, 0); $endDate = now()->endOfMonth()->setTime(8, 0, 0); $groupBy = 'week_of_month'; @@ -331,7 +331,7 @@ class InvoiceChart extends ChartWidget } // Get the counts for Imported Invoices (unique invoice numbers) and Completed Invoices - if ($selectedInvoice === 'individual_material') { + if ($selectedInvoice == 'individual_material') { $importedInvoicesCount = DB::table('invoice_validations') ->where('plant_id', $selectedPlant) ->where('quantity', 1) @@ -339,29 +339,44 @@ class InvoiceChart extends ChartWidget ->distinct('invoice_number') // Only distinct invoice numbers ->count('invoice_number'); - $completedInvoicesCount = DB::table('invoice_validations') + $completedInvoicesCount = DB::table('invoice_validations') + ->select('invoice_number') ->where('plant_id', $selectedPlant) ->where('quantity', 1) - ->whereNotNull('serial_number') // assuming serial_number presence means completed - ->whereBetween('updated_at', [$startDate, $endDate]) // Filter by date range - ->distinct('invoice_number') // Only distinct invoice numbers - ->count('invoice_number'); - } elseif ($selectedInvoice === 'serial_invoice') { + ->whereBetween('updated_at', [$startDate, $endDate]) + ->groupBy('invoice_number') + ->havingRaw( + "COUNT(*) = SUM(CASE WHEN serial_number IS NOT NULL AND serial_number != '' THEN 1 ELSE 0 END)" + ) + ->count(); + + } elseif ($selectedInvoice == 'serial_invoice') { $importedInvoicesCount = DB::table('invoice_validations') ->where('plant_id', $selectedPlant) ->whereNull('quantity') - ->whereBetween('created_at', [$startDate, $endDate]) // Filter by date range - ->distinct('invoice_number') // Only distinct invoice numbers + ->whereBetween('created_at', [$startDate, $endDate]) + ->distinct('invoice_number') ->count('invoice_number'); - $completedInvoicesCount = DB::table('invoice_validations') + // $completedInvoicesCount = DB::table('invoice_validations') + // ->where('plant_id', $selectedPlant) + // ->whereNull('quantity') + // ->where('scanned_status', 'Scanned') // assuming scanned_status means completed + // ->whereBetween('updated_at', [$startDate, $endDate]) // Filter by date range + // ->distinct('invoice_number') // Only distinct invoice numbers + // ->count('invoice_number'); + $completedInvoicesCount = DB::table('invoice_validations') + ->select('invoice_number') ->where('plant_id', $selectedPlant) ->whereNull('quantity') - ->where('scanned_status', 'Scanned') // assuming scanned_status means completed - ->whereBetween('updated_at', [$startDate, $endDate]) // Filter by date range - ->distinct('invoice_number') // Only distinct invoice numbers - ->count('invoice_number'); - } elseif ($selectedInvoice === 'bundle_material') { + ->whereBetween('updated_at', [$startDate, $endDate]) + ->groupBy('invoice_number') + ->havingRaw( + "COUNT(*) = SUM(CASE WHEN scanned_status = 'Scanned' THEN 1 ELSE 0 END)" + ) + ->count(); + + } elseif ($selectedInvoice == 'bundle_material') { $importedInvoicesCount = DB::table('invoice_validations') ->where('plant_id', $selectedPlant) ->where('quantity', '>', 1) @@ -369,20 +384,31 @@ class InvoiceChart extends ChartWidget ->distinct('invoice_number') // Only distinct invoice numbers ->count('invoice_number'); + // $completedInvoicesCount = DB::table('invoice_validations') + // ->where('plant_id', $selectedPlant) + // ->where('quantity', '>', 1) + // ->whereNotNull('serial_number') // assuming serial_number presence means completed + // ->whereBetween('updated_at', [$startDate, $endDate]) // Filter by date range + // ->distinct('invoice_number') // Only distinct invoice numbers + // ->count('invoice_number'); $completedInvoicesCount = DB::table('invoice_validations') + ->select('invoice_number') ->where('plant_id', $selectedPlant) ->where('quantity', '>', 1) - ->whereNotNull('serial_number') // assuming serial_number presence means completed - ->whereBetween('updated_at', [$startDate, $endDate]) // Filter by date range - ->distinct('invoice_number') // Only distinct invoice numbers - ->count('invoice_number'); + ->whereBetween('updated_at', [$startDate, $endDate]) + ->groupBy('invoice_number') + ->havingRaw( + "COUNT(*) = SUM(CASE WHEN serial_number IS NOT NULL AND serial_number != '' THEN 1 ELSE 0 END)" + ) + ->count(); + } // Prepare the chart data $labels = []; // Labels for each bar $datasets = []; // Datasets for the chart - if (in_array($activeFilter, ['yesterday', 'today'])) { + if (in_array($activeFilter, ['yesterday'])) { $labels = ['Imported Invoice', 'Completed Invoice']; $datasets = [[ 'label' => 'Invoices', @@ -391,37 +417,61 @@ class InvoiceChart extends ChartWidget 'fill' => false, ]]; } - elseif ($activeFilter === 'this_week') { + + elseif ($activeFilter == 'this_week') { $daysOfWeek = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']; $importedInvoicesPerDay = array_fill(0, 7, 0); $completedInvoicesPerDay = array_fill(0, 7, 0); - foreach ($daysOfWeek as $index => $day) { + for ($index = 0; $index < 7; $index++) { $dayStart = now()->startOfWeek()->addDays($index)->setTime(8, 0, 0); $dayEnd = $dayStart->copy()->addDay()->setTime(8, 0, 0); $query = DB::table('invoice_validations')->where('plant_id', $selectedPlant); - $completedQuery = DB::table('invoice_validations')->where('plant_id', $selectedPlant); - if ($selectedInvoice === 'individual_material') { + // Build completedQuery with only 'invoice_number' in select + $completedQuery = DB::table('invoice_validations') + ->select('invoice_number') + ->where('plant_id', $selectedPlant); + + if ($selectedInvoice == 'individual_material') + { $query->where('quantity', 1)->whereBetween('created_at', [$dayStart, $dayEnd]); + $completedQuery->where('quantity', 1) - ->whereNotNull('serial_number') - ->whereBetween('updated_at', [$dayStart, $dayEnd]); - } elseif ($selectedInvoice === 'serial_invoice') { + ->whereBetween('updated_at', [$dayStart, $dayEnd]) + ->groupBy('invoice_number') + ->havingRaw( + "COUNT(*) = SUM(CASE WHEN serial_number IS NOT NULL AND serial_number != '' THEN 1 ELSE 0 END)" + ); + } + elseif ($selectedInvoice == 'serial_invoice') + { $query->whereNull('quantity')->whereBetween('created_at', [$dayStart, $dayEnd]); + $completedQuery->whereNull('quantity') - ->where('scanned_status', 'Scanned') - ->whereBetween('updated_at', [$dayStart, $dayEnd]); - } elseif ($selectedInvoice === 'bundle_material') { + ->whereBetween('updated_at', [$dayStart, $dayEnd]) + ->groupBy('invoice_number') + ->havingRaw( + "COUNT(*) = SUM(CASE WHEN scanned_status = 'Scanned' THEN 1 ELSE 0 END)" + ); + } + elseif ($selectedInvoice == 'bundle_material') + { $query->where('quantity', '>', 1)->whereBetween('created_at', [$dayStart, $dayEnd]); + $completedQuery->where('quantity', '>', 1) - ->whereNotNull('serial_number') - ->whereBetween('updated_at', [$dayStart, $dayEnd]); + ->whereBetween('updated_at', [$dayStart, $dayEnd]) + ->groupBy('invoice_number') + ->havingRaw( + "COUNT(*) = SUM(CASE WHEN serial_number IS NOT NULL AND serial_number != '' THEN 1 ELSE 0 END)" + ); } + // Imported invoices count (distinct invoice_number) $importedInvoicesPerDay[$index] = $query->distinct('invoice_number')->count('invoice_number'); - $completedInvoicesPerDay[$index] = $completedQuery->distinct('invoice_number')->count('invoice_number'); + + $completedInvoicesPerDay[$index] = $completedQuery->count(); } $labels = $daysOfWeek; @@ -438,7 +488,9 @@ class InvoiceChart extends ChartWidget ], ]; } - elseif ($activeFilter === 'this_month') { + + elseif ($activeFilter == 'this_month') + { $startOfMonth = now()->startOfMonth(); $endOfMonth = now()->endOfMonth(); $monthName = $startOfMonth->format('M'); @@ -464,15 +516,20 @@ class InvoiceChart extends ChartWidget $queryImported = DB::table('invoice_validations')->where('plant_id', $selectedPlant)->whereBetween('created_at', [$weekStart, $weekEnd]); $queryCompleted = DB::table('invoice_validations')->where('plant_id', $selectedPlant)->whereBetween('updated_at', [$weekStart, $weekEnd]); - if ($selectedInvoice === 'individual_material') { + if ($selectedInvoice == 'individual_material') { $queryImported->where('quantity', 1); - $queryCompleted->where('quantity', 1)->whereNotNull('serial_number'); - } elseif ($selectedInvoice === 'serial_invoice') { + $queryCompleted->where('quantity', 1) + ->whereNotNull('serial_number') + ->where('serial_number','!=', ''); + } elseif ($selectedInvoice == 'serial_invoice') { $queryImported->whereNull('quantity'); - $queryCompleted->whereNull('quantity')->where('scanned_status', 'Scanned'); - } elseif ($selectedInvoice === 'bundle_material') { + $queryCompleted->whereNull('quantity') + ->where('scanned_status', 'Scanned'); + } elseif ($selectedInvoice == 'bundle_material') { $queryImported->where('quantity', '>', 1); - $queryCompleted->where('quantity', '>', 1)->whereNotNull('serial_number'); + $queryCompleted->where('quantity', '>', 1) + ->whereNotNull('serial_number') + ->where('serial_number','!=', ''); } $importedInvoicesPerWeek[$index] = $queryImported->distinct('invoice_number')->count('invoice_number'); @@ -492,7 +549,15 @@ class InvoiceChart extends ChartWidget ], ]; } - + else { + $labels = ['Imported Invoice', 'Completed Invoice']; + $datasets = [[ + 'label' => 'Invoices', + 'data' => [$importedInvoicesCount, $completedInvoicesCount], + 'backgroundColor' => ['rgba(75, 192, 192, 1)', 'rgba(23, 211, 80, 1)'], + 'fill' => false, + ]]; + } return [ 'datasets' => $datasets,