diff --git a/app/Filament/Resources/QualityValidationResource.php b/app/Filament/Resources/QualityValidationResource.php index cbf851d..b50d2e9 100644 --- a/app/Filament/Resources/QualityValidationResource.php +++ b/app/Filament/Resources/QualityValidationResource.php @@ -92,7 +92,12 @@ class QualityValidationResource extends Resource ->hint(fn ($get) => $get('pqPlantError') ? $get('pqPlantError') : null) ->hintColor('danger'), Forms\Components\Hidden::make('plant') - ->default(fn () => session('last_selected_plant_id')), + ->default(fn () => session('last_selected_plant_id')) + ->afterStateHydrated(function ($state, $set) { + if (!$state && request()->has('plant_id')) { + $set('plant_id', request()->get('plant_id')); + } + }), Forms\Components\Select::make('line_id') ->label('Line Name') @@ -129,7 +134,12 @@ class QualityValidationResource extends Resource ->hint(fn ($get) => $get('pqLineError') ? $get('pqLineError') : null) ->hintColor('danger'), Forms\Components\Hidden::make('line') - ->default(fn () => session('last_selected_line')), + ->default(fn () => session('last_selected_line')) + ->afterStateHydrated(function ($state, $set) { + if (!$state && request()->has('line_id')) { + $set('line_id', request()->get('line_id')); + } + }), Forms\Components\Hidden::make('sticker_master_id') // ->relationship('stickerMaster', 'id') ->required(), @@ -166,7 +176,12 @@ class QualityValidationResource extends Resource ->required(), Forms\Components\Hidden::make('production') - ->default(fn () => session('last_selected_production')), + ->default(fn () => session('last_selected_production')) + ->afterStateHydrated(function ($state, $set) { + if (!$state && request()->has('production_order')) { + $set('production_order', request()->get('production_order')); + } + }), Forms\Components\Hidden::make('operator_id') ->required() @@ -202,6 +217,7 @@ class QualityValidationResource extends Resource Forms\Components\TextInput::make('item_id') ->label('Item Code') + // ->id('item_id') ->placeholder('Scan the valid QR code') ->reactive() ->required() @@ -572,6 +588,9 @@ class QualityValidationResource extends Resource ->extraAttributes([ 'onkeydown' => "if (event.key === 'Enter') { event.preventDefault(); return false; }", ]) + ->extraAttributes([ + 'id' => 'item_id' + ]) ->hint(fn ($get) => $get('validationError') ? $get('validationError') : null) ->hintColor('danger'), @@ -2378,6 +2397,7 @@ class QualityValidationResource extends Resource } $expectedValue = $stickerMaster->part_validation1; + $mExpectedValue = $expectedValue ?? null; if ($state == null || trim($state) == '') { $set('part_validation1_error', null); @@ -2398,10 +2418,11 @@ class QualityValidationResource extends Resource $emails = $mailData['emails']; $mUserName = Filament::auth()->user()->name; + if (! empty($emails)) { // Mail::to($emails)->send(new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType)); Mail::to($emails)->send( - new InvalidQualityMail($state, $mPorder, $mPlantName, $mLinePart, $mUserName, 'InvalidPartNumber') + new InvalidQualityMail($state, $mPorder, $mPlantName, $mLinePart, $mUserName, $mExpectedValue, 'InvalidPartNumber') ); } else { \Log::warning("No recipients found for plant {$mPlantName}, module Serial, rule invalid_serial."); @@ -2475,6 +2496,7 @@ class QualityValidationResource extends Resource } $expectedValue = $stickerMaster->part_validation2; + $mExpectedValue = $expectedValue ?? null; if ($state == null || trim($state) == '') { $set('part_validation2_error', null); @@ -2492,10 +2514,11 @@ class QualityValidationResource extends Resource $emails = $mailData['emails']; $mUserName = Filament::auth()->user()->name; + if (! empty($emails)) { // Mail::to($emails)->send(new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType)); Mail::to($emails)->send( - new InvalidQualityMail($state, $mPorder, $mPlantName, $mLinePart, $mUserName, 'InvalidPartNumber2') + new InvalidQualityMail($state, $mPorder, $mPlantName, $mLinePart, $mUserName, $mExpectedValue, 'InvalidPartNumber2') ); } else { \Log::warning("No recipients found for plant {$mPlantName}, module Serial, rule invalid_serial."); @@ -2576,6 +2599,7 @@ class QualityValidationResource extends Resource } $expectedValue = $stickerMaster->part_validation3; + $mExpectedValue = $expectedValue ?? null; if ($state == $expectedValue) { $set('part_validation3_error', null); @@ -2590,7 +2614,7 @@ class QualityValidationResource extends Resource if (! empty($emails)) { // Mail::to($emails)->send(new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType)); Mail::to($emails)->send( - new InvalidQualityMail($state, $mPorder, $mPlantName, $mLinePart, $mUserName, 'InvalidPartNumber3') + new InvalidQualityMail($state, $mPorder, $mPlantName, $mLinePart, $mUserName, $mExpectedValue, 'InvalidPartNumber3') ); } else { \Log::warning("No recipients found for plant {$mPlantName}, module Serial, rule invalid_serial."); @@ -2663,6 +2687,7 @@ class QualityValidationResource extends Resource } $expectedValue = $stickerMaster->part_validation4; + $mExpectedValue = $expectedValue ?? null; // If input is empty, reset the error if ($state == null || trim($state) == '') { @@ -2681,10 +2706,11 @@ class QualityValidationResource extends Resource $emails = $mailData['emails']; $mUserName = Filament::auth()->user()->name; + if (! empty($emails)) { // Mail::to($emails)->send(new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType)); Mail::to($emails)->send( - new InvalidQualityMail($state, $mPorder, $mPlantName, $mLinePart, $mUserName, 'InvalidPartNumber4') + new InvalidQualityMail($state, $mPorder, $mPlantName, $mLinePart, $mUserName, $mExpectedValue, 'InvalidPartNumber4') ); } else { \Log::warning("No recipients found for plant {$mPlantName}, module Serial, rule invalid_serial."); @@ -2823,12 +2849,31 @@ class QualityValidationResource extends Resource Forms\Components\TextInput::make('id') ->hidden() ->readOnly(), + + Forms\Components\View::make('components.production-checklist-wrapper') + ->visible(fn ($livewire) => $livewire->showChecklist) + ->statePath('checklist') + ->viewData(fn ($livewire) => [ + 'existingRecords' => $livewire->existingRecords->toArray(), + 'data' => $livewire->data, + 'showChecklist' => $livewire->showChecklist, + ]), + + // Forms\Components\View::make('components.production-checklist-wrapper') + // ->statePath('checklist') + // ->key('checklist-view') + // ->viewData(fn ($livewire) => [ + // 'existingRecords' => is_array($livewire->existingRecords) + // ? $livewire->existingRecords + // : $livewire->existingRecords->toArray(), + // 'showChecklist' => $livewire->showChecklist, + // ]), + ]); } public static function getMailData($plantId) { - $globalEmails = AlertMailRule::where('plant', 0) ->where('module', 'QualityValidation') ->where('rule_name', 'QualityMail') @@ -3240,7 +3285,6 @@ class QualityValidationResource extends Resource Tables\Actions\ViewAction::make(), Tables\Actions\EditAction::make(), ]) - ->bulkActions([ Tables\Actions\BulkActionGroup::make([ Tables\Actions\DeleteBulkAction::make(), diff --git a/app/Filament/Resources/QualityValidationResource/Pages/CreateQualityValidation.php b/app/Filament/Resources/QualityValidationResource/Pages/CreateQualityValidation.php index 6ced269..a340c49 100644 --- a/app/Filament/Resources/QualityValidationResource/Pages/CreateQualityValidation.php +++ b/app/Filament/Resources/QualityValidationResource/Pages/CreateQualityValidation.php @@ -3,18 +3,50 @@ namespace App\Filament\Resources\QualityValidationResource\Pages; use App\Filament\Resources\QualityValidationResource; +use App\Livewire\ProductionCheckList; +use App\Models\ProductCharacteristicsMaster; +use App\Models\ProductionCharacteristic; +use App\Models\QualityValidation; use Filament\Actions; use Filament\Forms\Components\Component; use Filament\Resources\Pages\CreateRecord; use Illuminate\Validation\ValidationException; +use Filament\Actions\Action; +use Filament\Notifications\Notification; class CreateQualityValidation extends CreateRecord { protected static string $resource = QualityValidationResource::class; + public $showChecklist = false; + public $checklist; + + public $skipChecklistValidation = false; + + public bool $shouldSkipChecklist = false; + + public $existingRecords = []; + + protected $listeners = [ + 'checklistUpdated' => 'setChecklist', + 'checklist-cancelled' => 'handleChecklistCancel', + 'checklist-saved' => 'checkListSaved', + 'trigger-create' => 'doCreate', + ]; + + public function setChecklist($checklist) + { + $this->data['checklist'] = $checklist; + } + + public function doCreate() + { + $this->create(); + } public function mount(): void { parent::mount(); + session()->forget([ 'last_selected_plant_id', 'last_selected_line', @@ -22,6 +54,68 @@ class CreateQualityValidation extends CreateRecord ]); } + public function handleChecklistCancel() + { + $this->skipChecklistValidation = true; + $this->showChecklist = false; + } + + protected function mutateFormDataBeforeCreate(array $data): array + { + if ($this->shouldSkipChecklist) { + return $data; + } + + if ($this->checkIfHasCharacteristics($data)) { + $this->showChecklist = true; + + $this->halt(); + } + + return $data; + } + + protected function checkIfHasCharacteristics(array $data) + { + $plantId = $data['plant_id'] ?? null; + $itemCode = $data['item_id'] ?? null; + $lineId = $data['line_id'] ?? null; + + if (!$plantId || !$itemCode || !$lineId) { + return false; + } + + $item = \App\Models\Item::where('code', $itemCode) + ->where('plant_id', $plantId) + ->first(); + + if (!$item) { + $this->existingRecords = collect(); + return false; + } + + $this->existingRecords = ProductCharacteristicsMaster::where('plant_id', $plantId) + ->where('item_id', $item->id) + ->where('line_id', $lineId) + ->get(); + } + + public function checkListSaved() + { + $this->showChecklist = false; + + $plantId = $this->data['plant_id'] ?? null; + $lineId = $this->data['line_id'] ?? null; + $productionOrder = $this->data['production_order'] ?? null; + + return redirect()->to( + static::getResource()::getUrl('create', [ + 'plant_id' => $this->data['plant_id'] ?? null, + 'line_id' => $this->data['line_id'] ?? null, + 'production_order' => $this->data['production_order'] ?? null, + ]) + ); + } protected function beforeCreate(): void { @@ -98,18 +192,82 @@ class CreateQualityValidation extends CreateRecord $errors['part_validation5_error'] = ['Fix the errors before submitting.']; } - if (!empty($errors)) { throw ValidationException::withMessages($errors); } + + $this->checkExisting(); + + $checklist = $this->data['data']['checklist'] ?? []; + + if (count($this->existingRecords) > 0){ + $this->showChecklist = true; + $this->halt(); + } + else{ + $this->showChecklist = false; + } + } + + public function checkExisting() + { + $plant_id = $this->data['plant_id'] ?? null; + $item_code = $this->data['item_id'] ?? null; + $line_id = $this->data['line_id'] ?? null; + + + $item = \App\Models\Item::where('code', $item_code)->where('plant_id', $plant_id)->first(); + + if (!$item) { + $this->existingRecords = collect(); + return; + } + + $item_id = $item->id; + + $this->existingRecords = ProductCharacteristicsMaster::where('plant_id', $plant_id) + ->where('item_id', $item_id) + ->where('line_id', $line_id) + ->get(); } protected function afterCreate(): void { - // Get the value from the hidden field 'plant' + // Get the value from the hidden field 'plant' $plant = $this->form->getState()['plant'] ?? null; $line = $this->form->getState()['line'] ?? null; $production = $this->form->getState()['production'] ?? null; + + // $this->skipChecklistValidation = false; + // $this->showChecklist = false; + // $this->checklist = []; + + // $this->form->fill(); + + // reset checklist + $this->checklist = []; + + $this->skipChecklistValidation = false; + $this->showChecklist = false; + + $this->form->fill([]); + + $this->data = []; + + $this->resetValidation(); + $this->resetErrorBag(); + + $this->form->fill([ + 'plant_id' => null, + 'line_id' => null, + 'production_order' => null, + ]); + + + // $this->dispatch('focus-item-id'); + session()->flash('focus_item_id_after_redirect', true); + logger('Focus flag set in session'); + if ($plant) { session(['last_selected_plant_id' => $plant]); } @@ -121,13 +279,14 @@ class CreateQualityValidation extends CreateRecord } } - protected function getRedirectUrl(): string { - //return $this->getResource()::getUrl('create'); // Stay on Create Page after saving + //return $this->getResource()::getUrl('create'); // Stay on Create Page after savin return $this->getResource()::getUrl('create', [ 'plant_id' => $this->data['plant_id'] ?? null, + 'line_id' => $this->data['line_id'] ?? null, + 'production_order' => $this->data['production_order'] ?? null, ]); } diff --git a/app/Filament/Resources/QualityValidationResource/Pages/EditQualityValidation.php b/app/Filament/Resources/QualityValidationResource/Pages/EditQualityValidation.php index 0e4e70a..fd47ff2 100644 --- a/app/Filament/Resources/QualityValidationResource/Pages/EditQualityValidation.php +++ b/app/Filament/Resources/QualityValidationResource/Pages/EditQualityValidation.php @@ -10,6 +10,8 @@ class EditQualityValidation extends EditRecord { protected static string $resource = QualityValidationResource::class; + public bool $showChecklist = false; + protected function getHeaderActions(): array { return [ diff --git a/app/Filament/Resources/QualityValidationResource/Pages/ListQualityValidations.php b/app/Filament/Resources/QualityValidationResource/Pages/ListQualityValidations.php index bf231c4..9a0c39b 100644 --- a/app/Filament/Resources/QualityValidationResource/Pages/ListQualityValidations.php +++ b/app/Filament/Resources/QualityValidationResource/Pages/ListQualityValidations.php @@ -10,6 +10,8 @@ class ListQualityValidations extends ListRecords { protected static string $resource = QualityValidationResource::class; + public bool $showChecklist = false; + protected function getHeaderActions(): array { return [ diff --git a/app/Filament/Resources/QualityValidationResource/Pages/ViewQualityValidation.php b/app/Filament/Resources/QualityValidationResource/Pages/ViewQualityValidation.php index 1b15180..93638f0 100644 --- a/app/Filament/Resources/QualityValidationResource/Pages/ViewQualityValidation.php +++ b/app/Filament/Resources/QualityValidationResource/Pages/ViewQualityValidation.php @@ -10,6 +10,8 @@ class ViewQualityValidation extends ViewRecord { protected static string $resource = QualityValidationResource::class; + public bool $showChecklist = false; + protected function getHeaderActions(): array { return [