filter; // Assuming filter is passed and activeFilter can be 'yesterday', 'this_week', 'this_month' if (!$selectedPlant || !$selectedInvoice) { return [ 'datasets' => [], 'labels' => [], ]; } // Define the date range based on the active filter 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') { $startDate = now()->startOfWeek()->setTime(8, 0, 0); $endDate = now()->endOfWeek()->addDay()->setTime(8, 0, 0); $groupBy = 'day_of_week'; } elseif ($activeFilter == 'this_month') { $startDate = now()->startOfMonth()->setTime(8, 0, 0); $endDate = now()->endOfMonth()->setTime(8, 0, 0); $groupBy = 'week_of_month'; } else { $startDate = now()->setTime(8, 0, 0); $endDate = now()->copy()->addDay()->setTime(8, 0, 0); $groupBy = 'none'; // No grouping by hour } // Get the counts for Imported Invoices (unique invoice numbers) and Completed Invoices if ($selectedInvoice == 'individual_material') { $importedInvoicesCount = InvoiceValidation::where('plant_id', $selectedPlant) ->where('quantity', 1) ->whereBetween('created_at', [$startDate, $endDate]) // Filter by date range ->distinct('invoice_number') // Only distinct invoice numbers ->count('invoice_number'); $completedInvoicesCount = InvoiceValidation::select('invoice_number') ->where('plant_id', $selectedPlant) ->where('quantity', 1) ->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 = InvoiceValidation::where('plant_id', $selectedPlant) ->whereNull('quantity') ->whereBetween('created_at', [$startDate, $endDate]) ->distinct('invoice_number') ->count('invoice_number'); $completedInvoicesCount = InvoiceValidation::select('invoice_number') ->where('plant_id', $selectedPlant) ->whereNull('quantity') ->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 = InvoiceValidation::where('plant_id', $selectedPlant) ->where('quantity', '>', 1) ->whereBetween('created_at', [$startDate, $endDate]) // Filter by date range ->distinct('invoice_number') // Only distinct invoice numbers ->count('invoice_number'); $completedInvoicesCount = InvoiceValidation::select('invoice_number') ->where('plant_id', $selectedPlant) ->where('quantity', '>', 1) ->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'])) { $labels = ['Imported Invoice', 'Completed Invoice']; $datasets = [[ 'label' => 'Invoices', 'data' => [$importedInvoicesCount, $completedInvoicesCount], 'backgroundColor' => ['rgba(75, 192, 192, 1)', 'rgba(23, 211, 80, 1)'], 'fill' => false, ]]; } elseif ($activeFilter == 'this_week') { $daysOfWeek = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']; $importedInvoicesPerDay = array_fill(0, 7, 0); $completedInvoicesPerDay = array_fill(0, 7, 0); for ($index = 0; $index < 7; $index++) { $dayStart = now()->startOfWeek()->addDays($index)->setTime(8, 0, 0); $dayEnd = $dayStart->copy()->addDay()->setTime(8, 0, 0); $query = InvoiceValidation::where('plant_id', $selectedPlant); // Build completedQuery with only 'invoice_number' in select $completedQuery = InvoiceValidation::select('invoice_number') ->where('plant_id', $selectedPlant); if ($selectedInvoice == 'individual_material') { $query->where('quantity', 1)->whereBetween('created_at', [$dayStart, $dayEnd]); $completedQuery->where('quantity', 1) ->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') ->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) ->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->count(); } $labels = $daysOfWeek; $datasets = [ [ 'label' => 'Imported Invoices', 'data' => $importedInvoicesPerDay, 'backgroundColor' => 'rgba(75, 192, 192, 1)', ], [ 'label' => 'Completed Invoices', 'data' => $completedInvoicesPerDay, 'backgroundColor' => 'rgba(23, 211, 80, 1)', ], ]; } elseif ($activeFilter == 'this_month') { $startOfMonth = now()->startOfMonth()->setTime(8, 0, 0); $endOfMonth = now()->endOfMonth()->addDay()->setTime(8, 0, 0); // include full last day $monthName = $startOfMonth->format('M'); // Prepare weekly labels like "May(1-7)", "May(8-14)", etc. $labels = []; $weekStart = $startOfMonth->copy(); $importedInvoicesPerWeek = []; $completedInvoicesPerWeek = []; $weekIndex = 0; while ($weekStart < $endOfMonth) { $weekEnd = $weekStart->copy()->addDays(7); $startDay = $weekStart->format('j'); $weekEndLimit = $weekEnd->copy()->subDay(); $actualEnd = $weekEndLimit->greaterThan($endOfMonth) ? $endOfMonth : $weekEndLimit; $endDay = $actualEnd->format('j'); $labels[] = "{$monthName}({$startDay}-{$endDay})"; $queryImported = InvoiceValidation::where('plant_id', $selectedPlant) ->whereBetween('created_at', [$weekStart, $weekEnd]); if ($selectedInvoice == 'individual_material') { $queryImported->where('quantity', 1); } elseif ($selectedInvoice == 'serial_invoice') { $queryImported->whereNull('quantity'); } elseif ($selectedInvoice == 'bundle_material') { $queryImported->where('quantity', '>', 1); } $importedInvoicesPerWeek[$weekIndex] = $queryImported->distinct('invoice_number')->count('invoice_number'); // --- Completed --- $queryCompleted = InvoiceValidation::select('invoice_number') ->where('plant_id', $selectedPlant) ->whereBetween('updated_at', [$weekStart, $weekEnd]); if ($selectedInvoice == 'individual_material') { $queryCompleted->where('quantity', 1) ->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') { $queryCompleted->whereNull('quantity') ->groupBy('invoice_number') ->havingRaw("COUNT(*) = SUM(CASE WHEN scanned_status = 'Scanned' THEN 1 ELSE 0 END)"); } elseif ($selectedInvoice == 'bundle_material') { $queryCompleted->where('quantity', '>', 1) ->groupBy('invoice_number') ->havingRaw("COUNT(*) = SUM(CASE WHEN serial_number IS NOT NULL AND serial_number != '' THEN 1 ELSE 0 END)"); } $completedInvoicesPerWeek[$weekIndex] = $queryCompleted->count(); // Move to next week $weekStart = $weekEnd; $weekIndex++; } $datasets = [ [ 'label' => 'Imported Invoices', 'data' => $importedInvoicesPerWeek, 'backgroundColor' => 'rgba(75, 192, 192, 1)', ], [ 'label' => 'Completed Invoices', 'data' => $completedInvoicesPerWeek, 'backgroundColor' => 'rgba(23, 211, 80, 1)', ], ]; } // elseif ($activeFilter == 'this_month') // { // $startOfMonth = now()->startOfMonth(); // $endOfMonth = now()->endOfMonth(); // $monthName = $startOfMonth->format('M'); // // Prepare weeks for the month // $labels = []; // $startDay = 1; // $totalDays = $endOfMonth->day; // while ($startDay <= $totalDays) { // $endDay = min($startDay + 6, $totalDays); // $labels[] = "{$monthName}({$startDay}-{$endDay})"; // $startDay += 7; // } // $importedInvoicesPerWeek = array_fill(0, count($labels), 0); // $completedInvoicesPerWeek = array_fill(0, count($labels), 0); // foreach ($labels as $index => $label) { // $weekStart = now()->startOfMonth()->addDays(($index * 7))->setTime(8, 0, 0); // $weekEnd = $weekStart->copy()->addDays(6)->setTime(8, 0, 0); // $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') { // $queryImported->where('quantity', 1); // $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') { // $queryImported->where('quantity', '>', 1); // $queryCompleted->where('quantity', '>', 1) // ->whereNotNull('serial_number') // ->where('serial_number','!=', ''); // } // $importedInvoicesPerWeek[$index] = $queryImported->distinct('invoice_number')->count('invoice_number'); // $completedInvoicesPerWeek[$index] = $queryCompleted->distinct('invoice_number')->count('invoice_number'); // } // $datasets = [ // [ // 'label' => 'Imported Invoices', // 'data' => $importedInvoicesPerWeek, // 'backgroundColor' => 'rgba(75, 192, 192, 1)', // ], // [ // 'label' => 'Completed Invoices', // 'data' => $completedInvoicesPerWeek, // 'backgroundColor' => 'rgba(23, 211, 80, 1)', // ], // ]; // } 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, 'labels' => $labels, ]; } protected function getType(): string { return 'bar'; } public static function getDefaultName(): string { return 'invoice-chart'; } // protected function getOptions(): array // { // return [ // 'scales' => [ // 'y' => [ // 'beginAtZero' => true, //Start Y-axis from 0 // 'ticks' => [ // 'stepSize' => 1, // ], // ], // ], // ]; // } protected function getOptions(): array { return [ // 'plugins' => [ // 'datalabels' => [ // // 'anchor' => 'start', // // 'align' => 'start', // // 'offset' => 1, // 'anchor' => 'start', // 'align' => 'start', // 'offset' => 8, // 'color' => '#000', // 'font' => [ // 'weight' => 'bold', // ], // 'formatter' => Js::from("function(value) { return Number(value); }"), // ], // ], 'plugins' => [ 'datalabels' => false, // Disable datalabels plugin properly ], 'scales' => [ 'y' => [ 'beginAtZero' => true, 'ticks' => [ 'stepSize' => 1, ], ], ], ]; } protected function getFilters(): ?array { return [ 'today' => 'Today', 'yesterday' => 'Yesterday', 'this_week'=> 'This Week', 'this_month'=> 'This Month', ]; } public static function canView(): bool { // dd('Checking route:', request()->route()->getName()); // to avoid showing the widget in other pages return request()->routeIs('filament.admin.pages.invoice-dashboard'); } }