38 Commits

Author SHA1 Message Date
dhanabalan
702dd69c94 Added 'panel_box_code', 'created_by' and 'updated_by' columns on InvoiceValidationExporter page
Some checks are pending
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Waiting to run
Gemini PR Review / Gemini PR Review (pull_request) Waiting to run
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Waiting to run
Laravel Larastan / larastan (pull_request) Waiting to run
Laravel Pint / pint (pull_request) Waiting to run
2026-02-03 21:31:06 +05:30
dhanabalan
ce65c68125 Added updated_by name on updated invoice for scanned serial numbers
Some checks failed
Gemini PR Review / Gemini PR Review (pull_request) Waiting to run
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Waiting to run
Laravel Larastan / larastan (pull_request) Waiting to run
Laravel Pint / pint (pull_request) Waiting to run
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
2026-02-03 21:15:13 +05:30
dhanabalan
92f3352f6b Updated clear panel box QR if cancel button clicked and Added panel_box_code update logic on livewire page
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
2026-02-03 20:57:39 +05:30
dhanabalan
a14cf0aef6 Added 'created_by' and 'updated_by' columns on record creation
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
2026-02-03 20:53:00 +05:30
dhanabalan
bdd8e9dfc3 Added 'created_by' and 'updated_by' columns to InvoiceValidationResource table and updated file upload validation for .xlsx file (serial / material invoice)
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
2026-02-03 20:51:12 +05:30
dhanabalan
951a69b85e Added panel_box_code, created_by, updated_by columns in InvoiceValidation model
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
2026-02-03 19:47:52 +05:30
dhanabalan
dc6fd87c7b Added migration file to create panel_box_code, created_by, updated_by columns in invoice_validations table
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
2026-02-03 19:46:19 +05:30
dhanabalan
f464facd56 Added panel_box_code, created_by, updated_by columns in invoice_validations migration table
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
2026-02-03 19:44:48 +05:30
dhanabalan
21d009ee1c Added approver_type column to characteristic_approver_masters table
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
2026-02-03 17:13:30 +05:30
dhanabalan
8e7030b80b Added dynamic plant options in user form based on authenticated user's plant ID
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
2026-02-03 17:01:56 +05:30
dhanabalan
1931412511 Added skip plant if not exist on user importer page
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
2026-02-03 16:12:59 +05:30
dhanabalan
0fef7b27bf Updated Final API lists
Some checks failed
Gemini PR Review / Gemini PR Review (pull_request) Waiting to run
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Waiting to run
Laravel Larastan / larastan (pull_request) Waiting to run
Laravel Pint / pint (pull_request) Waiting to run
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
2026-02-03 13:16:13 +05:30
dhanabalan
115fe43428 Commented FileUploadController logic and Added request characteristics mail approve logic
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
2026-02-03 13:13:28 +05:30
dhanabalan
5eb067899b Added invoice upload directory creation logic while choosing plant on resource page
Some checks failed
Gemini PR Review / Gemini PR Review (pull_request) Waiting to run
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Waiting to run
Laravel Larastan / larastan (pull_request) Waiting to run
Laravel Pint / pint (pull_request) Waiting to run
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
2026-02-03 12:32:06 +05:30
dhanabalan
8a2dac9982 Added invoice upload directory creation file store logic on resource and create page
Some checks failed
Gemini PR Review / Gemini PR Review (pull_request) Waiting to run
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Waiting to run
Laravel Larastan / larastan (pull_request) Waiting to run
Laravel Pint / pint (pull_request) Waiting to run
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
2026-02-03 12:28:22 +05:30
dhanabalan
79f09236ab Added invoice upload directory creation logic
Some checks failed
Gemini PR Review / Gemini PR Review (pull_request) Waiting to run
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Waiting to run
Laravel Larastan / larastan (pull_request) Waiting to run
Laravel Pint / pint (pull_request) Waiting to run
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
2026-02-03 12:19:25 +05:30
dhanabalan
0947408462 Added invoice upload, download, delete functionality
Some checks failed
Gemini PR Review / Gemini PR Review (pull_request) Waiting to run
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Waiting to run
Laravel Larastan / larastan (pull_request) Waiting to run
Laravel Pint / pint (pull_request) Waiting to run
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
2026-02-03 09:57:37 +05:30
dhanabalan
538f0961b4 Added email icon to resource file
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
2026-01-31 17:53:56 +05:30
dhanabalan
5fccde0160 Removed unwanted space
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Gemini PR Review / Gemini PR Review (pull_request) Has been cancelled
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Has been cancelled
Laravel Larastan / larastan (pull_request) Has been cancelled
Laravel Pint / pint (pull_request) Has been cancelled
2026-01-31 12:52:01 +05:30
dhanabalan
52de3aa0cc Enhance CharacteristicApproverMasterResource form with improved validation and field updates
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
2026-01-31 12:36:36 +05:30
dhanabalan
02c9059cf3 Enhance RequestCharacteristicResource form with validation and new fields
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
2026-01-31 12:34:44 +05:30
dhanabalan
dec4900659 Updated welcome page icon
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
2026-01-31 12:27:14 +05:30
dhanabalan
3550d8248e changed logic in welcome.blade.php
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Gemini PR Review / Gemini PR Review (pull_request) Has been cancelled
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Has been cancelled
Laravel Larastan / larastan (pull_request) Has been cancelled
Laravel Pint / pint (pull_request) Has been cancelled
2026-01-31 11:46:44 +05:30
dhanabalan
be5aee3df6 Changed time for invoice in transit report
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Gemini PR Review / Gemini PR Review (pull_request) Has been cancelled
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Has been cancelled
Laravel Larastan / larastan (pull_request) Has been cancelled
Laravel Pint / pint (pull_request) Has been cancelled
2026-01-31 10:36:39 +05:30
dhanabalan
ece0a9e226 Added validation logic against characteristics approver master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
2026-01-30 18:34:05 +05:30
dhanabalan
c12697a1af Refactor invoice record query to include scanned status filter and adjust pagination
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Gemini PR Review / Gemini PR Review (pull_request) Has been cancelled
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Has been cancelled
Laravel Larastan / larastan (pull_request) Has been cancelled
Laravel Pint / pint (pull_request) Has been cancelled
2026-01-30 17:39:08 +05:30
dhanabalan
c0929b4153 changed logic again in invoice data table
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Gemini PR Review / Gemini PR Review (pull_request) Has been cancelled
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Has been cancelled
Laravel Larastan / larastan (pull_request) Has been cancelled
Laravel Pint / pint (pull_request) Has been cancelled
2026-01-30 15:59:37 +05:30
dhanabalan
349d04b7f9 removed new logic in invoice data table
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Gemini PR Review / Gemini PR Review (pull_request) Has been cancelled
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Has been cancelled
Laravel Larastan / larastan (pull_request) Has been cancelled
Laravel Pint / pint (pull_request) Has been cancelled
2026-01-30 14:47:04 +05:30
dhanabalan
341f4f20b4 Added update missing warning
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Gemini PR Review / Gemini PR Review (pull_request) Has been cancelled
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Has been cancelled
Laravel Larastan / larastan (pull_request) Has been cancelled
Laravel Pint / pint (pull_request) Has been cancelled
2026-01-30 14:33:47 +05:30
dhanabalan
88e1e54cf7 Added logic in characteristic approval controller
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Gemini PR Review / Gemini PR Review (pull_request) Has been cancelled
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Has been cancelled
Laravel Larastan / larastan (pull_request) Has been cancelled
Laravel Pint / pint (pull_request) Has been cancelled
2026-01-30 10:54:17 +05:30
dhanabalan
c0e4b77eda Added logic in characteristic approval controller for mail trigger for proper levels
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Gemini PR Review / Gemini PR Review (pull_request) Has been cancelled
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Has been cancelled
Laravel Larastan / larastan (pull_request) Has been cancelled
Laravel Pint / pint (pull_request) Has been cancelled
2026-01-30 10:33:21 +05:30
dhanabalan
54bcf4cf28 Updated label name on exporter page
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Gemini PR Review / Gemini PR Review (pull_request) Has been cancelled
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Has been cancelled
Laravel Larastan / larastan (pull_request) Has been cancelled
Laravel Pint / pint (pull_request) Has been cancelled
2026-01-30 09:19:50 +05:30
dhanabalan
2fbbbe579b Updated label name on import and export button
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Gemini PR Review / Gemini PR Review (pull_request) Has been cancelled
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Has been cancelled
Laravel Larastan / larastan (pull_request) Has been cancelled
Laravel Pint / pint (pull_request) Has been cancelled
2026-01-30 09:13:46 +05:30
dhanabalan
1b1a02a565 Added prune logic for transaction models
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Gemini PR Review / Gemini PR Review (pull_request) Has been cancelled
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Has been cancelled
Laravel Larastan / larastan (pull_request) Has been cancelled
Laravel Pint / pint (pull_request) Has been cancelled
2026-01-29 19:01:02 +05:30
dhanabalan
c4153169eb Added generate mail report for deletable record count via scheduler daily at 7 AM
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
2026-01-29 18:51:23 +05:30
dhanabalan
d71eef3833 Added reprint process api.php
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Gemini PR Review / Gemini PR Review (pull_request) Has been cancelled
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Has been cancelled
Laravel Larastan / larastan (pull_request) Has been cancelled
Laravel Pint / pint (pull_request) Has been cancelled
2026-01-29 18:02:50 +05:30
dhanabalan
738f81043d added capacitor null in text box
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Gemini PR Review / Gemini PR Review (pull_request) Has been cancelled
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Has been cancelled
Laravel Larastan / larastan (pull_request) Has been cancelled
Laravel Pint / pint (pull_request) Has been cancelled
2026-01-29 17:40:41 +05:30
dhanabalan
9a9051b884 changed logic in invoice data tbale for capacitor issue
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Gemini PR Review / Gemini PR Review (pull_request) Has been cancelled
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Has been cancelled
Laravel Larastan / larastan (pull_request) Has been cancelled
Laravel Pint / pint (pull_request) Has been cancelled
2026-01-29 17:13:47 +05:30
43 changed files with 1810 additions and 604 deletions

View File

