From 2ccad83e67b5f6cf370008432d515eeedf655881 Mon Sep 17 00:00:00 2001 From: dhanabalan Date: Thu, 10 Apr 2025 20:24:04 +0530 Subject: [PATCH] updated motor and pump scanning logic --- .../Resources/InvoiceValidationResource.php | 16 ++-- .../Pages/CreateInvoiceValidation.php | 89 ++++++++++++++++++- app/Livewire/InvoiceDataTable.php | 43 +++++---- app/Models/InvoiceValidation.php | 5 ++ ...erator_id_to_invoice_validations_table.php | 31 +++++++ .../livewire/invoice-data-table.blade.php | 33 ++++--- 6 files changed, 177 insertions(+), 40 deletions(-) create mode 100644 database/migrations/2025_04_10_131305_add_operator_id_to_invoice_validations_table.php 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)
- + {{--
--}} + {{--
--}} +
- - - - - - - - - - + + + + + + + + + + + + @@ -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' }}