diff --git a/app/Filament/Resources/ProductionPlanResource.php b/app/Filament/Resources/ProductionPlanResource.php index 4946f935..f6c409c6 100644 --- a/app/Filament/Resources/ProductionPlanResource.php +++ b/app/Filament/Resources/ProductionPlanResource.php @@ -826,6 +826,49 @@ class ProductionPlanResource extends Resource ->label('Import Production Plans') ->color('warning') ->importer(ProductionPlanImporter::class) + ->fileRules([ + fn (): \Closure => function ($attribute, $value, $fail) { + + $csv = \League\Csv\Reader::createFromPath( + $value->getRealPath(), + 'r' + ); + + $csv->setHeaderOffset(0); + + $itemCodes = []; + + foreach ($csv->getRecords() as $record) { + + $values = array_values($record); + + $plantCode = trim((string) ($values[0] ?? '')); + $itemCode = trim((string) ($values[1] ?? '')); + + if ($plantCode === '' || $itemCode === '') { + continue; + } + + $key = $plantCode . '|' . $itemCode; + + $itemCodes[] = $key; + } + + $duplicates = collect($itemCodes) + ->duplicates() + ->unique() + ->values() + ->map(fn ($duplicate) => explode('|', $duplicate)[1]) + ->unique() + ->values(); + + if ($duplicates->isNotEmpty()) { + $fail( + 'Duplicate Item Codes found: ' . $duplicates->implode(', ') + ); + } + }, + ]) ->visible(function () { return Filament::auth()->user()->can('view import production plan'); }),