From 8d872498f4f95cc95af4f5aac07ee400b03f252a Mon Sep 17 00:00:00 2001 From: dhanabalan Date: Mon, 12 May 2025 19:23:26 +0530 Subject: [PATCH] Added uom, sap_msg_status, sap_msg_description, serial_number columns into quality_validations resource page and updated scanned serial number comparison func. using serial_number column and updated filter func. --- .../Resources/QualityValidationResource.php | 969 ++++++++++++++---- 1 file changed, 747 insertions(+), 222 deletions(-) diff --git a/app/Filament/Resources/QualityValidationResource.php b/app/Filament/Resources/QualityValidationResource.php index 7e7ff37..cd38d4a 100644 --- a/app/Filament/Resources/QualityValidationResource.php +++ b/app/Filament/Resources/QualityValidationResource.php @@ -2,9 +2,14 @@ namespace App\Filament\Resources; +use App\Filament\Exports\QualityValidationExporter; +use App\Filament\Imports\QualityValidationImporter; use App\Filament\Resources\QualityValidationResource\Pages; use App\Filament\Resources\QualityValidationResource\RelationManagers; +use App\Models\Item; +use App\Models\Plant; use App\Models\QualityValidation; +use App\Models\StickerMaster; use Carbon\Carbon; use Closure; use Filament\Facades\Filament; @@ -16,6 +21,8 @@ use Filament\Forms\Components\TextInput; use Filament\Forms\Form; use Filament\Resources\Resource; use Filament\Tables; +use Filament\Tables\Actions\ExportAction; +use Filament\Tables\Actions\ImportAction; use Filament\Tables\Filters\SelectFilter; use Filament\Tables\Table; use Illuminate\Database\Eloquent\Builder; @@ -47,36 +54,73 @@ class QualityValidationResource extends Resource $set('item_id', null), $set('validationError', null), ]) - ->required(), + ->required() + ->default(fn () => request()->query('plant_id')), Forms\Components\Hidden::make('sticker_master_id') // ->relationship('stickerMaster', 'id') ->required(), - Forms\Components\TextInput::make('production_order') + Forms\Components\Hidden::make('uom') ->required(), + Forms\Components\Hidden::make('sap_msg_status'), + Forms\Components\Hidden::make('sap_msg_description'), + Forms\Components\TextInput::make('production_order') + ->placeholder('Scan the valid Production Order') + ->minLength(7) + ->reactive() + ->readOnly(fn (callable $get) => $get('item_id')) + ->afterStateUpdated(function (callable $set, callable $get, ?string $state) { + if(!is_numeric($get('production_order'))) + { + $set('productionError', "Must be a numeric value."); + $set('production_order', null); + $set('item_id', null); + $set('sticker_master_id', null); + $set('uom', null); + $set('serial_number', null); + return; + } + else + { + $set('productionError', null); + } + + }) + ->extraAttributes(fn ($get) => [ + 'class' => $get('productionError') ? 'border-red-500' : '', + ]) + ->hint(fn ($get) => $get('productionError') ? $get('productionError') : null) + ->hintColor('danger') + ->required(), + Forms\Components\Hidden::make('operator_id') + ->required() ->default(Filament::auth()->user()->name), + Forms\Components\Hidden::make('sap_msg_status') + ->default(null), + + Forms\Components\Hidden::make('sap_msg_description') + ->default(null), + Forms\Components\TextInput::make('item_id') ->label('Item Code') ->placeholder('Scan the valid QR code') ->reactive() ->required() ->autofocus() + ->live() ->afterStateUpdated(function (callable $set, callable $get, ?string $state) { $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' + 'serial_number_motor_qr', 'serial_number_pump_qr', 'serial_number_pumpset_qr', 'pack_slip_motor_qr', 'pack_slip_pump_qr', 'pack_slip_pumpset_qr', 'name_plate_motor_qr', 'name_plate_pump_qr', 'name_plate_pumpset_qr', 'tube_sticker_motor_qr', 'tube_sticker_pump_qr', 'tube_sticker_pumpset_qr', 'warranty_card_qr' ]; - $serialnumber = ['serial_number_motor', 'serial_number_pump', 'serial_number_pumpset']; + $set('serial_number', null); + + $serialnumber = ['serial_number_motor_qr', 'serial_number_pump_qr', 'serial_number_pumpset_qr']; $partValidationColumns = [ - 'part_validation1', 'part_validation2', 'part_validation3', - 'part_validation4', 'part_validation5' + 'part_validation1', 'part_validation2', 'part_validation3', 'part_validation4', 'part_validation5' ]; foreach ($serialFields as $field) { @@ -185,20 +229,42 @@ class QualityValidationResource extends Resource return; } // Check if the item exists for the selected plant - $stickerMaster = \App\Models\StickerMaster::where('plant_id', $plantId) - ->whereHas('item', function ($query) use ($itemCode) { + $stickerMaster = StickerMaster::where('plant_id', $plantId)->whereHas('item', function ($query) use ($itemCode) { $query->where('code', $itemCode); })->first(); + if (!$stickerMaster) { $set('validationError', 'Item code does not exist in master data.'); $set('sticker_master_id', null); + $set('uom', null); + $set('serial_number', null); return; } else { + if (!$stickerMaster->item->uom) { + $set('validationError', "Item code does not have 'UOM' in master data."); + $set('sticker_master_id', null); + $set('uom', null); + $set('serial_number', null); + return; + } + elseif(!is_numeric($get('production_order'))) + { + $set('productionError', "Must be a numeric value."); + $set('item_id', null); + $set('sticker_master_id', null); + $set('uom', null); + $set('serial_number', null); + return; + } + $set('sticker_master_id', $stickerMaster->id); + $set('uom', $stickerMaster->item->uom); $set('item_id', $itemCode); + // $set('serial_number', null); + // $set('serial_number', $serialNumber); } // Check if user input matches the database values foreach ($partValidationColumns as $field) { @@ -213,38 +279,54 @@ class QualityValidationResource extends Resource } } - $serialExists = QualityValidation::where(function ($query) use ($serialNumber, $serialFields) { - foreach ($serialFields as $column) { - $query->orWhere($column, $serialNumber); - } - })->exists(); + $serialExists = QualityValidation::where('serial_number', $serialNumber)->where('plant_id', $plantId)->exists(); + + // $serialExists = QualityValidation::where(function ($query) use ($serialNumber, $serialFields) { + // foreach ($serialFields as $column) { + // $colFld = $column; + // if (str_ends_with($colFld, '_qr')) { + // $colFld = substr($colFld, 0, -3); + // } + // $query->where($colFld, $serialNumber); + // } + // })->exists(); - if ($serialExists) { + if ($serialExists && !$get('id')) { $set('validationError', 'Serial number already exists in quality validation.'); - $set('item_id', "$itemCode|$previousSerialNumber"); + //$set('item_id', "$itemCode|$previousSerialNumber"); + // $set('item_id', null); + $set('sticker_master_id', null); + $set('uom', null); + $set('serial_number', null); return; } // Clear validation error if all inputs match $set('validationError', null); - $visibleColumns = []; - foreach ($serialFields as $column) { - if ($stickerMaster->$column === 1) { - $visibleColumns[] = $column; - } - } + // $visibleColumns = []; + // foreach ($serialFields as $column) { + // if ($stickerMaster->$column == 1) { + // $visibleColumns[] = $column; + // } + // } - $visiblePartValidations = []; - foreach ($partValidationColumns as $column) { - if ($stickerMaster->$column !== null) { - $visiblePartValidations[] = $column; - } - } + // $visiblePartValidations = []; + // foreach ($partValidationColumns as $column) { + // if ($stickerMaster->$column !== null) { + // $visiblePartValidations[] = $column; + // } + // } foreach ($serialFields as $column) { - if ($stickerMaster->$column == 1) { + + $colFld = $column; + if (str_ends_with($colFld, '_qr')) { + $colFld = substr($colFld, 0, -3); + } + + if ($stickerMaster->$colFld !== null) { $set($column . '_visible', true); } else { $set($column . '_visible', false); @@ -262,33 +344,262 @@ class QualityValidationResource extends Resource foreach ($serialnumber as $field) { if ($get("{$field}_visible")) { $set($field, $serialNumber); + $colFld = $field; + if (str_ends_with($colFld, '_qr')) { + $colFld = substr($colFld, 0, -3); + } + $set($colFld, '1'); break; } } + $set('serial_number', $serialNumber); }) ->extraAttributes(fn ($get) => [ 'class' => $get('validationError') ? 'border-red-500' : '', ]) + ->extraAttributes([ + 'onkeydown' => "if (event.key === 'Enter') { event.preventDefault(); return false; }", + ]) + ->hint(fn ($get) => $get('validationError') ? $get('validationError') : null) ->hintColor('danger'), + Forms\Components\Hidden::make('serial_number') + ->required(), - Forms\Components\TextInput::make('serial_number_motor') - ->hidden(fn (callable $get) => !$get('serial_number_motor_visible')) // Controls visibility + Forms\Components\Hidden::make('serial_number_motor'), + + Forms\Components\TextInput::make('serial_number_motor_qr') + ->label('Serial Number Motor') + ->reactive() + ->readOnly(fn (callable $get) => !$get('id')) + ->hidden(fn (callable $get) => !$get('serial_number_motor_qr_visible')) // Controls visibility ->default(''), - Forms\Components\TextInput::make('serial_number_pump') - ->hidden(fn (callable $get) => !$get('serial_number_pump_visible')) - ->default(''), + Forms\Components\Hidden::make('serial_number_pump'), - Forms\Components\TextInput::make('serial_number_pumpset') - ->hidden(fn (callable $get) => !$get('serial_number_pumpset_visible')) - ->default(''), + Forms\Components\TextInput::make('serial_number_pump_qr') + ->label('Serial Number Pump') + ->reactive() + ->required() + ->hidden(fn (callable $get) => !$get('serial_number_pump_qr_visible')) + ->default('') + ->afterStateUpdated(function (callable $set, callable $get, ?string $state) { - Forms\Components\TextInput::make('pack_slip_motor') - ->hidden(fn (callable $get) => !$get('pack_slip_motor_visible')) + $set('serial_number_pump_error', null); + + if (empty($state)) { + $set('serial_number_pump_error', null); + return; + } + + // if (!preg_match('/^([a-zA-Z0-9]{6,})\|([1-9][a-zA-Z0-9]{8,})\/[MmPpCc]\|?$/', $state)) { + if (!preg_match('/^([a-zA-Z0-9]{6,})\|([1-9][a-zA-Z0-9]{8,})(?:\/[MmPpCc])?\|?$/', $state)) { + + if (strpos($state, '|') === false) { + $set('serial_number_pump_error', 'Scan valid QR code.'); + return; + } + else + { + $splits = explode('|', $state); + $iCode = trim($splits[0]); + $sNumber = isset($splits[1]) ? trim($splits[1]) : null; + + if (!ctype_alnum($iCode)) { + $set('serial_number_pump_error', 'Item code must contain alpha-numeric values.'); + return; + } + else if (strlen($iCode) < 6) { + $set('serial_number_pump_error', 'Item code must be at least 6 digits.'); + return; + } + else if (strlen($sNumber) < 9) { + $set('serial_number_pump_error', 'Serial Number must be at least 9 digits.'); + return; + } + else if (!ctype_alnum($sNumber)) { + $set('serial_number_pump_error', 'Serial Number must contain alpha-numeric values.'); + return; + } + } + + $set('serial_number_pump_error', 'Scan valid QR code.'); + return; + } + else + { + $set('serial_number_pump_error', null); + } + + // Split state by pipeline "|" + $parts = explode('|', $state); + $itemCode = trim($parts[0]); + + $serialNumber = trim($parts[1]); + $serialNumber = preg_replace('/\/[MmPpCc]$/', '', $serialNumber); // Remove + + // Retrieve visible serial numbers + // $visibleSerialNumbers = array_filter([ + // $get('serial_number_motor_qr_visible') ? trim((string) $get('serial_number_motor')) : null, + // $get('serial_number_pump_qr_visible') ? trim((string) $get('serial_number_pump')) : null, + // $get('serial_number_pumpset_qr_visible') ? trim((string) $get('serial_number_pumpset')) : null, + // ]); + + $visibleSerialNumber = $get('serial_number'); + + $expectedItemCode = trim((string) $get('item_id')); + + if ($itemCode !== $expectedItemCode) + { + $set('serial_number_pump_error', 'Item code does not match.'); + return; + } + + $set('serial_number_pump_qr', $serialNumber); + $set('serial_number_pump', '1'); + + // $isMatch = in_array($serialNumber, $visibleSerialNumbers, true); + $isMatch = ($visibleSerialNumber == $serialNumber); + + if (!$serialNumber || trim($serialNumber) === '') { + $set('serial_number_pump_error', null); + return; + } + + if (!$isMatch) + { + $set('serial_number_pump_error', 'Serial number does not match.'); + $set('serial_number_pump_qr', null); + return; + } + else { + $set('serial_number_pump_error', null); + $set('serial_number_pump_qr', $serialNumber); + $set('serial_number_pump', '1'); + } + }) + ->extraAttributes(fn ($get) => [ + 'class' => $get('serial_number_pump_error') ? 'border-red-500' : '', + ]) + ->hint(fn ($get) => $get('serial_number_pump_error') ? $get('serial_number_pump_error') : null) + ->hintColor('danger'), + + Forms\Components\Hidden::make('serial_number_pumpset'), + + Forms\Components\TextInput::make('serial_number_pumpset_qr') + ->label('Serial Number PumpSet') + ->reactive() + ->readOnly(fn (callable $get) => !$get('id')) + ->hidden(fn (callable $get) => !$get('serial_number_pumpset_qr_visible')) + ->default(''), + // ->afterStateUpdated(function (callable $set, callable $get, ?string $state) { + + // $set('serial_number_pumpset_error', null); + + // if (empty($state)) { + // $set('serial_number_pumpset_error', null); + // return; + // } + + // // if (!preg_match('/^([a-zA-Z0-9]{6,})\|([1-9][a-zA-Z0-9]{8,})\/[MmPpCc]\|?$/', $state)) { + // if (!preg_match('/^([a-zA-Z0-9]{6,})\|([1-9][a-zA-Z0-9]{8,})(?:\/[MmPpCc])?\|?$/', $state)) { + + // if (strpos($state, '|') === false) { + // $set('serial_number_pumpset_error', 'Scan valid QR code.'); + // return; + // } + // else + // { + // $splits = explode('|', $state); + // $iCode = trim($splits[0]); + // $sNumber = isset($splits[1]) ? trim($splits[1]) : null; + + // if (!ctype_alnum($iCode)) { + // $set('serial_number_pumpset_error', 'Item code must contain alpha-numeric values.'); + // return; + // } + // else if (strlen($iCode) < 6) { + // $set('serial_number_pumpset_error', 'Item code must be at least 6 digits.'); + // return; + // } + // else if (strlen($sNumber) < 9) { + // $set('serial_number_pumpset_error', 'Serial Number must be at least 9 digits.'); + // return; + // } + // else if (!ctype_alnum($sNumber)) { + // $set('serial_number_pumpset_error', 'Serial Number must contain alpha-numeric values.'); + // return; + // } + // } + + // $set('serial_number_pumpset_error', 'Scan valid QR code.'); + // return; + // } + // else + // { + // $set('serial_number_pumpset_error', null); + // } + + // // Split state by pipeline "|" + // $parts = explode('|', $state); + // $itemCode = trim($parts[0]); + + // $serialNumber = trim($parts[1]); + // $serialNumber = preg_replace('/\/[MmPpCc]$/', '', $serialNumber); // Remove + + // // Retrieve visible serial numbers + // // $visibleSerialNumbers = array_filter([ + // // $get('serial_number_motor_qr_visible') ? trim((string) $get('serial_number_motor')) : null, + // // $get('serial_number_pump_qr_visible') ? trim((string) $get('serial_number_pump')) : null, + // // $get('serial_number_pumpset_qr_visible') ? trim((string) $get('serial_number_pumpset')) : null, + // // ]); + + // $visibleSerialNumber = $get('serial_number'); + + // $expectedItemCode = trim((string) $get('item_id')); + + // if ($itemCode !== $expectedItemCode) + // { + // $set('serial_number_pumpset_error', 'Item code does not match.'); + // return; + // } + + // $set('serial_number_pumpset_qr', $serialNumber); + // $set('serial_number_pumpset', '1'); + + // // $isMatch = in_array($serialNumber, $visibleSerialNumbers, true); + // $isMatch = ($visibleSerialNumber == $serialNumber); + + // if (!$serialNumber || trim($serialNumber) === '') { + // $set('serial_number_pumpset_error', null); + // return; + // } + + // if (!$isMatch) + // { + // $set('serial_number_pumpset_error', 'Serial number does not match.'); + // return; + // } + // else { + // $set('serial_number_pumpset_error', null); + // $set('serial_number_pumpset_qr', $serialNumber); + // $set('serial_number_pumpset', '1'); + // } + // }) + // ->extraAttributes(fn ($get) => [ + // 'class' => $get('serial_number_pumpset_error') ? 'border-red-500' : '', + // ]) + // ->hint(fn ($get) => $get('serial_number_pumpset_error') ? $get('serial_number_pumpset_error') : null) + // ->hintColor('danger'), + + Forms\Components\Hidden::make('pack_slip_motor'), + + Forms\Components\TextInput::make('pack_slip_motor_qr') + ->label('Pack Slip Motor') + ->hidden(fn (callable $get) => !$get('pack_slip_motor_qr_visible')) ->default('') ->reactive() ->required() @@ -347,12 +658,14 @@ class QualityValidationResource extends Resource $serialNumber = trim($parts[1]); $serialNumber = preg_replace('/\/[MmPpCc]$/', '', $serialNumber); // Remove - // Retrieve visible serial numbers - $visibleSerialNumbers = array_filter([ - $get('serial_number_motor_visible') ? trim((string) $get('serial_number_motor')) : null, - $get('serial_number_pump_visible') ? trim((string) $get('serial_number_pump')) : null, - $get('serial_number_pumpset_visible') ? trim((string) $get('serial_number_pumpset')) : null, - ]); + // // Retrieve visible serial numbers + // $visibleSerialNumbers = array_filter([ + // $get('serial_number_motor_qr_visible') ? trim((string) $get('serial_number_motor_qr')) : null, + // $get('serial_number_pump_qr_visible') ? trim((string) $get('serial_number_pump')) : null, + // $get('serial_number_pumpset_qr_visible') ? trim((string) $get('serial_number_pumpset')) : null, + // ]); + + $visibleSerialNumber = $get('serial_number'); $expectedItemCode = trim((string) $get('item_id')); @@ -361,9 +674,13 @@ class QualityValidationResource extends Resource return; } - $set('pack_slip_motor', $serialNumber); + $set('pack_slip_motor_qr', $serialNumber); - $isMatch = in_array($serialNumber, $visibleSerialNumbers, true); + $set('pack_slip_motor', '1'); + + + // $isMatch = in_array($serialNumber, $visibleSerialNumbers, true); + $isMatch = ($visibleSerialNumber == $serialNumber); if (!$serialNumber || trim($serialNumber) === '') { $set('pack_slip_motor_error', null); @@ -373,11 +690,13 @@ class QualityValidationResource extends Resource if (!$isMatch) { $set('pack_slip_motor_error', 'Serial number does not match.'); + $set('pack_slip_motor_qr', null); return; } else { $set('pack_slip_motor_error', null); - $set('pack_slip_motor', $serialNumber); + $set('pack_slip_motor_qr', $serialNumber); + $set('pack_slip_motor', '1'); } }) @@ -387,9 +706,11 @@ class QualityValidationResource extends Resource ->hint(fn ($get) => $get('pack_slip_motor_error') ? $get('pack_slip_motor_error') : null) ->hintColor('danger'), + Forms\Components\Hidden::make('pack_slip_pump'), - Forms\Components\TextInput::make('pack_slip_pump') - ->hidden(fn (callable $get) => !$get('pack_slip_pump_visible')) + Forms\Components\TextInput::make('pack_slip_pump_qr') + ->label('Pack Slip Pump') + ->hidden(fn (callable $get) => !$get('pack_slip_pump_qr_visible')) ->default('') ->required() ->reactive() @@ -449,11 +770,12 @@ class QualityValidationResource extends Resource $serialNumber = preg_replace('/\/[MmPpCc]$/', '', $serialNumber); // Remove // Retrieve visible serial numbers - $visibleSerialNumbers = array_filter([ - $get('serial_number_motor_visible') ? trim((string) $get('serial_number_motor')) : null, - $get('serial_number_pump_visible') ? trim((string) $get('serial_number_pump')) : null, - $get('serial_number_pumpset_visible') ? trim((string) $get('serial_number_pumpset')) : null, - ]); + // $visibleSerialNumbers = array_filter([ + // $get('serial_number_motor_qr_visible') ? trim((string) $get('serial_number_motor')) : null, + // $get('serial_number_pump_qr_visible') ? trim((string) $get('serial_number_pump')) : null, + // $get('serial_number_pumpset_qr_visible') ? trim((string) $get('serial_number_pumpset')) : null, + // ]); + $visibleSerialNumber = $get('serial_number'); $expectedItemCode = trim((string) $get('item_id')); @@ -462,9 +784,11 @@ class QualityValidationResource extends Resource return; } - $set('pack_slip_motor', $serialNumber); + $set('pack_slip_pump_qr', $serialNumber); + $set('pack_slip_pump', '1'); - $isMatch = in_array($serialNumber, $visibleSerialNumbers, true); + // $isMatch = in_array($serialNumber, $visibleSerialNumbers, true); + $isMatch = ($visibleSerialNumber == $serialNumber); if (!$serialNumber || trim($serialNumber) === '') { $set('pack_slip_pump_error', null); @@ -474,11 +798,13 @@ class QualityValidationResource extends Resource if (!$isMatch) { $set('pack_slip_pump_error', 'Serial number does not match.'); + $set('pack_slip_pump_qr', null); return; } else { $set('pack_slip_pump_error', null); - $set('pack_slip_pump', $serialNumber); + $set('pack_slip_pump_qr', $serialNumber); + $set('pack_slip_pump', '1'); } }) ->extraAttributes(fn ($get) => [ @@ -487,8 +813,11 @@ class QualityValidationResource extends Resource ->hint(fn ($get) => $get('pack_slip_pump_error') ? $get('pack_slip_pump_error') : null) ->hintColor('danger'), - Forms\Components\TextInput::make('pack_slip_pumpset') - ->hidden(fn (callable $get) => !$get('pack_slip_pumpset_visible')) + Forms\Components\Hidden::make('pack_slip_pumpset'), + + Forms\Components\TextInput::make('pack_slip_pumpset_qr') + ->label('Pack Slip PumpSet') + ->hidden(fn (callable $get) => !$get('pack_slip_pumpset_qr_visible')) ->default('') ->required() ->reactive() @@ -548,11 +877,13 @@ class QualityValidationResource extends Resource $serialNumber = preg_replace('/\/[MmPpCc]$/', '', $serialNumber); // Remove // Retrieve visible serial numbers - $visibleSerialNumbers = array_filter([ - $get('serial_number_motor_visible') ? trim((string) $get('serial_number_motor')) : null, - $get('serial_number_pump_visible') ? trim((string) $get('serial_number_pump')) : null, - $get('serial_number_pumpset_visible') ? trim((string) $get('serial_number_pumpset')) : null, - ]); + // $visibleSerialNumbers = array_filter([ + // $get('serial_number_motor_qr_visible') ? trim((string) $get('serial_number_motor')) : null, + // $get('serial_number_pump_qr_visible') ? trim((string) $get('serial_number_pump')) : null, + // $get('serial_number_pumpset_qr_visible') ? trim((string) $get('serial_number_pumpset')) : null, + // ]); + + $visibleSerialNumber = $get('serial_number'); $expectedItemCode = trim((string) $get('item_id')); @@ -561,9 +892,11 @@ class QualityValidationResource extends Resource return; } - $set('pack_slip_motor', $serialNumber); + $set('pack_slip_pumpset_qr', $serialNumber); + $set('pack_slip_pumpset', '1'); - $isMatch = in_array($serialNumber, $visibleSerialNumbers, true); + // $isMatch = in_array($serialNumber, $visibleSerialNumbers, true); + $isMatch = ($visibleSerialNumber == $serialNumber); if (!$serialNumber || trim($serialNumber) === '') { $set('pack_slip_pumpset_error', null); @@ -573,11 +906,13 @@ class QualityValidationResource extends Resource if (!$isMatch) { $set('pack_slip_pumpset_error', 'Serial number does not match.'); + $set('pack_slip_pumpset_qr', null); return; } else { $set('pack_slip_pumpset_error', null); - $set('pack_slip_pumpset', $serialNumber); + $set('pack_slip_pumpset_qr', $serialNumber); + $set('pack_slip_pumpset', '1'); } }) @@ -587,8 +922,11 @@ class QualityValidationResource extends Resource ->hint(fn ($get) => $get('pack_slip_pumpset_error') ? $get('pack_slip_pumpset_error') : null) ->hintColor('danger'), - Forms\Components\TextInput::make('name_plate_motor') - ->hidden(fn (callable $get) => !$get('name_plate_motor_visible')) + Forms\Components\Hidden::make('name_plate_motor'), + + Forms\Components\TextInput::make('name_plate_motor_qr') + ->label('Name Plate Motor') + ->hidden(fn (callable $get) => !$get('name_plate_motor_qr_visible')) ->default('') ->required() ->reactive() @@ -648,11 +986,12 @@ class QualityValidationResource extends Resource $serialNumber = preg_replace('/\/[MmPpCc]$/', '', $serialNumber); // Remove // Retrieve visible serial numbers - $visibleSerialNumbers = array_filter([ - $get('serial_number_motor_visible') ? trim((string) $get('serial_number_motor')) : null, - $get('serial_number_pump_visible') ? trim((string) $get('serial_number_pump')) : null, - $get('serial_number_pumpset_visible') ? trim((string) $get('serial_number_pumpset')) : null, - ]); + // $visibleSerialNumbers = array_filter([ + // $get('serial_number_motor_qr_visible') ? trim((string) $get('serial_number_motor')) : null, + // $get('serial_number_pump_qr_visible') ? trim((string) $get('serial_number_pump')) : null, + // $get('serial_number_pumpset_qr_visible') ? trim((string) $get('serial_number_pumpset')) : null, + // ]); + $visibleSerialNumber = $get('serial_number'); $expectedItemCode = trim((string) $get('item_id')); @@ -663,7 +1002,8 @@ class QualityValidationResource extends Resource $set('name_plate_motor_error', $serialNumber); - $isMatch = in_array($serialNumber, $visibleSerialNumbers, true); + // $isMatch = in_array($serialNumber, $visibleSerialNumbers, true); + $isMatch = ($visibleSerialNumber == $serialNumber); if (!$serialNumber || trim($serialNumber) === '') { $set('name_plate_motor_error', null); @@ -673,11 +1013,13 @@ class QualityValidationResource extends Resource if (!$isMatch) { $set('name_plate_motor_error', 'Serial number does not match.'); + $set('name_plate_motor_qr', null); return; } else { $set('name_plate_motor_error', null); - $set('name_plate_motor', $serialNumber); + $set('name_plate_motor_qr', $serialNumber); + $set('name_plate_motor', '1'); } }) @@ -687,8 +1029,11 @@ class QualityValidationResource extends Resource ->hint(fn ($get) => $get('name_plate_motor_error') ? $get('name_plate_motor_error') : null) ->hintColor('danger'), - Forms\Components\TextInput::make('name_plate_pump') - ->hidden(fn (callable $get) => !$get('name_plate_pump_visible')) + Forms\Components\Hidden::make('name_plate_pump'), + + Forms\Components\TextInput::make('name_plate_pump_qr') + ->label('Name Plate Pump') + ->hidden(fn (callable $get) => !$get('name_plate_pump_qr_visible')) ->default('') ->required() ->reactive() @@ -748,11 +1093,12 @@ class QualityValidationResource extends Resource $serialNumber = preg_replace('/\/[MmPpCc]$/', '', $serialNumber); // Remove // Retrieve visible serial numbers - $visibleSerialNumbers = array_filter([ - $get('serial_number_motor_visible') ? trim((string) $get('serial_number_motor')) : null, - $get('serial_number_pump_visible') ? trim((string) $get('serial_number_pump')) : null, - $get('serial_number_pumpset_visible') ? trim((string) $get('serial_number_pumpset')) : null, - ]); + // $visibleSerialNumbers = array_filter([ + // $get('serial_number_motor_qr_visible') ? trim((string) $get('serial_number_motor')) : null, + // $get('serial_number_pump_qr_visible') ? trim((string) $get('serial_number_pump')) : null, + // $get('serial_number_pumpset_qr_visible') ? trim((string) $get('serial_number_pumpset')) : null, + // ]); + $visibleSerialNumber = $get('serial_number'); $expectedItemCode = trim((string) $get('item_id')); @@ -763,7 +1109,8 @@ class QualityValidationResource extends Resource $set('name_plate_pump_error', $serialNumber); - $isMatch = in_array($serialNumber, $visibleSerialNumbers, true); + // $isMatch = in_array($serialNumber, $visibleSerialNumbers, true); + $isMatch = ($visibleSerialNumber == $serialNumber); if (!$serialNumber || trim($serialNumber) === '') { $set('name_plate_pump_error', null); @@ -773,11 +1120,13 @@ class QualityValidationResource extends Resource if (!$isMatch) { $set('name_plate_pump_error', 'Serial number does not match.'); + $set('name_plate_pump_qr', null); return; } else { $set('name_plate_pump_error', null); - $set('name_plate_pump', $serialNumber); + $set('name_plate_pump_qr', $serialNumber); + $set('name_plate_pump', '1'); } }) @@ -787,8 +1136,11 @@ class QualityValidationResource extends Resource ->hint(fn ($get) => $get('name_plate_pump_error') ? $get('name_plate_pump_error') : null) ->hintColor('danger'), - Forms\Components\TextInput::make('name_plate_pumpset') - ->hidden(fn (callable $get) => !$get('name_plate_pumpset_visible')) + Forms\Components\Hidden::make('name_plate_pumpset'), + + Forms\Components\TextInput::make('name_plate_pumpset_qr') + ->label('Name Plate PumpSet') + ->hidden(fn (callable $get) => !$get('name_plate_pumpset_qr_visible')) ->default('') ->required() ->reactive() @@ -848,11 +1200,12 @@ class QualityValidationResource extends Resource $serialNumber = preg_replace('/\/[MmPpCc]$/', '', $serialNumber); // Remove // Retrieve visible serial numbers - $visibleSerialNumbers = array_filter([ - $get('serial_number_motor_visible') ? trim((string) $get('serial_number_motor')) : null, - $get('serial_number_pump_visible') ? trim((string) $get('serial_number_pump')) : null, - $get('serial_number_pumpset_visible') ? trim((string) $get('serial_number_pumpset')) : null, - ]); + // $visibleSerialNumbers = array_filter([ + // $get('serial_number_motor_qr_visible') ? trim((string) $get('serial_number_motor')) : null, + // $get('serial_number_pump_qr_visible') ? trim((string) $get('serial_number_pump')) : null, + // $get('serial_number_pumpset_qr_visible') ? trim((string) $get('serial_number_pumpset')) : null, + // ]); + $visibleSerialNumber = $get('serial_number'); $expectedItemCode = trim((string) $get('item_id')); @@ -863,7 +1216,8 @@ class QualityValidationResource extends Resource $set('name_plate_pumpset_error', $serialNumber); - $isMatch = in_array($serialNumber, $visibleSerialNumbers, true); + // $isMatch = in_array($serialNumber, $visibleSerialNumbers, true); + $isMatch = ($visibleSerialNumber == $serialNumber); if (!$serialNumber || trim($serialNumber) === '') { $set('name_plate_pumpset_error', null); @@ -873,11 +1227,13 @@ class QualityValidationResource extends Resource if (!$isMatch) { $set('name_plate_pumpset_error', 'Serial number does not match.'); + $set('name_plate_pumpset_qr', null); return; } else { $set('name_plate_pumpset_error', null); - $set('name_plate_pumpset', $serialNumber); //..note if serialnumber not passed check this line + $set('name_plate_pumpset_qr', $serialNumber); + $set('name_plate_pumpset', '1'); } }) @@ -887,8 +1243,12 @@ class QualityValidationResource extends Resource ->hint(fn ($get) => $get('name_plate_pumpset_error') ? $get('name_plate_pumpset_error') : null) ->hintColor('danger'), - Forms\Components\TextInput::make('tube_sticker_motor') - ->hidden(fn (callable $get) => !$get('tube_sticker_motor_visible')) + Forms\Components\Hidden::make('tube_sticker_motor'), + + + Forms\Components\TextInput::make('tube_sticker_motor_qr') + ->label('Tube Sticker Motor') + ->hidden(fn (callable $get) => !$get('tube_sticker_motor_qr_visible')) ->default('') ->required() ->reactive() @@ -948,11 +1308,12 @@ class QualityValidationResource extends Resource $serialNumber = preg_replace('/\/[MmPpCc]$/', '', $serialNumber); // Remove // Retrieve visible serial numbers - $visibleSerialNumbers = array_filter([ - $get('serial_number_motor_visible') ? trim((string) $get('serial_number_motor')) : null, - $get('serial_number_pump_visible') ? trim((string) $get('serial_number_pump')) : null, - $get('serial_number_pumpset_visible') ? trim((string) $get('serial_number_pumpset')) : null, - ]); + // $visibleSerialNumbers = array_filter([ + // $get('serial_number_motor_qr_visible') ? trim((string) $get('serial_number_motor')) : null, + // $get('serial_number_pump_qr_visible') ? trim((string) $get('serial_number_pump')) : null, + // $get('serial_number_pumpset_qr_visible') ? trim((string) $get('serial_number_pumpset')) : null, + // ]); + $visibleSerialNumber = $get('serial_number'); $expectedItemCode = trim((string) $get('item_id')); @@ -963,7 +1324,8 @@ class QualityValidationResource extends Resource $set('tube_sticker_motor_error', $serialNumber); - $isMatch = in_array($serialNumber, $visibleSerialNumbers, true); + // $isMatch = in_array($serialNumber, $visibleSerialNumbers, true); + $isMatch = ($visibleSerialNumber == $serialNumber); if (!$serialNumber || trim($serialNumber) === '') { $set('tube_sticker_motor_error', null); @@ -973,11 +1335,13 @@ class QualityValidationResource extends Resource if (!$isMatch) { $set('tube_sticker_motor_error', 'Serial number does not match.'); + $set('tube_sticker_motor_qr', null); return; } else { $set('tube_sticker_motor_error', null); - $set('tube_sticker_motor', $serialNumber); //..note if serialnumber not passed check this line + $set('tube_sticker_motor_qr', $serialNumber); + $set('tube_sticker_motor', '1'); } }) @@ -987,8 +1351,11 @@ class QualityValidationResource extends Resource ->hint(fn ($get) => $get('tube_sticker_motor_error') ? $get('tube_sticker_motor_error') : null) ->hintColor('danger'), - Forms\Components\TextInput::make('tube_sticker_pump') - ->hidden(fn (callable $get) => !$get('tube_sticker_pump_visible')) + Forms\Components\Hidden::make('tube_sticker_pump'), + + Forms\Components\TextInput::make('tube_sticker_pump_qr') + ->label('Tube Sticker Pump') + ->hidden(fn (callable $get) => !$get('tube_sticker_pump_qr_visible')) ->default('') ->required() ->reactive() @@ -1048,11 +1415,12 @@ class QualityValidationResource extends Resource $serialNumber = preg_replace('/\/[MmPpCc]$/', '', $serialNumber); // Remove // Retrieve visible serial numbers - $visibleSerialNumbers = array_filter([ - $get('serial_number_motor_visible') ? trim((string) $get('serial_number_motor')) : null, - $get('serial_number_pump_visible') ? trim((string) $get('serial_number_pump')) : null, - $get('serial_number_pumpset_visible') ? trim((string) $get('serial_number_pumpset')) : null, - ]); + // $visibleSerialNumbers = array_filter([ + // $get('serial_number_motor_qr_visible') ? trim((string) $get('serial_number_motor')) : null, + // $get('serial_number_pump_qr_visible') ? trim((string) $get('serial_number_pump')) : null, + // $get('serial_number_pumpset_qr_visible') ? trim((string) $get('serial_number_pumpset')) : null, + // ]); + $visibleSerialNumber = $get('serial_number'); $expectedItemCode = trim((string) $get('item_id')); @@ -1063,7 +1431,8 @@ class QualityValidationResource extends Resource $set('tube_sticker_pump_error', $serialNumber); - $isMatch = in_array($serialNumber, $visibleSerialNumbers, true); + // $isMatch = in_array($serialNumber, $visibleSerialNumbers, true); + $isMatch = ($visibleSerialNumber == $serialNumber); if (!$serialNumber || trim($serialNumber) === '') { $set('tube_sticker_pump_error', null); @@ -1073,11 +1442,13 @@ class QualityValidationResource extends Resource if (!$isMatch) { $set('tube_sticker_pump_error', 'Serial number does not match.'); + $set('tube_sticker_pump_qr', null); return; } else { $set('tube_sticker_pump_error', null); - $set('tube_sticker_pump', $serialNumber); //..note if serialnumber not passed check this line + $set('tube_sticker_pump_qr', $serialNumber); + $set('tube_sticker_pump', '1'); } }) @@ -1087,8 +1458,11 @@ class QualityValidationResource extends Resource ->hint(fn ($get) => $get('tube_sticker_pump_error') ? $get('tube_sticker_pump_error') : null) ->hintColor('danger'), - Forms\Components\TextInput::make('tube_sticker_pumpset') - ->hidden(fn (callable $get) => !$get('tube_sticker_pumpset_visible')) + Forms\Components\Hidden::make('tube_sticker_pumpset'), + + Forms\Components\TextInput::make('tube_sticker_pumpset_qr') + ->label('Tube Sticker PumpSet') + ->hidden(fn (callable $get) => !$get('tube_sticker_pumpset_qr_visible')) ->default('') ->required() ->reactive() @@ -1101,8 +1475,8 @@ class QualityValidationResource extends Resource return; } - if (!preg_match('/^([a-zA-Z0-9]{6,})\|([1-9][a-zA-Z0-9]{8,})\/[MmPpCc]\|?$/', $state)) { - if (strpos($state, '|') === false) { + if (!preg_match('/^([a-zA-Z0-9]{6,})\|([1-9][a-zA-Z0-9]{8,})(?:\/[MmPpCc])?\|?$/', $state)) { + if (strpos($state, '|') === false) { $set('tube_sticker_pumpset_error', 'Scan valid QR code.'); return; } @@ -1143,14 +1517,17 @@ class QualityValidationResource extends Resource $itemCode = trim($parts[0]); $serialNumber = trim($parts[1]); - $serialNumber = preg_replace('/\/[MmPpCc]$/', '', $serialNumber); // Remove - + // $serialNumber = preg_replace('/\/[MmPpCc]$/', '', $serialNumber); // Remove + $serialNumber = preg_replace('/\/[MmPpCc]$/', '', $serialNumber); // Remove // Retrieve visible serial numbers - $visibleSerialNumbers = array_filter([ - $get('serial_number_motor_visible') ? trim((string) $get('serial_number_motor')) : null, - $get('serial_number_pump_visible') ? trim((string) $get('serial_number_pump')) : null, - $get('serial_number_pumpset_visible') ? trim((string) $get('serial_number_pumpset')) : null, - ]); + // $visibleSerialNumbers = array_filter([ + // $get('serial_number_motor_qr_visible') ? trim((string) $get('serial_number_motor')) : null, + // $get('serial_number_pump_qr_visible') ? trim((string) $get('serial_number_pump')) : null, + // $get('serial_number_pumpset_qr_visible') ? trim((string) $get('serial_number_pumpset')) : null, + // ]); + $visibleSerialNumber = $get('serial_number'); + + //dd($parts); $expectedItemCode = trim((string) $get('item_id')); @@ -1161,7 +1538,8 @@ class QualityValidationResource extends Resource $set('tube_sticker_pumpset_error', $serialNumber); - $isMatch = in_array($serialNumber, $visibleSerialNumbers, true); + // $isMatch = in_array($serialNumber, $visibleSerialNumbers, true); + $isMatch = ($visibleSerialNumber == $serialNumber); if (!$serialNumber || trim($serialNumber) === '') { $set('tube_sticker_pumpset_error', null); @@ -1171,11 +1549,13 @@ class QualityValidationResource extends Resource if (!$isMatch) { $set('tube_sticker_pumpset_error', 'Serial number does not match.'); + $set('tube_sticker_pumpset_qr', null); return; } else { $set('tube_sticker_pumpset_error', null); - $set('tube_sticker_pumpset', $serialNumber); //..note if serialnumber not passed check this line + $set('tube_sticker_pumpset_qr', $serialNumber); + $set('tube_sticker_pumpset', '1'); } }) @@ -1185,8 +1565,11 @@ class QualityValidationResource extends Resource ->hint(fn ($get) => $get('tube_sticker_pumpset_error') ? $get('tube_sticker_pumpset_error') : null) ->hintColor('danger'), - Forms\Components\TextInput::make('warranty_card') - ->hidden(fn (callable $get) => !$get('warranty_card_visible')) + Forms\Components\Hidden::make('warranty_card'), + + Forms\Components\TextInput::make('warranty_card_qr') + ->label('Warranty Card') + ->hidden(fn (callable $get) => !$get('warranty_card_qr_visible')) ->default('') ->required() ->reactive() @@ -1246,11 +1629,13 @@ class QualityValidationResource extends Resource $serialNumber = preg_replace('/\/[MmPpCc]$/', '', $serialNumber); // Remove // Retrieve visible serial numbers - $visibleSerialNumbers = array_filter([ - $get('serial_number_motor_visible') ? trim((string) $get('serial_number_motor')) : null, - $get('serial_number_pump_visible') ? trim((string) $get('serial_number_pump')) : null, - $get('serial_number_pumpset_visible') ? trim((string) $get('serial_number_pumpset')) : null, - ]); + // $visibleSerialNumbers = array_filter([ + // $get('serial_number_motor_qr_visible') ? trim((string) $get('serial_number_motor')) : null, + // $get('serial_number_pump_qr_visible') ? trim((string) $get('serial_number_pump')) : null, + // $get('serial_number_pumpset_qr_visible') ? trim((string) $get('serial_number_pumpset')) : null, + // ]); + + $visibleSerialNumber = $get('serial_number'); $expectedItemCode = trim((string) $get('item_id')); @@ -1261,7 +1646,9 @@ class QualityValidationResource extends Resource $set('warranty_card_error', $serialNumber); - $isMatch = in_array($serialNumber, $visibleSerialNumbers, true); + // $isMatch = in_array($serialNumber, $visibleSerialNumbers, true); + + $isMatch = ($visibleSerialNumber == $serialNumber); if (!$serialNumber || trim($serialNumber) === '') { $set('warranty_card_error', null); @@ -1271,11 +1658,13 @@ class QualityValidationResource extends Resource if (!$isMatch) { $set('warranty_card_error', 'Serial number does not match.'); + $set('warranty_card_qr', null); return; } else { $set('warranty_card_error', null); - $set('warranty_card', $serialNumber); //..note if serialnumber not passed check this line + $set('warranty_card_qr', $serialNumber); + $set('warranty_card', '1'); } }) ->extraAttributes(fn ($get) => [ @@ -1296,7 +1685,7 @@ class QualityValidationResource extends Resource return; } - $stickerMaster = \App\Models\StickerMaster::find($stickerMasterId); + $stickerMaster = StickerMaster::find($stickerMasterId); if (!$stickerMaster) { return; } @@ -1315,6 +1704,7 @@ class QualityValidationResource extends Resource else { $set('part_validation1_error', "Invalid input for part validation 1."); + $set('part_validation1', null); return; } }) @@ -1336,7 +1726,7 @@ class QualityValidationResource extends Resource return; } - $stickerMaster = \App\Models\StickerMaster::find($stickerMasterId); + $stickerMaster = StickerMaster::find($stickerMasterId); if (!$stickerMaster) { return; } @@ -1355,6 +1745,7 @@ class QualityValidationResource extends Resource else { $set('part_validation2_error', "Invalid input for part validation 2."); + $set('part_validation2', null); return; } }) @@ -1376,7 +1767,7 @@ class QualityValidationResource extends Resource return; } - $stickerMaster = \App\Models\StickerMaster::find($stickerMasterId); + $stickerMaster = StickerMaster::find($stickerMasterId); if (!$stickerMaster) { return; } @@ -1395,6 +1786,7 @@ class QualityValidationResource extends Resource else { $set('part_validation3_error', "Invalid input for part validation 3."); + $set('part_validation3', null); return; } }) @@ -1416,7 +1808,7 @@ class QualityValidationResource extends Resource return; } - $stickerMaster = \App\Models\StickerMaster::find($stickerMasterId); + $stickerMaster = StickerMaster::find($stickerMasterId); if (!$stickerMaster) { return; } @@ -1436,6 +1828,7 @@ class QualityValidationResource extends Resource else { $set('part_validation4_error', "Invalid input for part validation 4."); + $set('part_validation4', null); return; } @@ -1458,7 +1851,7 @@ class QualityValidationResource extends Resource return; } - $stickerMaster = \App\Models\StickerMaster::find($stickerMasterId); + $stickerMaster = StickerMaster::find($stickerMasterId); if (!$stickerMaster) { return; } @@ -1478,6 +1871,7 @@ class QualityValidationResource extends Resource else { $set('part_validation5_error', "Invalid input for part validation 5."); + $set('part_validation5', null); return; } @@ -1488,6 +1882,10 @@ class QualityValidationResource extends Resource ]) ->hint(fn ($get) => $get('part_validation5_error')) ->hintColor('danger'), + + Forms\Components\TextInput::make('id') + ->hidden() + ->readOnly(), ]); } @@ -1501,58 +1899,112 @@ class QualityValidationResource extends Resource ->numeric() ->sortable(), Tables\Columns\TextColumn::make('plant.name') - ->sortable(), - Tables\Columns\TextColumn::make('stickerMaster.item.code') - ->label('Item Code') + ->label('Plant') ->sortable(), Tables\Columns\TextColumn::make('production_order') ->label('Production Order') ->sortable(), + Tables\Columns\TextColumn::make('serial_number') + ->label('Serial Number') + ->sortable(), + Tables\Columns\TextColumn::make('stickerMaster.item.code') + ->label('Item Code') + ->sortable(), + Tables\Columns\TextColumn::make('uom') + ->label('Unit of Measure') + ->alignCenter() + ->sortable(), Tables\Columns\TextColumn::make('serial_number_motor') + ->label('Serial Number Motor') + ->alignCenter() ->sortable(), Tables\Columns\TextColumn::make('serial_number_pump') + ->label('Serial Number Pump') + ->alignCenter() ->sortable(), Tables\Columns\TextColumn::make('serial_number_pumpset') + ->label('Serial Number Pumpset') + ->alignCenter() ->sortable(), Tables\Columns\TextColumn::make('pack_slip_motor') + ->label('Pack Slip Motor') + ->alignCenter() ->sortable(), Tables\Columns\TextColumn::make('pack_slip_pump') + ->label('Pack Slip Pump') + ->alignCenter() ->sortable(), Tables\Columns\TextColumn::make('pack_slip_pumpset') - ->sortable(), + ->label('Pack Slip Pumpset') + ->alignCenter() + ->sortable(), Tables\Columns\TextColumn::make('name_plate_motor') - ->sortable(), + ->label('Name Plate Motor') + ->alignCenter() + ->sortable(), Tables\Columns\TextColumn::make('name_plate_pump') - ->sortable(), + ->label('Name Plate Pump') + ->alignCenter() + ->sortable(), Tables\Columns\TextColumn::make('name_plate_pumpset') - ->sortable(), + ->label('Name Plate Pumpset') + ->alignCenter() + ->sortable(), Tables\Columns\TextColumn::make('tube_sticker_motor') - ->sortable(), + ->label('Tube Sticker Motor') + ->alignCenter() + ->sortable(), Tables\Columns\TextColumn::make('tube_sticker_pump') - ->sortable(), + ->label('Tube Sticker Pump') + ->alignCenter() + ->sortable(), Tables\Columns\TextColumn::make('tube_sticker_pumpset') - ->sortable(), + ->label('Tube Sticker Pumpset') + ->alignCenter() + ->sortable(), Tables\Columns\TextColumn::make('warranty_card') - ->sortable(), + ->label('Warranty Card') + ->alignCenter() + ->sortable(), Tables\Columns\TextColumn::make('part_validation1') - ->sortable(), + ->label('Part Validation 1') + ->alignCenter() + ->sortable(), Tables\Columns\TextColumn::make('part_validation2') - ->sortable(), + ->label('Part Validation 2') + ->alignCenter() + ->sortable(), Tables\Columns\TextColumn::make('part_validation3') - ->sortable(), + ->label('Part Validation 3') + ->alignCenter() + ->sortable(), Tables\Columns\TextColumn::make('part_validation4') - ->sortable(), + ->label('Part Validation 4') + ->alignCenter() + ->sortable(), Tables\Columns\TextColumn::make('part_validation5') - ->sortable(), + ->label('Part Validation 5') + ->alignCenter() + ->sortable(), + Tables\Columns\TextColumn::make('sap_msg_status') + ->label('SAP Message Status') + ->alignCenter() + ->sortable(), + Tables\Columns\TextColumn::make('sap_msg_description') + ->label('SAP Message Description') + ->sortable(), Tables\Columns\TextColumn::make('created_at') + ->label('Created At') ->dateTime() ->sortable() ->toggleable(isToggledHiddenByDefault: true), Tables\Columns\TextColumn::make('updated_at') + ->label('Updated At') ->dateTime() ->sortable() ->toggleable(isToggledHiddenByDefault: true), Tables\Columns\TextColumn::make('deleted_at') + ->label('Deleted At') ->dateTime() ->sortable() ->toggleable(isToggledHiddenByDefault: true), @@ -1564,78 +2016,139 @@ class QualityValidationResource extends Resource Filter::make('advanced_filters') ->label('Advanced Filters') ->form([ - TextInput::make('production_order') - ->placeholder('Enter Production Order'), - Select::make('sticker_master_id') - ->label('Filter by Item Code') - ->options(function () { - return \App\Models\Item::whereHas('stickerMasters', function ($query) { - $query->whereHas('qualityValidations'); - })->pluck('code', 'id'); + Select::make('Plant') + ->label('Select Plant') + ->nullable() + ->options(function () { + return Plant::pluck('name', 'id'); + }) + ->reactive() + ->afterStateUpdated(function ($state, callable $set, callable $get) { + $set('sticker_master_id', null); + $set('sap_msg_status', null); + }), + TextInput::make('production_order') + ->label('Production Order') + ->placeholder('Enter Production Order'), + TextInput::make('serial_number') + ->label('Serial Number') + ->placeholder(placeholder: 'Enter Serial Number'), + Select::make('sticker_master_id') + ->label('Search by Item Code') + ->nullable() + ->options(function (callable $get) { + $pId = $get('Plant'); + return Item::whereHas('stickerMasters', function ($query) use ($pId) { + if ($pId) { + $query->where('plant_id', $pId); + } + $query->whereHas('qualityValidations'); + })->pluck('code', 'id'); + }) + ->searchable() + ->reactive(), + Select::make('sap_msg_status') + ->label('Select SAP Message Status') + ->nullable() + ->options(function (callable $get) { + $plantId = $get('Plant'); + + if (!$plantId ) { + return QualityValidation::whereNotNull('sap_msg_status')->select('sap_msg_status')->distinct()->pluck('sap_msg_status', 'sap_msg_status'); + } + else { + return QualityValidation::where('plant_id', $plantId)->whereNotNull('sap_msg_status')->select('sap_msg_status')->distinct()->pluck('sap_msg_status', 'sap_msg_status'); + } + }) + // ->options(QualityValidation::whereNotNull('sap_msg_status')->select('sap_msg_status')->distinct()->pluck('sap_msg_status', 'sap_msg_status')) + ->reactive(), + DateTimePicker::make(name: 'created_from') + ->label('Created From') + ->placeholder(placeholder: 'Select From DateTime') + ->reactive() + ->native(false), + DateTimePicker::make('created_to') + ->label('Created To') + ->placeholder(placeholder: 'Select To DateTime') + ->reactive() + ->native(false), + ]) + ->query(function ($query, array $data) { + // Hide all records initially if no filters are applied + if (empty($data['Plant']) && empty($data['production_order']) && empty($data['serial_number']) && empty($data['sap_msg_status']) && empty($data['created_from']) && empty($data['created_to']) && empty($data['sticker_master_id'])) { + return $query->whereRaw('1 = 0'); + } + + if (!empty($data['Plant'])) { + $query->where('plant_id', $data['Plant']); + } + + if (!empty($data['production_order'])) { + $query->where('production_order', 'like', '%' . $data['production_order'] . '%'); + } + + if (!empty($data['serial_number'])) { + $query->where('serial_number', 'like', '%' . $data['serial_number'] . '%'); + } + + if (!empty($data['sap_msg_status'])) { + $query->where('sap_msg_status', $data['sap_msg_status']); + } + + if (!empty($data['created_from'])) { + $query->where('created_at', '>=', $data['created_from']); + } + + if (!empty($data['created_to'])) { + $query->where('created_at', '<=', $data['created_to']); + } + + if (!empty($data['sticker_master_id'])) { + $stickerMasterIds = StickerMaster::where('item_id', $data['sticker_master_id']) + ->pluck('id') + ->toArray(); + + if (!empty($stickerMasterIds)) { + $query->whereIn('sticker_master_id', $stickerMasterIds); + } + } }) - ->searchable(), - DateTimePicker::make(name: 'created_from') - ->label('Created From') - ->reactive() - ->native(false), + ->indicateUsing(function (array $data) { + $indicators = []; - DateTimePicker::make('created_to') - ->label('Created To') - ->reactive() - ->native(false), - ]) - ->query(function ($query, array $data) { - // Hide all records initially if no filters are applied - if (empty($data['production_order']) && empty($data['created_from']) && empty($data['created_to']) && empty($data['sticker_master_id'])) { - return $query->whereRaw('1 = 0'); - } + if (!empty($data['Plant'])) { + $indicators[] = 'Plant: ' . Plant::where('id', $data['Plant'])->value('name'); + } - if (!empty($data['production_order'])) { - $query->where('production_order', 'like', '%' . $data['production_order'] . '%'); - } + if (!empty($data['production_order'])) { + $indicators[] = 'Production Order: ' . $data['production_order']; + } - if (!empty($data['created_from'])) { - $query->where('created_at', '>=', $data['created_from']); - } + if (!empty($data['serial_number'])) { + $indicators[] = 'Serial Number: ' . $data['serial_number']; + } - if (!empty($data['created_to'])) { - $query->where('created_at', '<=', $data['created_to']); - } + if (!empty($data['sap_msg_status'])) { + $indicators[] = 'SAP Message Status: ' . $data['sap_msg_status']; + } - if (!empty($data['sticker_master_id'])) { - $stickerMasterIds = \App\Models\StickerMaster::where('item_id', $data['sticker_master_id']) - ->pluck('id') - ->toArray(); + if (!empty($data['created_from'])) { + $indicators[] = 'From: ' . $data['created_from']; + } - if (!empty($stickerMasterIds)) { - $query->whereIn('sticker_master_id', $stickerMasterIds); - } - } - }) - ->indicateUsing(function (array $data) { - $indicators = []; + if (!empty($data['created_to'])) { + $indicators[] = 'To: ' . $data['created_to']; + } - if (!empty($data['production_order'])) { - $indicators[] = 'Production Order: ' . $data['production_order']; - } - - if (!empty($data['created_from'])) { - $indicators[] = 'From: ' . $data['created_from']; - } - - if (!empty($data['created_to'])) { - $indicators[] = 'To: ' . $data['created_to']; - } - - if (!empty($data['sticker_master_id'])) { - $itemCode = \App\Models\Item::find($data['sticker_master_id'])->code ?? 'Unknown'; - $indicators[] = 'Item Code: ' . $itemCode; - } - - return $indicators; - }) - ]) + if (!empty($data['sticker_master_id'])) { + $itemCode = Item::find($data['sticker_master_id'])->code ?? 'Unknown'; + $indicators[] = 'Item Codes: ' . $itemCode; + } + return $indicators; + }) + ]) + ->filtersFormMaxHeight('280px') ->actions([ Tables\Actions\ViewAction::make(), Tables\Actions\EditAction::make(), @@ -1647,6 +2160,18 @@ class QualityValidationResource extends Resource Tables\Actions\ForceDeleteBulkAction::make(), Tables\Actions\RestoreBulkAction::make(), ]), + ]) + ->headerActions([ + ImportAction::make() + ->importer(QualityValidationImporter::class) + ->visible(function() { + return Filament::auth()->user()->can('view import quality validation'); + }), + ExportAction::make() + ->exporter(QualityValidationExporter::class) + ->visible(function() { + return Filament::auth()->user()->can('view export quality validation'); + }), ]); }