@@ -211,7 +211,7 @@ class Scheduler extends Command
}
break;
case 'Daily':
if (now()->format('H:i') == '10:45') {
if (now()->format('H:i') == '11:00') {
try {
\Artisan::call('send:invoice-transit-report', [
'schedule_type' => $rule->schedule_type,

View File

@@ -31,7 +31,7 @@ class CharacteristicApproverMasterExporter extends Exporter
ExportColumn::make('machine_name')
->label('MACHINE NAME'),
ExportColumn::make('characteristic_field')
->label('MASTER CHARACTERISTIC FIELD 1'),
->label('MASTER CHARACTERISTIC FIELD'),
ExportColumn::make('name1')
->label('APPROVER NAME 1'),
ExportColumn::make('mail1')

View File

@@ -44,6 +44,8 @@ class InvoiceValidationExporter extends Exporter
->label('CAPACITOR SCANNED STATUS'),
ExportColumn::make('scanned_status')
->label('SCANNED STATUS'),
ExportColumn::make('panel_box_code')
->label('PANEL BOX CODE'),
ExportColumn::make('panel_box_supplier')
->label('PANEL BOX SUPPLIER'),
ExportColumn::make('panel_box_serial_number')
@@ -61,9 +63,13 @@ class InvoiceValidationExporter extends Exporter
ExportColumn::make('created_at')
->label('CREATED AT'),
// ->dateTimeFormat('d-m-Y H:i:s'),
ExportColumn::make('created_by')
->label('CREATED BY'),
ExportColumn::make('updated_at')
->label('UPDATED AT'),
// ->dateTimeFormat('d-m-Y H:i:s'),
ExportColumn::make('updated_by')
->label('UPDATED BY'),
ExportColumn::make('deleted_at')
->enabledByDefault(false)
->label('DELETED AT'),

View File

@@ -18,7 +18,7 @@ class UserImporter extends Importer
public static function getColumns(): array
{
return [
ImportColumn::make('plant')
ImportColumn::make('plant_id')
->requiredMapping()
->exampleHeader('Plant Code')
->example('1000')
@@ -54,10 +54,13 @@ class UserImporter extends Importer
public function resolveRecord(): ?User
{
$warnMsg = [];
$plantCod = $this->data['plant'];
$plantCod = $this->data['plant_id'];
$plant = null;
if (Str::length($plantCod) < 4 || ! is_numeric($plantCod) || ! preg_match('/^[1-9]\d{3,}$/', $plantCod)) {
if (Str::length($plantCod) > 0 && (Str::length($plantCod) < 4 || ! is_numeric($plantCod) || ! preg_match('/^[1-9]\d{3,}$/', $plantCod))) {
$warnMsg[] = 'Invalid plant code found!';
} elseif (Str::length($plantCod) <= 0) {
$plant = null;
$plantCod = null;
} else {
$plant = Plant::where('code', $plantCod)->first();
if (! $plant) {

View File

@@ -7,13 +7,11 @@ use Illuminate\Support\Facades\Auth;
class Welcome extends Page
{
protected static ?string $navigationIcon = 'heroicon-o-document-text';
protected static ?string $navigationIcon = 'heroicon-s-gift'; // 'heroicon-o-document-text';
protected static string $view = 'filament.pages.welcome';
public function getHeading(): string
public function getHeading(): string
{
return '';
}

View File

@@ -65,41 +65,65 @@ class CharacteristicApproverMasterResource extends Resource
->afterStateUpdated(function ($state, callable $set) {
$set('updated_by', Filament::auth()->user()?->name);
}),
Forms\Components\TextInput::make('characteristic_field')
->label('Master Characteristic Field')
->columnSpan(2)
->required()
->default('NIL')
->afterStateUpdated(function ($state, callable $set) {
$set('updated_by', Filament::auth()->user()?->name);
}),
Forms\Components\TextInput::make('machine_name')
->label('Machine')
->columnSpan(2)
->reactive()
->required()
->minLength(5)
->default(function () {
return optional(CharacteristicApproverMaster::latest()->first())->machine_name ?? '';
})
->afterStateUpdated(function ($state, callable $set) {
$set('updated_by', Filament::auth()->user()?->name);
}),
Forms\Components\TextInput::make('characteristic_field')
->label('Master Characteristic Field')
->columnSpan(2)
->reactive()
->required()
->minLength(1)
->default('NIL')
->afterStateUpdated(function ($state, callable $set) {
if (strtolower($state) == 'nil' || $state == '' || $state == null) {
$set('characteristic_field', 'NIL');
}
$set('updated_by', Filament::auth()->user()?->name);
}),
Section::make('Approver - 1')
// ->description('Prevent abuse by limiting the number of requests per period')
->columnSpan(['default' => 2, 'sm' => 4])
->schema([
Forms\Components\TextInput::make('name1')
->label('Name')
->reactive()
->required()
->afterStateUpdated(function ($state, callable $set) {
$set('updated_by', Filament::auth()->user()?->name);
}),
Forms\Components\TextInput::make('mail1')
->label('Mail')
->label('Mail ID')
->columnSpan(['default' => 1, 'sm' => 2])
->reactive()
->required()
->suffixIcon('heroicon-m-envelope')
->suffixIconColor('primary')
->email()
->afterStateUpdated(function ($state, callable $set) {
$set('updated_by', Filament::auth()->user()?->name);
}),
Forms\Components\TextInput::make('duration1')
->label('Duration (HH.MM)')
->reactive()
->required()
->minLength(4)
->maxLength(5)
->regex('/^([0-9]|0[0-9]|1[0-9]|2[0-3])\.(0[0-9]|[1-5][0-9])$/')
->validationMessages([
// 'regex' => 'Duration must be 4 digits in HH.MM format (e.g., 12.30, 23.59). Hours: 00-23, Minutes: 00-59.',
'regex' => 'Duration must be HH.MM format (example: 00.00 - 23.59)',
// 'length' => 'Duration must be exactly 5 characters',
])
->afterStateUpdated(function ($state, callable $set) {
$set('updated_by', Filament::auth()->user()?->name);
}),
@@ -111,17 +135,28 @@ class CharacteristicApproverMasterResource extends Resource
->schema([
Forms\Components\TextInput::make('name2')
->label('Name')
->reactive()
->afterStateUpdated(function ($state, callable $set) {
$set('updated_by', Filament::auth()->user()?->name);
}),
Forms\Components\TextInput::make('mail2')
->label('Mail')
->label('Mail ID')
->columnSpan(['default' => 1, 'sm' => 2])
->reactive()
->suffixIcon('heroicon-m-envelope')
->suffixIconColor('primary')
->email()
->afterStateUpdated(function ($state, callable $set) {
$set('updated_by', Filament::auth()->user()?->name);
}),
Forms\Components\TextInput::make('duration2')
->label('Duration (HH.MM)')
->reactive()
->length(4)
->regex('/^([0-9]|0[0-9]|1[0-9]|2[0-3])\.(0[0-9]|[1-5][0-9])$/')
->validationMessages([
'regex' => 'Duration must be HH.MM format (example: 00.00 - 23.59)',
])
->afterStateUpdated(function ($state, callable $set) {
$set('updated_by', Filament::auth()->user()?->name);
}),
@@ -133,17 +168,28 @@ class CharacteristicApproverMasterResource extends Resource
->schema([
Forms\Components\TextInput::make('name3')
->label('Name')
->reactive()
->afterStateUpdated(function ($state, callable $set) {
$set('updated_by', Filament::auth()->user()?->name);
}),
Forms\Components\TextInput::make('mail3')
->label('Mail')
->label('Mail ID')
->columnSpan(['default' => 1, 'sm' => 2])
->reactive()
->suffixIcon('heroicon-m-envelope')
->suffixIconColor('primary')
->email()
->afterStateUpdated(function ($state, callable $set) {
$set('updated_by', Filament::auth()->user()?->name);
}),
Forms\Components\TextInput::make('duration3')
->label('Duration (HH.MM)')
->reactive()
->length(4)
->regex('/^([0-9]|0[0-9]|1[0-9]|2[0-3])\.(0[0-9]|[1-5][0-9])$/')
->validationMessages([
'regex' => 'Duration must be HH.MM format (example: 00.00 - 23.59)',
])
->afterStateUpdated(function ($state, callable $set) {
$set('updated_by', Filament::auth()->user()?->name);
}),
@@ -205,7 +251,7 @@ class CharacteristicApproverMasterResource extends Resource
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('mail1')
->label('Mail 1')
->label('E-Mail 1')
->alignCenter()
->searchable()
->sortable(),
@@ -219,7 +265,7 @@ class CharacteristicApproverMasterResource extends Resource
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('mail2')
->label('Mail 2')
->label('E-Mail 2')
->alignCenter()
->searchable()
->sortable(),
@@ -233,7 +279,7 @@ class CharacteristicApproverMasterResource extends Resource
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('mail3')
->label('Mail 3')
->label('E-Mail 3')
->alignCenter()
->searchable()
->sortable(),
@@ -289,14 +335,14 @@ class CharacteristicApproverMasterResource extends Resource
])
->headerActions([
// ImportAction::make()
// ->label('Import Request Characteristics')
// ->label('Import Characteristics Approver Master')
// ->color('warning')
// ->importer(CharacteristicApproverMasterImporter::class)
// ->visible(function () {
// return Filament::auth()->user()->can('view import characteristic approver master');
// }),
ExportAction::make()
->label('Export Request Characteristics')
->label('Export Characteristics Approver Master')
->color('warning')
->exporter(CharacteristicApproverMasterExporter::class)
->visible(function () {

View File

@@ -67,7 +67,7 @@ class InvoiceValidationResource extends Resource
->options(function (callable $get) {
$userHas = Filament::auth()->user()->plant_id;
return ($userHas && strlen($userHas) > 0) ? Plant::where('id', $userHas)->pluck('name', 'id')->toArray() : Plant::pluck('name', 'id')->toArray();
return ($userHas && strlen($userHas) > 0) ? Plant::where('id', $userHas)->pluck('name', 'id')->toArray() : Plant::orderBy('code')->pluck('name', 'id')->toArray();
})
->default(function () {
return optional(InvoiceValidation::latest()->first())->plant_id;
@@ -77,7 +77,7 @@ class InvoiceValidationResource extends Resource
->afterStateUpdated(function ($state, callable $set, callable $get) {
$plantId = $get('plant_id');
$set('update_invoice', null);
// Ensure `linestop_id` is not cleared
if (! $plantId) {
$set('invoice_number', null);
$set('serial_number', null);
@@ -87,6 +87,11 @@ class InvoiceValidationResource extends Resource
return;
} else {
$plantCode = Plant::find($plantId)?->code ?? null;
$directory = "uploads/temp/{$plantCode}";
if (! Storage::disk('local')->exists($directory)) {
Storage::disk('local')->makeDirectory($directory);
}
$set('ivPlantError', null);
}
})
@@ -207,6 +212,14 @@ class InvoiceValidationResource extends Resource
Forms\Components\TextInput::make('id')
->hidden()
->readOnly(true),
// Forms\Components\Hidden::make('created_by')
// ->label('Created By')
// ->default(Filament::auth()->user()?->name)
// ->reactive(),
// Forms\Components\Hidden::make('updated_by')
// ->label('Updated By')
// ->default(Filament::auth()->user()?->name)
// ->reactive(),
])
->columns(5),
]);
@@ -262,9 +275,11 @@ class InvoiceValidationResource extends Resource
Tables\Columns\TextColumn::make('scanned_status')
->label('Scanned Status')
->alignCenter(),
// Tables\Columns\TextColumn::make('stickerMaster.panel_box_code')
// ->label('Panel Box Code')
// ->alignCenter(),
Tables\Columns\TextColumn::make('panel_box_code')// stickerMaster.panel_box_code
->label('Panel Box Code')
->alignCenter()
->sortable(), // ->searchable()
// ->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('panel_box_supplier')
->label('Panel Box Supplier')
->alignCenter(),
@@ -289,11 +304,20 @@ class InvoiceValidationResource extends Resource
->label('Plant')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('created_by')
->label('Created By')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('created_at')
->label('Created At')
->dateTime()
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('updated_by')
->label('Updated By')
->alignCenter()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('updated_at')
->label('Updated At')
->dateTime()
@@ -332,7 +356,7 @@ class InvoiceValidationResource extends Resource
->options(function (callable $get) {
$userHas = Filament::auth()->user()->plant_id;
return ($userHas && strlen($userHas) > 0) ? Plant::where('id', $userHas)->pluck('name', 'id')->toArray() : Plant::pluck('name', 'id')->toArray();
return ($userHas && strlen($userHas) > 0) ? Plant::where('id', $userHas)->pluck('name', 'id')->toArray() : Plant::orderBy('code')->pluck('name', 'id')->toArray();
})
->label('Select Plant')
->required()
@@ -341,19 +365,37 @@ class InvoiceValidationResource extends Resource
})
->afterStateUpdated(function ($state, callable $set, callable $get) {
$set('invoice_serial_number', null);
$plantId = $get('plant_id');
$plantCode = Plant::find($plantId)?->code ?? null;
$directory = "uploads/temp/{$plantCode}";
if ($plantId && ! Storage::disk('local')->exists($directory)) {
Storage::disk('local')->makeDirectory($directory);
}
})
->reactive(),
FileUpload::make('invoice_serial_number')
->label('Invoice Serial Number')
// ->required()
->preserveFilenames() // <- this keeps the original filename
->storeFiles(false) // prevent auto-storing, we will store manually
->reactive()
->required()
->acceptedFileTypes([
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'application/vnd.ms-excel', // Legacy .xls fallback if needed
])
->rules(['mimes:xlsx']) // Laravel validation: extension check
->preserveFilenames() // <- this keeps the original filename
->reactive()
->storeFiles(false) // prevent auto-storing, we will store manually
->disk('local') // 'local' refers to the local storage disk defined in config/filesystems.php, typically pointing to storage/app.
->visible(fn (Get $get) => ! empty($get('plant_id')))
->directory('uploads/temp'),
->directory(function (callable $get) {
$plant = Plant::find($get('plant_id'));
$plantCode = $plant?->code ?? null;
return "uploads/temp/{$plantCode}";
})
->uploadingMessage('Uploading...')
->helperText('Only .xlsx files are allowed (Excel files).'),
])
->action(function (array $data) {
$uploadedFile = $data['invoice_serial_number'];
@@ -362,17 +404,40 @@ class InvoiceValidationResource extends Resource
$plantId = $data['plant_id'];
$plant = Plant::find($plantId);
$plantCode = $plant?->code ?? null;
// Get original filename
$originalName = $uploadedFile->getClientOriginalName(); // e.g. 3RA0018732.xlsx
$extension = strtolower(pathinfo($originalName, PATHINFO_EXTENSION));
if ($extension !== 'xlsx') {
throw new \Exception('Only .xlsx files allowed.');
}
$originalNameOnly = pathinfo($originalName, PATHINFO_FILENAME);
$originalName = "{$originalNameOnly}.xlsx";
// Store manually using storeAs to keep original name
$path = $uploadedFile->storeAs('uploads/temp', $originalName, 'local'); // returns relative path
// uploads/temp/3RA0018735.xlsx
$path = $uploadedFile->storeAs("uploads/temp/{$plantCode}", $originalName, 'local'); // returns relative path
// uploads/temp/{$plantCode}/3RA0018735.xlsx
if (strlen($originalNameOnly) < 8 || ! ctype_alnum($originalNameOnly)) {
Notification::make()
->title("Serial invoice number : '$originalNameOnly' should contain minimum 8 digit alpha numeric values!")
->danger()
->send();
if ($disk->exists($path)) {
$disk->delete($path);
}
return;
}
$fullPath = Storage::disk('local')->path($path);
// /home/iot-dev/projects/pds/storage/app/private/uploads/temp/3RA0018735.xlsx
// /home/iot-dev/projects/pds/storage/app/private/uploads/temp/{$plantCode}/3RA0018735.xlsx
$totQuan = InvoiceValidation::where('invoice_number', $originalNameOnly)->count();
if ($totQuan > 0) {
@@ -637,7 +702,7 @@ class InvoiceValidationResource extends Resource
->options(function (callable $get) {
$userHas = Filament::auth()->user()->plant_id;
return ($userHas && strlen($userHas) > 0) ? Plant::where('id', $userHas)->pluck('name', 'id')->toArray() : Plant::pluck('name', 'id')->toArray();
return ($userHas && strlen($userHas) > 0) ? Plant::where('id', $userHas)->pluck('name', 'id')->toArray() : Plant::orderBy('code')->pluck('name', 'id')->toArray();
})
->label('Select Plant')
->required()
@@ -646,32 +711,68 @@ class InvoiceValidationResource extends Resource
})
->afterStateUpdated(function ($state, callable $set, callable $get) {
$set('invoice_material', null);
$plantId = $get('plant_id');
$plantCode = Plant::find($plantId)?->code ?? null;
$directory = "uploads/temp/{$plantCode}";
if ($plantId && ! Storage::disk('local')->exists($directory)) {
Storage::disk('local')->makeDirectory($directory);
}
})
->reactive(),
FileUpload::make('invoice_material')
->label('Invoice Material')
->required()
->preserveFilenames()
->reactive() // <- this keeps the original filename
->preserveFilenames() // <- this keeps the original filename
->reactive()
->storeFiles(false) // prevent auto-storing
->disk('local')
->visible(fn (Get $get) => ! empty($get('plant_id')))
->directory('uploads/temp'),
->directory(function (callable $get) {
$plant = Plant::find($get('plant_id'));
$plantCode = $plant?->code ?? null;
return "uploads/temp/{$plantCode}";
})
->helperText('Only .xlsx files are allowed (Excel files).'),
])
->action(function (array $data) {
$uploadedFile = $data['invoice_material'];
$plantId = $data['plant_id']; // Access the selected plant_id
$plant = Plant::find($plantId);
$plantCode = $plant?->code ?? null;
$disk = Storage::disk('local');
// Get original filename
$originalName = $uploadedFile->getClientOriginalName();
$extension = strtolower(pathinfo($originalName, PATHINFO_EXTENSION));
if ($extension !== 'xlsx') {
throw new \Exception('Only .xlsx files allowed.');
}
$originalNameOnly = pathinfo($originalName, PATHINFO_FILENAME);
$path = $uploadedFile->storeAs('uploads/temp', $originalName, 'local');
$originalName = "{$originalNameOnly}.xlsx";
$path = $uploadedFile->storeAs("uploads/temp/{$plantCode}", $originalName, 'local');
if (strlen($originalNameOnly) < 8 || ! ctype_alnum($originalNameOnly)) {
Notification::make()
->title("Material invoice number : '$originalNameOnly' should contain minimum 8 digit alpha numeric values!")
->danger()
->send();
if ($disk->exists($path)) {
$disk->delete($path);
}
return;
}
$fullPath = Storage::disk('local')->path($path);
@@ -1073,7 +1174,7 @@ class InvoiceValidationResource extends Resource
->options(function (callable $get) {
$userHas = Filament::auth()->user()->plant_id;
return ($userHas && strlen($userHas) > 0) ? Plant::where('id', $userHas)->pluck('name', 'id')->toArray() : Plant::pluck('name', 'id')->toArray();
return ($userHas && strlen($userHas) > 0) ? Plant::where('id', $userHas)->pluck('name', 'id')->toArray() : Plant::orderBy('code')->pluck('name', 'id')->toArray();
})
->reactive()
->afterStateUpdated(function ($state, callable $set, callable $get): void {

View File

@@ -117,8 +117,8 @@ class CreateInvoiceValidation extends CreateRecord
$this->plantId = $plantId;
// $plant = Plant::find($plantId);
// $plantCode = $plant ? $plant->code : null;
$plant = Plant::find($plantId);
$plantCode = $plant?->code ?? null;
// ..GET SERIAL INVOICE API
@@ -233,7 +233,7 @@ class CreateInvoiceValidation extends CreateRecord
$this->dispatch('playNotificationSound');
$filename = $invoiceNumber.'.xlsx';
$directory = 'uploads/temp';
$directory = "uploads/temp/{$plantCode}";
$disk = Storage::disk('local');
$filePath = $directory.'/'.$filename;
// $fullPath = null;
@@ -266,7 +266,7 @@ class CreateInvoiceValidation extends CreateRecord
if ($updateStatus == '1') {
// 'Material invoice update in progress...';
$filename = $invoiceNumber.'.xlsx';
$directory = 'uploads/temp';
$directory = "uploads/temp/{$plantCode}";
$disk = Storage::disk('local');
$filePath = $directory.'/'.$filename;
$fullPath = $disk->path($filePath);
@@ -613,6 +613,8 @@ class CreateInvoiceValidation extends CreateRecord
'invoice_number' => $invoiceNumber,
'quantity' => 1,
'operator_id' => $operatorName,
'created_by' => $operatorName,
'updated_by' => $operatorName,
]);
$inserted++;
}
@@ -653,6 +655,8 @@ class CreateInvoiceValidation extends CreateRecord
'invoice_number' => $invoiceNumber,
'quantity' => $bundleQty,
'operator_id' => $operatorName,
'created_by' => $operatorName,
'updated_by' => $operatorName,
]);
$inserted++;
}
@@ -716,6 +720,7 @@ class CreateInvoiceValidation extends CreateRecord
$existEmpRecQty->update([
'quantity' => $newInsQty,
'operator_id' => $operatorName,
'updated_by' => $operatorName,
'updated_at' => now(),
]);
$newQuan--;
@@ -727,6 +732,8 @@ class CreateInvoiceValidation extends CreateRecord
'invoice_number' => $invoiceNumber,
'quantity' => $newInsQty,
'operator_id' => $operatorName,
'created_by' => $operatorName,
'updated_by' => $operatorName,
]);
$inserted++;
}
@@ -746,6 +753,7 @@ class CreateInvoiceValidation extends CreateRecord
$existEmpRecQty->update([
'quantity' => $newInsQty,
'operator_id' => $operatorName,
'updated_by' => $operatorName,
'updated_at' => now(),
]);
$newQuan--;
@@ -757,6 +765,8 @@ class CreateInvoiceValidation extends CreateRecord
'invoice_number' => $invoiceNumber,
'quantity' => $newInsQty,
'operator_id' => $operatorName,
'created_by' => $operatorName,
'updated_by' => $operatorName,
]);
$inserted++;
}
@@ -780,6 +790,8 @@ class CreateInvoiceValidation extends CreateRecord
->send();
$this->dispatch('playNotificationSound');
InvoiceValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->update(['updated_by' => $operatorName]); // 'updated_at' => now(),
// Update total quantity in the form
$totalQuantity = InvoiceValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->count();
$scannedQuantity = InvoiceValidation::where('invoice_number', $invoiceNumber)->whereNotNull('serial_number')->where('serial_number', '!=', '')->where('plant_id', $plantId)->count();
@@ -877,7 +889,7 @@ class CreateInvoiceValidation extends CreateRecord
$this->dispatch('playNotificationSound');
$filename = $invoiceNumber.'.xlsx';
$directory = 'uploads/temp';
$directory = "uploads/temp/{$plantCode}";
$disk = Storage::disk('local');
$filePath = $directory.'/'.$filename;
// $fullPath = null;
@@ -907,16 +919,15 @@ class CreateInvoiceValidation extends CreateRecord
if ($updateStatus == '1') {
$filename = $invoiceNumber.'.xlsx';
$directory = 'uploads/temp';
$directory = "uploads/temp/{$plantCode}";
$disk = Storage::disk('local');
$filePath = $directory.'/'.$filename;
$fullPath = $disk->path($filePath);
// Check if file exists //if ($disk->exists($filePath))
if ($fullPath && file_exists($fullPath)) {
// /home/iot-dev/projects/pds/storage/app/private/uploads/temp/3RA0018735.xlsx
// /home/iot-dev/projects/pds/storage/app/private/uploads/temp/{$plantCode}/3RA0018735.xlsx
// 'Serial invoice update in progress...'
// Now you can read/process the file here
$rows = Excel::toArray(null, $fullPath)[0];
@@ -1233,6 +1244,8 @@ class CreateInvoiceValidation extends CreateRecord
'invoice_number' => $invoiceNumber,
'serial_number' => $serialNumber,
'operator_id' => $operatorName,
'created_by' => $operatorName,
'updated_by' => $operatorName,
]);
$inserted++;
}
@@ -1255,6 +1268,8 @@ class CreateInvoiceValidation extends CreateRecord
$this->dispatch('playNotificationSound');
InvoiceValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->update(['updated_by' => $operatorName]); // 'updated_at' => now(),
// Update total quantity in the form
$totalQuantity = InvoiceValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->count();
$scannedQuantity = InvoiceValidation::where('invoice_number', $invoiceNumber)->where('scanned_status', 'Scanned')->where('plant_id', $plantId)->count();
@@ -1337,7 +1352,7 @@ class CreateInvoiceValidation extends CreateRecord
}
$filename = $invoiceNumber.'.xlsx';
$directory = 'uploads/temp';
$directory = "uploads/temp/{$plantCode}";
$disk = Storage::disk('local');
$filePath = $directory.'/'.$filename;
$fullPath = null; // $fullPath = $disk->path($filePath);
@@ -1778,6 +1793,8 @@ class CreateInvoiceValidation extends CreateRecord
'invoice_number' => $invoiceNumber,
'quantity' => 1,
'operator_id' => $operatorName,
'created_by' => $operatorName,
'updated_by' => $operatorName,
]);
$inserted++;
}
@@ -1811,6 +1828,8 @@ class CreateInvoiceValidation extends CreateRecord
'invoice_number' => $invoiceNumber,
'quantity' => $bundleQty,
'operator_id' => $operatorName,
'created_by' => $operatorName,
'updated_by' => $operatorName,
]);
$inserted++;
}
@@ -1842,6 +1861,8 @@ class CreateInvoiceValidation extends CreateRecord
'invoice_number' => $invoiceNumber,
'quantity' => $totalExcelQty,
'operator_id' => $operatorName,
'created_by' => $operatorName,
'updated_by' => $operatorName,
]);
$inserted++;
}
@@ -2206,6 +2227,8 @@ class CreateInvoiceValidation extends CreateRecord
'invoice_number' => $invoiceNumber,
'serial_number' => $serialNumber,
'operator_id' => $operatorName,
'created_by' => $operatorName,
'updated_by' => $operatorName,
]);
$inserted++;
}
@@ -2358,6 +2381,9 @@ class CreateInvoiceValidation extends CreateRecord
$invoiceNumber = $this->form->getState()['invoice_number'];
$this->invoiceNumber = $invoiceNumber;
$plant = Plant::find($plantId);
$plantCode = $plant?->code ?? null;
$totQuan = InvoiceValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->count();
$scanSQuan = InvoiceValidation::where('invoice_number', $invoiceNumber)->where('scanned_status', 'Scanned')->where('plant_id', $plantId)->count();
$totMQuan = InvoiceValidation::where('invoice_number', $invoiceNumber)->whereNotNull('quantity')->where('plant_id', $plantId)->count(); // ->where('quantity', '!=', '')
@@ -2395,7 +2421,7 @@ class CreateInvoiceValidation extends CreateRecord
$this->dispatch('playNotificationSound');
$filename = $invoiceNumber.'.xlsx';
$directory = 'uploads/temp';
$directory = "uploads/temp/{$plantCode}";
$disk = Storage::disk('local');
$filePath = $directory.'/'.$filename;
// $fullPath = null;
@@ -2947,6 +2973,7 @@ class CreateInvoiceValidation extends CreateRecord
if ($curExistQty > $curScanQty) { // 5 > 2
$record->quantity = $curExistQty - $curScanQty; // 5 - 2
$record->operator_id = $operatorName;
// $record->updated_by = $operatorName;
// $record->updated_at = now();
$record->save();
@@ -2959,12 +2986,15 @@ class CreateInvoiceValidation extends CreateRecord
'quantity' => $curScanQty,
'created_at' => $createdDt,
'operator_id' => $operatorName,
'created_by' => $operatorName,
'updated_by' => $operatorName,
]);
} elseif ($curExistQty == $curScanQty) { // 2 = 2
// $record->delete();
$record->serial_number = $serialNumber;
$record->batch_number = $batchNumber;
$record->operator_id = $operatorName;
// $record->updated_by = $operatorName;
// $record->updated_at = now();
$record->save();
@@ -2975,6 +3005,8 @@ class CreateInvoiceValidation extends CreateRecord
// 'quantity' => $curScanQty,
// 'created_at' => $createdDt,
// 'operator_id'=> $operatorName,
// 'created_by' => $operatorName,
// 'updated_by' => $operatorName,
// ]);
} else {
Notification::make()
@@ -3030,6 +3062,7 @@ class CreateInvoiceValidation extends CreateRecord
$record->batch_number = $batchNumber;
// $record->updated_at = now();
$record->operator_id = $operatorName;
// $record->updated_by = $operatorName;
$record->save();
}
@@ -3055,7 +3088,7 @@ class CreateInvoiceValidation extends CreateRecord
$this->dispatch('playNotificationSound');
$filename = $invoiceNumber.'.xlsx';
$directory = 'uploads/temp';
$directory = "uploads/temp/{$plantCode}";
$disk = Storage::disk('local');
$filePath = $directory.'/'.$filename;
// $fullPath = null;
@@ -3099,7 +3132,7 @@ class CreateInvoiceValidation extends CreateRecord
$this->dispatch('playNotificationSound');
$filename = $invoiceNumber.'.xlsx';
$directory = 'uploads/temp';
$directory = "uploads/temp/{$plantCode}";
$disk = Storage::disk('local');
$filePath = $directory.'/'.$filename;
// $fullPath = null;
@@ -3398,6 +3431,7 @@ class CreateInvoiceValidation extends CreateRecord
$record->scanned_status = 'Scanned';
}
$record->operator_id = $operatorName;
// $record->updated_by = $operatorName;
$record->save();
// Notification::make()
@@ -3427,7 +3461,7 @@ class CreateInvoiceValidation extends CreateRecord
$this->dispatch('playNotificationSound');
$filename = $invoiceNumber.'.xlsx';
$directory = 'uploads/temp';
$directory = "uploads/temp/{$plantCode}";
$disk = Storage::disk('local');
$filePath = $directory.'/'.$filename;
// $fullPath = null;
@@ -3514,6 +3548,7 @@ class CreateInvoiceValidation extends CreateRecord
$record->scanned_status = 'Scanned';
}
$record->operator_id = $operatorName;
// $record->updated_by = $operatorName;
$record->save();
// Notification::make()
@@ -3544,7 +3579,7 @@ class CreateInvoiceValidation extends CreateRecord
$this->dispatch('playNotificationSound');
$filename = $invoiceNumber.'.xlsx';
$directory = 'uploads/temp';
$directory = "uploads/temp/{$plantCode}";
$disk = Storage::disk('local');
$filePath = $directory.'/'.$filename;
// $fullPath = null;
@@ -3696,6 +3731,7 @@ class CreateInvoiceValidation extends CreateRecord
$record->scanned_status = 'Scanned';
}
$record->operator_id = $operatorName;
// $record->updated_by = $operatorName;
$record->save();
// Notification::make()
@@ -3740,7 +3776,7 @@ class CreateInvoiceValidation extends CreateRecord
// }
$filename = $invoiceNumber.'.xlsx';
$directory = 'uploads/temp';
$directory = "uploads/temp/{$plantCode}";
$disk = Storage::disk('local');
$filePath = $directory.'/'.$filename;
// $fullPath = null;

