diff --git a/app/Filament/Resources/InvoiceValidationResource.php b/app/Filament/Resources/InvoiceValidationResource.php index 45ba80620..eec47a321 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 9e430eb43..f6c9577a5 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 4645bc26d..72dc8027b 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 5bf76a89a..403042e44 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 000000000..ea6f9fe79 --- /dev/null +++ b/database/migrations/2025_04_10_131305_add_operator_id_to_invoice_validations_table.php @@ -0,0 +1,31 @@ + - @if($hasSearched)
| No | -Material Code | -Serial Number | -Motor Scanned Status | -Pump Scanned Status | -Capacitor Scanned Status | -Scanned Status Set | -Panel Box Supplier | -Panel Box Serial Number | -Scanned Status | +No | +Material Code | +Serial Number | +Motor Scanned Status | +Pump Scanned Status | +Capacitor Scanned Status | +Scanned Status Set | +Scanned Status | +Time Stamp | +Operator ID | +Panel Box Supplier | +Panel 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' }} | @empty
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|