From c3e0429421eabb25c63520b116952abd1312e538 Mon Sep 17 00:00:00 2001 From: dhanabalan Date: Fri, 3 Oct 2025 16:06:41 +0530 Subject: [PATCH] Added livewire page for serial validation --- app/Livewire/SerialValidationData.php | 371 ++++++++++++++++++ .../livewire/serial-validation-data.blade.php | 209 ++++++++++ 2 files changed, 580 insertions(+) create mode 100644 app/Livewire/SerialValidationData.php create mode 100644 resources/views/livewire/serial-validation-data.blade.php diff --git a/app/Livewire/SerialValidationData.php b/app/Livewire/SerialValidationData.php new file mode 100644 index 0000000..6c5f2b9 --- /dev/null +++ b/app/Livewire/SerialValidationData.php @@ -0,0 +1,371 @@ + 'loadData',]; + + protected $listeners = [ + 'refreshCompletedInvoice' => 'loadCompletedData', + 'refreshEmptyInvoice' => 'loadEmptyData', + 'refreshInvoiceData' => 'loadData', + 'refreshMaterialInvoiceData' => 'loadMaterialData', + 'openCapacitorModal' => 'showCapacitorInputBox', + ]; + + public $capacitorInput = ''; + + public $panel_box_supplier; + + public $panel_box_item_code; + + public $panel_box_serial_number; + + public string $currentItemCode = ''; + + public string $currentSerialNumber = ''; + + // public function loadCompletedData($invoiceNumber, $plantId, $isSerial) + // { + // $this->plantId = $plantId; + // $this->invoiceNumber = $invoiceNumber; + // $this->completedInvoice = true; + // $this->isSerial = $isSerial; + // $this->emptyInvoice = false; + // $this->hasSearched = false; + // $this->materialInvoice = false; + // // $this->showCapacitorInput = false; + // } + + public function loadCompletedData($invoiceNumber, $plantId, $isSerial) + { + + $this->plantId = $plantId; + $this->invoiceNumber = $invoiceNumber; + $this->completedInvoice = true; + $this->isSerial = $isSerial; + $this->emptyInvoice = false; + $this->hasSearched = false; + $this->materialInvoice = false; + // $this->showCapacitorInput = false; + } + + public function loadEmptyData($invoiceNumber, $plantId) + { + $this->plantId = $plantId; + $this->invoiceNumber = $invoiceNumber; + $this->completedInvoice = false; + $this->emptyInvoice = true; + $this->hasSearched = false; + $this->materialInvoice = false; + // $this->showCapacitorInput = false; + } + + public function loadData($invoiceNumber, $plantId) + { + $this->plantId = $plantId; + $this->invoiceNumber = $invoiceNumber; + $this->completedInvoice = false; + $this->isSerial = true; + $this->emptyInvoice = false; + $this->hasSearched = true; + $this->materialInvoice = false; + // $this->showCapacitorInput = false; + + //->where('serial_number', '!=', '') + $this->invoiceData = SerialValidation::where('invoice_number', $this->invoiceNumber) + ->where('plant_id', $plantId)->where('scanned_status', null) + ->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 ?? '', + 'scanned_status' => $record->scanned_status ?? '', + 'panel_box_supplier' => $record->panel_box_supplier ?? '', + 'panel_box_serial_number' => $record->panel_box_serial_number ?? '', + 'created_at' => $record->created_at, + 'operator_id' => $record->operator_id, + ]; + }) + ->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::with('item')->find($row['sticker_master_id'] ?? null)?->item?->code ?? 'N/A'; + } + } + + public function loadMaterialData($invoiceNumber, $plantId) + { + $this->plantId = $plantId; + $this->invoiceNumber = $invoiceNumber; + $this->completedInvoice = false; + $this->isSerial = false; + $this->emptyInvoice = false; + $this->hasSearched = false; + $this->materialInvoice = true; + // $this->showCapacitorInput = false; + + //->where('serial_number', '!=', '') + $this->invoiceData = SerialValidation::where('invoice_number', $this->invoiceNumber)->where('plant_id', $plantId)->where('serial_number', null) + ->get() + ->map(function ($record) { + return [ + 'sticker_master_id' => $record->sticker_master_id, + // 'material_type' => StickerMaster::where('id', $record->sticker_master_id)->first()->material_type ?? '', + 'quantity' => $record->quantity ?? '', + 'serial_number' => $record->serial_number ?? '', + 'batch_number' => $record->batch_number ?? '', + 'created_at' => $record->created_at, + 'operator_id' => $record->operator_id, + ]; + }) + ->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::with('item')->find($row['sticker_master_id'] ?? null)?->item?->code ?? 'N/A'; + $matType = StickerMaster::where('id', $row['sticker_master_id'] ?? null)->first()->material_type ?? ''; + if($matType === 1) + { + $row['material_type'] = 'Individual'; + } + else if($matType === 2) + { + $row['material_type'] = 'Bundle'; + } + else if($matType === 3) + { + $row['material_type'] = 'Quantity'; + } + else + { + $row['material_type'] = 'N/A'; + } + } + } + + // public function showCapacitorInputBox() + // { + // $this->showCapacitorInput = true; + // } + + public function showCapacitorInputBox($itemCode, $serialNumber, $plantId) + { + $this->plantId = $plantId; + $this->currentItemCode = $itemCode; + $this->currentSerialNumber = $serialNumber; + $this->showCapacitorInput = true; + // $this->capacitorInput = ''; + $this->completedInvoice = false; + $this->isSerial = true; + $this->emptyInvoice = false; + $this->hasSearched = false; + $this->materialInvoice = false; + $this->dispatch('focus-capacitor-input'); + } + + public function cancelCapacitorInput() + { + $this->showCapacitorInput = false; + } + + public function processCapacitorInput() + { + $user = Filament::auth()->user(); + $operatorName = $user->name; + + if (!$this->capacitorInput) { + return; + } + + if (!preg_match('/^[^\/]+\/[^\/]+\/.+$/', $this->capacitorInput)) { + Notification::make() + ->title('Invalid Panel Box QR Format:') + ->body('Scan the valid panel box QR code to proceed!') + ->danger() + // ->duration(3000) + ->seconds(2) + ->send(); + return; + } + + $parts = explode('/', $this->capacitorInput); + $supplier = $parts[0]; + $itemCode = $parts[1]; + $serialNumber = implode('/', array_slice($parts, 2)); // Keep rest of the string + + $existsInStickerMaster = StickerMaster::where('panel_box_code', $itemCode)->where('plant_id', $this->plantId)->whereHas('item', function ($query) { + $query->where('code', $this->currentItemCode); + }) + ->exists(); + + if (!$existsInStickerMaster) { + Notification::make() + ->title('Unknown: Panel Box Code') + ->body("Unknown panel box code: $itemCode found for item code: $this->currentItemCode") + ->danger() + // ->duration(4000) + ->seconds(2) + ->send(); + $this->capacitorInput = ''; + return; + } + + foreach ($this->invoiceData as &$row) { + if ( + ($row['code'] ?? '') === $this->currentItemCode && + ($row['serial_number'] ?? '') === $this->currentSerialNumber + ) { + $row['panel_box_supplier'] = $supplier; + $row['panel_box_item_code'] = $itemCode; + $row['panel_box_serial_number'] = $serialNumber; + $row['capacitor_scanned_status'] = 1; + // $row['scanned_status_set'] = true; + + $matchingValidation = SerialValidation::with('stickerMaster.item') + ->where('serial_number', $this->currentSerialNumber) + ->where('plant_id', $this->plantId) + ->get() + ->first(function ($validation) { + return $validation->stickerMaster?->item?->code === $this->currentItemCode; + }); + + if ($matchingValidation) { + $hasMotorQr = $matchingValidation->stickerMasterRelation->tube_sticker_motor ?? null; + $hasPumpQr = $matchingValidation->stickerMasterRelation->tube_sticker_pump ?? null; + $hasPumpSetQr = $matchingValidation->stickerMasterRelation->tube_sticker_pumpset ?? null; + // $hasCapacitorQr = $matchingValidation->stickerMasterRelation->panel_box_code ?? null; + + $hadMotorQr = $matchingValidation->motor_scanned_status ?? null; + $hadPumpQr = $matchingValidation->pump_scanned_status ?? null; + $hadPumpSetQr = $matchingValidation->scanned_status_set ?? null; + // $hadCapacitorQr = $matchingValidation->capacitor_scanned_status ?? null; + + $packCnt = 1; + $scanCnt = 1; + // if($hadMotorQr === $hasMotorQr && $hadPumpQr === $hasPumpQr && $hadPumpSetQr === $hasPumpSetQr) + if($hasMotorQr || $hasPumpQr || $hasPumpSetQr) + { + $packCnt = $hasMotorQr ? $packCnt + 1 : $packCnt; + $packCnt = $hasPumpQr ? $packCnt + 1 : $packCnt; + $packCnt = $hasPumpSetQr ? $packCnt + 1 : $packCnt; + + $scanCnt = $hadMotorQr ? $scanCnt + 1: $scanCnt; + $scanCnt = $hadPumpQr ? $scanCnt + 1: $scanCnt; + $scanCnt = $hadPumpSetQr ? $scanCnt + 1: $scanCnt; + + if($packCnt === $scanCnt) + { + $matchingValidation->update([ + 'panel_box_supplier' => $supplier, + 'panel_box_item_code' => $itemCode, + 'panel_box_serial_number' => $serialNumber, + 'capacitor_scanned_status' => 1, + 'scanned_status' => 'Scanned', + 'operator_id'=> $operatorName, + ]); + } + else + { + $matchingValidation->update([ + 'panel_box_supplier' => $supplier, + 'panel_box_item_code' => $itemCode, + 'panel_box_serial_number' => $serialNumber, + 'capacitor_scanned_status' => 1, + 'operator_id'=> $operatorName, + ]); + } + } + else + { + $matchingValidation->update([ + 'panel_box_supplier' => $supplier, + 'panel_box_item_code' => $itemCode, + 'panel_box_serial_number' => $serialNumber, + 'capacitor_scanned_status' => 1, + 'scanned_status' => 'Scanned', + 'operator_id'=> $operatorName, + ]); + } + + // Notification::make() + // ->title('Success: Capacitor QR') + // // ->title("Panel box code scanned: $itemCode") + // ->body("'Capacitor' QR scanned status updated, Scan next QR.") + // ->success() // commented + // ->seconds(2) + // ->send(); + + $totalQuantity = SerialValidation::where('invoice_number', $matchingValidation->invoice_number)->where('plant_id', $this->plantId)->count(); + $scannedQuantity = SerialValidation::where('invoice_number', $matchingValidation->invoice_number)->where('plant_id', $this->plantId)->where('scanned_status', 'Scanned')->count(); + // $this->form->fill([ + // 'plant_id' => $matchingValidation->plant_id, + // 'invoice_number' => $matchingValidation->invoice_number, + // 'serial_number' => null, + // 'total_quantity' => $totalQuantity, + // 'scanned_quantity'=> $scannedQuantity, + // ]); + + if($totalQuantity === $scannedQuantity) + { + Notification::make() + ->title('Completed: Serial Invoice') + ->body("Serial invoice '$matchingValidation->invoice_number' completed the scanning process.
Scan the next 'Serial Invoice' to proceed!") + ->success() + ->seconds(2) + ->send(); + $this->loadCompletedData($matchingValidation->invoice_number, $matchingValidation->plant_id, true); + } + else + { + $this->loadData($matchingValidation->invoice_number, $matchingValidation->plant_id); + } + } + break; + } + } + $this->showCapacitorInput = false; + $this->capacitorInput = ''; + $this->dispatch('focus-serial-number'); + } + + public function render() + { + return view('livewire.serial-validation-data'); + } + +} diff --git a/resources/views/livewire/serial-validation-data.blade.php b/resources/views/livewire/serial-validation-data.blade.php new file mode 100644 index 0000000..dd26243 --- /dev/null +++ b/resources/views/livewire/serial-validation-data.blade.php @@ -0,0 +1,209 @@ + +
+
+