View File

@@ -8,6 +8,7 @@ use App\Models\CharacteristicApproverMaster;
use App\Models\Item;
use App\Models\Machine;
use App\Models\RequestCharacteristic;
use Closure;
use Filament\Facades\Filament;
use Filament\Forms;
use Filament\Forms\Components\Section;
@@ -21,6 +22,7 @@ use Filament\Tables\Actions\ImportAction;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Illuminate\Support\Facades\Schema;
use Illuminate\Validation\Rule;
class RequestCharacteristicResource extends Resource
@@ -236,7 +238,7 @@ class RequestCharacteristicResource extends Resource
})
->required(),
// ->disabled(fn ($get) => self::isFieldDisabled($get))
Section::make('Request Characteristic')
Section::make('Request Characteristic Field')
// ->columnSpan(['default' => 2, 'sm' => 4])
->reactive()
->schema([
@@ -244,24 +246,82 @@ class RequestCharacteristicResource extends Resource
->label('Characteristic Name')
->reactive()
->afterStateUpdated(function ($state, callable $set, callable $get) {
$set('characteristic_name', strtoupper($state));
$set('updated_by', Filament::auth()->user()?->name);
})
->required()
->disabled(fn ($get) => self::isFieldDisabled($get)),
->rules([
// function (callable $get) {
// return Rule::unique('request_characteristics', 'characteristic_name')
// ->where('plant_id', $get('plant_id'))
// ->where('machine_id', $get('machine_id'))
// ->where('machine_name', $get('machine_name'))
// ->ignore($get('id'));
// },
function (callable $get): Closure {
return function (string $attribute, $value, Closure $fail) use ($get) {
$charVal = strtolower($value);
$columns = Schema::getColumnListing('class_characteristics');
if (! in_array($charVal, $columns, true)) {
$fail('Unknown characteristic field found.'); // .implode(', ', $columns).
} else {
$plantId = $get('plant_id');
$jobNo = $get('aufnr');
$updId = $get('id');
$pendingExists = RequestCharacteristic::where('plant_id', $plantId)->where('aufnr', $jobNo)->where('characteristic_name', $value)->latest()->first();
if ($pendingExists) {
if ($updId && $pendingExists->id == $updId) {
return;
}
$app1 = $pendingExists->approver_status1 ?? null;
$app2 = $pendingExists->approver_status2 ?? null;
$app3 = $pendingExists->approver_status3 ?? null;
if ($app1 != 'Rejected' && $app2 != 'Rejected' && $app3 != 'Rejected' && $app1 != 'Approved' && $app2 != 'Approved' && $app3 != 'Approved') {
$fail('Approval is already pending.');
}
}
}
};
},
])
->readOnly(fn ($get) => self::isFieldDisabled($get)), // disabled
Forms\Components\TextInput::make('current_value')
->label('Current Value')
->reactive()
->afterStateUpdated(function ($state, callable $set, callable $get) {
$set('updated_by', Filament::auth()->user()?->name);
})
->disabled(fn ($get) => self::isFieldDisabled(get: $get)),
->required(function (callable $get) {
$updateVal = $get('update_value');
if ($updateVal == null || $updateVal == '') {
return true;
}
return false;
})
->readOnly(fn ($get) => self::isFieldDisabled($get)),
Forms\Components\TextInput::make('update_value')
->label('Update Value')
->reactive()
->afterStateUpdated(function ($state, callable $set, callable $get) {
$set('updated_by', Filament::auth()->user()?->name);
})
->disabled(fn ($get) => self::isFieldDisabled($get)),
->rules([
function (callable $get): Closure {
return function (string $attribute, $value, Closure $fail) use ($get) {
$currVal = $get('current_value');
if ($value == $currVal) {
$fail('Update value must be different from current value.');
}
};
},
])
->readOnly(fn ($get) => self::isFieldDisabled($get)),
])
->collapsible()
->columns(['default' => 1, 'sm' => 3]),
@@ -798,6 +858,19 @@ class RequestCharacteristicResource extends Resource
->dateTime()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('mail_status')
->label('Mail Status')
->alignCenter()
->searchable()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('trigger_at')
->label('Trigger At')
->dateTime()
->alignCenter()
->searchable()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('created_at')
->label('Created At')
->dateTime()

View File

