diff --git a/app/Filament/Resources/ProcessOrderResource.php b/app/Filament/Resources/ProcessOrderResource.php index 58a6d53..5a141b1 100644 --- a/app/Filament/Resources/ProcessOrderResource.php +++ b/app/Filament/Resources/ProcessOrderResource.php @@ -9,6 +9,7 @@ use App\Models\Item; use App\Models\Line; use App\Models\Plant; use App\Models\ProcessOrder; +use Closure; use Filament\Facades\Filament; use Filament\Forms; use Filament\Forms\Components\Actions\Action; @@ -27,6 +28,7 @@ use Filament\Tables\Filters\Filter; use Filament\Tables\Table; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\SoftDeletingScope; +use Illuminate\Validation\Rule; use Livewire\Features\SupportFileUploads\TemporaryUploadedFile; use Smalot\PdfParser\Parser; use Storage; @@ -64,13 +66,23 @@ class ProcessOrderResource extends Resource ->reactive() ->afterStateUpdated(function ($state, $set, callable $get, $livewire) { $plantId = $get('plant_id'); - $set('coil_number', null); + $set('item_id', null); + $set('line_id', null); + $set('item_description', null); + $set('item_uom', null); + $set('process_order', null); + $set('coil_number', '0'); + $set('order_quantity', '0'); + $set('received_quantity', '0'); + $set('scrap_quantity', '0'); $set('sfg_number', null); $set('machine_name', null); if (! $plantId) { $set('poPlantError', 'Please select a plant first.'); $set('coilNumberError', null); $set('sfgNumberError', null); + } else { + $set('poPlantError', null); } $set('updated_by', Filament::auth()->user()?->name); }) @@ -97,8 +109,10 @@ class ProcessOrderResource extends Resource $set('item_description', null); $set('item_uom', null); $set('process_order', null); - $set('order_quantity', null); - $set('received_quantity', null); + $set('coil_number', '0'); + $set('order_quantity', '0'); + $set('received_quantity', '0'); + $set('scrap_quantity', '0'); $set('sfg_number', null); $set('machine_name', null); $set('updated_by', Filament::auth()->user()?->name); @@ -121,7 +135,13 @@ class ProcessOrderResource extends Resource ->afterStateUpdated(function (callable $set, callable $get, ?string $state) { $plantId = $get('plant_id'); $itemId = $get('item_id'); - // dd($plantId); + $set('process_order', null); + $set('coil_number', '0'); + $set('order_quantity', '0'); + $set('received_quantity', '0'); + $set('scrap_quantity', '0'); + $set('sfg_number', null); + $set('machine_name', null); if ($plantId && $itemId) { // Get the item code using item_id @@ -149,6 +169,7 @@ class ProcessOrderResource extends Resource Forms\Components\TextInput::make('item_description') ->label('Description') + ->readOnly() ->required() ->reactive() ->afterStateHydrated(function ($component, $state, Get $get, Set $set) { @@ -189,21 +210,42 @@ class ProcessOrderResource extends Resource ->reactive() ->numeric() ->length(12) + ->readOnly(fn ($get) => ($get('plant_id') == null || $get('item_id') == null || $get('line_id') == null)) ->afterStateUpdated(function ($state, $set, callable $get, $livewire) { $plantId = $get('plant_id'); - $set('coil_number', null); + $set('coil_number', '0'); + $set('order_quantity', '0'); + $set('received_quantity', '0'); + $set('scrap_quantity', '0'); $set('sfg_number', null); $set('machine_name', null); - if (! $plantId) { - $set('poPlantError', 'Please select a plant first.'); - $set('process_order', null); - $set('coilNumberError', null); - $set('sfgNumberError', null); + // if (! $plantId) { + // $set('poPlantError', 'Please select a plant first.'); + // $set('process_order', null); + // $set('coilNumberError', null); + // $set('sfgNumberError', null); + + // return; + // } + + $itemId = $get('item_id'); + $processOrder = trim($get('process_order')); + if (! $itemId || ! $processOrder) { + return; + } + + $orderExist = ProcessOrder::where('plant_id', $plantId) + ->where('process_order', $processOrder) + ->where('item_id', $itemId)->latest()->first(); + // ->value('order_quantity') ?? 0; + + if ($orderExist) { + $set('order_quantity', $orderExist->order_quantity ?? 0); } $set('updated_by', Filament::auth()->user()?->name); }) ->rule(function (callable $get) { - return function (string $attribute, $value, \Closure $fail) use ($get) { + return function (string $attribute, $value, Closure $fail) use ($get) { $plantId = $get('plant_id'); $itemId = $get('item_id'); @@ -234,54 +276,99 @@ class ProcessOrderResource extends Resource Forms\Components\TextInput::make('coil_number') ->label('Coil Number') ->default('0') + ->required() ->reactive() + ->numeric() + ->readOnly(fn ($get) => ($get('process_order') == null)) ->afterStateUpdated(function ($state, $set, callable $get, $livewire) { $plantId = $get('plant_id'); $processOrder = $get('process_order'); - $coilNo = $get('coil_number'); + // $coilNo = $get('coil_number'); if (! $plantId) { $set('poPlantError', 'Please select a plant first.'); - $set('coil_number', null); - $set('sfg_number', null); - $set('machine_name', null); - $set('coilNumberError', null); - $set('sfgNumberError', null); + $set('coil_number', '0'); } elseif (! $processOrder) { - $set('coil_number', null); - $set('sfg_number', null); - $set('machine_name', null); $set('poPlantError', null); - $set('coilNumberError', null); - $set('sfgNumberError', null); - } elseif ($coilNo || $coilNo == '0') { - $existing = ProcessOrder::where('plant_id', $plantId) - ->where('process_order', $processOrder) - ->where('coil_number', $coilNo) - ->first(); - - if ($existing) { - $set('poPlantError', null); - $set('coil_number', null); - $set('coilNumberError', "Duplicate Coil : '{$coilNo}' found!"); - } else { - $set('poPlantError', null); - $set('coilNumberError', null); - } + $set('coil_number', '0'); } + $set('received_quantity', '0'); + $set('scrap_quantity', '0'); + $set('sfg_number', null); + $set('machine_name', null); + $set('coilNumberError', null); + $set('sfgNumberError', null); + // elseif ($coilNo || $coilNo == 0) { + // $existing = ProcessOrder::where('plant_id', $plantId) + // ->where('process_order', $processOrder) + // ->where('coil_number', $coilNo) + // ->first(); + + // if ($existing) { + // $set('poPlantError', null); + // $set('coil_number', '0'); + // $set('coilNumberError', "Duplicate Coil : '{$coilNo}' found!"); + // } else { + // $set('poPlantError', null); + // $set('coilNumberError', null); + // } + // } $set('updated_by', Filament::auth()->user()?->name); }) + ->rules([ + function (callable $get) { + return Rule::unique('process_orders', 'coil_number') + ->where('plant_id', $get('plant_id')) + ->where('process_order', $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}'!"); + } + }; + }, + ]) + // ->rule(function (callable $get) { + // return Rule::unique('process_orders', 'coil_number') + // ->where('plant_id', $get('plant_id')) + // ->where('process_order', $get('process_order')) + // ->ignore($get('id')); + // }) ->extraAttributes(fn ($get) => [ 'class' => $get('coilNumberError') ? 'border-red-500' : '', ]) ->hint(fn ($get) => $get('coilNumberError') ? $get('coilNumberError') : null) - ->hintColor('danger') - ->required(), + ->hintColor('danger'), Forms\Components\TextInput::make('order_quantity') ->label('Order Quantity') ->default('1.000') ->required() ->reactive() + ->numeric() + ->readOnly(fn ($get) => ($get('process_order') == null)) ->afterStateUpdated(function (callable $set, callable $get, ?string $state) { + $plantId = $get('plant_id'); + $itemId = $get('item_id'); + $processOrder = trim($get('process_order')); + $set('received_quantity', '0'); + $set('scrap_quantity', '0'); + if (! $plantId || ! $itemId || ! $processOrder) { + $set('order_quantity', '0'); + } + + $query = ProcessOrder::where('plant_id', $plantId) + ->where('process_order', $processOrder) + ->where('item_id', $itemId); + + $orderExist = $query->latest()->first(); // Latest record (reuse base query) + + if ($query->count() == 1 && $orderExist && ! $get('id')) { + $set('order_quantity', $orderExist->order_quantity ?? 0); + } elseif ($query->count() > 1 && $orderExist) { + $set('order_quantity', $orderExist->order_quantity ?? 0); + } $set('updated_by', Filament::auth()->user()?->name); }), Forms\Components\TextInput::make('received_quantity') @@ -289,19 +376,44 @@ class ProcessOrderResource extends Resource ->default('0.000') ->required() ->reactive() + ->numeric() + ->readOnly(fn ($get) => ($get('process_order') == null)) ->afterStateUpdated(function (callable $set, callable $get, ?string $state) { + $set('scrap_quantity', '0'); $set('updated_by', Filament::auth()->user()?->name); }), Forms\Components\TextInput::make('scrap_quantity') ->label('Scrap Quantity') ->default('0.000') + ->required() + ->readOnly(fn ($get) => ($get('rework_status') == 0 || $get('process_order') == null)) ->reactive() + ->numeric() ->afterStateUpdated(function (callable $set, callable $get, ?string $state) { + $rework = $get('rework_status'); + if ($rework == 0) { + $set('scrap_quantity', '0'); + } $set('updated_by', Filament::auth()->user()?->name); + }) + ->rule(function (callable $get) { + return function (string $attribute, $value, Closure $fail) use ($get) { + + $rework = $get('rework_status'); + $scrapQty = $value; + // $currentId = $get('id'); // current editing record id + + if ($rework == 0 && $scrapQty != 0) { + $fail("Scrap Quanity value should be '0'!"); + + return; + } + }; }), Forms\Components\TextInput::make('sfg_number') ->label('SFG Number') ->reactive() + ->readOnly(fn ($get) => ($get('process_order') == null)) ->afterStateUpdated(function ($state, $set, callable $get, $livewire) { $plantId = $get('plant_id'); $sfgNo = $get('sfg_number'); @@ -335,6 +447,7 @@ class ProcessOrderResource extends Resource Forms\Components\TextInput::make('machine_name') ->label('Machine ID') ->reactive() + ->readOnly(fn ($get) => ($get('process_order') == null)) ->afterStateUpdated(function (callable $set, callable $get, ?string $state) { $set('updated_by', Filament::auth()->user()?->name); }), @@ -350,6 +463,50 @@ class ProcessOrderResource extends Resource // } $set('updated_by', Filament::auth()->user()?->name); }) + ->rule(function (callable $get, callable $set) { + return function (string $attribute, $value, Closure $fail) use ($get, $set) { + $plantId = $get('plant_id'); + $lineId = $get('line_id'); + $processOrder = trim($get('process_order')); + $coilNo = trim($get('coil_number')); + $status = $value; + // $currentId = $get('id'); // current editing record id + + if (! $plantId || ! $lineId || ! $processOrder || Str::length($coilNo) <= 0) { + $set('rework_status', 0); + + return; + } elseif ($status == 0) { + $existingCoil = ProcessOrder::where('plant_id', $plantId) + ->where('line_id', $lineId) + ->where('process_order', $processOrder) + ->where('coil_number', $coilNo) + ->first(); + + if ($existingCoil && $existingCoil->rework_status == 1 && $get('id')) { + $fail("Rework coil number '{$coilNo}' exist against plant and process order!"); + + return; + } + } + + if (Str::length($coilNo) > 0 && ($status == 1 || Str::contains($coilNo, '.'))) { + $coilMain = explode('.', $coilNo)[0]; // 333 + + $existingCoil = ProcessOrder::where('plant_id', $plantId) + ->where('line_id', $lineId) + ->where('process_order', $processOrder) + ->where('coil_number', $coilMain) + ->first(); + + if (! $existingCoil) { + $fail("Coil number '{$coilMain}' not exist against plant and process order!"); + } elseif ($existingCoil->rework_status == 0 && ! $get('id')) { + $fail("Rework coil number '{$coilMain}' not exist against plant and process order!"); + } + } + }; + }) ->visible(function () { return Filament::auth()->user()->hasRole('Super Admin'); // || Filament::auth()->user()->can('update process order rework status') })