From c7779f49b7ec53e51f9eac734d1737fc1c9417da Mon Sep 17 00:00:00 2001 From: dhanabalan Date: Tue, 8 Jul 2025 18:55:48 +0530 Subject: [PATCH] Added validation functionality on import --- .../LocatorInvoiceValidationImporter.php | 202 ++++++++++++++++-- 1 file changed, 187 insertions(+), 15 deletions(-) diff --git a/app/Filament/Imports/LocatorInvoiceValidationImporter.php b/app/Filament/Imports/LocatorInvoiceValidationImporter.php index 410a89f..7b701c9 100644 --- a/app/Filament/Imports/LocatorInvoiceValidationImporter.php +++ b/app/Filament/Imports/LocatorInvoiceValidationImporter.php @@ -3,9 +3,15 @@ namespace App\Filament\Imports; use App\Models\LocatorInvoiceValidation; +use App\Models\Plant; +use App\Models\User; +use Carbon\Carbon; +use Filament\Actions\Imports\Exceptions\RowImportFailedException; use Filament\Actions\Imports\ImportColumn; use Filament\Actions\Imports\Importer; use Filament\Actions\Imports\Models\Import; +use Filament\Facades\Filament; +use Str; class LocatorInvoiceValidationImporter extends Importer { @@ -16,10 +22,10 @@ class LocatorInvoiceValidationImporter extends Importer return [ ImportColumn::make('plant') ->requiredMapping() - ->exampleHeader('Plant Name') - ->example('Ransar Industries-I') - ->label('Plant Name') - ->relationship(resolveUsing: 'name') + ->exampleHeader('Plant Code') + ->example('1000') + ->label('Plant Code') + ->relationship(resolveUsing: 'code') ->rules(['required']), ImportColumn::make('invoice_number') ->requiredMapping() @@ -34,56 +40,222 @@ class LocatorInvoiceValidationImporter extends Importer ->label('Serial Number') ->rules(['required']), ImportColumn::make('pallet_number') + ->requiredMapping() ->exampleHeader('Pallet Number') ->example('EP-2506001') ->label('Pallet Number'), ImportColumn::make('locator_number') + ->requiredMapping() ->exampleHeader('Locator Number') ->example('W05-D1B') ->label('Locator Number'), ImportColumn::make('scanned_status') + ->requiredMapping() ->exampleHeader('Scanned Status') ->example('') ->label('Scanned Status'), ImportColumn::make('upload_status') + ->requiredMapping() ->exampleHeader('Upload Status') ->example('Y') ->label('Upload Status'), ImportColumn::make('created_at') + ->requiredMapping() ->exampleHeader('Created At') ->example('2025-06-17 01:42:16') ->label('Created At') - ->rules(['date_format:Y-m-d H:i:s']), + ->rules(['required']), ImportColumn::make('scanned_at') + ->requiredMapping() ->exampleHeader('Scanned At') ->example('2025-06-17 08:42:16') - ->label('Scanned At') - ->rules(['date_format:Y-m-d H:i:s']), + ->label('Scanned At'), + ImportColumn::make('updated_at') + ->requiredMapping() + ->exampleHeader('Updated At') + ->example('2025-06-17 08:42:16') + ->label('Updated At'), ImportColumn::make('created_by') ->requiredMapping() ->exampleHeader('Created by') - ->example('RAW002365') + ->example('RAW012345') ->label('Created by') ->rules(['required']), ImportColumn::make('scanned_by') + ->requiredMapping() ->exampleHeader('Scanned by') - ->example('') + ->example('RAW012345') ->label('Scanned by'), ImportColumn::make('updated_by') + ->requiredMapping() ->exampleHeader('Updated by') - ->example('') + ->example('RAW012345') ->label('Updated by'), ]; } public function resolveRecord(): ?LocatorInvoiceValidation { - // return LocatorInvoiceValidation::firstOrNew([ - // // Update existing records, matching them by `$this->data['column_name']` - // 'email' => $this->data['email'], - // ]); + $warnMsg = []; + $plantCod = $this->data['plant']; + $plant = null; + $invoiceNo = $this->data['invoice_number']; + $serialNo = $this->data['serial_number']; + $palletNo = $this->data['pallet_number']; + $locatorNo = $this->data['locator_number']; + $scannedStat = $this->data['scanned_status']; + $uploadStat = $this->data['upload_status']; + $createdAt = $this->data['created_at']; + $scannedAt = $this->data['scanned_at']; + $updatedAt = $this->data['updated_at']; + $cDateTime = null; + $sDateTime = null; + $uDateTime = null; + $createdBy = $this->data['created_by']; + $scannedBy = $this->data['scanned_by']; + $updatedBy = $this->data['updated_by']; - return new LocatorInvoiceValidation(); + if (Str::length($plantCod) < 4 || !is_numeric($plantCod) || !preg_match('/^[1-9]\d{3,}$/', $plantCod)) { + $warnMsg[] = "Invalid plant code found"; + } + else + { + $plant = Plant::where('code', $this->data['plant'])->first(); + if (!$plant) { + $warnMsg[] = "Plant not found"; + } + else + { + if (Str::length($invoiceNo) < 5 || !ctype_alnum($invoiceNo)) { + $warnMsg[] = "Invalid invoice number found"; + } + if (Str::length($serialNo) < 9 || !ctype_alnum($serialNo)) { + $warnMsg[] = "Invalid serial number found"; + } + if (Str::length($palletNo) > 0 && Str::length($palletNo) < 10) { + $warnMsg[] = "Invalid pallet number found"; + } + if (Str::length($locatorNo) > 0 && Str::length($locatorNo) < 7) { + $warnMsg[] = "Invalid locator number found"; + } + if (Str::length($scannedStat) > 0 && $scannedStat != 'Scanned') { + $warnMsg[] = "Invalid scanned status found"; + } + if ($uploadStat != 'Y' && $uploadStat != 'N') { + $warnMsg[] = "Invalid upload status found"; + } + $created = User::where('name', $createdBy)->first(); + if (!$created) { + $warnMsg[] = "Created by not found"; + } + if (Str::length($scannedBy) > 0) { + $scanned = User::where('name', $scannedBy)->first(); + if (!$scanned) { + $warnMsg[] = "Scanned by not found"; + } + } + if (Str::length($updatedBy) > 0) { + $updated = User::where('name', $updatedBy)->first(); + if (!$updated) { + $warnMsg[] = "Updated by not found"; + } + } + + $formats = ['d-m-Y H:i', 'd-m-Y H:i:s']; //'07-05-2025 08:00' or '07-05-2025 08:00:00' + + foreach ($formats as $format) { + try { + $cDateTime = Carbon::createFromFormat($format, $createdAt); + break; + } catch (\Exception $e) { + // Optionally collect warning messages + // $warnMsg[] = "Date format mismatch with format: $format"; + } + } + + if (!isset($cDateTime)) { + // throw new \Exception('Invalid date time format'); + $warnMsg[] = "Invalid 'Created DateTime' format. Expected DD-MM-YYYY HH:MM:SS"; + } + + if (Str::length($scannedAt) > 0) + { + foreach ($formats as $format) { + try { + $sDateTime = Carbon::createFromFormat($format, $scannedAt); + break; + } catch (\Exception $e) { + // Optionally collect warning messages + // $warnMsg[] = "Date format mismatch with format: $format"; + } + } + + if (!isset($sDateTime)) { + $warnMsg[] = "Invalid 'Scanned DateTime' format. Expected DD-MM-YYYY HH:MM:SS"; + } + } + + if (Str::length($updatedAt) > 0) + { + foreach ($formats as $format) { + try { + $uDateTime = Carbon::createFromFormat($format, $updatedAt); + break; + } catch (\Exception $e) { + // Optionally collect warning messages + // $warnMsg[] = "Date format mismatch with format: $format"; + } + } + + if (!isset($uDateTime)) { + $warnMsg[] = "Invalid 'Updated DateTime' format. Expected DD-MM-YYYY HH:MM:SS"; + } + else + { + if (isset($cDateTime) && isset($uDateTime)) { + if ($cDateTime->greaterThan($uDateTime)) { + $warnMsg[] = "'Created DataTime' is greater than 'Updated DateTime'."; + } + } + } + } + } + } + + // if (!is_numeric($locatorQuantity) || $locatorQuantity < 0 || $locatorQuantity > 2) { + // $warnMsg[] = "Invalid locator quantity found"; + // } + + if (!empty($warnMsg)) { + throw new RowImportFailedException(implode(', ', $warnMsg)); + } + + LocatorInvoiceValidation::updateOrCreate( + [ + 'plant_id' => $plant->id, + 'serial_number' => $serialNo + ], + [ + 'invoice_number' => $invoiceNo, + 'pallet_number' => $palletNo, + 'locator_number' => $locatorNo, + 'scanned_status' => $scannedStat, + 'upload_status' => $uploadStat, + 'created_at' => $cDateTime->format('Y-m-d H:i:s'), + 'scanned_at' => (Str::length($scannedAt) > 0) ? $sDateTime->format('Y-m-d H:i:s') : null, + 'updated_at' => (Str::length($updatedAt) > 0) ? $uDateTime->format('Y-m-d H:i:s') : null, + 'created_by' => $createdBy, + 'scanned_by' => $scannedBy, + 'updated_by' => $updatedBy + ] + ); + return null; + // // return LocatorInvoiceValidation::firstOrNew([ + // // // Update existing records, matching them by `$this->data['column_name']` + // // 'email' => $this->data['email'], + // // ]); + + // return new LocatorInvoiceValidation(); } public static function getCompletedNotificationBody(Import $import): string