filter; if (!$selectedPlant || !$selectedInvoice) { return [ 'datasets' => [], 'labels' => [], ]; } if ($activeFilter === 'yesterday') { $startDate = now()->subDay()->setTime(8, 0, 0); // yesterday 8:00 AM $endDate = now()->setTime(8, 0, 0); // today 8:00 AM $groupBy = 'EXTRACT(HOUR FROM invoice_validations.created_at)'; } else if ($activeFilter === 'this_week') { // Monday 8:00 AM of the current week $startDate = now()->startOfWeek()->setTime(8, 0, 0); // Next Monday 8:00 AM (end of Sunday + 8 hrs) $endDate = now()->endOfWeek()->addDay()->setTime(8, 0, 0); $groupBy = 'EXTRACT(DOW FROM invoice_validations.created_at)'; // Group by day of week } else if ($activeFilter === 'this_month') { $startDate = now()->startOfMonth(); $endDate = now()->endOfMonth(); $groupBy = "FLOOR((EXTRACT(DAY FROM invoice_validations.created_at) - 1) / 7) + 1"; } else { $startDate = now()->setTime(8, 0, 0); // today at 8:00 AM $endDate = now()->copy()->addDay()->setTime(8, 0, 0); // tomorrow at 8:00 AM $groupBy = 'EXTRACT(HOUR FROM invoice_validations.created_at)'; } // $fullyScannedInvoiceNumbers = \DB::table('invoice_validations') // ->select('invoice_number') // ->where('plant_id', $selectedPlant) // ->groupBy('invoice_number') // ->havingRaw("SUM(CASE WHEN scanned_status = 'Scanned' THEN 1 ELSE 0 END) = COUNT(*)") // ->pluck('invoice_number'); if ($selectedInvoice === 'individual_material') { $fullyScannedInvoiceNumbers = \DB::table('invoice_validations') ->select('invoice_number') ->where('plant_id', $selectedPlant) ->havingRaw('MIN(quantity) = 1 AND MAX(quantity) = 1') // All rows must have quantity = 1 ->groupBy('invoice_number') ->havingRaw("SUM(CASE WHEN serial_number IS NOT NULL AND serial_number != '' THEN 1 ELSE 0 END) = COUNT(*)") ->pluck('invoice_number'); } else if ($selectedInvoice === 'bundle_material') { $fullyScannedInvoiceNumbers = \DB::table('invoice_validations') ->select('invoice_number') ->where('plant_id', $selectedPlant) ->havingRaw('MIN(quantity) > 1') ->groupBy('invoice_number') ->havingRaw("SUM(CASE WHEN serial_number IS NOT NULL AND serial_number != '' THEN 1 ELSE 0 END) = COUNT(*)") ->pluck('invoice_number'); } else { $fullyScannedInvoiceNumbers = \DB::table('invoice_validations') ->select('invoice_number') ->where('plant_id', $selectedPlant) ->groupBy('invoice_number') ->havingRaw("SUM(CASE WHEN scanned_status = 'Scanned' THEN 1 ELSE 0 END) = COUNT(*)") ->pluck('invoice_number'); } //query data $query = \DB::table('invoice_validations') ->join('plants', 'invoice_validations.plant_id', '=', 'plants.id') ->selectRaw("$groupBy AS time_unit, count(distinct invoice_validations.invoice_number) AS total_quantity") ->whereBetween('invoice_validations.created_at', [$startDate, $endDate]) ->where('invoice_validations.plant_id', $selectedPlant) ->whereIn('invoice_validations.invoice_number', $fullyScannedInvoiceNumbers) ->when($selectedInvoice === 'serial_invoice', fn($q) => $q->whereNotNull('invoice_validations.serial_number') ->where('invoice_validations.serial_number', '!=', '') ) ->when($selectedInvoice === 'individual_material', fn($q) => $q->where('invoice_validations.quantity', 1) // Only individual items ) ->when($selectedInvoice === 'bundle_material', fn($q) => $q->where('invoice_validations.quantity', '>', 1) // Assume bundles have quantity > 1 ) ->groupByRaw($groupBy) ->orderByRaw($groupBy) ->pluck('total_quantity', 'time_unit') ->toArray(); if ($activeFilter === 'this_month') { $weeksCount = ceil($endDate->day / 7); // Calculate total weeks dynamically $allWeeks = array_fill(1, $weeksCount, 0); // Initialize all weeks with 0 $data = array_replace($allWeeks, $query); // Fill missing weeks with 0 // Generate dynamic week labels $labels = []; for ($i = 1; $i <= $weeksCount; $i++) { $weekStart = $startDate->copy()->addDays(($i - 1) * 7)->format('d M'); $weekEnd = $startDate->copy()->addDays($i * 7 - 1)->min($endDate)->format('d M'); $labels[] = "Week $i ($weekStart - $weekEnd)"; } $orderedData = array_values($data); } else if ($activeFilter === 'this_week') { // Correct week labels: ['Mon', 'Tue', ..., 'Sun'] $labels = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']; // Initialize default data for all 7 days $data = array_fill(0, 7, 0); // Fill in data from query results foreach ($query as $dow => $count) { $data[$dow] = $count; } // Ensure days are ordered from Monday to Sunday $orderedData = [ $data[1] ?? 0, // Monday $data[2] ?? 0, // Tuesday $data[3] ?? 0, // Wednesday $data[4] ?? 0, // Thursday $data[5] ?? 0, // Friday $data[6] ?? 0, // Saturday $data[0] ?? 0, // Sunday (move to last) ]; } else { // Hourly data (same as before) $allHours = array_fill(0, 24, 0); $data = array_replace($allHours, $query); // Shift hours for proper display (8 AM to 7 AM) $shiftedKeys = array_merge(range(8, 23), range(0, 8)); $orderedData = array_map(fn($hour) => $data[$hour], $shiftedKeys); // Labels: ["8 AM", "9 AM", ..., "7 AM"] $labels = array_map(fn ($hour) => date("g A", strtotime("$hour:00")), $shiftedKeys); } return [ 'datasets' => [ [ 'label' => match ($activeFilter) { 'this_week' => "Daily imported excel file count", 'this_month' => "Weekly imported excel file count", // Updated Label 'yesterday' => "Yesterday's imported excel file count", default => "Today's imported excel file count", }, 'data' => $orderedData, 'borderColor' => 'rgba(75, 192, 192, 1)', 'backgroundColor' => 'rgba(75, 192, 192, 0.2)', 'fill' => false, 'tension' => 0.3, ], ], '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 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'); } }