+ @if ($hasSearched) + SERIAL INVOICE DATA TABLE + @elseif ($materialInvoice) + MATERIAL INVOICE DATA TABLE + @else + @if ($completedInvoice) + @if ($isSerial) + SERIAL INVOICE DATA TABLE + @else + MATERIAL INVOICE DATA TABLE + @endif + @else + INVOICE DATA TABLE + @endif + @endif +

+
+
+
+
+ + {{-- Modal for completed invoice--}} + @if ($completedInvoice) +
+

+ @if ($isSerial) + Completed the scanning process for serial invoice number {{ $invoiceNumber }}. + @else + Completed the scanning process for material invoice number {{ $invoiceNumber }}. + @endif +

+
+ @endif + + {{-- Modal for empty invoice--}} + @if ($emptyInvoice) +
+

No data found for invoice number {{ $invoiceNumber }}.

+
+ @endif + + {{-- Modal for serial invoice--}} + @if ($hasSearched) +
+ {{-- --}} + {{--
--}} +
+ + + + + + + + + + + + + + + + + + @forelse ($invoiceData as $index => $row) + + + + + + + + + + + + + + + @empty + + + + @endforelse + +
NoMaterial CodeSerial NumberMotor Scanned StatusPump Scanned StatusCapacitor Scanned StatusScanned Status SetScanned StatusTime StampOperator IDPanel Box SupplierPanel Box Serial Number
{{ $index + 1 }}{{ $row['code'] ?? 'N/A' }}{{ $row['serial_number'] ?? 'N/A' }}{{ $row['motor_scanned_status'] ?? '' }}{{ $row['pump_scanned_status'] ?? '' }}{{ $row['capacitor_scanned_status'] ?? '' }}{{ $row['scanned_status_set'] ?? '' }}{{ $row['scanned_status'] ?? '' }}{{ $row['created_at'] ?? '' }}{{ $row['operator_id'] ?? '' }}{{ $row['panel_box_supplier'] ?? '' }}{{ $row['panel_box_serial_number'] ?? '' }}
+ No data found for invoice number {{ $invoiceNumber }}. +
+
+ @endif + + {{-- Modal for Capacitor Input --}} +
+ + @if($showCapacitorInput) +
+
+

+ Scan the Panel Box Supplier/Item Code/Serial Number +

+ + + +
+ +
+
+
+ {{-- Add this script to focus on the input --}} + + @endif +
+ + {{-- Modal for material invoice--}} + @if($materialInvoice) +
+ {{-- --}} + {{--
--}} +
+ + + + + + + + + + + + + + @forelse ($invoiceData as $index => $row) + + + + + + + + + + + @empty + + + + @endforelse + +
NoMaterial CodeMaterial TypeMaterial QuantitySerial NumberBatch NumberTimeStampOperator ID
{{ $index + 1 }}{{ $row['code'] ?? 'N/A' }}{{ $row['material_type'] ?? 'N/A' }}{{ $row['quantity'] ?? 'N/A' }}{{ $row['serial_number'] ?? 'N/A' }}{{ $row['batch_number'] ?? 'N/A' }}{{ $row['created_at'] ?? 'N/A' }}{{ $row['operator_id'] ?? 'N/A' }}
+ No data found for invoice number {{ $invoiceNumber }}. +
+
+ @endif +
+{{-- --}} + + +