diff --git a/app/Filament/Resources/QualityValidationResource.php b/app/Filament/Resources/QualityValidationResource.php index a5d780b..0d9e3ce 100644 --- a/app/Filament/Resources/QualityValidationResource.php +++ b/app/Filament/Resources/QualityValidationResource.php @@ -64,6 +64,8 @@ class QualityValidationResource extends Resource 'warranty_card' ]; + $serialnumber = ['serial_number_motor', 'serial_number_pump', 'serial_number_pumpset']; + $partValidationColumns = [ 'part_validation1', 'part_validation2', 'part_validation3', 'part_validation4', 'part_validation5' @@ -222,7 +224,6 @@ class QualityValidationResource extends Resource // 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); @@ -248,7 +249,6 @@ class QualityValidationResource extends Resource } } - // Filter part validation columns that are not `null` $visiblePartValidations = []; foreach ($partValidationColumns as $column) { if ($stickerMaster->$column !== null) { @@ -266,14 +266,14 @@ class QualityValidationResource extends Resource foreach ($partValidationColumns as $column) { if ($stickerMaster->$column !== null) { - $set($column . '_visible', true); // Separate key for visibility + $set($column . '_visible', true); } else { $set($column . '_visible', false); } } // Assign serial number to only visible text inputs - foreach ($serialFields as $field) { + foreach ($serialnumber as $field) { if ($get("{$field}_visible")) { $set($field, $serialNumber); } @@ -301,43 +301,964 @@ class QualityValidationResource extends Resource Forms\Components\TextInput::make('pack_slip_motor') ->hidden(fn (callable $get) => !$get('pack_slip_motor_visible')) - ->default(''), + ->default('') + ->reactive() + ->required() + ->afterStateUpdated(function (callable $set, callable $get, ?string $state) { + + $set('pack_slip_motor_error', null); + + if (empty($state)) { + $set('pack_slip_motor_error', null); + return; + } + + if (!preg_match('/^([a-zA-Z0-9]{6,})\|([1-9][a-zA-Z0-9]{8,})\/[MmPp]\|?$/', $state)) { + if (strpos($state, '|') === false) { + $set('pack_slip_motor_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('pack_slip_motor_error', 'Item code must contain alpha-numeric values.'); + return; + } + else if (strlen($iCode) < 6) { + $set('pack_slip_motor_error', 'Item code must be at least 6 digits.'); + return; + } + else if (strlen($sNumber) < 9) { + $set('pack_slip_motor_error', 'Serial Number must be at least 9 digits.'); + return; + } + else if (!ctype_alnum($sNumber)) { + $set('pack_slip_motor_error', 'Serial Number must contain alpha-numeric values.'); + return; + } + } + + $set('pack_slip_motor_error', 'Scan valid QR code'); + return; + } + else + { + $set('pack_slip_motor_error', null); + } + + // Split state by pipeline "|" + $parts = explode('|', $state); + $itemCode = trim($parts[0]); + + $serialNumber = trim($parts[1]); + $serialNumber = preg_replace('/\/[MmPp]$/', '', $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, + ]); + + $expectedItemCode = trim((string) $get('item_id')); + + if ($itemCode !== $expectedItemCode) { + $set('pack_slip_motor_error', 'Item code does not match.'); + return; + } + + $set('pack_slip_motor', $serialNumber); + + $isMatch = in_array($serialNumber, $visibleSerialNumbers, true); + + if (!$serialNumber || trim($serialNumber) === '') { + $set('pack_slip_motor_error', null); + return; + } + + if (!$isMatch) + { + $set('pack_slip_motor_error', 'Serial number does not match.'); + } + else { + $set('pack_slip_motor_error', null); + $set('pack_slip_motor', $serialNumber); + } + + }) + ->extraAttributes(fn ($get) => [ + 'class' => $get('pack_slip_motor_error') ? 'border-red-500' : '', + ]) + ->hint(fn ($get) => $get('pack_slip_motor_error') ? $get('pack_slip_motor_error') : null) + ->hintColor('danger'), + Forms\Components\TextInput::make('pack_slip_pump') ->hidden(fn (callable $get) => !$get('pack_slip_pump_visible')) - ->default(''), + ->default('') + ->required() + ->afterStateUpdated(function (callable $set, callable $get, ?string $state) { + + $set('pack_slip_pump_error', null); + + if (empty($state)) { + $set('pack_slip_pump_error', null); + return; + } + + if (!preg_match('/^([a-zA-Z0-9]{6,})\|([1-9][a-zA-Z0-9]{8,})\/[MmPp]\|?$/', $state)) { + if (strpos($state, '|') === false) { + $set('pack_slip_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('pack_slip_pump_error', 'Item code must contain alpha-numeric values.'); + return; + } + else if (strlen($iCode) < 6) { + $set('pack_slip_pump_error', 'Item code must be at least 6 digits.'); + return; + } + else if (strlen($sNumber) < 9) { + $set('pack_slip_pump_error', 'Serial Number must be at least 9 digits.'); + return; + } + else if (!ctype_alnum($sNumber)) { + $set('pack_slip_pump_error', 'Serial Number must contain alpha-numeric values.'); + return; + } + } + + $set('pack_slip_pump_error', 'Scan valid QR code.'); + return; + } + else + { + $set('pack_slip_pump_error', null); + } + + // Split state by pipeline "|" + $parts = explode('|', $state); + $itemCode = trim($parts[0]); + + $serialNumber = trim($parts[1]); + $serialNumber = preg_replace('/\/[MmPp]$/', '', $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, + ]); + + $expectedItemCode = trim((string) $get('item_id')); + + if ($itemCode !== $expectedItemCode) { + $set('pack_slip_pump_error', 'Item code does not match.'); + return; + } + + $set('pack_slip_motor', $serialNumber); + + $isMatch = in_array($serialNumber, $visibleSerialNumbers, true); + + if (!$serialNumber || trim($serialNumber) === '') { + $set('pack_slip_pump_error', null); + return; + } + + if (!$isMatch) + { + $set('pack_slip_pump_error', 'Serial number does not match.'); + } + else { + $set('pack_slip_pump_error', null); + $set('pack_slip_pump', $serialNumber); + } + + }) + ->extraAttributes(fn ($get) => [ + 'class' => $get('pack_slip_pump_error') ? 'border-red-500' : '', + ]) + ->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')) - ->default(''), + ->default('') + ->required() + ->afterStateUpdated(function (callable $set, callable $get, ?string $state) { + + $set('pack_slip_pumpset_error', null); + + if (empty($state)) { + $set('pack_slip_pumpset_error', null); + return; + } + + if (!preg_match('/^([a-zA-Z0-9]{6,})\|([1-9][a-zA-Z0-9]{8,})\/[MmPp]\|?$/', $state)) { + if (strpos($state, '|') === false) { + $set('pack_slip_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('pack_slip_pumpset_error', 'Item code must contain alpha-numeric values.'); + return; + } + else if (strlen($iCode) < 6) { + $set('pack_slip_pumpset_error', 'Item code must be at least 6 digits.'); + return; + } + else if (strlen($sNumber) < 9) { + $set('pack_slip_pumpset_error', 'Serial Number must be at least 9 digits.'); + return; + } + else if (!ctype_alnum($sNumber)) { + $set('pack_slip_pumpset_error', 'Serial Number must contain alpha-numeric values.'); + return; + } + } + + $set('pack_slip_pumpset_error', 'Scan valid QR code.'); + return; + } + else + { + $set('pack_slip_pumpset_error', null); + } + + // Split state by pipeline "|" + $parts = explode('|', $state); + $itemCode = trim($parts[0]); + + $serialNumber = trim($parts[1]); + $serialNumber = preg_replace('/\/[MmPp]$/', '', $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, + ]); + + $expectedItemCode = trim((string) $get('item_id')); + + if ($itemCode !== $expectedItemCode) { + $set('pack_slip_pumpset_error', 'Item code does not match.'); + return; + } + + $set('pack_slip_motor', $serialNumber); + + $isMatch = in_array($serialNumber, $visibleSerialNumbers, true); + + if (!$serialNumber || trim($serialNumber) === '') { + $set('pack_slip_pumpset_error', null); + return; + } + + if (!$isMatch) + { + $set('pack_slip_pumpset_error', 'Serial number does not match.'); + } + else { + $set('pack_slip_pumpset_error', null); + $set('pack_slip_pumpset', $serialNumber); + } + + }) + ->extraAttributes(fn ($get) => [ + 'class' => $get('pack_slip_pumpset_error') ? 'border-red-500' : '', + ]) + ->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')) - ->default(''), + ->default('') + ->required() + ->afterStateUpdated(function (callable $set, callable $get, ?string $state) { + + $set('name_plate_motor_error', null); + + if (empty($state)) { + $set('name_plate_motor_error', null); + return; + } + + if (!preg_match('/^([a-zA-Z0-9]{6,})\|([1-9][a-zA-Z0-9]{8,})\/[MmPp]\|?$/', $state)) { + if (strpos($state, '|') === false) { + $set('name_plate_motor_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('name_plate_motor_error', 'Item code must contain alpha-numeric values.'); + return; + } + else if (strlen($iCode) < 6) { + $set('name_plate_motor_error', 'Item code must be at least 6 digits.'); + return; + } + else if (strlen($sNumber) < 9) { + $set('name_plate_motor_error', 'Serial Number must be at least 9 digits.'); + return; + } + else if (!ctype_alnum($sNumber)) { + $set('name_plate_motor_error', 'Serial Number must contain alpha-numeric values.'); + return; + } + } + + $set('name_plate_motor_error', 'Scan valid QR code.'); + return; + } + else + { + $set('name_plate_motor_error', null); + } + + // Split state by pipeline "|" + $parts = explode('|', $state); + $itemCode = trim($parts[0]); + + $serialNumber = trim($parts[1]); + $serialNumber = preg_replace('/\/[MmPp]$/', '', $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, + ]); + + $expectedItemCode = trim((string) $get('item_id')); + + if ($itemCode !== $expectedItemCode) { + $set('name_plate_motor_error', 'Item code does not match.'); + return; + } + + $set('name_plate_motor_error', $serialNumber); + + $isMatch = in_array($serialNumber, $visibleSerialNumbers, true); + + if (!$serialNumber || trim($serialNumber) === '') { + $set('name_plate_motor_error', null); + return; + } + + if (!$isMatch) + { + $set('name_plate_motor_error', 'Serial number does not match.'); + } + else { + $set('name_plate_motor_error', null); + $set('name_plate_motor', $serialNumber); + } + + }) + ->extraAttributes(fn ($get) => [ + 'class' => $get('name_plate_motor_error') ? 'border-red-500' : '', + ]) + ->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')) - ->default(''), + ->default('') + ->required() + ->afterStateUpdated(function (callable $set, callable $get, ?string $state) { + + $set('name_plate_pump_error', null); + + if (empty($state)) { + $set('name_plate_pump_error', null); + return; + } + + if (!preg_match('/^([a-zA-Z0-9]{6,})\|([1-9][a-zA-Z0-9]{8,})\/[MmPp]\|?$/', $state)) { + if (strpos($state, '|') === false) { + $set('name_plate_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('name_plate_pump_error', 'Item code must contain alpha-numeric values.'); + return; + } + else if (strlen($iCode) < 6) { + $set('name_plate_pump_error', 'Item code must be at least 6 digits.'); + return; + } + else if (strlen($sNumber) < 9) { + $set('name_plate_pump_error', 'Serial Number must be at least 9 digits.'); + return; + } + else if (!ctype_alnum($sNumber)) { + $set('name_plate_pump_error', 'Serial Number must contain alpha-numeric values.'); + return; + } + } + + $set('name_plate_pump_error', 'Scan valid QR code.'); + return; + } + else + { + $set('name_plate_pump_error', null); + } + + // Split state by pipeline "|" + $parts = explode('|', $state); + $itemCode = trim($parts[0]); + + $serialNumber = trim($parts[1]); + $serialNumber = preg_replace('/\/[MmPp]$/', '', $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, + ]); + + $expectedItemCode = trim((string) $get('item_id')); + + if ($itemCode !== $expectedItemCode) { + $set('name_plate_pump_error', 'Item code does not match.'); + return; + } + + $set('name_plate_pump_error', $serialNumber); + + $isMatch = in_array($serialNumber, $visibleSerialNumbers, true); + + if (!$serialNumber || trim($serialNumber) === '') { + $set('name_plate_pump_error', null); + return; + } + + if (!$isMatch) + { + $set('name_plate_pump_error', 'Serial number does not match.'); + } + else { + $set('name_plate_pump_error', null); + $set('name_plate_pump', $serialNumber); + } + + }) + ->extraAttributes(fn ($get) => [ + 'class' => $get('name_plate_pump_error') ? 'border-red-500' : '', + ]) + ->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')) - ->default(''), + ->default('') + ->required() + ->afterStateUpdated(function (callable $set, callable $get, ?string $state) { + + $set('name_plate_pumpset_error', null); + + if (empty($state)) { + $set('name_plate_pumpset_error', null); + return; + } + + if (!preg_match('/^([a-zA-Z0-9]{6,})\|([1-9][a-zA-Z0-9]{8,})\/[MmPp]\|?$/', $state)) { + if (strpos($state, '|') === false) { + $set('name_plate_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('name_plate_pumpset_error', 'Item code must contain alpha-numeric values.'); + return; + } + else if (strlen($iCode) < 6) { + $set('name_plate_pumpset_error', 'Item code must be at least 6 digits.'); + return; + } + else if (strlen($sNumber) < 9) { + $set('name_plate_pumpset_error', 'Serial Number must be at least 9 digits.'); + return; + } + else if (!ctype_alnum($sNumber)) { + $set('name_plate_pumpset_error', 'Serial Number must contain alpha-numeric values.'); + return; + } + } + + $set('name_plate_pumpset_error', 'Scan valid QR code.'); + return; + } + else + { + $set('name_plate_pumpset_error', null); + } + + // Split state by pipeline "|" + $parts = explode('|', $state); + $itemCode = trim($parts[0]); + + $serialNumber = trim($parts[1]); + $serialNumber = preg_replace('/\/[MmPp]$/', '', $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, + ]); + + $expectedItemCode = trim((string) $get('item_id')); + + if ($itemCode !== $expectedItemCode) { + $set('name_plate_pumpset_error', 'Item code does not match.'); + return; + } + + $set('name_plate_pumpset_error', $serialNumber); + + $isMatch = in_array($serialNumber, $visibleSerialNumbers, true); + + if (!$serialNumber || trim($serialNumber) === '') { + $set('name_plate_pumpset_error', null); + return; + } + + if (!$isMatch) + { + $set('name_plate_pumpset_error', 'Serial number does not match.'); + } + else { + $set('name_plate_pumpset_error', null); + $set('name_plate_pumpset', $serialNumber); //..note if serialnumber not passed check this line + } + + }) + ->extraAttributes(fn ($get) => [ + 'class' => $get('name_plate_pumpset_error') ? 'border-red-500' : '', + ]) + ->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')) - ->default(''), + ->default('') + ->required() + ->afterStateUpdated(function (callable $set, callable $get, ?string $state) { + + $set('tube_sticker_motor_error', null); + + if (empty($state)) { + $set('tube_sticker_motor_error', null); + return; + } + + if (!preg_match('/^([a-zA-Z0-9]{6,})\|([1-9][a-zA-Z0-9]{8,})\/[MmPp]\|?$/', $state)) { + if (strpos($state, '|') === false) { + $set('tube_sticker_motor_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('tube_sticker_motor_error', 'Item code must contain alpha-numeric values.'); + return; + } + else if (strlen($iCode) < 6) { + $set('tube_sticker_motor_error', 'Item code must be at least 6 digits.'); + return; + } + else if (strlen($sNumber) < 9) { + $set('tube_sticker_motor_error', 'Serial Number must be at least 9 digits.'); + return; + } + else if (!ctype_alnum($sNumber)) { + $set('tube_sticker_motor_error', 'Serial Number must contain alpha-numeric values.'); + return; + } + } + + $set('tube_sticker_motor_error', 'Scan valid QR code.'); + return; + } + else + { + $set('tube_sticker_motor_error', null); + } + + // Split state by pipeline "|" + $parts = explode('|', $state); + $itemCode = trim($parts[0]); + + $serialNumber = trim($parts[1]); + $serialNumber = preg_replace('/\/[MmPp]$/', '', $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, + ]); + + $expectedItemCode = trim((string) $get('item_id')); + + if ($itemCode !== $expectedItemCode) { + $set('tube_sticker_motor_error', 'Item code does not match.'); + return; + } + + $set('tube_sticker_motor_error', $serialNumber); + + $isMatch = in_array($serialNumber, $visibleSerialNumbers, true); + + if (!$serialNumber || trim($serialNumber) === '') { + $set('tube_sticker_motor_error', null); + return; + } + + if (!$isMatch) + { + $set('tube_sticker_motor_error', 'Serial number does not match.'); + } + else { + $set('tube_sticker_motor_error', null); + $set('tube_sticker_motor', $serialNumber); //..note if serialnumber not passed check this line + } + + }) + ->extraAttributes(fn ($get) => [ + 'class' => $get('tube_sticker_motor_error') ? 'border-red-500' : '', + ]) + ->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')) - ->default(''), + ->default('') + ->required() + ->afterStateUpdated(function (callable $set, callable $get, ?string $state) { + + $set('tube_sticker_pump_error', null); + + if (empty($state)) { + $set('tube_sticker_pump_error', null); + return; + } + + if (!preg_match('/^([a-zA-Z0-9]{6,})\|([1-9][a-zA-Z0-9]{8,})\/[MmPp]\|?$/', $state)) { + if (strpos($state, '|') === false) { + $set('tube_sticker_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('tube_sticker_pump_error', 'Item code must contain alpha-numeric values.'); + return; + } + else if (strlen($iCode) < 6) { + $set('tube_sticker_pump_error', 'Item code must be at least 6 digits.'); + return; + } + else if (strlen($sNumber) < 9) { + $set('tube_sticker_pump_error', 'Serial Number must be at least 9 digits.'); + return; + } + else if (!ctype_alnum($sNumber)) { + $set('tube_sticker_pump_error', 'Serial Number must contain alpha-numeric values.'); + return; + } + } + + $set('tube_sticker_pump_error', 'Scan valid QR code.'); + return; + } + else + { + $set('tube_sticker_pump_error', null); + } + + // Split state by pipeline "|" + $parts = explode('|', $state); + $itemCode = trim($parts[0]); + + $serialNumber = trim($parts[1]); + $serialNumber = preg_replace('/\/[MmPp]$/', '', $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, + ]); + + $expectedItemCode = trim((string) $get('item_id')); + + if ($itemCode !== $expectedItemCode) { + $set('tube_sticker_pump_error', 'Item code does not match.'); + return; + } + + $set('tube_sticker_pump_error', $serialNumber); + + $isMatch = in_array($serialNumber, $visibleSerialNumbers, true); + + if (!$serialNumber || trim($serialNumber) === '') { + $set('tube_sticker_pump_error', null); + return; + } + + if (!$isMatch) + { + $set('tube_sticker_pump_error', 'Serial number does not match.'); + } + else { + $set('tube_sticker_pump_error', null); + $set('tube_sticker_pump', $serialNumber); //..note if serialnumber not passed check this line + } + + }) + ->extraAttributes(fn ($get) => [ + 'class' => $get('tube_sticker_pump_error') ? 'border-red-500' : '', + ]) + ->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')) - ->default(''), + ->default('') + ->required() + ->afterStateUpdated(function (callable $set, callable $get, ?string $state) { + + $set('tube_sticker_pumpset_error', null); + + if (empty($state)) { + $set('tube_sticker_pumpset_error', null); + return; + } + + if (!preg_match('/^([a-zA-Z0-9]{6,})\|([1-9][a-zA-Z0-9]{8,})\/[MmPp]\|?$/', $state)) { + if (strpos($state, '|') === false) { + $set('tube_sticker_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('tube_sticker_pumpset_error', 'Item code must contain alpha-numeric values.'); + return; + } + else if (strlen($iCode) < 6) { + $set('tube_sticker_pumpset_error', 'Item code must be at least 6 digits.'); + return; + } + else if (strlen($sNumber) < 9) { + $set('tube_sticker_pumpset_error', 'Serial Number must be at least 9 digits.'); + return; + } + else if (!ctype_alnum($sNumber)) { + $set('tube_sticker_pumpset_error', 'Serial Number must contain alpha-numeric values.'); + return; + } + } + + $set('tube_sticker_pumpset_error', 'Scan valid QR code.'); + return; + } + else + { + $set('tube_sticker_pumpset_error', null); + } + + // Split state by pipeline "|" + $parts = explode('|', $state); + $itemCode = trim($parts[0]); + + $serialNumber = trim($parts[1]); + $serialNumber = preg_replace('/\/[MmPp]$/', '', $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, + ]); + + $expectedItemCode = trim((string) $get('item_id')); + + if ($itemCode !== $expectedItemCode) { + $set('tube_sticker_pumpset_error', 'Item code does not match.'); + return; + } + + $set('tube_sticker_pumpset_error', $serialNumber); + + $isMatch = in_array($serialNumber, $visibleSerialNumbers, true); + + if (!$serialNumber || trim($serialNumber) === '') { + $set('tube_sticker_pumpset_error', null); + return; + } + + if (!$isMatch) + { + $set('tube_sticker_pumpset_error', 'Serial number does not match.'); + } + else { + $set('tube_sticker_pumpset_error', null); + $set('tube_sticker_pumpset', $serialNumber); //..note if serialnumber not passed check this line + } + + }) + ->extraAttributes(fn ($get) => [ + 'class' => $get('tube_sticker_pumpset_error') ? 'border-red-500' : '', + ]) + ->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')) - ->default(''), + ->default('') + ->required() + ->afterStateUpdated(function (callable $set, callable $get, ?string $state) { + + $set('warranty_card_error', null); + + if (empty($state)) { + $set('warranty_card_error', null); + return; + } + + if (!preg_match('/^([a-zA-Z0-9]{6,})\|([1-9][a-zA-Z0-9]{8,})\/[MmPp]\|?$/', $state)) { + if (strpos($state, '|') === false) { + $set('warranty_card_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('warranty_card_error', 'Item code must contain alpha-numeric values.'); + return; + } + else if (strlen($iCode) < 6) { + $set('warranty_card_error', 'Item code must be at least 6 digits.'); + return; + } + else if (strlen($sNumber) < 9) { + $set('warranty_card_error', 'Serial Number must be at least 9 digits.'); + return; + } + else if (!ctype_alnum($sNumber)) { + $set('warranty_card_error', 'Serial Number must contain alpha-numeric values.'); + return; + } + } + + $set('warranty_card_error', 'Scan valid QR code.'); + return; + } + else + { + $set('warranty_card_error', null); + } + + // Split state by pipeline "|" + $parts = explode('|', $state); + $itemCode = trim($parts[0]); + + $serialNumber = trim($parts[1]); + $serialNumber = preg_replace('/\/[MmPp]$/', '', $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, + ]); + + $expectedItemCode = trim((string) $get('item_id')); + + if ($itemCode !== $expectedItemCode) { + $set('warranty_card_error', 'Item code does not match.'); + return; + } + + $set('warranty_card_error', $serialNumber); + + $isMatch = in_array($serialNumber, $visibleSerialNumbers, true); + + if (!$serialNumber || trim($serialNumber) === '') { + $set('warranty_card_error', null); + return; + } + + if (!$isMatch) + { + $set('warranty_card_error', 'Serial number does not match.'); + } + else { + $set('warranty_card_error', null); + $set('warranty_card', $serialNumber); //..note if serialnumber not passed check this line + } + }) + ->extraAttributes(fn ($get) => [ + 'class' => $get('warranty_card_error') ? 'border-red-500' : '', + ]) + ->hint(fn ($get) => $get('warranty_card_error') ? $get('warranty_card_error') : null) + ->hintColor('danger'), Forms\Components\TextInput::make('part_validation1') ->hidden(fn (callable $get) => !$get('part_validation1_visible')) @@ -358,7 +1279,6 @@ class QualityValidationResource extends Resource $expectedValue = $stickerMaster->part_validation1; - // If input is empty, reset the error if ($state === null || trim($state) === '') { $set('part_validation1_error', null); return; @@ -384,6 +1304,7 @@ class QualityValidationResource extends Resource ->hidden(fn (callable $get) => !$get('part_validation2_visible')) ->default('') ->required() + ->reactive() ->afterStateUpdated(function (callable $set, callable $get, ?string $state) { $stickerMasterId = $get('sticker_master_id'); @@ -398,14 +1319,11 @@ class QualityValidationResource extends Resource $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); @@ -415,6 +1333,7 @@ class QualityValidationResource extends Resource $set('part_validation2_error', "Invalid input for part validation 2."); // Expected: $expectedValue } }) + ->extraAttributes(fn ($get) => [ 'class' => $get('part_validation2_error') ? 'border-red-500' : '', ]) @@ -425,6 +1344,7 @@ class QualityValidationResource extends Resource ->hidden(fn (callable $get) => !$get('part_validation3_visible')) ->default('') ->required() + ->reactive() ->afterStateUpdated(function (callable $set, callable $get, ?string $state) { $stickerMasterId = $get('sticker_master_id'); if (!$stickerMasterId) { @@ -436,15 +1356,12 @@ class QualityValidationResource extends Resource 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 + $expectedValue = $stickerMaster->part_validation3; if ($state === $expectedValue) { @@ -465,6 +1382,7 @@ class QualityValidationResource extends Resource ->hidden(fn (callable $get) => !$get('part_validation4_visible')) ->default('') ->required() + ->reactive() ->afterStateUpdated(function (callable $set, callable $get, ?string $state) { $stickerMasterId = $get('sticker_master_id'); if (!$stickerMasterId) { @@ -506,6 +1424,7 @@ class QualityValidationResource extends Resource ->hidden(fn (callable $get) => !$get('part_validation5_visible')) ->default('') ->required() + ->reactive() ->afterStateUpdated(function (callable $set, callable $get, ?string $state) { $stickerMasterId = $get('sticker_master_id'); if (!$stickerMasterId) { @@ -548,7 +1467,7 @@ class QualityValidationResource extends Resource public static function table(Table $table): Table { return $table - ->searchable() + ->columns([ Tables\Columns\TextColumn::make('id') ->label('ID') @@ -611,14 +1530,28 @@ class QualityValidationResource extends Resource ->sortable() ->toggleable(isToggledHiddenByDefault: true), ]) + ->filters([ Tables\Filters\TrashedFilter::make(), - SelectFilter::make('item_code') - ->relationship('stickerMaster.item', 'code') + SelectFilter::make('sticker_master_id') ->label('Filter by item code') + // ->options(function () { + // return \App\Models\Item::whereIn('id', function ($query) { + // $query->select('item_id') + // ->from('sticker_masters') + // ->whereIn('id', function ($subQuery) { + // $subQuery->select('sticker_master_id') + // ->from('quality_validations'); + // }); + // }) + + // ->pluck('code', 'id'); + // }) + ->relationship('stickerMaster.item','code') ->searchable(), + Filter::make('production_order') ->label('Filter by Production Order') ->form([ @@ -634,9 +1567,6 @@ class QualityValidationResource extends Resource ); }) - // This function adds indicators to show applied filters in the UI. - // It helps users see what filters are currently active. - ->indicateUsing(function (array $data) { return empty($data['production_order']) ? [] : ['Production Order: ' . $data['production_order']]; }), @@ -674,6 +1604,7 @@ class QualityValidationResource extends Resource return $indicators; }), ]) + ->actions([ Tables\Actions\ViewAction::make(), Tables\Actions\EditAction::make(), @@ -686,7 +1617,6 @@ class QualityValidationResource extends Resource Tables\Actions\RestoreBulkAction::make(), ]), ]); - } public static function getRelations(): array