From 18f23ce0974cb84f221cf1e7bcb15a040910739e Mon Sep 17 00:00:00 2001 From: dhanabalan Date: Fri, 20 Mar 2026 14:07:30 +0530 Subject: [PATCH 1/3] Added updated order quantity in resource pages --- .../Resources/ProcessOrderResource.php | 55 +++++++++++++++- .../Pages/CreateProcessOrder.php | 18 +++++ .../Pages/EditProcessOrder.php | 65 +++++++++++++++++++ 3 files changed, 137 insertions(+), 1 deletion(-) diff --git a/app/Filament/Resources/ProcessOrderResource.php b/app/Filament/Resources/ProcessOrderResource.php index e6cc211..c7dd386 100644 --- a/app/Filament/Resources/ProcessOrderResource.php +++ b/app/Filament/Resources/ProcessOrderResource.php @@ -74,6 +74,7 @@ class ProcessOrderResource extends Resource $set('process_order', null); $set('coil_number', '0'); $set('order_quantity', '0'); + $set('updated_order_quantity', '0'); $set('received_quantity', '0'); $set('scrap_quantity', '0'); $set('sfg_number', null); @@ -113,6 +114,7 @@ class ProcessOrderResource extends Resource $set('process_order', null); $set('coil_number', '0'); $set('order_quantity', '0'); + $set('updated_order_quantity', '0'); $set('received_quantity', '0'); $set('scrap_quantity', '0'); $set('sfg_number', null); @@ -141,6 +143,7 @@ class ProcessOrderResource extends Resource $set('process_order', null); $set('coil_number', '0'); $set('order_quantity', '0'); + $set('updated_order_quantity', '0'); $set('received_quantity', '0'); $set('scrap_quantity', '0'); $set('sfg_number', null); @@ -217,6 +220,7 @@ class ProcessOrderResource extends Resource $plantId = $get('plant_id'); $set('coil_number', '0'); $set('order_quantity', '0'); + $set('updated_order_quantity', '0'); $set('received_quantity', '0'); $set('scrap_quantity', '0'); $set('sfg_number', null); @@ -369,9 +373,11 @@ class ProcessOrderResource extends Resource $itemId = $get('item_id'); $processOrder = trim($get('process_order')); $set('received_quantity', '0'); + // $set('updated_order_quantity', $state); $set('scrap_quantity', '0'); if (! $plantId || ! $itemId || ! $processOrder) { $set('order_quantity', '0'); + $set('updated_order_quantity', '0'); } $query = ProcessOrder::where('plant_id', $plantId) @@ -387,6 +393,47 @@ class ProcessOrderResource extends Resource } $set('updated_by', Filament::auth()->user()?->name); }), + Forms\Components\TextInput::make('updated_order_quantity') + ->label('Updated Order Quantity') + ->required() + ->readOnly(fn ($get) => (trim($get('process_order')) == null || trim($get('process_order')) == '' || trim($get('order_quantity')) == '' || trim($get('order_quantity')) == null)) + ->reactive() + ->rules([ + function (callable $get): Closure { + return function (string $attribute, $value, Closure $fail) use ($get) { + $plantId = $get('plant_id'); + $processOrder = trim($get('process_order')); + $receivedQty = $get('received_quantity'); + + $currentId = $get('id'); + + $orderQty = (float) $get('order_quantity'); + $updatedQty = (float) $value; + + $allowedVariance = $orderQty * 0.10; + + $maxAllowed = $orderQty + $allowedVariance; + $minAllowed = $orderQty - $allowedVariance; + + if ($updatedQty > $maxAllowed || $updatedQty < $minAllowed) { + $fail("Quantity can vary by ±10% of the order quantity."); + } + + $otherReceivedQty = ProcessOrder::where('plant_id', $plantId) + ->where('process_order', $processOrder) + ->when($currentId, fn ($q) => $q->where('id', '!=', $currentId)) + ->sum('received_quantity'); + + $currentReceivedQty = (float) $get('received_quantity'); + + $totalReceivedQty = $otherReceivedQty + $currentReceivedQty; + + if ($updatedQty < $totalReceivedQty) { + $fail("You cannot set quantity below received quantity ({$totalReceivedQty})."); + } + }; + }, + ]), Forms\Components\TextInput::make('received_quantity') ->label('Received Quantity') ->default('0.000') @@ -409,7 +456,8 @@ class ProcessOrderResource extends Resource ->where('item_id', $itemId)->latest()->first(); if ($orderExist) { - $orderQty = $orderExist->order_quantity ?? 0; + // $orderQty = $orderExist->order_quantity ?? 0; + $orderQty = $orderExist->updated_order_quantity ?? 0; $alreadyReceived = ProcessOrder::where('plant_id', $plantId) ->where('process_order', $processOrder) @@ -855,6 +903,11 @@ class ProcessOrderResource extends Resource ->alignCenter() ->searchable() ->sortable(), + Tables\Columns\TextColumn::make('updated_order_quantity') + ->label('Updated Order Quantity') + ->alignCenter() + ->searchable() + ->sortable(), Tables\Columns\TextColumn::make('received_quantity') ->label('Received Quantity') ->alignCenter() diff --git a/app/Filament/Resources/ProcessOrderResource/Pages/CreateProcessOrder.php b/app/Filament/Resources/ProcessOrderResource/Pages/CreateProcessOrder.php index 1c87a8a..c31d730 100644 --- a/app/Filament/Resources/ProcessOrderResource/Pages/CreateProcessOrder.php +++ b/app/Filament/Resources/ProcessOrderResource/Pages/CreateProcessOrder.php @@ -3,10 +3,28 @@ namespace App\Filament\Resources\ProcessOrderResource\Pages; use App\Filament\Resources\ProcessOrderResource; +use App\Models\ProcessOrder; use Filament\Actions; +use Filament\Facades\Filament; +use Filament\Notifications\Notification; use Filament\Resources\Pages\CreateRecord; class CreateProcessOrder extends CreateRecord { protected static string $resource = ProcessOrderResource::class; + + protected function afterCreate(): void + { + $plantId = $this->data['plant_id']; + $processOrder = $this->data['process_order']; + $updatedQty = (float) $this->data['updated_order_quantity']; + + ProcessOrder::where('plant_id', $plantId) + ->where('process_order', $processOrder) + ->update([ + 'updated_order_quantity' => $updatedQty, + 'updated_by' => Filament::auth()->user()->name, + ]); + } + } diff --git a/app/Filament/Resources/ProcessOrderResource/Pages/EditProcessOrder.php b/app/Filament/Resources/ProcessOrderResource/Pages/EditProcessOrder.php index d652766..256b57f 100644 --- a/app/Filament/Resources/ProcessOrderResource/Pages/EditProcessOrder.php +++ b/app/Filament/Resources/ProcessOrderResource/Pages/EditProcessOrder.php @@ -3,13 +3,78 @@ namespace App\Filament\Resources\ProcessOrderResource\Pages; use App\Filament\Resources\ProcessOrderResource; +use App\Models\ProcessOrder; use Filament\Actions; +use Filament\Facades\Filament; +use Filament\Notifications\Notification; use Filament\Resources\Pages\EditRecord; class EditProcessOrder extends EditRecord { protected static string $resource = ProcessOrderResource::class; + protected function beforeSave(): void + { + $plantId = $this->data['plant_id'] ?? null; + $processOrder = $this->data['process_order'] ?? null; + $extraQty = (float) ($this->data['updated_order_quantity'] ?? 0); + $extraQtyRaw = $this->data['updated_order_quantity'] ?? ''; + + if (!preg_match('/^\d+(\.\d{1,3})?$/', $extraQtyRaw)) { + Notification::make() + ->title('Invalid Quantity') + ->body('Only positive numbers with up to 3 decimal places are allowed.') + ->danger() + ->send(); + + $this->halt(); // stop save + } + + if ($extraQty < 0) + { + Notification::make() + ->title('Invalid Quantity') + ->body('Negative values are not allowed.') + ->danger() + ->send(); + + $this->halt(); + } + + if ($extraQty > 0) { + + $order = ProcessOrder::where('plant_id', $plantId) + ->where('process_order', $processOrder) + ->first(); + + if ($order) { + + $baseQty = (float) $order->order_quantity; + $maxAllowed = $baseQty * 0.10; + + $maxFinalQty = $baseQty + $maxAllowed; + + if ($extraQty > $maxFinalQty) { + Notification::make() + ->title('Limit Exceeded') + ->body("You can only increase the order by 10% (Max allowed: {$maxFinalQty}).") + ->danger() + ->send(); + + $this->halt(); // stops save + } + + ProcessOrder::where('plant_id', $plantId) + ->where('process_order', $processOrder) + ->update([ + 'updated_order_quantity' => $extraQty, + 'updated_by' => Filament::auth()->user()?->name, + ]); + } + } + } + + protected function getHeaderActions(): array { return [ From ead2edc63bcd682ce8784b9c5f5c3131fab293c5 Mon Sep 17 00:00:00 2001 From: dhanabalan Date: Fri, 20 Mar 2026 14:08:57 +0530 Subject: [PATCH 2/3] Changed logic in post api of process order --- app/Http/Controllers/PdfController.php | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/app/Http/Controllers/PdfController.php b/app/Http/Controllers/PdfController.php index ed72c1a..f93a6d1 100644 --- a/app/Http/Controllers/PdfController.php +++ b/app/Http/Controllers/PdfController.php @@ -627,7 +627,7 @@ class PdfController extends Controller // 'coil_number' => $proOrdAgPlant->coil_number ?? "", // 'order_quantity' => (string)$proOrdAgPlant->order_quantity ?? "", 'coil_number' => $currentCoil, - 'order_quantity' => (string) $lastRecord->order_quantity ?? '0.000', + 'order_quantity' => (string) $lastRecord->updated_order_quantity ?? '0.000', 'ok_quantity' => (string) $okQty ?? '0', 'not_ok_quantity' => (string) $notOkQty ?? '0', 'received_quantity' => (string) (($totalReceivedQty == 0) ? '0.000' : $totalReceivedQty) ?? '0.000', @@ -686,7 +686,7 @@ class PdfController extends Controller $itemCode = $data['item_code'] ?? ''; $lineName = $data['line_name'] ?? ''; $coilNo = $data['coil_number'] ?? ''; - $orderQty = $data['order_quantity'] ?? 0; + $updatedOrderQty = $data['order_quantity'] ?? 0; $receivedQty = $data['received_quantity'] ?? 0; $scrapQty = $data['scrap_quantity'] ?? 0; $sfgNo = $data['sfg_number'] ?? ''; @@ -872,7 +872,8 @@ class PdfController extends Controller ->where('item_id', $itemId) ->sum('received_quantity'); - if ($orderQty == 0) { + $orderQty = 0; + if ($updatedOrderQty == 0) { $orderExist = ProcessOrder::where('plant_id', $plantId) ->where('process_order', $processOrder) ->where('item_id', $itemId)->latest()->first(); @@ -880,6 +881,7 @@ class PdfController extends Controller if ($orderExist) { $orderQty = $orderExist->order_quantity ?? 0; + $updatedOrderQty = $orderExist->updated_order_quantity ?? 0; } else { return response()->json([ 'status_code' => 'ERROR', @@ -893,9 +895,11 @@ class PdfController extends Controller // ->value('order_quantity') ?? 0; if ($orderExist) { - $existOrderQty = $orderExist->order_quantity ?? 0; + // $existOrderQty = $orderExist->updated_order_quantity ?? 0; + $orderQty = $orderExist->order_quantity ?? 0; + $existUpdatedOrdQuan = $orderExist->updated_order_quantity ?? 0; - if ($existOrderQty != $orderQty) { + if ($existUpdatedOrdQuan != $updatedOrderQty) { return response()->json([ 'status_code' => 'ERROR', 'status_description' => "Order quantity doesn't equal to exist process order '{$processOrder}'", @@ -946,10 +950,10 @@ class PdfController extends Controller ], 404); } - if ($total > $orderQty) { + if ($total > $updatedOrderQty) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Rework received quantity should not exceed exist order quantity! Exist Order Qty = '{$orderQty}', Already Exist Total Received Qty = '{$alreadyReceived}', Trying to Insert Rework Received Qty = '{$receivedQty}'", + 'status_description' => "Rework received quantity should not exceed exist order quantity! Exist Order Qty = '{$updatedOrderQty}', Already Exist Total Received Qty = '{$alreadyReceived}', Trying to Insert Rework Received Qty = '{$receivedQty}'", ], 404); } @@ -968,6 +972,7 @@ class PdfController extends Controller 'item_id' => $itemId, 'coil_number' => $coilNo, 'order_quantity' => $orderQty, + 'updated_order_quantity' => $updatedOrderQty, 'received_quantity' => $receivedQty, 'scrap_quantity' => $scrapQty, 'sfg_number' => $sfgNo, @@ -1102,10 +1107,10 @@ class PdfController extends Controller } } - if ($total > $orderQty) { + if ($total > $updatedOrderQty) { return response()->json([ 'status_code' => 'ERROR', - 'status_description' => "Received quantity should not exceed exist order quantity! Exist Order Qty = '{$orderQty}', Already Exist Total Received Qty = '{$alreadyReceived}', Trying to Insert Received Qty = '{$receivedQty}'", + 'status_description' => "Received quantity should not exceed exist order quantity! Exist Order Qty = '{$updatedOrderQty}', Already Exist Total Received Qty = '{$alreadyReceived}', Trying to Insert Received Qty = '{$receivedQty}'", ], 404); } @@ -1117,6 +1122,7 @@ class PdfController extends Controller 'item_id' => $itemId, 'coil_number' => $coilNo, 'order_quantity' => $orderQty, + 'updated_order_quantity' => $updatedOrderQty, 'received_quantity' => $receivedQty, 'scrap_quantity' => $scrapQty, 'sfg_number' => $sfgNo, From 253d319587a4db780927a54190ee0262c67a3d44 Mon Sep 17 00:00:00 2001 From: dhanabalan Date: Fri, 20 Mar 2026 14:10:05 +0530 Subject: [PATCH 3/3] Added updated order quantity in importer and exporter --- app/Filament/Exports/ProcessOrderExporter.php | 2 + app/Filament/Imports/ProcessOrderImporter.php | 74 ++++++++++++++++++- 2 files changed, 72 insertions(+), 4 deletions(-) diff --git a/app/Filament/Exports/ProcessOrderExporter.php b/app/Filament/Exports/ProcessOrderExporter.php index 0803c6c..ace26f5 100644 --- a/app/Filament/Exports/ProcessOrderExporter.php +++ b/app/Filament/Exports/ProcessOrderExporter.php @@ -36,6 +36,8 @@ class ProcessOrderExporter extends Exporter ->label('COIL NUMBER'), ExportColumn::make('order_quantity') ->label('ORDER QUANTITY'), + ExportColumn::make('updated_order_quantity') + ->label('UPDATED ORDER QUANTITY'), ExportColumn::make('received_quantity') ->label('RECEIVED QUANTITY'), ExportColumn::make('sfg_number') diff --git a/app/Filament/Imports/ProcessOrderImporter.php b/app/Filament/Imports/ProcessOrderImporter.php index 395fa42..e89e66b 100644 --- a/app/Filament/Imports/ProcessOrderImporter.php +++ b/app/Filament/Imports/ProcessOrderImporter.php @@ -52,6 +52,9 @@ class ProcessOrderImporter extends Importer ->example('1000') ->label('ORDER QUANTITY') ->rules(['required']), + ImportColumn::make('updated_order_quantity') + ->exampleHeader('UPDATED ORDER QUANTITY') + ->label('UPDATED ORDER QUANTITY'), ImportColumn::make('coil_number') ->exampleHeader('COIL NUMBER') // ->example('01') @@ -110,6 +113,7 @@ class ProcessOrderImporter extends Importer $sfgNo = trim($this->data['sfg_number'] ?? ''); $machineName = trim($this->data['machine_name'] ?? ''); $orderQuan = trim($this->data['order_quantity'] ?? ''); + $updatedOrderQuan = trim($this->data['updated_order_quantity'] ?? ''); $scrapQuan = trim($this->data['scrap_quantity'] ?? ''); $reworkStatus = trim($this->data['rework_status'] ?? ''); $recQuan = trim($this->data['received_quantity'] ?? ''); @@ -145,6 +149,12 @@ class ProcessOrderImporter extends Importer } elseif (Str::length($orderQuan) >= 1 && ! is_numeric($orderQuan)) { $warnMsg[] = 'Invalid order quantity found!'; } + if ($updatedOrderQuan == null || $updatedOrderQuan == '' || $updatedOrderQuan == 0 || $updatedOrderQuan == '0') { + $updatedOrderQuan = $orderQuan; + } elseif (Str::length($updatedOrderQuan) >= 1 && ! is_numeric($updatedOrderQuan)) { + $warnMsg[] = 'Invalid Updated order quantity found!'; + } + if ($coilNo == null || $coilNo == '') { $coilNo = '0'; } @@ -243,6 +253,40 @@ class ProcessOrderImporter extends Importer throw new RowImportFailedException(implode(', ', $warnMsg)); } + $existing = ProcessOrder::where('plant_id', $plantId) + ->where('process_order', $processOrder) + // ->where('coil_number', $coilNo) + ->first(); + + $receivedQty = ProcessOrder::where('plant_id', $plantId) + ->where('process_order', $processOrder) + ->sum('received_quantity'); + + if($existing){ + $liveOrdQuan = (float) $existing->order_quantity; + $liveUpdatedOrdQuan = (float) $existing->updated_order_quantity; + + $allowedIncrease = $liveOrdQuan * 0.10; + + $maxAllowedQty = $liveOrdQuan + $allowedIncrease; + $minAllowedQty = $liveOrdQuan - $allowedIncrease; + + if ($liveUpdatedOrdQuan > $maxAllowedQty) { + throw new RowImportFailedException( + "Updated order quantity cannot exceed 10% of existing order quantity. Max allowed: {$maxAllowedQty}" + ); + } + else if ($liveUpdatedOrdQuan < $minAllowedQty) { + throw new RowImportFailedException( + "Updated order quantity cannot decrease -10% of existing order quantity. Min allowed: {$minAllowedQty}" + ); + }else if($liveUpdatedOrdQuan < $receivedQty) { + throw new RowImportFailedException( + "Updated order quantity cannot decrease below its received quantity {$receivedQty}" + ); + } + } + if ($coilNo != null && $coilNo != '' && $scrapQuan && $reworkStatus && $recQuan && $createdAt && $createdBy && $updatedAt && $updatedBy && Filament::auth()->user()->hasRole('Super Admin')) { $existingCoil = ProcessOrder::where('plant_id', $plantId) ->where('process_order', $processOrder) @@ -250,6 +294,18 @@ class ProcessOrderImporter extends Importer ->where('coil_number', $coilNo) ->first(); + // $existingProcess = ProcessOrder::where('plant_id', $plantId) + // ->where('process_order', $processOrder) + // ->where('line_id', $lineId) + // ->first(); + + if($existing){ + $existUpdateOrdQuan = $existing->updated_order_quantity; + } + else{ + $existUpdateOrdQuan = $updatedOrderQuan; + } + if (! $existingCoil) { ProcessOrder::Create( [ @@ -259,6 +315,7 @@ class ProcessOrderImporter extends Importer 'item_id' => $itemId, 'coil_number' => $coilNo, 'order_quantity' => $orderQuan, + 'updated_order_quantity' => $existUpdateOrdQuan, 'received_quantity' => $recQuan, 'scrap_quantity' => $scrapQuan, 'sfg_number' => $sfgNo, @@ -288,10 +345,17 @@ class ProcessOrderImporter extends Importer } } else { $coilNo = '0'; - $existing = ProcessOrder::where('plant_id', $plantId) - ->where('process_order', $processOrder) - // ->where('coil_number', $coilNo) - ->first(); + // $existing = ProcessOrder::where('plant_id', $plantId) + // ->where('process_order', $processOrder) + // // ->where('coil_number', $coilNo) + // ->first(); + + if($existing){ + $existUpdateOrdQuan = $existing->updated_order_quantity; + } + else{ + $existUpdateOrdQuan = $updatedOrderQuan; + } if (! $existing && ($coilNo == '0' || $coilNo == 0)) { ProcessOrder::create([ @@ -301,6 +365,7 @@ class ProcessOrderImporter extends Importer 'process_order' => $processOrder, 'coil_number' => '0', 'order_quantity' => $orderQuan, + 'updated_order_quantity' => $existUpdateOrdQuan, 'received_quantity' => 0, 'scrap_quantity' => 0, 'created_by' => $createdBy, @@ -315,6 +380,7 @@ class ProcessOrderImporter extends Importer 'process_order' => $processOrder, 'coil_number' => $coilNo, 'order_quantity' => $orderQuan, + 'updated_order_quantity' => $existUpdateOrdQuan, 'received_quantity' => $recQuan, 'scrap_quantity' => $scrapQuan ?? 0, 'sfg_number' => $sfgNo,