Quality Validation - Dashboard - Production Quantity Validation and Plan Quantity Updation
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user