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 [