From f10b4daddf092331e4aaa62571ea91888d9aa313 Mon Sep 17 00:00:00 2001 From: dhanabalan Date: Mon, 11 May 2026 10:24:57 +0530 Subject: [PATCH 1/7] Updated warning messages, queries and added tempClassCharacteristics logics and hasWorkFlowID update logic --- .../Controllers/CharacteristicsController.php | 2619 ++++++++++------- 1 file changed, 1548 insertions(+), 1071 deletions(-) diff --git a/app/Http/Controllers/CharacteristicsController.php b/app/Http/Controllers/CharacteristicsController.php index 49fee13..6fc3e73 100644 --- a/app/Http/Controllers/CharacteristicsController.php +++ b/app/Http/Controllers/CharacteristicsController.php @@ -12,6 +12,7 @@ use App\Models\Plant; use App\Models\ProductCharacteristicsMaster; use App\Models\RequestCharacteristic; use App\Models\StickerMaster; +use App\Models\TempClassCharacteristic; use App\Models\User; use App\Models\WorkGroupMaster; use Illuminate\Http\Request; @@ -49,15 +50,45 @@ class CharacteristicsController extends Controller $itemCode = $request->header('item-code'); - if (! $plantCode) { + if ($plantCode == null || $plantCode == '' || ! $plantCode) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Plant Code value can't be empty", + 'status_description' => "Plant code can't be empty!", + ], 400); + } elseif (! is_numeric($plantCode)) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Plant code '{$plantCode}' should contain only numeric values!", + ], 400); + } elseif (Str::length($plantCode) < 4 || Str::length($plantCode) > 7) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Plant code '{$plantCode}' must be between 4 and 7 digits only!", + ], 400); + } elseif (! preg_match('/^[1-9]\d{3,6}$/', $plantCode)) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Invalid plant code '{$plantCode}' found!", + ], 400); + } elseif ($itemCode == null || $itemCode == '' || ! $itemCode) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Item code can't be empty!", ], 404); - } elseif (! $itemCode) { + } elseif (Str::length($itemCode) < 6) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Item Code value can't be empty", + 'status_description' => "Item code '{$itemCode}' should contain minimum 6 digits!", + ], 404); + } elseif (! ctype_alnum($itemCode)) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Item code '{$itemCode}' should contain only alpha-numeric values!", + ], 404); + } elseif (! preg_match('/^[a-zA-Z1-9][a-zA-Z0-9]{5,}$/', $itemCode)) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Item code '{$itemCode}' should not begin with '0'!", ], 404); } @@ -66,7 +97,7 @@ class CharacteristicsController extends Controller if (! $plant) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Plant Code '{$plantCode}' not found!", + 'status_description' => "Plant code '{$plantCode}' not found in plants table!", ], 404); } @@ -77,7 +108,7 @@ class CharacteristicsController extends Controller if (! $item) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Item Code '{$itemCode}' not found!", + 'status_description' => "Item code '{$itemCode}' not found in items table!", ], 404); } @@ -86,14 +117,14 @@ class CharacteristicsController extends Controller if (! $item) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Item Code '{$itemCode}' not found for the plant code '{$plantCode}'!", + 'status_description' => "Item code '{$itemCode}' not found for the plant code '{$plantCode}' in items table!", ], 404); } - $ItemId = $item->id; + $itemId = $item->id; // $characteristics = ProductCharacteristicsMaster::where('plant_id', $plantId) - // ->where('item_id', $ItemId) + // ->where('item_id', $itemId) // ->first([ // 'line_id', // 'machine_id', @@ -105,8 +136,7 @@ class CharacteristicsController extends Controller // 'middle' // ]); - $characteristics = ProductCharacteristicsMaster::where('plant_id', $plantId) - ->where('item_id', $ItemId) + $characteristics = ProductCharacteristicsMaster::where('item_id', $itemId)->where('plant_id', $plantId) ->get([ 'line_id', 'machine_id', @@ -121,7 +151,7 @@ class CharacteristicsController extends Controller if ($characteristics->count() == 0) { return response()->json([ 'status_code' => 'ERROR', - 'message' => "No data found for the plant code: {$plantCode} and item code: {$itemCode}", + 'message' => "No data found for the plant code '{$plantCode}' and item code '{$itemCode}'!", ], 404); } @@ -174,19 +204,13 @@ class CharacteristicsController extends Controller $line = Line::find($char->line_id); $lineName = $line ? $line->name : null; - $workCenter = Machine::where('id', $char->machine_id) - ->where('plant_id', $plantId) - ->where('line_id', $char->line_id) - ->value('work_center'); + $workCenter = Machine::where('id', $char->machine_id)->where('line_id', $char->line_id)->where('plant_id', $plantId)->value('work_center'); - $workGroupMasterId = ProductCharacteristicsMaster::where('line_id', $char->line_id) - ->where('plant_id', $plantId) - ->value('work_group_master_id'); + $workGroupMasterId = ProductCharacteristicsMaster::where('line_id', $char->line_id)->where('plant_id', $plantId)->value('work_group_master_id'); $groupWorkCenter = null; if ($workGroupMasterId) { - $groupWorkCenter = WorkGroupMaster::where('id', $workGroupMasterId) - ->value('name'); + $groupWorkCenter = WorkGroupMaster::where('id', $workGroupMasterId)->value('name'); } $items[] = [ @@ -233,7 +257,7 @@ class CharacteristicsController extends Controller $userName = $request->header('user-name'); - if (! $userName) { + if (! $userName || $userName == null || $userName == '') { return response()->json([ 'status_code' => 'ERROR', 'status_description' => "User name can't be empty!", @@ -257,12 +281,22 @@ class CharacteristicsController extends Controller return response()->json([ 'status_code' => 'ERROR', 'status_description' => "Plant code can't be empty!", - ], 404); - } elseif (! is_numeric($plantCode) || Str::length($plantCode) < 4 || ! preg_match('/^[1-9]\d{3,}$/', $plantCode)) { // !ctype_digit($data['plant_code']) + ], 400); + } elseif (! is_numeric($plantCode)) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'Invalid plant code found!', - ], 404); + 'status_description' => "Plant code '{$plantCode}' should contain only numeric values!", + ], 400); + } elseif (Str::length($plantCode) < 4 || Str::length($plantCode) > 7) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Plant code '{$plantCode}' must be between 4 and 7 digits only!", + ], 400); + } elseif (! preg_match('/^[1-9]\d{3,6}$/', $plantCode)) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Invalid plant code '{$plantCode}' found!", + ], 400); } if ($workCenter == null || $workCenter == '' || ! $workCenter) { @@ -270,6 +304,16 @@ class CharacteristicsController extends Controller 'status_code' => 'ERROR', 'status_description' => "Work center can't be empty!", ], 404); + } elseif (Str::length($workCenter) < 6) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Work center '{$workCenter}' should contain minimum 6 characters!", + ], 404); + } elseif (! ctype_alnum($workCenter)) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Work center '{$workCenter}' should contain only alpha-numeric values!", + ], 404); } if ($modelType == null || $modelType == '' || ! $modelType) { @@ -277,16 +321,14 @@ class CharacteristicsController extends Controller 'status_code' => 'ERROR', 'status_description' => "Marked model type can't be empty!", ], 404); - } - - if ($modelType != 'MOTOR' && $modelType != 'PUMP' && $modelType != 'PUMPSET' && $modelType != 'NAME_PLATE') { + } elseif ($modelType != 'MOTOR' && $modelType != 'PUMP' && $modelType != 'NAME_PLATE') { return response()->json([ 'status_code' => 'ERROR', 'status_description' => "Serial number '{$serialNumber}' doesn't have valid marked model type to proceed!", ], 404); } - if ($expectedTime == null || $expectedTime == '' || ! $expectedTime) { + if ($expectedTime == null || $expectedTime == '' || $expectedTime == '0' || ! $expectedTime) { return response()->json([ 'status_code' => 'ERROR', 'status_description' => "Expected time can't be empty or zero!", @@ -300,58 +342,6 @@ class CharacteristicsController extends Controller $expectedTime = (float) $expectedTime; } - $plant = Plant::where('code', $plantCode)->first(); - - if (! $plant) { - return response()->json([ - 'status_code' => 'ERROR', - 'status_description' => "Plant code '{$plantCode}' not found!", - ], 404); - } - - $plantId = $plant->id; - - $user = User::where('name', $userName)->first(); - - $userPlant = User::where('name', $userName)->where('plant_id', $plantId)->first(); - - if (! $user) { - return response()->json([ - 'status_code' => 'ERROR', - 'status_description' => "User name '{$userName}' not found!", - ], 403); - } elseif (! $userPlant && ! $user->hasRole('Super Admin')) { - return response()->json([ - 'status_code' => 'ERROR', - 'status_description' => "User name '{$userName}' not found for the plant code '{$plantCode}'!", - ], 403); - } elseif (! $user->hasRole(['Super Admin', 'Laser Manager', 'Laser Supervisor', 'Laser Employee'])) { - return response()->json([ - 'status_code' => 'ERROR', - 'status_description' => 'User does not have rights!', - ], 403); - } - - $work = Machine::where('work_center', $workCenter)->first(); - - if (! $work) { - return response()->json([ - 'status_code' => 'ERROR', - 'status_description' => "Work center '{$workCenter}' not found!", - ], 404); - } - - $machine = Machine::where('work_center', $workCenter)->where('plant_id', $plantId)->first(); - - if (! $machine) { - return response()->json([ - 'status_code' => 'ERROR', - 'status_description' => "Work center '{$workCenter}' not found for the plant code '{$plantCode}'!", - ], 404); - } - - $machineId = $machine->id; - if ($jobNo != null && $jobNo != '' && $jobNo) { if (Str::length($jobNo) < 7) { return response()->json([ @@ -369,38 +359,6 @@ class CharacteristicsController extends Controller 'status_description' => "Job number '{$jobNo}' should not begin with '0'!", ], 404); } - - $job = ClassCharacteristic::where('aufnr', $jobNo)->first(); - - if (! $job) { - return response()->json([ - 'status_code' => 'ERROR', - 'status_description' => "Job number '{$jobNo}' not found!", - ], 404); - } - - $jobPlant = ClassCharacteristic::where('aufnr', $jobNo) - ->where('plant_id', $plantId) - ->first(); - - if (! $jobPlant) { - return response()->json([ - 'status_code' => 'ERROR', - 'status_description' => "Job number '{$jobNo}' not found for the plant code '{$plantCode}'!", - ], 404); - } - - $jobWorkCenter = ClassCharacteristic::where('aufnr', $jobNo) - ->where('machine_id', $machineId) - ->where('plant_id', $plantId) - ->first(); - - if (! $jobWorkCenter) { - return response()->json([ - 'status_code' => 'ERROR', - 'status_description' => "Job number '{$jobNo}' not found for the work center '{$workCenter}'!", - ], 404); - } } if ($serialNumber == null || $serialNumber == '' || ! $serialNumber) { @@ -421,7 +379,7 @@ class CharacteristicsController extends Controller } elseif (! preg_match('/^[1-9][a-zA-Z0-9]{8,}$/', $serialNumber)) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Serial number '{$serialNumber}' should not begin with '0'!", + 'status_description' => "Serial number '{$serialNumber}' should not begin with '0' or letter!", ], 404); } @@ -447,23 +405,102 @@ class CharacteristicsController extends Controller ], 404); } + $plant = Plant::where('code', $plantCode)->first(); + + if (! $plant) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Plant code '{$plantCode}' not found in plant table!", + ], 404); + } + + $plantId = $plant->id; + + $user = User::where('name', $userName)->first(); + + $userPlant = User::where('name', $userName)->where('plant_id', $plantId)->first(); + + if (! $user) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "User name '{$userName}' not found in users table!", + ], 403); + } elseif (! $userPlant && ! $user->hasRole('Super Admin')) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "User name '{$userName}' not found for the plant code '{$plantCode}' in users table!", + ], 403); + } elseif (! $user->hasRole(['Super Admin', 'Laser Manager', 'Laser Supervisor', 'Laser Employee'])) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "User '{$userName}' does not have rights!", + ], 403); + } + + $work = Machine::where('work_center', $workCenter)->first(); + + if (! $work) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Work center '{$workCenter}' not found in machines table!", + ], 404); + } + + $machine = Machine::where('work_center', $workCenter)->where('plant_id', $plantId)->first(); + + if (! $machine) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Work center '{$workCenter}' not found for the plant code '{$plantCode}' in machines table!", + ], 404); + } + + $machineId = $machine->id; + + if ($jobNo != null && $jobNo != '' && $jobNo) { + $job = ClassCharacteristic::where('aufnr', $jobNo)->first(); + + if (! $job) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Job number '{$jobNo}' not found!", + ], 404); + } + + $jobPlant = ClassCharacteristic::where('aufnr', $jobNo)->where('plant_id', $plantId)->first(); + + if (! $jobPlant) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Job number '{$jobNo}' not found for the plant code '{$plantCode}'!", + ], 404); + } + + $jobWorkCenter = ClassCharacteristic::where('aufnr', $jobNo)->where('machine_id', $machineId)->where('plant_id', $plantId)->latest()->first(); + + if (! $jobWorkCenter) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Job number '{$jobNo}' not found for the work center '{$workCenter}'!", + ], 404); + } + } + $item = Item::where('code', $itemCode)->first(); if (! $item) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Item code '{$itemCode}' not found!", + 'status_description' => "Item code '{$itemCode}' not found in items table!", ], 404); } - $itemPlant = Item::where('code', $itemCode) - ->where('plant_id', $plantId) - ->first(); + $itemPlant = Item::where('code', $itemCode)->where('plant_id', $plantId)->first(); if (! $itemPlant) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Item code '{$itemCode}' not found for the plant code '{$plantCode}'!", + 'status_description' => "Item code '{$itemCode}' not found for the plant code '{$plantCode}' in items table!", ], 404); } @@ -471,16 +508,40 @@ class CharacteristicsController extends Controller $sNo = ClassCharacteristic::where('gernr', $serialNumber)->first(); + $typesToCreate = []; + if (! $sNo) { return response()->json([ 'status_code' => 'ERROR', 'status_description' => "Serial number '{$serialNumber}' not found!", ], 404); + } else { + $modelHeading = $sNo->zmm_heading ?? ''; + + if (Str::contains($modelHeading, 'PRESSURE BOOSTER SYSTEM', ignoreCase: true)) { + $typesToCreate = ['MOTOR', 'PUMP', 'NAME_PLATE']; + } elseif (Str::contains($modelHeading, 'PUMPSET', ignoreCase: true)) { + $typesToCreate = ['MOTOR', 'PUMP']; + } elseif (Str::contains($modelHeading, 'PUMP', ignoreCase: true) && ! Str::contains($modelHeading, 'PUMP SET', ignoreCase: true) && ! Str::contains($modelHeading, 'PUMPSET', ignoreCase: true)) { + $typesToCreate = ['PUMP']; + } elseif (Str::contains($modelHeading, 'MOTOR', ignoreCase: true)) { + $typesToCreate = ['MOTOR']; + } else { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Unknown ZMM_HEADING : '{$modelHeading}' found!", + ], 404); + } + + if (! in_array($modelType, $typesToCreate, true)) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Model type '{$modelType}' does not match with the model heading '{$modelHeading}'!", + ], 404); + } } - $sNoPlant = ClassCharacteristic::where('gernr', $serialNumber) - ->where('plant_id', $plantId) - ->first(); + $sNoPlant = ClassCharacteristic::where('gernr', $serialNumber)->where('plant_id', $plantId)->first(); if (! $sNoPlant) { return response()->json([ @@ -489,10 +550,7 @@ class CharacteristicsController extends Controller ], 404); } - $sNoItem = ClassCharacteristic::where('gernr', $serialNumber) - ->where('plant_id', $plantId) - ->where('item_id', $itemId) - ->first(); + $sNoItem = ClassCharacteristic::where('gernr', $serialNumber)->where('item_id', $itemId)->where('plant_id', $plantId)->first(); if (! $sNoItem) { return response()->json([ @@ -501,7 +559,7 @@ class CharacteristicsController extends Controller ], 404); } - $curStat = ClassCharacteristic::where('plant_id', $plantId)->where('machine_id', $machineId)->where('gernr', $serialNumber)->where('item_id', $itemId)->first(); + $curStat = ClassCharacteristic::where('gernr', $serialNumber)->where('item_id', $itemId)->where('machine_id', $machineId)->where('plant_id', $plantId)->first(); if (! $curStat) { return response()->json([ @@ -520,7 +578,16 @@ class CharacteristicsController extends Controller $curHead = null; $hasMvhs = false; if ($jobNo != null && $jobNo != '' && $jobNo) { - $curStat = ClassCharacteristic::where('plant_id', $plantId)->where('machine_id', $machineId)->where('aufnr', $jobNo)->where('gernr', $serialNumber)->where('item_id', $itemId)->first(); + $jobItemCode = ClassCharacteristic::where('aufnr', $jobNo)->where('item_id', $itemId)->where('machine_id', $machineId)->where('plant_id', $plantId)->first(); + + if (! $jobItemCode) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Job number '{$jobNo}' not found with the item code '{$itemCode}'!", + ], 404); + } + + $curStat = ClassCharacteristic::where('gernr', $serialNumber)->where('item_id', $itemId)->where('aufnr', $jobNo)->where('machine_id', $machineId)->where('plant_id', $plantId)->first(); if (! $curStat) { return response()->json([ @@ -547,33 +614,31 @@ class CharacteristicsController extends Controller if (! $stick) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Item code '{$itemCode}' not found in sticker master!", + 'status_description' => "Item code '{$itemCode}' not found in sticker masters table!", ], 404); } - $stickPlant = StickerMaster::where('item_id', $itemId) - ->where('plant_id', $plantId) - ->first(); + $stickPlant = StickerMaster::where('item_id', $itemId)->where('plant_id', $plantId)->first(); if (! $stickPlant) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Item code '{$itemCode}' not found in sticker master for the plant code '{$plantCode}'!", + 'status_description' => "Item code '{$itemCode}' not found for the plant code '{$plantCode}' in sticker masters table!", ], 404); } else { $curMvhs = trim($stickPlant?->laser_part_validation2); if ($curMvhs == null || $curMvhs == '' || ! is_numeric($curMvhs) || Str::length($curMvhs) <= 0) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'Invalid MVHS master count found in sticker master!', + 'status_description' => 'Invalid MVHS master count found in sticker masters table!', ], 404); } elseif (! preg_match('/^[1-9]$/', $curMvhs)) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'The MVHS master count should be between 1 to 9.', // "MVHS master count '{$curMvhs}' should contain only numeric values between 1 to 9!" + 'status_description' => 'The MVHS master count should be between 1 to 9!', // "MVHS master count '{$curMvhs}' should contain only numeric values between 1 to 9!" ], 404); - } elseif ($modelType == 'PUMPSET') { - $mvhsCnt = 1; + // } elseif ($modelType == 'PUMPSET') { + // $mvhsCnt = 1; } else { $mvhsCnt = $curMvhs; } @@ -590,11 +655,11 @@ class CharacteristicsController extends Controller 'status_code' => 'ERROR', 'status_description' => "Serial number '{$serialNumber}' doesn't have motor model to proceed!", ], 404); - } elseif ($modelType == 'PUMPSET') { - return response()->json([ - 'status_code' => 'ERROR', - 'status_description' => "Serial number '{$serialNumber}' doesn't have pumpset model to proceed!", - ], 404); + // } elseif ($modelType == 'PUMPSET') { + // return response()->json([ + // 'status_code' => 'ERROR', + // 'status_description' => "Serial number '{$serialNumber}' doesn't have pumpset model to proceed!", + // ], 404); } } elseif (Str::contains($curHead, 'MOTOR', ignoreCase: true)) { if ($modelType == 'PUMP') { @@ -602,11 +667,11 @@ class CharacteristicsController extends Controller 'status_code' => 'ERROR', 'status_description' => "Serial number '{$serialNumber}' doesn't have pump model to proceed!", ], 404); - } elseif ($modelType == 'PUMPSET') { - return response()->json([ - 'status_code' => 'ERROR', - 'status_description' => "Serial number '{$serialNumber}' doesn't have pumpset model to proceed!", - ], 404); + // } elseif ($modelType == 'PUMPSET') { + // return response()->json([ + // 'status_code' => 'ERROR', + // 'status_description' => "Serial number '{$serialNumber}' doesn't have pumpset model to proceed!", + // ], 404); } } elseif (! Str::contains($curHead, 'PUMPSET', ignoreCase: true)) { return response()->json([ @@ -653,14 +718,14 @@ class CharacteristicsController extends Controller return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Following users : '".implode(', ', $uniqueMissingUsers)."' not found!", + 'status_description' => "Following user names : '".implode(', ', $uniqueMissingUsers)."' not found in users table!", ], 404); } elseif (! empty($missingUsersPlant)) { $uniqueMissingUsersPlant = array_unique($missingUsersPlant); return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Following users : '".implode(', ', $uniqueMissingUsersPlant)."' not found for the plant code '{$plantCode}'!", + 'status_description' => "Following user names : '".implode(', ', $uniqueMissingUsersPlant)."' not found for the plant code '{$plantCode}' in users table!", ], 404); } elseif (! empty($missingUsersRight)) { $uniqueMissingUsersRight = array_unique($missingUsersRight); @@ -688,7 +753,6 @@ class CharacteristicsController extends Controller $curMMach = $curStat->motor_machine_name ?? null; $curPMach = $curStat->pump_machine_name ?? null; $curNpMach = $curStat->name_plate_machine_name ?? null; - $curPsMach = $curStat->pumpset_machine_name ?? null; $curPart1 = $curStat->part_validation_1 ?? null; $curPart2 = $curStat->part_validation_2 ?? null; $slUser = $curStat->samlight_logged_name ?? null; @@ -710,14 +774,14 @@ class CharacteristicsController extends Controller 'status_code' => 'ERROR', 'status_description' => "Name plate serial number '{$serialNumber}' already marked in auto mode!", ], 404); - } elseif ($modelType == 'PUMPSET' && $curMarkStat == 'Marked') { - return response()->json([ - 'status_code' => 'ERROR', - 'status_description' => "Pumpset serial number '{$serialNumber}' already marked in auto mode!", - ], 404); + // } elseif ($modelType == 'PUMPSET' && $curMarkStat == 'Marked') { + // return response()->json([ + // 'status_code' => 'ERROR', + // 'status_description' => "Pumpset serial number '{$serialNumber}' already marked in auto mode!", + // ], 404); } - $physiCnt = (intval($curStat->marked_physical_count ?? 0.0) ?: 0.0) + 1; + $physiCnt = (intval($curStat->marked_physical_count ?? 0) ?: 0) + 1; // $physiCnt = (($curStat->marked_physical_count == null || $curStat->marked_physical_count == '' || $curStat->marked_physical_count == '0') ? 0 : (int) $curStat->marked_physical_count) + 1; // marked_expected_time $motPhysiCnt = intval($curStat->motor_marked_physical_count ?? 0) ?: 0; @@ -747,11 +811,11 @@ class CharacteristicsController extends Controller $napExpecTim = $napExpecTim + $expectedTime; $curNamePlateMarkStat = 'Marked'; $curNamePlateMarkBy = ($char['name_plate_marked_by'] == 'jothi') ? 'Admin' : $char['name_plate_marked_by'] ?? $curNamePlateMarkBy; + // } elseif ($modelType == 'PUMPSET' && $physiCnt >= $mvhsCnt) { + // $curMarkStat = 'Marked'; } - if ($modelType == 'PUMPSET' && $physiCnt >= $mvhsCnt) { - $curMarkStat = 'Marked'; - } elseif ($hasMvhs == true && $curMotorMarkStat == 'Marked' && $curPumpMarkStat == 'Marked' && $curNamePlateMarkStat == 'Marked') { + if ($hasMvhs == true && $curMotorMarkStat == 'Marked' && $curPumpMarkStat == 'Marked' && $curNamePlateMarkStat == 'Marked') { $curMarkStat = 'Marked'; } elseif ($hasMvhs == false && $curMotorMarkStat == 'Marked' && $curPumpMarkStat == 'Marked') { $curMarkStat = 'Marked'; @@ -779,11 +843,10 @@ class CharacteristicsController extends Controller 'motor_machine_name' => $char['motor_machine_name'] ?? $curMMach, 'pump_machine_name' => $char['pump_machine_name'] ?? $curPMach, 'name_plate_machine_name' => $char['name_plate_machine_name'] ?? $curNpMach, - 'pumpset_machine_name' => $char['pumpset_machine_name'] ?? $curPsMach, 'part_validation_1' => $char['part_validation_1'] ?? $curPart1, 'part_validation_2' => $char['part_validation_2'] ?? $curPart2, 'samlight_logged_name' => $char['samlight_logged_name'] ?? $slUser, - // 'pending_released_status' => $char['pending_released_status'] ?? null, + 'pending_released_status' => $char['pending_released_status'] ?? 0, 'has_work_flow_id' => $char['has_work_flow_id'] ?? $curWorkFlow, 'updated_by' => $userName ?? null, ]; @@ -793,11 +856,11 @@ class CharacteristicsController extends Controller $napExpecTim = $napExpecTim + $expectedTime; $curNamePlateMarkStat = 'Marked'; $curNamePlateMarkBy = ($char['name_plate_marked_by'] == 'jothi') ? 'Admin' : $char['name_plate_marked_by'] ?? $curNamePlateMarkBy; + // } elseif ($modelType == 'PUMPSET' && $physiCnt >= $mvhsCnt) { + // $curMarkStat = 'Marked'; } - if ($modelType == 'PUMPSET' && $physiCnt >= $mvhsCnt) { - $curMarkStat = 'Marked'; - } elseif ($curMotorMarkStat == 'Marked' && $curPumpMarkStat == 'Marked' && $curNamePlateMarkStat == 'Marked') { + if ($curMotorMarkStat == 'Marked' && $curPumpMarkStat == 'Marked' && $curNamePlateMarkStat == 'Marked') { $curMarkStat = 'Marked'; } @@ -813,11 +876,10 @@ class CharacteristicsController extends Controller 'motor_pump_pumpset_status' => '3', // 'winded_serial_number' => $char['winded_serial_number'] ?? $curWindNo, 'name_plate_machine_name' => $char['name_plate_machine_name'] ?? $curNpMach, - 'pumpset_machine_name' => $char['pumpset_machine_name'] ?? $curPsMach, // 'part_validation_1' => $char['part_validation_1'] ?? $curPart1, // 'part_validation_2' => $char['part_validation_2'] ?? $curPart2, 'samlight_logged_name' => $char['samlight_logged_name'] ?? $slUser, - // 'pending_released_status' => $char['pending_released_status'] ?? null, + 'pending_released_status' => $char['pending_released_status'] ?? 0, 'has_work_flow_id' => $char['has_work_flow_id'] ?? $curWorkFlow, 'updated_by' => $userName ?? null, ]; @@ -830,11 +892,11 @@ class CharacteristicsController extends Controller $curPumpMarkStat = 'Marked'; } $curPumpMarkBy = ($char['pump_marked_by'] == 'jothi') ? 'Admin' : $char['pump_marked_by'] ?? $curPumpMarkBy; + // } elseif ($modelType == 'PUMPSET' && $physiCnt >= $mvhsCnt) { + // $curMarkStat = 'Marked'; } - if ($modelType == 'PUMPSET' && $physiCnt >= $mvhsCnt) { - $curMarkStat = 'Marked'; - } elseif ($hasMvhs == true && $curMotorMarkStat == 'Marked' && $curPumpMarkStat == 'Marked' && $curNamePlateMarkStat == 'Marked') { + if ($hasMvhs == true && $curMotorMarkStat == 'Marked' && $curPumpMarkStat == 'Marked' && $curNamePlateMarkStat == 'Marked') { $curMarkStat = 'Marked'; } elseif ($hasMvhs == false && $curMotorMarkStat == 'Marked' && $curPumpMarkStat == 'Marked') { $curMarkStat = 'Marked'; @@ -853,11 +915,10 @@ class CharacteristicsController extends Controller 'motor_pump_pumpset_status' => '3', // 'winded_serial_number' => $char['winded_serial_number'] ?? $curWindNo, 'pump_machine_name' => $char['pump_machine_name'] ?? $curPMach, - 'pumpset_machine_name' => $char['pumpset_machine_name'] ?? $curPsMach, // 'part_validation_1' => $char['part_validation_1'] ?? $curPart1, // 'part_validation_2' => $char['part_validation_2'] ?? $curPart2, 'samlight_logged_name' => $char['samlight_logged_name'] ?? $slUser, - // 'pending_released_status' => $char['pending_released_status'] ?? null, + 'pending_released_status' => $char['pending_released_status'] ?? 0, 'has_work_flow_id' => $char['has_work_flow_id'] ?? $curWorkFlow, 'updated_by' => $userName ?? null, ]; @@ -870,11 +931,11 @@ class CharacteristicsController extends Controller $curMotorMarkStat = 'Marked'; } $curMotorMarkBy = ($char['motor_marked_by'] == 'jothi') ? 'Admin' : $char['motor_marked_by'] ?? $curMotorMarkBy; + // } elseif ($modelType == 'PUMPSET' && $physiCnt >= $mvhsCnt) { + // $curMarkStat = 'Marked'; } - if ($modelType == 'PUMPSET' && $physiCnt >= $mvhsCnt) { - $curMarkStat = 'Marked'; - } elseif ($hasMvhs == true && $curMotorMarkStat == 'Marked' && $curPumpMarkStat == 'Marked' && $curNamePlateMarkStat == 'Marked') { + if ($hasMvhs == true && $curMotorMarkStat == 'Marked' && $curPumpMarkStat == 'Marked' && $curNamePlateMarkStat == 'Marked') { $curMarkStat = 'Marked'; } elseif ($hasMvhs == false && $curMotorMarkStat == 'Marked' && $curPumpMarkStat == 'Marked') { $curMarkStat = 'Marked'; @@ -893,11 +954,10 @@ class CharacteristicsController extends Controller 'motor_pump_pumpset_status' => '3', 'winded_serial_number' => $char['winded_serial_number'] ?? $curWindNo, 'motor_machine_name' => $char['motor_machine_name'] ?? $curMMach, - 'pumpset_machine_name' => $char['pumpset_machine_name'] ?? $curPsMach, 'part_validation_1' => $char['part_validation_1'] ?? $curPart1, 'part_validation_2' => $char['part_validation_2'] ?? $curPart2, 'samlight_logged_name' => $char['samlight_logged_name'] ?? $slUser, - // 'pending_released_status' => $char['pending_released_status'] ?? null, + 'pending_released_status' => $char['pending_released_status'] ?? 0, 'has_work_flow_id' => $char['has_work_flow_id'] ?? $curWorkFlow, 'updated_by' => $userName ?? null, ]; @@ -921,11 +981,11 @@ class CharacteristicsController extends Controller $napExpecTim = $napExpecTim + $expectedTime; $curNamePlateMarkStat = 'Marked'; $curNamePlateMarkBy = ($char['name_plate_marked_by'] == 'jothi') ? 'Admin' : $char['name_plate_marked_by'] ?? $curNamePlateMarkBy; + // } elseif ($modelType == 'PUMPSET' && $physiCnt >= $mvhsCnt) { + // $curMarkStat = 'Marked'; } - if ($modelType == 'PUMPSET' && $physiCnt >= $mvhsCnt) { - $curMarkStat = 'Marked'; - } elseif ($curMotorMarkStat == 'Marked' && $curPumpMarkStat == 'Marked' && $curNamePlateMarkStat == 'Marked') { + if ($curMotorMarkStat == 'Marked' && $curPumpMarkStat == 'Marked' && $curNamePlateMarkStat == 'Marked') { $curMarkStat = 'Marked'; } @@ -948,14 +1008,13 @@ class CharacteristicsController extends Controller 'name_plate_marked_by' => $curNamePlateMarkBy, 'motor_pump_pumpset_status' => null, 'winded_serial_number' => $char['winded_serial_number'] ?? $curWindNo, - 'motor_machine_name' => $curMMach, // $char['motor_machine_name'] ?? - 'pump_machine_name' => $curPMach, // $char['pump_machine_name'] ?? - 'name_plate_machine_name' => $curNpMach, // $char['name_plate_machine_name'] ?? - 'pumpset_machine_name' => $char['pumpset_machine_name'] ?? $curPsMach, + 'motor_machine_name' => $char['motor_machine_name'] ?? $curMMach, + 'pump_machine_name' => $char['pump_machine_name'] ?? $curPMach, + 'name_plate_machine_name' => $char['name_plate_machine_name'] ?? $curNpMach, 'part_validation_1' => $char['part_validation_1'] ?? $curPart1, 'part_validation_2' => $char['part_validation_2'] ?? $curPart2, 'samlight_logged_name' => $char['samlight_logged_name'] ?? $slUser, - // 'pending_released_status' => $char['pending_released_status'] ?? null, + 'pending_released_status' => $char['pending_released_status'] ?? 0, 'has_work_flow_id' => $char['has_work_flow_id'] ?? $curWorkFlow, 'updated_by' => $userName ?? null, ]; @@ -975,11 +1034,11 @@ class CharacteristicsController extends Controller $curPumpMarkStat = 'Marked'; } $curPumpMarkBy = ($char['pump_marked_by'] == 'jothi') ? 'Admin' : $char['pump_marked_by'] ?? $curPumpMarkBy; + // } elseif ($modelType == 'PUMPSET' && $physiCnt >= $mvhsCnt) { + // $curMarkStat = 'Marked'; } - if ($modelType == 'PUMPSET' && $physiCnt >= $mvhsCnt) { - $curMarkStat = 'Marked'; - } elseif ($curMotorMarkStat == 'Marked' && $curPumpMarkStat == 'Marked') { + if ($curMotorMarkStat == 'Marked' && $curPumpMarkStat == 'Marked') { $curMarkStat = 'Marked'; } elseif (Str::contains($curHead, 'PUMP', ignoreCase: true) && ! Str::contains($curHead, 'PUMP SET', ignoreCase: true) && ! Str::contains($curHead, 'PUMPSET', ignoreCase: true)) { if ($modelType == 'PUMP' && $pumPhysiCnt >= $mvhsCnt) { @@ -1012,12 +1071,11 @@ class CharacteristicsController extends Controller 'winded_serial_number' => $char['winded_serial_number'] ?? $curWindNo, 'motor_machine_name' => $char['motor_machine_name'] ?? $curMMach, 'pump_machine_name' => $char['pump_machine_name'] ?? $curPMach, - 'name_plate_machine_name' => $curNpMach, // $char['name_plate_machine_name'] ?? - 'pumpset_machine_name' => $char['pumpset_machine_name'] ?? $curPsMach, + 'name_plate_machine_name' => $char['name_plate_machine_name'] ?? $curNpMach, 'part_validation_1' => $char['part_validation_1'] ?? $curPart1, 'part_validation_2' => $char['part_validation_2'] ?? $curPart2, 'samlight_logged_name' => $char['samlight_logged_name'] ?? $slUser, - // 'pending_released_status' => $char['pending_released_status'] ?? null, + 'pending_released_status' => $char['pending_released_status'] ?? 0, 'has_work_flow_id' => $char['has_work_flow_id'] ?? $curWorkFlow, 'updated_by' => $userName ?? null, ]; @@ -1025,12 +1083,7 @@ class CharacteristicsController extends Controller } $isAuto = true; - $affected = ClassCharacteristic::where('plant_id', $plantId) - ->where('machine_id', $machineId) - ->where('aufnr', $jobNo) - ->where('gernr', $serialNumber) - ->where('item_id', $itemId) - ->update($values); + $affected = ClassCharacteristic::where('gernr', $serialNumber)->where('item_id', $itemId)->where('aufnr', $jobNo)->where('machine_id', $machineId)->where('plant_id', $plantId)->update($values); $updatedRows += $affected; } else { @@ -1050,11 +1103,11 @@ class CharacteristicsController extends Controller 'status_code' => 'ERROR', 'status_description' => "Name plate serial number '{$serialNumber}' doesn't marked in auto mode!", ], 404); - } elseif ($modelType == 'PUMPSET' && $curMarkStat != 'Marked') { - return response()->json([ - 'status_code' => 'ERROR', - 'status_description' => "Pumpset serial number '{$serialNumber}' doesn't marked in auto mode!", - ], 404); + // } elseif ($modelType == 'PUMPSET' && $curMarkStat != 'Marked') { + // return response()->json([ + // 'status_code' => 'ERROR', + // 'status_description' => "Pumpset serial number '{$serialNumber}' doesn't marked in auto mode!", + // ], 404); } $manStat = (intval($curStat->man_marked_status ?? 0) ?: 0) + 1; @@ -1063,16 +1116,15 @@ class CharacteristicsController extends Controller 'man_marked_status' => (string) $manStat, 'man_marked_datetime' => $char['man_marked_datetime'] ?? now(), 'man_marked_by' => ($char['man_marked_by'] == 'jothi') ? 'Admin' : $char['man_marked_by'] ?? $curManualMarkBy, + 'winded_serial_number' => $char['winded_serial_number'] ?? $curWindNo, + 'part_validation_1' => $char['part_validation_1'] ?? $curPart1, + 'part_validation_2' => $char['part_validation_2'] ?? $curPart2, 'samlight_logged_name' => $char['samlight_logged_name'] ?? $slUser, 'updated_by' => $userName ?? null, ]; $isAuto = false; - $affected = ClassCharacteristic::where('plant_id', $plantId) - ->where('machine_id', $machineId) - ->where('gernr', $serialNumber) - ->where('item_id', $itemId) - ->update($values); + $affected = ClassCharacteristic::where('gernr', $serialNumber)->where('item_id', $itemId)->where('machine_id', $machineId)->where('plant_id', $plantId)->update($values); $updatedRows += $affected; } @@ -1081,12 +1133,12 @@ class CharacteristicsController extends Controller if ($updatedRows == 0) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => $isAuto ? 'Failed to update auto marked status for the '.strtolower($modelType)."serial number '{$serialNumber}'." : 'Failed to update manual marked status for the '.strtolower($modelType)."serial number '{$serialNumber}'.", + 'status_description' => $isAuto ? 'Failed to update auto marked status for the '.strtolower($modelType)." serial number '{$serialNumber}'." : 'Failed to update manual marked status for the '.strtolower($modelType)." serial number '{$serialNumber}'.", ], 404); } else { return response()->json([ 'status_code' => 'SUCCESS', - 'status_description' => $isAuto ? 'Successfully auto marked status updated for the '.strtolower($modelType)." serial number '{$serialNumber}'." : 'Successfully manual marked status updated for the '.strtolower($modelType)."serial number '{$serialNumber}'.", + 'status_description' => $isAuto ? 'Successfully auto marked status updated for the '.strtolower($modelType)." serial number '{$serialNumber}'." : 'Successfully manual marked status updated for the '.strtolower($modelType)." serial number '{$serialNumber}'.", ], 200); } } @@ -1108,7 +1160,7 @@ class CharacteristicsController extends Controller $userName = $request->header('user-name'); - if (! $userName) { + if (! $userName || $userName == null || $userName == '') { return response()->json([ 'status_code' => 'ERROR', 'status_description' => "User name can't be empty!", @@ -1126,16 +1178,26 @@ class CharacteristicsController extends Controller $serialNumbers = $data['serial_numbers'] ?? ''; $characteristics = $data['characteristics']; - if ($plantCode == null || $plantCode == '') { + if ($plantCode == null || $plantCode == '' || ! $plantCode) { return response()->json([ 'status_code' => 'ERROR', 'status_description' => "Plant code can't be empty!", - ], 404); - } elseif (! is_numeric($plantCode) || Str::length($plantCode) < 4 || ! preg_match('/^[1-9]\d{3,}$/', $plantCode)) { // !ctype_digit($data['plant_code']) + ], 400); + } elseif (! is_numeric($plantCode)) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'Invalid plant code found!', - ], 404); + 'status_description' => "Plant code '{$plantCode}' should contain only numeric values!", + ], 400); + } elseif (Str::length($plantCode) < 4 || Str::length($plantCode) > 7) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Plant code '{$plantCode}' must be between 4 and 7 digits only!", + ], 400); + } elseif (! preg_match('/^[1-9]\d{3,6}$/', $plantCode)) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Invalid plant code '{$plantCode}' found!", + ], 400); } if ($workCenter == null || $workCenter == '' || ! $workCenter) { @@ -1143,6 +1205,16 @@ class CharacteristicsController extends Controller 'status_code' => 'ERROR', 'status_description' => "Work center can't be empty!", ], 404); + } elseif (Str::length($workCenter) < 6) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Work center '{$workCenter}' should contain minimum 6 characters!", + ], 404); + } elseif (! ctype_alnum($workCenter)) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Work center '{$workCenter}' should contain only alpha-numeric values!", + ], 404); } $plant = Plant::where('code', $plantCode)->first(); @@ -1150,7 +1222,7 @@ class CharacteristicsController extends Controller if (! $plant) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Plant '{$plantCode}' not found!", + 'status_description' => "Plant code '{$plantCode}' not found in plants table!", ], 404); } @@ -1163,17 +1235,17 @@ class CharacteristicsController extends Controller if (! $user) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'User name not found!', + 'status_description' => "User name '{$userName}' not found in users table!", ], 403); } elseif (! $userPlant && ! $user->hasRole('Super Admin')) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "User '{$userName}' not found for Plant '{$plantCode}'!", + 'status_description' => "User name '{$userName}' not found for the plant code '{$plantCode}' in users table!", ], 403); } elseif (! $user->hasRole(['Super Admin', 'Laser Manager', 'Laser Supervisor', 'Laser Employee'])) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'User does not have rights!', + 'status_description' => "User '{$userName}' does not have rights!", ], 403); } @@ -1182,7 +1254,7 @@ class CharacteristicsController extends Controller if (! $work) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Work center '{$workCenter}' not found!", + 'status_description' => "Work center '{$workCenter}' not found in machines table!", ], 404); } @@ -1191,39 +1263,36 @@ class CharacteristicsController extends Controller if (! $machine) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Work center '{$workCenter}' not found for the plant code '{$plantCode}'!", + 'status_description' => "Work center '{$workCenter}' not found for the plant code '{$plantCode}' in machines table!", ], 404); } $machineId = $machine->id; - $availFields = ['class', 'arbid', 'gamng', 'lmnga', 'zz1_cn_bill_ord', 'zmm_amps', 'zmm_brand', 'zmm_degreeofprotection', 'zmm_delivery', 'zmm_dir_rot', 'zmm_discharge', 'zmm_discharge_max', 'zmm_discharge_min', 'zmm_duty', 'zmm_eff_motor', 'zmm_eff_pump', 'zmm_frequency', 'zmm_head', 'zmm_heading', 'zmm_head_max', 'zmm_head_minimum', 'zmm_idx_eff_mtr', 'zmm_idx_eff_pump', 'zmm_kvacode', 'zmm_maxambtemp', 'zmm_mincoolingflow', 'zmm_motorseries', 'zmm_motor_model', 'zmm_outlet', 'zmm_phase', 'zmm_pressure', 'zmm_pumpflowtype', 'zmm_pumpseries', 'zmm_pump_model', 'zmm_ratedpower', 'zmm_region', 'zmm_servicefactor', 'zmm_servicefactormaximumamps', 'zmm_speed', 'zmm_suction', 'zmm_suctionxdelivery', 'zmm_supplysource', 'zmm_temperature', 'zmm_thrustload', 'zmm_volts', 'zmm_wire', 'zmm_package', 'zmm_pvarrayrating', 'zmm_isi', 'zmm_isimotor', 'zmm_isipump', 'zmm_isipumpset', 'zmm_pumpset_model', 'zmm_stages', 'zmm_headrange', 'zmm_overall_efficiency', 'zmm_connection', 'zmm_min_bore_size', 'zmm_isireference', 'zmm_category', 'zmm_submergence', 'zmm_capacitorstart', 'zmm_capacitorrun', 'zmm_inch', 'zmm_motor_type', 'zmm_dismantle_direction', 'zmm_eff_ovrall', 'zmm_bodymoc', 'zmm_rotormoc', 'zmm_dlwl', 'zmm_inputpower', 'zmm_imp_od', 'zmm_ambtemp', 'zmm_de', 'zmm_dischargerange', 'zmm_efficiency_class', 'zmm_framesize', 'zmm_impellerdiameter', 'zmm_insulationclass', 'zmm_maxflow', 'zmm_minhead', 'zmm_mtrlofconst', 'zmm_nde', 'zmm_powerfactor', 'zmm_tagno', 'zmm_year', 'zmm_laser_name', 'zmm_logo_cp', 'zmm_logo_ce', 'zmm_logo_nsf', 'zmm_beenote', 'zmm_beenumber', 'zmm_beestar', 'zmm_codeclass', 'zmm_colour', 'zmm_grade', 'zmm_grwt_pset', 'zmm_grwt_cable', 'zmm_grwt_motor', 'zmm_grwt_pf', 'zmm_grwt_pump', 'zmm_isivalve', 'zmm_isi_wc', 'zmm_labelperiod', 'zmm_length', 'zmm_license_cml_no', 'zmm_mfgmonyr', 'zmm_modelyear', 'zmm_motoridentification', 'zmm_newt_pset', 'zmm_newt_cable', 'zmm_newt_motor', 'zmm_newt_pf', 'zmm_newt_pump', 'zmm_packtype', 'zmm_panel', 'zmm_performance_factor', 'zmm_pumpidentification', 'zmm_psettype', 'zmm_size', 'zmm_eff_ttl', 'zmm_type', 'zmm_usp', 'marked_datetime', 'marked_by', 'motor_pump_pumpset_status', 'motor_machine_name', 'pump_machine_name', 'name_plate_machine_name', 'pumpset_machine_name', 'pending_released_status', 'has_work_flow_id']; // 'mark_status','marked_physical_count', 'marked_expected_time', 'man_marked_status', 'man_marked_datetime', 'man_marked_by', 'motor_marked_status', 'motor_marked_physical_count', 'motor_expected_time', 'motor_marked_by', 'pump_marked_status', 'pump_marked_physical_count', 'pump_expected_time', 'pump_marked_by', 'name_plate_marked_status', 'name_plate_expected_time', 'name_plate_marked_by', 'winded_serial_number', 'part_validation_1', 'part_validation_2', 'samlight_logged_name', + $availFields = ['class', 'arbid', 'gamng', 'lmnga', 'zz1_cn_bill_ord', 'zmm_amps', 'zmm_brand', 'zmm_degreeofprotection', 'zmm_delivery', 'zmm_dir_rot', 'zmm_discharge', 'zmm_discharge_max', 'zmm_discharge_min', 'zmm_duty', 'zmm_eff_motor', 'zmm_eff_pump', 'zmm_frequency', 'zmm_head', 'zmm_heading', 'zmm_head_max', 'zmm_head_minimum', 'zmm_idx_eff_mtr', 'zmm_idx_eff_pump', 'zmm_kvacode', 'zmm_maxambtemp', 'zmm_mincoolingflow', 'zmm_motorseries', 'zmm_motor_model', 'zmm_outlet', 'zmm_phase', 'zmm_pressure', 'zmm_pumpflowtype', 'zmm_pumpseries', 'zmm_pump_model', 'zmm_ratedpower', 'zmm_region', 'zmm_servicefactor', 'zmm_servicefactormaximumamps', 'zmm_speed', 'zmm_suction', 'zmm_suctionxdelivery', 'zmm_supplysource', 'zmm_temperature', 'zmm_thrustload', 'zmm_volts', 'zmm_wire', 'zmm_package', 'zmm_pvarrayrating', 'zmm_isi', 'zmm_isimotor', 'zmm_isipump', 'zmm_isipumpset', 'zmm_pumpset_model', 'zmm_stages', 'zmm_headrange', 'zmm_overall_efficiency', 'zmm_connection', 'zmm_min_bore_size', 'zmm_isireference', 'zmm_category', 'zmm_submergence', 'zmm_capacitorstart', 'zmm_capacitorrun', 'zmm_inch', 'zmm_motor_type', 'zmm_dismantle_direction', 'zmm_eff_ovrall', 'zmm_bodymoc', 'zmm_rotormoc', 'zmm_dlwl', 'zmm_inputpower', 'zmm_imp_od', 'zmm_ambtemp', 'zmm_de', 'zmm_dischargerange', 'zmm_efficiency_class', 'zmm_framesize', 'zmm_impellerdiameter', 'zmm_insulationclass', 'zmm_maxflow', 'zmm_minhead', 'zmm_mtrlofconst', 'zmm_nde', 'zmm_powerfactor', 'zmm_tagno', 'zmm_year', 'zmm_laser_name', 'zmm_logo_cp', 'zmm_logo_ce', 'zmm_logo_nsf', 'zmm_logo_eac', 'zmm_grwt_motor', 'zmm_grwt_pump', 'zmm_grwt_pset', 'zmm_grwt_cable', 'zmm_grwt_pf', 'zmm_newt_motor', 'zmm_newt_pump', 'zmm_newt_pset', 'zmm_newt_cable', 'zmm_newt_pf', 'zmm_operating_range', 'zmm_intake_air', 'zmm_oxygen_transfer_rate', 'zmm_air_inlet_pipesize', 'zmm_sump_depth', 'zmm_poles', 'zmm_motor_heading', 'zmm_motor_speed', 'zmm_beenote', 'zmm_beenumber', 'zmm_beestar', 'zmm_eff_ttl', 'zmm_labelperiod', 'zmm_modelyear', 'zmm_performance_factor', 'zqmm_qty', 'zmm_codeclass', 'zmm_colour', 'zmm_grade', 'zmm_isivalve', 'zmm_isi_wc', 'zmm_length', 'zmm_license_cml_no', 'zmm_mfgmonyr', 'zmm_motoridentification', 'zmm_packtype', 'zmm_panel', 'zmm_pumpidentification', 'zmm_psettype', 'zmm_size', 'zmm_type', 'zmm_usp', 'marked_datetime', 'marked_by', 'motor_pump_pumpset_status', 'motor_machine_name', 'pump_machine_name', 'name_plate_machine_name', 'pending_released_status', 'has_work_flow_id']; // 'mark_status','marked_physical_count', 'marked_expected_time', 'man_marked_status', 'man_marked_datetime', 'man_marked_by', 'motor_marked_status', 'motor_marked_physical_count', 'motor_expected_time', 'motor_marked_by', 'pump_marked_status', 'pump_marked_physical_count', 'pump_expected_time', 'pump_marked_by', 'name_plate_marked_status', 'name_plate_expected_time', 'name_plate_marked_by', 'winded_serial_number', 'part_validation_1', 'part_validation_2', 'samlight_logged_name', if ($itemCode != '' && $itemCode != null && $itemCode && Str::length($itemCode) > 0) { - $existingJob = ClassCharacteristic::where('aufnr', $jobNo) - // ->where('plant_id', $plantId) - // ->where('machine_id', $machineId) - ->first(); + $existingJobNo = ClassCharacteristic::where('aufnr', $jobNo)->first(); // ->where('machine_id', $machineId)->where('plant_id', $plantId) - if ($existingJob) { - $curPlant = Plant::where('id', $existingJob->plant_id)->first(); - $curMachine = Machine::where('id', $existingJob->machine_id)->first(); + if ($existingJobNo) { + $curPlant = Plant::where('id', $existingJobNo->plant_id)->first(); + $curMachine = Machine::where('id', $existingJobNo->machine_id)->first(); return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Duplicate job number '{$jobNo}' found for the plant code '{$curPlant->code}' and work center '$curMachine->work_center'!", + 'status_description' => "Duplicate job number '{$jobNo}' found for the plant name '{$curPlant?->name}' and work center '$curMachine?->work_center'!", ], 404); } if (Str::length($itemCode) < 6) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'Item Code should contain minimum 6 digits!', + 'status_description' => "Item code '{$itemCode}' should contain minimum 6 digits!", ], 404); } elseif (! ctype_alnum($itemCode)) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Item Code '{$itemCode}' should contain alpha-numeric values!", + 'status_description' => "Item code '{$itemCode}' should contain only alpha-numeric values!", ], 404); } elseif (! preg_match('/^[a-zA-Z1-9][a-zA-Z0-9]{5,}$/', $itemCode)) { return response()->json([ @@ -1237,18 +1306,16 @@ class CharacteristicsController extends Controller if (! $item) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Item Code '{$itemCode}' not found!", + 'status_description' => "Item code '{$itemCode}' not found in items table!", ], 404); } - $itemPlant = Item::where('code', $itemCode) - ->where('plant_id', $plantId) - ->first(); + $itemPlant = Item::where('code', $itemCode)->where('plant_id', $plantId)->first(); if (! $itemPlant) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Item Code '{$itemCode}' not found for the plant code '{$plantCode}'!", + 'status_description' => "Item code '{$itemCode}' not found for the plant code '{$plantCode}' in items table!", ], 404); } @@ -1301,7 +1368,7 @@ class CharacteristicsController extends Controller if (! $stick) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Item code '{$itemCode}' not found in sticker master!", + 'status_description' => "Item code '{$itemCode}' not found in sticker masters table!", ], 404); } @@ -1310,19 +1377,19 @@ class CharacteristicsController extends Controller if (! $stickPlant) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Item code '{$itemCode}' not found in sticker master for the plant code '{$plantCode}'!", + 'status_description' => "Item code '{$itemCode}' not found for the plant code '{$plantCode}' in sticker masters table!", ], 404); } else { $curMvhs = trim($stickPlant?->laser_part_validation2); if ($curMvhs == null || $curMvhs == '' || ! is_numeric($curMvhs) || Str::length($curMvhs) <= 0) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'Invalid MVHS master count found in sticker master!', + 'status_description' => 'Invalid MVHS master count found in sticker masters table!', ], 404); } elseif (! preg_match('/^[1-9]$/', $curMvhs)) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'The MVHS master count should be between 1 to 9.', + 'status_description' => 'The MVHS master count should be between 1 to 9!', ], 404); } } @@ -1360,14 +1427,14 @@ class CharacteristicsController extends Controller return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Following users : '".implode(', ', $uniqueMissingUsers)."' not found!", + 'status_description' => "Following user names : '".implode(', ', $uniqueMissingUsers)."' not found in users table!", ], 404); } elseif (! empty($missingUsersPlant)) { $uniqueMissingUsersPlant = array_unique($missingUsersPlant); return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Following users : '".implode(', ', $uniqueMissingUsersPlant)."' not found for the plant code '{$plantCode}'!", + 'status_description' => "Following user names : '".implode(', ', $uniqueMissingUsersPlant)."' not found for the plant code '{$plantCode}' in users table!", ], 404); } elseif (! empty($missingUsersRight)) { $uniqueMissingUsersRight = array_unique($missingUsersRight); @@ -1383,10 +1450,8 @@ class CharacteristicsController extends Controller $seenSerialNumbers = []; foreach ($serialNumbers as $serial) { try { - $existing = ClassCharacteristic::where('plant_id', $plantId) - // ->where('item_id', $itemId) - ->where('gernr', $serial) - ->first(); + $existing = ClassCharacteristic::where('gernr', $serial)->where('plant_id', $plantId)->first(); + // ->where('item_id', $itemId) if ($existing) { $dupSerials[] = $serial; @@ -1400,7 +1465,7 @@ class CharacteristicsController extends Controller } catch (\Exception $e) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Error occurred while inserting new master characteristics for the serial number '$serial', {$e->getMessage()}", + 'status_description' => "Error occurred while inserting new master characteristics for the serial number '{$serial}', {$e->getMessage()}", // 'char_data' => $char ], 500); } @@ -1447,17 +1512,14 @@ class CharacteristicsController extends Controller // $insertData['pump_marked_by'] = ($char['pump_marked_by'] == 'jothi') ? 'Admin' : $char['pump_marked_by'] ?? null; // $insertData['name_plate_marked_by'] = ($char['name_plate_marked_by'] == 'jothi') ? 'Admin' : $char['name_plate_marked_by'] ?? null; - $existing = ClassCharacteristic::where('plant_id', $plantId) - // ->where('item_id', $itemId) - ->where('gernr', $serial) - ->first(); + $existing = ClassCharacteristic::where('gernr', $serial)->where('plant_id', $plantId)->first(); // ->where('item_id', $itemId) if ($existing) { // $insertData['updated_by'] = $userName ?? null; // $existing->update($insertData); return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Duplicate serial number '$serial' found while inserting new master characteristics in job number '$existing->aufnr'!", + 'status_description' => "Duplicate serial number '{$serial}' found while inserting new master characteristics in job number '{$existing->aufnr}'!", ], 404); } else { $isInsert = true; @@ -1467,20 +1529,72 @@ class CharacteristicsController extends Controller } catch (\Exception $e) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Error occurred while inserting new master characteristics for the serial number '$serial', {$e->getMessage()}", + 'status_description' => "Error occurred while inserting new master characteristics for the serial number '{$serial}', {$e->getMessage()}", // 'char_data' => $char ], 500); } } } + if ($isInsert) { + $classChar = ClassCharacteristic::where('aufnr', $jobNo)->where('machine_id', $machineId)->where('plant_id', $plantId)->latest()->first(); + $modelHeading = $classChar?->zmm_heading ?? ''; + $typesToCreate = []; + + if (Str::contains($modelHeading, 'PRESSURE BOOSTER SYSTEM', ignoreCase: true)) { + $typesToCreate = ['MOTOR', 'PUMP', 'NAME_PLATE']; + } elseif (Str::contains($modelHeading, 'PUMPSET', ignoreCase: true)) { + $typesToCreate = ['MOTOR', 'PUMP']; + } elseif (Str::contains($modelHeading, 'PUMP', ignoreCase: true) && ! Str::contains($modelHeading, 'PUMP SET', ignoreCase: true) && ! Str::contains($modelHeading, 'PUMPSET', ignoreCase: true)) { + $typesToCreate = ['PUMP']; + } elseif (Str::contains($modelHeading, 'MOTOR', ignoreCase: true)) { + $typesToCreate = ['MOTOR']; + } else { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Unknown ZMM_HEADING : '{$modelHeading}' found!", + ], 404); + } + + TempClassCharacteristic::where('aufnr', $jobNo)->where('machine_id', $machineId)->where('plant_id', $plantId)->forceDelete(); + + foreach ($typesToCreate as $type) { + TempClassCharacteristic::create([ + 'plant_id' => $plantId, + 'machine_id' => $machineId, + 'item_id' => $itemId, + 'aufnr' => $jobNo, + 'model_type' => $type, + 'has_work_flow_id' => '2', + 'created_by' => $userName, + 'updated_by' => $userName, + ]); + } + + if ($classChar) { + ClassCharacteristic::where('aufnr', $jobNo)->where('machine_id', $machineId)->where('plant_id', $plantId) + ->update([ + 'has_work_flow_id' => '2', + 'updated_at' => now(), + 'updated_by' => $userName, + ]); + } + } + return response()->json([ 'status_code' => 'SUCCESS', - 'status_description' => $isInsert ? "Successfully inserted new master characteristics for the job number '$jobNo'." : "Failed to insert new master characteristics for the job number '$jobNo'.", + 'status_description' => $isInsert ? "Successfully inserted new master characteristics for the job number '{$jobNo}'." : "Failed to insert new master characteristics for the job number '{$jobNo}'.", ], 200); } else { $hasNewSno = false; + if (empty($characteristics) || ! is_array($characteristics) || count($characteristics) == 0) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Characteristics can't be empty!", + ], 404); + } + $columns = Schema::getColumnListing((new ClassCharacteristic)->getTable()); $invalidFields = []; @@ -1502,39 +1616,34 @@ class CharacteristicsController extends Controller ], 404); } - $existingJob = ClassCharacteristic::where('aufnr', $jobNo)->first(); + $existingJobNo = ClassCharacteristic::where('aufnr', $jobNo)->first(); - if (! $existingJob) { + if (! $existingJobNo) { return response()->json([ 'status_code' => 'ERROR', 'status_description' => "Job number '{$jobNo}' not found!", ], 404); } - $existingJob = ClassCharacteristic::where('plant_id', $plantId) - ->where('aufnr', $jobNo) - ->first(); + $existingJobPlant = ClassCharacteristic::where('aufnr', $jobNo)->where('plant_id', $plantId)->first(); - if (! $existingJob) { + if (! $existingJobPlant) { return response()->json([ 'status_code' => 'ERROR', 'status_description' => "Job number '{$jobNo}' not found for the plant code '{$plantCode}'!", ], 404); } - $existingJob = ClassCharacteristic::where('plant_id', $plantId) - ->where('machine_id', $machineId) - ->where('aufnr', $jobNo) - ->first(); + $classChar = ClassCharacteristic::where('aufnr', $jobNo)->where('machine_id', $machineId)->where('plant_id', $plantId)->latest()->first(); - if (! $existingJob) { + if (! $classChar) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Job number '{$jobNo}' not found for the plant code '{$plantCode}' and work center '{$workCenter}'!", + 'status_description' => "Job number '{$jobNo}' not found for the work center '{$workCenter}'!", // plant code '{$plantCode}' and ], 404); } - $itemId = $existingJob->item_id; + $itemId = $classChar->item_id; $item = Item::where('id', $itemId)->first(); @@ -1554,7 +1663,7 @@ class CharacteristicsController extends Controller if (! $stick) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Item code '{$itemCode}' not found in sticker master!", + 'status_description' => "Item code '{$itemCode}' not found in sticker masters table!", ], 404); } @@ -1563,19 +1672,19 @@ class CharacteristicsController extends Controller if (! $stickPlant) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Item code '{$itemCode}' not found in sticker master for the plant code '{$plantCode}'!", + 'status_description' => "Item code '{$itemCode}' not found for the plant code '{$plantCode}' in sticker masters table!", ], 404); } else { $curMvhs = trim($stickPlant?->laser_part_validation2); if ($curMvhs == null || $curMvhs == '' || ! is_numeric($curMvhs) || Str::length($curMvhs) <= 0) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'Invalid MVHS master count found in sticker master!', + 'status_description' => 'Invalid MVHS master count found in sticker masters table!', ], 404); } elseif (! preg_match('/^[1-9]$/', $curMvhs)) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'The MVHS master count should be between 1 to 9.', + 'status_description' => 'The MVHS master count should be between 1 to 9!', ], 404); } } @@ -1596,7 +1705,7 @@ class CharacteristicsController extends Controller if (! $stick) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Item code '{$itemCode}' not found in sticker master!", + 'status_description' => "Item code '{$itemCode}' not found in sticker masters table!", ], 404); } @@ -1605,19 +1714,19 @@ class CharacteristicsController extends Controller if (! $stickPlant) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Item code '{$itemCode}' not found in sticker master for the plant code '{$plantCode}'!", + 'status_description' => "Item code '{$itemCode}' not found for the plant code '{$plantCode}' in sticker masters table!", ], 404); } else { $curMvhs = trim($stickPlant?->laser_part_validation2); if ($curMvhs == null || $curMvhs == '' || ! is_numeric($curMvhs) || Str::length($curMvhs) <= 0) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'Invalid MVHS master count found in sticker master!', + 'status_description' => 'Invalid MVHS master count found in sticker masters table!', ], 404); } elseif (! preg_match('/^[1-9]$/', $curMvhs)) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'The MVHS master count should be between 1 to 9.', + 'status_description' => 'The MVHS master count should be between 1 to 9!', ], 404); } } @@ -1655,14 +1764,14 @@ class CharacteristicsController extends Controller return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Following users : '".implode(', ', $uniqueMissingUsers)."' not found!", + 'status_description' => "Following user names : '".implode(', ', $uniqueMissingUsers)."' not found in users table!", ], 404); } elseif (! empty($missingUsersPlant)) { $uniqueMissingUsersPlant = array_unique($missingUsersPlant); return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Following users : '".implode(', ', $uniqueMissingUsersPlant)."' not found for the plant code '{$plantCode}'!", + 'status_description' => "Following user names : '".implode(', ', $uniqueMissingUsersPlant)."' not found for the plant code '{$plantCode}' in users table!", ], 404); } elseif (! empty($missingUsersRight)) { $uniqueMissingUsersRight = array_unique($missingUsersRight); @@ -1678,15 +1787,9 @@ class CharacteristicsController extends Controller $seenSerialNumbers = []; foreach ($serialNumbers as $serial) { try { - $existing = ClassCharacteristic::where('plant_id', $plantId) - // ->where('item_id', $itemId) - ->where('gernr', $serial) - ->first(); + $existing = ClassCharacteristic::where('gernr', $serial)->where('plant_id', $plantId)->first(); // ->where('item_id', $itemId) - $existSnoJob = ClassCharacteristic::where('plant_id', $plantId) - ->where('gernr', $serial) - ->where('aufnr', '!=', $jobNo) - ->first(); + $existSnoJob = ClassCharacteristic::where('gernr', $serial)->where('aufnr', '!=', $jobNo)->where('plant_id', $plantId)->first(); if ($existing && $existSnoJob) { $dupSerials[] = $serial; @@ -1700,7 +1803,7 @@ class CharacteristicsController extends Controller } catch (\Exception $e) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Error occurred while inserting new master characteristics for the serial number '$serial', {$e->getMessage()}", + 'status_description' => "Error occurred while inserting new master characteristics for the serial number '{$serial}', {$e->getMessage()}", // 'char_data' => $char ], 500); } @@ -1723,14 +1826,7 @@ class CharacteristicsController extends Controller } } - if (empty($characteristics) || ! is_array($characteristics) || count($characteristics) == 0) { - return response()->json([ - 'status_code' => 'ERROR', - 'status_description' => "Characteristics can't be empty!", - ], 404); - } - - $masterFields = ['class', 'arbid', 'gamng', 'lmnga', 'zz1_cn_bill_ord', 'zmm_amps', 'zmm_brand', 'zmm_degreeofprotection', 'zmm_delivery', 'zmm_dir_rot', 'zmm_discharge', 'zmm_discharge_max', 'zmm_discharge_min', 'zmm_duty', 'zmm_eff_motor', 'zmm_eff_pump', 'zmm_frequency', 'zmm_head', 'zmm_heading', 'zmm_head_max', 'zmm_head_minimum', 'zmm_idx_eff_mtr', 'zmm_idx_eff_pump', 'zmm_kvacode', 'zmm_maxambtemp', 'zmm_mincoolingflow', 'zmm_motorseries', 'zmm_motor_model', 'zmm_outlet', 'zmm_phase', 'zmm_pressure', 'zmm_pumpflowtype', 'zmm_pumpseries', 'zmm_pump_model', 'zmm_ratedpower', 'zmm_region', 'zmm_servicefactor', 'zmm_servicefactormaximumamps', 'zmm_speed', 'zmm_suction', 'zmm_suctionxdelivery', 'zmm_supplysource', 'zmm_temperature', 'zmm_thrustload', 'zmm_volts', 'zmm_wire', 'zmm_package', 'zmm_pvarrayrating', 'zmm_isi', 'zmm_isimotor', 'zmm_isipump', 'zmm_isipumpset', 'zmm_pumpset_model', 'zmm_stages', 'zmm_headrange', 'zmm_overall_efficiency', 'zmm_connection', 'zmm_min_bore_size', 'zmm_isireference', 'zmm_category', 'zmm_submergence', 'zmm_capacitorstart', 'zmm_capacitorrun', 'zmm_inch', 'zmm_motor_type', 'zmm_dismantle_direction', 'zmm_eff_ovrall', 'zmm_bodymoc', 'zmm_rotormoc', 'zmm_dlwl', 'zmm_inputpower', 'zmm_imp_od', 'zmm_ambtemp', 'zmm_de', 'zmm_dischargerange', 'zmm_efficiency_class', 'zmm_framesize', 'zmm_impellerdiameter', 'zmm_insulationclass', 'zmm_maxflow', 'zmm_minhead', 'zmm_mtrlofconst', 'zmm_nde', 'zmm_powerfactor', 'zmm_tagno', 'zmm_year', 'zmm_laser_name', 'zmm_logo_cp', 'zmm_logo_ce', 'zmm_logo_nsf', 'pending_released_status']; + $masterFields = ['class', 'arbid', 'gamng', 'lmnga', 'zz1_cn_bill_ord', 'zmm_amps', 'zmm_brand', 'zmm_degreeofprotection', 'zmm_delivery', 'zmm_dir_rot', 'zmm_discharge', 'zmm_discharge_max', 'zmm_discharge_min', 'zmm_duty', 'zmm_eff_motor', 'zmm_eff_pump', 'zmm_frequency', 'zmm_head', 'zmm_heading', 'zmm_head_max', 'zmm_head_minimum', 'zmm_idx_eff_mtr', 'zmm_idx_eff_pump', 'zmm_kvacode', 'zmm_maxambtemp', 'zmm_mincoolingflow', 'zmm_motorseries', 'zmm_motor_model', 'zmm_outlet', 'zmm_phase', 'zmm_pressure', 'zmm_pumpflowtype', 'zmm_pumpseries', 'zmm_pump_model', 'zmm_ratedpower', 'zmm_region', 'zmm_servicefactor', 'zmm_servicefactormaximumamps', 'zmm_speed', 'zmm_suction', 'zmm_suctionxdelivery', 'zmm_supplysource', 'zmm_temperature', 'zmm_thrustload', 'zmm_volts', 'zmm_wire', 'zmm_package', 'zmm_pvarrayrating', 'zmm_isi', 'zmm_isimotor', 'zmm_isipump', 'zmm_isipumpset', 'zmm_pumpset_model', 'zmm_stages', 'zmm_headrange', 'zmm_overall_efficiency', 'zmm_connection', 'zmm_min_bore_size', 'zmm_isireference', 'zmm_category', 'zmm_submergence', 'zmm_capacitorstart', 'zmm_capacitorrun', 'zmm_inch', 'zmm_motor_type', 'zmm_dismantle_direction', 'zmm_eff_ovrall', 'zmm_bodymoc', 'zmm_rotormoc', 'zmm_dlwl', 'zmm_inputpower', 'zmm_imp_od', 'zmm_ambtemp', 'zmm_de', 'zmm_dischargerange', 'zmm_efficiency_class', 'zmm_framesize', 'zmm_impellerdiameter', 'zmm_insulationclass', 'zmm_maxflow', 'zmm_minhead', 'zmm_mtrlofconst', 'zmm_nde', 'zmm_powerfactor', 'zmm_tagno', 'zmm_year', 'zmm_laser_name', 'zmm_logo_cp', 'zmm_logo_ce', 'zmm_logo_nsf', 'zmm_logo_eac', 'zmm_grwt_motor', 'zmm_grwt_pump', 'zmm_grwt_pset', 'zmm_newt_motor', 'zmm_newt_pump', 'zmm_newt_pset', 'zmm_operating_range', 'zmm_intake_air', 'zmm_oxygen_transfer_rate', 'zmm_air_inlet_pipesize', 'zmm_sump_depth', 'zmm_poles', 'zmm_motor_heading', 'zmm_motor_speed', 'zmm_beenote', 'zmm_beenumber', 'zmm_beestar', 'zmm_eff_ttl', 'zmm_labelperiod', 'zmm_modelyear', 'zmm_performance_factor', 'zqmm_qty', 'pending_released_status']; $isInsertOrUpdate = false; @@ -1748,9 +1844,7 @@ class CharacteristicsController extends Controller } } - $existing = ClassCharacteristic::where('plant_id', $plantId) - ->where('machine_id', $machineId) - ->where('aufnr', $jobNo); + $existing = ClassCharacteristic::where('aufnr', $jobNo)->where('machine_id', $machineId)->where('plant_id', $plantId); if ($existing) { $isInsertOrUpdate = true; @@ -1759,28 +1853,27 @@ class CharacteristicsController extends Controller } else { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Job number '$jobNo' not found to update exist master characteristics!", + 'status_description' => "Job number '{$jobNo}' not found to update exist master characteristics!", ], 404); } } catch (\Exception $e) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Error occurred while updating exist master characteristics for the job number '$jobNo', {$e->getMessage()}", + 'status_description' => "Error occurred while updating exist master characteristics for the job number '{$jobNo}', {$e->getMessage()}", // 'char_data' => $char ], 404); } } if ($hasNewSno) { - $itemId = $existingJob->item_id; - + // $itemId = $classChar->item_id; foreach ($serialNumbers as $serial) { foreach ($characteristics as $char) { try { $insertData = [ 'plant_id' => $plantId, - 'aufnr' => $jobNo, 'machine_id' => $machineId, + 'aufnr' => $jobNo, 'item_id' => $itemId, 'gernr' => $serial, ]; @@ -1797,20 +1890,14 @@ class CharacteristicsController extends Controller // $insertData['pump_marked_by'] = ($char['pump_marked_by'] == 'jothi') ? 'Admin' : $char['pump_marked_by'] ?? null; // $insertData['name_plate_marked_by'] = ($char['name_plate_marked_by'] == 'jothi') ? 'Admin' : $char['name_plate_marked_by'] ?? null; - $existing = ClassCharacteristic::where('plant_id', $plantId) - // ->where('item_id', $itemId) - ->where('gernr', $serial) - ->first(); + $existing = ClassCharacteristic::where('gernr', $serial)->where('plant_id', $plantId)->first(); // ->where('item_id', $itemId) - $existSnoJob = ClassCharacteristic::where('plant_id', $plantId) - ->where('gernr', $serial) - ->where('aufnr', '!=', $jobNo) - ->first(); + $existSnoJob = ClassCharacteristic::where('gernr', $serial)->where('aufnr', '!=', $jobNo)->where('plant_id', $plantId)->first(); if ($existing && $existSnoJob) { // // Skip duplicate warning... return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Duplicate serial number '$serial' found while updating exist master characteristics in job number '$existSnoJob->aufnr'!", + 'status_description' => "Duplicate serial number '{$serial}' found while updating exist master characteristics in job number '{$existSnoJob->aufnr}'!", ], 404); } else { $isInsertOrUpdate = true; @@ -1820,7 +1907,7 @@ class CharacteristicsController extends Controller } catch (\Exception $e) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Error occurred while inserting new master characteristics for the serial number '$serial', {$e->getMessage()}", + 'status_description' => "Error occurred while inserting new master characteristics for the serial number '{$serial}', {$e->getMessage()}", // 'char_data' => $char ], 500); } @@ -1828,9 +1915,56 @@ class CharacteristicsController extends Controller } } + // $classChar = ClassCharacteristic::where('aufnr', $jobNo)->where('machine_id', $machineId)->where('plant_id', $plantId)->latest()->first(); + $modelHeading = $classChar?->zmm_heading ?? ''; + + $typesToCreate = []; + + if (Str::contains($modelHeading, 'PRESSURE BOOSTER SYSTEM', ignoreCase: true)) { + $typesToCreate = ['MOTOR', 'PUMP', 'NAME_PLATE']; + } elseif (Str::contains($modelHeading, 'PUMPSET', ignoreCase: true)) { + $typesToCreate = ['MOTOR', 'PUMP']; + } elseif (Str::contains($modelHeading, 'PUMP', ignoreCase: true) && ! Str::contains($modelHeading, 'PUMP SET', ignoreCase: true) && ! Str::contains($modelHeading, 'PUMPSET', ignoreCase: true)) { + $typesToCreate = ['PUMP']; + } elseif (Str::contains($modelHeading, 'MOTOR', ignoreCase: true)) { + $typesToCreate = ['MOTOR']; + } else { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Unknown ZMM_HEADING : '{$modelHeading}' found!", + ], 404); + } + + if ($isInsertOrUpdate) { + TempClassCharacteristic::where('aufnr', $jobNo)->where('machine_id', $machineId)->where('plant_id', $plantId)->forceDelete(); + + foreach ($typesToCreate as $type) { + TempClassCharacteristic::create([ + 'plant_id' => $plantId, + 'machine_id' => $machineId, + 'item_id' => $itemId, + 'aufnr' => $jobNo, + 'model_type' => $type, + 'has_work_flow_id' => '2', + 'created_by' => $userName, + 'updated_by' => $userName, + ]); + } + + // $classChar = ClassCharacteristic::where('aufnr', $jobNo)->where('machine_id', $machineId)->where('plant_id', $plantId)->latest()->first(); + if ($classChar) { + ClassCharacteristic::where('aufnr', $jobNo)->where('machine_id', $machineId)->where('plant_id', $plantId) + ->update([ + 'has_work_flow_id' => '2', + 'updated_at' => now(), + 'updated_by' => $userName, + ]); + } + } + return response()->json([ 'status_code' => 'SUCCESS', - 'status_description' => $isInsertOrUpdate ? "Successfully updated master characteristics for the job number '$jobNo'." : "Failed to update master characteristics for the job number '$jobNo'.", + 'status_description' => $isInsertOrUpdate ? "Successfully updated master characteristics for the job number '{$jobNo}'." : "Failed to update master characteristics for the job number '{$jobNo}'.", ], 200); } } @@ -1863,7 +1997,7 @@ class CharacteristicsController extends Controller $serialNumber = $request->header('serial-number'); - if (! $userName) { + if (! $userName || $userName == null || $userName == '') { return response()->json([ 'status_code' => 'ERROR', 'status_description' => "User name can't be empty!", @@ -1872,23 +2006,43 @@ class CharacteristicsController extends Controller $userName = 'Admin'; } - if (! $plantCode || $plantCode == null || $plantCode == '') { + if ($plantCode == null || $plantCode == '' || ! $plantCode) { return response()->json([ 'status_code' => 'ERROR', 'status_description' => "Plant code can't be empty!", - ], 404); - } elseif (! is_numeric($plantCode) || Str::length($plantCode) < 4 || ! preg_match('/^[1-9]\d{3,}$/', $plantCode)) { // !ctype_digit($data['plant_code']) + ], 400); + } elseif (! is_numeric($plantCode)) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'Invalid plant code found!', - ], 404); + 'status_description' => "Plant code '{$plantCode}' should contain only numeric values!", + ], 400); + } elseif (Str::length($plantCode) < 4 || Str::length($plantCode) > 7) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Plant code '{$plantCode}' must be between 4 and 7 digits only!", + ], 400); + } elseif (! preg_match('/^[1-9]\d{3,6}$/', $plantCode)) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Invalid plant code '{$plantCode}' found!", + ], 400); } - if (! $workCenter || $workCenter == null || $workCenter == '') { + if ($workCenter == null || $workCenter == '' || ! $workCenter) { return response()->json([ 'status_code' => 'ERROR', 'status_description' => "Work center can't be empty!", ], 404); + } elseif (Str::length($workCenter) < 6) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Work center '{$workCenter}' should contain minimum 6 characters!", + ], 404); + } elseif (! ctype_alnum($workCenter)) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Work center '{$workCenter}' should contain only alpha-numeric values!", + ], 404); } if (! $modelType || $modelType == null || $modelType == '') { @@ -1896,11 +2050,6 @@ class CharacteristicsController extends Controller 'status_code' => 'ERROR', 'status_description' => "Model type can't be empty!", ], 404); - } elseif ($modelType != 'MOTOR' && $modelType != 'PUMP' && $modelType != 'NAME_PLATE' && $modelType != 'PUMPSET') { - return response()->json([ - 'status_code' => 'ERROR', - 'status_description' => 'Unknown model type found!', - ], 404); } $plant = Plant::where('code', $plantCode)->first(); @@ -1908,7 +2057,7 @@ class CharacteristicsController extends Controller if (! $plant) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Plant Code '{$plantCode}' not found!", + 'status_description' => "Plant Code '{$plantCode}' not found in plants table!", ], 404); } @@ -1921,17 +2070,17 @@ class CharacteristicsController extends Controller if (! $user) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'User name not found!', + 'status_description' => "User name '{$userName}' not found in users table!", ], 403); } elseif (! $userPlant && ! $user->hasRole('Super Admin')) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'User name not found for the plant!', + 'status_description' => "User name '{$userName}' not found for the plant code '{$plantCode}' in users table!", ], 403); } elseif (! $user->hasRole(['Super Admin', 'Laser Manager', 'Laser Supervisor', 'Laser Employee'])) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'User does not have rights!', + 'status_description' => "User '{$userName}' does not have rights!", ], 403); } @@ -1940,18 +2089,16 @@ class CharacteristicsController extends Controller if (! $work) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Work center '{$workCenter}' not found!", + 'status_description' => "Work center '{$workCenter}' not found in machines table!", ], 404); } - $machine = Machine::where('work_center', $workCenter) - ->where('plant_id', $plantId) - ->first(); + $machine = Machine::where('work_center', $workCenter)->where('plant_id', $plantId)->first(); if (! $machine) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Work center '{$workCenter}' not found for the plant code '{$plantCode}'!", + 'status_description' => "Work center '{$workCenter}' not found for the plant code '{$plantCode}' in machines table!", ], 404); } @@ -1989,9 +2136,7 @@ class CharacteristicsController extends Controller ], 404); } - $jobPlant = ClassCharacteristic::where('aufnr', $jobNumber) - ->where('plant_id', $plantId) - ->first(); + $jobPlant = ClassCharacteristic::where('aufnr', $jobNumber)->where('plant_id', $plantId)->first(); if (! $jobPlant) { return response()->json([ @@ -2000,10 +2145,7 @@ class CharacteristicsController extends Controller ], 404); } - $jobWorkCenter = ClassCharacteristic::where('aufnr', $jobNumber) - ->where('plant_id', $plantId) - ->where('machine_id', $machineId) - ->first(); + $jobWorkCenter = ClassCharacteristic::where('aufnr', $jobNumber)->where('machine_id', $machineId)->where('plant_id', $plantId)->first(); if (! $jobWorkCenter) { return response()->json([ @@ -2012,39 +2154,26 @@ class CharacteristicsController extends Controller ], 404); } - $columnsToShow = ['mark_status', 'marked_datetime', 'marked_physical_count', 'marked_expected_time', 'marked_by', 'man_marked_status', 'man_marked_datetime', 'man_marked_by', 'motor_marked_status', 'motor_marked_physical_count', 'motor_expected_time', 'motor_marked_by', 'pump_marked_status', 'pump_marked_physical_count', 'pump_expected_time', 'pump_marked_by', 'name_plate_marked_status', 'name_plate_expected_time', 'name_plate_marked_by', 'motor_pump_pumpset_status', 'winded_serial_number', 'motor_machine_name', 'pump_machine_name', 'name_plate_machine_name', 'pumpset_machine_name', 'part_validation_1', 'part_validation_2', 'samlight_logged_name', 'pending_released_status', 'has_work_flow_id']; + $columnsToShow = ['mark_status', 'marked_datetime', 'marked_physical_count', 'marked_expected_time', 'marked_by', 'man_marked_status', 'man_marked_datetime', 'man_marked_by', 'motor_marked_status', 'motor_marked_physical_count', 'motor_expected_time', 'motor_marked_by', 'pump_marked_status', 'pump_marked_physical_count', 'pump_expected_time', 'pump_marked_by', 'name_plate_marked_status', 'name_plate_expected_time', 'name_plate_marked_by', 'motor_pump_pumpset_status', 'winded_serial_number', 'motor_machine_name', 'pump_machine_name', 'name_plate_machine_name', 'part_validation_1', 'part_validation_2', 'samlight_logged_name', 'pending_released_status', 'has_work_flow_id']; - $characteristicsColumns = ['class', 'arbid', 'gamng', 'lmnga', 'zz1_cn_bill_ord', 'zmm_amps', 'zmm_brand', 'zmm_degreeofprotection', 'zmm_delivery', 'zmm_dir_rot', 'zmm_discharge', 'zmm_discharge_max', 'zmm_discharge_min', 'zmm_duty', 'zmm_eff_motor', 'zmm_eff_pump', 'zmm_frequency', 'zmm_head', 'zmm_heading', 'zmm_head_max', 'zmm_head_minimum', 'zmm_idx_eff_mtr', 'zmm_idx_eff_pump', 'zmm_kvacode', 'zmm_maxambtemp', 'zmm_mincoolingflow', 'zmm_motorseries', 'zmm_motor_model', 'zmm_outlet', 'zmm_phase', 'zmm_pressure', 'zmm_pumpflowtype', 'zmm_pumpseries', 'zmm_pump_model', 'zmm_ratedpower', 'zmm_region', 'zmm_servicefactor', 'zmm_servicefactormaximumamps', 'zmm_speed', 'zmm_suction', 'zmm_suctionxdelivery', 'zmm_supplysource', 'zmm_temperature', 'zmm_thrustload', 'zmm_volts', 'zmm_wire', 'zmm_package', 'zmm_pvarrayrating', 'zmm_isi', 'zmm_isimotor', 'zmm_isipump', 'zmm_isipumpset', 'zmm_pumpset_model', 'zmm_stages', 'zmm_headrange', 'zmm_overall_efficiency', 'zmm_connection', 'zmm_min_bore_size', 'zmm_isireference', 'zmm_category', 'zmm_submergence', 'zmm_capacitorstart', 'zmm_capacitorrun', 'zmm_inch', 'zmm_motor_type', 'zmm_dismantle_direction', 'zmm_eff_ovrall', 'zmm_bodymoc', 'zmm_rotormoc', 'zmm_dlwl', 'zmm_inputpower', 'zmm_imp_od', 'zmm_ambtemp', 'zmm_de', 'zmm_dischargerange', 'zmm_efficiency_class', 'zmm_framesize', 'zmm_impellerdiameter', 'zmm_insulationclass', 'zmm_maxflow', 'zmm_minhead', 'zmm_mtrlofconst', 'zmm_nde', 'zmm_powerfactor', 'zmm_tagno', 'zmm_year', 'zmm_laser_name', 'zmm_logo_cp', 'zmm_logo_ce', 'zmm_logo_nsf']; + $characteristicsColumns = ['class', 'arbid', 'gamng', 'lmnga', 'zz1_cn_bill_ord', 'zmm_amps', 'zmm_brand', 'zmm_degreeofprotection', 'zmm_delivery', 'zmm_dir_rot', 'zmm_discharge', 'zmm_discharge_max', 'zmm_discharge_min', 'zmm_duty', 'zmm_eff_motor', 'zmm_eff_pump', 'zmm_frequency', 'zmm_head', 'zmm_heading', 'zmm_head_max', 'zmm_head_minimum', 'zmm_idx_eff_mtr', 'zmm_idx_eff_pump', 'zmm_kvacode', 'zmm_maxambtemp', 'zmm_mincoolingflow', 'zmm_motorseries', 'zmm_motor_model', 'zmm_outlet', 'zmm_phase', 'zmm_pressure', 'zmm_pumpflowtype', 'zmm_pumpseries', 'zmm_pump_model', 'zmm_ratedpower', 'zmm_region', 'zmm_servicefactor', 'zmm_servicefactormaximumamps', 'zmm_speed', 'zmm_suction', 'zmm_suctionxdelivery', 'zmm_supplysource', 'zmm_temperature', 'zmm_thrustload', 'zmm_volts', 'zmm_wire', 'zmm_package', 'zmm_pvarrayrating', 'zmm_isi', 'zmm_isimotor', 'zmm_isipump', 'zmm_isipumpset', 'zmm_pumpset_model', 'zmm_stages', 'zmm_headrange', 'zmm_overall_efficiency', 'zmm_connection', 'zmm_min_bore_size', 'zmm_isireference', 'zmm_category', 'zmm_submergence', 'zmm_capacitorstart', 'zmm_capacitorrun', 'zmm_inch', 'zmm_motor_type', 'zmm_dismantle_direction', 'zmm_eff_ovrall', 'zmm_bodymoc', 'zmm_rotormoc', 'zmm_dlwl', 'zmm_inputpower', 'zmm_imp_od', 'zmm_ambtemp', 'zmm_de', 'zmm_dischargerange', 'zmm_efficiency_class', 'zmm_framesize', 'zmm_impellerdiameter', 'zmm_insulationclass', 'zmm_maxflow', 'zmm_minhead', 'zmm_mtrlofconst', 'zmm_nde', 'zmm_powerfactor', 'zmm_tagno', 'zmm_year', 'zmm_laser_name', 'zmm_logo_cp', 'zmm_logo_ce', 'zmm_logo_nsf', 'zmm_logo_eac', 'zmm_grwt_motor', 'zmm_grwt_pump', 'zmm_grwt_pset', 'zmm_newt_motor', 'zmm_newt_pump', 'zmm_newt_pset', 'zmm_operating_range', 'zmm_intake_air', 'zmm_oxygen_transfer_rate', 'zmm_air_inlet_pipesize', 'zmm_sump_depth', 'zmm_poles', 'zmm_motor_heading', 'zmm_motor_speed', 'zmm_beenote', 'zmm_beenumber', 'zmm_beestar', 'zmm_eff_ttl', 'zmm_labelperiod', 'zmm_modelyear', 'zmm_performance_factor', 'zqmm_qty']; - $characteristicsData = ClassCharacteristic::where('aufnr', $jobNumber) - ->where('plant_id', $plantId) - ->where('machine_id', $machineId) - // ->get(); - ->distinct() - ->get($characteristicsColumns); + $characteristicsData = ClassCharacteristic::where('aufnr', $jobNumber)->where('machine_id', $machineId)->where('plant_id', $plantId)->distinct()->get($characteristicsColumns); // ->get(); if ($characteristicsData->isEmpty()) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'No characteristics data found for the provided Plant, Work Center, and Job Number!', + 'status_description' => 'No characteristics data found for the provided Plant Code, Work Center, and Job Number!', ], 404); } - $serials = ClassCharacteristic::where('plant_id', $plantId) - ->where('machine_id', $machineId) - ->where('aufnr', $jobNumber) - ->orderBy('gernr') - // ->get(array_merge(['gernr'], $columnsToShow)); - ->get(array_merge(['gernr', 'item_id'], $columnsToShow)); + $serials = ClassCharacteristic::where('aufnr', $jobNumber)->where('machine_id', $machineId)->where('plant_id', $plantId)->orderBy('gernr')->get(array_merge(['gernr', 'item_id'], $columnsToShow)); // ->get(array_merge(['gernr'], $columnsToShow)); $itemId = $serials->first()->item_id; $itemcode = Item::where('id', $itemId)->value('code') ?? ''; - $markedSerials = ClassCharacteristic::where('plant_id', $plantId) - ->where('machine_id', $machineId) - ->where('aufnr', $jobNumber) - ->get(['gernr', 'mark_status']); + $markedSerials = ClassCharacteristic::where('aufnr', $jobNumber)->where('machine_id', $machineId)->where('plant_id', $plantId)->get(['gernr', 'mark_status']); $allMarked = $markedSerials->every(function ($serial) { return strtolower($serial->mark_status) == 'marked'; @@ -2053,30 +2182,30 @@ class CharacteristicsController extends Controller if ($allMarked) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'All serial numbers are already marked.', + 'status_description' => 'All serial numbers are already marked!', ], 404); } $serialNumbers = $serials->map(function ($serial) use ($columnsToShow) { $otherData = []; foreach ($columnsToShow as $col) { - $otherData[$col] = (string) $serial->$col ?? ''; + $otherData[strtoupper($col)] = (string) $serial->$col ?? ''; } - $otherData['marked_by'] = ($otherData['marked_by'] == 'Admin') ? 'jothi' : $otherData['marked_by'] ?? ''; - $otherData['man_marked_by'] = ($otherData['man_marked_by'] == 'Admin') ? 'jothi' : $otherData['man_marked_by'] ?? ''; - $otherData['motor_marked_by'] = ($otherData['motor_marked_by'] == 'Admin') ? 'jothi' : $otherData['motor_marked_by'] ?? ''; - $otherData['pump_marked_by'] = ($otherData['pump_marked_by'] == 'Admin') ? 'jothi' : $otherData['pump_marked_by'] ?? ''; - $otherData['name_plate_marked_by'] = ($otherData['name_plate_marked_by'] == 'Admin') ? 'jothi' : $otherData['name_plate_marked_by'] ?? ''; + $otherData['MARKED_BY'] = ($otherData['MARKED_BY'] == 'Admin') ? 'jothi' : $otherData['MARKED_BY'] ?? ''; // marked_by + $otherData['MAN_MARKED_BY'] = ($otherData['MAN_MARKED_BY'] == 'Admin') ? 'jothi' : $otherData['MAN_MARKED_BY'] ?? ''; // man_marked_by + $otherData['MOTOR_MARKED_BY'] = ($otherData['MOTOR_MARKED_BY'] == 'Admin') ? 'jothi' : $otherData['MOTOR_MARKED_BY'] ?? ''; // motor_marked_by + $otherData['PUMP_MARKED_BY'] = ($otherData['PUMP_MARKED_BY'] == 'Admin') ? 'jothi' : $otherData['PUMP_MARKED_BY'] ?? ''; // pump_marked_by + $otherData['NAME_PLATE_MARKED_BY'] = ($otherData['NAME_PLATE_MARKED_BY'] == 'Admin') ? 'jothi' : $otherData['NAME_PLATE_MARKED_BY'] ?? ''; // name_plate_marked_by // $otherData['pending_released_status'] = (string)$otherData['pending_released_status'] ?? ''; - return array_merge(['gernr' => $serial->gernr], $otherData); + return array_merge(['GERNR' => $serial->gernr], $otherData); }); $characteristics = $characteristicsData->map(function ($char) use ($characteristicsColumns) { $data = []; foreach ($characteristicsColumns as $col) { - $data[$col] = $char->$col ?? ''; + $data[strtoupper($col)] = $char->$col ?? ''; } return $data; @@ -2091,6 +2220,13 @@ class CharacteristicsController extends Controller return response()->json($response); } elseif (($itemCode != '' && $itemCode != null) || ($serialNumber != '' && $serialNumber != null)) { + if ($modelType != 'MOTOR' && $modelType != 'PUMP' && $modelType != 'NAME_PLATE') { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Unknown model type '{$modelType}' found!", + ], 404); + } + if (Str::length($serialNumber) < 9) { return response()->json([ 'status_code' => 'ERROR', @@ -2130,18 +2266,16 @@ class CharacteristicsController extends Controller if (! $item) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Item code '{$itemCode}' not found!", + 'status_description' => "Item code '{$itemCode}' not found in items table!", ], 404); } - $itemPlant = Item::where('code', $itemCode) - ->where('plant_id', $plantId) - ->first(); + $itemPlant = Item::where('code', $itemCode)->where('plant_id', $plantId)->first(); if (! $itemPlant) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Item code '{$itemCode}' not found for the plant code '{$plantCode}'!", + 'status_description' => "Item code '{$itemCode}' not found for the plant code '{$plantCode}' in items table!", ], 404); } @@ -2156,9 +2290,7 @@ class CharacteristicsController extends Controller ], 404); } - $serialExists = ClassCharacteristic::where('plant_id', $plantId) - ->where('gernr', $serialNumber) - ->first(); + $serialExists = ClassCharacteristic::where('gernr', $serialNumber)->where('plant_id', $plantId)->first(); if (! $serialExists) { return response()->json([ @@ -2167,28 +2299,21 @@ class CharacteristicsController extends Controller ], 404); } - $serialExists = ClassCharacteristic::where('plant_id', $plantId) - ->where('gernr', $serialNumber) - ->where('item_id', $itemId) - ->first(); + $serialExists = ClassCharacteristic::where('gernr', $serialNumber)->where('item_id', $itemId)->where('plant_id', $plantId)->first(); if (! $serialExists) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Serial number '{$serialNumber}' with item code '{$itemCode}' not found for plant code '{$plantCode}'!", + 'status_description' => "Serial number '{$serialNumber}' not found with the item code '{$itemCode}'!", ], 404); } - $serialExists = ClassCharacteristic::where('plant_id', $plantId) - ->where('machine_id', $machineId) - ->where('gernr', $serialNumber) - ->where('item_id', $itemId) - ->first(); + $serialExists = ClassCharacteristic::where('gernr', $serialNumber)->where('item_id', $itemId)->where('machine_id', $machineId)->where('plant_id', $plantId)->first(); if (! $serialExists) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Serial number '{$serialNumber}' with item code '{$itemCode}' not found for work center '{$workCenter}'!", + 'status_description' => "Serial number '{$serialNumber}' not found for work center '{$workCenter}'!", ], 404); } @@ -2200,30 +2325,28 @@ class CharacteristicsController extends Controller if (! $stick) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Item code '{$itemCode}' not found in sticker master!", + 'status_description' => "Item code '{$itemCode}' not found in sticker masters table!", ], 404); } - $stickPlant = StickerMaster::where('item_id', $itemId) - ->where('plant_id', $plantId) - ->first(); + $stickPlant = StickerMaster::where('item_id', $itemId)->where('plant_id', $plantId)->first(); if (! $stickPlant) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Item code '{$itemCode}' not found in sticker master for the plant code '{$plantCode}'!", + 'status_description' => "Item code '{$itemCode}' not found for the plant code '{$plantCode}' in sticker masters table!", ], 404); } else { $curMvhs = trim($stickPlant?->laser_part_validation2); if ($curMvhs == null || $curMvhs == '' || ! is_numeric($curMvhs) || Str::length($curMvhs) <= 0) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'Invalid MVHS master count found in sticker master!', + 'status_description' => 'Invalid MVHS master count found in sticker masters table!', ], 404); } elseif (! preg_match('/^[1-9]$/', $curMvhs)) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'The MVHS master count should be between 1 to 9.', // "MVHS master count '{$curMvhs}' should contain only numeric values between 1 to 9!" + 'status_description' => 'The MVHS master count should be between 1 to 9!', // "MVHS master count '{$curMvhs}' should contain only numeric values between 1 to 9!" ], 404); } } @@ -2239,11 +2362,11 @@ class CharacteristicsController extends Controller 'status_code' => 'ERROR', 'status_description' => "Serial number '{$serialNumber}' doesn't have motor model to proceed!", ], 404); - } elseif ($modelType == 'PUMPSET') { - return response()->json([ - 'status_code' => 'ERROR', - 'status_description' => "Serial number '{$serialNumber}' doesn't have pumpset model to proceed!", - ], 404); + // } elseif ($modelType == 'PUMPSET') { + // return response()->json([ + // 'status_code' => 'ERROR', + // 'status_description' => "Serial number '{$serialNumber}' doesn't have pumpset model to proceed!", + // ], 404); } } elseif (Str::contains($curHead, 'MOTOR', ignoreCase: true)) { if ($modelType == 'PUMP') { @@ -2251,11 +2374,11 @@ class CharacteristicsController extends Controller 'status_code' => 'ERROR', 'status_description' => "Serial number '{$serialNumber}' doesn't have pump model to proceed!", ], 404); - } elseif ($modelType == 'PUMPSET') { - return response()->json([ - 'status_code' => 'ERROR', - 'status_description' => "Serial number '{$serialNumber}' doesn't have pumpset model to proceed!", - ], 404); + // } elseif ($modelType == 'PUMPSET') { + // return response()->json([ + // 'status_code' => 'ERROR', + // 'status_description' => "Serial number '{$serialNumber}' doesn't have pumpset model to proceed!", + // ], 404); } } elseif (! Str::contains($curHead, 'PUMPSET', ignoreCase: true)) { return response()->json([ @@ -2285,11 +2408,11 @@ class CharacteristicsController extends Controller 'status_code' => 'ERROR', 'status_description' => "Name plate serial number '{$serialNumber}' doesn't marked in auto mode!", ], 404); - } elseif ($modelType == 'PUMPSET' && $curMarkStat != 'Marked') { - return response()->json([ - 'status_code' => 'ERROR', - 'status_description' => "Pumpset serial number '{$serialNumber}' doesn't marked in auto mode!", - ], 404); + // } elseif ($modelType == 'PUMPSET' && $curMarkStat != 'Marked') { + // return response()->json([ + // 'status_code' => 'ERROR', + // 'status_description' => "Pumpset serial number '{$serialNumber}' doesn't marked in auto mode!", + // ], 404); } if ($serialExists->mark_status != 'Marked' && $serialExists->motor_marked_status != 'Marked' && $serialExists->pump_marked_status != 'Marked') { @@ -2300,15 +2423,9 @@ class CharacteristicsController extends Controller ], 404); } - $characteristicsData = ClassCharacteristic::where('plant_id', $plantId) - ->where('machine_id', $machineId) - ->where('gernr', $serialNumber) - ->where('item_id', $itemId) - ->get(); + $characteristicsData = ClassCharacteristic::where('gernr', $serialNumber)->where('item_id', $itemId)->where('machine_id', $machineId)->where('plant_id', $plantId)->get(); - $remFields = [ - 'id', 'plant_id', 'machine_id', 'item_id', 'gernr', 'zmm_beenote', 'zmm_beenumber', 'zmm_beestar', 'zmm_codeclass', 'zmm_colour', 'zmm_grade', 'zmm_grwt_pset', 'zmm_grwt_cable', 'zmm_grwt_motor', 'zmm_grwt_pf', 'zmm_grwt_pump', 'zmm_isivalve', 'zmm_isi_wc', 'zmm_labelperiod', 'zmm_length', 'zmm_license_cml_no', 'zmm_mfgmonyr', 'zmm_modelyear', 'zmm_motoridentification', 'zmm_newt_pset', 'zmm_newt_cable', 'zmm_newt_motor', 'zmm_newt_pf', 'zmm_newt_pump', 'zmm_packtype', 'zmm_panel', 'zmm_performance_factor', 'zmm_pumpidentification', 'zmm_psettype', 'zmm_size', 'zmm_eff_ttl', 'zmm_type', 'zmm_usp', 'created_at', 'updated_at', 'created_by', 'updated_by', 'deleted_at', - ]; + $remFields = ['id', 'plant_id', 'machine_id', 'item_id', 'gernr', 'zmm_codeclass', 'zmm_colour', 'zmm_grade', 'zmm_grwt_cable', 'zmm_grwt_pf', 'zmm_isivalve', 'zmm_isi_wc', 'zmm_length', 'zmm_license_cml_no', 'zmm_mfgmonyr', 'zmm_motoridentification', 'zmm_newt_cable', 'zmm_newt_pf', 'zmm_packtype', 'zmm_panel', 'zmm_pumpidentification', 'zmm_psettype', 'zmm_size', 'zmm_type', 'zmm_usp', 'created_at', 'updated_at', 'created_by', 'updated_by', 'deleted_at']; $filteredData = $characteristicsData->map(function ($char) use ($remFields) { $charArray = $char->toArray(); @@ -2342,7 +2459,8 @@ class CharacteristicsController extends Controller } } - return $charArray; + // return $charArray; + return array_change_key_case($charArray, CASE_UPPER); }); // $response = [ @@ -2381,31 +2499,51 @@ class CharacteristicsController extends Controller $serialNumber = $request->header('serial-number'); - if (! $userName) { + if (! $userName || $userName == null || $userName == '') { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "User Name can't be empty!", + 'status_description' => "User name can't be empty!", ], 404); } elseif ($userName == 'jothi') { $userName = 'Admin'; } - if (! $plantCode || $plantCode == null || $plantCode == '') { + if ($plantCode == null || $plantCode == '' || ! $plantCode) { return response()->json([ 'status_code' => 'ERROR', 'status_description' => "Plant code can't be empty!", - ], 404); - } elseif (! is_numeric($plantCode) || Str::length($plantCode) < 4 || ! preg_match('/^[1-9]\d{3,}$/', $plantCode)) { // !ctype_digit($data['plant_code']) + ], 400); + } elseif (! is_numeric($plantCode)) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'Invalid plant code found!', - ], 404); + 'status_description' => "Plant code '{$plantCode}' should contain only numeric values!", + ], 400); + } elseif (Str::length($plantCode) < 4 || Str::length($plantCode) > 7) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Plant code '{$plantCode}' must be between 4 and 7 digits only!", + ], 400); + } elseif (! preg_match('/^[1-9]\d{3,6}$/', $plantCode)) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Invalid plant code '{$plantCode}' found!", + ], 400); } - if (! $workCenter || $workCenter == null || $workCenter == '') { + if ($workCenter == null || $workCenter == '' || ! $workCenter) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Work Center can't be empty!", + 'status_description' => "Work center can't be empty!", + ], 404); + } elseif (Str::length($workCenter) < 6) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Work center '{$workCenter}' should contain minimum 6 characters!", + ], 404); + } elseif (! ctype_alnum($workCenter)) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Work center '{$workCenter}' should contain only alpha-numeric values!", ], 404); } @@ -2414,7 +2552,7 @@ class CharacteristicsController extends Controller if (! $plant) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Plant Code '{$plantCode}' not found!", + 'status_description' => "Plant code '{$plantCode}' not found in plants table!", ], 404); } @@ -2427,17 +2565,17 @@ class CharacteristicsController extends Controller if (! $user) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'User Name not found!', + 'status_description' => "User name '{$userName}' not found in users table!", ], 403); } elseif (! $userPlant && ! $user->hasRole('Super Admin')) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'User Name not found for the plant!', + 'status_description' => "User name '{$userName}' not found for the plant code '{$plantCode}' in users table!", ], 403); } elseif (! $user->hasRole(['Super Admin', 'Laser Manager', 'Laser Supervisor', 'Laser Employee'])) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'User does not have rights!', + 'status_description' => "User '{$userName}' does not have rights!", ], 403); } @@ -2446,7 +2584,7 @@ class CharacteristicsController extends Controller if (! $work) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Work Center '{$workCenter}' not found!", + 'status_description' => "Work center '{$workCenter}' not found in machines table!", ], 404); } @@ -2455,7 +2593,7 @@ class CharacteristicsController extends Controller if (! $machine) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Work Center '{$workCenter}' not found for the plant code '{$plantCode}'!", + 'status_description' => "Work center '{$workCenter}' not found for the plant code '{$plantCode}' in machines table!", ], 404); } @@ -2489,13 +2627,11 @@ class CharacteristicsController extends Controller if (! $job) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Job number '{$jobNumber}' not found!", + 'status_description' => "Job number '{$jobNumber}' not found!", // skip ], 404); } - $jobPlant = ClassCharacteristic::where('aufnr', $jobNumber) - ->where('plant_id', $plantId) - ->first(); + $jobPlant = ClassCharacteristic::where('aufnr', $jobNumber)->where('plant_id', $plantId)->first(); if (! $jobPlant) { return response()->json([ @@ -2504,10 +2640,7 @@ class CharacteristicsController extends Controller ], 404); } - $jobWorkCenter = ClassCharacteristic::where('aufnr', $jobNumber) - ->where('plant_id', $plantId) - ->where('machine_id', $machineId) - ->first(); + $jobWorkCenter = ClassCharacteristic::where('aufnr', $jobNumber)->where('machine_id', $machineId)->where('plant_id', $plantId)->first(); if (! $jobWorkCenter) { return response()->json([ @@ -2527,7 +2660,7 @@ class CharacteristicsController extends Controller if (! $stick) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Item code '{$itemCode}' not found in sticker master!", + 'status_description' => "Item code '{$itemCode}' not found in sticker masters table!", ], 404); } @@ -2536,57 +2669,44 @@ class CharacteristicsController extends Controller if (! $stickPlant) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Item code '{$itemCode}' not found in sticker master for the plant code '{$plantCode}'!", + 'status_description' => "Item code '{$itemCode}' not found for the plant code '{$plantCode}' in sticker masters table!", ], 404); } else { $curMvhs = trim($stickPlant?->laser_part_validation2); if ($curMvhs == null || $curMvhs == '' || ! is_numeric($curMvhs) || Str::length($curMvhs) <= 0) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'Invalid MVHS master count found in sticker master!', + 'status_description' => 'Invalid MVHS master count found in sticker masters table!', ], 404); } elseif (! preg_match('/^[1-9]$/', $curMvhs)) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'The MVHS master count should be between 1 to 9.', + 'status_description' => 'The MVHS master count should be between 1 to 9!', ], 404); } } } } - // $columnsToShow = ['mark_status', 'marked_datetime', 'marked_physical_count', 'marked_expected_time', 'marked_by', 'man_marked_status', 'man_marked_datetime', 'man_marked_by', 'motor_marked_status', 'motor_marked_physical_count', 'motor_expected_time', 'motor_marked_by', 'pump_marked_status', 'pump_marked_physical_count', 'pump_expected_time', 'pump_marked_by', 'name_plate_marked_status', 'name_plate_expected_time', 'name_plate_marked_by', 'motor_pump_pumpset_status', 'winded_serial_number', 'motor_machine_name', 'pump_machine_name', 'name_plate_machine_name', 'pumpset_machine_name', 'part_validation_1', 'part_validation_2', 'samlight_logged_name', 'pending_released_status', 'has_work_flow_id']; + // $columnsToShow = ['mark_status', 'marked_datetime', 'marked_physical_count', 'marked_expected_time', 'marked_by', 'man_marked_status', 'man_marked_datetime', 'man_marked_by', 'motor_marked_status', 'motor_marked_physical_count', 'motor_expected_time', 'motor_marked_by', 'pump_marked_status', 'pump_marked_physical_count', 'pump_expected_time', 'pump_marked_by', 'name_plate_marked_status', 'name_plate_expected_time', 'name_plate_marked_by', 'motor_pump_pumpset_status', 'winded_serial_number', 'motor_machine_name', 'pump_machine_name', 'name_plate_machine_name', 'part_validation_1', 'part_validation_2', 'samlight_logged_name', 'pending_released_status', 'has_work_flow_id']; - $characteristicsColumns = ['class', 'arbid', 'gamng', 'lmnga', 'zz1_cn_bill_ord', 'zmm_amps', 'zmm_brand', 'zmm_degreeofprotection', 'zmm_delivery', 'zmm_dir_rot', 'zmm_discharge', 'zmm_discharge_max', 'zmm_discharge_min', 'zmm_duty', 'zmm_eff_motor', 'zmm_eff_pump', 'zmm_frequency', 'zmm_head', 'zmm_heading', 'zmm_head_max', 'zmm_head_minimum', 'zmm_idx_eff_mtr', 'zmm_idx_eff_pump', 'zmm_kvacode', 'zmm_maxambtemp', 'zmm_mincoolingflow', 'zmm_motorseries', 'zmm_motor_model', 'zmm_outlet', 'zmm_phase', 'zmm_pressure', 'zmm_pumpflowtype', 'zmm_pumpseries', 'zmm_pump_model', 'zmm_ratedpower', 'zmm_region', 'zmm_servicefactor', 'zmm_servicefactormaximumamps', 'zmm_speed', 'zmm_suction', 'zmm_suctionxdelivery', 'zmm_supplysource', 'zmm_temperature', 'zmm_thrustload', 'zmm_volts', 'zmm_wire', 'zmm_package', 'zmm_pvarrayrating', 'zmm_isi', 'zmm_isimotor', 'zmm_isipump', 'zmm_isipumpset', 'zmm_pumpset_model', 'zmm_stages', 'zmm_headrange', 'zmm_overall_efficiency', 'zmm_connection', 'zmm_min_bore_size', 'zmm_isireference', 'zmm_category', 'zmm_submergence', 'zmm_capacitorstart', 'zmm_capacitorrun', 'zmm_inch', 'zmm_motor_type', 'zmm_dismantle_direction', 'zmm_eff_ovrall', 'zmm_bodymoc', 'zmm_rotormoc', 'zmm_dlwl', 'zmm_inputpower', 'zmm_imp_od', 'zmm_ambtemp', 'zmm_de', 'zmm_dischargerange', 'zmm_efficiency_class', 'zmm_framesize', 'zmm_impellerdiameter', 'zmm_insulationclass', 'zmm_maxflow', 'zmm_minhead', 'zmm_mtrlofconst', 'zmm_nde', 'zmm_powerfactor', 'zmm_tagno', 'zmm_year', 'zmm_laser_name', 'zmm_logo_cp', 'zmm_logo_ce', 'zmm_logo_nsf']; + $characteristicsColumns = ['class', 'arbid', 'gamng', 'lmnga', 'zz1_cn_bill_ord', 'zmm_amps', 'zmm_brand', 'zmm_degreeofprotection', 'zmm_delivery', 'zmm_dir_rot', 'zmm_discharge', 'zmm_discharge_max', 'zmm_discharge_min', 'zmm_duty', 'zmm_eff_motor', 'zmm_eff_pump', 'zmm_frequency', 'zmm_head', 'zmm_heading', 'zmm_head_max', 'zmm_head_minimum', 'zmm_idx_eff_mtr', 'zmm_idx_eff_pump', 'zmm_kvacode', 'zmm_maxambtemp', 'zmm_mincoolingflow', 'zmm_motorseries', 'zmm_motor_model', 'zmm_outlet', 'zmm_phase', 'zmm_pressure', 'zmm_pumpflowtype', 'zmm_pumpseries', 'zmm_pump_model', 'zmm_ratedpower', 'zmm_region', 'zmm_servicefactor', 'zmm_servicefactormaximumamps', 'zmm_speed', 'zmm_suction', 'zmm_suctionxdelivery', 'zmm_supplysource', 'zmm_temperature', 'zmm_thrustload', 'zmm_volts', 'zmm_wire', 'zmm_package', 'zmm_pvarrayrating', 'zmm_isi', 'zmm_isimotor', 'zmm_isipump', 'zmm_isipumpset', 'zmm_pumpset_model', 'zmm_stages', 'zmm_headrange', 'zmm_overall_efficiency', 'zmm_connection', 'zmm_min_bore_size', 'zmm_isireference', 'zmm_category', 'zmm_submergence', 'zmm_capacitorstart', 'zmm_capacitorrun', 'zmm_inch', 'zmm_motor_type', 'zmm_dismantle_direction', 'zmm_eff_ovrall', 'zmm_bodymoc', 'zmm_rotormoc', 'zmm_dlwl', 'zmm_inputpower', 'zmm_imp_od', 'zmm_ambtemp', 'zmm_de', 'zmm_dischargerange', 'zmm_efficiency_class', 'zmm_framesize', 'zmm_impellerdiameter', 'zmm_insulationclass', 'zmm_maxflow', 'zmm_minhead', 'zmm_mtrlofconst', 'zmm_nde', 'zmm_powerfactor', 'zmm_tagno', 'zmm_year', 'zmm_laser_name', 'zmm_logo_cp', 'zmm_logo_ce', 'zmm_logo_nsf', 'zmm_logo_eac', 'zmm_grwt_motor', 'zmm_grwt_pump', 'zmm_grwt_pset', 'zmm_newt_motor', 'zmm_newt_pump', 'zmm_newt_pset', 'zmm_operating_range', 'zmm_intake_air', 'zmm_oxygen_transfer_rate', 'zmm_air_inlet_pipesize', 'zmm_sump_depth', 'zmm_poles', 'zmm_motor_heading', 'zmm_motor_speed', 'zmm_beenote', 'zmm_beenumber', 'zmm_beestar', 'zmm_eff_ttl', 'zmm_labelperiod', 'zmm_modelyear', 'zmm_performance_factor', 'zqmm_qty']; - $characteristicsData = ClassCharacteristic::where('aufnr', $jobNumber) - ->where('plant_id', $plantId) - ->where('machine_id', $machineId) - // ->get(); - ->distinct() - ->get($characteristicsColumns); + $characteristicsData = ClassCharacteristic::where('aufnr', $jobNumber)->where('machine_id', $machineId)->where('plant_id', $plantId)->distinct()->get($characteristicsColumns); // ->get(); if ($characteristicsData->isEmpty()) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'No characteristics data found for the provided Plant, Work Center, and Job Number!', + 'status_description' => 'No characteristics data found for the provided Plant Code, Work Center, and Job Number!', ], 404); } - // $serials = ClassCharacteristic::where('plant_id', $plantId) - // ->where('machine_id', $machineId) - // ->where('aufnr', $jobNumber) - // ->orderBy('gernr') - // //->get(array_merge(['gernr'], $columnsToShow)); - // ->get(array_merge(['gernr', 'item_id'], $columnsToShow)); + // $serials = ClassCharacteristic::where('aufnr', $jobNumber)->where('machine_id', $machineId)->where('plant_id', $plantId)->orderBy('gernr')->get(array_merge(['gernr', 'item_id'], $columnsToShow)); //->get(array_merge(['gernr'], $columnsToShow)); // $itemId = $serials->first()->item_id; // $itemcode = Item::where('id', $itemId)->value('code') ?? ''; - $markedSerials = ClassCharacteristic::where('plant_id', $plantId) - ->where('machine_id', $machineId) - ->where('aufnr', $jobNumber) - ->get(['gernr', 'mark_status']); + $markedSerials = ClassCharacteristic::where('aufnr', $jobNumber)->where('machine_id', $machineId)->where('plant_id', $plantId)->get(['gernr', 'mark_status']); $allMarked = $markedSerials->every(function ($serial) { return strtolower($serial->mark_status) == 'marked'; @@ -2595,12 +2715,12 @@ class CharacteristicsController extends Controller if ($allMarked) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'All serial numbers are already marked!', + 'status_description' => 'All serial numbers are already marked!', // skip ], 404); } else { return response()->json([ 'status_code' => 'SUCCESS', - 'status_description' => 'Has some pending serial numbers to mark.', + 'status_description' => 'Has some pending serial numbers to mark!', ], 200); } } elseif ((($itemCode != '' && $itemCode != null) || ($serialNumber != '' && $serialNumber != null)) && $jobNumber != '' && $jobNumber != null) { @@ -2669,13 +2789,11 @@ class CharacteristicsController extends Controller if (! $job) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Job number '{$jobNumber}' not found!", + 'status_description' => "Job number '{$jobNumber}' not found!", // skip ], 404); } - $jobPlant = ClassCharacteristic::where('aufnr', $jobNumber) - ->where('plant_id', $plantId) - ->first(); + $jobPlant = ClassCharacteristic::where('aufnr', $jobNumber)->where('plant_id', $plantId)->first(); if (! $jobPlant) { return response()->json([ @@ -2684,10 +2802,7 @@ class CharacteristicsController extends Controller ], 404); } - $jobWorkCenter = ClassCharacteristic::where('aufnr', $jobNumber) - ->where('plant_id', $plantId) - ->where('machine_id', $machineId) - ->first(); + $jobWorkCenter = ClassCharacteristic::where('aufnr', $jobNumber)->where('machine_id', $machineId)->where('plant_id', $plantId)->first(); if (! $jobWorkCenter) { return response()->json([ @@ -2701,18 +2816,16 @@ class CharacteristicsController extends Controller if (! $item) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Item code '{$itemCode}' not found!", + 'status_description' => "Item code '{$itemCode}' not found in items table!", ], 404); } - $itemPlant = Item::where('code', $itemCode) - ->where('plant_id', $plantId) - ->first(); + $itemPlant = Item::where('code', $itemCode)->where('plant_id', $plantId)->first(); if (! $itemPlant) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Item code '{$itemCode}' not found for the plant code '{$plantCode}'!", + 'status_description' => "Item code '{$itemCode}' not found for the plant code '{$plantCode}' in items table!", ], 404); } @@ -2727,9 +2840,7 @@ class CharacteristicsController extends Controller ], 404); } - $serialExists = ClassCharacteristic::where('plant_id', $plantId) - ->where('gernr', $serialNumber) - ->first(); + $serialExists = ClassCharacteristic::where('gernr', $serialNumber)->where('plant_id', $plantId)->first(); if (! $serialExists) { return response()->json([ @@ -2738,42 +2849,30 @@ class CharacteristicsController extends Controller ], 404); } - $serialExists = ClassCharacteristic::where('plant_id', $plantId) - ->where('gernr', $serialNumber) - ->where('item_id', $itemId) - ->first(); + $serialExists = ClassCharacteristic::where('gernr', $serialNumber)->where('item_id', $itemId)->where('plant_id', $plantId)->first(); if (! $serialExists) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Serial number '{$serialNumber}' with item code '{$itemCode}' not found for plant code '{$plantCode}'!", + 'status_description' => "Serial number '{$serialNumber}' not found with the item code '{$itemCode}'!", ], 404); } - $serialExists = ClassCharacteristic::where('plant_id', $plantId) - ->where('machine_id', $machineId) - ->where('gernr', $serialNumber) - ->where('item_id', $itemId) - ->first(); + $serialExists = ClassCharacteristic::where('gernr', $serialNumber)->where('item_id', $itemId)->where('machine_id', $machineId)->where('plant_id', $plantId)->first(); if (! $serialExists) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Serial number '{$serialNumber}' with item code '{$itemCode}' not found for work center '{$workCenter}'!", + 'status_description' => "Serial number '{$serialNumber}' not found for work center '{$workCenter}'!", ], 404); } - $serialExists = ClassCharacteristic::where('plant_id', $plantId) - ->where('machine_id', $machineId) - ->where('aufnr', $jobNumber) - ->where('gernr', $serialNumber) - ->where('item_id', $itemId) - ->first(); + $serialExists = ClassCharacteristic::where('gernr', $serialNumber)->where('item_id', $itemId)->where('aufnr', $jobNumber)->where('machine_id', $machineId)->where('plant_id', $plantId)->first(); if (! $serialExists) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Serial number '{$serialNumber}' with item code '{$itemCode}' not found for job number '{$jobNumber}'!", + 'status_description' => "Serial number '{$serialNumber}' not found for job number '{$jobNumber}'!", ], 404); } else { if (Str::contains($serialExists?->zmm_heading, 'PRESSURE BOOSTER SYSTEM', ignoreCase: true)) { @@ -2782,40 +2881,35 @@ class CharacteristicsController extends Controller if (! $stick) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Item code '{$itemCode}' not found in sticker master!", + 'status_description' => "Item code '{$itemCode}' not found in sticker masters table!", ], 404); } - $stickPlant = StickerMaster::where('item_id', $itemId) - ->where('plant_id', $plantId) - ->first(); + $stickPlant = StickerMaster::where('item_id', $itemId)->where('plant_id', $plantId)->first(); if (! $stickPlant) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Item code '{$itemCode}' not found in sticker master for the plant code '{$plantCode}'!", + 'status_description' => "Item code '{$itemCode}' not found for the plant code '{$plantCode}' in sticker masters table!", ], 404); } else { $curMvhs = trim($stickPlant?->laser_part_validation2); if ($curMvhs == null || $curMvhs == '' || ! is_numeric($curMvhs) || Str::length($curMvhs) <= 0) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'Invalid MVHS master count found in sticker master!', + 'status_description' => 'Invalid MVHS master count found in sticker masters table!', ], 404); } elseif (! preg_match('/^[1-9]$/', $curMvhs)) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'The MVHS master count should be between 1 to 9.', + 'status_description' => 'The MVHS master count should be between 1 to 9!', ], 404); } } } } - $markedSerials = ClassCharacteristic::where('plant_id', $plantId) - ->where('machine_id', $machineId) - ->where('aufnr', $jobNumber) - ->get(['gernr', 'mark_status']); + $markedSerials = ClassCharacteristic::where('aufnr', $jobNumber)->where('machine_id', $machineId)->where('plant_id', $plantId)->get(['gernr', 'mark_status']); $allMarked = $markedSerials->every(function ($serial) { return strtolower($serial->mark_status) == 'marked'; @@ -2824,7 +2918,7 @@ class CharacteristicsController extends Controller if ($allMarked) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'All serial numbers are already marked!', + 'status_description' => 'All serial numbers are already marked!', // skip ], 404); } @@ -2836,21 +2930,16 @@ class CharacteristicsController extends Controller // ], 404); // } - // $columnsToShow = ['mark_status', 'marked_datetime', 'marked_physical_count', 'marked_expected_time', 'marked_by', 'man_marked_status', 'man_marked_datetime', 'man_marked_by', 'motor_marked_status', 'motor_marked_physical_count', 'motor_expected_time', 'motor_marked_by', 'pump_marked_status', 'pump_marked_physical_count', 'pump_expected_time', 'pump_marked_by', 'name_plate_marked_status', 'name_plate_expected_time', 'name_plate_marked_by', 'motor_pump_pumpset_status', 'winded_serial_number', 'motor_machine_name', 'pump_machine_name', 'name_plate_machine_name', 'pumpset_machine_name', 'part_validation_1', 'part_validation_2', 'samlight_logged_name', 'pending_released_status', 'has_work_flow_id']; + // $columnsToShow = ['mark_status', 'marked_datetime', 'marked_physical_count', 'marked_expected_time', 'marked_by', 'man_marked_status', 'man_marked_datetime', 'man_marked_by', 'motor_marked_status', 'motor_marked_physical_count', 'motor_expected_time', 'motor_marked_by', 'pump_marked_status', 'pump_marked_physical_count', 'pump_expected_time', 'pump_marked_by', 'name_plate_marked_status', 'name_plate_expected_time', 'name_plate_marked_by', 'motor_pump_pumpset_status', 'winded_serial_number', 'motor_machine_name', 'pump_machine_name', 'name_plate_machine_name', 'part_validation_1', 'part_validation_2', 'samlight_logged_name', 'pending_released_status', 'has_work_flow_id']; - // $characteristicsColumns = ['class', 'arbid', 'gamng', 'lmnga', 'zz1_cn_bill_ord', 'zmm_amps', 'zmm_brand', 'zmm_degreeofprotection', 'zmm_delivery', 'zmm_dir_rot', 'zmm_discharge', 'zmm_discharge_max', 'zmm_discharge_min', 'zmm_duty', 'zmm_eff_motor', 'zmm_eff_pump', 'zmm_frequency', 'zmm_head', 'zmm_heading', 'zmm_head_max', 'zmm_head_minimum', 'zmm_idx_eff_mtr', 'zmm_idx_eff_pump', 'zmm_kvacode', 'zmm_maxambtemp', 'zmm_mincoolingflow', 'zmm_motorseries', 'zmm_motor_model', 'zmm_outlet', 'zmm_phase', 'zmm_pressure', 'zmm_pumpflowtype', 'zmm_pumpseries', 'zmm_pump_model', 'zmm_ratedpower', 'zmm_region', 'zmm_servicefactor', 'zmm_servicefactormaximumamps', 'zmm_speed', 'zmm_suction', 'zmm_suctionxdelivery', 'zmm_supplysource', 'zmm_temperature', 'zmm_thrustload', 'zmm_volts', 'zmm_wire', 'zmm_package', 'zmm_pvarrayrating', 'zmm_isi', 'zmm_isimotor', 'zmm_isipump', 'zmm_isipumpset', 'zmm_pumpset_model', 'zmm_stages', 'zmm_headrange', 'zmm_overall_efficiency', 'zmm_connection', 'zmm_min_bore_size', 'zmm_isireference', 'zmm_category', 'zmm_submergence', 'zmm_capacitorstart', 'zmm_capacitorrun', 'zmm_inch', 'zmm_motor_type', 'zmm_dismantle_direction', 'zmm_eff_ovrall', 'zmm_bodymoc', 'zmm_rotormoc', 'zmm_dlwl', 'zmm_inputpower', 'zmm_imp_od', 'zmm_ambtemp', 'zmm_de', 'zmm_dischargerange', 'zmm_efficiency_class', 'zmm_framesize', 'zmm_impellerdiameter', 'zmm_insulationclass', 'zmm_maxflow', 'zmm_minhead', 'zmm_mtrlofconst', 'zmm_nde', 'zmm_powerfactor', 'zmm_tagno', 'zmm_year', 'zmm_laser_name', 'zmm_logo_cp', 'zmm_logo_ce', 'zmm_logo_nsf', 'zmm_beenote', 'zmm_beenumber', 'zmm_beestar', 'zmm_codeclass', 'zmm_colour', 'zmm_grade', 'zmm_grwt_pset', 'zmm_grwt_cable', 'zmm_grwt_motor', 'zmm_grwt_pf', 'zmm_grwt_pump', 'zmm_isivalve', 'zmm_isi_wc', 'zmm_labelperiod', 'zmm_length', 'zmm_license_cml_no', 'zmm_mfgmonyr', 'zmm_modelyear', 'zmm_motoridentification', 'zmm_newt_pset', 'zmm_newt_cable', 'zmm_newt_motor', 'zmm_newt_pf', 'zmm_newt_pump', 'zmm_packtype', 'zmm_panel', 'zmm_performance_factor', 'zmm_pumpidentification', 'zmm_psettype', 'zmm_size', 'zmm_eff_ttl', 'zmm_type', 'zmm_usp']; + // $characteristicsColumns = ['class', 'arbid', 'gamng', 'lmnga', 'zz1_cn_bill_ord', 'zmm_amps', 'zmm_brand', 'zmm_degreeofprotection', 'zmm_delivery', 'zmm_dir_rot', 'zmm_discharge', 'zmm_discharge_max', 'zmm_discharge_min', 'zmm_duty', 'zmm_eff_motor', 'zmm_eff_pump', 'zmm_frequency', 'zmm_head', 'zmm_heading', 'zmm_head_max', 'zmm_head_minimum', 'zmm_idx_eff_mtr', 'zmm_idx_eff_pump', 'zmm_kvacode', 'zmm_maxambtemp', 'zmm_mincoolingflow', 'zmm_motorseries', 'zmm_motor_model', 'zmm_outlet', 'zmm_phase', 'zmm_pressure', 'zmm_pumpflowtype', 'zmm_pumpseries', 'zmm_pump_model', 'zmm_ratedpower', 'zmm_region', 'zmm_servicefactor', 'zmm_servicefactormaximumamps', 'zmm_speed', 'zmm_suction', 'zmm_suctionxdelivery', 'zmm_supplysource', 'zmm_temperature', 'zmm_thrustload', 'zmm_volts', 'zmm_wire', 'zmm_package', 'zmm_pvarrayrating', 'zmm_isi', 'zmm_isimotor', 'zmm_isipump', 'zmm_isipumpset', 'zmm_pumpset_model', 'zmm_stages', 'zmm_headrange', 'zmm_overall_efficiency', 'zmm_connection', 'zmm_min_bore_size', 'zmm_isireference', 'zmm_category', 'zmm_submergence', 'zmm_capacitorstart', 'zmm_capacitorrun', 'zmm_inch', 'zmm_motor_type', 'zmm_dismantle_direction', 'zmm_eff_ovrall', 'zmm_bodymoc', 'zmm_rotormoc', 'zmm_dlwl', 'zmm_inputpower', 'zmm_imp_od', 'zmm_ambtemp', 'zmm_de', 'zmm_dischargerange', 'zmm_efficiency_class', 'zmm_framesize', 'zmm_impellerdiameter', 'zmm_insulationclass', 'zmm_maxflow', 'zmm_minhead', 'zmm_mtrlofconst', 'zmm_nde', 'zmm_powerfactor', 'zmm_tagno', 'zmm_year', 'zmm_laser_name', 'zmm_logo_cp', 'zmm_logo_ce', 'zmm_logo_nsf', 'zmm_logo_eac', 'zmm_beenote', 'zmm_beenumber', 'zmm_beestar', 'zmm_codeclass', 'zmm_colour', 'zmm_grade', 'zmm_grwt_pset', 'zmm_grwt_cable', 'zmm_grwt_motor', 'zmm_grwt_pf', 'zmm_grwt_pump', 'zmm_isivalve', 'zmm_isi_wc', 'zmm_labelperiod', 'zmm_length', 'zmm_license_cml_no', 'zmm_mfgmonyr', 'zmm_modelyear', 'zmm_motoridentification', 'zmm_newt_pset', 'zmm_newt_cable', 'zmm_newt_motor', 'zmm_newt_pf', 'zmm_newt_pump', 'zmm_packtype', 'zmm_panel', 'zmm_performance_factor', 'zmm_pumpidentification', 'zmm_psettype', 'zmm_size', 'zmm_eff_ttl', 'zmm_type', 'zmm_usp', 'zmm_operating_range', 'zmm_intake_air', 'zmm_oxygen_transfer_rate', 'zmm_air_inlet_pipesize', 'zmm_sump_depth', 'zmm_poles', 'zmm_motor_heading', 'zmm_motor_speed', 'zqmm_qty']; - // $characteristicsData = ClassCharacteristic::where('aufnr', $jobNumber) - // ->where('plant_id', $plantId) - // ->where('machine_id', $machineId) - // //->get(); - // ->distinct() - // ->get($characteristicsColumns); + // $characteristicsData = ClassCharacteristic::where('aufnr', $jobNumber)->where('machine_id', $machineId)->where('plant_id', $plantId)->distinct()->get($characteristicsColumns); // ->get(); // if ($characteristicsData->isEmpty()) { // return response()->json([ // 'status_code' => "ERROR", - // 'status_description' => 'No characteristics data found for the provided Plant, Work Center, and Job Number!' + // 'status_description' => 'No characteristics data found for the provided Plant Code, Work Center, and Job Number!' // ], 404); // } @@ -2880,7 +2969,6 @@ class CharacteristicsController extends Controller 'MOTOR_MACHINE_NAME' => $serialExists->motor_machine_name ?? '', 'PUMP_MACHINE_NAME' => $serialExists->pump_machine_name ?? '', 'NAME_PLATE_MACHINE_NAME' => $serialExists->name_plate_machine_name ?? '', - 'PUMPSET_MACHINE_NAME' => $serialExists->pumpset_machine_name ?? '', 'PART_VALIDATION_1' => $serialExists->part_validation_1 ?? '', 'PART_VALIDATION_2' => $serialExists->part_validation_2 ?? '', 'PENDING_RELEASED_STATUS' => (string) $serialExists->pending_released_status ?? '0', @@ -2909,36 +2997,66 @@ class CharacteristicsController extends Controller $lineName = $request->header('line-name'); $workCenter = $request->header('work-center'); - if ($plantCode == null || $plantCode == '') { + if ($plantCode == null || $plantCode == '' || ! $plantCode) { return response()->json([ 'status_code' => 'ERROR', 'status_description' => "Plant code can't be empty!", - ], 404); - } elseif (Str::length($plantCode) < 4 || ! is_numeric($plantCode) || ! preg_match('/^[1-9]\d{3,}$/', $plantCode)) { + ], 400); + } elseif (! is_numeric($plantCode)) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'Invalid plant code found!', - ], 404); - } elseif ($itemCode == null || $itemCode == '') { + 'status_description' => "Plant code '{$plantCode}' should contain only numeric values!", + ], 400); + } elseif (Str::length($plantCode) < 4 || Str::length($plantCode) > 7) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Item Code can't be empty!", - ], 404); - } elseif (Str::length($itemCode) < 6 || ! ctype_alnum($itemCode)) { + 'status_description' => "Plant code '{$plantCode}' must be between 4 and 7 digits only!", + ], 400); + } elseif (! preg_match('/^[1-9]\d{3,6}$/', $plantCode)) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'Invalid item code found!', + 'status_description' => "Invalid plant code '{$plantCode}' found!", + ], 400); + } elseif ($itemCode == null || $itemCode == '' || ! $itemCode) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Item code can't be empty!", ], 404); - } elseif ($lineName == null || $lineName == '') { + } elseif (Str::length($itemCode) < 6) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Item code '{$itemCode}' should contain minimum 6 digits!", + ], 404); + } elseif (! ctype_alnum($itemCode)) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Item code '{$itemCode}' should contain only alpha-numeric values!", + ], 404); + } elseif (! preg_match('/^[a-zA-Z1-9][a-zA-Z0-9]{5,}$/', $itemCode)) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Item code '{$itemCode}' should not begin with '0'!", + ], 404); + } elseif ($lineName == null || $lineName == '' || ! $lineName) { return response()->json([ 'status_code' => 'ERROR', 'status_description' => "Line name can't be empty!", ], 404); - } elseif ($workCenter == null || $workCenter == '') { + } elseif ($workCenter == null || $workCenter == '' || ! $workCenter) { return response()->json([ 'status_code' => 'ERROR', 'status_description' => "Work center can't be empty!", ], 404); + } elseif (Str::length($workCenter) < 6) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Work center '{$workCenter}' should contain minimum 6 characters!", + ], 404); + } elseif (! ctype_alnum($workCenter)) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Work center '{$workCenter}' should contain only alpha-numeric values!", + ], 404); } $plant = Plant::where('code', $plantCode)->first(); @@ -2946,47 +3064,48 @@ class CharacteristicsController extends Controller if (! $plant) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'Plant not found!', + 'status_description' => "Plant code '{$plantCode}' not found in plants table!", ], 404); } $plantId = $plant->id; + $plantName = $plant->name; $item = Item::where('code', $itemCode)->first(); if (! $item) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'Item Code not found in item table!', + 'status_description' => "Item Code '{$itemCode}' not found in items table!", ], 404); } - $item = Item::where('plant_id', $plantId)->where('code', $itemCode)->first(); + $item = Item::where('code', $itemCode)->where('plant_id', $plantId)->first(); if (! $item) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Item Code not found in item table for the plant : '$plant->name'!", + 'status_description' => "Item Code '{$itemCode}' not found for the plant name '{$plantName}' in items table!", ], 404); } - $ItemId = $item->id; + $itemId = $item->id; $line = Line::where('name', $lineName)->first(); if (! $line) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'Line not found in lines table!', + 'status_description' => "Line name '{$lineName}' not found in lines table!", ], 404); } - $line = Line::where('plant_id', $plantId)->where('name', $lineName)->first(); + $line = Line::where('name', $lineName)->where('plant_id', $plantId)->first(); if (! $line) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Line Name not found in lines table for the plant : '$plant->name'!", + 'status_description' => "Line name '{$lineName}' not found for the plant name '{$plantName}' in lines table!", ], 404); } @@ -2997,25 +3116,25 @@ class CharacteristicsController extends Controller if (! $machine) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'Work Center not found in machines table!', + 'status_description' => "Work center '{$workCenter}' not found in machines table!", ], 404); } - $machine = Machine::where('plant_id', $plantId)->where('work_center', $workCenter)->first(); + $machine = Machine::where('work_center', $workCenter)->where('plant_id', $plantId)->first(); if (! $machine) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Work center not found in machines table for the plant : '$plant->name'!", + 'status_description' => "Work center '{$workCenter}' not found for the plant name '{$plantName}' in machines table!", ], 404); } - $machine = Machine::where('plant_id', $plantId)->where('line_id', $lineId)->where('work_center', $workCenter)->first(); + $machine = Machine::where('line_id', $lineId)->where('work_center', $workCenter)->where('plant_id', $plantId)->first(); if (! $machine) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'Work center is not mapped for the given line!', + 'status_description' => "Work center '{$workCenter}' is not mapped for the given line name '{$lineName}' in machines table!", ], 404); } @@ -3027,16 +3146,16 @@ class CharacteristicsController extends Controller // $category = $item ? $item->category : ''; - $charMasters = ProductCharacteristicsMaster::with('workGroupMaster')->where('plant_id', $plantId)->where('item_id', $ItemId)->where('line_id', $lineId)->where('machine_id', $machineId)->get(); // ->select(['name', 'characteristics_type', 'inspection_type', 'lower', 'middle', 'upper', 'work_group_master_id']) + $charMasters = ProductCharacteristicsMaster::with('workGroupMaster')->where('item_id', $itemId)->where('line_id', $lineId)->where('machine_id', $machineId)->where('plant_id', $plantId)->get(); // ->select(['name', 'characteristics_type', 'inspection_type', 'lower', 'middle', 'upper', 'work_group_master_id']) if ($charMasters->count() <= 0) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Characteristics not found in product master table for the plant : '$plant->name'!", + 'status_description' => "Characteristics not found for the plant name '{$plantName}' in product master table!", ], 404); } else { if ($charMasters->count() == 1) { - $charMasters = ProductCharacteristicsMaster::with('workGroupMaster')->where('plant_id', $plantId)->where('item_id', $ItemId)->where('line_id', $lineId)->where('machine_id', $machineId)->first(); + $charMasters = ProductCharacteristicsMaster::with('workGroupMaster')->where('item_id', $itemId)->where('line_id', $lineId)->where('machine_id', $machineId)->where('plant_id', $plantId)->first(); // $workGroup = WorkGroupMaster::find($charMasters->work_group_master_id); // $workGroupName = $workGroup?->name ?? ''; @@ -3093,25 +3212,36 @@ class CharacteristicsController extends Controller return response()->json([ 'status_code' => 'ERROR', 'status_description' => "Plant code can't be empty!", - ], 404); - } elseif (! is_numeric($plantCode) || Str::length($plantCode) < 4 || ! preg_match('/^[1-9]\d{3,}$/', $plantCode)) { // !ctype_digit($data['plant_code']) + ], 400); + } elseif (! is_numeric($plantCode)) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'Invalid plant code found!', - ], 404); + 'status_description' => "Plant code '{$plantCode}' should contain only numeric values!", + ], 400); + } elseif (Str::length($plantCode) < 4 || Str::length($plantCode) > 7) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Plant code '{$plantCode}' must be between 4 and 7 digits only!", + ], 400); + } elseif (! preg_match('/^[1-9]\d{3,6}$/', $plantCode)) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Invalid plant code '{$plantCode}' found!", + ], 400); } $plant = Plant::where('code', $plantCode)->first(); if (! $plant) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Plant code '{$plantCode}' not found!", + 'status_description' => "Plant code '{$plantCode}' not found in plants table!", ], 404); } $plantId = $plant->id; + $plantName = $plant->name; - if ($lineName == null || $lineName == '') { + if ($lineName == null || $lineName == '' || ! $lineName) { return response()->json([ 'status_code' => 'ERROR', 'status_description' => "Line name can't be empty!", @@ -3122,21 +3252,21 @@ class CharacteristicsController extends Controller if (! $line) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Line '{$lineName}' not found!", + 'status_description' => "Line '{$lineName}' not found in lines table!", ], 404); } - $line = Line::where('plant_id', $plantId)->where('name', $lineName)->first(); + $line = Line::where('name', $lineName)->where('plant_id', $plantId)->first(); if (! $line) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Line '{$lineName}' not found against plant code '$plantCode'!", + 'status_description' => "Line '{$lineName}' not found for the plant name '{$plantName}' in lines table!", ], 404); } $lineId = $line->id; - if ($itemCode == null || $itemCode == '') { + if ($itemCode == null || $itemCode == '' || ! $itemCode) { return response()->json([ 'status_code' => 'ERROR', 'status_description' => "Item code can't be empty!", @@ -3147,48 +3277,58 @@ class CharacteristicsController extends Controller if (! $item) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Item Code '{$itemCode}' not found!", + 'status_description' => "Item Code '{$itemCode}' not found in items table!", ], 404); } - $item = Item::where('plant_id', $plantId)->where('code', $itemCode)->first(); + $item = Item::where('code', $itemCode)->where('plant_id', $plantId)->first(); if (! $item) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Item code '{$itemCode}' not found against plant code '$plantCode'!", + 'status_description' => "Item code '{$itemCode}' not found for the plant name '{$plantName}' in items table!", ], 404); } $itemId = $item->id; - if ($workCenter == null || $workCenter == '') { + if ($workCenter == null || $workCenter == '' || ! $workCenter) { return response()->json([ 'status_code' => 'ERROR', 'status_description' => "Work center can't be empty!", ], 404); + } elseif (Str::length($workCenter) < 6) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Work center '{$workCenter}' should contain minimum 6 characters!", + ], 404); + } elseif (! ctype_alnum($workCenter)) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Work center '{$workCenter}' should contain only alpha-numeric values!", + ], 404); } $machine = Machine::where('work_center', $workCenter)->first(); if (! $machine) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Work center '{$workCenter}' not found!", + 'status_description' => "Work center '{$workCenter}' not found in machines table!", ], 404); } - $machine = Machine::where('plant_id', $plantId)->where('work_center', $workCenter)->first(); + $machine = Machine::where('work_center', $workCenter)->where('plant_id', $plantId)->first(); if (! $machine) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Work center '{$workCenter}' not found against plant code '$plantCode'!", + 'status_description' => "Work center '{$workCenter}' not found for the plant name '{$plantName}' in machines table!", ], 404); } - $machine = Machine::where('plant_id', $plantId)->where('line_id', $lineId)->where('work_center', $workCenter)->first(); + $machine = Machine::where('line_id', $lineId)->where('work_center', $workCenter)->where('plant_id', $plantId)->first(); if (! $machine) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Work center '{$workCenter}' not found against plant code '$plantCode' and line name '$lineName'!", + 'status_description' => "Work center '{$workCenter}' is not mapped for the given line name '{$lineName}' in machines table!", ], 404); } @@ -3210,7 +3350,7 @@ class CharacteristicsController extends Controller } elseif (Str::length($processOrder) < 9) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'Process order should contain minimum 9 digits!', + 'status_description' => "Process order '{$processOrder}' should contain minimum 9 digits!", ], 404); } @@ -3222,7 +3362,7 @@ class CharacteristicsController extends Controller } elseif (! is_numeric($coilNo)) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'Coil number should contain only numeric values!', + 'status_description' => "Coil number '{$coilNo}' should contain only numeric values!", ], 404); } elseif (Str::length($coilNo) > 1 && ! Str::contains($coilNo, '.') && ! preg_match('/^[1-9][0-9]*$/', $coilNo)) { return response()->json([ @@ -3257,27 +3397,21 @@ class CharacteristicsController extends Controller ], 404); } - $existing = CharacteristicValue::where('plant_id', $plantId) - ->where('process_order', $processOrder) - ->where('item_id', '!=', $itemId) - ->first(); + $existing = CharacteristicValue::where('process_order', $processOrder)->where('item_id', '!=', $itemId)->where('plant_id', $plantId)->first(); if ($existing) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Process order '{$processOrder}' already has item_code '{$existing->item->code}' for the plant code '{$plantCode}'!", + 'status_description' => "Process order '{$processOrder}' already has item_code '{$existing->item->code}' for the plant name '{$plantName}'!", ], 404); } - $existing = CharacteristicValue::where('plant_id', $plantId) - ->where('process_order', $processOrder) - ->where('coil_number', $coilNo) - ->first(); + $existing = CharacteristicValue::where('process_order', $processOrder)->where('coil_number', $coilNo)->where('plant_id', $plantId)->first(); if ($existing) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Process order '{$processOrder}' with coil number '{$coilNo}' already exist for the plant code '{$plantCode}'!", + 'status_description' => "Process order '{$processOrder}' with coil number '{$coilNo}' already exist for the plant name '{$plantName}'!", ], 404); } @@ -3327,6 +3461,7 @@ class CharacteristicsController extends Controller $charField = $request->header('characteristic-field'); + $file = $request->file('file'); $json = $request->input('data'); $data = json_decode($json, true); @@ -3336,12 +3471,15 @@ class CharacteristicsController extends Controller $jobNo = $data['aufnr'] ?? ''; $itemCode = $data['item_code'] ?? ''; $characteristics = $data['requested_characteristics'] ?? []; + $templateCharacteristics = $data['template_characteristics'] ?? []; // $requested = $data['requested_characteristics'][0] ?? []; + $modelType = strtoupper($request->header('model-type')); + $modelHeading = $request->header('model-heading'); $requestType = $request->header('request-type'); Log::info("Request {$requestType} POST API >>", ['user-name' => $userName, 'characteristic-field' => $charField, 'post-data' => $data]); - if (! $userName) { + if (! $userName || $userName == null || $userName == '') { return response()->json([ 'status_code' => 'ERROR', 'status_description' => "User name can't be empty!", @@ -3375,6 +3513,16 @@ class CharacteristicsController extends Controller 'status_code' => 'ERROR', 'status_description' => "Machine name can't be empty!", ], 404); + } elseif (! $modelType || $modelType == null || $modelType == '') { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Model type can't be empty!", + ], 404); + } elseif (! $modelHeading || $modelHeading == null || $modelHeading == '') { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Model heading can't be empty!", + ], 404); } elseif (! $requestType || $requestType == null || $requestType == '') { return response()->json([ 'status_code' => 'ERROR', @@ -3386,17 +3534,49 @@ class CharacteristicsController extends Controller $charField = 'NIL'; } - if (! is_numeric($plantCode) || Str::length($plantCode) < 4 || ! preg_match('/^[1-9]\d{3,}$/', $plantCode)) { // !ctype_digit($data['plant_code']) + if (! is_numeric($plantCode)) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'Invalid plant code found!', + 'status_description' => "Plant code '{$plantCode}' should contain only numeric values!", + ], 400); + } elseif (Str::length($plantCode) < 4 || Str::length($plantCode) > 7) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Plant code '{$plantCode}' must be between 4 and 7 digits only!", + ], 400); + } elseif (! preg_match('/^[1-9]\d{3,6}$/', $plantCode)) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Invalid plant code '{$plantCode}' found!", + ], 400); + } + + if (Str::length($itemCode) < 6) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Item code '{$itemCode}' should contain minimum 6 digits!", + ], 404); + } elseif (! ctype_alnum($itemCode)) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Item code '{$itemCode}' should contain only alpha-numeric values!", + ], 404); + } elseif (! preg_match('/^[a-zA-Z1-9][a-zA-Z0-9]{5,}$/', $itemCode)) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Item code '{$itemCode}' should not begin with '0'!", ], 404); } - if (Str::length($itemCode) < 6 || ! ctype_alnum($itemCode)) { + if (Str::length($workCenter) < 6) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'Invalid item code found!', + 'status_description' => "Work center '{$workCenter}' should contain minimum 6 characters!", + ], 404); + } elseif (! ctype_alnum($workCenter)) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Work center '{$workCenter}' should contain only alpha-numeric values!", ], 404); } @@ -3415,7 +3595,75 @@ class CharacteristicsController extends Controller if ($requestType != 'Characteristic' && $requestType != 'Quality') { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'Unknown request type found!', + 'status_description' => "Unknown request type '{$requestType}' found!", + ], 404); + } elseif ($requestType == 'Characteristic') { + if ($request->hasFile('file')) { + $extension = strtolower($file->getClientOriginalExtension()); + + if ($extension != 'pdf' && $extension != 'PDF') { + return response()->json([ + 'status' => 'ERROR', + 'status_description' => "Only .PDF files are allowed for request type '{$requestType}'!", + ], 404); + } elseif ($file && $file->getSize() > 1024 * 1024) { // 1 MB in bytes + return response()->json([ + 'status' => 'ERROR', + 'status_description' => 'File size must not exceed 1 MB (Megabyte).', + ], 404); + } + } + } elseif ($requestType == 'Quality') { + if ($request->hasFile('file')) { + $extension = strtolower($file->getClientOriginalExtension()); + + if ($extension != 'png' && $extension != 'PNG') { + return response()->json([ + 'status' => 'ERROR', + 'status_description' => "Only .PNG files are allowed for request type '{$requestType}'!", + ], 404); + } elseif ($file && $file->getSize() > 50 * 1024) { + return response()->json([ + 'status' => 'ERROR', + 'status_description' => 'File size must not exceed 50 KB (Kilobyte).', + ], 404); + } + } else { + return response()->json([ + 'status' => 'ERROR', + 'status_description' => 'Quality approval image (.png) not found!', + ], 404); + } + } + + if ($modelType != 'MOTOR' && $modelType != 'PUMP' && $modelType != 'NAME_PLATE') { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Unknown model type '{$modelType}' found!", + ], 404); + } + + $typesToCreate = []; + + if (Str::contains($modelHeading, 'PRESSURE BOOSTER SYSTEM', ignoreCase: true)) { + $typesToCreate = ['MOTOR', 'PUMP', 'NAME_PLATE']; + } elseif (Str::contains($modelHeading, 'PUMPSET', ignoreCase: true)) { + $typesToCreate = ['MOTOR', 'PUMP']; + } elseif (Str::contains($modelHeading, 'PUMP', ignoreCase: true) && ! Str::contains($modelHeading, 'PUMP SET', ignoreCase: true) && ! Str::contains($modelHeading, 'PUMPSET', ignoreCase: true)) { + $typesToCreate = ['PUMP']; + } elseif (Str::contains($modelHeading, 'MOTOR', ignoreCase: true)) { + $typesToCreate = ['MOTOR']; + } else { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Unknown ZMM_HEADING : '{$modelHeading}' found!", + ], 404); + } + + if (! in_array($modelType, $typesToCreate, true)) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Model type '{$modelType}' does not match with the model heading '{$modelHeading}'!", ], 404); } @@ -3423,7 +3671,7 @@ class CharacteristicsController extends Controller if (! $plant) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Plant code '{$plantCode}' not found!", + 'status_description' => "Plant code '{$plantCode}' not found in plants table!", ], 404); } @@ -3434,7 +3682,7 @@ class CharacteristicsController extends Controller if (! $user) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "User name '{$userName}' not found!", + 'status_description' => "User name '{$userName}' not found in users table!", ], 403); } @@ -3443,12 +3691,12 @@ class CharacteristicsController extends Controller if (! $userPlant && ! $user->hasRole('Super Admin')) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "User name '{$userName}' not found for the plant code '{$plantCode}'!", + 'status_description' => "User name '{$userName}' not found for the plant code '{$plantCode}' in users table!", ], 403); } elseif (! $user->hasRole(['Super Admin', 'Laser Manager', 'Laser Supervisor', 'Laser Employee'])) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'User does not have rights!', + 'status_description' => "User name '{$userName}' does not have rights!", ], 403); } @@ -3456,7 +3704,7 @@ class CharacteristicsController extends Controller if (! $machine) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Work center '{$workCenter}' not found in master!", + 'status_description' => "Work center '{$workCenter}' not found in machines table!", ], 404); } @@ -3464,17 +3712,17 @@ class CharacteristicsController extends Controller if (! $machine) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Work center '{$workCenter}' not found for the plant code '{$plantCode}' in master!", + 'status_description' => "Work center '{$workCenter}' not found for the plant code '{$plantCode}' in machines table!", ], 404); } - $MachineId = $machine->id; + $machineId = $machine->id; $iCode = Item::where('code', $itemCode)->first(); if (! $iCode) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Item code '{$itemCode}' not found!", + 'status_description' => "Item code '{$itemCode}' not found in items table!", ], 404); } @@ -3482,11 +3730,11 @@ class CharacteristicsController extends Controller if (! $item) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Item code '{$itemCode}' not found for the plant code '{$plantCode}'!", + 'status_description' => "Item code '{$itemCode}' not found for the plant code '{$plantCode}' in items table!", ], 404); } - $ItemId = $item->id; + $itemId = $item->id; $pCode = CharacteristicApproverMaster::where('plant_id', $plantId)->first(); if (! $pCode) { @@ -3496,7 +3744,7 @@ class CharacteristicsController extends Controller ], 404); } - $wCenter = CharacteristicApproverMaster::where('machine_id', $MachineId)->first(); + $wCenter = CharacteristicApproverMaster::where('machine_id', $machineId)->first(); if (! $wCenter) { return response()->json([ 'status_code' => 'ERROR', @@ -3504,7 +3752,7 @@ class CharacteristicsController extends Controller ], 404); } - $wCenterAgaPlant = CharacteristicApproverMaster::where('machine_id', $MachineId)->where('plant_id', $plantId)->first(); + $wCenterAgaPlant = CharacteristicApproverMaster::where('machine_id', $machineId)->where('plant_id', $plantId)->first(); if (! $wCenterAgaPlant) { return response()->json([ 'status_code' => 'ERROR', @@ -3544,7 +3792,7 @@ class CharacteristicsController extends Controller ], 404); } - $mNameAndWorkCenter = CharacteristicApproverMaster::where('machine_name', $machineName)->where('machine_id', $MachineId)->first(); + $mNameAndWorkCenter = CharacteristicApproverMaster::where('machine_name', $machineName)->where('machine_id', $machineId)->first(); if (! $mNameAndWorkCenter) { return response()->json([ 'status_code' => 'ERROR', @@ -3552,7 +3800,7 @@ class CharacteristicsController extends Controller ], 404); } - $mNameAndWorkCenterAgaPlant = CharacteristicApproverMaster::where('machine_name', $machineName)->where('machine_id', $MachineId)->where('plant_id', $plantId)->first(); + $mNameAndWorkCenterAgaPlant = CharacteristicApproverMaster::where('machine_name', $machineName)->where('machine_id', $machineId)->where('plant_id', $plantId)->first(); if (! $mNameAndWorkCenterAgaPlant) { return response()->json([ 'status_code' => 'ERROR', @@ -3560,7 +3808,7 @@ class CharacteristicsController extends Controller ], 404); } - $cFieldAndWorkCent = CharacteristicApproverMaster::where('characteristic_field', $charField)->where('machine_id', $MachineId)->first(); + $cFieldAndWorkCent = CharacteristicApproverMaster::where('characteristic_field', $charField)->where('machine_id', $machineId)->first(); if (! $cFieldAndWorkCent) { return response()->json([ 'status_code' => 'ERROR', @@ -3568,7 +3816,7 @@ class CharacteristicsController extends Controller ], 404); } - $cFieldAndWorkCentAgaPlant = CharacteristicApproverMaster::where('characteristic_field', $charField)->where('machine_id', $MachineId)->where('plant_id', $plantId)->first(); + $cFieldAndWorkCentAgaPlant = CharacteristicApproverMaster::where('characteristic_field', $charField)->where('machine_id', $machineId)->where('plant_id', $plantId)->first(); if (! $cFieldAndWorkCentAgaPlant) { return response()->json([ 'status_code' => 'ERROR', @@ -3584,7 +3832,15 @@ class CharacteristicsController extends Controller ], 404); } - $cFieldAndWorkCentAndMachAgaPlant = CharacteristicApproverMaster::where('characteristic_field', $charField)->where('machine_id', $MachineId)->where('machine_name', $machineName)->where('plant_id', $plantId)->first(); + $cFieldAndMachAgaPlant = CharacteristicApproverMaster::where('characteristic_field', $charField)->where('machine_name', $machineName)->where('plant_id', $plantId)->first(); + if (! $cFieldAndMachAgaPlant) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Master characteristic field value '{$charField}' and machine name '{$machineName}' not found for the plant code '{$plantCode}' in approver master!", + ], 404); + } + + $cFieldAndWorkCentAndMachAgaPlant = CharacteristicApproverMaster::where('characteristic_field', $charField)->where('machine_name', $machineName)->where('machine_id', $machineId)->where('plant_id', $plantId)->first(); if (! $cFieldAndWorkCentAndMachAgaPlant) { return response()->json([ 'status_code' => 'ERROR', @@ -3592,156 +3848,158 @@ class CharacteristicsController extends Controller ], 404); } - // ..completed Logic and pending logic for characteristics and quality - - $classRow = ClassCharacteristic::where('plant_id', $plantId) - ->where('machine_id', $MachineId) - ->where('aufnr', $jobNo) - ->first(); + $classRow = ClassCharacteristic::where('aufnr', $jobNo)->where('machine_id', $machineId)->where('plant_id', $plantId)->latest()->first(); if ($classRow) { - if (! empty($characteristics)) { - $requestChars = RequestCharacteristic::where('plant_id', $plantId) - ->where('machine_id', $MachineId) - ->where('aufnr', $jobNo) - ->get(); + $requestChars = RequestCharacteristic::where('aufnr', $jobNo) + ->whereHas('approver', function ($query) { + $query->where('approver_type', 'Characteristic'); + })->where('machine_id', $machineId)->where('plant_id', $plantId)->get(); - if (! $requestChars->isEmpty()) { - $hasPending = false; - $allApproved = true; + $tempClassChars = TempClassCharacteristic::where('aufnr', $jobNo)->where('machine_id', $machineId)->where('plant_id', $plantId)->get(); - foreach ($requestChars as $row) { + if (! $requestChars->isEmpty()) { + $hasCharPending = false; + $hasQualPending = false; + $allCharApproved = true; + $allQualApproved = true; - $isApproved = ( - $row->approver_status1 == 'Approved' || $row->approver_status1 == 'Rejected' || - $row->approver_status2 == 'Approved' || $row->approver_status2 == 'Rejected' || - $row->approver_status3 == 'Approved' || $row->approver_status2 == 'Rejected' - ); + foreach ($requestChars as $row) { + $isApproved = ($row->approver_status1 == 'Approved' || $row->approver_status1 == 'Rejected' || $row->approver_status2 == 'Approved' || $row->approver_status2 == 'Rejected' || $row->approver_status3 == 'Approved' || $row->approver_status3 == 'Rejected'); - if (! $isApproved) { - $isPending = ! empty($row->mail_status) && - ( - empty($row->approver_status1) || $row->approver_status1 == 'Hold' || - empty($row->approver_status2) || $row->approver_status2 == 'Hold' || - empty($row->approver_status3) || $row->approver_status3 == 'Hold' - ); - if ($isPending) { - $hasPending = true; - $allApproved = false; - break; - } - - $allApproved = false; - } + if (! $isApproved) { + $allCharApproved = false; + $hasCharPending = true; + break; } + } - $current = $classRow->has_work_flow_id ?? '0'; - - if ($hasPending) { - if ($current == '0') { - $newValue = '1'; - } elseif ($current == '1') { - $newValue = '1'; - } elseif ($current == '2') { - $newValue = '3'; - } elseif ($current == '3') { - $newValue = '3'; - } - } elseif ($allApproved) { - if ($current == '0') { - $newValue = '0'; - } elseif ($current == '1') { - $newValue = '0'; - } elseif ($current == '2') { - $newValue = '2'; - } elseif ($current == '3') { - $newValue = '2'; - } - } - - ClassCharacteristic::where('plant_id', $plantId) - ->where('machine_id', $MachineId) - ->where('aufnr', $jobNo) - ->update([ - 'has_work_flow_id' => $newValue, - 'updated_at' => now(), + if ($hasCharPending) { + $newValue = '3'; + TempClassCharacteristic::where('aufnr', $jobNo)->where('machine_id', $machineId)->where('plant_id', $plantId)->forceDelete(); + foreach ($typesToCreate as $type) { + TempClassCharacteristic::create([ + 'plant_id' => $plantId, + 'machine_id' => $machineId, + 'item_id' => $itemId, + 'aufnr' => $jobNo, + 'model_type' => $type, + 'has_work_flow_id' => '2', + 'created_by' => $userName, 'updated_by' => $userName, ]); - } - } elseif (empty($characteristics)) { - - $requestChar = RequestCharacteristic::where('plant_id', $plantId) - ->where('machine_id', $MachineId) - ->where('aufnr', $jobNo) - ->latest() - ->first(); - - if ($requestChar) { - - $current = $requestChar->has_work_flow_id ?? '0'; - - $isApproved = - $requestChar->approver_status1 == 'Approved' || - $requestChar->approver_status2 == 'Approved' || - $requestChar->approver_status3 == 'Approved'; - - if ($isApproved) { - if ($current == '0') { - $newValue = '0'; - } elseif ($current == '1') { - $newValue = '1'; - } elseif ($current == '2') { - $newValue = '0'; - } elseif ($current == '3') { - $newValue = '1'; + } + } elseif (! $tempClassChars->isEmpty()) { + foreach ($tempClassChars as $temp) { + if ($temp->has_work_flow_id == '1' || $temp->has_work_flow_id == '2') { + $hasQualPending = true; + $allQualApproved = false; + break; } - } elseif ( - $requestChar->approver_status1 == 'Hold' || $requestChar->approver_status1 == 'Rejected' || $requestChar->approver_status1 == null || $requestChar->approver_status1 == '' || - $requestChar->approver_status2 == 'Hold' || $requestChar->approver_status2 == 'Rejected' || $requestChar->approver_status2 == null || $requestChar->approver_status2 == '' || - $requestChar->approver_status3 == 'Hold' || $requestChar->approver_status3 == 'Rejected' || $requestChar->approver_status3 == null || $requestChar->approver_status3 == '' - ) { - if ($current == '0') { - $newValue = '2'; - } elseif ($current == '1') { - $newValue = '3'; - } elseif ($current == '2') { - $newValue = '2'; - } elseif ($current == '3') { - $newValue = '3'; + + if ($temp->has_work_flow_id == '0') { + $allQualApproved = true; } } + + if ($hasQualPending) { + $newValue = '2'; + } elseif ($allQualApproved) { + $newValue = '0'; + } + } elseif ($allCharApproved) { + $newValue = '0'; } - ClassCharacteristic::where('plant_id', $plantId) - ->where('machine_id', $MachineId) - ->where('aufnr', $jobNo) + ClassCharacteristic::where('aufnr', $jobNo)->where('machine_id', $machineId)->where('plant_id', $plantId) ->update([ 'has_work_flow_id' => $newValue, 'updated_at' => now(), 'updated_by' => $userName, ]); + + if ($requestType == 'Quality' && $hasCharPending) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Characteristic approval is already pending for the job number '{$jobNo}'!", + ], 404); + } + } elseif (! $tempClassChars->isEmpty()) { + $hasQualPending = false; + $allQualApproved = true; + + foreach ($tempClassChars as $temp) { + if ($temp->has_work_flow_id == '1' || $temp->has_work_flow_id == '2') { + $hasQualPending = true; + $allQualApproved = false; + break; + } + + if ($temp->has_work_flow_id == '0') { + $allQualApproved = true; + } + } + + if ($hasQualPending) { + $newValue = '2'; + } elseif ($allQualApproved) { + $newValue = '0'; + } + + ClassCharacteristic::where('aufnr', $jobNo)->where('machine_id', $machineId)->where('plant_id', $plantId) + ->update([ + 'has_work_flow_id' => $newValue, + 'updated_at' => now(), + 'updated_by' => $userName, + ]); + } else { + ClassCharacteristic::where('aufnr', $jobNo)->where('machine_id', $machineId)->where('plant_id', $plantId) + ->update([ + 'has_work_flow_id' => '0', + 'updated_at' => now(), + 'updated_by' => $userName, + ]); } - } + } else { + $requestChars = RequestCharacteristic::where('aufnr', $jobNo) + ->whereHas('approver', function ($query) { + $query->where('approver_type', 'Characteristic'); + })->where('machine_id', $machineId)->where('plant_id', $plantId)->get(); - foreach ($characteristics as $char) { - $charNameUpp = strtoupper($char['characteristic_name']) ?? null; - $charNameLow = strtolower($char['characteristic_name']) ?? null; - $pendingExists = RequestCharacteristic::where('plant_id', $plantId)->where('aufnr', $jobNo)->where('characteristic_name', $charNameUpp)->latest()->first(); + if (! $requestChars->isEmpty()) { + $hasCharPending = false; - $columns = Schema::getColumnListing('class_characteristics'); + foreach ($requestChars as $row) { + $isApproved = ($row->approver_status1 == 'Approved' || $row->approver_status1 == 'Rejected' || $row->approver_status2 == 'Approved' || $row->approver_status2 == 'Rejected' || $row->approver_status3 == 'Approved' || $row->approver_status3 == 'Rejected'); - if (! in_array($charNameLow, $columns, true)) { - $unknownCharacteristics[] = strtoupper($charNameUpp); - } + if (! $isApproved) { + $hasCharPending = true; + break; + } + } - if ($pendingExists) { + if ($hasCharPending) { + TempClassCharacteristic::where('aufnr', $jobNo)->where('machine_id', $machineId)->where('plant_id', $plantId)->forceDelete(); - $app1 = $pendingExists->approver_status1 ?? null; - $app2 = $pendingExists->approver_status2 ?? null; - $app3 = $pendingExists->approver_status3 ?? null; + foreach ($typesToCreate as $type) { + TempClassCharacteristic::create([ + 'plant_id' => $plantId, + 'machine_id' => $machineId, + 'item_id' => $itemId, + 'aufnr' => $jobNo, + 'model_type' => $type, + 'has_work_flow_id' => '2', + 'created_by' => $userName, + 'updated_by' => $userName, + ]); + } - if ($app1 != 'Approved' && $app2 != 'Approved' && $app3 != 'Approved' && $app1 != 'Rejected' && $app2 != 'Rejected' && $app3 != 'Rejected') { - $pendingCharacteristics[] = strtoupper($charNameUpp); + if ($requestType == 'Quality') { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Characteristic approval is already pending for the job number '{$jobNo}'!", + ], 404); + } } } } @@ -3751,7 +4009,8 @@ class CharacteristicsController extends Controller $appTypExist = null; if (! empty($characteristics)) { - $appTypExist = CharacteristicApproverMaster::where('characteristic_field', $charField)->where('machine_id', $MachineId)->where('machine_name', $machineName)->where('plant_id', $plantId)->where('approver_type', 'Characteristic')->first(); + $appTypExist = CharacteristicApproverMaster::where('characteristic_field', $charField)->where('approver_type', $requestType)->where('machine_name', $machineName)->where('machine_id', $machineId)->where('plant_id', $plantId)->latest()->first(); + if (! $appTypExist) { return response()->json([ 'status_code' => 'ERROR', @@ -3760,16 +4019,18 @@ class CharacteristicsController extends Controller } $charId = $appTypExist->id; + $columns = Schema::getColumnListing('class_characteristics'); foreach ($characteristics as $char) { $charNameUpp = strtoupper($char['characteristic_name']) ?? null; $charNameLow = strtolower($char['characteristic_name']) ?? null; - $pendingExists = RequestCharacteristic::where('plant_id', $plantId)->where('aufnr', $jobNo)->where('characteristic_name', $charNameUpp)->latest()->first(); - - $columns = Schema::getColumnListing('class_characteristics'); + $pendingExists = RequestCharacteristic::where('aufnr', $jobNo)->where('characteristic_name', $charNameUpp) + ->whereHas('approver', function ($query) use ($requestType) { + $query->where('approver_type', $requestType); + })->where('machine_id', $machineId)->where('plant_id', $plantId)->latest()->first(); if (! in_array($charNameLow, $columns, true)) { - $unknownCharacteristics[] = strtoupper($charNameUpp); + $unknownCharacteristics[] = $charNameUpp; } if ($pendingExists) { @@ -3779,7 +4040,7 @@ class CharacteristicsController extends Controller $app3 = $pendingExists->approver_status3 ?? null; if ($app1 != 'Approved' && $app2 != 'Approved' && $app3 != 'Approved' && $app1 != 'Rejected' && $app2 != 'Rejected' && $app3 != 'Rejected') { - $pendingCharacteristics[] = strtoupper($charNameUpp); + $pendingCharacteristics[] = $charNameUpp; } } } @@ -3789,7 +4050,7 @@ class CharacteristicsController extends Controller if (! empty($uniquePendChars)) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'Characteristic approval is already pending for the following request characteristics : '.implode(', ', $uniquePendChars), + 'status_description' => 'Characteristic approval is already pending for the following request characteristics : '.implode(', ', $uniquePendChars).'.', // skip ], 404); } @@ -3798,12 +4059,11 @@ class CharacteristicsController extends Controller if (! empty($uniqueUnkChars)) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'Unknown characteristic fields found : '.implode(', ', $uniqueUnkChars), + 'status_description' => 'Unknown characteristic fields found : '.implode(', ', $uniqueUnkChars).'.', ], 404); } try { - $workFlowIds = []; $year = now()->format('y'); @@ -3811,21 +4071,7 @@ class CharacteristicsController extends Controller $date = now()->format('d'); $prefix = "WF-{$year}{$month}{$date}-"; - // $existingWorkflowId = RequestCharacteristic::where('plant_id', $plantId) - // ->where('machine_id', $MachineId) - // ->where('aufnr', $jobNo) - // ->value('work_flow_id'); - - // if ($existingWorkflowId) { - // $workflowId = $existingWorkflowId; - - // } - - $lastWorkflow = RequestCharacteristic::where('work_flow_id', 'like', "{$prefix}%") - // ->where('plant_id', $plantId) - // ->where('machine_id', $MachineId) - ->orderByDesc('work_flow_id') - ->first(); + $lastWorkflow = RequestCharacteristic::where('work_flow_id', 'like', "{$prefix}%")->orderByDesc('work_flow_id')->first(); // ->where('machine_id', $machineId)->where('plant_id', $plantId) if ($lastWorkflow) { $lastSerial = substr($lastWorkflow->work_flow_id, strlen($prefix)); @@ -3841,50 +4087,66 @@ class CharacteristicsController extends Controller $workflowId = "{$prefix}{$nextSerial}"; - $file = $request->file('file'); - - // if (! $request->hasFile('file')) { - // return response()->json([ - // 'status_code' => 'ERROR', - // 'status_description' => 'No PDF file provided!', - // ], 404); - // } - foreach ($characteristics as $char) { - - $record = RequestCharacteristic::create([ + $charNameUpp = strtoupper($char['characteristic_name']) ?? null; + RequestCharacteristic::create([ 'plant_id' => $plantId, - 'machine_id' => $MachineId, - 'item_id' => $ItemId, + 'machine_id' => $machineId, + 'item_id' => $itemId, + 'model_type' => $modelType, 'characteristic_approver_master_id' => $charId, 'aufnr' => $jobNo, - 'characteristic_name' => strtoupper($char['characteristic_name']), // strtolower + 'characteristic_name' => $charNameUpp, // strtolower 'current_value' => $char['current_value'], 'update_value' => $char['update_value'], 'created_by' => $userName, 'work_flow_id' => $workflowId, ]); - $workFlowIds[strtoupper($char['characteristic_name'])] = (string) $record->work_flow_id; + $workFlowIds[$charNameUpp] = (string) $workflowId; // $record->work_flow_id; + } + + TempClassCharacteristic::where('aufnr', $jobNo)->where('machine_id', $machineId)->where('plant_id', $plantId)->forceDelete(); + + foreach ($typesToCreate as $type) { + TempClassCharacteristic::create([ + 'plant_id' => $plantId, + 'machine_id' => $machineId, + 'item_id' => $itemId, + 'aufnr' => $jobNo, + 'model_type' => $type, + 'has_work_flow_id' => '2', + 'created_by' => $userName, + 'updated_by' => $userName, + ]); + } + + $classChar = ClassCharacteristic::where('aufnr', $jobNo)->where('machine_id', $machineId)->where('plant_id', $plantId)->latest()->first(); + + if ($classChar) { + ClassCharacteristic::where('aufnr', $jobNo)->where('machine_id', $machineId)->where('plant_id', $plantId) + ->update([ + 'has_work_flow_id' => '3', + 'updated_at' => now(), + 'updated_by' => $userName, + ]); } if ($request->hasFile('file')) { $extension = strtolower($file->getClientOriginalExtension()); $filename = $workflowId.'.'.$extension; - if ($extension != 'pdf' && $extension != 'PDF') { - return response()->json([ - 'status' => 'ERROR', - 'status_description' => 'Only .PDF files are allowed.', - ], 404); - } - - if ($file && $file->getSize() > 1024 * 1024) { // 1 MB in bytes - return response()->json([ - 'status' => 'ERROR', - 'status_description' => 'File size must not exceed 1 MB', - ], 404); - } + // if ($extension != 'pdf' && $extension != 'PDF') { + // return response()->json([ + // 'status' => 'ERROR', + // 'status_description' => 'Only .PDF files are allowed.', + // ], 404); + // } elseif ($file && $file->getSize() > 1024 * 1024) { // 1 MB in bytes + // return response()->json([ + // 'status' => 'ERROR', + // 'status_description' => 'File size must not exceed 1 MB', + // ], 404); + // } $filePath = $file->storeAs( 'uploads/LaserDocs', @@ -3904,40 +4166,6 @@ class CharacteristicsController extends Controller } } - // .. - - $classChar = ClassCharacteristic::where('plant_id', $plantId)->where('machine_id', $MachineId)->where('aufnr', $jobNo)->first(); - - $hasWorkFlowId = $classChar?->has_work_flow_id; - - $updatedWorkId = null; - - if ($classChar) { - - if ($hasWorkFlowId == '' || $hasWorkFlowId == null) { - $hasWorkFlowId = '0'; - } - - if ($hasWorkFlowId == '0') { - $updatedWorkId = '1'; - } elseif ($hasWorkFlowId == '1') { - $updatedWorkId = '1'; - } elseif ($hasWorkFlowId == '2') { - $updatedWorkId = '3'; - } elseif ($hasWorkFlowId == '3') { - $updatedWorkId = '3'; - } - - ClassCharacteristic::where('plant_id', $plantId) - ->where('machine_id', $MachineId) - ->where('aufnr', $jobNo) - ->update([ - 'has_work_flow_id' => $updatedWorkId, - 'updated_at' => now(), - 'updated_by' => $userName, - ]); - } - return response()->json([ 'work_flow_ids' => [$workFlowIds], ], 200); @@ -3949,7 +4177,8 @@ class CharacteristicsController extends Controller ], 500); } } else { - $appTypExist = CharacteristicApproverMaster::where('characteristic_field', $charField)->where('machine_id', $MachineId)->where('machine_name', $machineName)->where('plant_id', $plantId)->where('approver_type', 'Quality')->first(); + $appTypExist = CharacteristicApproverMaster::where('characteristic_field', $charField)->where('approver_type', $requestType)->where('machine_name', $machineName)->where('machine_id', $machineId)->where('plant_id', $plantId)->latest()->first(); + if (! $appTypExist) { return response()->json([ 'status_code' => 'ERROR', @@ -3959,12 +4188,15 @@ class CharacteristicsController extends Controller $charId = $appTypExist->id; - $pendingExists = RequestCharacteristic::where('plant_id', $plantId)->where('aufnr', $jobNo)->where(function ($query) { - $query->whereNull('characteristic_name')->orWhere('characteristic_name', ''); - })->latest()->first(); + $pendingExists = RequestCharacteristic::where('aufnr', $jobNo)->where('model_type', $modelType) + ->whereHas('approver', function ($query) use ($requestType) { + $query->where('approver_type', $requestType); + })->where('machine_id', $machineId)->where('plant_id', $plantId)->latest()->first(); + // ->where(function ($query) { + // $query->whereNull('characteristic_name')->orWhere('characteristic_name', ''); + // }) if ($pendingExists) { - $app1 = $pendingExists->approver_status1 ?? null; $app2 = $pendingExists->approver_status2 ?? null; $app3 = $pendingExists->approver_status3 ?? null; @@ -3972,13 +4204,124 @@ class CharacteristicsController extends Controller if ($app1 != 'Approved' && $app2 != 'Approved' && $app3 != 'Approved' && $app1 != 'Rejected' && $app2 != 'Rejected' && $app3 != 'Rejected') { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Quality Approval is already pending for the Job Number : '{$jobNo}'", + 'status_description' => "Quality Approval is already pending for the job number : '{$jobNo}' and Model Type : '{$modelType}'", // skip // 'status_error' => $pendingExists, ], 404); } } + if (empty($templateCharacteristics)) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Template characteristics can't be empty!", + ], 404); + } + + $tempCharacteristics = TempClassCharacteristic::where('aufnr', $jobNo)->where('model_type', $modelType)->where('machine_id', $machineId)->where('plant_id', $plantId)->latest()->first(); + + $columns = Schema::getColumnListing('temp_class_characteristics'); + + if (! $tempCharacteristics) { + $templateData = []; + $unknownCharacteristics = []; + + TempClassCharacteristic::where('aufnr', $jobNo)->where('machine_id', $machineId)->where('plant_id', $plantId)->forceDelete(); + + foreach ($templateCharacteristics as $item) { + foreach ($item as $key => $value) { + $key = strtolower($key) ?? null; + // if (Schema::hasColumn('temp_class_characteristics', $key)) { + // $templateData[$key] = $value; + // } + if (in_array($key, $columns, true)) { + $templateData[$key] = $value; + } else { + $unknownCharacteristics[] = $key; + } + } + } + + $uniqueUnkChars = array_unique($unknownCharacteristics); + + if (! empty($uniqueUnkChars)) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => 'Unknown characteristic fields found : '.implode(', ', $uniqueUnkChars).'.', + ], 404); + } + + foreach ($typesToCreate as $type) { + if ($modelType == $type) { + TempClassCharacteristic::create(array_merge([ + 'plant_id' => $plantId, + 'machine_id' => $machineId, + 'item_id' => $itemId, + 'aufnr' => $jobNo, + 'model_type' => $type, + 'has_work_flow_id' => '1', + 'created_by' => $userName, + 'updated_by' => $userName, + ], $templateData)); + } else { + TempClassCharacteristic::create([ + 'plant_id' => $plantId, + 'machine_id' => $machineId, + 'item_id' => $itemId, + 'aufnr' => $jobNo, + 'model_type' => $type, + 'has_work_flow_id' => '2', + 'created_by' => $userName, + 'updated_by' => $userName, + ]); + } + } + } else { + $templateData = []; + $unknownCharacteristics = []; + + foreach ($templateCharacteristics as $item) { + foreach ($item as $key => $value) { + $key = strtolower($key) ?? null; + if (in_array($key, $columns, true)) { + $templateData[$key] = $value; + } else { + $unknownCharacteristics[] = $key; + } + } + } + + $uniqueUnkChars = array_unique($unknownCharacteristics); + + if (! empty($uniqueUnkChars)) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => 'Unknown characteristic fields found : '.implode(', ', $uniqueUnkChars).'.', + ], 404); + } + + $fixedColumns = ['id', 'plant_id', 'item_id', 'machine_id', 'aufnr', 'model_type', 'has_work_flow_id', 'created_at', 'created_by', 'updated_at', 'updated_by', 'deleted_at']; + $dynamicColumns = array_diff($columns, $fixedColumns); + + $incomingKeys = array_keys($templateData); + $columnsToClear = array_diff($dynamicColumns, $incomingKeys); + + $clearData = []; + foreach ($columnsToClear as $col) { + $clearData[$col] = null; + } + + $finalData = array_merge($clearData, $templateData); + + TempClassCharacteristic::where('aufnr', $jobNo)->where('model_type', $modelType)->where('machine_id', $machineId)->where('plant_id', $plantId) + ->update(array_merge([ + 'has_work_flow_id' => '1', + 'updated_by' => $userName, + ], $finalData)); // ->where('item_id', $itemId) + } + try { + $approvalId = []; + $year = now()->format('y'); $month = now()->format('m'); $date = now()->format('d'); @@ -4002,36 +4345,11 @@ class CharacteristicsController extends Controller $workflowId = "{$prefix}{$nextSerial}"; - $file = $request->file('file'); - if (! $request->hasFile('file')) { - return response()->json([ - 'status' => 'ERROR', - 'status_description' => 'Quality approval image (.png) not found!', - ], 404); - } - - $extension = strtolower($file->getClientOriginalExtension()); - - $filename = $workflowId.'.'.$extension; - - if ($extension != 'png' && $extension != 'PNG') { - return response()->json([ - 'status' => 'ERROR', - 'status_description' => 'Only .PNG files are allowed.', - ], 404); - } - - if ($file && $file->getSize() > 50 * 1024) { - return response()->json([ - 'status' => 'ERROR', - 'status_description' => 'File size must not exceed 50 KB', - ], 404); - } - - $record = RequestCharacteristic::create([ + RequestCharacteristic::create([ 'plant_id' => $plantId, - 'machine_id' => $MachineId, - 'item_id' => $ItemId, + 'machine_id' => $machineId, + 'item_id' => $itemId, + 'model_type' => $modelType, 'characteristic_approver_master_id' => $charId, 'aufnr' => $jobNo, 'characteristic_name' => '', @@ -4041,72 +4359,118 @@ class CharacteristicsController extends Controller 'work_flow_id' => $workflowId, ]); - $approvalId = []; + $approvalId["{$modelType}_APPROVAL_ID"] = $workflowId; - if ($request->hasFile('file')) { - $filePath = $file->storeAs( - 'uploads/LaserDocs', - $filename, - 'local' - ); + $classRow = ClassCharacteristic::where('aufnr', $jobNo)->where('machine_id', $machineId)->where('plant_id', $plantId)->latest()->first(); - $approvalId['Approval_ID'] = $workflowId; + if ($classRow) { + $requestChars = RequestCharacteristic::where('aufnr', $jobNo) + ->whereHas('approver', function ($query) { + $query->where('approver_type', 'Characteristic'); + })->where('machine_id', $machineId)->where('plant_id', $plantId)->get(); - $filePath = "uploads/LaserDocs/{$filename}"; + $hasCharPending = false; + if (! $requestChars->isEmpty()) { + foreach ($requestChars as $row) { + $isApproved = ($row->approver_status1 == 'Approved' || $row->approver_status1 == 'Rejected' || $row->approver_status2 == 'Approved' || $row->approver_status2 == 'Rejected' || $row->approver_status3 == 'Approved' || $row->approver_status3 == 'Rejected'); + + if (! $isApproved) { + $hasCharPending = true; + break; + } + } + } + + if ($hasCharPending) { + $newValue = '3'; + TempClassCharacteristic::where('aufnr', $jobNo)->where('machine_id', $machineId)->where('plant_id', $plantId)->forceDelete(); + + foreach ($typesToCreate as $type) { + TempClassCharacteristic::create([ + 'plant_id' => $plantId, + 'machine_id' => $machineId, + 'item_id' => $itemId, + 'aufnr' => $jobNo, + 'model_type' => $type, + 'has_work_flow_id' => '2', + 'created_by' => $userName, + 'updated_by' => $userName, + ]); + } + + RequestCharacteristic::where('work_flow_id', $workflowId)->where('plant_id', $plantId)->forceDelete(); + } else { + $newValue = '2'; + } + + ClassCharacteristic::where('aufnr', $jobNo)->where('machine_id', $machineId)->where('plant_id', $plantId) + ->update([ + 'has_work_flow_id' => $newValue, + 'updated_at' => now(), + 'updated_by' => $userName, + ]); + + if ($hasCharPending) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Characteristic approval is already pending for the job number '{$jobNo}'!", + ], 404); + } + } else { + $requestChars = RequestCharacteristic::where('aufnr', $jobNo) + ->whereHas('approver', function ($query) { + $query->where('approver_type', 'Characteristic'); + })->where('machine_id', $machineId)->where('plant_id', $plantId)->get(); + + $hasCharPending = false; + if (! $requestChars->isEmpty()) { + foreach ($requestChars as $row) { + $isApproved = ($row->approver_status1 == 'Approved' || $row->approver_status1 == 'Rejected' || $row->approver_status2 == 'Approved' || $row->approver_status2 == 'Rejected' || $row->approver_status3 == 'Approved' || $row->approver_status3 == 'Rejected'); + + if (! $isApproved) { + $hasCharPending = true; + break; + } + } + } + + if ($hasCharPending) { + TempClassCharacteristic::where('aufnr', $jobNo)->where('machine_id', $machineId)->where('plant_id', $plantId)->forceDelete(); + + foreach ($typesToCreate as $type) { + TempClassCharacteristic::create([ + 'plant_id' => $plantId, + 'machine_id' => $machineId, + 'item_id' => $itemId, + 'aufnr' => $jobNo, + 'model_type' => $type, + 'has_work_flow_id' => '2', + 'created_by' => $userName, + 'updated_by' => $userName, + ]); + } - if (! Storage::disk('local')->exists($filePath)) { RequestCharacteristic::where('work_flow_id', $workflowId)->where('plant_id', $plantId)->forceDelete(); return response()->json([ - 'status' => 'ERROR', - 'status_description' => "Document upload failed for Quality Work Flow ID : '{$workflowId}'", + 'status_code' => 'ERROR', + 'status_description' => "Characteristic approval is already pending for the job number '{$jobNo}'!", ], 404); } + } - $classChar = ClassCharacteristic::where('plant_id', $plantId)->where('machine_id', $MachineId)->where('aufnr', $jobNo)->latest()->first(); + $extension = strtolower($file->getClientOriginalExtension()); + $filename = $workflowId.'.'.$extension; - $hasWorkFlowId = $classChar?->has_work_flow_id ?? null; + $filePath = $file->storeAs( + 'uploads/LaserDocs', + $filename, + 'local' + ); - $updatedWorkId = null; + $filePath = "uploads/LaserDocs/{$filename}"; - if ($classChar) { - - if ($hasWorkFlowId == '' || $hasWorkFlowId == null) { - $hasWorkFlowId = '0'; - } - - if ($hasWorkFlowId == '0') { - - $updatedWorkId = '2'; - - } elseif ($hasWorkFlowId == '1') { - - $updatedWorkId = '3'; - - } elseif ($hasWorkFlowId == '2') { - - $updatedWorkId = '2'; - - } elseif ($hasWorkFlowId == '3') { - - $updatedWorkId = '3'; - - } - - ClassCharacteristic::where('plant_id', $plantId) - ->where('machine_id', $MachineId) - ->where('aufnr', $jobNo) - ->update([ - 'has_work_flow_id' => $updatedWorkId, - 'updated_at' => now(), - 'updated_by' => $userName, - ]); - } - - return response()->json([ - 'work_flow_ids' => [$approvalId], - ], 200); - } else { + if (! Storage::disk('local')->exists($filePath)) { RequestCharacteristic::where('work_flow_id', $workflowId)->where('plant_id', $plantId)->forceDelete(); return response()->json([ @@ -4115,6 +4479,9 @@ class CharacteristicsController extends Controller ], 404); } + return response()->json([ + 'work_flow_ids' => [$approvalId], + ], 200); } catch (\Exception $e) { return response()->json([ 'status_code' => 'ERROR', @@ -4148,11 +4515,13 @@ class CharacteristicsController extends Controller $itemCode = $request->header('item-code'); $workFlowId = $request->header('work-flow-id'); $workFlowId = strtoupper($workFlowId); + $modelType = strtoupper($request->header('model-type')); + $modelHeading = $request->header('model-heading'); $requestType = $request->header('request-type'); Log::info("Request {$requestType} POST API >>", ['user-name' => $userName, 'characteristic-field' => $charField, 'plant-code' => $plantCode, 'work-center' => $workCenter, 'machine-name' => $machineName, 'aufnr' => $jobNo, 'item-code' => $itemCode, 'work-flow-id' => $workFlowId]); - if (! $userName) { + if (! $userName || $userName == null || $userName == '') { return response()->json([ 'status_code' => 'ERROR', 'status_description' => "User name can't be empty!", @@ -4186,6 +4555,16 @@ class CharacteristicsController extends Controller 'status_code' => 'ERROR', 'status_description' => "Machine name can't be empty!", ], 404); + } elseif (! $modelType || $modelType == null || $modelType == '') { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Model type can't be empty!", + ], 404); + } elseif (! $modelHeading || $modelHeading == null || $modelHeading == '') { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Model heading can't be empty!", + ], 404); } elseif (! $requestType || $requestType == null || $requestType == '') { return response()->json([ 'status_code' => 'ERROR', @@ -4197,17 +4576,49 @@ class CharacteristicsController extends Controller $charField = 'NIL'; } - if (! is_numeric($plantCode) || Str::length($plantCode) < 4 || ! preg_match('/^[1-9]\d{3,}$/', $plantCode)) { // !ctype_digit($data['plant_code']) + if (! is_numeric($plantCode)) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'Invalid plant code found!', + 'status_description' => "Plant code '{$plantCode}' should contain only numeric values!", + ], 400); + } elseif (Str::length($plantCode) < 4 || Str::length($plantCode) > 7) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Plant code '{$plantCode}' must be between 4 and 7 digits only!", + ], 400); + } elseif (! preg_match('/^[1-9]\d{3,6}$/', $plantCode)) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Invalid plant code '{$plantCode}' found!", + ], 400); + } + + if (Str::length($itemCode) < 6) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Item code '{$itemCode}' should contain minimum 6 digits!", + ], 404); + } elseif (! ctype_alnum($itemCode)) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Item code '{$itemCode}' should contain only alpha-numeric values!", + ], 404); + } elseif (! preg_match('/^[a-zA-Z1-9][a-zA-Z0-9]{5,}$/', $itemCode)) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Item code '{$itemCode}' should not begin with '0'!", ], 404); } - if (Str::length($itemCode) < 6 || ! ctype_alnum($itemCode)) { + if (Str::length($workCenter) < 6) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'Invalid item code found!', + 'status_description' => "Work center '{$workCenter}' should contain minimum 6 characters!", + ], 404); + } elseif (! ctype_alnum($workCenter)) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Work center '{$workCenter}' should contain only alpha-numeric values!", ], 404); } @@ -4226,7 +4637,38 @@ class CharacteristicsController extends Controller if ($requestType != 'Characteristic' && $requestType != 'Quality') { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'Unknown request type found!', + 'status_description' => "Unknown request type '{$requestType}' found!", + ], 404); + } + + if ($modelType != 'MOTOR' && $modelType != 'PUMP' && $modelType != 'NAME_PLATE') { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Unknown model type '{$modelType}' found!", + ], 404); + } + + $typesToCreate = []; + + if (Str::contains($modelHeading, 'PRESSURE BOOSTER SYSTEM', ignoreCase: true)) { + $typesToCreate = ['MOTOR', 'PUMP', 'NAME_PLATE']; + } elseif (Str::contains($modelHeading, 'PUMPSET', ignoreCase: true)) { + $typesToCreate = ['MOTOR', 'PUMP']; + } elseif (Str::contains($modelHeading, 'PUMP', ignoreCase: true) && ! Str::contains($modelHeading, 'PUMP SET', ignoreCase: true) && ! Str::contains($modelHeading, 'PUMPSET', ignoreCase: true)) { + $typesToCreate = ['PUMP']; + } elseif (Str::contains($modelHeading, 'MOTOR', ignoreCase: true)) { + $typesToCreate = ['MOTOR']; + } else { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Unknown ZMM_HEADING : '{$modelHeading}' found!", + ], 404); + } + + if (! in_array($modelType, $typesToCreate, true)) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Model type '{$modelType}' does not match with the model heading '{$modelHeading}'!", ], 404); } @@ -4234,7 +4676,7 @@ class CharacteristicsController extends Controller if (! $plant) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Plant code '{$plantCode}' not found!", + 'status_description' => "Plant code '{$plantCode}' not found in plants table!", ], 404); } @@ -4245,7 +4687,7 @@ class CharacteristicsController extends Controller if (! $user) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "User name '{$userName}' not found!", + 'status_description' => "User name '{$userName}' not found in users table!", ], 404); } @@ -4254,12 +4696,12 @@ class CharacteristicsController extends Controller if (! $userPlant && ! $user->hasRole('Super Admin')) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "User name '{$userName}' not found for the plant code '{$plantCode}'!", + 'status_description' => "User name '{$userName}' not found for the plant code '{$plantCode}' in users table!", ], 404); } elseif (! $user->hasRole(['Super Admin', 'Laser Manager', 'Laser Supervisor', 'Laser Employee'])) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => 'User does not have rights!', + 'status_description' => "User '{$userName}' does not have rights!", ], 404); } @@ -4267,7 +4709,7 @@ class CharacteristicsController extends Controller if (! $machine) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Work center '{$workCenter}' not found in master!", + 'status_description' => "Work center '{$workCenter}' not found in machines table!", ], 404); } @@ -4275,17 +4717,17 @@ class CharacteristicsController extends Controller if (! $machine) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Work center '{$workCenter}' not found for the plant code '{$plantCode}' in master!", + 'status_description' => "Work center '{$workCenter}' not found for the plant code '{$plantCode}' in machines table!", ], 404); } - $MachineId = $machine->id; + $machineId = $machine->id; $iCode = Item::where('code', $itemCode)->first(); if (! $iCode) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Item code '{$itemCode}' not found!", + 'status_description' => "Item code '{$itemCode}' not found in items table!", ], 404); } @@ -4293,11 +4735,11 @@ class CharacteristicsController extends Controller if (! $item) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Item code '{$itemCode}' not found for the plant code '{$plantCode}'!", + 'status_description' => "Item code '{$itemCode}' not found for the plant code '{$plantCode}' in items table!", ], 404); } - $ItemId = $item->id; + $itemId = $item->id; $pCode = CharacteristicApproverMaster::where('plant_id', $plantId)->first(); if (! $pCode) { @@ -4307,7 +4749,7 @@ class CharacteristicsController extends Controller ], 404); } - $wCenter = CharacteristicApproverMaster::where('machine_id', $MachineId)->first(); + $wCenter = CharacteristicApproverMaster::where('machine_id', $machineId)->first(); if (! $wCenter) { return response()->json([ 'status_code' => 'ERROR', @@ -4315,7 +4757,7 @@ class CharacteristicsController extends Controller ], 404); } - $wCenterAgaPlant = CharacteristicApproverMaster::where('machine_id', $MachineId)->where('plant_id', $plantId)->first(); + $wCenterAgaPlant = CharacteristicApproverMaster::where('machine_id', $machineId)->where('plant_id', $plantId)->first(); if (! $wCenterAgaPlant) { return response()->json([ 'status_code' => 'ERROR', @@ -4347,6 +4789,7 @@ class CharacteristicsController extends Controller ], 404); } + // Master characteristic field value 'NIL' not found in approver master! $cFieldAgaPlant = CharacteristicApproverMaster::where('characteristic_field', $charField)->where('plant_id', $plantId)->first(); if (! $cFieldAgaPlant) { return response()->json([ @@ -4355,7 +4798,7 @@ class CharacteristicsController extends Controller ], 404); } - $mNameAndWorkCenter = CharacteristicApproverMaster::where('machine_name', $machineName)->where('machine_id', $MachineId)->first(); + $mNameAndWorkCenter = CharacteristicApproverMaster::where('machine_name', $machineName)->where('machine_id', $machineId)->first(); if (! $mNameAndWorkCenter) { return response()->json([ 'status_code' => 'ERROR', @@ -4363,7 +4806,7 @@ class CharacteristicsController extends Controller ], 404); } - $mNameAndWorkCenterAgaPlant = CharacteristicApproverMaster::where('machine_name', $machineName)->where('machine_id', $MachineId)->where('plant_id', $plantId)->first(); + $mNameAndWorkCenterAgaPlant = CharacteristicApproverMaster::where('machine_name', $machineName)->where('machine_id', $machineId)->where('plant_id', $plantId)->first(); if (! $mNameAndWorkCenterAgaPlant) { return response()->json([ 'status_code' => 'ERROR', @@ -4371,7 +4814,7 @@ class CharacteristicsController extends Controller ], 404); } - $cFieldAndWorkCent = CharacteristicApproverMaster::where('characteristic_field', $charField)->where('machine_id', $MachineId)->first(); + $cFieldAndWorkCent = CharacteristicApproverMaster::where('characteristic_field', $charField)->where('machine_id', $machineId)->first(); if (! $cFieldAndWorkCent) { return response()->json([ 'status_code' => 'ERROR', @@ -4379,7 +4822,7 @@ class CharacteristicsController extends Controller ], 404); } - $cFieldAndWorkCentAgaPlant = CharacteristicApproverMaster::where('characteristic_field', $charField)->where('machine_id', $MachineId)->where('plant_id', $plantId)->first(); + $cFieldAndWorkCentAgaPlant = CharacteristicApproverMaster::where('characteristic_field', $charField)->where('machine_id', $machineId)->where('plant_id', $plantId)->first(); if (! $cFieldAndWorkCentAgaPlant) { return response()->json([ 'status_code' => 'ERROR', @@ -4395,7 +4838,15 @@ class CharacteristicsController extends Controller ], 404); } - $cFieldAndWorkCentAndMachAgaPlant = CharacteristicApproverMaster::where('characteristic_field', $charField)->where('machine_id', $MachineId)->where('machine_name', $machineName)->where('plant_id', $plantId)->first(); + $cFieldAndMachAgaPlant = CharacteristicApproverMaster::where('characteristic_field', $charField)->where('machine_name', $machineName)->where('plant_id', $plantId)->first(); + if (! $cFieldAndMachAgaPlant) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Master characteristic field value '{$charField}' and machine name '{$machineName}' not found for the plant code '{$plantCode}' in approver master!", + ], 404); + } + + $cFieldAndWorkCentAndMachAgaPlant = CharacteristicApproverMaster::where('characteristic_field', $charField)->where('machine_name', $machineName)->where('machine_id', $machineId)->where('plant_id', $plantId)->first(); if (! $cFieldAndWorkCentAndMachAgaPlant) { return response()->json([ 'status_code' => 'ERROR', @@ -4407,7 +4858,7 @@ class CharacteristicsController extends Controller if (! $job) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Job number '{$jobNo}' not found!", + 'status_description' => "Job number '{$jobNo}' not found in request approval table!", ], 404); } @@ -4415,38 +4866,28 @@ class CharacteristicsController extends Controller if (! $jobAgaPlant) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Job number '{$jobNo}' not found for the plant code '{$plantCode}'!", + 'status_description' => "Job number '{$jobNo}' not found for the plant code '{$plantCode}' in request approval table!", ], 404); } - $jobAgaPlantMachine = RequestCharacteristic::where('aufnr', $jobNo)->where('plant_id', $plantId)->where('item_id', $ItemId)->first(); + $jobAgaPlantItem = RequestCharacteristic::where('aufnr', $jobNo)->where('item_id', $itemId)->where('plant_id', $plantId)->first(); + if (! $jobAgaPlantItem) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Job number '{$jobNo}' not found with the item code '{$itemCode}' in request approval table!", + ], 404); + } + + $jobAgaPlantMachine = RequestCharacteristic::where('aufnr', $jobNo)->where('item_id', $itemId)->where('machine_id', $machineId)->where('plant_id', $plantId)->first(); if (! $jobAgaPlantMachine) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Job number '{$jobNo}' and item code '{$itemCode}' records not found for the plant code '{$plantCode}'!", + 'status_description' => "Job number '$jobNo' not found for the work center '$workCenter' in request approval table!", ], 404); } - $jobAgaPlantMachine = RequestCharacteristic::where('aufnr', $jobNo)->where('plant_id', $plantId)->where('item_id', $ItemId)->where('machine_id', $MachineId)->first(); - if (! $jobAgaPlantMachine) { - return response()->json([ - 'status_code' => 'ERROR', - 'status_description' => "Job number '$jobNo', item code '$itemCode' and work center '$workCenter' records not found for the plant code '{$plantCode}'", - ], 404); - } - - $reqCharExist = RequestCharacteristic::where('aufnr', $jobNo) - ->where('plant_id', $plantId) - ->where('item_id', $ItemId) - ->where('machine_id', $MachineId) - ->whereHas('approver', function ($query) use ($requestType) { - $query->where('approver_type', $requestType); - }) - ->with('approver') // Optional: eager load for later use - ->first(); - if ($requestType == 'Characteristic') { - $appTypExist = CharacteristicApproverMaster::where('characteristic_field', $charField)->where('machine_id', $MachineId)->where('machine_name', $machineName)->where('plant_id', $plantId)->where('approver_type', 'Characteristic')->first(); + $appTypExist = CharacteristicApproverMaster::where('characteristic_field', $charField)->where('approver_type', $requestType)->where('machine_name', $machineName)->where('machine_id', $machineId)->where('plant_id', $plantId)->first(); if (! $appTypExist) { return response()->json([ 'status_code' => 'ERROR', @@ -4454,10 +4895,15 @@ class CharacteristicsController extends Controller ], 404); } + $reqCharExist = RequestCharacteristic::where('aufnr', $jobNo)->where('item_id', $itemId) + ->whereHas('approver', function ($query) use ($requestType) { + $query->where('approver_type', $requestType); + })->where('machine_id', $machineId)->where('plant_id', $plantId)->first(); + if (! $reqCharExist) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Request characteristic approvals not found for the Job number '{$jobNo}', item code '{$itemCode}', work center '{$workCenter}' and plant code '{$plantCode}'!", + 'status_description' => "Request characteristic approvals not found for the Job number '{$jobNo}', item code '{$itemCode}', work center '{$workCenter}', model type '{$modelType}' and plant code '{$plantCode}'!", ], 404); } @@ -4471,8 +4917,8 @@ class CharacteristicsController extends Controller } $charWfIdExist = RequestCharacteristic::where('work_flow_id', $workFlowId) - ->whereHas('approver', function ($query) { - $query->where('approver_type', 'Characteristic'); + ->whereHas('approver', function ($query) use ($requestType) { + $query->where('approver_type', $requestType); }) ->first(); if (! $charWfIdExist) { @@ -4483,7 +4929,7 @@ class CharacteristicsController extends Controller } } } else { - $appTypExist = CharacteristicApproverMaster::where('characteristic_field', $charField)->where('machine_id', $MachineId)->where('machine_name', $machineName)->where('plant_id', $plantId)->where('approver_type', 'Quality')->first(); + $appTypExist = CharacteristicApproverMaster::where('characteristic_field', $charField)->where('approver_type', $requestType)->where('machine_name', $machineName)->where('machine_id', $machineId)->where('plant_id', $plantId)->first(); if (! $appTypExist) { return response()->json([ 'status_code' => 'ERROR', @@ -4491,10 +4937,15 @@ class CharacteristicsController extends Controller ], 404); } + $reqCharExist = RequestCharacteristic::where('aufnr', $jobNo)->where('item_id', $itemId)->where('model_type', $modelType) + ->whereHas('approver', function ($query) use ($requestType) { + $query->where('approver_type', $requestType); + })->where('machine_id', $machineId)->where('plant_id', $plantId)->first(); + if (! $reqCharExist) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Request quality approvals not found for the Job number '{$jobNo}', item code '{$itemCode}', work center '{$workCenter}' and plant code '{$plantCode}'!", + 'status_description' => "Request quality approvals not found for the Job number '{$jobNo}', item code '{$itemCode}', work center '{$workCenter}', model type '{$modelType}' and plant code '{$plantCode}'!", ], 404); } @@ -4508,8 +4959,8 @@ class CharacteristicsController extends Controller } $qualWfIdExist = RequestCharacteristic::where('work_flow_id', $workFlowId) - ->whereHas('approver', function ($query) { - $query->where('approver_type', 'Quality'); + ->whereHas('approver', function ($query) use ($requestType) { + $query->where('approver_type', $requestType); }) ->first(); if (! $qualWfIdExist) { @@ -4521,149 +4972,169 @@ class CharacteristicsController extends Controller } } - // .. - - $classRow = ClassCharacteristic::where('plant_id', $plantId) - ->where('machine_id', $MachineId) - ->where('aufnr', $jobNo) - ->first(); + $classRow = ClassCharacteristic::where('aufnr', $jobNo)->where('machine_id', $machineId)->where('plant_id', $plantId)->latest()->first(); if ($classRow) { - if ($requestType == 'Characteristic') { - $requestChars = RequestCharacteristic::where('plant_id', $plantId) - ->where('machine_id', $MachineId) - ->where('aufnr', $jobNo) - ->get(); + $requestChars = RequestCharacteristic::where('aufnr', $jobNo) + ->whereHas('approver', function ($query) { + $query->where('approver_type', 'Characteristic'); + })->where('machine_id', $machineId)->where('plant_id', $plantId)->get(); - if (! $requestChars->isEmpty()) { - $hasPending = false; - $allApproved = true; + $tempClassChars = TempClassCharacteristic::where('aufnr', $jobNo)->where('machine_id', $machineId)->where('plant_id', $plantId)->get(); - foreach ($requestChars as $row) { + if (! $requestChars->isEmpty()) { + $hasCharPending = false; + $hasQualPending = false; + $allCharApproved = true; + $allQualApproved = true; - $isApproved = ( - $row->approver_status1 == 'Approved' || $row->approver_status1 == 'Rejected' || - $row->approver_status2 == 'Approved' || $row->approver_status2 == 'Rejected' || - $row->approver_status3 == 'Approved' || $row->approver_status2 == 'Rejected' - ); + foreach ($requestChars as $row) { + $isApproved = ($row->approver_status1 == 'Approved' || $row->approver_status1 == 'Rejected' || $row->approver_status2 == 'Approved' || $row->approver_status2 == 'Rejected' || $row->approver_status3 == 'Approved' || $row->approver_status3 == 'Rejected'); - if (! $isApproved) { - $isPending = ! empty($row->mail_status) && - ( - empty($row->approver_status1) || $row->approver_status1 == 'Hold' || - empty($row->approver_status2) || $row->approver_status2 == 'Hold' || - empty($row->approver_status3) || $row->approver_status3 == 'Hold' - ); - if ($isPending) { - $hasPending = true; - $allApproved = false; - break; - } - - $allApproved = false; - } + if (! $isApproved) { + $allCharApproved = false; + $hasCharPending = true; + break; } + } - $current = $classRow->has_work_flow_id ?? '0'; + if ($hasCharPending) { + $newValue = '3'; + TempClassCharacteristic::where('aufnr', $jobNo)->where('machine_id', $machineId)->where('plant_id', $plantId)->forceDelete(); - if ($hasPending) { - if ($current == '0') { - $newValue = '1'; - } elseif ($current == '1') { - $newValue = '1'; - } elseif ($current == '2') { - $newValue = '3'; - } elseif ($current == '3') { - $newValue = '3'; - } - } elseif ($allApproved) { - if ($current == '0') { - $newValue = '0'; - } elseif ($current == '1') { - $newValue = '0'; - } elseif ($current == '2') { - $newValue = '2'; - } elseif ($current == '3') { - $newValue = '2'; - } - } - - ClassCharacteristic::where('plant_id', $plantId) - ->where('machine_id', $MachineId) - ->where('aufnr', $jobNo) - ->update([ - 'has_work_flow_id' => $newValue, - 'updated_at' => now(), + foreach ($typesToCreate as $type) { + TempClassCharacteristic::create([ + 'plant_id' => $plantId, + 'machine_id' => $machineId, + 'item_id' => $itemId, + 'aufnr' => $jobNo, + 'model_type' => $type, + 'has_work_flow_id' => '2', + 'created_by' => $userName, 'updated_by' => $userName, ]); - } - } elseif ($requestType == 'Quality') { - - $requestChar = RequestCharacteristic::where('plant_id', $plantId) - ->where('machine_id', $MachineId) - ->where('aufnr', $jobNo) - ->latest() - ->first(); - - if ($requestChar) { - - $current = $requestChar->has_work_flow_id ?? '0'; - - $isApproved = - $requestChar->approver_status1 == 'Approved' || - $requestChar->approver_status2 == 'Approved' || - $requestChar->approver_status3 == 'Approved'; - - if ($isApproved) { - if ($current == '0') { - $newValue = '0'; - } elseif ($current == '1') { - $newValue = '1'; - } elseif ($current == '2') { - $newValue = '0'; - } elseif ($current == '3') { - $newValue = '1'; + } + } elseif (! $tempClassChars->isEmpty()) { + foreach ($tempClassChars as $temp) { + if ($temp->has_work_flow_id == '1' || $temp->has_work_flow_id == '2') { + $hasQualPending = true; + $allQualApproved = false; + break; } - } elseif ( - $requestChar->approver_status1 == 'Hold' || $requestChar->approver_status1 == 'Rejected' || $requestChar->approver_status1 == null || $requestChar->approver_status1 == '' || - $requestChar->approver_status2 == 'Hold' || $requestChar->approver_status2 == 'Rejected' || $requestChar->approver_status2 == null || $requestChar->approver_status2 == '' || - $requestChar->approver_status3 == 'Hold' || $requestChar->approver_status3 == 'Rejected' || $requestChar->approver_status3 == null || $requestChar->approver_status3 == '' - ) { - if ($current == '0') { - $newValue = '2'; - } elseif ($current == '1') { - $newValue = '3'; - } elseif ($current == '2') { - $newValue = '2'; - } elseif ($current == '3') { - $newValue = '3'; + + if ($temp->has_work_flow_id == '0') { + $allQualApproved = true; } } + + if ($hasQualPending) { + $newValue = '2'; + } elseif ($allQualApproved) { + $newValue = '0'; + } + } elseif ($allCharApproved) { + $newValue = '0'; } - ClassCharacteristic::where('plant_id', $plantId) - ->where('machine_id', $MachineId) - ->where('aufnr', $jobNo) + ClassCharacteristic::where('aufnr', $jobNo)->where('machine_id', $machineId)->where('plant_id', $plantId) ->update([ 'has_work_flow_id' => $newValue, 'updated_at' => now(), 'updated_by' => $userName, ]); + } elseif (! $tempClassChars->isEmpty()) { + $hasQualPending = false; + $allQualApproved = true; + + foreach ($tempClassChars as $temp) { + if ($temp->has_work_flow_id == '1' || $temp->has_work_flow_id == '2') { + $hasQualPending = true; + $allQualApproved = false; + break; + } + + if ($temp->has_work_flow_id == '0') { + $allQualApproved = true; + } + } + + if ($hasQualPending) { + $newValue = '2'; + } elseif ($allQualApproved) { + $newValue = '0'; + } + + ClassCharacteristic::where('aufnr', $jobNo)->where('machine_id', $machineId)->where('plant_id', $plantId) + ->update([ + 'has_work_flow_id' => $newValue, + 'updated_at' => now(), + 'updated_by' => $userName, + ]); + } else { + ClassCharacteristic::where('aufnr', $jobNo)->where('machine_id', $machineId)->where('plant_id', $plantId) + ->update([ + 'has_work_flow_id' => '0', + 'updated_at' => now(), + 'updated_by' => $userName, + ]); + } + } else { + $requestChars = RequestCharacteristic::where('aufnr', $jobNo) + ->whereHas('approver', function ($query) { + $query->where('approver_type', 'Characteristic'); + })->where('machine_id', $machineId)->where('plant_id', $plantId)->get(); + + if (! $requestChars->isEmpty()) { + $hasCharPending = false; + + foreach ($requestChars as $row) { + $isApproved = ($row->approver_status1 == 'Approved' || $row->approver_status1 == 'Rejected' || $row->approver_status2 == 'Approved' || $row->approver_status2 == 'Rejected' || $row->approver_status3 == 'Approved' || $row->approver_status3 == 'Rejected'); + + if (! $isApproved) { + $hasCharPending = true; + break; + } + } + + if ($hasCharPending) { + TempClassCharacteristic::where('aufnr', $jobNo)->where('machine_id', $machineId)->where('plant_id', $plantId)->forceDelete(); + + foreach ($typesToCreate as $type) { + TempClassCharacteristic::create([ + 'plant_id' => $plantId, + 'machine_id' => $machineId, + 'item_id' => $itemId, + 'aufnr' => $jobNo, + 'model_type' => $type, + 'has_work_flow_id' => '2', + 'created_by' => $userName, + 'updated_by' => $userName, + ]); + } + } } } if (! $workFlowId) { - $records = RequestCharacteristic::with('approver')->where('aufnr', $jobNo)->where('plant_id', $plantId)->where('item_id', $ItemId)->where('machine_id', $MachineId)->whereHas('approver', function ($query) use ($requestType) { - $query->where('approver_type', $requestType); - })->orderBy('id')->get(); + $records = null; + + if ($requestType == 'Characteristic') { + $records = RequestCharacteristic::where('aufnr', $jobNo)->where('item_id', $itemId) + ->whereHas('approver', function ($query) use ($requestType) { + $query->where('approver_type', $requestType); + })->where('machine_id', $machineId)->where('plant_id', $plantId)->orderBy('id')->get(); + } else { + $records = RequestCharacteristic::where('aufnr', $jobNo)->where('item_id', $itemId)->where('model_type', $modelType) + ->whereHas('approver', function ($query) use ($requestType) { + $query->where('approver_type', $requestType); + })->where('machine_id', $machineId)->where('plant_id', $plantId)->orderBy('id')->get(); + } $response = []; foreach ($records as $row) { if ($requestType == 'Characteristic') { - $workFlowStatus = ( - ($row->approver_status1 == 'Approved') || ($row->approver_status2 == 'Approved') || ($row->approver_status3 == 'Approved') || ($row->approver_status1 == 'Rejected') || ($row->approver_status2 == 'Rejected') || ($row->approver_status3 == 'Rejected') - ) ? '0' : '1'; + $workFlowStatus = ($row->approver_status1 == 'Approved' || $row->approver_status2 == 'Approved' || $row->approver_status3 == 'Approved' || $row->approver_status1 == 'Rejected' || $row->approver_status2 == 'Rejected' || $row->approver_status3 == 'Rejected') ? '0' : '1'; // if ($row->approver?->approver_type != 'Characteristic' || ! $row->characteristic_name) { // continue; @@ -4672,6 +5143,7 @@ class CharacteristicsController extends Controller $response[] = [ 'work_flow_id' => (string) $row->work_flow_id, 'work_flow_status' => $workFlowStatus, + 'model_type' => strtoupper($row->model_type) ?? '', 'characteristic_name' => strtoupper($row->characteristic_name) ?? '', 'current_value' => $row->current_value ?? '', 'update_value' => $row->update_value ?? '', @@ -4694,6 +5166,10 @@ class CharacteristicsController extends Controller } else { $workFlowStatus = ($row->approver_status1 == 'Approved' || $row->approver_status2 == 'Approved' || $row->approver_status3 == 'Approved') ? '0' : '1'; + if ($workFlowStatus == '1') { + $workFlowStatus = ($row->approver_status1 == 'Rejected' || $row->approver_status2 == 'Rejected' || $row->approver_status3 == 'Rejected') ? '2' : '1'; + } + // if ($row->approver?->approver_type != 'Quality' || $row->characteristic_name) { // continue; // } @@ -4701,7 +5177,8 @@ class CharacteristicsController extends Controller $response[] = [ 'work_flow_id' => (string) $row->work_flow_id, 'work_flow_status' => $workFlowStatus, - // 'approver_name_1' => $row->approver_name1 ?? '', + 'model_type' => strtoupper($row->model_type) ?? '', + // 'approver_name_1' => $row->approver_name1 ?? '', 'approver_name_1' => $row->approver?->name1 ?? '', 'approver_status_1' => $row->approver_status1 ?? '', 'approver_remark_1' => $row->approver_remark1 ?? '', @@ -4733,7 +5210,7 @@ class CharacteristicsController extends Controller if (! $workFlowIdExist) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Work Flow ID '{$workFlowId}' not found in database!", + 'status_description' => "Work Flow ID '{$workFlowId}' not found in request approval table!", ], 404); } From 80d7258ae008158bca2769c5471b9861f4efb74f Mon Sep 17 00:00:00 2001 From: dhanabalan Date: Mon, 11 May 2026 10:25:47 +0530 Subject: [PATCH 2/7] Added automatic rejection logic and added template quality characteristics --- .../Commands/TriggerPendingApprovalMails.php | 141 +++++++++++++++++- 1 file changed, 139 insertions(+), 2 deletions(-) diff --git a/app/Console/Commands/TriggerPendingApprovalMails.php b/app/Console/Commands/TriggerPendingApprovalMails.php index 3673398..c914972 100644 --- a/app/Console/Commands/TriggerPendingApprovalMails.php +++ b/app/Console/Commands/TriggerPendingApprovalMails.php @@ -5,9 +5,12 @@ namespace App\Console\Commands; use App\Mail\CharacteristicApprovalMail; use App\Models\CharacteristicApproverMaster; use App\Models\RequestCharacteristic; +use App\Models\TempClassCharacteristic; +// use App\Models\TempClassCharacteristic; use Illuminate\Console\Command; use Illuminate\Support\Facades\Mail; use Illuminate\Support\Carbon; +use Illuminate\Support\Facades\Schema; class TriggerPendingApprovalMails extends Command { @@ -40,6 +43,8 @@ class TriggerPendingApprovalMails extends Command public $subjectLine; + // public $tempCharacteristics = []; + public $wfId; public function handle() @@ -195,6 +200,38 @@ class TriggerPendingApprovalMails extends Command $updateData['mail_status'] = 'Sent-Mail3'; } + $totalMinutes = + $this->convertToMinutes($approver->duration1 ?? 0) + + $this->convertToMinutes($approver->duration2 ?? 0) + + $this->convertToMinutes($approver->duration3 ?? 0); + + $expiryTime = Carbon::parse($first->created_at) + ->copy() + ->addMinutes($totalMinutes); + + $ids = $groupRecords->pluck('id'); + + $this->info("Expiry Time for ID {$first->id}: {$expiryTime}, Now: {$now}"); + + // --- AUTO REJECT --- + if ( + $first->mail_status == 'Sent-Mail3' && + (is_null($first->approver_status1) || $first->approver_status1 == 'Hold') && + (is_null($first->approver_status2) || $first->approver_status2 == 'Hold') && + (is_null($first->approver_status3) || $first->approver_status3 == 'Hold') && + $now->gte($expiryTime) + ) { + RequestCharacteristic::whereIn('id', $ids) + ->update([ + 'approver_status3' => 'Rejected', + 'approver_remark3' => 'Time Limit Reached', + 'approved3_at' => now(), + ]); + + $this->info("Auto Rejected ID: {$first->id}"); + continue; + } + if (!$level || !$mail) { continue; } @@ -203,6 +240,8 @@ class TriggerPendingApprovalMails extends Command $subjectLine = 'Characteristic Approval Mail'; + // $emails = array_map('trim', explode(',', $mail)); + Mail::to($mail)->send( new CharacteristicApprovalMail( $first, @@ -251,6 +290,23 @@ class TriggerPendingApprovalMails extends Command return $approver && $approver->approver_type == 'Quality'; }); + // $approvers = CharacteristicApproverMaster::where('approver_type', 'Quality') + // ->get() + // ->keyBy('id'); + + // $qualityRecords = RequestCharacteristic::where(function ($q) { + // $q->whereNull('approver_status1')->orWhere('approver_status1', 'Hold'); + // }) + // ->where(function ($q) { + // $q->whereNull('approver_status2')->orWhere('approver_status2', 'Hold'); + // }) + // ->where(function ($q) { + // $q->whereNull('approver_status3')->orWhere('approver_status3', 'Hold'); + // }) + // ->whereIn('characteristic_approver_master_id', $approvers->keys()) + // ->get(); + + if ($qualityRecords->isEmpty()) { $this->info('No quality pending approvals'); return; @@ -283,6 +339,43 @@ class TriggerPendingApprovalMails extends Command continue; } + $columns = Schema::getColumnListing('temp_class_characteristics'); + + $exclude = ['id', 'plant_id', 'machine_id', 'item_id', 'aufnr', 'class', 'arbid', 'gamng', 'lmnga', 'zz1_cn_bill_ord', 'zmm_heading', 'created_at', 'updated_at', 'deleted_at', 'has_work_flow_id', 'model_type', 'created_by', 'updated_by' ]; + + $filteredColumns = array_diff($columns, $exclude); + + $row1 = TempClassCharacteristic::where('plant_id', $first->plant_id) + ->where('machine_id', $first->machine_id) + ->where('aufnr', $first->aufnr) + ->where('model_type', $first->model_type) + ->latest() + ->first(); + + $this->info(json_encode([ + 'id' => $row1->id, + 'plant_id' => $row1->plant_id, + 'machine_id' => $row1->machine_id, + 'aufnr' => $row1->aufnr, + 'motor_speed' => $row1->zmm_motor_speed, + 'all_data' => $row1->toArray(), + ])); + + $data = []; + + if ($row1) { + foreach ($filteredColumns as $column) { + + $value = $row1->getAttribute($column); + + if ($value != null && $value != '') { + $data[$column] = $value; + } + } + } + + $characteristics = $data; + $level = null; $mail = null; $name = null; @@ -359,6 +452,38 @@ class TriggerPendingApprovalMails extends Command $updateData['mail_status'] = 'Sent-Mail3'; } + $totalMinutes = + $this->convertToMinutes($approver->duration1 ?? 0) + + $this->convertToMinutes($approver->duration2 ?? 0) + + $this->convertToMinutes($approver->duration3 ?? 0); + + $expiryTime = Carbon::parse($first->created_at) + ->copy() + ->addMinutes($totalMinutes); + + $ids = $groupRecords->pluck('id'); + + $this->info("Expiry Time for ID {$first->id}: {$expiryTime}, Now: {$now}"); + + // --- AUTO REJECT --- + if ( + $first->mail_status == 'Sent-Mail3' && + (is_null($first->approver_status1) || $first->approver_status1 == 'Hold') && + (is_null($first->approver_status2) || $first->approver_status2 == 'Hold') && + (is_null($first->approver_status3) || $first->approver_status3 == 'Hold') && + $now->gte($expiryTime) + ) { + RequestCharacteristic::whereIn('id', $ids) + ->update([ + 'approver_status3' => 'Rejected', + 'approver_remark3' => 'Time Limit Reached', + 'approved3_at' => now(), + ]); + + $this->info("Auto Rejected ID: {$first->id}"); + continue; + } + if (!$level || !$mail) { continue; } @@ -381,8 +506,8 @@ class TriggerPendingApprovalMails extends Command $pdfPath, $pendingApprovers, $approverNameFromMaster, - $subjectLine - // $characteristics + $subjectLine, + $characteristics ) ); @@ -406,4 +531,16 @@ class TriggerPendingApprovalMails extends Command $this->info('Approval mail job completed'); } + + public function convertToMinutes($duration) + { + if (!$duration) return 0; + + $parts = explode('.', (string)$duration); + + $hours = (int)($parts[0] ?? 0); + $minutes = (int)($parts[1] ?? 0); + + return ($hours * 60) + $minutes; + } } From 1ddd27433c2ddab7d0f39c767418db1da15e1344 Mon Sep 17 00:00:00 2001 From: dhanabalan Date: Mon, 11 May 2026 10:27:19 +0530 Subject: [PATCH 3/7] Added in mail blade file for template of quality --- .../mail/characteristic-approval.blade.php | 36 ++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/resources/views/mail/characteristic-approval.blade.php b/resources/views/mail/characteristic-approval.blade.php index a58549f..f5495bd 100644 --- a/resources/views/mail/characteristic-approval.blade.php +++ b/resources/views/mail/characteristic-approval.blade.php @@ -33,6 +33,10 @@ Job Number {{ $request->aufnr }} + + Model Type + {{ $request->model_type }} + Work Flow ID {{ $request->work_flow_id }} @@ -103,8 +107,8 @@ Approve     |     - Hold -     |     + {{-- Hold +     |     --}} Reject @@ -123,6 +127,30 @@ @endif @elseif($approverNameFromMaster && $approverNameFromMaster->approver_type == 'Quality') +{{-- --}} +
+ + + + + + + + + + @forelse ($tableData as $key => $value) + + + + + @empty + + + + @endforelse +
+ TEMPLATE CHARACTERISTICS +
NameValue
{{ strtoupper($key) }}{{ $value }}
No Characteristics Found

