Updated validation logic for Product Characteristics Master import
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 12s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 17s
Laravel Pint / pint (pull_request) Successful in 3m17s
Laravel Larastan / larastan (pull_request) Failing after 3m37s

This commit is contained in:
dhanabalan
2026-02-26 13:04:58 +05:30
parent 650bd88426
commit 1777f9df89

View File

@@ -24,75 +24,77 @@ class ProductCharacteristicsMasterImporter extends Importer
{ {
return [ return [
ImportColumn::make('plant') ImportColumn::make('plant')
->label('PLANT CODE')
->requiredMapping() ->requiredMapping()
->exampleHeader('Plant Code') ->exampleHeader('PLANT CODE')
->example('1000') ->example(['1000', '1000'])
->label('Plant Code')
->relationship(resolveUsing: 'code') ->relationship(resolveUsing: 'code')
->rules(['required']), ->rules(['required']),
ImportColumn::make('item') ImportColumn::make('item')
->label('ITEM CODE')
->requiredMapping() ->requiredMapping()
->exampleHeader('Item Code') ->exampleHeader('ITEM CODE')
->example('630214') ->example(['123456', '123456'])
->label('Item Code')
->relationship(resolveUsing: 'code') ->relationship(resolveUsing: 'code')
->rules(['required']), ->rules(['required']),
ImportColumn::make('line') ImportColumn::make('line')
->label('LINE NAME')
->requiredMapping() ->requiredMapping()
->exampleHeader('Line Name') ->exampleHeader('LINE NAME')
->example('4 inch pump line') ->example(['4 inch pump line', '4 inch pump line'])
->label('Line Name')
->relationship(resolveUsing: 'name') ->relationship(resolveUsing: 'name')
->rules(['required']), ->rules(['required']),
ImportColumn::make('work_group_master_id') ImportColumn::make('work_group_master_id')
->label('Group Work Center') ->label('GROUP WORK CENTER')
->requiredMapping() ->requiredMapping()
->exampleHeader('Group Work Center') ->exampleHeader('GROUP WORK CENTER')
->example('RMGCGABC') ->example(['RMGSTR01', 'RMGSTR01'])
->relationship(resolveUsing: 'name') ->relationship(resolveUsing: 'name')
->rules(['required']), ->rules(['required']),
ImportColumn::make('machine') ImportColumn::make('machine')
->label('WORK CENTER')
->requiredMapping() ->requiredMapping()
->exampleHeader('Work Center') ->exampleHeader('WORK CENTER')
->example('RMGCE001') ->example(['RMISTR01', 'RMISTR02'])
->label('Work Center')
->relationship(resolveUsing: 'work_center') ->relationship(resolveUsing: 'work_center')
->rules(['required']), ->rules(['required']),
ImportColumn::make('characteristics_type') ImportColumn::make('characteristics_type')
->exampleHeader('Characteristics Type') ->label('CHARACTERISTICS TYPE')
->example('Process or Product') ->requiredMapping()
->label('Characteristics Type') ->exampleHeader('CHARACTERISTICS TYPE')
->example(['Product', 'Process'])
->rules(['required']), ->rules(['required']),
ImportColumn::make('name') ImportColumn::make('name')
->exampleHeader('Characteristics Name') ->label('CHARACTERISTICS NAME')
->example('Body') ->requiredMapping()
->label('Characteristics Name') ->exampleHeader('CHARACTERISTICS NAME')
->example(['TEST01', 'TEST02'])
->rules(['required']), ->rules(['required']),
ImportColumn::make('inspection_type') ImportColumn::make('inspection_type')
->exampleHeader('Inspection Type') ->label('INSPECTION TYPE')
->example('Visual or Value') ->requiredMapping()
->label('Inspection Type') ->exampleHeader('INSPECTION TYPE')
->example(['Value', 'Visual'])
->rules(['required']), ->rules(['required']),
ImportColumn::make('lower') ImportColumn::make('lower')
->exampleHeader('Lower') ->label('LOWER')
->example('0') ->requiredMapping()
->label('Lower') ->exampleHeader('LOWER')
->rules(['numeric']), ->example(['5', '0'])
->rules(['required']),
ImportColumn::make('middle') ImportColumn::make('middle')
->exampleHeader('Middle') ->label('MIDDLE')
->example('1') ->requiredMapping()
->label('Middle') ->exampleHeader('MIDDLE')
->numeric() ->example(['10', '0'])
->rules(['numeric']), ->rules(['required']),
ImportColumn::make('upper') ImportColumn::make('upper')
->exampleHeader('Upper') ->label('UPPER')
->example('2') ->requiredMapping()
->label('Upper') ->exampleHeader('UPPER')
->rules(['numeric']), ->example(['15', '0'])
ImportColumn::make('created_by') ->rules(['required']),
->exampleHeader('Created By') // ImportColumn::make('created_by'),
->example('Admin')
->label('Created By'),
// ImportColumn::make('updated_by'), // ImportColumn::make('updated_by'),
]; ];
@@ -102,59 +104,106 @@ class ProductCharacteristicsMasterImporter extends Importer
{ {
$warnMsg = []; $warnMsg = [];
$plantCod = $this->data['plant']; $plantCod = trim($this->data['plant']) ?? null;
$updatedBy = Filament::auth()->user()->name; // ?? 'Admin' $itemCod = trim($this->data['item']) ?? null;
$lower = null; $lineNam = trim($this->data['line']) ?? null;
$middle = null; $groupWorkCenter = trim($this->data['work_group_master_id']) ?? null;
$upper = null; $workCenter = trim($this->data['machine']) ?? null;
$charTyp = trim($this->data['characteristics_type']) ?? null;
$charName = trim($this->data['name']) ?? null;
$inspectTyp = trim($this->data['inspection_type']) ?? null;
$lower = trim($this->data['lower']) ?? null;
$middle = trim($this->data['middle']) ?? null;
$upper = trim($this->data['upper']) ?? null;
$createdBy = Filament::auth()->user()->name;
$updatedBy = null;
$plantId = null; $plantId = null;
$name = trim($this->data['name']); $itemId = null;
if (Str::length($plantCod) < 4 || ! is_numeric($plantCod) || ! preg_match('/^[1-9]\d{3,}$/', $plantCod)) { $lineId = null;
$warnMsg[] = 'Invalid plant code found'; $workGroupMasterId = null;
} else { $machineId = null;
$plant = Plant::where('code', $plantCod)->first(); if ($plantCod == null || $plantCod == '') {
if (! $plant) { $warnMsg[] = "Plant code can't be empty!";
$warnMsg[] = 'Plant not found'; } elseif (Str::length($plantCod) < 4 || ! is_numeric($plantCod) || ! preg_match('/^[1-9]\d{3,}$/', $plantCod)) {
} else { $warnMsg[] = 'Invalid plant code found!';
$plantId = $plant->id; }
$itemExists = Item::where('code', $this->data['item'])->first(); if ($itemCod == null || $itemCod == '') {
if (! $itemExists) { $warnMsg[] = "Item code can't be empty!";
$warnMsg[] = 'Item not found'; } elseif (Str::length($itemCod) < 6 || ! ctype_alnum($itemCod)) {
$warnMsg[] = 'Invalid item code found!';
}
if ($lineNam == null || $lineNam == '') {
$warnMsg[] = "Line name can't be empty!";
}
if ($groupWorkCenter == null || $groupWorkCenter == '') {
$warnMsg[] = "Group work center can't be empty!";
}
if ($workCenter == null || $workCenter == '') {
$warnMsg[] = "Work center can't be empty!";
}
if ($charTyp == null || $charTyp == '') {
$warnMsg[] = "Characteristics type can't be empty!";
}
if ($charName == null || $charName == '') {
$warnMsg[] = "Characteristics name can't be empty!";
}
if ($inspectTyp == null || $inspectTyp == '') {
$warnMsg[] = "Inspection type can't be empty!";
}
if ($lower == null || $lower == '') {
$warnMsg[] = "Lower value can't be empty!";
}
if ($middle == null || $middle == '') {
$warnMsg[] = "Middle value can't be empty!";
}
if ($upper == null || $upper == '') {
$warnMsg[] = "Upper value can't be empty!";
} }
$itemAgainstPlant = Item::where('code', $this->data['item']) if (! empty($warnMsg)) {
->where('plant_id', $plantId) throw new RowImportFailedException(implode(', ', $warnMsg));
->first(); }
$plant = Plant::where('code', $plantCod)->first();
if (! $plant) {
$warnMsg[] = 'Plant code not found!';
} else {
$plantId = $plant->id;
$itemExists = Item::where('code', $itemCod)->first();
if (! $itemExists) {
$warnMsg[] = 'Item code not found!';
} else {
$itemAgainstPlant = Item::where('code', $itemCod)->where('plant_id', $plantId)->first();
if (! $itemAgainstPlant) { if (! $itemAgainstPlant) {
$warnMsg[] = 'Item code not found for the given plant'; $warnMsg[] = 'Item code not found for the given plant!';
} else { } else {
$itemId = $itemAgainstPlant->id; $itemId = $itemAgainstPlant->id;
} }
}
$lineExists = Line::where('name', $this->data['line'])->first(); $lineExists = Line::where('name', $lineNam)->first();
if (! $lineExists) { if (! $lineExists) {
$warnMsg[] = 'Line not found'; $warnMsg[] = 'Line name not found!';
} } else {
$lineAgainstPlant = Line::where('name', $lineNam)->where('plant_id', $plantId)->first();
$lineAgainstPlant = Line::where('name', $this->data['line'])
->where('plant_id', $plantId)
->first();
if (! $lineAgainstPlant) { if (! $lineAgainstPlant) {
$warnMsg[] = 'Line not found for the given plant'; $warnMsg[] = 'Line name not found for the given plant!';
} else { } else {
$LineId = $lineAgainstPlant->id; $lineId = $lineAgainstPlant->id;
}
$WorkgroupMaster = WorkGroupMaster::where('name', $this->data['work_group_master_id'])->where('plant_id', $plantId)->first(); $WorkgroupMaster = WorkGroupMaster::where('name', $groupWorkCenter)->first();
if (! $WorkgroupMaster) { if (! $WorkgroupMaster) {
$warnMsg[] = 'Work Group Master value not found'; $warnMsg[] = 'Group work center not found!';
} else {
$WorkgroupMaster = WorkGroupMaster::where('name', $groupWorkCenter)->where('plant_id', $plantId)->first();
if (! $WorkgroupMaster) {
$warnMsg[] = 'Group work center not found for the given plant!';
} else { } else {
$workGroupMasterId = $WorkgroupMaster->id; $workGroupMasterId = $WorkgroupMaster->id;
// 2. Now check if this WorkGroupMaster id exists in ANY of the 10 columns // 2. Now check if this WorkGroupMaster id exists in ANY of the 10 columns
$existsInLine = Line::where('plant_id', $plantId) $existsInLine = Line::where('plant_id', $plantId)->where('id', $lineId)
->where(function ($q) use ($workGroupMasterId) { ->where(function ($q) use ($workGroupMasterId) {
for ($i = 1; $i <= 10; $i++) { for ($i = 1; $i <= 10; $i++) {
$q->orWhere("work_group{$i}_id", $workGroupMasterId); $q->orWhere("work_group{$i}_id", $workGroupMasterId);
@@ -163,56 +212,64 @@ class ProductCharacteristicsMasterImporter extends Importer
->exists(); ->exists();
if (! $existsInLine) { if (! $existsInLine) {
$warnMsg[] = "Work Group Master '{$WorkgroupMaster->name}' is not mapped to any line in this plant"; $workGroupMasterId = null;
$warnMsg[] = "Group work center '{$WorkgroupMaster->name}' is not mapped for the given line!";
} else { } else {
$workGroupMasterId = $WorkgroupMaster->id; $workGroupMasterId = $WorkgroupMaster->id;
}
}
$machine = Machine::where('work_center', $this->data['machine'])->first(); $machine = Machine::where('work_center', $workCenter)->first();
if (! $machine) { if (! $machine) {
$warnMsg[] = 'Work Center not found'; $warnMsg[] = 'Work center not found!';
} else {
$machine = Machine::where('work_center', $workCenter)->where('plant_id', $plantId)->first();
if (! $machine) {
$warnMsg[] = 'Work center not found for the given plant!';
} else {
$machine = Machine::where('work_center', $workCenter)->where('plant_id', $plantId)->where('line_id', $lineId)->first();
if (! $machine) {
$warnMsg[] = 'Work center not found for the given line!';
} else {
$machine = Machine::where('work_center', $workCenter)->where('plant_id', $plantId)->where('line_id', $lineId)->where('work_group_master_id', $workGroupMasterId)->first();
if (! $machine) {
$warnMsg[] = 'Work center not found for the given group work center!';
} else { } else {
$machineId = $machine->id; $machineId = $machine->id;
} }
}
$machineAgainstPlant = Machine::where('work_center', $this->data['machine']) }
->where('plant_id', $plantId) }
->first(); }
}
if (! $machineAgainstPlant) { }
$warnMsg[] = 'Work Center not found for the given plant'; }
} else {
$machineId = $machineAgainstPlant->id;
} }
if ($name == null || $name == '') { $user = User::where('name', $createdBy)->first();
$warnMsg[] = "Name can't be empty";
}
$user = User::where('name', $this->data['created_by'])->first();
if (! $user) { if (! $user) {
$warnMsg[] = 'Operator ID not found'; $warnMsg[] = 'Created by user not found!';
} else {
$updatedBy = $createdBy;
} }
$updatedBy = Filament::auth()->user()->name; // ?? 'Admin' if ($inspectTyp == 'Value') {
if (! $updatedBy) {
$warnMsg[] = 'Invalid updated by user name found';
}
if (($this->data['inspection_type'] ?? null) == 'Value') {
$lower = $this->data['lower'] ?? null;
$middle = $this->data['middle'] ?? null;
$upper = $this->data['upper'] ?? null;
if (is_null($upper) || is_null($lower) || is_null($middle)) { if (is_null($upper) || is_null($lower) || is_null($middle)) {
$warnMsg[] = "For 'Value' inspection type, Upper, Lower, and Middle values are required."; $warnMsg[] = 'Upper, Lower, and Middle values are required.';
} elseif (! is_numeric($upper) || ! is_numeric($lower) || ! is_numeric($middle)) { } elseif (! is_numeric($upper) || ! is_numeric($lower) || ! is_numeric($middle)) {
$warnMsg[] = 'Upper, Lower, and Middle values must be numeric.'; $warnMsg[] = 'Upper, Lower, and Middle values must be numeric.';
} elseif (! ($lower <= $middle && $middle <= $upper)) { } elseif ($lower == $upper) {
$warnMsg[] = "For 'Value' inspection type, values must satisfy: Lower ≤ Middle ≤ Upper."; if ($lower != $middle) {
$warnMsg[] = "For 'Value' inspection type, values must satisfy: Lower = Middle = Upper.";
} }
} elseif (! ($lower < $middle && $middle < $upper)) {
$warnMsg[] = "For 'Value' inspection type, values must satisfy: Lower < Middle < Upper.";
} }
} else {
$lower = null;
$middle = null;
$upper = null;
} }
} }
@@ -220,49 +277,33 @@ class ProductCharacteristicsMasterImporter extends Importer
throw new RowImportFailedException(implode(', ', $warnMsg)); throw new RowImportFailedException(implode(', ', $warnMsg));
} }
// $record = ProductCharacteristicsMaster::firstOrNew([ if ($machineId) {
// 'plant_id' => $plantId, $record = ProductCharacteristicsMaster::where('plant_id', $plantId)->where('line_id', $lineId)->where('work_group_master_id', $workGroupMasterId)->where('machine_id', $machineId)->where('item_id', $itemId)->first();
// 'item_id' => $itemId, // ->where('characteristics_type', $get('characteristics_type'))
// 'line_id' => $LineId, if ($record) {
// 'work_group_master_id' => $workGroupMasterId, $createdBy = $record->created_by;
// 'machine_id' => $machineId, }
// ]);
// // If record is new, fill all fields
// if (! $record->exists) {
// $record->name = $name;
// $record->characteristics_type = $this->data['characteristics_type'];
// $record->inspection_type = $this->data['inspection_type'];
// $record->lower = $this->data['lower'] ?? null;
// $record->upper = $this->data['upper'] ?? null;
// $record->middle = $this->data['middle'] ?? null;
// $record->created_by = $this->data['created_by'] ?? null;
// $record->updated_by = $updatedBy ?? null;
// } else {
// // Record exists → update only updated_by and updated_at
// $record->updated_by = $updatedBy ?? null;
// $record->touch();
// }
// $record->save();
ProductCharacteristicsMaster::updateOrCreate( ProductCharacteristicsMaster::updateOrCreate(
[ [
'plant_id' => $plantId, 'plant_id' => $plantId,
'item_id' => $itemId, 'item_id' => $itemId,
'line_id' => $LineId, 'line_id' => $lineId,
'work_group_master_id' => $workGroupMasterId, 'work_group_master_id' => $workGroupMasterId,
'machine_id' => $machineId, 'machine_id' => $machineId,
// 'characteristics_type' => $charTyp,
], ],
[ [
'name' => $name, 'name' => $charName,
'characteristics_type' => $this->data['characteristics_type'], 'characteristics_type' => $charTyp,
'inspection_type' => $this->data['inspection_type'], 'inspection_type' => $inspectTyp,
'lower' => $lower, 'lower' => $lower,
'middle' => $middle, 'middle' => $middle,
'upper' => $upper, 'upper' => $upper,
// 'created_by' => user ?? $this->data['created_by'], 'created_by' => $createdBy,
'created_by' => $this->data['created_by'] ?? null, 'updated_by' => $updatedBy,
'updated_by' => $updatedBy ?? null,
]); ]);
}
return null; return null;