diff --git a/app/Filament/Resources/InvoiceOutValidationResource.php b/app/Filament/Resources/InvoiceOutValidationResource.php index 9a05d5c..1925009 100644 --- a/app/Filament/Resources/InvoiceOutValidationResource.php +++ b/app/Filament/Resources/InvoiceOutValidationResource.php @@ -56,7 +56,7 @@ class InvoiceOutValidationResource extends Resource Forms\Components\Hidden::make('updated_by') ->default(Filament::auth()->user()?->name), ]) - ->columns(4), + ->columns(4), ]); } @@ -184,22 +184,23 @@ class InvoiceOutValidationResource extends Resource $invalidScannedBy = []; $invalidUser = []; $userNotFound = []; + $seenPlantQr = []; + $duplicateQrExcel = []; + $duplicateQrDb = []; foreach ($rows as $index => $row) { - if ($index == 0) continue; // Skip header + if ($index == 0) continue; $qrCode = trim($row[1]); $plantCode = trim($row[2]); $scannedAt = trim($row[3]); $scannedby = trim($row[4]); - //$createdBy = trim($row[4]); if (empty($plantCode)) $invalidPlantCode[] = "Row {$index}"; if (empty($qrCode)) $invalidqrCode[] = "Row {$index}"; if (empty($scannedAt)) $invalidScannedAt[] = "Row {$index}"; if (empty($scannedby)) $invalidScannedBy[] = "Row {$index}"; - //if (empty($createdBy)) $invalidUser[] = "Row {$index}"; if (strlen($plantCode) < 4) { $invalidPlantCode[] = $plantCode; @@ -208,11 +209,26 @@ class InvoiceOutValidationResource extends Resource { $invalidPlaCoFound[] = $plantCode; } - // else if(!User::where('name', $createdBy)->first()) - // { - // $userNotFound[] = $createdBy; - // } + $plant = Plant::where('code', $plantCode)->first(); + + $plantId = $plant->id; + + $uniqueKey = $plantCode . '_' . $qrCode; + + if (in_array($uniqueKey, $seenPlantQr)) { + $duplicateQrExcel[] = "Duplicate in file at Row {$index}: QR Code '{$qrCode}' already exists for Plant Code {$plantCode}"; + } + + $seenPlantQr[] = $uniqueKey; + + $existsInDb = InvoiceOutValidation::where('plant_id', $plantId) + ->where('qr_code', $qrCode) + ->first(); + + if ($existsInDb) { + $duplicateQrDb[] = "QR Code '{$qrCode}' already exists in DB for Plant Code {$plantCode}"; + } } if (!empty($invalidqrCode) || !empty($invalidScannedAt) || !empty($invalidScannedBy) || !empty($invalidUser)) @@ -222,7 +238,6 @@ class InvoiceOutValidationResource extends Resource if (!empty($invalidqrCode)) $errorMsg .= 'Missing Qr code in rows: '.implode(', ', $invalidqrCode) . '
'; if (!empty($invalidScannedAt)) $errorMsg .= 'Missing Scanned At in rows: '.implode(', ', $invalidScannedAt) . '
'; if (!empty($invalidScannedBy)) $errorMsg .= 'Missing Scanned By in rows: '.implode(', ', $invalidScannedBy) . '
'; - //if (!empty($invalidUser)) $errorMsg .= 'Missing User in rows: '.implode(', ', $invalidUser) . '
'; Notification::make() ->title('Missing Mandatory Fields') @@ -272,83 +287,97 @@ class InvoiceOutValidationResource extends Resource } return; } + if (!empty($duplicateQrExcel)) + { + $duplicateGroupedByPlantQr = []; - // $successCount = 0; - // $failCount = 0; + foreach ($duplicateQrExcel as $message) { + if (preg_match("/Document Numbers '([^']+)' already exists for Plant Code (\S+)/", $message, $matches)) { + $qrCode = $matches[1]; + $plantCode = $matches[2]; + $duplicateGroupedByPlantQr[$plantCode][] = $qrCode; + } + } - // $lastErrorMessage = null; + $errorMsg = 'Duplicate Document Number found in Uploaded File:
'; - // foreach ($rows as $index => $row) { - // if ($index == 0) continue; + foreach ($duplicateGroupedByPlantQr as $plantCode => $qrCodes) { + $uniqueQrCodes = array_unique($qrCodes); + $count = count($uniqueQrCodes); + + if ($count > 10) { + $errorMsg .= "Duplicate Document Numbers for Plant {$plantCode}: {$count} Document Numbers already exist in uploaded file
"; + } else { + $errorMsg .= "Duplicate Document Numbers for Plant {$plantCode}: " + . implode(', ', $uniqueQrCodes) + . " already exist
"; + } + } + + Notification::make() + //->title('Duplicate Document Number in Uploaded File') + ->body($errorMsg) + ->danger() + ->send(); + + if ($disk->exists($path)) { + $disk->delete($path); + } + + return; + } + if (!empty($duplicateQrDb)) { + $duplicateGroupedByPlantDb = []; + + foreach ($duplicateQrDb as $message) { + if (preg_match("/Document Numbers '([^']+)' already exists in DB for Plant Code (\S+)/", $message, $matches)) { + $qrCode = $matches[1]; + $plantCode = $matches[2]; + $duplicateGroupedByPlantDb[$plantCode][] = $qrCode; + } + } + + $errorMsg = 'Duplicate Document Numbers found in Database:
'; + + foreach ($duplicateGroupedByPlantDb as $plantCode => $qrCodes) { + $uniqueQrCodes = array_unique($qrCodes); + $count = count($uniqueQrCodes); + + if ($count > 10) { + $errorMsg .= "Duplicate Document Numbers for Plant {$plantCode}: {$count} Document Numbers already exist in DB
"; + } else { + $errorMsg .= "Duplicate Document Numbers for Plant {$plantCode}: " + . implode(', ', $uniqueQrCodes) + . " already exist in DB
"; + } + } + + Notification::make() + // ->title('Duplicate Document Numbers in Database') + ->body($errorMsg) + ->danger() + ->send(); + + if ($disk->exists($path)) { + $disk->delete($path); + } + + return; + } - // $qrcode = trim($row[1]); - // $plantCode = trim($row[2]); - // $scannedAt = trim($row[3]); - // $scannedBy = trim($row[4]); - - // try - // { - // $plant = Plant::where('code', $plantCode)->first(); - - // $formattedDate = null; - // if (!empty($scannedAt)) { - // try { - // $formattedDate = Carbon::createFromFormat('d-m-Y H:i:s', $scannedAt) - // ->format('Y-m-d H:i:s'); - // } catch (\Exception $e) { - // throw new \Exception("Invalid date format: {$scannedAt}"); - // } - // } - - // $inserted = InvoiceOutValidation::create([ - // 'plant_id' => $plant->id, - // 'qr_code' => $qrcode, - // 'scanned_at' => $formattedDate, - // 'scanned_by' => $scannedBy, - // 'created_by' => $operatorName, - // ]); - - // if ($inserted) { - // $successCount++; - // } else { - // $failCount++; - // } - // } catch (\Exception $e) { - // //$failCount++; - // $lastErrorMessage = $e->getMessage(); - // } - // } - // if($successCount > 0) - // { - // Notification::make() - // ->title('Import Success') - // ->body("Successfully inserted: {$successCount} records") - // ->success() - // ->send(); - // } - // else { - // $errorText = $lastErrorMessage - // ? "Failed to insert any records. Error: {$lastErrorMessage}" - // : "Failed to insert any records. Unknown error."; - - // Notification::make() - // ->title('Import Failed') - // ->body($errorText) - // ->danger() - // ->send(); - // } $successCount = 0; $failedRecords = []; DB::beginTransaction(); - try { + try + { foreach ($rows as $index => $row) { - if ($index == 0) continue; // skip header + if ($index == 0) continue; - $rowNumber = $index + 1; // For Excel-style numbering + $rowNumber = $index + 1; try { $qrcode = trim($row[1]); @@ -408,7 +437,6 @@ class InvoiceOutValidationResource extends Resource DB::commit(); - // ✅ After loop, show result summary if (count($failedRecords) > 0) { $failedSummary = collect($failedRecords) ->map(fn($f) => "Row {$f['row']} ({$f['qrcode']}): {$f['error']}") @@ -428,9 +456,10 @@ class InvoiceOutValidationResource extends Resource ->send(); } - } catch (\Exception $e) { + } + catch (\Exception $e) + { DB::rollBack(); - Notification::make() ->title('Import Failed') ->body("No records were inserted. Error: {$e->getMessage()}")