diff --git a/app/Filament/Resources/ProcessOrderResource.php b/app/Filament/Resources/ProcessOrderResource.php index 7055086..e6cc211 100644 --- a/app/Filament/Resources/ProcessOrderResource.php +++ b/app/Filament/Resources/ProcessOrderResource.php @@ -280,10 +280,10 @@ class ProcessOrderResource extends Resource ->required() ->reactive() ->numeric() - ->readOnly(fn ($get) => ($get('process_order') == null)) + ->readOnly(fn ($get) => (trim($get('process_order')) == null || trim($get('process_order')) == '')) ->afterStateUpdated(function ($state, $set, callable $get, $livewire) { $plantId = $get('plant_id'); - $processOrder = $get('process_order'); + $processOrder = trim($get('process_order')); // $coilNo = $get('coil_number'); if (! $plantId) { $set('poPlantError', 'Please select a plant first.'); @@ -319,14 +319,29 @@ class ProcessOrderResource extends Resource function (callable $get) { return Rule::unique('process_orders', 'coil_number') ->where('plant_id', $get('plant_id')) - ->where('process_order', $get('process_order')) + ->where('process_order', trim($get('process_order'))) ->ignore($get('id')); }, function (callable $get): Closure { return function (string $attribute, $value, Closure $fail) use ($get) { $rework = $get('rework_status'); - if ($value && Str::contains($value, '.') && $rework == 0) { - $fail("Rework status should be 'Yes' for rework coil number '{$value}'!"); + $plantId = $get('plant_id'); + $processOrder = trim($get('process_order')); + + if ($value && Str::contains($value, '.')) { + if ($rework == 0) { + $fail("Rework status should be 'Yes' for rework coil number '{$value}'!"); + } + } elseif ($value > 1) { + $prevCoilNo = (string) ($value - 1); + $existPrevCoil = ProcessOrder::where('plant_id', $plantId) + ->where('process_order', $processOrder) + ->where('coil_number', $prevCoilNo) + ->first(); + + if (! $existPrevCoil) { + $fail("Previous coil number '{$prevCoilNo}' not exist against plant and process order!"); + } } }; }, @@ -334,7 +349,7 @@ class ProcessOrderResource extends Resource // ->rule(function (callable $get) { // return Rule::unique('process_orders', 'coil_number') // ->where('plant_id', $get('plant_id')) - // ->where('process_order', $get('process_order')) + // ->where('process_order', trim($get('process_order'))) // ->ignore($get('id')); // }) ->extraAttributes(fn ($get) => [ @@ -348,7 +363,7 @@ class ProcessOrderResource extends Resource ->required() ->reactive() ->numeric() - ->readOnly(fn ($get) => ($get('process_order') == null)) + ->readOnly(fn ($get) => (trim($get('process_order')) == null || trim($get('process_order')) == '')) ->afterStateUpdated(function (callable $set, callable $get, ?string $state) { $plantId = $get('plant_id'); $itemId = $get('item_id'); @@ -378,7 +393,127 @@ class ProcessOrderResource extends Resource ->required() ->reactive() ->numeric() - ->readOnly(fn ($get) => ($get('process_order') == null)) + ->maxValue(fn (Get $get) => $get('order_quantity') ?? PHP_INT_MAX) + ->readOnly(fn ($get) => (trim($get('process_order')) == null || trim($get('process_order')) == '')) + ->rule(function (callable $get) { + return function (string $attribute, $value, Closure $fail) use ($get) { + $rework = $get('rework_status'); + $plantId = $get('plant_id'); + $lineId = $get('line_id'); + $itemId = $get('item_id'); + $processOrder = trim($get('process_order')); + $coilNo = trim($get('coil_number')); + + $orderExist = ProcessOrder::where('plant_id', $plantId) + ->where('process_order', $processOrder) + ->where('item_id', $itemId)->latest()->first(); + + if ($orderExist) { + $orderQty = $orderExist->order_quantity ?? 0; + + $alreadyReceived = ProcessOrder::where('plant_id', $plantId) + ->where('process_order', $processOrder) + ->where('item_id', $itemId) + ->sum('received_quantity'); + + $total = $alreadyReceived + $value; + + if ($rework == 1) { + if ($coilNo && Str::contains($coilNo, '.')) { + $coilMain = explode('.', $coilNo)[0]; + + $existingCoil = ProcessOrder::where('plant_id', $plantId) + ->where('process_order', $processOrder) + ->where('line_id', $lineId) + ->where('coil_number', $coilMain) + ->first(); + + $existPrevCoil = ProcessOrder::where('plant_id', $plantId) + ->where('process_order', $processOrder) + ->where('item_id', $itemId) + ->where('coil_number', $coilNo) + ->first(); + + if ($existPrevCoil && $existPrevCoil->received_quantity < $value) { + $fail('Rework received quantity should not exceed exist received quantity!'); + + return; + } + + if ($existingCoil && $existingCoil->rework_status == 1 && $total > $orderQty) { + $fail("Rework received quantity should not exceed exist order quantity! Already Exist Total Received Qty = '{$alreadyReceived}'."); + } + } else { + if ($coilNo > 1) { + $prevCoilNo = (string) ($coilNo - 1); + $existPrevCoil = ProcessOrder::where('plant_id', $plantId) + ->where('process_order', $processOrder) + ->where('coil_number', $prevCoilNo) + ->first(); + + if (! $existPrevCoil) { + return; + } + } + + $existingCoil = ProcessOrder::where('plant_id', $plantId) + ->where('process_order', $processOrder) + ->where('line_id', $lineId) + ->where('coil_number', $coilNo) + ->first(); + + if (! $existingCoil) { + return; + } + + $existPrevCoil = ProcessOrder::where('plant_id', $plantId) + ->where('process_order', $processOrder) + ->where('item_id', $itemId) + ->where('coil_number', $coilNo) + ->first(); + + if ($existPrevCoil && $existPrevCoil->received_quantity < $value) { + $fail('Rework received quantity should not exceed exist received quantity!'); + + return; + } + } + } else { + if ($coilNo && Str::contains($coilNo, '.')) { + return; + } + + $existing = ProcessOrder::where('plant_id', $plantId) + ->where('process_order', $processOrder) + ->where('coil_number', $coilNo) + ->first(); + if ($existing) { + if ($existing->received_quantity < $value) { + $fail('Received quantity should not exceed exist received quantity!'); // Exist Received Qty = '{$existing->received_quantity}'. + } + + return; + } + + if ($coilNo > 1) { + $prevCoilNo = (string) ($coilNo - 1); + $existPrevCoil = ProcessOrder::where('plant_id', $plantId) + ->where('process_order', $processOrder) + ->where('coil_number', $prevCoilNo) + ->first(); + + if (! $existPrevCoil) { + return; + } + } + + if ($total > $orderQty) { + $fail("Received quantity should not exceed exist order quantity! Already Exist Total Received Qty = '{$alreadyReceived}'."); + } + } + } + }; + }) ->afterStateUpdated(function (callable $set, callable $get, ?string $state) { $set('scrap_quantity', '0'); $set('updated_by', Filament::auth()->user()?->name); @@ -387,7 +522,7 @@ class ProcessOrderResource extends Resource ->label('Scrap Quantity') ->default('0.000') ->required() - ->readOnly(fn ($get) => ($get('rework_status') == 0 || $get('process_order') == null)) + ->readOnly(fn ($get) => ($get('rework_status') == 0 || trim($get('process_order')) == null || trim($get('process_order')) == '')) ->reactive() ->numeric() ->afterStateUpdated(function (callable $set, callable $get, ?string $state) { @@ -414,7 +549,7 @@ class ProcessOrderResource extends Resource Forms\Components\TextInput::make('sfg_number') ->label('SFG Number') ->reactive() - ->readOnly(fn ($get) => ($get('process_order') == null)) + ->readOnly(fn ($get) => (trim($get('process_order')) == null || trim($get('process_order')) == '')) ->afterStateUpdated(function ($state, $set, callable $get, $livewire) { $plantId = $get('plant_id'); $sfgNo = $get('sfg_number'); @@ -448,7 +583,7 @@ class ProcessOrderResource extends Resource Forms\Components\TextInput::make('machine_name') ->label('Machine Name') ->reactive() - ->readOnly(fn ($get) => ($get('process_order') == null)) + ->readOnly(fn ($get) => (trim($get('process_order')) == null || trim($get('process_order')) == '')) ->afterStateUpdated(function (callable $set, callable $get, ?string $state) { $set('updated_by', Filament::auth()->user()?->name); }), @@ -576,7 +711,7 @@ class ProcessOrderResource extends Resource } // Get the value of process_order field - $processOrder = $get('process_order'); + $processOrder = trim($get('process_order')); if ($batchId != $processOrder) { Notification::make() @@ -621,7 +756,7 @@ class ProcessOrderResource extends Resource return Filament::auth()->user()->can('view process order packing slip'); }) ->action(function ($get, callable $set) { - $equipmentNumber = $get('process_order'); + $equipmentNumber = trim($get('process_order')); $set('updated_by', Filament::auth()->user()?->name); if (! $equipmentNumber) { @@ -1064,7 +1199,7 @@ class ProcessOrderResource extends Resource ->options(function (callable $get) { $plantId = $get('plant'); $itemId = $get('Item'); - $processOrder = $get('process_order'); + $processOrder = trim($get('process_order')); if (empty($plantId) || empty($itemId) || empty($processOrder)) { return []; @@ -1081,7 +1216,7 @@ class ProcessOrderResource extends Resource ->afterStateUpdated(function ($state, callable $set, callable $get) { $plantId = $get('plant'); $itemId = $get('Item'); - $processOrder = $get('process_order'); + $processOrder = trim($get('process_order')); if (! $plantId || ! $itemId || ! $processOrder || ! $state) { $set('received_quantity', null);