From 5823a6b3d15e6b935965499e2bc418727dc7bff5 Mon Sep 17 00:00:00 2001 From: dhanabalan Date: Tue, 18 Aug 2026 14:31:15 +0530 Subject: [PATCH] Added logic in panel box validation and filter --- .../Resources/PanelBoxValidationResource.php | 213 ++++++++++++++++-- 1 file changed, 198 insertions(+), 15 deletions(-) diff --git a/app/Filament/Resources/PanelBoxValidationResource.php b/app/Filament/Resources/PanelBoxValidationResource.php index 0fc56c0..b0b5518 100644 --- a/app/Filament/Resources/PanelBoxValidationResource.php +++ b/app/Filament/Resources/PanelBoxValidationResource.php @@ -19,8 +19,11 @@ use App\Models\Plant; use App\Models\StickerMaster; use App\Models\PanelGrMaster; use Filament\Notifications\Notification; -use Illuminate\Support\Facades\Mail; -use App\Mail\InvalidQualityMail; +use Filament\Forms\Components\DateTimePicker; +use Filament\Forms\Components\Select; +use Filament\Forms\Components\TextInput; +use Filament\Tables\Filters\Filter; +use Str; class PanelBoxValidationResource extends Resource { @@ -523,13 +526,11 @@ class PanelBoxValidationResource extends Resource $supplier = $parts[0]; $panelBoxCode = $parts[1]; - $panelBoxSerialNo = implode('/', array_slice($parts, 2)); // Keep rest of the string - + $panelBoxSerialNo = implode('/', array_slice($parts, 2)); $itemCode = $panelBoxCode; $serialNumber = $panelBoxSerialNo; - $existInMasterPo = PanelGrMaster::where('document_number', $pOrder)->where('plant_id', $plantId)->first(); if(!$existInMasterPo){ @@ -933,17 +934,19 @@ class PanelBoxValidationResource extends Resource return; } - if (!preg_match('/^\d+\/\d+\/\d+\/\d+$/', $state)) { + $parts = explode('/', $state); + + if (count($parts) < 3) { + Notification::make() ->title('Invalid QR Format') - ->body('Expected format: plantcode/itemcode/yearmm/serialnumber') + ->body('Expected format: plantcode/itemcode/yearmm/serialnumber (Or) plantcode/panelboxcode/serialnumber') ->danger() ->send(); - $set('serial_number_panel_qr', null); + $set('item_id', null); return; } - $parts = explode('/', $state); $extracted = trim(end($parts)); $expected = $get('serial_number'); @@ -959,13 +962,13 @@ class PanelBoxValidationResource extends Resource $set('serial_number_panel_qr', $extracted); $set('serial_number_panel', '1'); - $panelParts = array_map('trim', explode('/', $state)); + $panelParts = explode('/', $state); - if (count($panelParts) != 4) { + if (count($panelParts) < 3) { Notification::make() ->title('Invalid QR Format') - ->body('Expected format: plantcode/itemcode/yearmm/serialnumber') + ->body('Expected format: plantcode/itemcode/yearmm/serialnumber (Or) plantcode/panelboxcode/serialnumber') ->danger() ->send(); $set('item_id', null); @@ -974,9 +977,7 @@ class PanelBoxValidationResource extends Resource $supplier = $panelParts[0]; $panelBoxCode = $panelParts[1]; - $yearMonth = $panelParts[2]; - $serialNumber = $panelParts[3]; - $panelBoxSerialNo = $yearMonth . $serialNumber; + $panelBoxSerialNo = implode('/', array_slice($panelParts, 2)); $set('panel_box_supplier', $supplier); $set('panel_box_serial_number', $panelBoxSerialNo); @@ -1715,7 +1716,189 @@ class PanelBoxValidationResource 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('panelBoxValidations', 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) { + $set('Line', null); + $set('Item', null); + $set('Machine', null); + }), + Select::make('Line') + ->label('Search by Line Name') + ->nullable() + ->searchable() + ->reactive() + ->options(function (callable $get) { + $plantId = $get('Plant'); + + if (empty($plantId)) { + return []; + } + + return Line::whereHas('panelBoxValidations', function ($query) use ($plantId) { + if ($plantId) { + $query->where('plant_id', $plantId); + } + })->pluck('name', 'id'); + }) + ->afterStateUpdated(function ($state, callable $set, callable $get) { + $set('Item', null); + }), + Select::make('Item') + ->label('Search by Item Code') + ->nullable() + ->searchable() + ->reactive() + ->options(function (callable $get) { + $plantId = $get('Plant'); + + if (empty($plantId)) { + return []; + } + + return Item::whereHas('productionCharacteristics', function ($query) use ($plantId) { + if ($plantId) { + $query->where('plant_id', $plantId); + } + })->pluck('code', 'id'); + }) + ->afterStateUpdated(function ($state, callable $set, callable $get) { + $set('production_order', null); + }), + TextInput::make('production_order') + ->label('Production Order / Doc No') + ->reactive() + ->placeholder('Enter Production Order (or) Doc No') + ->afterStateUpdated(function ($state, callable $set, callable $get) { + $set('serial_number', null); + }), + TextInput::make('serial_number') + ->label('Serial Number') + ->reactive() + ->placeholder('Enter Serial Number'), + TextInput::make('panel_box_code') + ->label('Panel Box Code') + ->reactive() + ->placeholder('Enter Panel Box Code'), + 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['Line']) && empty($data['Item']) && empty($data['production_order']) && empty($data['serial_number']) && empty($data['panel_box_code']) && empty($data['created_from']) && empty($data['created_to'])) { + return $query->whereRaw('1 = 0'); + } + + if (! empty($data['Plant'])) { + $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['Line'])) { + $query->where('line_id', $data['Line']); + } + + if (! empty($data['Item'])) { + $query->where('item_id', $data['Item']); + } + + if (! empty($data['production_order'])) { + $query->where('production_order', 'like', '%'.$data['production_order'].'%'); + } + + if (Str::length($data['serial_number']) > 0) { + $query->where('serial_number', 'like', '%'.$data['serial_number'].'%'); + } + + if (! empty($data['panel_box_code'])) { + $query->where('panel_box_code', 'like', '%'.$data['panel_box_code'].'%'); + } + + 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 Name: Choose plant to filter records.'; + } + } + + if (! empty($data['Line'])) { + $indicators[] = 'Line Name: '.Line::where('id', $data['Line'])->value('name'); + } + + if (! empty($data['Item'])) { + $indicators[] = 'Item Code: '.Item::where('id', $data['Item'])->value('code'); + } + + if (! empty($data['production_order'])) { + $indicators[] = 'Production Order: '.$data['production_order']; + } + + if (Str::length($data['serial_number']) > 0) { + $indicators[] = 'Serial Number: '.$data['serial_number']; + } + + if (! empty($data['panel_box_code'])) { + $indicators[] = 'Panel Box Code: '.$data['panel_box_code']; + } + + 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(),