From 34412da102f2e402651ec2cc7373860d5077527a Mon Sep 17 00:00:00 2001 From: dhanabalan Date: Fri, 5 Dec 2025 14:34:31 +0530 Subject: [PATCH] Added product characteristics master importer and exporter --- .../ProductCharacteristicsMasterExporter.php | 70 +++++ .../ProductCharacteristicsMasterImporter.php | 282 ++++++++++++++++++ 2 files changed, 352 insertions(+) create mode 100644 app/Filament/Exports/ProductCharacteristicsMasterExporter.php create mode 100644 app/Filament/Imports/ProductCharacteristicsMasterImporter.php diff --git a/app/Filament/Exports/ProductCharacteristicsMasterExporter.php b/app/Filament/Exports/ProductCharacteristicsMasterExporter.php new file mode 100644 index 0000000..60967f0 --- /dev/null +++ b/app/Filament/Exports/ProductCharacteristicsMasterExporter.php @@ -0,0 +1,70 @@ +label('NO') + ->state(function ($record) use (&$rowNumber) { + // Increment and return the row number + return ++$rowNumber; + }), + ExportColumn::make('plant.name') + ->label('PLANT'), + ExportColumn::make('item.code') + ->label('ITEM CODE'), + ExportColumn::make('line.name') + ->label('LINE NAME'), //machine.workGroupMaster.name + ExportColumn::make('machine.workGroupMaster.name') + ->label('WORK GROUP MASTER'), + ExportColumn::make('machine.work_center') + ->label('WORK CENTER'), + ExportColumn::make('characteristics_type') + ->label('CHARACTERISTICS TYPE'), + ExportColumn::make('name') + ->label('NAME'), + ExportColumn::make('inspection_type') + ->label('INSPECTION TYPE'), + ExportColumn::make('upper') + ->label('UPPER'), + ExportColumn::make('lower') + ->label('LOWER'), + ExportColumn::make('middle') + ->label('MIDDLE'), + ExportColumn::make('created_at') + ->label('CREATED AT'), + ExportColumn::make('updated_at') + ->label('UPDATED AT'), + ExportColumn::make('created_by') + ->label('CREATED BY'), + ExportColumn::make('updated_by') + ->label('UPDATED BY'), + ExportColumn::make('deleted_at') + ->label('DELETED AT') + ->enabledByDefault(false), + ]; + } + + public static function getCompletedNotificationBody(Export $export): string + { + $body = 'Your product characteristics master export has completed and ' . number_format($export->successful_rows) . ' ' . str('row')->plural($export->successful_rows) . ' exported.'; + + if ($failedRowsCount = $export->getFailedRowsCount()) { + $body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to export.'; + } + + return $body; + } +} diff --git a/app/Filament/Imports/ProductCharacteristicsMasterImporter.php b/app/Filament/Imports/ProductCharacteristicsMasterImporter.php new file mode 100644 index 0000000..650c9b4 --- /dev/null +++ b/app/Filament/Imports/ProductCharacteristicsMasterImporter.php @@ -0,0 +1,282 @@ +requiredMapping() + ->exampleHeader('Plant Name') + ->example('Ransar Industries-I') + ->label('Plant Name') + ->relationship(resolveUsing:'name') + ->rules(['required']), + ImportColumn::make('item') + ->requiredMapping() + ->exampleHeader('Item Code') + ->example('630214') + ->label('Item Code') + ->relationship(resolveUsing:'code') + ->rules(['required']), + ImportColumn::make('line') + ->requiredMapping() + ->exampleHeader('Line') + ->example('4 inch pump line') + ->label('Line') + ->relationship(resolveUsing:'name') + ->rules(['required']), + ImportColumn::make('work_group_master_id') + ->label('Group Work Center') + ->requiredMapping() + ->exampleHeader('Group Work Center') + ->example('RMGCGABC') + ->relationship(resolveUsing:'name') + ->rules(['required']), + ImportColumn::make('machine') + ->requiredMapping() + ->exampleHeader('Work Center') + ->example('RMGCE001') + ->label('Work Center') + ->relationship(resolveUsing:'work_center') + ->rules(['required']), + ImportColumn::make('characteristics_type') + ->exampleHeader('Characteristics Type') + ->example('Process or Product') + ->label('Characteristics Type') + ->rules(['required']), + ImportColumn::make('name') + ->exampleHeader('Name') + ->example('Body') + ->label('Name') + ->rules(['required']), + ImportColumn::make('inspection_type') + ->exampleHeader('Inspection Type') + ->example('Visual or Value') + ->label('Inspection Type') + ->rules(['required']), + ImportColumn::make('lower') + ->exampleHeader('Lower') + ->example('-0.2') + ->label('Lower') + ->rules(['numeric']), + ImportColumn::make('middle') + ->exampleHeader('Middle') + ->example('1') + ->label('Middle') + ->numeric() + ->rules(['numeric']), + ImportColumn::make('upper') + ->exampleHeader('Upper') + ->example('0.2') + ->label('Upper') + ->rules(['numeric']), + ImportColumn::make('created_by') + ->exampleHeader('Created By') + ->example('Admin') + ->label('Created By'), + //ImportColumn::make('updated_by'), + + ]; + } + + public function resolveRecord(): ?ProductCharacteristicsMaster + { + + $warnMsg = []; + $plant = Plant::where('name', $this->data['plant'])->first(); + if (!$plant) { + $warnMsg[] = "Plant not found"; + } + + $itemExists = Item::where('code', $this->data['item'])->first(); + if (!$itemExists) { + $warnMsg[] = "Item not found"; + } + + $itemAgainstPlant = Item::where('code', $this->data['item']) + ->where('plant_id', $plant->id) + ->first(); + if (!$itemAgainstPlant) { + $warnMsg[] = "Item code not found for the given plant"; + } + else { + $itemId = $itemAgainstPlant->id; + } + + $lineExists = Line::where('name', $this->data['line'])->first(); + if (!$lineExists) { + $warnMsg[] = "Line not found"; + } + + $lineAgainstPlant = Line::where('name', $this->data['line']) + ->where('plant_id', $plant->id) + ->first(); + + if (!$lineAgainstPlant) { + $warnMsg[] = "Line not found for the given plant"; + } + else + { + $LineId = $lineAgainstPlant->id; + } + + $WorkgroupMaster = WorkGroupMaster::where('name', $this->data['work_group_master_id'])->where('plant_id', $plant->id)->first(); + if (!$WorkgroupMaster) { + $warnMsg[] = "Work Group Master value not found"; + } + else { + + $workGroupMasterId = $WorkgroupMaster->id; + + // 2. Now check if this WorkGroupMaster id exists in ANY of the 10 columns + $existsInLine = Line::where('plant_id', $plant->id) + ->where(function ($q) use ($workGroupMasterId) { + for ($i = 1; $i <= 10; $i++) { + $q->orWhere("work_group{$i}_id", $workGroupMasterId); + } + }) + ->exists(); + + if (!$existsInLine) { + $warnMsg[] = "Work Group Master '{$WorkgroupMaster->name}' is not mapped to any line in this plant"; + } + else { + $workGroupMasterId = $WorkgroupMaster->id; + } + } + + + $machine = Machine::where('work_center', $this->data['machine'])->first(); + if (!$machine) { + $warnMsg[] = "Work Center not found"; + } + else { + $machineId = $machine->id; + } + + $machineAgainstPlant = Machine::where('work_center', $this->data['machine']) + ->where('plant_id', $plant->id) + ->first(); + + if (!$machineAgainstPlant) { + $warnMsg[] = "Work Center not found for the given plant"; + } + else + { + $machineId = $machineAgainstPlant->id; + } + + $user = User::where('name', $this->data['created_by'])->first(); + if (!$user) { + $warnMsg[] = "Operator ID not found"; + } + + if (($this->data['inspection_type'] ?? null) == 'Value') { + $upper = $this->data['upper'] ?? null; + $lower = $this->data['lower'] ?? null; + $middle = $this->data['middle'] ?? null; + + if (is_null($upper) || is_null($lower) || is_null($middle)) { + $warnMsg[] = "For 'Value' inspection type, Upper, Lower, and Middle values are required."; + } elseif (!is_numeric($upper) || !is_numeric($lower) || !is_numeric($middle)) { + $warnMsg[] = "Upper, Lower, and Middle values must be numeric."; + } elseif (!($lower <= $middle && $middle <= $upper)) { + $warnMsg[] = "For 'Value' inspection type, values must satisfy: Lower ≤ Middle ≤ Upper."; + } + } + + if (!empty($warnMsg)) { + throw new RowImportFailedException(implode(', ', $warnMsg)); + } + else + { + $record = ProductCharacteristicsMaster::firstOrNew([ + 'plant_id' => $plant->id, + 'item_id' => $itemId, + 'line_id' => $LineId, + 'work_group_master_id' => $workGroupMasterId, + 'machine_id' => $machineId, + ]); + + $currentUser = Auth::check() ? Auth::user()->name : ($this->data['created_by'] ?? 'System'); + + // If record is new, fill all fields + if (!$record->exists) { + $record->name = $this->data['name']; + $record->characteristics_type = $this->data['characteristics_type']; + $record->inspection_type = $this->data['inspection_type']; + $record->upper = $this->data['upper'] ?? null; + $record->lower = $this->data['lower'] ?? null; + $record->middle = $this->data['middle'] ?? null; + $record->created_by = $currentUser; + } else { + // Record exists → update only updated_by and updated_at + $record->updated_by = $currentUser; + $record->touch(); + } + + $record->save(); + + return null; + } + // else + // { + // ProductCharacteristicsMaster::updateOrCreate( + // [ + // 'plant_id' => $plant->id, + // 'item_id' => $itemId, + // 'line_id' => $LineId, + // 'work_group_master_id' => $workGroupMasterId, + // 'machine_id'=> $machineId, + + // ], + // [ + // 'name' => $this->data['name'], + // 'characteristics_type' => $this->data['characteristics_type'], + // 'inspection_type' => $this->data['inspection_type'], + // 'upper' => $this->data['upper'] ?? null, + // 'lower' => $this->data['lower'] ?? null, + // 'middle' => $this->data['middle'] ?? null, + // //'created_by' => user ?? $this->data['created_by'], + // 'created_by' => Auth::check() ? Auth::user()->name :($this->data['created_by'] ?? null) + // ] + // ); + + // return null; + // } + + //return new WorkGroupMaster(); + + // return new ProductCharacteristicsMaster(); + } + + public static function getCompletedNotificationBody(Import $import): string + { + $body = 'Your product characteristics master import has completed and ' . number_format($import->successful_rows) . ' ' . str('row')->plural($import->successful_rows) . ' imported.'; + + if ($failedRowsCount = $import->getFailedRowsCount()) { + $body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to import.'; + } + + return $body; + } +}