@@ -3,20 +3,20 @@
namespace App\Filament\Resources;
use App\Filament\Resources\TestingTempResource\Pages;
use App\Filament\Resources\TestingTempResource\RelationManagers;
use App\Models\Plant;
use App\Models\TestingTemp;
use Filament\Facades\Filament;
use Filament\Forms;
use Filament\Forms\Components\Actions\Action;
use Filament\Forms\Form;
use Filament\Notifications\Notification;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Filament\Forms\Components\Actions\Action;
use Filament\Notifications\Notification;
use Storage;
use Livewire\Features\SupportFileUploads\TemporaryUploadedFile;
use Storage;
class TestingTempResource extends Resource
{
@@ -30,12 +30,77 @@ class TestingTempResource extends Resource
{
return $form
->schema([
Forms\Components\Select::make('plant_id')
->label('Plant Name')
->relationship('plant', 'name')
->required()
->searchable()
// ->preload()
// ->nullable(),
->reactive()
->columnSpan(1)
->options(function (callable $get) {
$userHas = Filament::auth()->user()->plant_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) {
$plantId = $get('plant_id');
$set('ivPlantError', null);
$set('name', null);
$set('selected_file', null);
$set('attachment', null);
if (! $plantId) {
$set('ivPlantError', 'Please select a plant first.');
} else {
$plantCode = Plant::find($plantId)?->code ?? null;
$directory = "uploads/temp/{$plantCode}";
if (! Storage::disk('local')->exists($directory)) {
Storage::disk('local')->makeDirectory($directory);
}
}
$set('updated_by', Filament::auth()->user()?->name);
})
->extraAttributes(fn ($get) => [
'class' => $get('ivPlantError') ? 'border-red-500' : '',
])
->hint(fn ($get) => $get('ivPlantError') ? $get('ivPlantError') : null)
->hintColor('danger'),
Forms\Components\TextInput::make('name')
->label('File Name'),
->label('File Name')
->required()
->reactive()
->afterStateUpdated(function ($state, callable $set, callable $get) {
$plantId = $get('plant_id');
$fileNam = $get('name');
// $set('selected_file', null);
if (! $plantId) {
$set('name', null);
} elseif (! $fileNam) {
$set('attachment', null);
}
$set('updated_by', Filament::auth()->user()?->name);
}),
Forms\Components\Select::make('selected_file')
->label('Select Uploaded File')
->options(function () {
return collect(Storage::disk('local')->files('uploads'))
->searchable()
->options(function (callable $get) {
$plantId = $get('plant_id');
if (! $plantId) {
return collect(Storage::disk('local')->files('uploads/temp'))
->mapWithKeys(function ($file) {
return [
$file => basename($file), // value => label
];
})
->toArray();
}
$plantCode = Plant::find($plantId)?->code ?? null;
return collect(Storage::disk('local')->files("uploads/temp/{$plantCode}"))
->mapWithKeys(function ($file) {
return [
$file => basename($file), // value => label
@@ -43,101 +108,157 @@ class TestingTempResource extends Resource
})
->toArray();
})
->searchable()
->afterStateUpdated(function ($state, callable $set, callable $get) {
// $plantId = $get('plant_id');
// if (! $plantId) {
// $set('selected_file', null);
// }
$set('updated_by', Filament::auth()->user()?->name);
})
->reactive(),
// ->disabled(fn (callable $get) => ! $get('plant_id')),
Forms\Components\FileUpload::make('attachment')
->label('Upload')
->label('Choose File to Upload')
// ->acceptedFileTypes(['application/pdf'])
->storeFiles(false)
->disk('local')
->directory('uploads/temp')
->directory(function (callable $get) {
$plantId = $get('plant_id');
$plantCode = Plant::find($plantId)?->code ?? null;
return "uploads/temp/{$plantCode}";
})
->preserveFilenames()
->maxSize(20480)
->reactive(),
->maxSize(20480) // 20 MB
->afterStateUpdated(function ($state, callable $set, callable $get) {
$plantId = $get('plant_id');
if (! $plantId) {
$set('attachment', null);
}
$set('updated_by', Filament::auth()->user()?->name);
})
->required(function (callable $get) {
$selFile = $get('selected_file');
$selAtt = $get('attachment');
if (! $selAtt && ! $selFile) {
return true;
}
return false;
})
->reactive()
->disabled(fn (callable $get) => ! $get('plant_id') || ! $get('name')),
Forms\Components\Actions::make([
Action::make('uploadNow')
->label('File Upload')
->color('success')
->action(function ($get) {
$uploadedFiles = $get('attachment');
if (is_array($uploadedFiles) && count($uploadedFiles) > 0) {
$uploaded = reset($uploadedFiles);
if ($uploaded instanceof TemporaryUploadedFile) {
$baseName = $get('name');
$extension = $uploaded->getClientOriginalExtension();
$finalFileName = $baseName . '.' . $extension;
$uploaded->storeAs(
'uploads',
$finalFileName,
'local'
);
Notification::make()
->title("File uploaded successfully: {$finalFileName}")
->success()
->send();
->label('Upload File')
->color('success')
->requiresConfirmation(function (callable $get) {
$filePath = $get('attachment');
if ($filePath) {
return true;
}
} else {
Notification::make()
->title('No file selected to upload')
->warning()
->send();
}
}),
return false;
})
->action(function (callable $get, callable $set) {
// Action::make('downloadAttachment')
// ->label('Download File')
// ->action(function ($get) {
$uploadedFiles = $get('attachment');
// $fileName = basename($get('selected_file'));
if (is_array($uploadedFiles) && count($uploadedFiles) > 0) {
// //dd($fileName);
$uploaded = reset($uploadedFiles);
// // if (!$fileName) {
// // Notification::make()
// // ->title('Enter file name to download')
// // ->danger()
// // ->send();
// // return;
// // }
if ($uploaded instanceof TemporaryUploadedFile) {
// $files = Storage::disk('local')->files('uploads');
$baseName = $get('name');
$extension = $uploaded->getClientOriginalExtension();
// foreach ($files as $file) {
$finalFileName = $baseName.'.'.$extension;
// if (pathinfo($file, PATHINFO_FILENAME) === $fileName) {
// dd($fileName);
// Notification::make()
// ->title("File downloaded successfully")
// ->success()
// ->send();
$plantId = $get('plant_id');
$plantCode = Plant::find($plantId)?->code ?? null;
// return response()->download(
// Storage::disk('local')->path($file)
// );
// }
// }
if (! $plantCode) {
Notification::make()
->title('Please select a plant first.')
->warning()
->send();
return;
} elseif (! $baseName) {
Notification::make()
->title('Please enter a file name first.')
->warning()
->send();
return;
}
// return "uploads/temp/{$plantCode}";
$uploaded->storeAs(
"uploads/temp/{$plantCode}",
$finalFileName,
'local'
);
$set('updated_by', Filament::auth()->user()?->name);
Notification::make()
->title("File uploaded successfully: {$finalFileName}")
->success()
->send();
}
} else {
if (! $get('plant_id')) {
Notification::make()
->title('Please select a plant first.')
->warning()
->send();
} elseif (! $get('name')) {
Notification::make()
->title('Please enter a file name first.')
->warning()
->send();
} else {
Notification::make()
->title('No file selected to upload')
->warning()
->send();
}
}
}),
// // Notification::make()
// // ->title('File not found')
// // ->danger()
// // ->send();
// }),
Action::make('downloadAttachment')
->label('Download File')
->action(function ($get) {
->color('warning')
->requiresConfirmation(function (callable $get) {
$filePath = $get('selected_file');
if ($filePath) {
return true;
}
return false;
})
->action(function (callable $get, callable $set) {
$filePath = $get('selected_file'); // uploads/filename.pdf
if (!$filePath || !Storage::disk('local')->exists($filePath)) {
// if (! $get('plant_id')) {
// Notification::make()
// ->title('Please select a plant first.')
// ->warning()
// ->send();
// return;
// } else
if (! $filePath) {
Notification::make()
->title('Please select a file first.')
->warning()
->send();
return;
} elseif (! Storage::disk('local')->exists($filePath)) {
Notification::make()
->title('File not found')
->danger()
@@ -146,6 +267,8 @@ class TestingTempResource extends Resource
return;
}
$set('updated_by', Filament::auth()->user()?->name);
Notification::make()
->title('File downloaded successfully')
->success()
@@ -156,38 +279,65 @@ class TestingTempResource extends Resource
);
}),
Action::make('deleteAttachment')
Action::make('deleteAttachment')
->label('Delete File')
->color('danger')
->requiresConfirmation()
->action(function ($get) {
->requiresConfirmation(function (callable $get) {
$filePath = $get('selected_file');
if ($filePath) {
return true;
}
return false;
})
->action(function ($get, $set) {
$filePath = $get('selected_file'); // uploads/filename.pdf
if (!$filePath || !Storage::disk('local')->exists($filePath)) {
Notification::make()
->title('File not found')
->danger()
->send();
return;
}
Storage::disk('local')->delete($filePath);
// if (! $get('plant_id')) {
// Notification::make()
// ->title('Please select a plant first.')
// ->warning()
// ->send();
// return;
// } else
if (! $filePath) {
Notification::make()
->title('File deleted successfully')
->success()
->title('Please select a file first.')
->warning()
->send();
}),
]),
return;
} elseif (! Storage::disk('local')->exists($filePath)) {
Notification::make()
->title('File not found')
->danger()
->send();
return;
}
Storage::disk('local')->delete($filePath);
$set('selected_file', null);
Notification::make()
->title('File deleted successfully')
->success()
->send();
}),
]),
Forms\Components\Hidden::make('created_by')
->label('Created By')
->default(Filament::auth()->user()?->name),
->default(Filament::auth()->user()?->name)
->reactive(),
Forms\Components\Hidden::make('updated_by')
->label('Updated By')
->default(Filament::auth()->user()?->name),
->default(Filament::auth()->user()?->name)
->reactive(),
]);
}

View File

@@ -5,7 +5,7 @@ namespace App\Filament\Resources;
use App\Filament\Exports\UserExporter;
use App\Filament\Imports\UserImporter;
use App\Filament\Resources\UserResource\Pages;
use App\Filament\Resources\UserResource\RelationManagers;
use App\Models\Plant;
use App\Models\User;
use Filament\Facades\Filament;
use Filament\Forms;
@@ -36,16 +36,21 @@ class UserResource extends Resource
->relationship('plant', 'name')
->nullable()
->reactive()
->options(function (callable $get) {
$userHas = Filament::auth()->user()->plant_id;
return ($userHas && strlen($userHas) > 0) ? Plant::where('id', $userHas)->pluck('name', 'id')->toArray() : Plant::orderBy('code')->pluck('name', 'id')->toArray();
})
->default(function () {
return optional(User::latest()->first())->plant_id;
}),
Forms\Components\TextInput::make('name')
->required()
->autofocus()
//->reactive()
// ->reactive()
->live(debounce: 600)
->afterStateUpdated(function ($state, callable $set, callable $get) {
$set('email', $state . '@cripumps.com');
$set('email', $state.'@cripumps.com');
})
->maxLength(255),
Forms\Components\TextInput::make('email')
@@ -58,7 +63,7 @@ class UserResource extends Resource
// ->ignore($get('id')); // Ignore current record during updates
// })
->reactive()
//->prefix(fn ($get) => $get('name') ?? null)
// ->prefix(fn ($get) => $get('name') ?? null)
// ->suffix('@cripumps.com')
->maxLength(255),
Forms\Components\DateTimePicker::make('email_verified_at'),
@@ -73,7 +78,7 @@ class UserResource extends Resource
// ->relationship('roles', 'name'),
Forms\Components\Select::make('roles')
->relationship('roles', 'name')
//->relationship(name: 'roles', titleAttribute: 'name')
// ->relationship(name: 'roles', titleAttribute: 'name')
// ->saveRelationshipsUsing(function (Model $record, $state) {
// $record->roles()->syncWithPivotValues($state, [config('permission.column_names.team_foreign_key') => getPermissionsTeamId()]);
// })
@@ -101,6 +106,7 @@ class UserResource extends Resource
$paginator = $livewire->getTableRecords();
$perPage = method_exists($paginator, 'perPage') ? $paginator->perPage() : 10;
$currentPage = method_exists($paginator, 'currentPage') ? $paginator->currentPage() : 1;
return ($currentPage - 1) * $perPage + $rowLoop->iteration;
}),
Tables\Columns\TextColumn::make('plant.name')
@@ -165,14 +171,14 @@ class UserResource extends Resource
->label('Import Users')
->color('warning')
->importer(UserImporter::class)
->visible(function() {
->visible(function () {
return Filament::auth()->user()->can('view import user');
}),
ExportAction::make()
->label('Export Users')
->color('warning')
->exporter(UserExporter::class)
->visible(function() {
->visible(function () {
return Filament::auth()->user()->can('view export user');
}),
]);

View File

@@ -16,17 +16,6 @@ class CharacteristicApprovalController extends Controller
return $this->updateStatus($request, 'Approved');
}
/**
* HOLD
*/
// public function hold(Request $request)
// {
// return $this->updateStatus($request, 'Hold');
// }
/**
* REJECT
*/
public function reject(Request $request)
{
return $this->updateStatus($request, 'Rejected');
@@ -35,7 +24,6 @@ class CharacteristicApprovalController extends Controller
public function holdForm(Request $request)
{
$id = $request->query('id');
// $level = $request->query('level');
$level = (int) $request->query('level');
@@ -48,14 +36,44 @@ class CharacteristicApprovalController extends Controller
default => abort(403, 'Invalid approver level'),
};
$levels = [
1 => 'approver_status1',
2 => 'approver_status2',
3 => 'approver_status3',
];
$currentStatus = $record->$statusColumn;
$currentStatusColumn = $levels[$level];
if (in_array($currentStatus, ['Approved', 'Rejected'])) {
return view('approval.already-processed', [
'status' => $currentStatus,
]);
}
foreach ($levels as $lvl => $column) {
if ($lvl != $level && in_array($record->$column, ['Approved', 'Rejected'])) {
return view('approval.already-processed', [
'status' => 'Already processed by another approver',
]);
}
}
$allowedMailStatusByLevel = [
1 => 'Sent',
2 => 'Sent-Mail2',
3 => 'Sent-Mail3',
];
$expectedMailStatus = $allowedMailStatusByLevel[$level] ?? null;
if ($record->mail_status != $expectedMailStatus) {
return view('approval.already-processed', [
'status' => 'You are not authorized to act at this level',
]);
}
return view('approval.hold-form', compact('id', 'level'));
}
@@ -74,6 +92,14 @@ class CharacteristicApprovalController extends Controller
default => abort(403, 'Invalid approver level'),
};
$levels = [
1 => 'approver_status1',
2 => 'approver_status2',
3 => 'approver_status3',
];
$currentStatusColumn = $levels[$level];
$currentStatus = $record->$statusColumn;
if (in_array($currentStatus, ['Approved', 'Rejected'])) {
@@ -82,6 +108,28 @@ class CharacteristicApprovalController extends Controller
]);
}
foreach ($levels as $lvl => $column) {
if ($lvl != $level && in_array($record->$column, ['Approved', 'Rejected'])) {
return view('approval.already-processed', [
'status' => 'Already processed by another approver',
]);
}
}
$allowedMailStatusByLevel = [
1 => 'Sent',
2 => 'Sent-Mail2',
3 => 'Sent-Mail3',
];
$expectedMailStatus = $allowedMailStatusByLevel[$level] ?? null;
if ($record->mail_status != $expectedMailStatus) {
return view('approval.already-processed', [
'status' => 'You are not authorized to act at this level',
]);
}
return view('approval.reject-form', compact('id', 'level'));
}
@@ -107,109 +155,6 @@ class CharacteristicApprovalController extends Controller
return $this->updateStatus($request, 'Rejected', false);
}
// protected function updateStatus(Request $request, string $status)
// {
// $requestId = $request->query('id');
// $level = (int) $request->query('level');
// $record = RequestCharacteristic::findOrFail($requestId);
// $column = match ($level) {
// 1 => 'approver_status1',
// 2 => 'approver_status2',
// 3 => 'approver_status3',
// default => abort(403, 'Invalid approver level'),
// };
// $pendingRecords = RequestCharacteristic::where('plant_id', $record->plant_id)
// ->where('machine_id', $record->machine_id)
// ->where('aufnr', $record->aufnr)
// ->whereNull('approver_status1')
// ->whereNull('approver_status2')
// ->whereNull('approver_status3')
// ->get();
// if ($pendingRecords->isEmpty()) {
// return view('approval.already-processed', [
// 'status' => 'No pending records for this group'
// ]);
// }
// if ($pendingRecords->first()->$column != null) {
// return view('approval.already-processed', [
// 'status' => $pendingRecords->first()->$column
// ]);
// }
// // Update all records in the group for this approver level
// foreach ($pendingRecords as $rec) {
// $rec->update([$column => $status]);
// }
// return match ($status) {
// 'Approved' => view('approval.success'),
// 'Hold' => view('approval.hold-success'),
// 'Rejected' => view('approval.reject-success'),
// default => abort(500),
// };
// }
// protected function updateStatus(Request $request, string $status)
// {
// $requestId = $request->query('id');
// $level = (int) $request->query('level');
// $record = RequestCharacteristic::findOrFail($requestId);
// [$statusColumn, $approvedAtColumn, $remarkColumn] = match ($level) {
// 1 => ['approver_status1', 'approved1_at', 'approver_remark1'],
// 2 => ['approver_status2', 'approved2_at', 'approver_remark2'],
// 3 => ['approver_status3', 'approved3_at', 'approver_remark3'],
// default => abort(403, 'Invalid approver level'),
// };
// $pendingRecords = RequestCharacteristic::where('plant_id', $record->plant_id)
// ->where('machine_id', $record->machine_id)
// ->where('aufnr', $record->aufnr)
// ->where('work_flow_id', $record->work_flow_id)
// ->whereNull('approver_status1')
// ->whereNull('approver_status2')
// ->whereNull('approver_status3')
// ->get();
// if ($pendingRecords->isEmpty()) {
// return view('approval.already-processed', [
// 'status' => 'No pending records for this group',
// ]);
// }
// if ($pendingRecords->first()->$statusColumn !== null) {
// return view('approval.already-processed', [
// 'status' => $pendingRecords->first()->$statusColumn,
// ]);
// }
// $updateData = [
// $statusColumn => $status,
// $remarkColumn => $request->input('remark')
// ];
// if ($status == 'Approved') {
// $updateData[$approvedAtColumn] = Carbon::now();
// }
// foreach ($pendingRecords as $rec) {
// $rec->update($updateData);
// }
// return match ($status) {
// 'Approved' => view('approval.success'),
// 'Hold' => view('approval.hold-success'),
// 'Rejected' => view('approval.reject-success'),
// default => abort(500),
// };
// }
protected function updateStatus(Request $request, string $status, bool $returnView = true)
{
$requestId = $request->input('id');
@@ -259,14 +204,36 @@ class CharacteristicApprovalController extends Controller
], 404);
}
$allowedMailStatusByLevel = [
1 => 'Sent',
2 => 'Sent-Mail2',
3 => 'Sent-Mail3',
];
$expectedMailStatus = $allowedMailStatusByLevel[$level] ?? null;
if ($record->mail_status != $expectedMailStatus) {
if ($returnView) {
return view('approval.already-processed', [
'status' => 'You are not authorized to act at this level',
]);
}
return response()->json([
'status' => false,
'message' => 'Invalid approval level for current mail status',
], 403);
}
$updateData = [
$statusColumn => $status,
$remarkColumn => $request->input('remark'),
$approvedAtColumn => Carbon::now(),
];
if ($status == 'Approved') {
$updateData[$approvedAtColumn] = Carbon::now();
}
// if ($status == 'Approved') {
// $updateData[$approvedAtColumn] = Carbon::now();
// }
foreach ($pendingRecords as $rec) {
$rec->update($updateData);

View File

@@ -2875,7 +2875,7 @@ class CharacteristicsController extends Controller
// $pendingCharacteristics = [];
// foreach ($characteristics as $char) {
// $charName = strtolower($char['characteristic_name']) ?? null;
// $charName = strtoupper($char['characteristic_name']) ?? null;
// $pendingExists = RequestCharacteristic::where('aufnr', $jobNo)
// ->where('characteristic_name', $charName)
// ->latest()
@@ -2948,7 +2948,7 @@ class CharacteristicsController extends Controller
// 'item_id' => $ItemId,
// 'characteristic_approver_master_id' => $charId,
// 'aufnr' => $jobNo,
// 'characteristic_name' => strtolower($char['characteristic_name']),
// 'characteristic_name' => strtoupper($char['characteristic_name']),//strtolower
// 'current_value' => $char['current_value'],
// 'update_value' => $char['update_value'],
// 'created_by' => $userName,
@@ -3037,7 +3037,7 @@ class CharacteristicsController extends Controller
}
if ($charField == null || $charField == '') {
$charField = 'nil';
$charField = 'NIL';
}
$plant = Plant::where('code', $plantCode)->first();
@@ -3132,6 +3132,24 @@ class CharacteristicsController extends Controller
$MachineId = $machineAgaPlant->id;
$iCode = Item::where('code', $itemCode)->first();
if (! $iCode) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Item code '{$itemCode}' not found!",
], 404);
}
$iCodeAgaPlant = Item::where('code', $itemCode)->where('plant_id', $plantId)->first();
if (! $iCodeAgaPlant) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Item code '{$itemCode}' not found for the plant code '{$plantCode}'!",
], 404);
}
$ItemId = $iCodeAgaPlant->id;
$pCode = CharacteristicApproverMaster::where('plant_id', $plantId)->first();
if (! $pCode) {
return response()->json([
@@ -3172,46 +3190,76 @@ class CharacteristicsController extends Controller
], 404);
}
$mNameAgaWorkCenter = CharacteristicApproverMaster::where('machine_name', $machineName)->where('machine_id', $MachineId)->first();
if (! $mNameAgaWorkCenter) {
$cField = CharacteristicApproverMaster::where('characteristic_field', $charField)->first();
if (! $cField) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Master characteristic field value '{$charField}' not found in characteristic approver master!",
], 404);
}
$cFieldAgaPlant = CharacteristicApproverMaster::where('characteristic_field', $charField)->where('plant_id', $plantId)->first();
if (! $cFieldAgaPlant) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Master characteristic field value '{$charField}' not found for the plant code '{$plantCode}' in characteristic approver master!",
], 404);
}
$mNameAndWorkCenter = CharacteristicApproverMaster::where('machine_name', $machineName)->where('machine_id', $MachineId)->first();
if (! $mNameAndWorkCenter) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Machine name '{$machineName}' and work center '{$workCenter}' not found in characteristic approver master!",
], 404);
}
$mNameAgaWorkCenterForPlant = CharacteristicApproverMaster::where('machine_name', $machineName)->where('machine_id', $MachineId)->where('plant_id', $plantId)->first();
if (! $mNameAgaWorkCenterForPlant) {
$mNameAndWorkCenterAgaPlant = CharacteristicApproverMaster::where('machine_name', $machineName)->where('machine_id', $MachineId)->where('plant_id', $plantId)->first();
if (! $mNameAndWorkCenterAgaPlant) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Machine name '{$machineName}' and work center '{$workCenter}' not found for the plant code '{$plantCode}' in characteristic approver master!",
], 404);
}
$charId = $mNameAgaWorkCenterForPlant->id;
$iCode = Item::where('code', $itemCode)->first();
if (! $iCode) {
$cFieldAndWorkCent = CharacteristicApproverMaster::where('characteristic_field', $charField)->where('machine_id', $MachineId)->first();
if (! $cFieldAndWorkCent) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Item code '{$itemCode}' not found!",
'status_description' => "Master characteristic field value '{$charField}' not found for the work center '{$workCenter}' in characteristic approver master!",
], 404);
}
$iCodeAgaPlant = Item::where('code', $itemCode)->where('plant_id', $plantId)->first();
if (! $iCodeAgaPlant) {
$cFieldAndWorkCentAgaPlant = CharacteristicApproverMaster::where('characteristic_field', $charField)->where('machine_id', $MachineId)->where('plant_id', $plantId)->first();
if (! $cFieldAndWorkCentAgaPlant) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Item code '{$itemCode}' not found for the plant code '{$plantCode}'!",
'status_description' => "Master characteristic field value '{$charField}' and work center '{$workCenter}' not found for the plant code '{$plantCode}' in characteristic approver master!",
], 404);
}
$ItemId = $iCodeAgaPlant->id;
$cFieldAndMach = CharacteristicApproverMaster::where('characteristic_field', $charField)->where('machine_name', $machineName)->first();
if (! $cFieldAndMach) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Master characteristic field value '{$charField}' not found for the machine name '{$machineName}' in characteristic approver master!",
], 404);
}
$cFieldAndWorkCentAndMachAgaPlant = CharacteristicApproverMaster::where('characteristic_field', $charField)->where('machine_id', $MachineId)->where('machine_name', $machineName)->where('plant_id', $plantId)->first();
if (! $cFieldAndWorkCentAndMachAgaPlant) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Master characteristic field value '{$charField}', work center '{$workCenter}', and machine name '{$machineName}' not found for the plant code '{$plantCode}' in characteristic approver master!",
], 404);
}
$charId = $cFieldAndWorkCentAndMachAgaPlant->id;
$pendingCharacteristics = [];
foreach ($characteristics as $char) {
$charName = strtolower($char['characteristic_name']) ?? null;
$charName = strtoupper($char['characteristic_name']) ?? null;
$pendingExists = RequestCharacteristic::where('plant_id', $plantId)->where('aufnr', $jobNo)->where('characteristic_name', $charName)->latest()->first();
if ($pendingExists) {
@@ -3292,7 +3340,7 @@ class CharacteristicsController extends Controller
'item_id' => $ItemId,
'characteristic_approver_master_id' => $charId,
'aufnr' => $jobNo,
'characteristic_name' => strtolower($char['characteristic_name']),
'characteristic_name' => strtoupper($char['characteristic_name']), // strtolower
'current_value' => $char['current_value'],
'update_value' => $char['update_value'],
'created_by' => $userName,
@@ -3720,6 +3768,8 @@ class CharacteristicsController extends Controller
], 404);
}
$workFlowId = strtoupper($workFlowId);
if (! $workFlowId) {
$records = RequestCharacteristic::with('approver')->where([
@@ -3782,14 +3832,14 @@ class CharacteristicsController extends Controller
], 404);
}
if (! str_ends_with(strtolower($filename), '.pdf')) {
$filename .= '.pdf';
}
// if (! str_ends_with(strtolower($filename), '.pdf')) {
// $filename .= '.pdf';
// }
if (! Storage::disk('local')->exists($filePath)) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'Pdf File not found for the provided work flow id number!',
'status_description' => "Pdf File not found for the provided 'Work Flow ID' number!",
], 404);
}

