'$refresh']; protected function getData(): array { $activeFilter = $this->filter; $selectedPlant = session('selected_plant') ?? session('select_plant'); $selectedLine = session('selected_line') ?? session('select_line'); if (!$selectedPlant || !$selectedLine) { return [ 'datasets' => [], 'labels' => [], ]; } if ($activeFilter === 'yesterday') { $startDate = now()->subDay()->startOfDay(); $endDate = now()->subDay()->endOfDay(); $groupBy = 'EXTRACT(HOUR FROM production_quantities.created_at)'; } else if ($activeFilter === 'this_week') { $startDate = now()->startOfWeek(); // Monday 12:00 AM $endDate = now()->endOfWeek(); // Sunday 11:59 PM $groupBy = 'EXTRACT(DOW FROM production_quantities.created_at)'; // Group by day of week } else if ($activeFilter === 'this_month') { $startDate = now()->startOfMonth(); $endDate = now()->endOfMonth(); $groupBy = "FLOOR((EXTRACT(DAY FROM production_quantities.created_at) - 1) / 7) + 1"; } else { $startDate = now()->startOfDay(); $endDate = now()->endOfDay(); $groupBy = 'EXTRACT(HOUR FROM production_quantities.created_at)'; } $query = \DB::table('production_quantities') ->join('plants', 'production_quantities.plant_id', '=', 'plants.id') //inner join ->join('lines', 'production_quantities.line_id', '=', 'lines.id') ->selectRaw("$groupBy AS time_unit, count(*) AS total_quantity") ->whereBetween('production_quantities.created_at', [$startDate, $endDate]) ->when($selectedPlant, function ($q) use ($selectedPlant) { return $q->where('plants.id', $selectedPlant); }) ->when($selectedLine, function ($q) use ($selectedLine) { return $q->where('lines.id', $selectedLine); }) ->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 Production This Week", 'this_month' => "Weekly Production This Month", // Updated Label 'yesterday' => "Yesterday's Hourly Production", default => "Today's Hourly Production", }, '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 'line'; } // protected function getContent(): string // { // return '