schema([ Forms\Components\Select::make('plant_id') ->relationship('plant', 'name') ->reactive() ->afterStateUpdated(fn (callable $set) => [ $set('item_id', null), $set('validationError', null), ]) ->required(), Forms\Components\Hidden::make('sticker_master_id') // ->relationship('stickerMaster', 'id') ->required(), Forms\Components\TextInput::make('production_order') ->required(), // ->unique('quality_validations', 'production_order'), // Ensures unique values, //.. Forms\Components\TextInput::make('item_id') ->label('Item Code') ->placeholder('Scan the valid QR code') ->reactive() ->required() ->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' ]; $serialnumber = ['serial_number_motor', 'serial_number_pump', 'serial_number_pumpset']; $partValidationColumns = [ 'part_validation1', 'part_validation2', 'part_validation3', 'part_validation4', 'part_validation5' ]; foreach ($serialFields as $field) { $set($field . '_visible', false); $set($field, null); } foreach ($partValidationColumns as $column) { $set($column . '_visible', false); $set($column, null); } // Proceed with validation logic for new scanned QR code if (!$state || trim($state) === '') { $set('validationError', null); return; } // // Check if QR format contains '|' if (strpos($state, '|') === false) { $set('validationError', 'Scan valid QR code. (Ex: Item_Code|Serial_Number )'); return; } if (!preg_match('/^[a-zA-Z0-9]{6,}+\|[1-9][a-zA-Z0-9]{8,}+(\|)?$/', $state)) { if (strpos($state, '|') === false) { $set('validationError', 'Scan valid QR code. (Ex: Item_Code|Serial_Number )'); $set('item_id', null); $set('item_description', null); $set('serial_number', null); return; } else { $splits = explode('|', $state); $iCode = trim($splits[0]); $sNumber = isset($splits[1]) ? trim($splits[1]) : null; if (!ctype_alnum($iCode)) { $set('validationError', 'Item code must contain alpha-numeric values.'); return; } else if (strlen($iCode) < 6) { $set('validationError', 'Item code must be at least 6 digits.'); return; } else if (!ctype_alnum($sNumber)) { $set('validationError', 'Serial Number must contain alpha-numeric values.'); return; } else if (strlen($sNumber) < 9) { $set('validationError', 'Serial Number must be at least 9 digits.'); return; } } } else { $set('validationError', null); } $parts = explode('|', $state); $itemCode = trim($parts[0]); // Extract item code // 123456|123456789 $serialNumber = trim($parts[1]); // Store serial number before resetting fields $previousSerialNumber = $serialNumber; $previousItemCode = $itemCode; if (strlen($itemCode) < 6) { $set('validationError', 'Item code must be at least 6 digits.'); return; } else if (!ctype_alnum($itemCode)) { $set('validationError', 'Item Code should contain alpha-numeric values.'); $set('item_id', null); return; } else if ($serialNumber === '') { $set('validationError', 'Waiting for full QR scan...'); return; // Do not clear item_id, just wait for full input } else if (strlen($serialNumber) < 9) { $set('validationError', 'Serial Number must be at least 9 digits.'); return; } else if (!ctype_alnum($serialNumber)) { $set('validationError', 'Serial Number should contain alpha-numeric values.'); $set('item_id', null); return; } else { $set('validationError', null); } $plantId = $get('plant_id'); // Get selected plant if (!$plantId) { $set('validationError', 'Please select a plant first.'); $set('item_id', null); return; } // Check if the item exists for the selected plant $stickerMaster = \App\Models\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); return; } else { $set('sticker_master_id', $stickerMaster->id); $set('item_id', $itemCode); } // Check if user input matches the database values foreach ($partValidationColumns as $field) { if ($get("{$field}_visible")) { $userInput = $get($field); $expectedValue = $stickerMaster->$field; if ($userInput !== null && $userInput !== $expectedValue) { $set('validationError', "Invalid input for $field. Expected: $expectedValue"); return; // Stop execution if any validation fails } } } $serialExists = QualityValidation::where(function ($query) use ($serialNumber, $serialFields) { foreach ($serialFields as $column) { $query->orWhere($column, $serialNumber); } })->exists(); if ($serialExists) { $set('validationError', 'Serial number already exists in quality validation.'); $set('item_id', "$itemCode|$previousSerialNumber"); return; } // Clear validation error if all inputs match $set('validationError', null); $visibleColumns = []; foreach ($serialFields as $column) { if ($stickerMaster->$column === 1) { $visibleColumns[] = $column; } } $visiblePartValidations = []; foreach ($partValidationColumns as $column) { if ($stickerMaster->$column !== null) { $visiblePartValidations[] = $column; } } foreach ($serialFields as $column) { if ($stickerMaster->$column == 1) { $set($column . '_visible', true); } else { $set($column . '_visible', false); } } foreach ($partValidationColumns as $column) { if ($stickerMaster->$column !== null) { $set($column . '_visible', true); } else { $set($column . '_visible', false); } } foreach ($serialnumber as $field) { if ($get("{$field}_visible")) { $set($field, $serialNumber); } } }) ->extraAttributes(fn ($get) => [ 'class' => $get('validationError') ? 'border-red-500' : '', ]) ->hint(fn ($get) => $get('validationError') ? $get('validationError') : null) ->hintColor('danger'), Forms\Components\TextInput::make('serial_number_motor') ->hidden(fn (callable $get) => !$get('serial_number_motor_visible')) // Controls visibility ->default(''), Forms\Components\TextInput::make('serial_number_pump') ->hidden(fn (callable $get) => !$get('serial_number_pump_visible')) ->default(''), Forms\Components\TextInput::make('serial_number_pumpset') ->hidden(fn (callable $get) => !$get('serial_number_pumpset_visible')) ->default(''), Forms\Components\TextInput::make('pack_slip_motor') ->hidden(fn (callable $get) => !$get('pack_slip_motor_visible')) ->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.'); return; } 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('') ->required() ->reactive() ->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.'); return; } 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('') ->required() ->reactive() ->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.'); return; } 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('') ->required() ->reactive() ->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.'); return; } 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('') ->required() ->reactive() ->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.'); return; } 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('') ->required() ->reactive() ->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.'); return; } 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('') ->required() ->reactive() ->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.'); return; } 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('') ->required() ->reactive() ->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.'); return; } 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('') ->required() ->reactive() ->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.'); return; } 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('') ->required() ->reactive() ->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.'); return; } 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')) ->default('') ->reactive() ->required() ->afterStateUpdated(function (callable $set, callable $get, ?string $state) { $stickerMasterId = $get('sticker_master_id'); if (!$stickerMasterId) { return; } $stickerMaster = \App\Models\StickerMaster::find($stickerMasterId); if (!$stickerMaster) { return; } $expectedValue = $stickerMaster->part_validation1; if ($state === null || trim($state) === '') { $set('part_validation1_error', null); return; } if ($state === $expectedValue) { $set('part_validation1_error', null); } else { $set('part_validation1_error', "Invalid input for part validation 1."); return; } }) ->extraAttributes(fn ($get) => [ 'class' => $get('part_validation1_error') ? 'border-red-500' : '', ]) ->hint(fn ($get) => $get('part_validation1_error')) ->hintColor('danger'), Forms\Components\TextInput::make('part_validation2') ->hidden(fn (callable $get) => !$get('part_validation2_visible')) ->default('') ->required() ->reactive() ->afterStateUpdated(function (callable $set, callable $get, ?string $state) { $stickerMasterId = $get('sticker_master_id'); if (!$stickerMasterId) { return; } $stickerMaster = \App\Models\StickerMaster::find($stickerMasterId); if (!$stickerMaster) { return; } $expectedValue = $stickerMaster->part_validation2; if ($state === null || trim($state) === '') { $set('part_validation2_error', null); return; } if ($state === $expectedValue) { $set('part_validation2_error', null); } else { $set('part_validation2_error', "Invalid input for part validation 2."); return; } }) ->extraAttributes(fn ($get) => [ 'class' => $get('part_validation2_error') ? 'border-red-500' : '', ]) ->hint(fn ($get) => $get('part_validation2_error')) ->hintColor('danger'), Forms\Components\TextInput::make('part_validation3') ->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) { return; } $stickerMaster = \App\Models\StickerMaster::find($stickerMasterId); if (!$stickerMaster) { return; } if ($state === null || trim($state) === '') { $set('part_validation3_error', null); return; } $expectedValue = $stickerMaster->part_validation3; if ($state === $expectedValue) { $set('part_validation3_error', null); } else { $set('part_validation3_error', "Invalid input for part validation 3."); return; } }) ->extraAttributes(fn ($get) => [ 'class' => $get('part_validation3_error') ? 'border-red-500' : '', ]) ->hint(fn ($get) => $get('part_validation3_error')) ->hintColor('danger'), Forms\Components\TextInput::make('part_validation4') ->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) { return; } $stickerMaster = \App\Models\StickerMaster::find($stickerMasterId); if (!$stickerMaster) { return; } $expectedValue = $stickerMaster->part_validation4; // If input is empty, reset the error if ($state === null || trim($state) === '') { $set('part_validation4_error', null); return; } if ($state === $expectedValue) { $set('part_validation4_error', null); } else { $set('part_validation4_error', "Invalid input for part validation 4."); return; } }) ->extraAttributes(fn ($get) => [ 'class' => $get('part_validation4_error') ? 'border-red-500' : '', ]) ->hint(fn ($get) => $get('part_validation4_error')) ->hintColor('danger'), Forms\Components\TextInput::make('part_validation5') ->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) { return; } $stickerMaster = \App\Models\StickerMaster::find($stickerMasterId); if (!$stickerMaster) { return; } $expectedValue = $stickerMaster->part_validation4; // If input is empty, reset the error if ($state === null || trim($state) === '') { $set('part_validation5_error', null); return; } if ($state === $expectedValue) { $set('part_validation5_error', null); } else { $set('part_validation5_error', "Invalid input for part validation 5."); return; } }) ->extraAttributes(fn ($get) => [ 'class' => $get('part_validation5_error') ? 'border-red-500' : '', ]) ->hint(fn ($get) => $get('part_validation5_error')) ->hintColor('danger'), ]); } public static function table(Table $table): Table { return $table ->query(QualityValidation::query()) ->columns([ Tables\Columns\TextColumn::make('id') ->label('ID') ->numeric() ->sortable(), Tables\Columns\TextColumn::make('plant.name') ->sortable(), Tables\Columns\TextColumn::make('stickerMaster.item.code') ->label('Item Code') ->sortable(), Tables\Columns\TextColumn::make('production_order') ->label('Production Order') ->sortable(), Tables\Columns\TextColumn::make('serial_number_motor') ->sortable(), Tables\Columns\TextColumn::make('serial_number_pump') ->sortable(), Tables\Columns\TextColumn::make('serial_number_pumpset') ->sortable(), Tables\Columns\TextColumn::make('pack_slip_motor') ->sortable(), Tables\Columns\TextColumn::make('pack_slip_pump') ->sortable(), Tables\Columns\TextColumn::make('pack_slip_pumpset') ->sortable(), Tables\Columns\TextColumn::make('name_plate_motor') ->sortable(), Tables\Columns\TextColumn::make('name_plate_pump') ->sortable(), Tables\Columns\TextColumn::make('name_plate_pumpset') ->sortable(), Tables\Columns\TextColumn::make('tube_sticker_motor') ->sortable(), Tables\Columns\TextColumn::make('tube_sticker_pump') ->sortable(), Tables\Columns\TextColumn::make('tube_sticker_pumpset') ->sortable(), Tables\Columns\TextColumn::make('warranty_card') ->sortable(), Tables\Columns\TextColumn::make('part_validation1') ->sortable(), Tables\Columns\TextColumn::make('part_validation2') ->sortable(), Tables\Columns\TextColumn::make('part_validation3') ->sortable(), Tables\Columns\TextColumn::make('part_validation4') ->sortable(), Tables\Columns\TextColumn::make('part_validation5') ->sortable(), Tables\Columns\TextColumn::make('created_at') ->dateTime() ->sortable() ->toggleable(isToggledHiddenByDefault: true), Tables\Columns\TextColumn::make('updated_at') ->dateTime() ->sortable() ->toggleable(isToggledHiddenByDefault: true), Tables\Columns\TextColumn::make('deleted_at') ->dateTime() ->sortable() ->toggleable(isToggledHiddenByDefault: true), ]) ->filters([ Tables\Filters\TrashedFilter::make(), 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'); }) ->searchable(), DateTimePicker::make('created_from') ->label('Created From') ->native(false), DateTimePicker::make('created_to') ->label('Created To') ->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['production_order'])) { $query->where('production_order', 'like', '%' . $data['production_order'] . '%'); } 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 = \App\Models\StickerMaster::where('item_id', $data['sticker_master_id']) ->pluck('id') ->toArray(); if (!empty($stickerMasterIds)) { $query->whereIn('sticker_master_id', $stickerMasterIds); } } }) ->indicateUsing(function (array $data) { $indicators = []; 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; }) ]) ->actions([ Tables\Actions\ViewAction::make(), Tables\Actions\EditAction::make(), ]) ->bulkActions([ Tables\Actions\BulkActionGroup::make([ Tables\Actions\DeleteBulkAction::make(), Tables\Actions\ForceDeleteBulkAction::make(), Tables\Actions\RestoreBulkAction::make(), ]), ]); } public static function getRelations(): array { return [ // ]; } public static function getPages(): array { return [ 'index' => Pages\ListQualityValidations::route('/'), 'create' => Pages\CreateQualityValidation::route('/create'), 'view' => Pages\ViewQualityValidation::route('/{record}'), 'edit' => Pages\EditQualityValidation::route('/{record}/edit'), ]; } public static function getEloquentQuery(): Builder { return parent::getEloquentQuery() ->withoutGlobalScopes([ SoftDeletingScope::class, ]); } }