Quality Validation - Dashboard - Production Quantity Validation and Plan Quantity Updation

This commit is contained in:
dhanabalan
2025-03-31 19:10:13 +05:30
parent a93fe806bb
commit 29687b109c
7 changed files with 483 additions and 120 deletions

View File

@@ -7,12 +7,19 @@ use App\Filament\Resources\QualityValidationResource\RelationManagers;
use App\Models\QualityValidation;
use Closure;
use Filament\Forms;
use Filament\Forms\Components\DatePicker;
use Filament\Forms\Components\DateTimePicker;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Filters\SelectFilter;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\Relationship;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Filament\Tables\Filters\Filter;
class QualityValidationResource extends Resource
@@ -73,29 +80,70 @@ class QualityValidationResource extends Resource
}
// Proceed with validation logic for new scanned QR code
if (!$state) {
if (!$state || trim($state) === '') {
$set('validationError', null);
return;
}
if (strpos($state, '|') === false)
{
// Check if QR format contains '|'
if (strpos($state, '|') === false) {
$set('validationError', 'Scan valid QR code. (Ex: Item_Code|Serial_Number )');
return;
}
if (!preg_match('/^[a-zA-Z0-9]{6,}+\|[1-9][a-zA-Z0-9]{8,}+(\|)?$/', $state)) {
if (strpos($state, '|') === false) {
$set('validationError', 'Scan valid QR code. (Ex: Item_Code|Serial_Number )');
$set('item_id', null);
$set('item_description', null);
$set('serial_number', null);
return;
}
else
{
$splits = explode('|', $state);
$iCode = trim($splits[0]);
$sNumber = isset($splits[1]) ? trim($splits[1]) : null;
if (!ctype_alnum($iCode)) {
$set('validationError', 'Item code must contain alpha-numeric values.');
return;
}
else if (strlen($iCode) < 6) {
$set('validationError', 'Item code must be at least 6 digits.');
return;
}
else if (!ctype_alnum($sNumber)) {
$set('validationError', 'Serial Number must contain alpha-numeric values.');
return;
}
else if (strlen($sNumber) < 9) {
$set('validationError', 'Serial Number must be at least 9 digits.');
return;
}
}
$set('validationError', 'Scan valid QR code. (Ex: Item_Code|Serial_Number )');
return;
}
else
{
$set('validationError', null);
}
$parts = explode('|', $state);
$itemCode = trim($parts[0]); // Extract item code // 123456|123456789
$serialNumber = trim($parts[1]);
// Store serial number before resetting fields
// Store serial number before resetting fields
$previousSerialNumber = $serialNumber;
$previousItemCode = $itemCode;
if (strlen($itemCode) < 6) {
$set('validationError', 'Item code must be at least 6 digits.');
$set('item_id', null);
return;
}
else if (!ctype_alnum($itemCode)) {
@@ -121,13 +169,6 @@ class QualityValidationResource extends Resource
$set('validationError', null);
}
if (!preg_match('/^[a-zA-Z0-9]+\|[a-zA-Z0-9]+(\|)?$/', $state)) {
$set('validationError', 'Invalid QR code format. Expected: Item_Code|Serial_Number.');
return;
}
//$set('validationError', null);
$plantId = $get('plant_id'); // Get selected plant
if (!$plantId) {
@@ -144,7 +185,7 @@ class QualityValidationResource extends Resource
if (!$stickerMaster) {
$set('validationError', 'Scanned item code does not exist for the selected plant.');
$set('validationError', 'Item code does not exist in master data.');
$set('sticker_master_id', null);
return;
}
@@ -168,18 +209,18 @@ class QualityValidationResource extends Resource
}
}
$serialExists = QualityValidation::where('sticker_master_id', $stickerMaster->id)
->where(function ($query) use ($serialNumber, $serialFields) {
foreach ($serialFields as $column) {
$query->orWhere($column, $serialNumber);
}
})->exists();
// $serialExists = QualityValidation::where('sticker_master_id', $stickerMaster->id)
// ->where(function ($query) use ($serialNumber, $serialFields) {
// foreach ($serialFields as $column) {
// $query->orWhere($column, $serialNumber);
// }
// })->exists();
if ($serialExists) {
$set('validationError', 'Already scanning process completed.');
$set('item_id', "$previousItemCode|$previousSerialNumber"); // Restore original QR code
return;
}
// if ($serialExists) {
// $set('validationError', 'Already scanning process completed.');
// $set('item_id', "$previousItemCode|$previousSerialNumber"); // Restore original QR code
// return;
// }
// Check if the serial number exists in any column of any row
$serialExists = QualityValidation::where(function ($query) use ($serialNumber, $serialFields) {
@@ -507,17 +548,56 @@ class QualityValidationResource extends Resource
public static function table(Table $table): Table
{
return $table
->searchable()
->columns([
Tables\Columns\TextColumn::make('id')
->label('ID')
->numeric()
->sortable(),
Tables\Columns\TextColumn::make('plant.name')
->numeric()
->sortable(),
Tables\Columns\TextColumn::make('stickerMaster.id')
->numeric()
Tables\Columns\TextColumn::make('stickerMaster.item.code')
->label('Item Code')
->sortable(),
Tables\Columns\TextColumn::make('production_order')
->label('Production Order')
->sortable(),
Tables\Columns\TextColumn::make('serial_number_motor')
->sortable(),
Tables\Columns\TextColumn::make('serial_number_pump')
->sortable(),
Tables\Columns\TextColumn::make('serial_number_pumpset')
->sortable(),
Tables\Columns\TextColumn::make('pack_slip_motor')
->sortable(),
Tables\Columns\TextColumn::make('pack_slip_pump')
->sortable(),
Tables\Columns\TextColumn::make('pack_slip_pumpset')
->sortable(),
Tables\Columns\TextColumn::make('name_plate_motor')
->sortable(),
Tables\Columns\TextColumn::make('name_plate_pump')
->sortable(),
Tables\Columns\TextColumn::make('name_plate_pumpset')
->sortable(),
Tables\Columns\TextColumn::make('tube_sticker_motor')
->sortable(),
Tables\Columns\TextColumn::make('tube_sticker_pump')
->sortable(),
Tables\Columns\TextColumn::make('tube_sticker_pumpset')
->sortable(),
Tables\Columns\TextColumn::make('warranty_card')
->sortable(),
Tables\Columns\TextColumn::make('part_validation1')
->sortable(),
Tables\Columns\TextColumn::make('part_validation2')
->sortable(),
Tables\Columns\TextColumn::make('part_validation3')
->sortable(),
Tables\Columns\TextColumn::make('part_validation4')
->sortable(),
Tables\Columns\TextColumn::make('part_validation5')
->sortable(),
Tables\Columns\TextColumn::make('created_at')
->dateTime()
->sortable()
@@ -532,12 +612,73 @@ class QualityValidationResource extends Resource
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
Tables\Filters\TrashedFilter::make(),
SelectFilter::make('item_code')
->relationship('stickerMaster.item', 'code')
->label('Filter by item code')
->searchable(),
Filter::make('production_order')
->label('Filter by Production Order')
->form([
TextInput::make('production_order')
->placeholder('Enter Production Order'),
])
->query(function ($query, array $data) {
return $query
->when(
$data['production_order'] ?? null,
fn ($q) => $q->where('production_order', 'like', '%' . $data['production_order'] . '%')
);
})
// This function adds indicators to show applied filters in the UI.
// It helps users see what filters are currently active.
->indicateUsing(function (array $data) {
return empty($data['production_order']) ? [] : ['Production Order: ' . $data['production_order']];
}),
// Created Date Range Filter
Filter::make('created_at')
->form([
DateTimePicker::make('created_from')
->label('Created From')
->native(false), // Optional: Use a nice date picker UI
DateTimePicker::make('created_to')
->label('Created To')
->native(false),
])
->query(function ($query, array $data) {
return $query
->when(
$data['created_from'] ?? null,
fn ($q) => $q->where('created_at', '>=', $data['created_from'])
)
->when(
$data['created_to'] ?? null,
fn ($q) => $q->where('created_at', '<=', $data['created_to'])
);
})
->indicateUsing(function (array $data) {
$indicators = [];
if (!empty($data['created_from'])) {
$indicators[] = 'From: ' . $data['created_from'];
}
if (!empty($data['created_to'])) {
$indicators[] = 'To: ' . $data['created_to'];
}
return $indicators;
}),
])
->actions([
Tables\Actions\ViewAction::make(),
Tables\Actions\EditAction::make(),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
@@ -545,6 +686,7 @@ class QualityValidationResource extends Resource
Tables\Actions\RestoreBulkAction::make(),
]),
]);
}
public static function getRelations(): array