forget(['selected_plant']); session()->forget(['selected_date']); session()->forget(['selected_name']); session()->forget(['selected_time']); session()->forget(['valid_sessions']); $this->filtersForm->fill([ 'plant' => null, 'date' => null, 'time_range' => null, 'guard_name' => null ]); } public function filtersForm(Form $form): Form { return $form ->statePath('filters') ->schema([ Select::make('plant') ->options(Plant::pluck('name', 'id')) ->label('Select Plant') ->reactive() ->required() ->afterStateUpdated(function ($state) { session(['selected_plant' => $state]); // $this->dispatch('patrolEntryChart'); }), DatePicker::make('date') ->label('Select Date') ->placeholder('Select Date') ->reactive() ->required() ->beforeOrEqual(now()) ->default(now()->format('Y-m-d')) ->afterStateUpdated(function ($state) { session(['selected_date' => $state]); // $this->dispatch('patrolEntryChart'); }), Select::make('guard_name') ->label('Guard Name') ->options(function (callable $get) { $plantId = $get('plant'); if (!$plantId) { return []; } return GuardPatrolEntry::where('guard_patrol_entries.plant_id', $plantId) ->join('guard_names', 'guard_patrol_entries.guard_name_id', '=', 'guard_names.id') ->select('guard_names.id', 'guard_names.name') ->groupBy('guard_names.id', 'guard_names.name') ->pluck('guard_names.name', 'guard_names.id') ->toArray(); }) ->reactive() ->required() ->afterStateUpdated(function ($state,callable $set) { if (is_null($state)) { session()->forget('selected_name'); } else { session(['selected_name' => $state]); } // Clear the time range field and its session $set('time_range', null); session()->forget('selected_time'); }), // Select::make('time_range') // ->label('Patrol Time Range') // ->options(function (callable $get) { // $plantId = $get('plant'); // $guardName = trim($get('guard_name')); // $date = $get('date'); // if (!$plantId || !$guardName || !$date) { // return []; // } // $patrols = GuardPatrolEntry::where('guard_patrol_entries.plant_id', $plantId) // ->join('guard_names', 'guard_patrol_entries.guard_name_id', '=', 'guard_names.id') // ->where('guard_patrol_entries.guard_name_id', $guardName) // ->whereDate('guard_patrol_entries.patrol_time', $date) // ->orderBy('guard_patrol_entries.patrol_time') // ->get(['guard_patrol_entries.patrol_time', 'guard_patrol_entries.check_point_name_id']); // if ($patrols->isEmpty()) { // return []; // } // // $startCheckpointId = 1; // "STP BACKSIDE" // // $endCheckpointId = 10; // "D 72 END" // $firstCheckpoint = CheckPointName::where('plant_id', $plantId) // ->orderBy('id') // ->first(['id', 'name']); // $lastCheckpoint = CheckPointName::where('plant_id', $plantId) // ->orderByDesc('id') // ->first(['id', 'name']); // $startCheckpointId = $firstCheckpoint->id; // $endCheckpointId = $lastCheckpoint->id; // $sessions = []; // $currentSession = []; // foreach ($patrols as $patrol) // { // $currentSession[] = $patrol; // if ($patrol->check_point_name_id == $endCheckpointId) // { // if (!empty($currentSession) && $currentSession[0]->check_point_name_id == $startCheckpointId) { // $sessions[] = $currentSession; // } // $currentSession = []; // } // } // $options = []; // $validSessions = []; // $startCheckpointId = $firstCheckpoint->id; // $endCheckpointId = $lastCheckpoint->id; // foreach ($sessions as $session) { // $start = Carbon::parse($session[0]->patrol_time)->format('H:i:s'); // $end = Carbon::parse(end($session)->patrol_time)->format('H:i:s'); // $timeRange = "$start - $end"; // $options[$timeRange] = $timeRange; // // Check if session is valid // $isValid = ($session[0]->check_point_name_id == $startCheckpointId) && // (end($session)->check_point_name_id == $endCheckpointId); // $validSessions[$timeRange] = $isValid; // } // // Store validSessions in session or somewhere accessible // session(['valid_sessions' => $validSessions]); // return $options; // // $options = []; // // foreach ($sessions as $session) // // { // // $start = Carbon::parse($session[0]->patrol_time)->format('H:i:s'); // // $end = Carbon::parse(end($session)->patrol_time)->format('H:i:s'); // // $timeRange = "$start - $end"; // // $options[$timeRange] = $timeRange; // // } // // return $options; // }) // ->reactive() // ->required() // ->afterStateUpdated(function ($state) { // session(['selected_time' => $state]); // }), // Select::make('time_range') // ->label('Patrol Time Range') // ->options(function (callable $get) { // $plantId = $get('plant'); // $guardName = trim($get('guard_name')); // $date = $get('date'); // if (!$plantId || !$guardName || !$date) { // return []; // } // // Get all patrols for the guard, plant, and date // $patrols = GuardPatrolEntry::where('guard_patrol_entries.plant_id', $plantId) // ->join('guard_names', 'guard_patrol_entries.guard_name_id', '=', 'guard_names.id') // ->where('guard_patrol_entries.guard_name_id', $guardName) // ->whereDate('guard_patrol_entries.patrol_time', $date) // ->orderBy('guard_patrol_entries.patrol_time') // ->get(['guard_patrol_entries.patrol_time', 'guard_patrol_entries.check_point_name_id']); // if ($patrols->isEmpty()) { // session(['valid_sessions' => []]); // return []; // } // // Get the name of the first checkpoint in the patrol // $firstPatrolCheckpointId = $patrols[0]->check_point_name_id; // $firstPatrolCheckpointName = CheckPointName::where('id', $firstPatrolCheckpointId) // ->value('name'); // // Get the name of the first checkpoint in the system (for this plant) // $firstCheckpointName = CheckPointName::where('plant_id', $plantId) // ->orderBy('id') // ->value('name'); // // If the first patrol checkpoint is not the system's first checkpoint, invalid // if ($firstPatrolCheckpointName != $firstCheckpointName) { // session(['valid_sessions' => []]); // return []; // } // // Get the last checkpoint in the system (for this plant) // $lastCheckpointName = CheckPointName::where('plant_id', $plantId) // ->orderByDesc('id') // ->value('name'); // $lastCheckpointId = CheckPointName::where('plant_id', $plantId) // ->orderByDesc('id') // ->value('id'); // $sessions = []; // $currentSession = []; // foreach ($patrols as $patrol) { // $currentSession[] = $patrol; // if ($patrol->check_point_name_id == $lastCheckpointId) { // if (!empty($currentSession) && $currentSession[0]->check_point_name_id == $firstPatrolCheckpointId) { // $sessions[] = $currentSession; // } // $currentSession = []; // } // } // $options = []; // $validSessions = []; // foreach ($sessions as $session) { // $start = Carbon::parse($session[0]->patrol_time)->format('H:i:s'); // $end = Carbon::parse(end($session)->patrol_time)->format('H:i:s'); // $timeRange = "$start - $end"; // $options[$timeRange] = $timeRange; // // Check if session is valid (should always be true if the above checks pass) // $isValid = ($session[0]->check_point_name_id == $firstPatrolCheckpointId) && // (end($session)->check_point_name_id == $lastCheckpointId); // $validSessions[$timeRange] = $isValid; // } // session(['valid_sessions' => $validSessions]); // return $options; // }) // ->reactive() // ->required() // ->afterStateUpdated(function ($state) { // session(['selected_time' => $state]); // }), Select::make('time_range') ->label('Patrol Time Range') ->options(function (callable $get) { $plantId = $get('plant'); $guardName = trim($get('guard_name')); $date = $get('date'); if (!$plantId || !$guardName || !$date) { session(['valid_sessions' => []]); return []; } // Get all patrols for the guard, plant, and date $patrols = GuardPatrolEntry::where('guard_patrol_entries.plant_id', $plantId) ->join('guard_names', 'guard_patrol_entries.guard_name_id', '=', 'guard_names.id') ->where('guard_patrol_entries.guard_name_id', $guardName) ->whereDate('guard_patrol_entries.patrol_time', $date) ->orderBy('guard_patrol_entries.patrol_time') ->get(['guard_patrol_entries.patrol_time', 'guard_patrol_entries.check_point_name_id']); if ($patrols->isEmpty()) { session(['valid_sessions' => []]); return []; } // Get the first and last checkpoint for this plant $firstCheckpoint = CheckPointName::where('plant_id', $plantId) ->orderBy('id') ->first(['id', 'name']); $lastCheckpoint = CheckPointName::where('plant_id', $plantId) ->orderByDesc('id') ->first(['id', 'name']); $startCheckpointId = $firstCheckpoint->id; $endCheckpointId = $lastCheckpoint->id; // Optionally: Check if the first patrol is the system's first checkpoint // (If you want to mark all sessions as invalid if the first patrol is not the first checkpoint) $firstPatrolCheckpointId = $patrols[0]->check_point_name_id; $firstPatrolCheckpointName = CheckPointName::where('id', $firstPatrolCheckpointId)->value('name'); $firstCheckpointName = $firstCheckpoint->name; $allSessionsInvalid = ($firstPatrolCheckpointName != $firstCheckpointName); // Build sessions: group patrols between start and end checkpoints // (Or just group all patrols into one session, or as you prefer) // For this example, let's assume you want to group between start and end checkpoints $sessions = []; $currentSession = []; foreach ($patrols as $patrol) { $currentSession[] = $patrol; if ($patrol->check_point_name_id == $endCheckpointId) { $sessions[] = $currentSession; $currentSession = []; } } // Add any remaining patrols as a session (optional) if (!empty($currentSession)) { $sessions[] = $currentSession; } $options = []; $validSessions = []; foreach ($sessions as $session) { $start = Carbon::parse($session[0]->patrol_time)->format('H:i:s'); $end = Carbon::parse(end($session)->patrol_time)->format('H:i:s'); $timeRange = "$start - $end"; $options[$timeRange] = $timeRange; // Check if session is valid $isValid = !$allSessionsInvalid && // All sessions are invalid if first patrol is not first checkpoint ($session[0]->check_point_name_id == $startCheckpointId) && (end($session)->check_point_name_id == $endCheckpointId); $validSessions[$timeRange] = $isValid; } // Store validSessions in session session(['valid_sessions' => $validSessions]); return $options; }) ->reactive() ->required() ->afterStateUpdated(function ($state) { session(['selected_time' => $state]); }), ]) ->columns(4); } public function getWidgets(): array { return [ GuardPatrolHourlyChart::class, ]; } public static function canAccess(): bool { return Auth::check() && Auth::user()->can('view guard patrol hourly count dashboard'); } }