diff --git a/app/Filament/Resources/PanelBoxValidationResource.php b/app/Filament/Resources/PanelBoxValidationResource.php index 739900e..b724408 100644 --- a/app/Filament/Resources/PanelBoxValidationResource.php +++ b/app/Filament/Resources/PanelBoxValidationResource.php @@ -269,14 +269,6 @@ class PanelBoxValidationResource extends Resource $set('part_validation_type_options', []); $set('validation1_image_url', null); - return; - } elseif (strlen($sNumber) < 9) { - $set('validationError', 'Serial Number must be at least 9 digits.'); - $set('part_validation_type', null); - $set('show_validation_image', false); - $set('part_validation_type_options', []); - $set('validation1_image_url', null); - return; } // } @@ -285,34 +277,122 @@ class PanelBoxValidationResource extends Resource $set('validationError', null); } } + // if ($state && str_contains($state, '|')) { - if ($state && str_contains($state, '|')) { + // $parts = explode('|', $state); - $parts = explode('|', $state); + // $itemCode = trim($parts[0]); // Extract item code // 123456|123456789 - $itemCode = trim($parts[0]); // Extract item code // 123456|123456789 + // $serialNumber = trim($parts[1]); + // } + // else + // { + // // $parts = explode('/', $state); - $serialNumber = trim($parts[1]); - } - else - { - // $parts = explode('/', $state); + // // $itemCode = trim($parts[1] ?? ''); // item code + // // $serialNumber = trim($parts[2] ?? ''); // serial number - // $itemCode = trim($parts[1] ?? ''); // item code - // $serialNumber = trim($parts[2] ?? ''); // serial number + // $parts = array_map('trim', explode('/', $state)); - $parts = array_map('trim', explode('/', $state)); + // // Expected format: 121245/165467/2606/1002634 + // if (count($parts) != 4) { + // Notification::make() + // ->title('Invalid QR Format') + // ->body('Expected format: plantcode/itemcode/yearmm/serialnumber') + // ->danger() + // ->send(); - $serialNumber = end($parts); // last part + // return; + // } - // item code depends on format - $itemCode = $parts[1] ?? ''; - } + // $serialNumber = end($parts); // last part + + // $itemCode = $parts[1] ?? ''; + // } // Store serial number before resetting fields - $previousSerialNumber = $serialNumber; - $previousItemCode = $itemCode; + + if (str_contains($state, '|')) { + + $parts = array_map('trim', explode('|', $state)); + + if (count($parts) != 2) { + Notification::make() + ->title('Invalid QR Format') + ->body('Expected format: ItemCode|SerialNumber') + ->danger() + ->send(); + + return; + } + + $itemCode = $parts[0]; + $serialNumber = $parts[1]; + + if($serialNumber == '' || $serialNumber == null){ + Notification::make() + ->title('Unknown Serial number') + ->body("Serial number can't be empty!") + ->danger() + ->send(); + + $set('item_id', null); + return; + } + elseif (! ctype_alnum($serialNumber)) { + $set('validationError', 'Serial Number should contain alpha-numeric values.'); + $set('item_id', null); + return; + } + + } + elseif (str_contains($state, '/')) + { + $parts = array_map('trim', explode('/', $state)); + + if (count($parts) != 4) { + + Notification::make() + ->title('Invalid QR Format') + ->body('Expected format: plantcode/itemcode/yearmm/serialnumber') + ->danger() + ->send(); + $set('item_id', null); + return; + } + + $plantCode = $parts[0]; + $itemCode = $parts[1]; + $yearMonth = $parts[2]; + $serialNumber = $parts[3]; + + if($serialNumber == '' || $serialNumber == null){ + Notification::make() + ->title('Unknown Serial number') + ->body("Serial number can't be empty!") + ->danger() + ->send(); + + $set('item_id', null); + return; + } + elseif (! ctype_alnum($serialNumber)) { + $set('validationError', 'Serial Number should contain alpha-numeric values.'); + $set('item_id', null); + return; + } + } else { + + Notification::make() + ->title('Invalid QR Format') + ->body('QR must be in either ItemCode|SerialNumber or PlantCode/ItemCode/YearMM/SerialNumber format.') + ->danger() + ->send(); + $set('item_id', null); + $set('validationError', null); + return; + } if (strlen($itemCode) < 6) { $set('validationError', 'Item code must be at least 6 digits.'); @@ -332,29 +412,6 @@ class PanelBoxValidationResource extends Resource return; } - //elseif ($serialNumber == '') { - // $set('validationError', 'Waiting for full QR scan...'); - - // return; - // } elseif (strlen($serialNumber) < 9) { - // $set('validationError', 'Serial Number must be at least 9 digits.'); - // $set('part_validation_type', null); - // $set('show_validation_image', false); - // $set('part_validation_type_options', []); - // $set('validation1_image_url', null); - - // return; - // } elseif (! ctype_alnum($serialNumber)) { - // $set('validationError', 'Serial Number should contain alpha-numeric values.'); - // $set('item_id', null); - // $set('part_validation_type', null); - // $set('show_validation_image', false); - // $set('part_validation_type_options', []); - // $set('validation1_image_url', null); - - // return; - // } - else { $set('validationError', null); } @@ -436,7 +493,7 @@ class PanelBoxValidationResource extends Resource $serialExists = PanelBoxValidation::where('serial_number', $serialNumber)->where('plant_id', $plantId)->exists(); if ($serialExists && ! $get('id')) { - $set('validationError', 'Serial number already exists in quality validation.'); + $set('validationError', 'Serial number already exists in panel box validation.'); $set('sticker_master_id', null); $set('uom', null); $set('serial_number', null); @@ -553,14 +610,43 @@ class PanelBoxValidationResource extends Resource $options['part_validation4'] = 'Part Validation 4'; } - // Save options in hidden field $set('part_validation_type_options', $options); }) + // ->extraAttributes(fn ($get) => [ + // 'class' => $get('validationError') ? 'border-red-500' : '', + // 'id' => 'item_id', + // 'onkeydown' => "if (event.key === 'Enter') { event.preventDefault(); event.stopPropagation(); return false; }", + // ]) + ->extraAttributes(fn ($get) => [ 'class' => $get('validationError') ? 'border-red-500' : '', 'id' => 'item_id', - 'onkeydown' => "if (event.key === 'Enter') { event.preventDefault(); event.stopPropagation(); return false; }", + 'onkeydown' => " + if (event.key === 'Enter') { + const serialFields = [ + 'serial_number_motor_qr', 'serial_number_pump_qr', 'pack_slip_motor_qr', + 'name_plate_motor_qr', 'tube_sticker_motor_qr', 'warranty_card_qr' + ]; + const partValidationColumns = [ + 'part_validation1', 'part_validation2', 'part_validation3', + 'part_validation4', 'part_validation5' + ]; + + const allFields = [...serialFields.map(f => f + '_visible'), ...partValidationColumns.map(f => f + '_visible')]; + + const anyVisible = allFields.some(key => { + const el = document.querySelector('[wire\\\\:model*=\"' + key + '\"]'); + return el && (el.value === '1' || el.value === 'true' || el.checked); + }); + + if (anyVisible) { + event.preventDefault(); + event.stopPropagation(); + return false; + } + } + ", ]) ->hint(fn ($get) => $get('validationError') ? $get('validationError') : null) ->hintColor('danger'), @@ -595,6 +681,16 @@ class PanelBoxValidationResource extends Resource return; } + if (!preg_match('/^\d+\/\d+\/\d+\/\d+$/', $state)) { + Notification::make() + ->title('Invalid QR Format') + ->body('Expected format: plantcode/itemcode/yearmm/serialnumber') + ->danger() + ->send(); + $set('serial_number_panel_qr', null); + return; + } + $parts = explode('/', $state); $extracted = trim(end($parts)); @@ -632,11 +728,21 @@ class PanelBoxValidationResource extends Resource return; } + if (!preg_match('/^\d+\/\d+\/\d+\/\d+$/', $state)) { + Notification::make() + ->title('Invalid QR Format') + ->body('Expected format: plantcode/itemcode/yearmm/serialnumber') + ->danger() + ->send(); + $set('pack_slip_panel_qr', null); + return; + } + $parts = explode('/', $state); $extracted = trim(end($parts)); - if (count($parts) < 3 || $extracted == '') { - $set('packSlipPanelError', 'Format must be: SupplierCode/ItemCode/SerialNumber'); + if ($extracted == '') { + $set('packSlipPanelError', "SerialNumber can't be empty!"); $set('pack_slip_panel_qr', null); return; } @@ -675,11 +781,21 @@ class PanelBoxValidationResource extends Resource return; } + if (!preg_match('/^\d+\/\d+\/\d+\/\d+$/', $state)) { + Notification::make() + ->title('Invalid QR Format') + ->body('Expected format: plantcode/itemcode/yearmm/serialnumber') + ->danger() + ->send(); + $set('serial_number_panel_qr', null); + return; + } + $parts = explode('/', $state); $extracted = trim(end($parts)); - if (count($parts) < 3 || $extracted == '') { - $set('namePlatePanelError', 'Format must be: SupplierCode/ItemCode/SerialNumber'); + if ($extracted == '') { + $set('namePlatePanelError', "SerialNumber cant't be empty!"); $set('name_plate_panel_qr', null); return; } @@ -718,11 +834,21 @@ class PanelBoxValidationResource extends Resource return; } + if (!preg_match('/^\d+\/\d+\/\d+\/\d+$/', $state)) { + Notification::make() + ->title('Invalid QR Format') + ->body('Expected format: plantcode/itemcode/yearmm/serialnumber') + ->danger() + ->send(); + $set('serial_number_panel_qr', null); + return; + } + $parts = explode('/', $state); $extracted = trim(end($parts)); - if (count($parts) < 3 || $extracted == '') { - $set('tubeStickerPanelError', 'Format must be: SupplierCode/ItemCode/SerialNumber'); + if ($extracted == '') { + $set('tubeStickerPanelError', "SerialNumber can't be empty!"); $set('tube_sticker_panel_qr', null); return; } @@ -741,7 +867,7 @@ class PanelBoxValidationResource extends Resource return; } }) - ->hint(fn ($get) => $get('tubeStickerPanelError') ?? null) + ->hint(fn ($get ) => $get('tubeStickerPanelError') ?? null) ->hintColor('danger') ->extraAttributes(fn ($get) => [ 'class' => $get('tubeStickerPanelError') ? 'border-red-500' : '', @@ -762,11 +888,21 @@ class PanelBoxValidationResource extends Resource return; } + if (!preg_match('/^\d+\/\d+\/\d+\/\d+$/', $state)) { + Notification::make() + ->title('Invalid QR Format') + ->body('Expected format: plantcode/itemcode/yearmm/serialnumber') + ->danger() + ->send(); + $set('serial_number_panel_qr', null); + return; + } + $parts = explode('/', $state); $extracted = trim(end($parts)); - if (count($parts) < 3 || $extracted == '') { - $set('warrantyCardPanelError', 'Format must be: SupplierCode/ItemCode/SerialNumber'); + if ($extracted == '') { + $set('warrantyCardPanelError', "SerialNumber can't be empty!"); $set('warranty_card_qr', null); return; } @@ -774,7 +910,7 @@ class PanelBoxValidationResource extends Resource $expected = $get('serial_number'); if ($extracted != $expected) { - $set('warrantyCardPanelError', 'Tube Sticker Panel serial does not match.'); + $set('warrantyCardPanelError', 'Warranty Card Panel serial does not match.'); $set('warranty_card_qr', null); return; } @@ -826,7 +962,6 @@ class PanelBoxValidationResource extends Resource if ($state == null || trim($state) == '') { $set('part_validation1_error', null); - return; } @@ -845,7 +980,6 @@ class PanelBoxValidationResource extends Resource $set('part_validation1_error', null); } else { $set('part_validation1_error', 'Invalid input for part validation 1.'); - return; } }) @@ -1078,7 +1212,6 @@ class PanelBoxValidationResource extends Resource Forms\Components\Hidden::make('updated_by') ->label('Updated By') ->default(Filament::auth()->user()?->name), - Forms\Components\View::make('components.panel-checklist-wrapper') ->visible(fn ($livewire) => $livewire->showChecklist) ->statePath('checklist')