diff --git a/app/Filament/Pages/InvoiceFinder.php b/app/Filament/Pages/InvoiceFinder.php new file mode 100644 index 0000000..212d7b0 --- /dev/null +++ b/app/Filament/Pages/InvoiceFinder.php @@ -0,0 +1,215 @@ +statePath('filters') + ->schema([ + Section::make('') // You can give your section a title or leave it blank + ->schema([ + Select::make('plant_id') + ->options(Plant::pluck('name', 'id')) + ->label('Plant') + ->reactive() + ->required(), + TextInput::make('scan_invoice') + ->label('Scan Invoice') + ->required() + ->reactive() + ->extraAttributes([ + 'wire:keydown.enter' => 'processInvoiceNo($event.target.value)', + ]), + TextInput::make('scan_quantity') + ->label('Scanned Quantity ') + ->readOnly() + ->reactive(), + TextInput::make('pending_quantity') + ->label('Pending Quantity') + ->readOnly() + ->reactive(), + TextInput::make('total_sno_quantity') + ->label('Total SNo. Quantity') + ->readOnly() + ->reactive(), + + ]) + ->columns(5) + ]); + } + + public function processInvoiceNo($invoiceNo) + { + $plantId = $this->form->getState()['plant_id']; + + if(!$invoiceNo) + { + Notification::make() + ->title("Invoice number '$invoiceNo' can't be empty!") + ->danger() + ->send(); + $this->dispatch('loadData', '', [], [], [], [], $plantId); + $this->form->fill([ + 'plant_id' => $plantId, + 'scan_invoice' => $invoiceNo, + 'total_sno_quantity' => 0, + 'pending_quantity' => 0, + 'scan_quantity' => 0 + ]); + return; + } + + $invoiceExists = LocatorInvoiceValidation::where('plant_id', $plantId) + ->where('invoice_number', $invoiceNo) + ->first(); + + if(!$invoiceExists) + { + Notification::make() + ->title("Invoice number '$invoiceNo' does not exist in locator invoice table!") + ->danger() + ->send(); + $this->dispatch('loadData', '', [], [], [], [], $plantId); + $this->form->fill([ + 'plant_id' => $plantId, + 'scan_invoice' => $invoiceNo, + 'total_sno_quantity' => 0, + 'pending_quantity' => 0, + 'scan_quantity' => 0 + ]); + return; + } + + $invoiceCompleted = LocatorInvoiceValidation::where('plant_id', $plantId) + ->where('invoice_number', $invoiceNo) + ->whereNull('scanned_status') + ->orWhere('scanned_status', '=','') + ->first(); + + if(!$invoiceCompleted) + { + $count = LocatorInvoiceValidation::where('invoice_number', $invoiceNo) + ->where('plant_id', $plantId) + ->count(); + Notification::make() + ->title("Invoice number '$invoiceNo' already completed the scanning process...") + ->success() + ->send(); + $this->dispatch('loadData', '', [], [], [], [], $plantId); + + $this->form->fill([ + 'plant_id' => $plantId, + 'scan_invoice' => $invoiceNo, + 'total_sno_quantity' => $count, + 'pending_quantity' => 0, + 'scan_quantity' => $count + ]); + return; + } + + $serialNumbers = LocatorInvoiceValidation::where('plant_id', $plantId) + ->where('invoice_number', $invoiceNo) + ->pluck('serial_number'); + + $notFoundSerials = []; + $incompleteSerials = []; + $scannedSerials = []; + $foundSerials = []; + + foreach ($serialNumbers as $serial) + { + $locatorRecord = LocatorInvoiceValidation::where('serial_number', $serial) + ->where('plant_id', $plantId) + ->first(); + + //$scannedStatus = $locatorRecord->scanned_status ?? null; + + if ($locatorRecord->scanned_status == 'Scanned') + { + $scannedSerials[] = $serial; + continue; + } + + $palletRecord = palletValidation::where('serial_number', $serial) + ->where('plant_id', $plantId) + ->first(); + + if (!$palletRecord) + { + $notFoundSerials[] = $serial; + continue; + } + + $palletStatus = $palletRecord->pallet_status ?? null; + + if (strlen($palletRecord->pallet_number) > 1 && ($palletStatus == '' || $palletStatus == null)) + { + $incompleteSerials[] = $serial; + continue; + } + + $foundSerials[] = $serial; + } + + $count = LocatorInvoiceValidation::where('invoice_number', $invoiceNo) + ->where('plant_id', $plantId) + ->count(); + + $pendingCount = LocatorInvoiceValidation::where('invoice_number', $invoiceNo) + ->where('plant_id', $plantId) + ->whereNull('scanned_status') + ->orWhere('scanned_status', '=', '') + ->count(); + + $scannedCount = LocatorInvoiceValidation::where('invoice_number', $invoiceNo) + ->where('plant_id', $plantId) + ->where('scanned_status', '=', 'Scanned') + ->count(); + + $this->form->fill([ + 'plant_id' => $plantId, + 'scan_invoice' => $invoiceNo, + 'total_sno_quantity' => $count, + 'pending_quantity' => $pendingCount, + 'scan_quantity' => $scannedCount, + ]); + + $this->dispatch('loadData', $invoiceNo, $notFoundSerials, $incompleteSerials, $scannedSerials, $foundSerials, $plantId); + } + + public static function canAccess(): bool + { + return Auth::check() && Auth::user()->can('view invoice finder page'); + } + +} diff --git a/app/Livewire/InvoiceFinderDataTable.php b/app/Livewire/InvoiceFinderDataTable.php new file mode 100644 index 0000000..d51bf85 --- /dev/null +++ b/app/Livewire/InvoiceFinderDataTable.php @@ -0,0 +1,313 @@ + 'loadlocatorInvoiceData', + ]; + + + public function loadlocatorInvoiceData($invoiceNumber, $notFoundSerials, $incompleteSerials, $scannedSerials, $foundSerials, $plantId) + { + $this->records = []; + + if(count($notFoundSerials) > 0) + { + foreach($notFoundSerials as $serial) + { + $record = LocatorInvoiceValidation::where('serial_number', $serial) + ->where('plant_id', $plantId) + ->first(); + + $this->records[] = [ + 'created_at' => $record->created_at, + 'created_by' => $record->created_by ?? '', + 'serial_number' => $record->serial_number, + 'pallet_number' => '', + 'locator_number' => '', + 'scanned_status' => 'Not Exist', + 'scanned_at' => '', + 'scanned_by' => '' + ]; + } + } + + if(count($incompleteSerials) > 0) + { + foreach($incompleteSerials as $serial) + { + $locatorRecord = LocatorInvoiceValidation::where('serial_number', $serial) + ->where('plant_id', $plantId) + ->first(); + + $palletRecord = palletValidation::where('serial_number', $serial) + ->where('plant_id', $plantId) + ->first(); + + $this->records[] = [ + 'created_at' => $locatorRecord->created_at, + 'created_by' => $locatorRecord->created_by, + 'serial_number' => $locatorRecord->serial_number, + 'pallet_number' => $palletRecord->pallet_number, + 'locator_number' => $palletRecord->locator_number, + 'scanned_status' => 'Incompleted', + 'scanned_at' => '', + 'scanned_by' => '' + ]; + } + } + + if(count($foundSerials) > 1) + { + $foundPno = []; + $foundLno = []; + $foundSno = []; + $palletNo = ''; + $locatorNo = ''; + $palletSno = []; + $locatorSno = []; + foreach($foundSerials as $serial) + { + foreach($foundSerials as $sNo) + { + if (in_array($sNo, $foundSno)) + { + continue; + } + + $palletRecord = palletValidation::where('serial_number', $sNo) + ->where('plant_id', $plantId) + ->where('pallet_number', '!=','') + ->where('pallet_number', '!=',null) + // ->whereNotNull('pallet_number') + ->first(); + + if(!$palletRecord || ($palletNo && count($foundPno) > 0 && !in_array($palletRecord->pallet_number, $foundPno))) + { + continue; + } + else + { + $palletNo = $palletRecord->pallet_number; + $locatorNo = $palletRecord->locator_number; + $foundSno[] = $sNo; + $foundPno[] = $palletRecord->pallet_number; + $palletSno[] = $sNo; + } + } + + if(count($palletSno) > 1) + { + $locatorRecord = null; + + foreach($palletSno as $mulSNo) + { + $locatorRecord = LocatorInvoiceValidation::where('serial_number', $mulSNo) + ->where('plant_id', $plantId) + ->first(); + + } + + $this->records[] = [ + 'created_at' => $locatorRecord->created_at, + 'created_by' => $locatorRecord->created_by, + 'serial_number' => count($palletSno), + 'pallet_number' => $palletNo, + 'locator_number' => $locatorNo, + 'scanned_status' => '', + 'scanned_at' => '', + 'scanned_by' => '' + ]; + + $palletNo = ''; + $locatorNo = ''; + $palletSno = []; + } + else if(count($palletSno) == 1) + { + foreach($palletSno as $singleSNo) + { + $palletRecord = palletValidation::where('serial_number', $singleSNo) + ->where('plant_id', $plantId) + ->where('pallet_number', '!=','') + ->whereNotNull('pallet_number') + ->first(); + + $locatorRecord = LocatorInvoiceValidation::where('serial_number', $singleSNo) + ->where('plant_id', $plantId) + ->first(); + $this->records[] = [ + 'created_at' => $locatorRecord->created_at, + 'created_by' => $locatorRecord->created_by, + 'serial_number' => $locatorRecord->serial_number, + 'pallet_number' => $palletRecord->pallet_number, + 'locator_number' => $palletRecord->locator_number, + 'scanned_status' => '', + 'scanned_at' => '', + 'scanned_by' => '' + ]; + } + $palletNo = ''; + $locatorNo = ''; + $palletSno = []; + } + + if (in_array($serial, $foundSno)) + { + continue; + } + + $int = 0; + foreach($foundSerials as $locSNo) + { + if (in_array($locSNo, $foundSno)) + { + continue; + } + + $int++; + $locatorRecord = null; + $locatorRecord = palletValidation::where('serial_number', $locSNo) + ->where('plant_id', $plantId) + ->where('locator_number', '!=','') + ->where('locator_number', '!=',null) + ->first(); + + if(!$locatorRecord || ($locatorNo && count($foundLno) > 0 && !in_array($locatorRecord->locator_number, $foundLno))) + { + continue; + } + else + { + $palletNo = $locatorRecord->pallet_number; + $locatorNo = $locatorRecord->locator_number; + $foundSno[] = $locSNo; + $foundLno[] = $locatorRecord->locator_number; + $locatorSno[] = $locSNo; + } + } + + if(count($locatorSno) > 1) + { + $locatorRecord = null; + + foreach($locatorSno as $mulSNo) + { + $locatorRecord = LocatorInvoiceValidation::where('serial_number', $mulSNo) + ->where('plant_id', $plantId) + ->first(); + } + + $this->records[] = [ + 'created_at' => $locatorRecord->created_at, + 'created_by' => $locatorRecord->created_by, + 'serial_number' => count($locatorSno), + 'pallet_number' => $palletNo, + 'locator_number' => $locatorNo, + 'scanned_status' => '', + 'scanned_at' => '', + 'scanned_by' => '' + ]; + + $palletNo = ''; + $locatorNo = ''; + $locatorSno = []; + } + else if(count($locatorSno) == 1) + { + foreach($locatorSno as $singleSNo) + { + $palletRecord = palletValidation::where('serial_number', $singleSNo) + ->where('plant_id', $plantId) + ->where('locator_number', '!=','') + ->where('locator_number', '!=',null) + ->first(); + + $locatorRecord = LocatorInvoiceValidation::where('serial_number', $singleSNo) + ->where('plant_id', $plantId) + ->first(); + $this->records[] = [ + 'created_at' => $locatorRecord->created_at, + 'created_by' => $locatorRecord->created_by, + 'serial_number' => $locatorRecord->serial_number, + 'pallet_number' => $palletRecord->pallet_number, + 'locator_number' => $palletRecord->locator_number, + 'scanned_status' => '', + 'scanned_at' => '', + 'scanned_by' => '' + ]; + } + $palletNo = ''; + $locatorNo = ''; + $locatorSno = []; + } + } + } + else if(count($foundSerials) == 1) + { + + foreach($foundSerials as $serial) + { + + $locatorRecord = LocatorInvoiceValidation::where('serial_number', $serial) + ->where('plant_id', $plantId) + ->first(); + + $palletRecord = palletValidation::where('serial_number', $serial) + ->where('plant_id', $plantId) + ->first(); + + $this->records[] = [ + 'created_at' => $locatorRecord->created_at, + 'created_by' => $locatorRecord->created_by, + 'serial_number' => $locatorRecord->serial_number, + 'pallet_number' => $palletRecord->pallet_number, + 'locator_number' => $palletRecord->locator_number, + 'scanned_status' => '', + 'scanned_at' => '', + 'scanned_by' => '' + ]; + } + } + + if(count($scannedSerials) > 0) + { + foreach($scannedSerials as $serial) + { + $locatorRecord = LocatorInvoiceValidation::where('serial_number', $serial) + ->where('plant_id', $plantId) + ->first(); + + $this->records[] = [ + 'created_at' => $locatorRecord->created_at, + 'created_by' => $locatorRecord->created_by, + 'serial_number' => $locatorRecord->serial_number, + 'pallet_number' => $locatorRecord->pallet_number, + 'locator_number' => $locatorRecord->locator_number, + 'scanned_status' => $locatorRecord->scanned_status, + 'scanned_at' => $locatorRecord->scanned_at, + 'scanned_by' => $locatorRecord->scanned_by + ]; + } + } + } + + public function render() + { + return view('livewire.invoice-finder-data-table'); + } +} diff --git a/resources/views/livewire/invoice-finder-data-table.blade.php b/resources/views/livewire/invoice-finder-data-table.blade.php new file mode 100644 index 0000000..9d766ec --- /dev/null +++ b/resources/views/livewire/invoice-finder-data-table.blade.php @@ -0,0 +1,55 @@ +
| No | +Created Datetime | +Created By | +Serial Number/Quantity | +Pallet Number | +Locator Number | +Scanned Status | +Scanned Datetime | +Scanned By | +
|---|---|---|---|---|---|---|---|---|
| {{ $index + 1 }} | +{{ $record['created_at'] ?? '' }} | +{{ $record['created_by'] ?? '' }} | +{{ $record['serial_number'] ?? '' }} | +{{ $record['pallet_number'] ?? '' }} | +{{ $record['locator_number'] ?? '' }} | ++ @php + $status = $record['scanned_status'] ?? ''; + @endphp + $status === 'Scanned', + 'text-yellow-600 font-semibold' => $status === 'Incompleted', + 'text-red-600 font-semibold' => $status === 'Not Exist', + ])> + {{ $status }} + + | +{{ $record['scanned_at'] ?? '' }} | +{{ $record['scanned_by'] ?? '' }} | +
| + No records found. + | +||||||||