View File

@@ -6,21 +6,25 @@ use App\Models\InvoiceValidation;
use App\Models\StickerMaster;
use Filament\Facades\Filament;
use Filament\Notifications\Notification;
use Livewire\Component;
use Str;
use Livewire\Attributes\On;
use Livewire\Component;
use Livewire\WithPagination;
use Str;
class InvoiceDataTable extends Component
{
use WithPagination;
protected $paginationTheme = 'tailwind';
public $invoiceData = [];
// public $invoiceRecords;
public $plantId = 0;
public $package = [];
public $packageCount = 0;
public string $invoiceNumber = '';
@@ -53,7 +57,7 @@ class InvoiceDataTable extends Component
public $panel_box_supplier;
public $panel_box_item_code;
public $panel_box_code;
public $panel_box_serial_number;
@@ -182,6 +186,122 @@ class InvoiceDataTable extends Component
// }
// }
// public function loadData($invoiceNumber, $plantId, $onCapFocus = false)
// {
// $this->invoiceNumber = $invoiceNumber;
// $this->plantId = $plantId;
// $this->completedInvoice = false;
// $this->isSerial = true;
// $this->onCapFocus = $onCapFocus;
// $this->emptyInvoice = false;
// $this->hasSearched = true;
// $this->materialInvoice = false;
// $this->resetPage();
// $this->packageCount = 0;
// // IMPORTANT: keep scanned rows, otherwise count will not update
// $this->invoiceRecords = InvoiceValidation::with('stickerMasterRelation')
// ->where('invoice_number', $this->invoiceNumber)
// ->where('plant_id', $this->plantId)
// ->get();
// foreach ($this->invoiceRecords as &$row) {
// $stickCount = 0;
// $scannedCount = 0;
// // Get item code
// $row['code'] = StickerMaster::with('item')
// ->find($row['sticker_master_id'] ?? null)?->item?->code ?? 'N/A';
// $curStick = StickerMaster::find($row['sticker_master_id']);
// if ($curStick) {
// /** ---------------- REQUIRED STICKERS ---------------- */
// // PANEL BOX (capacitor)
// if (!empty($curStick->panel_box_code)) {
// $stickCount++;
// // Panel box scan = capacitor_scanned_status
// if ($row['capacitor_scanned_status'] == 1) {
// $scannedCount++;
// }
// }
// // Tube stickers
// if (
// $curStick->tube_sticker_motor == 1 ||
// $curStick->tube_sticker_pump == 1 ||
// $curStick->tube_sticker_pumpset == 1
// ) {
// if ($curStick->tube_sticker_motor == 1) {
// $stickCount++;
// if ($row['motor_scanned_status'] == 1) {
// $scannedCount++;
// }
// }
// if (
// $curStick->tube_sticker_pump == 1 ||
// ($curStick->tube_sticker_pumpset != 1 &&
// $curStick->tube_sticker_pump != 1 &&
// $curStick->pack_slip_pump == 1)
// ) {
// $stickCount++;
// if ($row['pump_scanned_status'] == 1) {
// $scannedCount++;
// }
// }
// if ($curStick->tube_sticker_pumpset == 1) {
// $stickCount++;
// if ($row['scanned_status_set'] == 1) {
// $scannedCount++;
// }
// }
// }
// // Pack slips (only if no tube stickers)
// elseif (
// $curStick->pack_slip_motor == 1 ||
// $curStick->pack_slip_pump == 1 ||
// $curStick->pack_slip_pumpset == 1
// ) {
// if ($curStick->pack_slip_motor == 1) {
// $stickCount++;
// if ($row['motor_scanned_status'] == 1) {
// $scannedCount++;
// }
// }
// if ($curStick->pack_slip_pump == 1) {
// $stickCount++;
// if ($row['pump_scanned_status'] == 1) {
// $scannedCount++;
// }
// }
// if ($curStick->pack_slip_pumpset == 1) {
// $stickCount++;
// if ($row['scanned_status_set'] == 1) {
// $scannedCount++;
// }
// }
// }
// }
// // SAFETY: never go negative
// $this->packageCount += max($stickCount - $scannedCount, 0);
// }
// $this->dispatch($onCapFocus ? 'focus-capacitor-input' : 'focus-serial-number');
// }
// #[On('refreshInvoiceData')]
// public function loadData($invoiceNumber, $plantId, $onCapFocus = false)
@@ -198,20 +318,30 @@ class InvoiceDataTable extends Component
// $this->resetPage();
// $this->packageCount = InvoiceValidation::with('stickerMasterRelation')
// ->where('invoice_number', $this->invoiceNumber)
// ->where('plant_id', $this->plantId)
// ->get()
// ->sum(function ($record) {
// $this->packageCount = 0;
// $records = InvoiceValidation::with('stickerMasterRelation')
// ->where('invoice_number', $this->invoiceNumber)
// ->where('plant_id', $this->plantId)
// ->get();
// $this->packageCount = $records->sum(function ($record) {
// $sm = $record->stickerMasterRelation;
// $stickCount = 0;
// $scannedCount = 0;
// if ($sm) {
// // Panel box
// if (strlen($sm->panel_box_code) > 0) $stickCount++;
// // if (!empty($sm->panel_box_code)) {
// // $stickCount++;
// // if (!empty($record->panel_box_serial_number)) {
// // $scannedCount++;
// // }
// // }
// // Tube stickers
// if ($sm->tube_sticker_motor || $sm->tube_sticker_pump || $sm->tube_sticker_pumpset) {
// $stickCount += $sm->tube_sticker_motor ? 1 : 0;
@@ -238,23 +368,11 @@ class InvoiceDataTable extends Component
// $this->dispatch($onCapFocus ? 'focus-capacitor-input' : 'focus-serial-number');
// }
// public function getInvoiceRecordsProperty()
// {
// if (! $this->hasSearched) {
// return collect();
// }
// return InvoiceValidation::with('stickerMasterRelation.item')
// ->where('invoice_number', $this->invoiceNumber)
// ->where('plant_id', $this->plantId)
// ->whereNull('scanned_status')
// ->paginate(7);
// }
public function loadData($invoiceNumber, $plantId, $onCapFocus = false)
{
$this->plantId = $plantId;
$this->invoiceNumber = $invoiceNumber;
$this->plantId = $plantId;
$this->completedInvoice = false;
$this->isSerial = true;
$this->onCapFocus = $onCapFocus;
@@ -262,77 +380,188 @@ class InvoiceDataTable extends Component
$this->hasSearched = true;
$this->materialInvoice = false;
// Eager load stickerMasterRelation and item
$invoiceRecords = InvoiceValidation::with('stickerMasterRelation.item')
->where('invoice_number', $invoiceNumber)
->where('plant_id', $plantId)
->whereNull('scanned_status')
->get();
$this->invoiceData = [];
$this->resetPage();
$this->packageCount = 0;
foreach ($invoiceRecords as $record) {
$records = InvoiceValidation::with('stickerMasterRelation')
->where('invoice_number', $this->invoiceNumber)
->where('plant_id', $this->plantId)
->get();
$this->packageCount = $records->sum(function ($record) {
$sm = $record->stickerMasterRelation;
// Compute code
$rowCode = $sm?->item?->code ?? 'N/A';
if (! $sm) {
return 0;
}
$stickCount = 0;
$scannedCount = 0;
if ($sm) {
// Panel box code
if (Str::length($sm->panel_box_code) > 0) {
if (! empty($sm->panel_box_code)) {
$stickCount++;
if ($record->capacitor_scanned_status == 1) {
$scannedCount++;
}
}
if ($sm->tube_sticker_motor == 1 || $sm->tube_sticker_pump == 1 || $sm->tube_sticker_pumpset == 1) {
if ($sm->tube_sticker_motor == 1) {
$stickCount++;
if ($record->motor_scanned_status == 1) {
$scannedCount++;
}
}
// Tube stickers logic
if ($sm->tube_sticker_motor == 1 || $sm->tube_sticker_pump == 1 || $sm->tube_sticker_pumpset == 1) {
if ($sm->tube_sticker_motor == 1) $stickCount++;
if ($sm->tube_sticker_pump == 1 || ($sm->tube_sticker_pumpset != 1 && $sm->tube_sticker_pump != 1 && $sm->pack_slip_pump == 1)) $stickCount++;
if ($sm->tube_sticker_pumpset == 1) $stickCount++;
if (
$sm->tube_sticker_pump == 1 ||
($sm->tube_sticker_pumpset != 1 &&
$sm->tube_sticker_pump != 1 &&
$sm->pack_slip_pump == 1)
) {
$stickCount++;
if ($record->pump_scanned_status == 1) {
$scannedCount++;
}
}
// Pack slip logic (only if tube sticker block didn't apply)
elseif ($sm->pack_slip_motor == 1 || $sm->pack_slip_pump == 1 || $sm->pack_slip_pumpset == 1) {
if ($sm->pack_slip_motor == 1) $stickCount++;
if ($sm->pack_slip_pump == 1) $stickCount++;
if ($sm->pack_slip_pumpset == 1) $stickCount++;
if ($sm->tube_sticker_pumpset == 1) {
$stickCount++;
if ($record->scanned_status_set == 1) {
$scannedCount++;
}
}
} elseif ($sm->pack_slip_motor == 1 || $sm->pack_slip_pump == 1 || $sm->pack_slip_pumpset == 1) {
if ($sm->pack_slip_motor == 1) {
$stickCount++;
if ($record->motor_scanned_status == 1) {
$scannedCount++;
}
}
if ($sm->pack_slip_pump == 1) {
$stickCount++;
if ($record->pump_scanned_status == 1) {
$scannedCount++;
}
}
if ($sm->pack_slip_pumpset == 1) {
$stickCount++;
if ($record->scanned_status_set == 1) {
$scannedCount++;
}
}
}
// Count already scanned
$scannedCount += ($record->motor_scanned_status == 1) ? 1 : 0;
$scannedCount += ($record->pump_scanned_status == 1) ? 1 : 0;
$scannedCount += ($record->capacitor_scanned_status == 1) ? 1 : 0;
$scannedCount += ($record->scanned_status_set == 1) ? 1 : 0;
return max($stickCount - $scannedCount, 0);
});
// Increment packageCount
$this->packageCount += max($stickCount - $scannedCount, 0);
$this->invoiceData[] = [
'sticker_master_id' => $record->sticker_master_id,
'serial_number' => $record->serial_number,
'motor_scanned_status' => $record->motor_scanned_status ?? '',
'pump_scanned_status' => $record->pump_scanned_status ?? '',
'capacitor_scanned_status' => $record->capacitor_scanned_status ?? '',
'scanned_status_set' => $record->scanned_status_set ?? '',
'scanned_status' => $record->scanned_status ?? '',
'panel_box_supplier' => $record->panel_box_supplier ?? '',
'panel_box_serial_number' => $record->panel_box_serial_number ?? '',
'created_at' => $record->created_at,
'operator_id' => $record->operator_id,
'code' => $rowCode,
'stickCount' => $stickCount,
];
}
if ($onCapFocus) {
$this->dispatch('focus-capacitor-input');
} else {
$this->dispatch('focus-serial-number');
}
$this->dispatch(
$onCapFocus ? 'focus-capacitor-input' : 'focus-serial-number'
);
}
public function getInvoiceRecordsProperty()
{
return InvoiceValidation::with('stickerMasterRelation.item')
->where('invoice_number', $this->invoiceNumber)
->where('plant_id', $this->plantId)
->where(function ($query) {
$query->whereNull('scanned_status')
->orWhere('scanned_status', '');
})
// ->when($this->hasSearched, function ($query) {
// $query->where('invoice_number', $this->invoiceNumber)
// ->where('plant_id', $this->plantId)
// ->where('scanned_status', '=', '');
// })
->paginate(6);
}
// public function loadData($invoiceNumber, $plantId, $onCapFocus = false)
// {
// $this->plantId = $plantId;
// $this->invoiceNumber = $invoiceNumber;
// $this->completedInvoice = false;
// $this->isSerial = true;
// $this->onCapFocus = $onCapFocus;
// $this->emptyInvoice = false;
// $this->hasSearched = true;
// $this->materialInvoice = false;
// // Eager load stickerMasterRelation and item
// $invoiceRecords = InvoiceValidation::with('stickerMasterRelation.item')
// ->where('invoice_number', $invoiceNumber)
// ->where('plant_id', $plantId)
// ->whereNull('scanned_status')
// ->get();
// $this->invoiceData = [];
// $this->packageCount = 0;
// foreach ($invoiceRecords as $record) {
// $sm = $record->stickerMasterRelation;
// // Compute code
// $rowCode = $sm?->item?->code ?? 'N/A';
// $stickCount = 0;
// $scannedCount = 0;
// if ($sm) {
// // Panel box code
// if (Str::length($sm->panel_box_code) > 0) {
// $stickCount++;
// }
// // Tube stickers logic
// if ($sm->tube_sticker_motor == 1 || $sm->tube_sticker_pump == 1 || $sm->tube_sticker_pumpset == 1) {
// if ($sm->tube_sticker_motor == 1) $stickCount++;
// if ($sm->tube_sticker_pump == 1 || ($sm->tube_sticker_pumpset != 1 && $sm->tube_sticker_pump != 1 && $sm->pack_slip_pump == 1)) $stickCount++;
// if ($sm->tube_sticker_pumpset == 1) $stickCount++;
// }
// // Pack slip logic (only if tube sticker block didn't apply)
// elseif ($sm->pack_slip_motor == 1 || $sm->pack_slip_pump == 1 || $sm->pack_slip_pumpset == 1) {
// if ($sm->pack_slip_motor == 1) $stickCount++;
// if ($sm->pack_slip_pump == 1) $stickCount++;
// if ($sm->pack_slip_pumpset == 1) $stickCount++;
// }
// }
// // Count already scanned
// $scannedCount += ($record->motor_scanned_status == 1) ? 1 : 0;
// $scannedCount += ($record->pump_scanned_status == 1) ? 1 : 0;
// $scannedCount += ($record->capacitor_scanned_status == 1) ? 1 : 0;
// $scannedCount += ($record->scanned_status_set == 1) ? 1 : 0;
// // Increment packageCount
// $this->packageCount += max($stickCount - $scannedCount, 0);
// $this->invoiceData[] = [
// 'sticker_master_id' => $record->sticker_master_id,
// 'serial_number' => $record->serial_number,
// 'motor_scanned_status' => $record->motor_scanned_status ?? '',
// 'pump_scanned_status' => $record->pump_scanned_status ?? '',
// 'capacitor_scanned_status' => $record->capacitor_scanned_status ?? '',
// 'scanned_status_set' => $record->scanned_status_set ?? '',
// 'scanned_status' => $record->scanned_status ?? '',
// 'panel_box_supplier' => $record->panel_box_supplier ?? '',
// 'panel_box_serial_number' => $record->panel_box_serial_number ?? '',
// 'created_at' => $record->created_at,
// 'operator_id' => $record->operator_id,
// 'code' => $rowCode,
// 'stickCount' => $stickCount,
// ];
// }
// if ($onCapFocus) {
// $this->dispatch('focus-capacitor-input');
// } else {
// $this->dispatch('focus-serial-number');
// }
// }
public function loadMaterialData($invoiceNumber, $plantId)
{
@@ -398,10 +627,168 @@ class InvoiceDataTable extends Component
public function cancelCapacitorInput()
{
$this->capacitorInput = null;
$this->showCapacitorInput = false;
$this->dispatch('focus-serial-number');
}
// public function processCapacitorInput()
// {
// $user = Filament::auth()->user();
// $operatorName = $user->name;
// if (! $this->capacitorInput) {
// return;
// }
// if (! preg_match('/^[^\/]+\/[^\/]+\/.+$/', $this->capacitorInput)) {
// Notification::make()
// ->title('Invalid Panel Box QR Format:')
// ->body("Scan the valid panel box QR '$this->capacitorInput' to proceed!")
// ->danger()
// // ->duration(3000)
// ->seconds(2)
// ->send();
// $this->capacitorInput = '';
// return;
// }
// $parts = explode('/', $this->capacitorInput);
// $supplier = $parts[0];
// $itemCode = $parts[1];
// $serialNumber = implode('/', array_slice($parts, 2)); // Keep rest of the string
// $existsInStickerMaster = StickerMaster::where('panel_box_code', $itemCode)->where('plant_id', $this->plantId)->whereHas('item', function ($query) {
// $query->where('code', $this->currentItemCode);
// })
// ->exists();
// if (! $existsInStickerMaster) {
// Notification::make()
// ->title('Unknown: Panel Box Code')
// ->body("Unknown panel box code: $itemCode found for item code: $this->currentItemCode")
// ->danger()
// // ->duration(4000)
// ->seconds(2)
// ->send();
// $this->capacitorInput = '';
// return;
// }
// foreach ($this->invoiceData as &$row) {
// if (($row['code'] ?? '') === $this->currentItemCode && ($row['serial_number'] ?? '') === $this->currentSerialNumber) {
// $row['panel_box_supplier'] = $supplier;
// $row['panel_box_code'] = $itemCode;
// $row['panel_box_serial_number'] = $serialNumber;
// $row['capacitor_scanned_status'] = 1;
// // $row['scanned_status_set'] = true;
// $matchingValidation = InvoiceValidation::with('stickerMaster.item')
// ->where('serial_number', $this->currentSerialNumber)
// ->where('plant_id', $this->plantId)
// ->get()
// ->first(function ($validation) {
// return $validation->stickerMaster?->item?->code === $this->currentItemCode;
// });
// // dd($matchingValidation);
// if ($matchingValidation) {
// $hasMotorQr = $matchingValidation->stickerMasterRelation->tube_sticker_motor ?? null;
// $hasPumpQr = $matchingValidation->stickerMasterRelation->tube_sticker_pump ?? null;
// $hasPumpSetQr = $matchingValidation->stickerMasterRelation->tube_sticker_pumpset ?? null;
// // $hasCapacitorQr = $matchingValidation->stickerMasterRelation->panel_box_code ?? null;
// $hadMotorQr = $matchingValidation->motor_scanned_status ?? null;
// $hadPumpQr = $matchingValidation->pump_scanned_status ?? null;
// $hadPumpSetQr = $matchingValidation->scanned_status_set ?? null;
// // $hadCapacitorQr = $matchingValidation->capacitor_scanned_status ?? null;
// $packCnt = 1;
// $scanCnt = 1;
// // if ($hadMotorQr === $hasMotorQr && $hadPumpQr === $hasPumpQr && $hadPumpSetQr === $hasPumpSetQr)
// if ($hasMotorQr || $hasPumpQr || $hasPumpSetQr) {
// $packCnt = $hasMotorQr ? $packCnt + 1 : $packCnt;
// $packCnt = $hasPumpQr ? $packCnt + 1 : $packCnt;
// $packCnt = $hasPumpSetQr ? $packCnt + 1 : $packCnt;
// $scanCnt = $hadMotorQr ? $scanCnt + 1 : $scanCnt;
// $scanCnt = $hadPumpQr ? $scanCnt + 1 : $scanCnt;
// $scanCnt = $hadPumpSetQr ? $scanCnt + 1 : $scanCnt;
// if ($packCnt === $scanCnt) {
// $matchingValidation->update([
// 'panel_box_supplier' => $supplier,
// 'panel_box_code' => $itemCode,
// 'panel_box_serial_number' => $serialNumber,
// 'capacitor_scanned_status' => 1,
// 'scanned_status' => 'Scanned',
// 'operator_id' => $operatorName,
// ]);
// } else {
// $matchingValidation->update([
// 'panel_box_supplier' => $supplier,
// 'panel_box_code' => $itemCode,
// 'panel_box_serial_number' => $serialNumber,
// 'capacitor_scanned_status' => 1,
// 'operator_id' => $operatorName,
// ]);
// }
// } else {
// $matchingValidation->update([
// 'panel_box_supplier' => $supplier,
// 'panel_box_code' => $itemCode,
// 'panel_box_serial_number' => $serialNumber,
// 'capacitor_scanned_status' => 1,
// 'scanned_status' => 'Scanned',
// 'operator_id' => $operatorName,
// ]);
// }
// // Notification::make()
// // ->title('Success: Capacitor QR')
// // // ->title("Panel box code scanned: $itemCode")
// // ->body("'Capacitor' QR scanned status updated, Scan next QR.")
// // ->success() // commented
// // ->seconds(2)
// // ->send();
// $totalQuantity = InvoiceValidation::where('invoice_number', $matchingValidation->invoice_number)->where('plant_id', $this->plantId)->count();
// $scannedQuantity = InvoiceValidation::where('invoice_number', $matchingValidation->invoice_number)->where('plant_id', $this->plantId)->where('scanned_status', 'Scanned')->count();
// // $this->form->fill([
// // 'plant_id' => $matchingValidation->plant_id,
// // 'invoice_number' => $matchingValidation->invoice_number,
// // 'serial_number' => null,
// // 'total_quantity' => $totalQuantity,
// // 'scanned_quantity'=> $scannedQuantity,
// // ]);
// if ($totalQuantity === $scannedQuantity) {
// Notification::make()
// ->title('Completed: Serial Invoice')
// ->body("Serial invoice '$matchingValidation->invoice_number' completed the scanning process.<br>Scan the next 'Serial Invoice' to proceed!")
// ->success()
// ->seconds(2)
// ->send();
// $this->loadCompletedData($matchingValidation->invoice_number, $matchingValidation->plant_id, true);
// } else {
// $this->loadData($matchingValidation->invoice_number, $matchingValidation->plant_id, false);
// }
// }
// break;
// }
// }
// $this->showCapacitorInput = false;
// $this->capacitorInput = '';
// $this->dispatch('updateScannedQuantity');
// // $this->loadData($this->invoiceNumber, $this->plantId);
// $this->dispatch('focus-serial-number');
// }
public function processCapacitorInput()
{
$user = Filament::auth()->user();
@@ -414,12 +801,14 @@ class InvoiceDataTable extends Component
if (! preg_match('/^[^\/]+\/[^\/]+\/.+$/', $this->capacitorInput)) {
Notification::make()
->title('Invalid Panel Box QR Format:')
->body('Scan the valid panel box QR code to proceed!')
->body("Scan the valid panel box QR '$this->capacitorInput' to proceed!")
->danger()
// ->duration(3000)
->seconds(2)
->send();
$this->capacitorInput = '';
return;
}
@@ -446,10 +835,19 @@ class InvoiceDataTable extends Component
return;
}
foreach ($this->invoiceData as &$row) {
if (($row['code'] ?? '') === $this->currentItemCode && ($row['serial_number'] ?? '') === $this->currentSerialNumber) {
$this->package = InvoiceValidation::with('stickerMasterRelation')
->where('invoice_number', $this->invoiceNumber)
->where('plant_id', $this->plantId)
->get();
foreach ($this->package as &$row) {
$stickerCode = $row->stickerMasterRelation?->item?->code ?? null;
$serialNo = $row->serial_number ?? null;
if ($stickerCode === $this->currentItemCode && $serialNo === $this->currentSerialNumber) {
$row['panel_box_supplier'] = $supplier;
$row['panel_box_item_code'] = $itemCode;
$row['panel_box_code'] = $itemCode;
$row['panel_box_serial_number'] = $serialNumber;
$row['capacitor_scanned_status'] = 1;
// $row['scanned_status_set'] = true;
@@ -462,6 +860,8 @@ class InvoiceDataTable extends Component
return $validation->stickerMaster?->item?->code === $this->currentItemCode;
});
// dd($matchingValidation);
if ($matchingValidation) {
$hasMotorQr = $matchingValidation->stickerMasterRelation->tube_sticker_motor ?? null;
$hasPumpQr = $matchingValidation->stickerMasterRelation->tube_sticker_pump ?? null;
@@ -488,7 +888,7 @@ class InvoiceDataTable extends Component
if ($packCnt === $scanCnt) {
$matchingValidation->update([
'panel_box_supplier' => $supplier,
'panel_box_item_code' => $itemCode,
'panel_box_code' => $itemCode,
'panel_box_serial_number' => $serialNumber,
'capacitor_scanned_status' => 1,
'scanned_status' => 'Scanned',
@@ -497,7 +897,7 @@ class InvoiceDataTable extends Component
} else {
$matchingValidation->update([
'panel_box_supplier' => $supplier,
'panel_box_item_code' => $itemCode,
'panel_box_code' => $itemCode,
'panel_box_serial_number' => $serialNumber,
'capacitor_scanned_status' => 1,
'operator_id' => $operatorName,
@@ -506,7 +906,7 @@ class InvoiceDataTable extends Component
} else {
$matchingValidation->update([
'panel_box_supplier' => $supplier,
'panel_box_item_code' => $itemCode,
'panel_box_code' => $itemCode,
'panel_box_serial_number' => $serialNumber,
'capacitor_scanned_status' => 1,
'scanned_status' => 'Scanned',
@@ -555,15 +955,15 @@ class InvoiceDataTable extends Component
$this->dispatch('focus-serial-number');
}
public function render()
{
return view('livewire.invoice-data-table');
}
// public function render()
// {
// return view('livewire.invoice-data-table', [
// 'records' => $this->invoiceRecords,
// ]);
// return view('livewire.invoice-data-table');
// }
public function render()
{
return view('livewire.invoice-data-table', [
'records' => $this->invoiceRecords,
]);
}
}

View File

@@ -2,13 +2,15 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class CharacteristicValue extends Model
{
use Prunable;
use SoftDeletes;
protected $fillable = [
@@ -45,4 +47,9 @@ class CharacteristicValue extends Model
{
return $this->belongsTo(Machine::class);
}
public function prunable(): Builder
{
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
}
}

View File

@@ -2,12 +2,15 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class ClassCharacteristic extends Model
{
use Prunable;
use SoftDeletes;
protected $fillable = [
@@ -179,4 +182,9 @@ class ClassCharacteristic extends Model
{
return $this->belongsTo(Machine::class);
}
public function prunable(): Builder
{
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
}
}

View File

@@ -2,12 +2,15 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class EbReading extends Model
{
use Prunable;
use SoftDeletes;
protected $fillable = [
@@ -66,4 +69,9 @@ class EbReading extends Model
{
return $this->belongsTo(Plant::class);
}
public function prunable(): Builder
{
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
}
}

View File

@@ -2,12 +2,15 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class InvoiceDataValidation extends Model
{
use Prunable;
use SoftDeletes;
protected $dates = ['deleted_at'];
@@ -32,4 +35,9 @@ class InvoiceDataValidation extends Model
{
return $this->belongsTo(Plant::class);
}
public function prunable(): Builder
{
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
}
}

View File

@@ -2,45 +2,53 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class InvoiceInTransit extends Model
{
use Prunable;
use SoftDeletes;
protected $fillable = [
"plant_id",
"receiving_plant",
"receiving_plant_name",
"invoice_number",
"invoice_date",
"item_code",
"description",
"quantity",
"transport_name",
"lr_bl_aw_number",
"lr_bl_aw_date",
"pending_days",
"obd_number",
"obd_date",
"shipment_weight",
"unit_price",
"net_value",
"total_item_amount",
"tax_amount",
"transport_mode",
"vehicle_number",
"e_waybill_number",
"created_at",
"created_by",
"updated_by",
"updated_at"
'plant_id',
'receiving_plant',
'receiving_plant_name',
'invoice_number',
'invoice_date',
'item_code',
'description',
'quantity',
'transport_name',
'lr_bl_aw_number',
'lr_bl_aw_date',
'pending_days',
'obd_number',
'obd_date',
'shipment_weight',
'unit_price',
'net_value',
'total_item_amount',
'tax_amount',
'transport_mode',
'vehicle_number',
'e_waybill_number',
'created_at',
'created_by',
'updated_by',
'updated_at',
];
public function plant(): BelongsTo
{
return $this->belongsTo(Plant::class);
}
public function prunable(): Builder
{
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
}
}

View File

@@ -2,12 +2,15 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class InvoiceOutValidation extends Model
{
use Prunable;
use SoftDeletes;
// protected $dates = ['deleted_at'];
@@ -27,4 +30,9 @@ class InvoiceOutValidation extends Model
{
return $this->belongsTo(Plant::class);
}
public function prunable(): Builder
{
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
}
}

View File

@@ -2,24 +2,28 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class InvoiceValidation extends Model
{
use Prunable;
use SoftDeletes;
protected $fillable = [
'sticker_master_id',
'plant_id',
'invoice_number',
'invoice_number',
'serial_number',
'motor_scanned_status',
'pump_scanned_status',
'capacitor_scanned_status',
'scanned_status_set',
'scanned_status',
'panel_box_code',
'panel_box_supplier',
'panel_box_serial_number',
'load_rate',
@@ -27,6 +31,8 @@ class InvoiceValidation extends Model
'batch_number',
'quantity',
'operator_id',
'created_by',
'updated_by',
];
public function plant(): BelongsTo
@@ -38,11 +44,14 @@ class InvoiceValidation extends Model
{
return $this->belongsTo(StickerMaster::class);
}
public function stickerMasterRelation()
{
return $this->belongsTo(StickerMaster::class, 'sticker_master_id');
}
public function prunable(): Builder
{
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
}
}

View File

@@ -2,32 +2,40 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class LocatorInvoiceValidation extends Model
{
use Prunable;
use SoftDeletes;
protected $fillable = [
'plant_id',
'invoice_number',
'invoice_number',
'serial_number',
'pallet_number',
'locator_number',
'scanned_status',
'upload_status',
'created_at',
'updated_at',
'scanned_at',
'created_by',
'scanned_by',
'updated_by',
'pallet_number',
'locator_number',
'scanned_status',
'upload_status',
'created_at',
'updated_at',
'scanned_at',
'created_by',
'scanned_by',
'updated_by',
];
public function plant(): BelongsTo
{
return $this->belongsTo(Plant::class);
}
public function prunable(): Builder
{
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
}
}

View File

@@ -2,39 +2,42 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class MfmReading extends Model
{
use Prunable;
use SoftDeletes;
protected $fillable = [
'plant_id',
'mfm_meter_id',
'apparent_energy_received',
'apparent_energy_received',
'reactive_energy_received',
'active_energy_received',
'active_power_r',
'active_power_y',
'active_power_b',
'active_power_y',
'active_power_b',
'active_power_total',
'voltage_ry',
'voltage_yb',
'voltage_ry',
'voltage_yb',
'voltage_br',
'current_r',
'current_y',
'current_y',
'current_b',
'current_n',
'voltage_r_n',
'voltage_y_n',
'voltage_r_n',
'voltage_y_n',
'voltage_b_n',
'frequency',
'power_factor_r',
'frequency',
'power_factor_r',
'power_factor_y',
'power_factor_b',
'power_factor_total',
'power_factor_total',
'created_at',
'updated_at',
];
@@ -48,4 +51,9 @@ class MfmReading extends Model
{
return $this->belongsTo(MfmMeter::class, 'mfm_meter_id');
}
public function prunable(): Builder
{
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
}
}

View File

@@ -2,31 +2,39 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class PalletValidation extends Model
{
use Prunable;
use SoftDeletes;
protected $fillable = [
'plant_id',
'pallet_number',
'pallet_number',
'serial_number',
'pallet_status',
'locator_number',
'pallet_status',
'locator_number',
'locator_quantity',
'created_at',
'updated_at',
'scanned_at',
'created_by',
'scanned_by',
'updated_by',
'created_at',
'updated_at',
'scanned_at',
'created_by',
'scanned_by',
'updated_by',
];
public function plant(): BelongsTo
{
return $this->belongsTo(Plant::class);
}
public function prunable(): Builder
{
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
}
}

View File

@@ -2,12 +2,15 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class ProcessOrder extends Model
{
use Prunable;
use SoftDeletes;
protected $fillable = [
@@ -24,8 +27,8 @@ class ProcessOrder extends Model
'rework_status',
'created_at',
'created_by',
'updated_by',
'updated_at',
'updated_by',
];
public function plant(): BelongsTo
@@ -42,4 +45,9 @@ class ProcessOrder extends Model
{
return $this->belongsTo(Item::class, 'item_id');
}
public function prunable(): Builder
{
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
}
}

View File

@@ -2,24 +2,29 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Database\Eloquent\Prunable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class ProductionLineStop extends Model
{
use Prunable;
use SoftDeletes;
protected $fillable = [
"plant_id",
"shift_id",
"line_id",
"linestop_id",
"from_datetime",
"to_datetime",
"stop_hour",
"stop_min",
"operator_id",
'plant_id',
'line_id',
'shift_id',
'linestop_id',
'from_datetime',
'to_datetime',
'stop_hour',
'stop_min',
'operator_id',
'created_at',
'updated_at',
];
public function plant(): BelongsTo
@@ -48,5 +53,8 @@ class ProductionLineStop extends Model
// return $this->belongsTo(LineStop::class, 'linestop_id');
// }
public function prunable(): Builder
{
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
}
}

View File

@@ -2,22 +2,26 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class ProductionPlan extends Model
{
use Prunable;
use SoftDeletes;
protected $fillable = [
"plant_id",
"shift_id",
"created_at",
"line_id",
"plan_quantity",
"production_quantity",
"operator_id",
'plant_id',
'shift_id',
'line_id',
'plan_quantity',
'production_quantity',
'operator_id',
'created_at',
'updated_at',
];
public function plant(): BelongsTo
@@ -34,4 +38,9 @@ class ProductionPlan extends Model
{
return $this->belongsTo(Line::class);
}
public function prunable(): Builder
{
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
}
}

View File

@@ -4,30 +4,33 @@ namespace App\Models;
use Carbon\Carbon;
use Filament\Facades\Filament;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Database\Eloquent\Prunable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class ProductionQuantity extends Model
{
use Prunable;
use SoftDeletes;
public static $importing = false; // Add this flag
protected $fillable = [
"plant_id",
"shift_id",
"line_id",
"item_id",
"serial_number",
"production_order",
"operator_id",
'plant_id',
'shift_id',
'line_id',
'item_id',
'serial_number',
'production_order',
'operator_id',
// "success_status",
// "notok_at",
// "no_of_employee",
// "list_of_employee",
"created_at",
"updated_at"
'created_at',
'updated_at',
];
public function plant(): BelongsTo
@@ -66,8 +69,7 @@ class ProductionQuantity extends Model
->latest()
->first();
if (!$productionPlan)
{
if (! $productionPlan) {
$productionPlan = ProductionPlan::where('plant_id', $productionQuantity->plant_id)
->where('shift_id', $productionQuantity->shift_id)
->where('line_id', $productionQuantity->line_id)
@@ -88,4 +90,9 @@ class ProductionQuantity extends Model
}
});
}
public function prunable(): Builder
{
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
}
}

View File

@@ -2,19 +2,22 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class QualityValidation extends Model
{
use Prunable;
use SoftDeletes;
protected $fillable = [
'sticker_master_id',
'plant_id',
'plant_id',
'line_id',
'production_order',
'production_order',
'serial_number_motor',
'serial_number_pump',
'serial_number_pumpset',
@@ -56,4 +59,9 @@ class QualityValidation extends Model
{
return $this->belongsTo(Line::class);
}
public function prunable(): Builder
{
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
}
}

View File

@@ -2,12 +2,15 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class RequestCharacteristic extends Model
{
use Prunable;
use SoftDeletes;
protected $fillable = [
@@ -48,7 +51,6 @@ class RequestCharacteristic extends Model
return $this->belongsTo(Item::class);
}
public function machine(): BelongsTo
{
return $this->belongsTo(Machine::class);
@@ -91,9 +93,8 @@ class RequestCharacteristic extends Model
);
}
public function prunable(): Builder
{
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
}
}

View File

@@ -2,30 +2,33 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class ReworkLocatorInvoiceValidation extends Model
{
use Prunable;
use SoftDeletes;
protected $fillable = [
'plant_id',
'invoice_number',
'serial_number',
'pallet_number',
'locator_number',
'scanned_status',
'upload_status',
'created_by',
'scanned_by',
'updated_by',
'reworked_by',
'created_at',
'updated_at',
'scanned_at',
'reworked_at',
'invoice_number',
'serial_number',
'pallet_number',
'locator_number',
'scanned_status',
'upload_status',
'created_by',
'scanned_by',
'updated_by',
'reworked_by',
'created_at',
'updated_at',
'scanned_at',
'reworked_at',
];
public function plant(): BelongsTo
@@ -33,4 +36,8 @@ class ReworkLocatorInvoiceValidation extends Model
return $this->belongsTo(Plant::class);
}
public function prunable(): Builder
{
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
}
}

View File

@@ -2,19 +2,21 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class SerialValidation extends Model
{
use Prunable;
use SoftDeletes;
protected $fillable = [
'sticker_master_id',
'plant_id',
'invoice_number',
'invoice_number',
'serial_number',
'motor_scanned_status',
'pump_scanned_status',
@@ -44,4 +46,9 @@ class SerialValidation extends Model
{
return $this->belongsTo(StickerMaster::class, 'sticker_master_id');
}
public function prunable(): Builder
{
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
}
}

View File

@@ -2,14 +2,15 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class StickerPrinting extends Model
{
//
use Prunable;
use SoftDeletes;
protected $fillable = [
@@ -26,4 +27,9 @@ class StickerPrinting extends Model
{
return $this->belongsTo(Plant::class);
}
public function prunable(): Builder
{
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
}
}

View File

@@ -2,30 +2,38 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class TempLiveReading extends Model
{
use SoftDeletes;
use Prunable;
use SoftDeletes;
protected $fillable = [
'plant_id',
'mfm_meter_id',
'register_data',
'register_data',
'created_at',
'updated_at',
'created_by',
'updated_at',
'created_by',
];
public function plant(): BelongsTo
{
return $this->belongsTo(Plant::class);
}
public function mfmMeter(): BelongsTo
{
return $this->belongsTo(MfmMeter::class, 'mfm_meter_id');
}
public function prunable(): Builder
{
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
}
}

View File

@@ -2,66 +2,69 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class TestingPanelReading extends Model
{
use Prunable;
use SoftDeletes;
protected $fillable = [
'plant_id',
'line_id',
'motor_testing_master_id',
'machine_id',
'output',
'serial_number',
'line_id',
'motor_testing_master_id',
'machine_id',
'output',
'serial_number',
'winded_serial_number',
'before_fr_volt',
'before_fr_cur',
'before_fr_pow',
'before_fr_res_ry',
'before_fr_res_yb',
'before_fr_res_br',
'before_fr_ir',
'before_fr_ir_r',
'before_fr_ir_y',
'before_fr_ir_b',
'before_fr_freq',
'before_fr_speed',
'after_fr_vol',
'after_fr_cur',
'after_fr_pow',
'after_fr_ir_hot',
'after_fr_ir_hot_r',
'after_fr_ir_hot_y',
'after_fr_ir_hot_b',
'after_fr_ir_cool',
'after_fr_ir_cool_r',
'after_fr_ir_cool_y',
'after_fr_ir_cool_b',
'after_fr_freq',
'after_fr_speed',
'after_fr_leak_cur',
'locked_rt_volt',
'locked_rt_cur',
'locked_rt_pow',
'no_load_pickup_volt',
'room_temperature',
'hv_test',
'batch_number',
'batch_count',
'result',
'remark',
'rework_count',
'before_fr_volt',
'before_fr_cur',
'before_fr_pow',
'before_fr_res_ry',
'before_fr_res_yb',
'before_fr_res_br',
'before_fr_ir',
'before_fr_ir_r',
'before_fr_ir_y',
'before_fr_ir_b',
'before_fr_freq',
'before_fr_speed',
'after_fr_vol',
'after_fr_cur',
'after_fr_pow',
'after_fr_ir_hot',
'after_fr_ir_hot_r',
'after_fr_ir_hot_y',
'after_fr_ir_hot_b',
'after_fr_ir_cool',
'after_fr_ir_cool_r',
'after_fr_ir_cool_y',
'after_fr_ir_cool_b',
'after_fr_freq',
'after_fr_speed',
'after_fr_leak_cur',
'locked_rt_volt',
'locked_rt_cur',
'locked_rt_pow',
'no_load_pickup_volt',
'room_temperature',
'hv_test',
'batch_number',
'batch_count',
'result',
'remark',
'rework_count',
'update_count',
'output_flag',
'tested_by',
'updated_by',
'tested_by',
'updated_by',
'created_at',
'updated_at',
'scanned_at',
'scanned_at',
];
public function plant(): BelongsTo
@@ -69,10 +72,11 @@ class TestingPanelReading extends Model
return $this->belongsTo(Plant::class);
}
public function line(): BelongsTo
public function line(): BelongsTo
{
return $this->belongsTo(Line::class);
}
public function machine(): BelongsTo
{
return $this->belongsTo(Machine::class);
@@ -83,8 +87,13 @@ class TestingPanelReading extends Model
return $this->belongsTo(Item::class);
}
public function motorTestingMaster()
public function motorTestingMaster()
{
return $this->belongsTo(MotorTestingMaster::class);
}
public function prunable(): Builder
{
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
}
}

View File

@@ -1,7 +1,6 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
@@ -27,19 +26,20 @@ return new class extends Migration
scanned_status_set TEXT DEFAULT NULL,
scanned_status TEXT DEFAULT NULL,
panel_box_code TEXT DEFAULT NULL,
panel_box_supplier TEXT DEFAULT NULL,
panel_box_serial_number TEXT DEFAULT NULL,
load_rate INT NOT NULL DEFAULT (0),
upload_status TEXT NOT NULL DEFAULT 'N',
batch_number TEXT DEFAULT NULL,
quantity INT DEFAULT NULL,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW(),
created_by TEXT DEFAULT NULL,
updated_by TEXT DEFAULT NULL,
deleted_at TIMESTAMP,
UNIQUE (plant_id, serial_number),
@@ -48,7 +48,7 @@ return new class extends Migration
);
SQL;
DB::statement($sql);
DB::statement($sql);
}
/**

View File

@@ -0,0 +1,31 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
$sql1 = <<<'SQL'
ALTER TABLE characteristic_approver_masters
ADD COLUMN approver_type TEXT DEFAULT NULL
SQL;
DB::statement($sql1);
}
/**
* Reverse the migrations.
*/
public function down(): void
{
// Schema::table('characteristic_approver_masters', function (Blueprint $table) {
// //
// });
}
};

View File

@@ -0,0 +1,45 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
$sql1 = <<<'SQL'
ALTER TABLE invoice_validations
ADD COLUMN panel_box_code TEXT DEFAULT NULL
SQL;
DB::statement($sql1);
$sql2 = <<<'SQL'
ALTER TABLE invoice_validations
ADD COLUMN created_by TEXT DEFAULT NULL
SQL;
DB::statement($sql2);
$sql3 = <<<'SQL'
ALTER TABLE invoice_validations
ADD COLUMN updated_by TEXT DEFAULT NULL
SQL;
DB::statement($sql3);
}
/**
* Reverse the migrations.
*/
public function down(): void
{
// Schema::table('invoice_validations', function (Blueprint $table) {
// //
// });
}
};

View File

@@ -1,19 +1,126 @@
<x-filament-panels::page>
<h1 class="text-3xl font-bold mb-6">Welcome to CRI Digital Manufacturing IIOT</h1>
<!-- HEADER -->
<div class="mb-8">
<h1 class="text-4xl font-bold tracking-tight">
CRI Digital Manufacturing IIoT Platform
</h1>
<p class="text-lg text-gray-600 mt-2">
Complete visibility, traceability, and control across your manufacturing operations
</p>
</div>
<div class="w-full overflow-hidden rounded-xl shadow">
<img
src="{{ asset('images/iiot-banner.jpg') }}"
alt="CRI Digital Manufacturing IIoT"
class="w-full h-64 object-cover"
>
</div>
<!-- BANNER -->
{{-- <div class="w-full overflow-hidden rounded-2xl shadow mb-10"> --}}
<div class="w-full overflow-hidden rounded-xl shadow">
<img
src="{{ asset('images/iiot-banner.jpg') }}"
alt="CRI Digital Manufacturing IIoT"
class="w-full h-72 object-cover"
>
</div>
<p class="text-lg text-gray-600 mb-6">
This dashboard provides real-time visibility into your manufacturing operations,
enabling you to monitor production, track performance, and make data-driven decisions
across plants and lines—all from one centralized platform.
</p>
<!-- INTRO -->
<div class="max-w-4xl mb-10">
<p class="text-lg text-gray-700 mb-4">
CRI Digital Manufacturing IIoT is built to deliver
<strong>end-to-end traceability, real-time insights, and operational transparency</strong>
across plants, lines, and production processes.
</p>
<p class="text-lg text-gray-700">
The platform ensures <strong>right quality and on-time delivery</strong> by enabling
complete tracking of materials, production orders, and finished goods—helping teams
make faster, data-driven decisions with confidence.
</p>
</div>
<!-- KEY PILLARS -->
<div class="grid grid-cols-1 md:grid-cols-4 gap-6 mb-10">
<div class="bg-white rounded-xl border p-6 shadow-sm">
<h3 class="text-lg font-semibold mb-2">🔍 Traceability</h3>
<p class="text-gray-600">
Track materials, batches, and serials from input to dispatch.
</p>
</div>
<div class="bg-white rounded-xl border p-6 shadow-sm">
<h3 class="text-lg font-semibold mb-2"> Quality Assurance</h3>
<p class="text-gray-600">
Validate process data and ensure first-time-right production.
</p>
</div>
<div class="bg-white rounded-xl border p-6 shadow-sm">
<h3 class="text-lg font-semibold mb-2"> On-Time Delivery</h3>
<p class="text-gray-600">
Identify delays early and meet production commitments.
</p>
</div>
<div class="bg-white rounded-xl border p-6 shadow-sm">
<h3 class="text-lg font-semibold mb-2">📊 Real-Time Insights</h3>
<p class="text-gray-600">
Monitor performance and take quick corrective actions.
</p>
</div>
</div>
<!-- SUPPORT -->
<div class="bg-white rounded-xl border p-6 shadow-sm">
<h2 class="text-2xl font-semibold mb-3">24×7 Support</h2>
<p class="text-gray-700 mb-2">
Our dedicated IIoT support team is available round-the-clock to ensure
uninterrupted operations and quick issue resolution.
</p>
<p class="text-lg font-medium text-gray-900">
📞 Support Landline: <span class="font-semibold">0422 711 7179</span>
</p>
{{-- <p class="text-lg font-medium text-gray-900">
📞 Technical Support Contact: <span class="font-semibold">9952468104 / 9100832269</span>
</p> --}}
</div>
{{-- <div class="bg-white rounded-xl border p-6 shadow-sm">
<h2 class="text-2xl font-semibold mb-4">24×7 Support</h2>
<p class="text-lg text-gray-700 mb-4">
Our support structure is designed to ensure quick resolution based on the type
of issue whether it is on-site, application-related, or infrastructure-related.
</p>
<div class="space-y-3">
<p class="text-lg font-medium text-gray-900">
🏭 <strong>Plant & On-Site Support</strong> <br>
<span class="text-gray-700">
For plant visits, industry-level issues, and on-ground validation
</span><br>
📞 <span class="font-semibold">8925899458 / 8925899459</span>
</p>
<p class="text-lg font-medium text-gray-900">
💻 <strong>Application & Logic Support</strong> <br>
<span class="text-gray-700">
For website errors, logic issues, and application-level problems
</span><br>
📞 <span class="font-semibold">9952468104 / 9100832269</span>
</p>
</div>
</div> --}}
<!-- TEAM -->
{{-- <div class="bg-white rounded-xl border p-6 shadow-sm">
<h2 class="text-2xl font-semibold mb-4">IIOT Team Members</h2>
<div class="grid grid-cols-2 md:grid-cols-3 gap-4 text-gray-700">
<div class="flex items-center gap-2">👤 Jothikumar</div>
<div class="flex items-center gap-2">👤 Jeithef Shibu</div>
<div class="flex items-center gap-2">👤 Dhanabalan</div>
<div class="flex items-center gap-2">👤 Ranjith</div>
<div class="flex items-center gap-2">👤 Srimathy</div>
<div class="flex items-center gap-2">👤 Gokul</div>
</div>
</div> --}}
</x-filament-panels::page>

View File

@@ -64,7 +64,7 @@
@endif
{{-- Modal for serial invoice--}}
@if ($hasSearched)
{{-- @if ($hasSearched)
<div class="overflow-x-auto overflow-y-visible" style="height: 385px;">
<table class="min-w-[1500px] text-sm text-center border border-gray-300">
<table class="table-fixed min-w-[1500px] text-sm text-center border border-gray-300">
@@ -81,6 +81,7 @@
<th class="border px-4 py-2">Scanned Status</th>
<th class="border px-4 py-2 w-[300px] whitespace-nowrap">Time Stamp</th>
<th class="border px-4 py-2">Operator ID</th>
<th class="border px-4 py-2">Panel Box Code</th>
<th class="border px-4 py-2">Panel Box Supplier</th>
<th class="border px-4 py-2">Panel Box Serial Number</th>
</tr>
@@ -98,6 +99,7 @@
<td class="border px-4 py-2">{{ $row['scanned_status'] ?? '' }}</td>
<td class="border px-4 py-2">{{ $row['created_at'] ?? '' }}</td>
<td class="border px-4 py-2">{{ $row['operator_id'] ?? '' }}</td>
<td class="border px-4 py-2">{{ $row['panel_box_code'] ?? '' }}</td>
<td class="border px-4 py-2">{{ $row['panel_box_supplier'] ?? '' }}</td>
<td class="border px-4 py-2">{{ $row['panel_box_serial_number'] ?? '' }}</td>
</tr>
@@ -111,14 +113,14 @@
</tbody>
</table>
</div>
@endif
@endif --}}
{{-- @if ($hasSearched)
@if ($hasSearched)
<div class="overflow-x-auto" style="height: 385px;">
<table class="min-w-full text-sm text-center border border-gray-300">
<thead class="bg-gray-100 font-bold sticky top-0 z-10">
<table class="table-fixed min-w-[1500px] text-sm text-center border border-gray-300">
<thead class="bg-gray-100 font-bold">
<tr>
<th class="border px-4 py-2">No</th>
<th class="border px-4 py-2">Material Code</th>
@@ -130,6 +132,7 @@
<th class="border px-4 py-2">Scanned Status</th>
<th class="border px-4 py-2 w-[300px] whitespace-nowrap">Time Stamp</th>
<th class="border px-4 py-2">Operator ID</th>
<th class="border px-4 py-2">Panel Box Code</th>
<th class="border px-4 py-2">Panel Box Supplier</th>
<th class="border px-4 py-2">Panel Box Serial Number</th>
</tr>
@@ -148,6 +151,7 @@
<td class="border px-2 py-2">{{ $record->scanned_status ?? '' }}</td>
<td class="border px-2 py-2 whitespace-nowrap">{{ optional($record->created_at)->format('d-m-Y H:i:s') }}</td>
<td class="border px-2 py-2">{{ $record->operator_id ?? '' }}</td>
<td class="border px-2 py-2">{{ $record->panel_box_code ?? '' }}</td>
<td class="border px-2 py-2">{{ $record->panel_box_supplier ?? '' }}</td>
<td class="border px-2 py-2">{{ $record->panel_box_serial_number ?? '' }}</td>
</tr>
@@ -164,7 +168,7 @@
{{ $records->onEachSide(3)->links() }}
</div>
</div>
@endif --}}
@endif
{{-- Modal for Capacitor Input --}}
<div>
@@ -201,6 +205,16 @@
<script>
document.getElementById('capacitorInput').focus();
</script>
{{-- <script>
document.addEventListener('livewire:initialized', () => {
@this.on('focus-capacitor-input', () => {
setTimeout(() => {
const el = document.getElementById('capacitorInput');
if (el) el.focus();
}, 100);
});
});
</script> --}}
@endif
</div>

View File

@@ -24,6 +24,7 @@ use App\Http\Controllers\ModuleProductionLineStopController;
use App\Http\Controllers\ModuleProductionOrderDataController;
use App\Http\Controllers\ObdController;
use App\Http\Controllers\PalletController;
// use App\Http\Controllers\PalletPrintController;
use App\Http\Controllers\PdfController;
use App\Http\Controllers\PlantController;
use App\Http\Controllers\ProductionStickerReprintController;
@@ -75,7 +76,7 @@ Route::get('/download-qr-pdf/{palletNo}', [PalletController::class, 'downloadQrP
Route::get('/download-reprint-qr-pdf/{palletNo}', [PalletController::class, 'downloadReprintQrPdf'])->name('download-reprint-qr-pdf');
// Route::get('/download-reprint-process-pdf/{plant}/{item}/{process_order}/{coil_number}/{name}', [PalletController::class, 'downloadReprintProcess'])->name('download-reprint-process-pdf');
Route::get('/download-reprint-process-pdf/{plant}/{item}/{process_order}/{coil_number}/{name}', [PalletController::class, 'downloadReprintProcess'])->name('download-reprint-process-pdf');
// Route::get('/download-qr1-pdf/{palletNo}', [ProductionStickerReprintController::class, 'downloadQrPdf'])->where('palletNo', '.*')->name('download-qr1-pdf');
Route::get('/download-qr1-pdf', [ProductionStickerReprintController::class, 'downloadQrPdf'])
@@ -204,12 +205,12 @@ Route::post('grmaster-sno-update', [PdfController::class, 'updateGR']);
Route::post('file/store', [SapFileController::class, 'store'])->name('file.store');
// routes/api.php
// Route::post('/characteristic/hold-save', [CharacteristicApprovalController::class, 'holdSave']);
// Route::post('send-telegram', [TelegramController::class, 'sendMessage']);
// Route::post('invoice-exit', [InvoiceValidationController::class, 'handle']);
// Route::post('/characteristic/hold-save', [CharacteristicApprovalController::class, 'holdSave'])
// ->name('characteristic.hold.save');
// Route::get('/print-pallet/{pallet}/{plant}', [PalletPrintController::class, 'print'])
// ->name('print.pallet');

View File

@@ -3,8 +3,6 @@
use Illuminate\Foundation\Inspiring;
use Illuminate\Support\Facades\Artisan;
Artisan::command('inspire', function () {
$this->comment(Inspiring::quote());
})->purpose('Display an inspiring quote');
@@ -13,6 +11,11 @@ Artisan::command('auto:scheduler', function () {
$this->call('custom:scheduler');
})->everyMinute()->withoutOverlapping();
Schedule::command('model:prune --pretend')// , ['--model' => WeightValidation::class]
->description('Deletable Old Records From Database')
->dailyAt('07:00')
->emailOutputTo('digitalmanufacturingiiot@gmail.com');
// app()->booted(function () {
// $schedule = app(Schedule::class);

View File

@@ -1,7 +1,7 @@
<?php
use App\Http\Controllers\CharacteristicApprovalController;
use App\Http\Controllers\FileUploadController;
// use App\Http\Controllers\FileUploadController;
use App\Models\EquipmentMaster;
use App\Models\User;
use Filament\Facades\Filament;
@@ -41,11 +41,22 @@ Route::get('/approval/reject-success', function () {
return view('approval.reject-success');
})->name('approval.reject.success');
Route::get('/characteristic/approve', [CharacteristicApprovalController::class, 'approve'])
Route::get('/characteristic/approve', [CharacteristicApprovalController::class, 'approveForm'])
->name('characteristic.approve')
->middleware('signed');
Route::post('/file-upload', [FileUploadController::class, 'upload'])->name('file.upload');
Route::post('/characteristic/approve-save', [CharacteristicApprovalController::class, 'approveSave'])
->name('characteristic.approve.save');
Route::get('/approval/approve-success', function () {
return view('approval.approve-success');
})->name('approval.approve.success');
// Route::get('/characteristic/approve', [CharacteristicApprovalController::class, 'approve'])
// ->name('characteristic.approve')
// ->middleware('signed');
// Route::post('/file-upload', [FileUploadController::class, 'upload'])->name('file.upload');
// Route::get('/characteristic/hold', [CharacteristicApprovalController::class, 'hold'])
// ->name('characteristic.hold')