schema([ Forms\Components\Select::make('plant_id') ->relationship('plant', 'name') ->reactive() ->afterStateUpdated(fn (callable $set) => [ $set('item_id', null), $set('validationError', null), ]) ->required(), Forms\Components\Hidden::make('sticker_master_id') // ->relationship('stickerMaster', 'id') ->required(), Forms\Components\TextInput::make('production_order') ->required(), Forms\Components\TextInput::make('item_id') ->label('Item Code') ->placeholder('Scan the valid QR code') ->reactive() ->required() ->afterStateUpdated(function (callable $set, callable $get, ?string $state) { // Reset visibility of all serial and part validation fields $serialFields = [ 'serial_number_motor', 'serial_number_pump', 'serial_number_pumpset', 'pack_slip_motor', 'pack_slip_pump', 'pack_slip_pumpset', 'name_plate_motor', 'name_plate_pump', 'name_plate_pumpset', 'tube_sticker_motor', 'tube_sticker_pump', 'tube_sticker_pumpset', 'warranty_card' ]; $partValidationColumns = [ 'part_validation1', 'part_validation2', 'part_validation3', 'part_validation4', 'part_validation5' ]; foreach ($serialFields as $field) { $set($field . '_visible', false); $set($field, null); } foreach ($partValidationColumns as $column) { $set($column . '_visible', false); $set($column, null); } // Proceed with validation logic for new scanned QR code if (!$state) { return; } if (strpos($state, '|') === false) { return; } $parts = explode('|', $state); $itemCode = trim($parts[0]); // Extract item code // 123456|123456789 $serialNumber = trim($parts[1]); // Store serial number before resetting fields $previousSerialNumber = $serialNumber; $previousItemCode = $itemCode; if (strlen($itemCode) < 6) { $set('validationError', 'Item code must be at least 6 digits.'); $set('item_id', null); return; } else if (!ctype_alnum($itemCode)) { $set('validationError', 'Item Code should contain alpha-numeric values.'); $set('item_id', null); return; } else if ($serialNumber === '') { $set('validationError', 'Waiting for full QR scan...'); return; // Do not clear item_id, just wait for full input } else if (strlen($serialNumber) < 9) { $set('validationError', 'Serial Number must be at least 9 digits.'); return; } else if (!ctype_alnum($serialNumber)) { $set('validationError', 'Serial Number should contain alpha-numeric values.'); $set('item_id', null); return; } else { $set('validationError', null); } if (!preg_match('/^[a-zA-Z0-9]+\|[a-zA-Z0-9]+(\|)?$/', $state)) { $set('validationError', 'Invalid QR code format. Expected: Item_Code|Serial_Number.'); return; } //$set('validationError', null); $plantId = $get('plant_id'); // Get selected plant if (!$plantId) { $set('validationError', 'Please select a plant first.'); $set('item_id', null); return; } // Check if the item exists for the selected plant $stickerMaster = \App\Models\StickerMaster::where('plant_id', $plantId) ->whereHas('item', function ($query) use ($itemCode) { $query->where('code', $itemCode); })->first(); if (!$stickerMaster) { $set('validationError', 'Scanned item code does not exist for the selected plant.'); $set('sticker_master_id', null); return; } else { $set('sticker_master_id', $stickerMaster->id); $set('item_id', $itemCode); } // Check if user input matches the database values foreach ($partValidationColumns as $field) { if ($get("{$field}_visible")) { // Only validate visible fields $userInput = $get($field); // Get user input $expectedValue = $stickerMaster->$field; // Get expected value from DB if ($userInput !== null && $userInput !== $expectedValue) { $set('validationError', "Invalid input for $field. Expected: $expectedValue"); return; // Stop execution if any validation fails } } } $serialExists = QualityValidation::where('sticker_master_id', $stickerMaster->id) ->where(function ($query) use ($serialNumber, $serialFields) { foreach ($serialFields as $column) { $query->orWhere($column, $serialNumber); } })->exists(); if ($serialExists) { $set('validationError', 'Already scanning process completed.'); $set('item_id', "$previousItemCode|$previousSerialNumber"); // Restore original QR code return; } // Check if the serial number exists in any column of any row $serialExists = QualityValidation::where(function ($query) use ($serialNumber, $serialFields) { foreach ($serialFields as $column) { $query->orWhere($column, $serialNumber); } })->exists(); if ($serialExists) { $set('validationError', 'Serial number already exists in quality validation.'); // Restore the serial number before returning $set('item_id', "$itemCode|$previousSerialNumber"); // Reinsert full QR code return; } // Clear validation error if all inputs match $set('validationError', null); // Filter columns with value `1` $visibleColumns = []; foreach ($serialFields as $column) { if ($stickerMaster->$column === 1) { $visibleColumns[] = $column; } } // Filter part validation columns that are not `null` $visiblePartValidations = []; foreach ($partValidationColumns as $column) { if ($stickerMaster->$column !== null) { $visiblePartValidations[] = $column; } } foreach ($serialFields as $column) { if ($stickerMaster->$column == 1) { $set($column . '_visible', true); } else { $set($column . '_visible', false); } } foreach ($partValidationColumns as $column) { if ($stickerMaster->$column !== null) { $set($column . '_visible', true); // Separate key for visibility } else { $set($column . '_visible', false); } } // Assign serial number to only visible text inputs foreach ($serialFields as $field) { if ($get("{$field}_visible")) { $set($field, $serialNumber); } } }) ->extraAttributes(fn ($get) => [ 'class' => $get('validationError') ? 'border-red-500' : '', ]) ->hint(fn ($get) => $get('validationError') ? $get('validationError') : null) ->hintColor('danger'), Forms\Components\TextInput::make('serial_number_motor') ->hidden(fn (callable $get) => !$get('serial_number_motor_visible')) // Controls visibility ->default(''), // Keeps input empty Forms\Components\TextInput::make('serial_number_pump') ->hidden(fn (callable $get) => !$get('serial_number_pump_visible')) ->default(''), Forms\Components\TextInput::make('serial_number_pumpset') ->hidden(fn (callable $get) => !$get('serial_number_pumpset_visible')) ->default(''), Forms\Components\TextInput::make('pack_slip_motor') ->hidden(fn (callable $get) => !$get('pack_slip_motor_visible')) ->default(''), Forms\Components\TextInput::make('pack_slip_pump') ->hidden(fn (callable $get) => !$get('pack_slip_pump_visible')) ->default(''), Forms\Components\TextInput::make('pack_slip_pumpset') ->hidden(fn (callable $get) => !$get('pack_slip_pumpset_visible')) ->default(''), Forms\Components\TextInput::make('name_plate_motor') ->hidden(fn (callable $get) => !$get('name_plate_motor_visible')) ->default(''), Forms\Components\TextInput::make('name_plate_pump') ->hidden(fn (callable $get) => !$get('name_plate_pump_visible')) ->default(''), Forms\Components\TextInput::make('name_plate_pumpset') ->hidden(fn (callable $get) => !$get('name_plate_pumpset_visible')) ->default(''), Forms\Components\TextInput::make('tube_sticker_motor') ->hidden(fn (callable $get) => !$get('tube_sticker_motor_visible')) ->default(''), Forms\Components\TextInput::make('tube_sticker_pump') ->hidden(fn (callable $get) => !$get('tube_sticker_pump_visible')) ->default(''), Forms\Components\TextInput::make('tube_sticker_pumpset') ->hidden(fn (callable $get) => !$get('tube_sticker_pumpset_visible')) ->default(''), Forms\Components\TextInput::make('warranty_card') ->hidden(fn (callable $get) => !$get('warranty_card_visible')) ->default(''), Forms\Components\TextInput::make('part_validation1') ->hidden(fn (callable $get) => !$get('part_validation1_visible')) ->default('') ->reactive() ->required() ->afterStateUpdated(function (callable $set, callable $get, ?string $state) { $stickerMasterId = $get('sticker_master_id'); if (!$stickerMasterId) { return; } $stickerMaster = \App\Models\StickerMaster::find($stickerMasterId); if (!$stickerMaster) { return; } $expectedValue = $stickerMaster->part_validation1; // If input is empty, reset the error if ($state === null || trim($state) === '') { $set('part_validation1_error', null); return; } if ($state === $expectedValue) { $set('part_validation1_error', null); } else { $set('part_validation1_error', "Invalid input for part validation 1."); // Expected: $expectedValue } }) ->extraAttributes(fn ($get) => [ 'class' => $get('part_validation1_error') ? 'border-red-500' : '', ]) ->hint(fn ($get) => $get('part_validation1_error')) ->hintColor('danger'), Forms\Components\TextInput::make('part_validation2') ->hidden(fn (callable $get) => !$get('part_validation2_visible')) ->default('') ->required() ->afterStateUpdated(function (callable $set, callable $get, ?string $state) { $stickerMasterId = $get('sticker_master_id'); if (!$stickerMasterId) { return; } $stickerMaster = \App\Models\StickerMaster::find($stickerMasterId); if (!$stickerMaster) { return; } $expectedValue = $stickerMaster->part_validation2; // If input is empty, reset the error if ($state === null || trim($state) === '') { $set('part_validation2_error', null); return; } // If input is empty, do not show an error if ($state === $expectedValue) { $set('part_validation2_error', null); } else { $set('part_validation2_error', "Invalid input for part validation 2."); // Expected: $expectedValue } }) ->extraAttributes(fn ($get) => [ 'class' => $get('part_validation2_error') ? 'border-red-500' : '', ]) ->hint(fn ($get) => $get('part_validation2_error')) ->hintColor('danger'), Forms\Components\TextInput::make('part_validation3') ->hidden(fn (callable $get) => !$get('part_validation3_visible')) ->default('') ->required() ->afterStateUpdated(function (callable $set, callable $get, ?string $state) { $stickerMasterId = $get('sticker_master_id'); if (!$stickerMasterId) { return; } $stickerMaster = \App\Models\StickerMaster::find($stickerMasterId); if (!$stickerMaster) { return; } $expectedValue = $stickerMaster->part_validation3; // If input is empty, reset the error if ($state === null || trim($state) === '') { $set('part_validation3_error', null); return; } // If input is empty, do not show an error if ($state === $expectedValue) { $set('part_validation3_error', null); } else { $set('part_validation3_error', "Invalid input for part validation 3."); // Expected: $expectedValue } }) ->extraAttributes(fn ($get) => [ 'class' => $get('part_validation3_error') ? 'border-red-500' : '', ]) ->hint(fn ($get) => $get('part_validation3_error')) ->hintColor('danger'), Forms\Components\TextInput::make('part_validation4') ->hidden(fn (callable $get) => !$get('part_validation4_visible')) ->default('') ->required() ->afterStateUpdated(function (callable $set, callable $get, ?string $state) { $stickerMasterId = $get('sticker_master_id'); if (!$stickerMasterId) { return; } $stickerMaster = \App\Models\StickerMaster::find($stickerMasterId); if (!$stickerMaster) { return; } $expectedValue = $stickerMaster->part_validation4; // If input is empty, reset the error if ($state === null || trim($state) === '') { $set('part_validation4_error', null); return; } // If input is empty, do not show an error if ($state === $expectedValue) { $set('part_validation4_error', null); } else { $set('part_validation4_error', "Invalid input for part validation 4."); // Expected: $expectedValue } }) ->extraAttributes(fn ($get) => [ 'class' => $get('part_validation4_error') ? 'border-red-500' : '', ]) ->hint(fn ($get) => $get('part_validation4_error')) ->hintColor('danger'), Forms\Components\TextInput::make('part_validation5') ->hidden(fn (callable $get) => !$get('part_validation5_visible')) ->default('') ->required() ->afterStateUpdated(function (callable $set, callable $get, ?string $state) { $stickerMasterId = $get('sticker_master_id'); if (!$stickerMasterId) { return; } $stickerMaster = \App\Models\StickerMaster::find($stickerMasterId); if (!$stickerMaster) { return; } $expectedValue = $stickerMaster->part_validation4; // If input is empty, reset the error if ($state === null || trim($state) === '') { $set('part_validation5_error', null); return; } // If input is empty, do not show an error if ($state === $expectedValue) { $set('part_validation5_error', null); } else { $set('part_validation5_error', "Invalid input for part validation 5."); // Expected: $expectedValue } }) ->extraAttributes(fn ($get) => [ 'class' => $get('part_validation5_error') ? 'border-red-500' : '', ]) ->hint(fn ($get) => $get('part_validation5_error')) ->hintColor('danger'), ]); } public static function table(Table $table): Table { return $table ->columns([ Tables\Columns\TextColumn::make('id') ->label('ID') ->numeric() ->sortable(), Tables\Columns\TextColumn::make('plant.name') ->numeric() ->sortable(), Tables\Columns\TextColumn::make('stickerMaster.id') ->numeric() ->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(), ]), ]); } public static function getRelations(): array { return [ // ]; } public static function getPages(): array { return [ 'index' => Pages\ListQualityValidations::route('/'), 'create' => Pages\CreateQualityValidation::route('/create'), 'view' => Pages\ViewQualityValidation::route('/{record}'), 'edit' => Pages\EditQualityValidation::route('/{record}/edit'), ]; } public static function getEloquentQuery(): Builder { return parent::getEloquentQuery() ->withoutGlobalScopes([ SoftDeletingScope::class, ]); } }