From af3ae0803c5c89662109b0d0abf20e8b6bcd9f8d Mon Sep 17 00:00:00 2001 From: dhanabalan Date: Fri, 4 Jul 2025 17:39:30 +0530 Subject: [PATCH] Added locator validation functionality on resource page and importer file --- app/Filament/Imports/LocatorImporter.php | 68 +++++++++++++++-- app/Filament/Resources/LocatorResource.php | 86 ++++++++++++++++++++-- 2 files changed, 140 insertions(+), 14 deletions(-) diff --git a/app/Filament/Imports/LocatorImporter.php b/app/Filament/Imports/LocatorImporter.php index 318fe18..57b07fd 100644 --- a/app/Filament/Imports/LocatorImporter.php +++ b/app/Filament/Imports/LocatorImporter.php @@ -3,9 +3,15 @@ namespace App\Filament\Imports; use App\Models\Locator; +use App\Models\PalletValidation; +use App\Models\Plant; +use App\Models\User; +use Filament\Actions\Imports\Exceptions\RowImportFailedException; use Filament\Actions\Imports\ImportColumn; use Filament\Actions\Imports\Importer; use Filament\Actions\Imports\Models\Import; +use Filament\Facades\Filament; +use Str; class LocatorImporter extends Importer { @@ -17,23 +23,27 @@ class LocatorImporter extends Importer ImportColumn::make('locator_number') ->requiredMapping() ->exampleHeader('Locator Number') + ->example(['W01-A1A']) ->label('Locator Number') ->rules(['required']), ImportColumn::make('locator_quantity') ->requiredMapping() ->numeric() ->exampleHeader('Locator Quantity') + ->example(['0']) ->label('Locator Quantity') ->rules(['required', 'integer']), ImportColumn::make('operator_id') ->requiredMapping() ->exampleHeader('Operator ID') + ->example(['Admin']) ->label('Operator ID') ->rules(['required']), - ImportColumn::make('plant_id') + ImportColumn::make('plant') ->requiredMapping() - ->relationship('plant', 'name') + ->relationship(resolveUsing: 'name') ->exampleHeader('Plant') + ->example(['Ransar Industries-I']) ->label('Plant') ->rules(['required']), ]; @@ -41,12 +51,56 @@ class LocatorImporter extends Importer public function resolveRecord(): ?Locator { - // return Locator::firstOrNew([ - // // Update existing records, matching them by `$this->data['column_name']` - // 'email' => $this->data['email'], - // ]); + $warnMsg = []; + $plant = Plant::where('name', $this->data['plant'])->first(); + $locator = $this->data['locator_number']; + // $locatorQuantity = $this->data['locator_quantity']; + $palletQuantity = 0; + $user = Filament::auth()->user()->name; + if (!$plant) { + $warnMsg[] = "Plant not found"; + } + else + { + if (Str::length($locator) < 7) { + $warnMsg[] = "Invalid locator number found"; + } + else { + // $locat = Locator::where('name', $locator)->where('plant_id', $plant->id)->first(); + $palletQuantity = PalletValidation::where('locator_number', $locator)->where('plant_id', $plant->id)->distinct('pallet_number')->count('pallet_number'); + } + } - return new Locator(); + // if (Str::length($locatorQuantity) < 0 || !is_numeric($locatorQuantity) || $locatorQuantity < 0 || $locatorQuantity > 2) { + // $warnMsg[] = "Invalid locator quantity found"; + // } + + // $user = User::where('name', $user)->first(); + // if (!$user) { + // $warnMsg[] = "Operator ID not found"; + // } + + if (!empty($warnMsg)) { + throw new RowImportFailedException(implode(', ', $warnMsg)); + } + + Locator::updateOrCreate( + [ + 'plant_id' => $plant->id, + 'locator_number' => $locator + ], + [ + 'locator_quantity' => $palletQuantity, + 'operator_id' => $user + ] + ); + return null; + // // return Locator::firstOrNew([ + // // // Update existing records, matching them by `$this->data['column_name']` + // // 'email' => $this->data['email'], + // // ]); + + // return new Locator(); } public static function getCompletedNotificationBody(Import $import): string diff --git a/app/Filament/Resources/LocatorResource.php b/app/Filament/Resources/LocatorResource.php index 824cf5d..9efb7f4 100644 --- a/app/Filament/Resources/LocatorResource.php +++ b/app/Filament/Resources/LocatorResource.php @@ -7,6 +7,8 @@ use App\Filament\Imports\LocatorImporter; use App\Filament\Resources\LocatorResource\Pages; use App\Filament\Resources\LocatorResource\RelationManagers; use App\Models\Locator; +use App\Models\PalletValidation; +use Filament\Forms\Get; use Filament\Tables\Actions\ImportAction; use Filament\Facades\Filament; use Filament\Forms; @@ -17,6 +19,8 @@ use Filament\Tables\Actions\ExportAction; use Filament\Tables\Table; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\SoftDeletingScope; +use Illuminate\Validation\Rule; +use Str; class LocatorResource extends Resource { @@ -34,19 +38,87 @@ class LocatorResource extends Resource ->schema([ Forms\Components\Select::make('plant_id') ->relationship('plant', 'name') - ->required(), + ->required() + // ->nullable(), + ->reactive() + ->default(function () { + return optional(Locator::latest()->first())->plant_id; + }) + ->disabled(fn (Get $get) => !empty($get('id'))) + // ->afterStateUpdated(fn ($set) => $set('block_id', null) & $set('name', null) & $set('start_time', null) & $set('duration', null) & $set('end_time', null)) + ->afterStateUpdated(function ($state, callable $set, callable $get) { + $plantId = $get('plant_id'); + // Ensure `linestop_id` is not cleared + if (!$plantId) { + $set('locPlantError', 'Please select a plant first.'); + $set('locator_number', null); + $set('locator_quantity', 0); + $set('operator_id', Filament::auth()->user()?->name); + return; + } + else + { + $set('locPlantError', null); + $set('locator_number', null); + $set('locator_quantity', 0); + $set('operator_id', Filament::auth()->user()?->name); + } + }) + ->extraAttributes(fn ($get) => [ + 'class' => $get('locPlantError') ? 'border-red-500' : '', + ]) + ->hint(fn ($get) => $get('locPlantError') ? $get('locPlantError') : null) + ->hintColor('danger'), Forms\Components\TextInput::make('locator_number') ->label('Locator Number') - ->required(), - Forms\Components\TextInput::make('locator_quantity') + ->minLength(7) + ->reactive() ->required() - ->numeric() + ->afterStateUpdated(function ($state, callable $set, callable $get) { + $plantId = $get('plant_id'); + $locator = $get('locator_number'); + if (!$plantId) { + $set('locNameError', 'Please select a plant first.'); + $set('locator_number', null); + $set('locator_quantity', 0); + $set('operator_id', Filament::auth()->user()?->name); + return; + } + else if (!$locator || Str::length($locator) < 7) { + $set('locNameError', 'Please scan the valid locator number.'); + $set('locator_quantity', 0); + $set('operator_id', Filament::auth()->user()?->name); + return; + } + else + { + $set('locNameError', null); + $set('locator_quantity', PalletValidation::where('locator_number', $locator)->where('plant_id', $plantId)->distinct('pallet_number')->count('pallet_number')); + $set('operator_id', Filament::auth()->user()?->name); + } + }) + ->extraAttributes(fn ($get) => [ + 'class' => $get('locNameError') ? 'border-red-500' : '', + ]) + ->hint(fn ($get) => $get('locNameError') ? $get('locNameError') : null) + ->hintColor('danger') + ->rule(function (callable $get) { + return Rule::unique('locators', 'locator_number') + ->where('plant_id', $get('plant_id')) + ->ignore($get('id')); // Ignore current record during updates + }), + Forms\Components\TextInput::make('locator_quantity') ->label('Locator Quantity') + ->required() + ->readOnly() + ->numeric() ->default(0), Forms\Components\Hidden::make('operator_id') - ->default(Filament::auth()->user()?->name) - ->required(), - + ->default(Filament::auth()->user()?->name) + ->required(), + Forms\Components\TextInput::make('id') + ->hidden() + ->readOnly(), ]); }