diff --git a/app/Filament/Resources/InvoiceValidationResource.php b/app/Filament/Resources/InvoiceValidationResource.php index 45ba806..eec47a3 100644 --- a/app/Filament/Resources/InvoiceValidationResource.php +++ b/app/Filament/Resources/InvoiceValidationResource.php @@ -20,6 +20,7 @@ use Filament\Notifications\Notification; use Filament\Tables\Actions\Action; use Illuminate\Support\Facades\Storage; use Maatwebsite\Excel\Facades\Excel; +use Livewire\Livewire; // Ensure this is imported class InvoiceValidationResource extends Resource { @@ -29,6 +30,9 @@ class InvoiceValidationResource extends Resource protected static ?string $navigationGroup = 'Invoice'; + public $invoiceNumber; + + public static function form(Form $form): Form { @@ -55,8 +59,13 @@ class InvoiceValidationResource extends Resource 'x-on:keydown.enter.prevent' => '$wire.processInvoice(value)', ]), - Forms\Components\TextInput::make('serial_number') - ->reactive() + Forms\Components\TextInput::make('serial_number') + ->extraAttributes([ + 'x-data' => '{ value: "" }', + 'x-model' => 'value', + 'wire:keydown.enter.prevent' => 'processSerialNumber(value)', // Using wire:keydown + ]) + ->columnSpan(1), Forms\Components\TextInput::make('total_quantity') @@ -68,12 +77,9 @@ class InvoiceValidationResource extends Resource ]) ->columns(5), - ]); } - - public static function table(Table $table): Table { return $table diff --git a/app/Filament/Resources/InvoiceValidationResource/Pages/CreateInvoiceValidation.php b/app/Filament/Resources/InvoiceValidationResource/Pages/CreateInvoiceValidation.php index 9e430eb..f6c9577 100644 --- a/app/Filament/Resources/InvoiceValidationResource/Pages/CreateInvoiceValidation.php +++ b/app/Filament/Resources/InvoiceValidationResource/Pages/CreateInvoiceValidation.php @@ -6,6 +6,7 @@ use App\Filament\Resources\InvoiceValidationResource; use App\Livewire\InvoiceDataTable; use App\Models\InvoiceValidation; use App\Models\StickerMaster; +use Filament\Facades\Filament; use Illuminate\Contracts\View\View; use Filament\Resources\Pages\CreateRecord; use Filament\Notifications\Notification; @@ -28,7 +29,8 @@ class CreateInvoiceValidation extends CreateRecord public $total_quantity; - public string $invoiceNumber; + public $invoiceNumber; + public bool $hasSearched = false; public $excel_file; @@ -40,7 +42,10 @@ class CreateInvoiceValidation extends CreateRecord public function processInvoice($invoiceNumber) { - // Get plant_id selected in the form + $user = Filament::auth()->user(); + + $operatorName = $user->name; + $plantId = $this->form->getState()['plant_id']; $filePath = session('uploaded_invoice_path'); @@ -142,6 +147,7 @@ class CreateInvoiceValidation extends CreateRecord 'serial_number' => $serialNumber, 'plant_id' => $plantId, 'invoice_number' => $invoiceNumber, + 'operator_id'=> $operatorName, ]); $inserted++; } @@ -154,7 +160,7 @@ class CreateInvoiceValidation extends CreateRecord ->body("$inserted records were inserted.") ->success() ->send(); - // Dispatch the event to refresh the Livewire component + $this->dispatch('refreshInvoiceData', invoiceNumber: $invoiceNumber); } @@ -170,6 +176,83 @@ class CreateInvoiceValidation extends CreateRecord } } + protected function refreshInvoiceTable() + { + if (empty($this->invoiceNumber)) { + $this->invoiceNumber = $this->form->getState()['invoice_number'] ?? ''; + } + + if (!empty($this->invoiceNumber)) { + $this->dispatch('refreshInvoiceData', invoiceNumber: $this->invoiceNumber); + } + } + + public function processSerialNumber($serialNumber) + { + + if (!preg_match('/^([a-zA-Z0-9]{6,})\|([a-zA-Z0-9]{8,})(?:\/[MmPpCc])?$/', $serialNumber, $matches)) { + Notification::make() + ->danger() + ->title('Invalid format') + ->body('Please enter serial in correct format: ITEM123|123456789/M') + ->send(); + return; + } + + if (preg_match('/^([a-zA-Z0-9]+)\|([a-zA-Z0-9]+(?:\/[MmPpCc]?)?)$/', $serialNumber, $matches)) + { + + $itemCode = $matches[1]; + $serialNumber = $matches[2]; + + // Check if it ends with /M, /P, /C etc. + $isMarkM = preg_match('/\/[Mm]$/', $serialNumber); + $isMarkP = preg_match('/\/[Pp]$/', $serialNumber); + + $serialNumber = preg_replace('/\/[MmPpCc]$/', '', $serialNumber); + + $record = InvoiceValidation::where('serial_number', $serialNumber) + ->whereHas('stickerMasterRelation.item', function ($query) use ($itemCode) { + $query->where('code', $itemCode); + }) + ->first(); + + if (!$record) { + Notification::make() + ->danger() + ->title('Serial not found') + ->body("Item code '$itemCode' with serial '$serialNumber' not found.") + ->send(); + return; + } + + if ($isMarkM) { + $record->motor_scanned_status = 1; + $record->save(); + + Notification::make() + ->success() + ->title('Updated') + ->body("Motor scanned status marked as updated.") + ->send(); + $this->refreshInvoiceTable(); + + } + else if ($isMarkP) { + $record->pump_scanned_status = 1; + $record->save(); + + Notification::make() + ->success() + ->title('Updated') + ->body("Pump scanned status marked as updated.") + ->send(); + $this->refreshInvoiceTable(); + } + } + + } + public function getHeading(): string { return 'Scan Invoice Validation'; diff --git a/app/Livewire/InvoiceDataTable.php b/app/Livewire/InvoiceDataTable.php index 4645bc2..72dc802 100644 --- a/app/Livewire/InvoiceDataTable.php +++ b/app/Livewire/InvoiceDataTable.php @@ -14,40 +14,45 @@ class InvoiceDataTable extends Component public bool $hasSearched = false; - protected $listeners = ['refreshInvoiceData' => 'loadData']; + protected $listeners = ['refreshInvoiceData' => 'loadData',]; + public function loadData($invoiceNumber) { - $this->invoiceNumber = $invoiceNumber; - $this->hasSearched = true; + $this->invoiceNumber = $invoiceNumber; + $this->hasSearched = true; - $this->invoiceData = InvoiceValidation::where('invoice_number', $this->invoiceNumber) - ->get() - ->map(function ($record) { - return [ - 'sticker_master_id' => $record->sticker_master_id, - 'serial_number' => $record->serial_number, - 'motor_scanned_status' => $record->motor_scanned_status, - 'pump_scanned_status' => $record->pump_scanned_status, - 'capacitor_scanned_status' => $record->capacitor_scanned_status, - 'scanned_status_set' => $record->scanned_status_set, - 'panel_box_supplier' => $record->panel_box_supplier, - 'panel_box_serial_number' => $record->panel_box_serial_number, - 'scanned_status' => $record->scanned_status, - ]; - }) + $this->invoiceData = InvoiceValidation::where('invoice_number', $this->invoiceNumber) + ->get() + ->map(function ($record) { + return [ + 'sticker_master_id' => $record->sticker_master_id, + 'serial_number' => $record->serial_number, + 'motor_scanned_status' => $record->motor_scanned_status, + 'pump_scanned_status' => $record->pump_scanned_status, + 'capacitor_scanned_status' => $record->capacitor_scanned_status, + 'scanned_status_set' => $record->scanned_status_set, + 'panel_box_supplier' => $record->panel_box_supplier, + 'panel_box_serial_number' => $record->panel_box_serial_number, + 'scanned_status' => $record->scanned_status, + 'created_at' => $record->created_at, + 'operator_id' => $record->operator_id, + ]; + }) - ->toArray(); + ->toArray(); //Loop through and replace 'code' using related StickerMaster > Item > code foreach ($this->invoiceData as &$row) { $stickerMaster = \App\Models\StickerMaster::with('item')->find($row['sticker_master_id'] ?? null); $row['code'] = $stickerMaster?->item?->code ?? 'N/A'; } + } public function render() { return view('livewire.invoice-data-table'); } + } diff --git a/app/Models/InvoiceValidation.php b/app/Models/InvoiceValidation.php index 5bf76a8..403042e 100644 --- a/app/Models/InvoiceValidation.php +++ b/app/Models/InvoiceValidation.php @@ -26,6 +26,7 @@ class InvoiceValidation extends Model 'upload_status', 'batch_number', 'quantity', + 'operator_id', ]; public function plant(): BelongsTo @@ -37,6 +38,10 @@ class InvoiceValidation extends Model { return $this->belongsTo(StickerMaster::class); } + public function stickerMasterRelation() + { + return $this->belongsTo(StickerMaster::class, 'sticker_master_id'); + } } diff --git a/database/migrations/2025_04_10_131305_add_operator_id_to_invoice_validations_table.php b/database/migrations/2025_04_10_131305_add_operator_id_to_invoice_validations_table.php new file mode 100644 index 0000000..ea6f9fe --- /dev/null +++ b/database/migrations/2025_04_10_131305_add_operator_id_to_invoice_validations_table.php @@ -0,0 +1,31 @@ + - @if($hasSearched)
- + {{--
--}} + {{--
--}} +
- - - - - - - - - - + + + + + + + + + + + + @@ -156,9 +159,11 @@ + + + - @empty @@ -173,3 +178,5 @@ @endif + +
NoMaterial CodeSerial NumberMotor Scanned StatusPump Scanned StatusCapacitor Scanned StatusScanned Status SetPanel Box SupplierPanel Box Serial NumberScanned StatusNoMaterial CodeSerial NumberMotor Scanned StatusPump Scanned StatusCapacitor Scanned StatusScanned Status SetScanned StatusTime StampOperator IDPanel Box SupplierPanel Box Serial Number
{{ $row['pump_scanned_status'] ?? 'N/A' }} {{ $row['capacitor_scanned_status'] ?? 'N/A' }} {{ $row['scanned_status_set'] ?? 'N/A' }}{{ $row['scanned_status'] ?? 'N/A' }}{{ $row['created_at'] ?? 'N/A' }}{{ $row['operator_id'] ?? 'N/A' }} {{ $row['panel_box_supplier'] ?? 'N/A' }} {{ $row['panel_box_serial_number'] ?? 'N/A' }}{{ $row['scanned_status'] ?? 'N/A' }}