schema(components: [ Forms\Components\Select::make('plant_id') ->relationship('plant', 'name') ->reactive() ->afterStateUpdated(function (callable $set, callable $get, $state) { $set('item_id', null); $set('line_id', null); $set('production_order', null); $set('plant', $state); $pId = $get('plant_id'); if (!$pId) { $set('pqPlantError', 'Please select a plant first.'); } else { $set('pqPlantError', null); } $pId = $get('line_id'); if (!$pId) { $set('pqLineError', null); } }) ->required() //->default(fn () => request()->query('plant_id')) ->default(fn ($get) => $get('plant') ?? session('last_selected_plant_id')) ->extraAttributes(fn ($get) => [ 'class' => $get('pqPlantError') ? 'border-red-500' : '', ]) ->hint(fn ($get) => $get('pqPlantError') ? $get('pqPlantError') : null) ->hintColor('danger'), Forms\Components\Hidden::make('plant') ->default(fn () => session('last_selected_plant_id')), Forms\Components\Select::make('line_id') ->relationship('line', titleAttribute: 'name') ->reactive() ->required() ->options(function (callable $get) { $plantId = $get('plant_id'); if (!$plantId) { return []; } return Line::where('plant_id', $plantId) ->where('type', 'FG Line') // Filter by type ->pluck('name', 'id') ->toArray(); }) ->afterStateUpdated(function (callable $set, callable $get, $state) { $set('item_id', null); $set('production_order', null); $set('line', $state); $pId = $get('line_id'); if (!$pId) { $set('pqLineError', 'Please select a line.'); } else { $set('pqLineError', null); } }) ->default(fn ($get) => $get('line') ?? session('last_selected_line')) ->extraAttributes(fn ($get) => [ 'class' => $get('pqLineError') ? 'border-red-500' : '', ]) ->hint(fn ($get) => $get('pqLineError') ? $get('pqLineError') : null) ->hintColor('danger'), Forms\Components\Hidden::make('line') ->default(fn () => session('last_selected_line')), Forms\Components\Hidden::make('sticker_master_id') // ->relationship('stickerMaster', 'id') ->required(), 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); $set('production', $state); } }) ->default(fn ($get) => $get('production') ?? session('last_selected_production')) ->extraAttributes(fn ($get) => [ 'class' => $get('productionError') ? 'border-red-500' : '', ]) ->hint(fn ($get) => $get('productionError') ? $get('productionError') : null) ->hintColor('danger') ->required(), Forms\Components\Hidden::make('production') ->default(fn () => session('last_selected_production')), 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) { $pId = $get('line_id'); if (!$pId) { $set('pqLineError', 'Please select a line.'); } else { $set('pqLineError', null); } $pOrder = $get('production_order'); if (!$pOrder) { $set('productionError', 'Production Order cant be empty.'); } else { $set('productionError', null); } $serialFields = [ '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' ]; $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' ]; 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; } 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 = 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) { 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('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 && !$get('id')) { $set('validationError', 'Serial number already exists in quality validation.'); //$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; // } // } // $visiblePartValidations = []; // foreach ($partValidationColumns as $column) { // if ($stickerMaster->$column !== null) { // $visiblePartValidations[] = $column; // } // } foreach ($serialFields as $column) { $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); } } 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); $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\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\Hidden::make('serial_number_pump'), 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) { $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() ->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,})\/[MmPpCc]\|?$/', $state)) { if (!preg_match('/^([a-zA-Z0-9]{6,})\|([1-9][a-zA-Z0-9]{8,})(?:\/[MmPpCc])?\|?$/', $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('/\/[MmPpCc]$/', '', $serialNumber); // Remove // // 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')); if ($itemCode !== $expectedItemCode) { $set('pack_slip_motor_error', 'Item code does not match.'); return; } $set('pack_slip_motor_qr', $serialNumber); $set('pack_slip_motor', '1'); // $isMatch = in_array($serialNumber, $visibleSerialNumbers, true); $isMatch = ($visibleSerialNumber == $serialNumber); if (!$serialNumber || trim($serialNumber) === '') { $set('pack_slip_motor_error', null); return; } 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_qr', $serialNumber); $set('pack_slip_motor', '1'); } }) ->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\Hidden::make('pack_slip_pump'), 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() ->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,})\/[MmPpCc]\|?$/', $state)) { if (!preg_match('/^([a-zA-Z0-9]{6,})\|([1-9][a-zA-Z0-9]{8,})(?:\/[MmPpCc])?\|?$/', $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('/\/[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('pack_slip_pump_error', 'Item code does not match.'); return; } $set('pack_slip_pump_qr', $serialNumber); $set('pack_slip_pump', '1'); // $isMatch = in_array($serialNumber, $visibleSerialNumbers, true); $isMatch = ($visibleSerialNumber == $serialNumber); if (!$serialNumber || trim($serialNumber) === '') { $set('pack_slip_pump_error', null); return; } 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_qr', $serialNumber); $set('pack_slip_pump', '1'); } }) ->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\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() ->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,})\/[MmPpCc]\|?$/', $state)) { if (!preg_match('/^([a-zA-Z0-9]{6,})\|([1-9][a-zA-Z0-9]{8,})(?:\/[MmPpCc])?\|?$/', $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('/\/[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('pack_slip_pumpset_error', 'Item code does not match.'); return; } $set('pack_slip_pumpset_qr', $serialNumber); $set('pack_slip_pumpset', '1'); // $isMatch = in_array($serialNumber, $visibleSerialNumbers, true); $isMatch = ($visibleSerialNumber == $serialNumber); if (!$serialNumber || trim($serialNumber) === '') { $set('pack_slip_pumpset_error', null); return; } 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_qr', $serialNumber); $set('pack_slip_pumpset', '1'); } }) ->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\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() ->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,})\/[MmPpCc]\|?$/', $state)) { if (!preg_match('/^([a-zA-Z0-9]{6,})\|([1-9][a-zA-Z0-9]{8,})(?:\/[MmPpCc])?\|?$/', $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('/\/[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('name_plate_motor_error', 'Item code does not match.'); return; } $set('name_plate_motor_error', $serialNumber); // $isMatch = in_array($serialNumber, $visibleSerialNumbers, true); $isMatch = ($visibleSerialNumber == $serialNumber); if (!$serialNumber || trim($serialNumber) === '') { $set('name_plate_motor_error', null); return; } 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_qr', $serialNumber); $set('name_plate_motor', '1'); } }) ->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\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() ->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,})\/[MmPpCc]\|?$/', $state)) { if (!preg_match('/^([a-zA-Z0-9]{6,})\|([1-9][a-zA-Z0-9]{8,})(?:\/[MmPpCc])?\|?$/', $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('/\/[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('name_plate_pump_error', 'Item code does not match.'); return; } $set('name_plate_pump_error', $serialNumber); // $isMatch = in_array($serialNumber, $visibleSerialNumbers, true); $isMatch = ($visibleSerialNumber == $serialNumber); if (!$serialNumber || trim($serialNumber) === '') { $set('name_plate_pump_error', null); return; } 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_qr', $serialNumber); $set('name_plate_pump', '1'); } }) ->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\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() ->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,})\/[MmPpCc]\|?$/', $state)) { if (!preg_match('/^([a-zA-Z0-9]{6,})\|([1-9][a-zA-Z0-9]{8,})(?:\/[MmPpCc])?\|?$/', $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('/\/[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('name_plate_pumpset_error', 'Item code does not match.'); return; } $set('name_plate_pumpset_error', $serialNumber); // $isMatch = in_array($serialNumber, $visibleSerialNumbers, true); $isMatch = ($visibleSerialNumber == $serialNumber); if (!$serialNumber || trim($serialNumber) === '') { $set('name_plate_pumpset_error', null); return; } 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_qr', $serialNumber); $set('name_plate_pumpset', '1'); } }) ->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\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() ->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,})\/[MmPpCc]\|?$/', $state)) { if (!preg_match('/^([a-zA-Z0-9]{6,})\|([1-9][a-zA-Z0-9]{8,})(?:\/[MmPpCc])?\|?$/', $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('/\/[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('tube_sticker_motor_error', 'Item code does not match.'); return; } $set('tube_sticker_motor_error', $serialNumber); // $isMatch = in_array($serialNumber, $visibleSerialNumbers, true); $isMatch = ($visibleSerialNumber == $serialNumber); if (!$serialNumber || trim($serialNumber) === '') { $set('tube_sticker_motor_error', null); return; } 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_qr', $serialNumber); $set('tube_sticker_motor', '1'); } }) ->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\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() ->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,})\/[MmPpCc]\|?$/', $state)) { if (!preg_match('/^([a-zA-Z0-9]{6,})\|([1-9][a-zA-Z0-9]{8,})(?:\/[MmPpCc])?\|?$/', $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('/\/[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('tube_sticker_pump_error', 'Item code does not match.'); return; } $set('tube_sticker_pump_error', $serialNumber); // $isMatch = in_array($serialNumber, $visibleSerialNumbers, true); $isMatch = ($visibleSerialNumber == $serialNumber); if (!$serialNumber || trim($serialNumber) === '') { $set('tube_sticker_pump_error', null); return; } 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_qr', $serialNumber); $set('tube_sticker_pump', '1'); } }) ->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\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() ->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,})(?:\/[MmPpCc])?\|?$/', $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('/\/[MmPpCc]$/', '', $serialNumber); // Remove $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'); //dd($parts); $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); $isMatch = ($visibleSerialNumber == $serialNumber); if (!$serialNumber || trim($serialNumber) === '') { $set('tube_sticker_pumpset_error', null); return; } 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_qr', $serialNumber); $set('tube_sticker_pumpset', '1'); } }) ->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\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() ->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,})\/[MmPpCc]\|?$/', $state)) { if (!preg_match('/^([a-zA-Z0-9]{6,})\|([1-9][a-zA-Z0-9]{8,})(?:\/[MmPpCc])?\|?$/', $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('/\/[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('warranty_card_error', 'Item code does not match.'); return; } $set('warranty_card_error', $serialNumber); // $isMatch = in_array($serialNumber, $visibleSerialNumbers, true); $isMatch = ($visibleSerialNumber == $serialNumber); if (!$serialNumber || trim($serialNumber) === '') { $set('warranty_card_error', null); return; } 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_qr', $serialNumber); $set('warranty_card', '1'); } }) ->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 = 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."); $set('part_validation1', null); 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 = 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."); $set('part_validation2', null); 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 = 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."); $set('part_validation3', null); 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 = 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."); $set('part_validation4', null); 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 = StickerMaster::find($stickerMasterId); if (!$stickerMaster) { return; } $expectedValue = $stickerMaster->part_validation5; // 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."); $set('part_validation5', null); return; } }) ->extraAttributes(fn ($get) => [ 'class' => $get('part_validation5_error') ? 'border-red-500' : '', ]) ->hint(fn ($get) => $get('part_validation5_error')) ->hintColor('danger'), Forms\Components\TextInput::make('id') ->hidden() ->readOnly(), ]); } 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('No.') ->label('No.') ->getStateUsing(function ($record, $livewire, $column, $rowLoop) { $paginator = $livewire->getTableRecords(); $perPage = method_exists($paginator, 'perPage') ? $paginator->perPage() : 10; $currentPage = method_exists($paginator, 'currentPage') ? $paginator->currentPage() : 1; return ($currentPage - 1) * $perPage + $rowLoop->iteration; }), Tables\Columns\TextColumn::make('plant.name') ->label('Plant') ->alignCenter() ->sortable(), Tables\Columns\TextColumn::make('line.name') ->label('Line') ->alignCenter() ->sortable(), Tables\Columns\TextColumn::make('production_order') ->label('Production Order') ->alignCenter() ->sortable(), Tables\Columns\TextColumn::make('serial_number') ->label('Serial Number') ->alignCenter() ->sortable(), Tables\Columns\TextColumn::make('stickerMaster.item.code') ->label('Item Code') ->alignCenter() ->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') ->label('Pack Slip Pumpset') ->alignCenter() ->sortable(), Tables\Columns\TextColumn::make('name_plate_motor') ->label('Name Plate Motor') ->alignCenter() ->sortable(), Tables\Columns\TextColumn::make('name_plate_pump') ->label('Name Plate Pump') ->alignCenter() ->sortable(), Tables\Columns\TextColumn::make('name_plate_pumpset') ->label('Name Plate Pumpset') ->alignCenter() ->sortable(), Tables\Columns\TextColumn::make('tube_sticker_motor') ->label('Tube Sticker Motor') ->alignCenter() ->sortable(), Tables\Columns\TextColumn::make('tube_sticker_pump') ->label('Tube Sticker Pump') ->alignCenter() ->sortable(), Tables\Columns\TextColumn::make('tube_sticker_pumpset') ->label('Tube Sticker Pumpset') ->alignCenter() ->sortable(), Tables\Columns\TextColumn::make('warranty_card') ->label('Warranty Card') ->alignCenter() ->sortable(), Tables\Columns\TextColumn::make('part_validation1') ->label('Part Validation 1') ->alignCenter() ->sortable(), Tables\Columns\TextColumn::make('part_validation2') ->label('Part Validation 2') ->alignCenter() ->sortable(), Tables\Columns\TextColumn::make('part_validation3') ->label('Part Validation 3') ->alignCenter() ->sortable(), Tables\Columns\TextColumn::make('part_validation4') ->label('Part Validation 4') ->alignCenter() ->sortable(), Tables\Columns\TextColumn::make('part_validation5') ->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') ->alignCenter() ->sortable(), Tables\Columns\TextColumn::make('created_at') ->label('Created At') ->dateTime() ->alignCenter() ->sortable(), Tables\Columns\TextColumn::make('operator_id') ->label('Created By') ->alignCenter() ->sortable(), Tables\Columns\TextColumn::make('updated_at') ->label('Updated At') ->dateTime() ->alignCenter() ->sortable() ->toggleable(isToggledHiddenByDefault: true), Tables\Columns\TextColumn::make('deleted_at') ->label('Deleted At') ->dateTime() ->alignCenter() ->sortable() ->toggleable(isToggledHiddenByDefault: true), ]) ->filters([ Tables\Filters\TrashedFilter::make(), Filter::make('advanced_filters') ->label('Advanced Filters') ->form([ 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); $set('Line', null); $set('operator_id', null); }), Select::make('Line') ->label('Select Line') ->nullable() ->options(function (callable $get) { $plantId = $get('Plant'); if (!$plantId) { return []; } return Line::where('plant_id', $plantId) ->where('type', 'FG Line') // Filter by type ->pluck('name', 'id') ->toArray(); }) ->reactive() ->afterStateUpdated(function ($state, callable $set, callable $get) { $set('sticker_master_id', null); $set('sap_msg_status', null); $set('operator_id', 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(), Select::make('operator_id') ->label('Created By') ->nullable() ->options(function (callable $get) { $plantId = $get('Plant'); $lineId = $get('Line'); if (!$plantId && !$lineId) { return QualityValidation::whereNotNull('operator_id')->select('operator_id')->distinct()->pluck('operator_id', 'operator_id'); } else if ($plantId && !$lineId) { return QualityValidation::where('plant_id', $plantId)->whereNotNull('operator_id')->select('operator_id')->distinct()->pluck('operator_id', 'operator_id'); } else// if ($plantId && $lineId) { return QualityValidation::where('plant_id', $plantId)->where('line_id', $lineId)->whereNotNull('operator_id')->select('operator_id')->distinct()->pluck('operator_id', 'operator_id'); } }) ->searchable() ->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['operator_id']) && empty($data['sticker_master_id'])) { return $query->whereRaw('1 = 0'); } if (!empty($data['Plant'])) { $query->where('plant_id', $data['Plant']); } if (!empty($data['Line'])) { $query->where('line_id', $data['Line']); } if (!empty($data['production_order'])) { $query->where('production_order', $data['production_order']); } if (!empty($data['serial_number'])) { $query->where('serial_number', $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['operator_id'])) { $query->where('operator_id', $data['operator_id']); } 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); } } }) ->indicateUsing(function (array $data) { $indicators = []; if (!empty($data['Plant'])) { $indicators[] = 'Plant: ' . Plant::where('id', $data['Plant'])->value('name'); } if (!empty($data['Line'])) { $indicators[] = 'Line: ' . Line::where('id', $data['Line'])->value('name'); } if (!empty($data['production_order'])) { $indicators[] = 'Production Order: ' . $data['production_order']; } if (!empty($data['serial_number'])) { $indicators[] = 'Serial Number: ' . $data['serial_number']; } if (!empty($data['sticker_master_id'])) { $itemCode = Item::find($data['sticker_master_id'])->code ?? 'Unknown'; $indicators[] = 'Item Codes: ' . $itemCode; } if (!empty($data['sap_msg_status'])) { $indicators[] = 'SAP Message Status: ' . $data['sap_msg_status']; } if (!empty($data['operator_id'])) { $indicators[] = 'Created By: ' . $data['operator_id']; } if (!empty($data['created_from'])) { $indicators[] = 'From: ' . $data['created_from']; } if (!empty($data['created_to'])) { $indicators[] = 'To: ' . $data['created_to']; } return $indicators; }) ]) ->filtersFormMaxHeight('280px') ->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(), ]), ]) ->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'); }), ]); } // public static function mutateFormDataBeforeCreate(array $data): array // { // $user =Filament::auth()->user(); // dd($user); // if($user){ // $data['operator_id'] = $user->name; // } // // $data['operator_id'] = Filament::auth()->user()->name; // return $data; // } 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, ]); } }