From 0381530463d99e1cc063fb3cfead5e6e34232a81 Mon Sep 17 00:00:00 2001 From: dhanabalan Date: Mon, 15 Sep 2025 13:15:06 +0530 Subject: [PATCH] Enhanced Line export and import functionality by adding multiple work group foreign key columns and no_of_operation field with validation. --- app/Filament/Exports/LineExporter.php | 44 ++++++- app/Filament/Imports/LineImporter.php | 161 +++++++++++++++++++++++--- 2 files changed, 186 insertions(+), 19 deletions(-) diff --git a/app/Filament/Exports/LineExporter.php b/app/Filament/Exports/LineExporter.php index e1f81f7..ceca456 100644 --- a/app/Filament/Exports/LineExporter.php +++ b/app/Filament/Exports/LineExporter.php @@ -30,8 +30,48 @@ class LineExporter extends Exporter ->label('NAME'), ExportColumn::make('type') ->label('TYPE'), - ExportColumn::make('group_work_center') - ->label('GROUP WORK CENTER'), + ExportColumn::make('no_of_operation') + ->label('NO OF OPERATION'), + ExportColumn::make('workGroup1.name') + ->label('WORK GROUP CENTER 1'), + ExportColumn::make('workGroup1.operation_number') + ->label('OPERATION NUMBER 1'), + ExportColumn::make('workGroup2.name') + ->label('WORK GROUP CENTER 2'), + ExportColumn::make('workGroup2.operation_number') + ->label('OPERATION NUMBER 2'), + ExportColumn::make('workGroup3.name') + ->label('WORK GROUP CENTER 3'), + ExportColumn::make('workGroup3.operation_number') + ->label('OPERATION NUMBER 3'), + ExportColumn::make('workGroup4.name') + ->label('WORK GROUP CENTER 4'), + ExportColumn::make('workGroup4.operation_number') + ->label('OPERATION NUMBER 4'), + ExportColumn::make('workGroup5.name') + ->label('WORK GROUP CENTER 5'), + ExportColumn::make('workGroup5.operation_number') + ->label('OPERATION NUMBER 5'), + ExportColumn::make('workGroup6.name') + ->label('WORK GROUP CENTER 6'), + ExportColumn::make('workGroup6.operation_number') + ->label('OPERATION NUMBER 6'), + ExportColumn::make('workGroup7.name') + ->label('WORK GROUP CENTER 7'), + ExportColumn::make('workGroup7.operation_number') + ->label('OPERATION NUMBER 7'), + ExportColumn::make('workGroup8.name') + ->label('WORK GROUP CENTER 8'), + ExportColumn::make('workGroup8.operation_number') + ->label('OPERATION NUMBER 8'), + ExportColumn::make('workGroup9.name') + ->label('WORK GROUP CENTER 9'), + ExportColumn::make('workGroup9.operation_number') + ->label('OPERATION NUMBER 9'), + ExportColumn::make('workGroup10.name') + ->label('WORK GROUP CENTER 10'), + ExportColumn::make('workGroup10.operation_number') + ->label('OPERATION NUMBER 10'), ExportColumn::make('created_at') ->label('CREATED AT'), ExportColumn::make('updated_at') diff --git a/app/Filament/Imports/LineImporter.php b/app/Filament/Imports/LineImporter.php index 1747742..51fe5b9 100644 --- a/app/Filament/Imports/LineImporter.php +++ b/app/Filament/Imports/LineImporter.php @@ -4,6 +4,7 @@ namespace App\Filament\Imports; use App\Models\Line; use App\Models\Plant; +use App\Models\WorkGroupMaster; use Filament\Actions\Imports\Exceptions\RowImportFailedException; use Filament\Actions\Imports\ImportColumn; use Filament\Actions\Imports\Importer; @@ -29,11 +30,61 @@ class LineImporter extends Importer ->example('Domestic Assembly') ->label('Line Type') ->rules(['required']), - ImportColumn::make('group_work_center') + ImportColumn::make('no_of_operation') ->requiredMapping() - ->exampleHeader('Group Work Center') - ->example('RMGCEABC') - ->label('Group Work Center'), + ->exampleHeader('No of Operation') + ->example('10') + ->label('No of Operation'), + ImportColumn::make('work_group1_id') + ->requiredMapping() + ->exampleHeader('Work Group Center 1') + ->example('RMGCGABC') + ->label('Work Group Center 1'), + ImportColumn::make('work_group2_id') + ->requiredMapping() + ->exampleHeader('Work Group Center 2') + ->example('RMGCGABC1') + ->label('Work Group Center 2'), + ImportColumn::make('work_group3_id') + ->requiredMapping() + ->exampleHeader('Work Group Center 3') + ->example('RMGCGABC2') + ->label('Work Group Center 3'), + ImportColumn::make('work_group4_id') + ->requiredMapping() + ->exampleHeader('Work Group Center 4') + ->example('RMGCGABC1') + ->label('Work Group Center 4'), + ImportColumn::make('work_group5_id') + ->requiredMapping() + ->exampleHeader('Work Group Center 5') + ->example('RMGCGABC5') + ->label('Work Group Center 5'), + ImportColumn::make('work_group6_id') + ->requiredMapping() + ->exampleHeader('Work Group Center 6') + ->example('RMGCGABC6') + ->label('Work Group Center 6'), + ImportColumn::make('work_group7_id') + ->requiredMapping() + ->exampleHeader('Work Group Center 7') + ->example('RMGCGABC7') + ->label('Work Group Center 7'), + ImportColumn::make('work_group8_id') + ->requiredMapping() + ->exampleHeader('Work Group Center 8') + ->example('RMGCGABC8') + ->label('Work Group Center 8'), + ImportColumn::make('work_group9_id') + ->requiredMapping() + ->exampleHeader('Work Group Center 9') + ->example('RMGCGABC9') + ->label('Work Group Center 9'), + ImportColumn::make('work_group10_id') + ->requiredMapping() + ->exampleHeader('Work Group Center 10') + ->example('RMGCGABC10') + ->label('Work Group Center 10'), ImportColumn::make('plant') ->requiredMapping() ->exampleHeader('Plant Name') @@ -47,34 +98,110 @@ class LineImporter extends Importer public function resolveRecord(): ?Line { $warnMsg = []; + $plant = Plant::where('name', $this->data['plant'])->first(); if (!$plant) { - $warnMsg[] = "Plant '" . $this->data['plant'] . "' not found"; + throw new RowImportFailedException("Plant '{$this->data['plant']}' not found"); } - if (Str::length($this->data['name']) < 0) { - $warnMsg[] = "Line name not found"; + + if (Str::length($this->data['name'] ?? '') <= 0) { + throw new RowImportFailedException("Line name not found"); } - if (Str::length($this->data['type']) < 0) { - $warnMsg[] = "Line type not found"; + + if (Str::length($this->data['type'] ?? '') <= 0) { + throw new RowImportFailedException("Line type not found"); } - if (!empty($warnMsg)) { + + $noOfOps = (int) ($this->data['no_of_operation'] ?? 0); + + if ($noOfOps == null || $noOfOps == '' || !is_numeric($noOfOps)) { + throw new RowImportFailedException("'No of Operation' is required and must be a number"); + } + + if ($noOfOps > 10) + { + throw new RowImportFailedException("Invalid 'No Of Operation' value: {$noOfOps}, maximum allowed is 10"); + } + + // Validate required work groups + $missingGroups = []; + for ($i = 1; $i <= $noOfOps; $i++) { + if (empty($this->data["work_group{$i}_id"])) { + $missingGroups[] = "work_group{$i}_id"; + } + } + if (!empty($missingGroups)) { + throw new RowImportFailedException( + "Invalid data: Required work groups missing values in: " . implode(', ', $missingGroups) + ); + } + + // Ensure no extra work groups are filled + $invalidGroups = []; + for ($i = $noOfOps + 1; $i <= 10; $i++) { + if (!empty($this->data["work_group{$i}_id"])) { + $invalidGroups[] = "work_group{$i}_id"; + } + } + if (!empty($invalidGroups)) { + throw new RowImportFailedException( + "Invalid data: Only first {$noOfOps} work groups should be filled, but values found in: " . implode(', ', $invalidGroups) + ); + } + + for ($i = 1; $i <= 10; $i++) { + $workGroupName = $this->data["work_group{$i}_id"] ?? null; + if (!$workGroupName) { + continue; + } + + $workGroupRecord = WorkGroupMaster::where('name', $workGroupName) + ->where('plant_id', $plant->id) + ->first(); + + if (!$workGroupRecord) { + throw new RowImportFailedException("Work group '{$workGroupName}' not found in plant '{$this->data['plant']}'"); + } + + $existsInLines = Line::where('plant_id', $plant->id) + ->where('name', '!=', $this->data['name']) + ->where("work_group{$i}_id", $workGroupRecord->id) + ->first(); + + if ($existsInLines) { + $warnMsg[] = "Work group '{$workGroupName}' is already assigned to another line in plant '{$this->data['plant']}'"; + } + + $this->data["work_group{$i}_id"] = $workGroupRecord->id; + } + + if (!empty($warnMsg)) + { throw new RowImportFailedException(implode(', ', $warnMsg)); } - return Line::updateOrCreate([ + + Line::updateOrCreate( + [ 'name' => $this->data['name'], 'plant_id' => $plant->id ], [ 'type' => $this->data['type'], - 'group_work_center' => $this->data['group_work_center'] + 'no_of_operation' => $noOfOps, + 'work_group1_id' => $this->data['work_group1_id'] ?? null, + 'work_group2_id' => $this->data['work_group2_id'] ?? null, + 'work_group3_id' => $this->data['work_group3_id'] ?? null, + 'work_group4_id' => $this->data['work_group4_id'] ?? null, + 'work_group5_id' => $this->data['work_group5_id'] ?? null, + 'work_group6_id' => $this->data['work_group6_id'] ?? null, + 'work_group7_id' => $this->data['work_group7_id'] ?? null, + 'work_group8_id' => $this->data['work_group8_id'] ?? null, + 'work_group9_id' => $this->data['work_group9_id'] ?? null, + 'work_group10_id' => $this->data['work_group10_id'] ?? null, ] ); - // return Line::firstOrNew([ - // // Update existing records, matching them by `$this->data['column_name']` - // 'email' => $this->data['email'], - // ]); - // return new Line(); + return null; } public static function getCompletedNotificationBody(Import $import): string