@@ -159,8 +187,8 @@ From 63c1cc14b252413720dc4fd137e048016acd079b Mon Sep 17 00:00:00 2001 From: dhanabalan Date: Mon, 11 May 2026 10:28:25 +0530 Subject: [PATCH 4/7] Added characteristics array in Mail page --- app/Mail/CharacteristicApprovalMail.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/Mail/CharacteristicApprovalMail.php b/app/Mail/CharacteristicApprovalMail.php index 88f4cc6..54a8f55 100644 --- a/app/Mail/CharacteristicApprovalMail.php +++ b/app/Mail/CharacteristicApprovalMail.php @@ -29,6 +29,8 @@ class CharacteristicApprovalMail extends Mailable public $subjectLine; + public $characteristics; + /** * Create a new message instance. */ From 8e2a0e79dc907fce9965fdba92fe6377517a2e54 Mon Sep 17 00:00:00 2001 From: dhanabalan Date: Mon, 11 May 2026 10:33:43 +0530 Subject: [PATCH 5/7] Updated report column view and filter logic with validations --- .../TempClassCharacteristicResource.php | 82 +++++++++++++------ 1 file changed, 58 insertions(+), 24 deletions(-) diff --git a/app/Filament/Resources/TempClassCharacteristicResource.php b/app/Filament/Resources/TempClassCharacteristicResource.php index 8f31706..4db6d17 100644 --- a/app/Filament/Resources/TempClassCharacteristicResource.php +++ b/app/Filament/Resources/TempClassCharacteristicResource.php @@ -5,28 +5,27 @@ namespace App\Filament\Resources; use App\Filament\Exports\TempClassCharacteristicExporter; use App\Filament\Imports\TempClassCharacteristicImporter; use App\Filament\Resources\TempClassCharacteristicResource\Pages; -use App\Filament\Resources\TempClassCharacteristicResource\RelationManagers; use App\Models\Item; use App\Models\Machine; use App\Models\Plant; use App\Models\TempClassCharacteristic; use Filament\Facades\Filament; use Filament\Forms; +use Filament\Forms\Components\DateTimePicker; +use Filament\Forms\Components\Section; +use Filament\Forms\Components\Select; +use Filament\Forms\Components\TextInput; use Filament\Forms\Form; +use Filament\Forms\Get; use Filament\Resources\Resource; use Filament\Tables; -use Filament\Tables\Table; -use Illuminate\Database\Eloquent\Builder; -use Illuminate\Database\Eloquent\SoftDeletingScope; -use Filament\Forms\Components\Section; -use Filament\Forms\Get; -use Illuminate\Validation\Rule; use Filament\Tables\Actions\ExportAction; use Filament\Tables\Actions\ImportAction; use Filament\Tables\Filters\Filter; -use Filament\Forms\Components\DateTimePicker; -use Filament\Forms\Components\Select; -use Filament\Forms\Components\TextInput; +use Filament\Tables\Table; +use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\SoftDeletingScope; +use Illuminate\Validation\Rule; class TempClassCharacteristicResource extends Resource { @@ -1029,6 +1028,10 @@ class TempClassCharacteristicResource extends Resource ->alignCenter() ->searchable() ->sortable(), + Tables\Columns\TextColumn::make('model_type') + ->label('MODEL TYPE') + ->alignCenter() + ->sortable(), Tables\Columns\TextColumn::make('aufnr') ->label('AUFNR') ->alignCenter() @@ -1055,10 +1058,6 @@ class TempClassCharacteristicResource extends Resource ->alignCenter() ->searchable() ->sortable(), - Tables\Columns\TextColumn::make('model_type') - ->label('MODEL TYPE') - ->alignCenter() - ->sortable(), Tables\Columns\TextColumn::make('zz1_cn_bill_ord') ->label('ZZ1 CN BILL ORD') ->alignCenter() @@ -1181,6 +1180,7 @@ class TempClassCharacteristicResource extends Resource ->sortable(), Tables\Columns\TextColumn::make('zmm_ratedpower') ->label('ZMM RATEDPOWER') + ->alignCenter() ->sortable(), Tables\Columns\TextColumn::make('zmm_region') ->label('ZMM REGION') @@ -1577,14 +1577,12 @@ class TempClassCharacteristicResource extends Resource Tables\Columns\TextColumn::make('winded_serial_number') ->label('WINDED SERIAL NUMBER') ->alignCenter() + ->searchable() ->sortable(), - Tables\Columns\TextColumn::make('part_validation_1') - ->label('PART VALIDATION 1') - ->alignCenter() - ->sortable(), - Tables\Columns\TextColumn::make('part_validation_2') - ->label('PART VALIDATION 2') + Tables\Columns\TextColumn::make('model_type') + ->label('MODEL TYPE') ->alignCenter() + ->searchable() ->sortable(), Tables\Columns\TextColumn::make('has_work_flow_id') ->label('HAS WORK FLOW ID') @@ -1599,14 +1597,28 @@ class TempClassCharacteristicResource extends Resource }; }), Tables\Columns\TextColumn::make('created_at') + ->label('CREATED AT') + ->alignCenter() + ->dateTime() + ->sortable(), + Tables\Columns\TextColumn::make('created_by') + ->label('CREATED BY') + ->alignCenter() + ->sortable(), + Tables\Columns\TextColumn::make('updated_at') + ->label('UPDATED AT') + ->alignCenter() ->dateTime() ->sortable() ->toggleable(isToggledHiddenByDefault: true), - Tables\Columns\TextColumn::make('updated_at') - ->dateTime() + Tables\Columns\TextColumn::make('updated_by') + ->label('UPDATED BY') + ->alignCenter() ->sortable() ->toggleable(isToggledHiddenByDefault: true), Tables\Columns\TextColumn::make('deleted_at') + ->label('DELETED AT') + ->alignCenter() ->dateTime() ->sortable() ->toggleable(isToggledHiddenByDefault: true), @@ -1690,6 +1702,12 @@ class TempClassCharacteristicResource extends Resource TextInput::make('gernr') ->label('Serial Number') ->placeholder('Enter Serial Number'), + TextInput::make('zmm_heading') + ->label('Heading') + ->placeholder('Enter Heading'), + TextInput::make('model_type') + ->label('Model Type') + ->placeholder('Enter Model Type'), Select::make('work_flow_status') ->label('Work Flow Status') ->placeholder('Select Work Flow Status') @@ -1711,7 +1729,7 @@ class TempClassCharacteristicResource extends Resource ]) ->query(function ($query, array $data) { // Hide all records initially if no filters are applied - if (empty($data['Plant']) && empty($data['machine']) && empty($data['item_id']) && empty($data['aufnr']) && empty($data['gernr']) && empty($data['created_from']) && empty($data['created_to']) && !array_key_exists('work_flow_status', $data)) { + if (empty($data['Plant']) && empty($data['machine']) && empty($data['item_id']) && empty($data['aufnr']) && empty($data['gernr']) && empty($data['zmm_heading']) && empty($data['model_type']) && empty($data['created_from']) && empty($data['created_to'])) { return $query->whereRaw('1 = 0'); } @@ -1741,6 +1759,14 @@ class TempClassCharacteristicResource extends Resource $query->where('gernr', 'like', '%'.$data['gernr'].'%'); } + if (! empty($data['zmm_heading'])) { + $query->where('zmm_heading', 'like', '%'.$data['zmm_heading'].'%'); + } + + if (! empty($data['model_type'])) { + $query->where('model_type', 'like', '%'.$data['model_type'].'%'); + } + if (array_key_exists('work_flow_status', $data) && $data['work_flow_status'] != '') { $query->where('has_work_flow_id', $data['work_flow_status']); } @@ -1782,6 +1808,14 @@ class TempClassCharacteristicResource extends Resource $indicators[] = 'Serial Number: '.$data['gernr']; } + if (! empty($data['zmm_heading'])) { + $indicators[] = 'Heading: '.$data['zmm_heading']; + } + + if (! empty($data['model_type'])) { + $indicators[] = 'Model Type: '.$data['model_type']; + } + if (array_key_exists('work_flow_status', $data) && $data['work_flow_status'] != '') { $statusMap = [ '1' => 'Pending Approval', @@ -1789,7 +1823,7 @@ class TempClassCharacteristicResource extends Resource '0' => 'Approved', ]; - $indicators[] = 'Work Flow Status: ' . ($statusMap[$data['work_flow_status']] ?? ''); + $indicators[] = 'Work Flow Status: '.($statusMap[$data['work_flow_status']] ?? ''); } if (! empty($data['created_from'])) { From bce19056c775267bd9521281e291bf8436e1e457 Mon Sep 17 00:00:00 2001 From: dhanabalan Date: Mon, 11 May 2026 10:39:20 +0530 Subject: [PATCH 6/7] Added request characteristic importer and model_type column added and updated report filter logic --- .../Imports/RequestCharacteristicImporter.php | 141 ++++++++++ .../CharacteristicApproverMasterResource.php | 201 ++++++++++++++ .../Resources/ClassCharacteristicResource.php | 24 +- .../RequestCharacteristicResource.php | 255 +++++++++++++++++- 4 files changed, 610 insertions(+), 11 deletions(-) create mode 100644 app/Filament/Imports/RequestCharacteristicImporter.php diff --git a/app/Filament/Imports/RequestCharacteristicImporter.php b/app/Filament/Imports/RequestCharacteristicImporter.php new file mode 100644 index 0000000..83b9daf --- /dev/null +++ b/app/Filament/Imports/RequestCharacteristicImporter.php @@ -0,0 +1,141 @@ +requiredMapping() + ->exampleHeader('PLANT CODE') + ->example('1000') + ->label('PLANT CODE') + ->relationship(resolveUsing: 'code') + ->rules(['required']), + ImportColumn::make('machine') + ->requiredMapping() + ->exampleHeader('WORK CENTER') + ->example('RMGLAS01') + ->label('WORK CENTER') + ->relationship(resolveUsing: 'work_center') + ->rules(['required']), + ImportColumn::make('item') + ->requiredMapping() + ->exampleHeader('ITEM CODE') + ->example('630214') + ->label('ITEM CODE') + ->relationship(resolveUsing: 'code') + ->rules(['required']), + ImportColumn::make('characteristicApproverMaster') + ->requiredMapping() + ->relationship() + ->rules(['required']), + ImportColumn::make('aufnr') + ->label('AUFNR') + ->exampleHeader('AUFNR') + ->example('1234567'), + ImportColumn::make('characteristic_name') + ->label('CHARACTERISTIC NAME') + ->exampleHeader('CHARACTERISTIC NAME') + ->example('ZMM_PUMPSET_MODEL'), + ImportColumn::make('current_value') + ->label('CURRENT VALUE') + ->exampleHeader('CURRENT VALUE') + ->example('MVN-32/02 D R'), + ImportColumn::make('update_value') + ->label('UPDATE VALUE') + ->exampleHeader('UPDATE VALUE') + ->example('MVN-32/02 TR3'), + ImportColumn::make('approver_status1') + ->label('APPROVER STATUS 1') + ->exampleHeader('APPROVER STATUS 1') + ->example('Hold'), + ImportColumn::make('approver_status2') + ->label('APPROVER STATUS 2') + ->exampleHeader('APPROVER STATUS 2') + ->example('Approved'), + ImportColumn::make('approver_status3') + ->label('APPROVER STATUS 3') + ->exampleHeader('APPROVER STATUS 3') + ->example('Rejected'), + ImportColumn::make('approver_remark1') + ->label('APPROVER REMARK 1') + ->exampleHeader('APPROVER REMARK 1') + ->example('Hold for review'), + ImportColumn::make('approver_remark2') + ->label('APPROVER REMARK 2') + ->exampleHeader('APPROVER REMARK 2') + ->example('Approved with comments'), + ImportColumn::make('approver_remark3') + ->label('APPROVER REMARK 3') + ->exampleHeader('APPROVER REMARK 3') + ->example('Rejected due to incorrect value'), + ImportColumn::make('work_flow_id') + ->label('WORK FLOW ID') + ->exampleHeader('WORK FLOW ID') + ->example('WF-260303-0001'), + ImportColumn::make('mail_status') + ->label('MAIL STATUS') + ->exampleHeader('MAIL STATUS') + ->example('Sent'), + ImportColumn::make('trigger_at') + ->label('TRIGGER AT') + ->exampleHeader('MAIL STATUS') + ->rules(['datetime']), + ImportColumn::make('approved1_at') + ->label('APPROVED1 AT') + ->exampleHeader('APPROVED1 AT') + ->rules(['datetime']), + ImportColumn::make('approved2_at') + ->label('APPROVED2 AT') + ->exampleHeader('APPROVED2 AT') + ->rules(['datetime']), + ImportColumn::make('approved3_at') + ->label('APPROVED3 AT') + ->exampleHeader('APPROVED3 AT') + ->rules(['datetime']), + ImportColumn::make('created_by') + ->label('CREATED BY') + ->exampleHeader('CREATED BY') + ->example('RAW01234'), + ImportColumn::make('updated_by') + ->label('UPDATED BY') + ->exampleHeader('UPDATED BY') + ->example('RAW01234'), + ImportColumn::make('model_type') + ->label('MODEL TYPE') + ->exampleHeader('MODEL TYPE') + ->example('PUMP'), + ]; + } + + public function resolveRecord(): ?RequestCharacteristic + { + // return RequestCharacteristic::firstOrNew([ + // // Update existing records, matching them by `$this->data['column_name']` + // 'email' => $this->data['email'], + // ]); + + return new RequestCharacteristic(); + } + + public static function getCompletedNotificationBody(Import $import): string + { + $body = 'Your request characteristic 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; + } +} diff --git a/app/Filament/Resources/CharacteristicApproverMasterResource.php b/app/Filament/Resources/CharacteristicApproverMasterResource.php index bebe0cf..a4244de 100644 --- a/app/Filament/Resources/CharacteristicApproverMasterResource.php +++ b/app/Filament/Resources/CharacteristicApproverMasterResource.php @@ -6,6 +6,7 @@ use App\Filament\Exports\CharacteristicApproverMasterExporter; use App\Filament\Imports\CharacteristicApproverMasterImporter; use App\Filament\Resources\CharacteristicApproverMasterResource\Pages; use App\Models\CharacteristicApproverMaster; +use App\Models\Item; use App\Models\Machine; use App\Models\Plant; use Filament\Facades\Filament; @@ -20,6 +21,10 @@ use Filament\Tables\Table; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\SoftDeletingScope; use Illuminate\Validation\Rule; +use Filament\Forms\Components\DateTimePicker; +use Filament\Forms\Components\Select; +use Filament\Forms\Components\TextInput; +use Filament\Tables\Filters\Filter; class CharacteristicApproverMasterResource extends Resource { @@ -392,7 +397,203 @@ class CharacteristicApproverMasterResource extends Resource ]) ->filters([ Tables\Filters\TrashedFilter::make(), + Filter::make('advanced_filters') + ->label('Advanced Filters') + ->form([ + Select::make('Plant') + ->label('Search by Plant Name') + ->nullable() + ->searchable() + ->reactive() + ->options(function (callable $get) { + $userHas = Filament::auth()->user()->plant_id; + + if ($userHas && strlen($userHas) > 0) { + return Plant::where('id', $userHas)->pluck('name', 'id')->toArray(); + } else { + return Plant::whereHas('requestCharacteristics', function ($query) { + $query->whereNotNull('id'); + })->orderBy('code')->pluck('name', 'id'); + } + + // return ($userHas && strlen($userHas) > 0) ? Plant::where('id', $userHas)->pluck('name', 'id')->toArray() : Plant::orderBy('code')->pluck('name', 'id')->toArray(); + }) + ->afterStateUpdated(function ($state, callable $set, callable $get): void { + $set('machine', null); + // $set('aufnr', null); + }), + Select::make('machine') + ->label('Search by Work Center') + ->nullable() + ->searchable() + ->reactive() + ->options(function (callable $get) { + $plantId = $get('Plant'); + + if (empty($plantId)) { + return []; + } + + return Machine::whereHas('requestCharacteristics', function ($query) use ($plantId) { + if ($plantId) { + $query->where('plant_id', $plantId); + } + })->pluck('work_center', 'id'); + }) + ->afterStateUpdated(function ($state, callable $set, callable $get): void { + // $set('item_id', null); + // $set('aufnr', null); + }), + Select::make('approver_type') + ->label('Approver Type') + ->options([ + 'Characteristic' => 'Characteristic', + 'Quality' => 'Quality', + ]) + ->placeholder('Select Type') + ->afterStateUpdated(function ($state, callable $set) { + $set('name1', null); + $set('name2', null); + $set('name3', null); + }), + TextInput::make('machine_name') + ->label('Machine Name') + ->placeholder('Enter Machine Name'), + TextInput::make('characteristic_field') + ->label('Characteristic Field') + ->placeholder('Enter Characteristic Field'), + TextInput::make('name1') + ->label('Approver Name 1') + ->placeholder('Enter Approver Name 2') + ->afterStateUpdated(function ($state, callable $set) { + $set('name2', null); + $set('name3', null); + }), + TextInput::make('name2') + ->label('Approver Name 2') + ->placeholder('Enter Approver Name 2') + ->afterStateUpdated(function ($state, callable $set) { + $set('name3', null); + }), + TextInput::make('name3') + ->label('Approver Name 3') + ->placeholder('Enter Approver Name 2'), + DateTimePicker::make(name: 'created_from') + ->label('Created From') + ->placeholder('Select From DateTime') + ->reactive() + ->native(false), + DateTimePicker::make('created_to') + ->label('Created To') + ->placeholder('Select To DateTime') + ->reactive() + ->native(false), + ]) + ->query(function ($query, array $data) { + // Hide all records initially if no filters are applied + if (empty($data['Plant']) && empty($data['machine']) && empty($data['machine_name']) && empty($data['characteristic_field']) && empty($data['approver_type']) && empty($data['name1']) && empty($data['name2']) && empty($data['name3']) && empty($data['created_from']) && empty($data['created_to'])) { + return $query->whereRaw('1 = 0'); + } + + if (! empty($data['Plant'])) { // $plant = $data['Plant'] ?? null + $query->where('plant_id', $data['Plant']); + } else { + $userHas = Filament::auth()->user()->plant_id; + + if ($userHas && strlen($userHas) > 0) { + return $query->whereRaw('1 = 0'); + } + } + + if (! empty($data['machine'])) { + $query->where('machine_id', $data['machine']); + } + + if (! empty($data['machine_name'])) { + $query->where('machine_name', 'like', '%'.$data['machine_name'].'%'); + } + + if (! empty($data['characteristic_field'])) { + $query->where('characteristic_field', 'like', '%'.$data['characteristic_field'].'%'); + } + + if (! empty($data['approver_type'])) { + $query->where('approver_type', 'like', '%'.$data['approver_type'].'%'); + } + + if (! empty($data['name1'])) { + $query->where('name1', 'like', '%'.$data['name1'].'%'); + } + + if (! empty($data['name2'])) { + $query->where('name2', 'like', '%'.$data['name2'].'%'); + } + + if (! empty($data['name3'])) { + $query->where('name3', 'like', '%'.$data['name3'].'%'); + } + + if (! empty($data['created_from'])) { + $query->where('created_at', '>=', $data['created_from']); + } + + if (! empty($data['created_to'])) { + $query->where('created_at', '<=', $data['created_to']); + } + }) + ->indicateUsing(function (array $data) { + $indicators = []; + + if (! empty($data['Plant'])) { + $indicators[] = 'Plant Name: '.Plant::where('id', $data['Plant'])->value('name'); + } else { + $userHas = Filament::auth()->user()->plant_id; + + if ($userHas && strlen($userHas) > 0) { + return 'Plant: Choose plant to filter records.'; + } + } + + if (! empty($data['machine'])) { + $indicators[] = 'Work Center: '.Machine::where('id', $data['machine'])->value('work_center'); + } + + if (! empty($data['machine_name'])) { + $indicators[] = 'Machine Name: '.$data['machine_name']; + } + + if (! empty($data['characteristic_field'])) { + $indicators[] = 'Characteristic Field: '.$data['characteristic_field']; + } + + if (! empty($data['approver_type'])) { + $indicators[] = 'Approver Type: '.$data['approver_type']; + } + + if (! empty($data['name1'])) { + $indicators[] = 'Approver Name 1: '.$data['name1']; + } + + if (! empty($data['name2'])) { + $indicators[] = 'Approver Name 2: '.$data['name2']; + } + + if (! empty($data['name3'])) { + $indicators[] = 'Approver Name 3: '.$data['name3']; + } + + if (! empty($data['created_from'])) { + $indicators[] = 'From: '.$data['created_from']; + } + + if (! empty($data['created_to'])) { + $indicators[] = 'To: '.$data['created_to']; + } + + return $indicators; + }), ]) + ->filtersFormMaxHeight('280px') ->actions([ Tables\Actions\ViewAction::make(), Tables\Actions\EditAction::make(), diff --git a/app/Filament/Resources/ClassCharacteristicResource.php b/app/Filament/Resources/ClassCharacteristicResource.php index fa8cb52..6517e81 100644 --- a/app/Filament/Resources/ClassCharacteristicResource.php +++ b/app/Filament/Resources/ClassCharacteristicResource.php @@ -2028,6 +2028,12 @@ class ClassCharacteristicResource extends Resource TextInput::make('gernr') ->label('Serial Number') ->placeholder('Enter Serial Number'), + TextInput::make('zmm_heading') + ->label('Heading') + ->placeholder('Enter Heading'), + TextInput::make('model_type') + ->label('Model Type') + ->placeholder('Enter Model Type'), DateTimePicker::make(name: 'created_from') ->label('Created From') ->placeholder('Select From DateTime') @@ -2041,7 +2047,7 @@ class ClassCharacteristicResource extends Resource ]) ->query(function ($query, array $data) { // Hide all records initially if no filters are applied - if (empty($data['Plant']) && empty($data['machine']) && empty($data['item_id']) && empty($data['aufnr']) && empty($data['gernr']) && empty($data['created_from']) && empty($data['created_to'])) { + if (empty($data['Plant']) && empty($data['machine']) && empty($data['item_id']) && empty($data['aufnr']) && empty($data['gernr']) && empty($data['zmm_heading']) && empty($data['model_type']) && empty($data['created_from']) && empty($data['created_to'])) { return $query->whereRaw('1 = 0'); } @@ -2071,6 +2077,14 @@ class ClassCharacteristicResource extends Resource $query->where('gernr', 'like', '%'.$data['gernr'].'%'); } + if (! empty($data['zmm_heading'])) { + $query->where('zmm_heading', 'like', '%'.$data['zmm_heading'].'%'); + } + + if (! empty($data['model_type'])) { + $query->where('model_type', 'like', '%'.$data['model_type'].'%'); + } + if (! empty($data['created_from'])) { $query->where('created_at', '>=', $data['created_from']); } @@ -2108,6 +2122,14 @@ class ClassCharacteristicResource extends Resource $indicators[] = 'Serial Number: '.$data['gernr']; } + if (! empty($data['zmm_heading'])) { + $indicators[] = 'Heading: '.$data['zmm_heading']; + } + + if (! empty($data['model_type'])) { + $indicators[] = 'Model Type: '.$data['model_type']; + } + if (! empty($data['created_from'])) { $indicators[] = 'From: '.$data['created_from']; } diff --git a/app/Filament/Resources/RequestCharacteristicResource.php b/app/Filament/Resources/RequestCharacteristicResource.php index 76b8a87..79bcddc 100644 --- a/app/Filament/Resources/RequestCharacteristicResource.php +++ b/app/Filament/Resources/RequestCharacteristicResource.php @@ -3,12 +3,14 @@ namespace App\Filament\Resources; use App\Filament\Exports\RequestCharacteristicExporter; +use App\Filament\Imports\RequestCharacteristicImporter; use App\Filament\Resources\RequestCharacteristicResource\Pages; use App\Models\CharacteristicApproverMaster; use App\Models\Item; use App\Models\Machine; use App\Models\Plant; use App\Models\RequestCharacteristic; +use App\Models\StickerMaster; use Closure; use Filament\Facades\Filament; use Filament\Forms; @@ -19,6 +21,7 @@ use Filament\Forms\Components\TextInput; use Filament\Forms\Form; use Filament\Forms\Get; use Filament\Forms\Set; +use Filament\Notifications\Notification; use Filament\Resources\Resource; use Filament\Tables; use Filament\Tables\Actions\ExportAction; @@ -27,6 +30,7 @@ use Filament\Tables\Filters\Filter; use Filament\Tables\Table; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\SoftDeletingScope; +use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Schema; use Illuminate\Validation\Rule; @@ -128,6 +132,16 @@ class RequestCharacteristicResource extends Resource $set('updated_by', Filament::auth()->user()?->name); }) ->disabled(fn ($get) => self::isFieldDisabled($get)), + Forms\Components\Hidden::make('show_validation_image') + ->reactive() + ->default(false), + Forms\Components\Hidden::make('validation1_image_url') + ->reactive(), + + Forms\Components\View::make('components.part-validation-error-icon') + ->statePath('validation1_image_url') + ->visible(fn ($get) => $get('show_validation_image') == true) + ->reactive(), Forms\Components\TextInput::make('work_flow_id') ->label('Work Flow ID') ->readOnly() @@ -139,7 +153,42 @@ class RequestCharacteristicResource extends Resource return self::isNewWorkFlow($get); } $set('updated_by', Filament::auth()->user()?->name); - }), + }) + ->suffixAction( + Forms\Components\Actions\Action::make('toggleValidationImage') + ->icon(fn (callable $get) => $get('show_validation_image') ? 'heroicon-o-eye-slash' : 'heroicon-o-eye') + ->tooltip('View Validation Image') + ->action(function (callable $get, $set) { + + $currentState = $get('show_validation_image'); + $set('show_validation_image', ! $currentState); + + if ($currentState == true) { + $set('validation1_image_url', null); + return; + } + + $workFlowId = $get('work_flow_id'); + + if (!$workFlowId) { + Notification::make() + ->title('Missing Workflow ID') + ->body('Please select a Workflow ID.') + ->danger() + ->send(); + return; + } + + // Build filename + $fileName = "{$workFlowId}.png"; + + $imageUrl = route('workflow.image', [ + 'filename' => $fileName, + ]); + + $set('validation1_image_url', $imageUrl); + }) + ), // ->rule(function (callable $get) { // return Rule::unique('request_characteristics', 'work_flow_id') // ->where('plant_id', $get('plant_id')) @@ -312,7 +361,7 @@ class RequestCharacteristicResource extends Resource Forms\Components\Select::make('characteristic_approver_master_id') ->label('Master Characteristic Field') // ->relationship('characteristicApproverMaster', 'characteristic_field') - ->columnSpan(2) + // ->columnSpan(2) ->reactive() ->nullable() ->searchable() @@ -340,6 +389,17 @@ class RequestCharacteristicResource extends Resource $set('updated_by', Filament::auth()->user()?->name); }) ->required(), + Forms\Components\TextInput::make('model_type') + ->label('Model Type') + ->reactive() + ->nullable() + ->afterStateUpdated(function ($state, callable $set, callable $get) { + $set('characteristic_name', null); + $set('current_value', null); + $set('update_value', null); + $set('updated_by', Filament::auth()->user()?->name); + }) + ->required(), // ->disabled(fn ($get) => self::isFieldDisabled($get)) Section::make('Request Characteristic Details') // ->columnSpan(['default' => 2, 'sm' => 4]) @@ -500,6 +560,7 @@ class RequestCharacteristicResource extends Resource Forms\Components\TextInput::make('approver_remark1') ->label('Approver Remark') ->live() + ->maxLength(60) ->afterStateUpdated(function ($state, callable $set, callable $get) { $appStat = $get('approver_status1'); if ($appStat && $state) { @@ -615,6 +676,7 @@ class RequestCharacteristicResource extends Resource Forms\Components\TextInput::make('approver_remark2') ->label('Approver Remark') ->live() + ->maxLength(60) ->afterStateUpdated(function ($state, callable $set, callable $get) { $appStat = $get('approver_status2'); if ($appStat && $state) { @@ -727,6 +789,7 @@ class RequestCharacteristicResource extends Resource Forms\Components\TextInput::make('approver_remark3') ->label('Approver Remark') ->live() + ->maxLength(60) ->afterStateUpdated(function ($state, callable $set, callable $get) { $appStat = $get('approver_status3'); if ($appStat && $state) { @@ -916,6 +979,11 @@ class RequestCharacteristicResource extends Resource ->formatStateUsing(fn (string $state): string => strtoupper(__($state))) ->extraAttributes(['class' => 'uppercase']) ->sortable(), + Tables\Columns\TextColumn::make('model_type') + ->label('Model Type') + ->alignCenter() + ->searchable() + ->sortable(), Tables\Columns\TextColumn::make('characteristic_name') ->label('Characteristic Name') ->default('-') @@ -956,12 +1024,14 @@ class RequestCharacteristicResource extends Resource default => 'gray', }) ->alignCenter() + ->default('-') ->searchable() ->sortable(), Tables\Columns\TextColumn::make('approver_remark1') ->label('Approver Remark 1') // ->color('success') ->alignCenter() + ->default('-') ->searchable() ->sortable(), Tables\Columns\TextColumn::make('approved1_at') @@ -984,12 +1054,14 @@ class RequestCharacteristicResource extends Resource default => 'gray', }) ->alignCenter() + ->default('-') ->searchable() ->sortable(), Tables\Columns\TextColumn::make('approver_remark2') ->label('Approver Remark 2') // ->color('success') ->alignCenter() + ->default('-') ->searchable() ->sortable(), Tables\Columns\TextColumn::make('approved2_at') @@ -1012,12 +1084,14 @@ class RequestCharacteristicResource extends Resource default => 'gray', }) ->alignCenter() + ->default('-') ->searchable() ->sortable(), Tables\Columns\TextColumn::make('approver_remark3') ->label('Approver Remark 3') // ->color('success') ->alignCenter() + ->default('-') ->searchable() ->sortable(), Tables\Columns\TextColumn::make('approved3_at') @@ -1160,6 +1234,67 @@ class RequestCharacteristicResource extends Resource ->numeric() ->minlength(7) ->maxlength(10), + TextInput::make('work_flow_id') + ->label('Work Flow ID') + ->placeholder('Enter Work Flow ID'), + TextInput::make('machine_name') + ->label('Machine Name') + ->placeholder('Enter Machine Name'), + Select::make('request_type') + ->label('Request Type') + ->options([ + 'Characteristic' => 'Characteristic', + 'Quality' => 'Quality', + ]) + ->placeholder('Select Request Type'), + TextInput::make('master_characteristic_field') + ->label('Master Characteristic Field') + ->placeholder('Enter Master Characteristic Field'), + TextInput::make('model_type') + ->label('Model Type') + ->placeholder('Enter Model Type'), + Select::make('approver_status') + ->label('Approver Status') + ->options([ + 'Approved' => 'Approved', + 'Hold' => 'Hold', + 'Rejected' => 'Rejected', + ]) + ->placeholder('Select Status') + ->afterStateUpdated(function ($state, callable $set) { + $set('approver_status1', null); + $set('approver_status2', null); + $set('approver_status3', null); + }), + Select::make('approver_status1') + ->label('Approver Status 1') + ->options([ + 'Approved' => 'Approved', + 'Hold' => 'Hold', + 'Rejected' => 'Rejected', + ]) + ->placeholder('Select Status') + ->afterStateUpdated(function ($state, callable $set) { + $set('approver_status2', null); + $set('approver_status3', null); + }), + Select::make('approver_status2') + ->label('Approver Status 2') + ->options([ + 'Approved' => 'Approved', + 'Hold' => 'Hold', + 'Rejected' => 'Rejected', + ]) + ->placeholder('Select Status'), + Select::make('approver_status3') + ->label('Approver Status 3') + ->options([ + 'Approved' => 'Approved', + 'Hold' => 'Hold', + 'Rejected' => 'Rejected', + ]) + ->placeholder('Select Status'), + DateTimePicker::make(name: 'created_from') ->label('Created From') ->placeholder('Select From DateTime') @@ -1173,7 +1308,7 @@ class RequestCharacteristicResource extends Resource ]) ->query(function ($query, array $data) { // Hide all records initially if no filters are applied - if (empty($data['Plant']) && empty($data['machine']) && empty($data['item_id']) && empty($data['aufnr']) && empty($data['created_from']) && empty($data['created_to'])) { + if (empty($data['Plant']) && empty($data['machine']) && empty($data['item_id']) && empty($data['aufnr']) && empty($data['model_type']) && empty($data['work_flow_id']) && empty($data['machine_name']) && empty($data['request_type']) && empty($data['master_characteristic_field'])&& empty($data['approver_status1']) && empty($data['approver_status2']) && empty($data['approver_status3']) && empty($data['approver_status']) && empty($data['created_from']) && empty($data['created_to'])) { return $query->whereRaw('1 = 0'); } @@ -1199,6 +1334,70 @@ class RequestCharacteristicResource extends Resource $query->where('aufnr', 'like', '%'.$data['aufnr'].'%'); } + if (! empty($data['model_type'])) { + $query->where('model_type', 'like', '%'.$data['model_type'].'%'); + } + + if (! empty($data['work_flow_id'])) { + $query->where('work_flow_id', 'like', '%'.$data['work_flow_id'].'%'); + } + + if (!empty($data['machine_name'])) { + $query->whereHas('characteristicApproverMaster', function ($q) use ($data) { + $q->where('characteristic_approver_masters.machine_name', '=', (string) $data['machine_name']); + }); + } + + if (!empty($data['request_type'])) { + $query->whereHas('characteristicApproverMaster', function ($q) use ($data) { + $q->where('characteristic_approver_masters.approver_type', '=', (string) $data['request_type']); + }); + } + + if (!empty($data['master_characteristic_field'])) { + $query->whereHas('characteristicApproverMaster', function ($q) use ($data) { + $q->where('characteristic_approver_masters.characteristic_field', '=', (string) $data['master_characteristic_field']); + }); + } + + if (! empty($data['approver_status1'])) { + $query->where('approver_status1', 'like', '%'.$data['approver_status1'].'%'); + } + + if (! empty($data['approver_status2'])) { + $query->where('approver_status2', 'like', '%'.$data['approver_status2'].'%'); + } + + if (! empty($data['approver_status3'])) { + $query->where('approver_status3', 'like', '%'.$data['approver_status3'].'%'); + } + + if (!empty($data['approver_status'])) { + + $status = $data['approver_status']; + + $query->whereRaw(" + CASE + + -- If status3 exists, it must be considered first + WHEN approver_status3 IS NOT NULL AND approver_status3 != '' + THEN approver_status3 + + -- then status2 overrides only if status3 is empty + WHEN approver_status2 IS NOT NULL AND approver_status2 != '' + THEN approver_status2 + + -- finally status1 only if both 2 and 3 are empty + WHEN approver_status1 IS NOT NULL AND approver_status1 != '' + THEN approver_status1 + + ELSE NULL + + END = ? + ", [$status]); + + } + if (! empty($data['created_from'])) { $query->where('created_at', '>=', $data['created_from']); } @@ -1232,6 +1431,42 @@ class RequestCharacteristicResource extends Resource $indicators[] = 'Job No: '.$data['aufnr']; } + if (! empty($data['model_type'])) { + $indicators[] = 'Model Type: '.$data['model_type']; + } + + if (! empty($data['work_flow_id'])) { + $indicators[] = 'Work Flow ID: '.$data['work_flow_id']; + } + + if (! empty($data['machine_name'])) { + $indicators[] = 'Machine Name: '.$data['machine_name']; + } + + if (! empty($data['request_type'])) { + $indicators[] = 'Request Type: '.$data['request_type']; + } + + if (! empty($data['master_characteristic_field'])) { + $indicators[] = 'Master Characteristic Field: '.$data['master_characteristic_field']; + } + + if (! empty($data['approver_status'])) { + $indicators[] = 'Approver Status: '.$data['approver_status']; + } + + if (! empty($data['approver_status1'])) { + $indicators[] = 'Approver Status 1: '.$data['approver_status1']; + } + + if (! empty($data['approver_status2'])) { + $indicators[] = 'Approver Status 2: '.$data['approver_status2']; + } + + if (! empty($data['approver_status3'])) { + $indicators[] = 'Approver Status 3: '.$data['approver_status3']; + } + if (! empty($data['created_from'])) { $indicators[] = 'From: '.$data['created_from']; } @@ -1256,13 +1491,13 @@ class RequestCharacteristicResource extends Resource ]), ]) ->headerActions([ - // ImportAction::make() - // ->label('Import Request Characteristics') - // ->color('warning') - // ->importer(RequestCharacteristicImporter::class) - // ->visible(function () { - // return Filament::auth()->user()->can('view import request characteristic'); - // }), + ImportAction::make() + ->label('Import Request Characteristics') + ->color('warning') + ->importer(RequestCharacteristicImporter::class) + ->visible(function () { + return Filament::auth()->user()->can('view import request characteristic'); + }), ExportAction::make() ->label('Export Request Characteristics') ->color('warning') From b7e818230937e71184bbca14be285d2528543a0a Mon Sep 17 00:00:00 2001 From: dhanabalan Date: Mon, 11 May 2026 10:41:13 +0530 Subject: [PATCH 7/7] Updated 'updated_by' column value on every change --- .../CharacteristicApprovalController.php | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/app/Http/Controllers/CharacteristicApprovalController.php b/app/Http/Controllers/CharacteristicApprovalController.php index 4553f17..7a5fb3e 100644 --- a/app/Http/Controllers/CharacteristicApprovalController.php +++ b/app/Http/Controllers/CharacteristicApprovalController.php @@ -2,10 +2,12 @@ namespace App\Http\Controllers; +use App\Models\CharacteristicApproverMaster; use App\Models\ClassCharacteristic; use App\Models\RequestCharacteristic; use Carbon\Carbon; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Storage; class CharacteristicApprovalController extends Controller { @@ -358,10 +360,26 @@ class CharacteristicApprovalController extends Controller ->where('work_flow_id', $record->work_flow_id) ->get(); + $approverMasterNames = CharacteristicApproverMaster::find($record->characteristic_approver_master_id); + + if (! $approverMasterNames) { + abort(500, 'Approver master not found'); + } + + $approverNameColumn = match ($level) { + 1 => 'name1', + 2 => 'name2', + 3 => 'name3', + default => null, + }; + + $updatedBy = $approverNameColumn ? $approverMasterNames->$approverNameColumn : null; + $updateData = [ $statusColumn => $status, $remarkColumn => $request->input('remark'), $approvedAtColumn => Carbon::now(), + 'updated_by' => $updatedBy, ]; if (in_array($status, ['Approved', 'Rejected'])) { @@ -386,6 +404,14 @@ class CharacteristicApprovalController extends Controller // ->where('aufnr', $record->aufnr) // ->update(['has_work_flow_id' => $record->work_flow_id]); + if ($status == 'Rejected') { + $filePath = 'uploads/LaserDocs/'.$record->work_flow_id.'.png'; + + if (Storage::disk('local')->exists($filePath)) { + Storage::disk('local')->delete($filePath); + } + } + if ($returnView) { return match ($status) { 'Approved' => view('approval.success'),
Approve     |     - Hold -     |     + {{-- Hold +     |     --}} Reject