schema([ Section::make('') ->schema([ Forms\Components\Select::make('plant_id') ->relationship('plant', 'name') ->required() // ->nullable() ->reactive() ->default(function () { return optional(ProductionPlan::latest()->first())->plant_id; }) ->disabled(fn (Get $get) => !empty($get('id'))) // ->afterStateUpdated(fn ($set) => $set('block_name', null)) ->afterStateUpdated(function ($state, callable $set, callable $get) { $plantId = $get('plant_id'); $set('block_name', null); if (!$plantId) { $set('ppPlantError', 'Please select a plant first.'); return; } else { $set('ppPlantError', null); } }) ->extraAttributes(fn ($get) => [ 'class' => $get('ppPlantError') ? 'border-red-500' : '', ]) ->hint(fn ($get) => $get('ppPlantError') ? $get('ppPlantError') : null) ->hintColor('danger'), Forms\Components\Select::make('block_name') ->required() // ->nullable() ->label('Block') ->options(function (callable $get) { if (!$get('plant_id')) { return []; } return \App\Models\Block::where('plant_id', $get('plant_id')) ->pluck('name', 'id') ->toArray(); }) ->reactive() ->default(function () { $latestShiftId = optional(ProductionPlan::latest()->first())->shift_id; return optional(Shift::where('id', $latestShiftId)->first())->block_id; }) //->afterStateUpdated(fn ($set) => $set('shift_id', null)) ->afterStateUpdated(function ($state, callable $set, callable $get) { if($get('id')) { $getShift = ProductionPlan::where('id', $get('id'))->first(); $getBlock = Shift::where('id', $getShift->shift_id)->first(); if($getBlock->block_id) { $set('block_name', $getBlock->block_id); $set('ppBlockError', null); } } $blockId = $get('block_name'); $set('shift_id', null); if (!$blockId) { $set('ppBlockError', 'Please select a block first.'); return; } else { $set('ppBlockError', null); } }) ->extraAttributes(fn ($get) => [ 'class' => $get('ppBlockError') ? 'border-red-500' : '', ]) ->hint(fn ($get) => $get('ppBlockError') ? $get('ppBlockError') : null) ->hintColor('danger'), Forms\Components\Select::make('shift_id') ->relationship('shift', 'name') ->required() // ->nullable() ->autofocus(true) ->options(function (callable $get) { if (!$get('plant_id') || !$get('block_name')) { return []; } return Shift::where('plant_id', $get('plant_id')) ->where('block_id', $get('block_name')) ->pluck('name', 'id') ->toArray(); }) ->reactive() ->default(function () { return optional(ProductionPlan::latest()->first())->shift_id; }) // ->afterStateUpdated(fn ($set) => $set('line_id', null)) ->afterStateUpdated(function ($state, callable $set, callable $get) { if($get('id')) { $getShift = ProductionPlan::where('id', $get('id'))->first(); if($getShift->shift_id) { $set('shift_id', $getShift->shift_id); $set('ppShiftError', null); } } $curShiftId = $get('shift_id'); $set('line_id', null); if (!$curShiftId) { $set('ppShiftError', 'Please select a shift first.'); return; } else { $set('ppShiftError', null); } }) ->extraAttributes(fn ($get) => [ 'class' => $get('ppShiftError') ? 'border-red-500' : '', ]) ->hint(fn ($get) => $get('ppShiftError') ? $get('ppShiftError') : null) ->hintColor('danger'), Forms\Components\Select::make('line_id') ->relationship('line', 'name') ->required() // ->nullable() // ->options(fn (callable $get) => // \App\Models\Line::where('plant_id', $get('plant_id')) // ->pluck('name', 'id') // ->toArray() // Convert collection to array // ) ->options(function (callable $get) { if (!$get('plant_id') || !$get('block_name') || !$get('shift_id')) { return []; } return \App\Models\Line::where('plant_id', $get('plant_id')) ->pluck('name', 'id') ->toArray(); }) ->reactive() // ->default(function () { // return optional(ProductionPlan::latest()->first())->line_id; // }) ->afterStateUpdated(function ($state, callable $set, callable $get) { if($get('id')) { $getShift = ProductionPlan::where('id', $get('id'))->first(); if($getShift->line_id) { $set('line_id', $getShift->line_id); $set('ppLineError', null); } } else { $currentDT = Carbon::now()->toDateTimeString(); $set('created_at', $currentDT); $set('update_date', null); } $lineId = $get('line_id'); // $set('plan_quantity', null); if (!$lineId) { $set('ppLineError', 'Please select a line first.'); return; } else { $isUpdate = !empty($get('id')); if (!$isUpdate) { $exists = ProductionPlan::where('plant_id', $get('plant_id')) ->where('shift_id', $get('shift_id')) ->where('line_id', $get('line_id')) ->whereDate('created_at', today()) ->latest() ->exists(); if ($exists) { $set('line_id', null); $set('ppLineError', 'Production plan already updated.'); return; } else { $existShifts = ProductionPlan::where('plant_id', $get('plant_id')) ->where('shift_id', $get('shift_id')) ->where('line_id', $get('line_id')) ->whereDate('created_at', Carbon::yesterday()) ->latest() ->exists(); if ($existShifts) //if ($existShifts->count() > 0) { //$currentDate = date('Y-m-d'); $yesterday = date('Y-m-d', strtotime('-1 days')); $shiftId = Shift::where('id', $get('shift_id')) ->first(); [$hRs, $miNs] = explode('.', $shiftId->duration) + [0, 0]; $hRs = (int) $hRs; // $miNs = (int) $miNs;-*/ $totalMinutes = $hRs * 60 + $miNs; $from_dt = $yesterday . ' ' . $shiftId->start_time; $to_dt = date('Y-m-d H:i:s', strtotime($from_dt . " + $totalMinutes minutes")); $currentDateTime = date('Y-m-d H:i:s'); // Check if current date time is within the range if ($currentDateTime >= $from_dt && $currentDateTime < $to_dt) { //echo "Choosed a valid shift..."; $set('line_id', null); $set('ppLineError', 'Production plan already updated.'); // $set('ppLineError', 'Valid (From: '.$from_dt.', To: '.$to_dt.')'); return; } else { $currentDate = date('Y-m-d'); $shiftId = Shift::where('id', $get('shift_id')) ->first(); [$hRs, $miNs] = explode('.', $shiftId->duration) + [0, 0]; $hRs = (int) $hRs; // $miNs = (int) $miNs;-*/ $totalMinutes = $hRs * 60 + $miNs; $from_dt = $currentDate . ' ' . $shiftId->start_time; $to_dt = date('Y-m-d H:i:s', strtotime($from_dt . " + $totalMinutes minutes")); $currentDateTime = date('Y-m-d H:i:s'); // Check if current date time is within the range if (!($currentDateTime >= $from_dt && $currentDateTime < $to_dt)) { //echo "Choosed a valid shift..."; $set('line_id', null); $set('ppLineError', 'Choosed a invalid shift.'); // $set('ppLineError', 'Valid (From: '.$from_dt.', To: '.$to_dt.')'); return; } } $set('ppLineError', null); return; } else { //$currentDate = date('Y-m-d'); $yesterday = date('Y-m-d', strtotime('-1 days')); $shiftId = Shift::where('id', $get('shift_id')) ->first(); [$hRs, $miNs] = explode('.', $shiftId->duration) + [0, 0]; $hRs = (int) $hRs; // $miNs = (int) $miNs;-*/ $totalMinutes = $hRs * 60 + $miNs; $from_dt = $yesterday . ' ' . $shiftId->start_time; $to_dt = date('Y-m-d H:i:s', strtotime($from_dt . " + $totalMinutes minutes")); $currentDateTime = date('Y-m-d H:i:s'); // Check if current date time is within the range if ($currentDateTime >= $from_dt && $currentDateTime < $to_dt) { //echo "Choosed a valid shift..."; // here i'm updating created as yesterday $set('created_at', $from_dt); $set('update_date', '1'); $set('ppLineError', null); // $set('ppLineError', 'Valid (From: '.$from_dt.', To: '.$to_dt.')'); return; } else { $currentDate = date('Y-m-d'); $shiftId = Shift::where('id', $get('shift_id')) ->first(); [$hRs, $miNs] = explode('.', $shiftId->duration) + [0, 0]; $hRs = (int) $hRs; // $miNs = (int) $miNs;-*/ $totalMinutes = $hRs * 60 + $miNs; $from_dt = $currentDate . ' ' . $shiftId->start_time; $to_dt = date('Y-m-d H:i:s', strtotime($from_dt . " + $totalMinutes minutes")); $currentDateTime = date('Y-m-d H:i:s'); // Check if current date time is within the range if (!($currentDateTime >= $from_dt && $currentDateTime < $to_dt)) { //echo "Choosed a valid shift..."; $set('line_id', null); $set('ppLineError', 'Choosed a invalid shift.'); // $set('ppLineError', 'Valid (From: '.$from_dt.', To: '.$to_dt.')'); return; } } $set('ppLineError', null); return; } // $exists = ProductionPlan::where('plant_id', $get('plant_id')) // //->where('shift_id', $get('shift_id')) // ->where('line_id', $get('line_id')) // ->whereDate('created_at', today()) // ->latest() // Orders by created_at DESC // ->first(); // if ($exists) // { // $existingShifts = ProductionPlan::where('plant_id', $get('plant_id')) // //->where('shift_id', $get('shift_id')) // ->where('line_id', $get('line_id')) // // ->whereDate('created_at', today()) // ->whereDate('created_at', today()) // ->get(); // foreach ($existingShifts as $shift) { // $curShiftId = $shift->shift_id; // $currentDate = date('Y-m-d'); // $shiftId = \App\Models\Shift::where('id', $curShiftId) // ->first(); // [$hRs, $miNs] = explode('.', $shiftId->duration) + [0, 0]; // $hRs = (int) $hRs; // // $miNs = (int) $miNs;-*/ // $totalMinutes = $hRs * 60 + $miNs; // $from_dt = $currentDate . ' ' . $shiftId->start_time; // $to_dt = date('Y-m-d H:i:s', strtotime($from_dt . " + $totalMinutes minutes")); // $currentDateTime = date('Y-m-d H:i:s'); // // Check if current date time is within the range // if ($currentDateTime >= $from_dt && $currentDateTime < $to_dt) { // //echo "Choosed a valid shift..."; // // $set('ppLineError', 'Valid (From: '.$from_dt.', To: '.$to_dt.')'); // $set('line_id', null); // $set('ppLineError', 'Production plan already updated.'); // return; // } // // else { // // $set('ppLineError', 'Choosed a invalid shift...'); // // return; // // } // } // $set('ppLineError', null); // return; // } } } $set('ppLineError', null); } }) ->extraAttributes(fn ($get) => [ 'class' => $get('ppLineError') ? 'border-red-500' : '', ]) ->hint(fn ($get) => $get('ppLineError') ? $get('ppLineError') : null) ->hintColor('danger'), Forms\Components\TextInput::make('plan_quantity') ->required() ->integer() ->label('Plan Quantity') ->placeholder('Scan the valid quantity') ->minValue(1) ->reactive() ->afterStateUpdated(function ($state, callable $set, callable $get) { $planQuan = $get('plan_quantity'); if(!$get('update_date') ) { if(!$get('id')) { $currentDT = Carbon::now()->toDateTimeString(); $set('created_at', $currentDT); } } if (!$planQuan) { $set('ppPlanQuanError', 'Scan the valid plan quantity.'); return; } else { $set('ppPlanQuanError', null); } }) ->extraAttributes(fn ($get) => [ 'class' => $get('ppPlanQuanError') ? 'border-red-500' : '', ]) ->hint(fn ($get) => $get('ppPlanQuanError') ? $get('ppPlanQuanError') : null) ->hintColor('danger'), Forms\Components\TextInput::make('production_quantity') ->required() ->integer() ->label('Production Quantity') ->readOnly() ->default(0), Forms\Components\TextInput::make('id') ->hidden() ->readOnly(), Forms\Components\TextInput::make('update_date') ->hidden() ->reactive() ->readOnly(), Forms\Components\DateTimePicker::make('created_at') ->label('Created DateTime') ->hidden() ->reactive() ->required() ->readOnly(), Forms\Components\Hidden::make('operator_id') ->default(Filament::auth()->user()->name), ]) ->columns(2), ]); } // public function submitForm(array $data) // { // if (empty($data['update_date'])) { // $data['created_at'] = now(); // Set current datetime if 'update_date' is empty // } // // Save or process form data // ProductionPlan::create($data); // } // protected function afterSave(array $data) // { // if ($this->model instanceof ProductionPlan && empty($data['update_date'])) { // $this->model->created_at = now(); // Set current datetime if 'update_date' is empty // $this->model->save(); // } // } public static function table(Table $table): Table { return $table ->columns([ Tables\Columns\TextColumn::make('id') ->label('ID') ->numeric() ->sortable(), Tables\Columns\TextColumn::make('plan_quantity') ->numeric() ->sortable(), Tables\Columns\TextColumn::make('production_quantity') ->numeric() ->sortable(), Tables\Columns\TextColumn::make('line.name') ->sortable() ->searchable(), Tables\Columns\TextColumn::make('shift.name') ->sortable() ->searchable(), Tables\Columns\TextColumn::make('plant.name') ->sortable() ->searchable(), Tables\Columns\TextColumn::make('operator_id') ->label('Operator ID') ->sortable(), Tables\Columns\TextColumn::make('created_at') ->dateTime() ->sortable() ->toggleable(isToggledHiddenByDefault: true), Tables\Columns\TextColumn::make('updated_at') ->dateTime() ->sortable() ->toggleable(isToggledHiddenByDefault: true), Tables\Columns\TextColumn::make('deleted_at') ->dateTime() ->sortable() ->toggleable(isToggledHiddenByDefault: true), ]) ->filters([ Tables\Filters\TrashedFilter::make(), ]) ->actions([ Tables\Actions\ViewAction::make(), Tables\Actions\EditAction::make(), ]) ->bulkActions([ Tables\Actions\BulkActionGroup::make([ Tables\Actions\DeleteBulkAction::make(), Tables\Actions\ForceDeleteBulkAction::make(), Tables\Actions\RestoreBulkAction::make(), ]), ]) ->headerActions([ ImportAction::make() ->importer(ProductionPlanImporter::class) ->maxRows(100000), ExportAction::make() ->exporter(ProductionPlanExporter::class), ]); } public static function getRelations(): array { return [ // ]; } public static function getPages(): array { return [ 'index' => Pages\ListProductionPlans::route('/'), 'create' => Pages\CreateProductionPlan::route('/create'), 'view' => Pages\ViewProductionPlan::route('/{record}'), 'edit' => Pages\EditProductionPlan::route('/{record}/edit'), ]; } public static function getEloquentQuery(): Builder { return parent::getEloquentQuery() ->withoutGlobalScopes([ SoftDeletingScope::class, ]); } }