Compare commits
72 Commits
8c90d1fc03
...
ranjith-de
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
702dd69c94 | ||
|
|
ce65c68125 | ||
|
|
92f3352f6b | ||
|
|
a14cf0aef6 | ||
|
|
bdd8e9dfc3 | ||
|
|
951a69b85e | ||
|
|
dc6fd87c7b | ||
|
|
f464facd56 | ||
|
|
21d009ee1c | ||
|
|
8e7030b80b | ||
|
|
1931412511 | ||
|
|
0fef7b27bf | ||
|
|
115fe43428 | ||
|
|
5eb067899b | ||
|
|
8a2dac9982 | ||
|
|
79f09236ab | ||
|
|
0947408462 | ||
|
|
538f0961b4 | ||
|
|
5fccde0160 | ||
|
|
52de3aa0cc | ||
|
|
02c9059cf3 | ||
|
|
dec4900659 | ||
|
|
3550d8248e | ||
|
|
be5aee3df6 | ||
|
|
ece0a9e226 | ||
|
|
c12697a1af | ||
|
|
c0929b4153 | ||
|
|
349d04b7f9 | ||
|
|
341f4f20b4 | ||
|
|
88e1e54cf7 | ||
|
|
c0e4b77eda | ||
|
|
54bcf4cf28 | ||
|
|
2fbbbe579b | ||
|
|
1b1a02a565 | ||
|
|
c4153169eb | ||
|
|
d71eef3833 | ||
|
|
738f81043d | ||
|
|
9a9051b884 | ||
|
|
547ee4b78f | ||
|
|
4fe23afe13 | ||
|
|
19817b4cfa | ||
|
|
0e301e12e1 | ||
|
|
17545040fe | ||
|
|
ae4e7d0239 | ||
|
|
7deb78f574 | ||
|
|
0ce614ab53 | ||
|
|
1106e40a51 | ||
|
|
7c777076d7 | ||
|
|
8b9cc874b5 | ||
|
|
ca3ecb20af | ||
|
|
86ddb3cb82 | ||
|
|
c67c92c8f5 | ||
|
|
528c04f1e7 | ||
|
|
2b476e467c | ||
|
|
c0f6d7b500 | ||
|
|
7cc4cd45ff | ||
|
|
83527e49f6 | ||
|
|
ebaa2b11cf | ||
|
|
21827fd30f | ||
|
|
b1cdab2900 | ||
|
|
2d3fda57b7 | ||
|
|
896e2f5fb2 | ||
|
|
ee9d8247b2 | ||
|
|
d33b1c7ccb | ||
|
|
eb343f1d0c | ||
|
|
d74e1d73c9 | ||
|
|
3531bfe250 | ||
|
|
c738195cd4 | ||
|
|
b17f675f73 | ||
|
|
0d1aff8871 | ||
|
|
08a3b9f69d | ||
|
|
dee82279c0 |
@@ -39,7 +39,7 @@ class Scheduler extends Command
|
||||
public function handle()
|
||||
{
|
||||
|
||||
// $this->call('approval:trigger-mails');
|
||||
$this->call('approval:trigger-mails');
|
||||
|
||||
// --- Production Rules ---
|
||||
$productionRules = AlertMailRule::where('module', 'ProductionQuantities')
|
||||
@@ -112,6 +112,7 @@ class Scheduler extends Command
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// foreach ($invoiceRules as $rule) {
|
||||
|
||||
// switch ($rule->schedule_type) {
|
||||
@@ -210,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,
|
||||
|
||||
@@ -48,12 +48,12 @@ class SendInvoiceTransitReport extends Command
|
||||
|
||||
if ($plants->isEmpty()) {
|
||||
$this->error('No valid plant(s) found.');
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (strtolower($scheduleType) == 'daily')
|
||||
{
|
||||
$results = DB::table('invoice_in_transits as it')
|
||||
if (strtolower($scheduleType) == 'daily') {
|
||||
$results = DB::table('invoice_in_transits as it')
|
||||
->join('invoice_masters as im', function ($join) {
|
||||
$join->on('im.receiving_plant_name', '=', 'it.receiving_plant_name')->on('im.transport_name', '=', 'it.transport_name');
|
||||
})
|
||||
@@ -84,17 +84,18 @@ class SendInvoiceTransitReport extends Command
|
||||
')
|
||||
|
||||
)
|
||||
->when($plantId != 0, fn($q) => $q->where('it.plant_id', $plantId))
|
||||
->when($plantId != 0, fn ($q) => $q->where('it.plant_id', $plantId))
|
||||
->whereNotNull('it.lr_bl_aw_date')
|
||||
->whereRaw('
|
||||
(CURRENT_DATE - CAST(it.lr_bl_aw_date AS DATE))
|
||||
- CAST(im.transit_days AS INTEGER) > 0
|
||||
')
|
||||
->distinct('it.invoice_number')
|
||||
->get();
|
||||
|
||||
|
||||
if ($results->isEmpty()) {
|
||||
$this->info('No invoice transit records found for today.');
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -103,24 +104,25 @@ class SendInvoiceTransitReport extends Command
|
||||
foreach ($mailRules as $rule) {
|
||||
|
||||
$ruleInvoices = $results->where('invoice_master_id', $rule->invoice_master_id);
|
||||
//$ruleInvoices = $results->filter(fn($item) => $item->invoice_master_id == (int)$rule->invoice_master_id);
|
||||
|
||||
// $ruleInvoices = $results->filter(fn($item) => $item->invoice_master_id == (int)$rule->invoice_master_id);
|
||||
|
||||
if ($ruleInvoices->isEmpty()) {
|
||||
$this->info("Skipping rule {$rule->id} — no invoice transit data.");
|
||||
continue; // ❌ DO NOT SEND MAIL
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
$invoiceMaster = InvoiceMaster::find($rule->invoice_master_id);
|
||||
|
||||
$mailSubject = $invoiceMaster
|
||||
? "Despatch Invoice In Transit ({$invoiceMaster->receiving_plant_name} - {$invoiceMaster->transport_name})"
|
||||
: "Despatch Invoice In Transit";
|
||||
: 'Despatch Invoice In Transit';
|
||||
|
||||
if ($ruleInvoices->isEmpty()) {
|
||||
$tableData = [];
|
||||
$this->info("No despatch invoices in transit found for rule {$rule->id}.");
|
||||
} else {
|
||||
|
||||
$tableData = $ruleInvoices->values()->map(function ($item, $index) use ($plantCodes) {
|
||||
return [
|
||||
'no' => $index + 1,
|
||||
@@ -132,9 +134,10 @@ class SendInvoiceTransitReport extends Command
|
||||
'lr_bl_aw_date' => $item->lr_bl_aw_date,
|
||||
'lr_bl_aw_number' => $item->lr_bl_aw_number,
|
||||
'transit_days' => $item->transit_days,
|
||||
'status' => $item->delayed_days . ' Days',
|
||||
'status' => $item->delayed_days.' Days',
|
||||
];
|
||||
})->toArray();
|
||||
|
||||
}
|
||||
|
||||
$mail = new InvoiceTransitMail($scheduleType, $tableData, $mailSubject);
|
||||
@@ -155,13 +158,14 @@ class SendInvoiceTransitReport extends Command
|
||||
|
||||
if (empty($toEmails)) {
|
||||
$this->warn("Skipping rule {$rule->id} — no To emails.");
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
\Mail::to($toEmails)->cc($ccEmails)->send($mail);
|
||||
|
||||
$this->info(
|
||||
"Mail sent → Rule {$rule->id} | Invoice Master ID: {$rule->invoice_master_id} | To: " . implode(', ', $toEmails)
|
||||
"Mail sent → Rule {$rule->id} | Invoice Master ID: {$rule->invoice_master_id} | To: ".implode(', ', $toEmails)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
231
app/Exports/MotorFreeRunExport.php
Normal file
231
app/Exports/MotorFreeRunExport.php
Normal file
@@ -0,0 +1,231 @@
|
||||
<?php
|
||||
|
||||
namespace App\Exports;
|
||||
|
||||
use Illuminate\Support\Facades\View as FacadesView;
|
||||
use Illuminate\View\View as ViewView;
|
||||
use Maatwebsite\Excel\Concerns\FromCollection;
|
||||
use Maatwebsite\Excel\Concerns\FromView;
|
||||
use Illuminate\Contracts\View\View;
|
||||
use Maatwebsite\Excel\Concerns\FromArray;
|
||||
use Maatwebsite\Excel\Concerns\WithChunkReading;
|
||||
use Maatwebsite\Excel\Concerns\WithHeadings;
|
||||
use Maatwebsite\Excel\Concerns\WithEvents;
|
||||
use Maatwebsite\Excel\Events\AfterSheet;
|
||||
use Illuminate\Support\Collection;
|
||||
use Maatwebsite\Excel\Concerns\FromQuery;
|
||||
use Maatwebsite\Excel\Concerns\WithCustomStartCell;
|
||||
// use Maatwebsite\Excel\Concerns\FromCollection;
|
||||
use Maatwebsite\Excel\Concerns\WithMapping;
|
||||
use Maatwebsite\Excel\Concerns\WithStartRow;
|
||||
use Maatwebsite\Excel\Excel;
|
||||
|
||||
|
||||
use Maatwebsite\Excel\Events\BeforeExport;
|
||||
|
||||
use PhpOffice\PhpSpreadsheet\IOFactory;
|
||||
|
||||
// {
|
||||
// public function __construct(
|
||||
// public $records,
|
||||
// ) {}
|
||||
|
||||
// // public function view(): View
|
||||
// // {
|
||||
// // return view('exports.export-isi-pdf', [
|
||||
// // 'records' => $this->records,
|
||||
// // ]);
|
||||
// // }
|
||||
|
||||
// public function collection()
|
||||
// {
|
||||
// return $this->records;
|
||||
// }
|
||||
|
||||
// public function headings(): array
|
||||
// {
|
||||
// // Top two rows (Company info + Motor KW/HP)
|
||||
// return [
|
||||
// ['C.R.I. Pumps Private Limited', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'Unit: MOTOR FREE RUN TEST REGISTER'],
|
||||
// ['Motor KW/HP : - / -', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'Phase : -'],
|
||||
// // Column headers
|
||||
// [
|
||||
// 'Date', 'Motor SNo', 'Item Code', 'Motor Type',
|
||||
// 'Voltage', 'Current', 'Power', 'IR.Hot', 'IR.Cool', 'Frequency', 'Speed', 'Leakage Current', // AFTER FREE RUN
|
||||
// 'Voltage', 'Current', 'Power', // LOCKED ROTOR TEST
|
||||
// 'No Load Pickup Voltage', 'Room Temp.', 'High Voltage Test', 'Result', 'Remark'
|
||||
// ]
|
||||
// ];
|
||||
// }
|
||||
|
||||
// public function registerEvents(): array
|
||||
// {
|
||||
// return [
|
||||
// AfterSheet::class => function (AfterSheet $event) {
|
||||
// $sheet = $event->sheet->getDelegate();
|
||||
|
||||
// // Merge top rows for company info
|
||||
// $sheet->mergeCells('A1:S1'); // Company Name
|
||||
// $sheet->mergeCells('T1:T1'); // Unit/Register info
|
||||
// $sheet->mergeCells('A2:S2'); // Motor KW/HP row
|
||||
// $sheet->mergeCells('T2:T2'); // Phase
|
||||
|
||||
// // Merge headers for grouped columns (AFTER FREE RUN & LOCKED ROTOR TEST)
|
||||
// $sheet->mergeCells('E3:L3'); // AFTER FREE RUN
|
||||
// $sheet->mergeCells('M3:O3'); // LOCKED ROTOR TEST
|
||||
|
||||
// // Optional: style headers
|
||||
// $sheet->getStyle('A1:T3')->getFont()->setBold(true);
|
||||
// $sheet->getStyle('A1:T3')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
|
||||
// $sheet->getStyle('A1:T3')->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
|
||||
|
||||
// // Set column widths (optional for better visibility)
|
||||
// $columns = range('A', 'T');
|
||||
// foreach ($columns as $col) {
|
||||
// $sheet->getColumnDimension($col)->setAutoSize(true);
|
||||
// }
|
||||
// },
|
||||
// ];
|
||||
// }
|
||||
|
||||
|
||||
// }
|
||||
|
||||
// class MotorFreeRunExport implements FromCollection, WithMapping, WithStartRow
|
||||
// {
|
||||
// protected Collection $records;
|
||||
|
||||
// public function __construct(Collection $records)
|
||||
// {
|
||||
// $this->records = $records;
|
||||
// }
|
||||
|
||||
// public function collection()
|
||||
// {
|
||||
// return $this->records;
|
||||
// }
|
||||
|
||||
// public function startRow(): int
|
||||
// {
|
||||
// return 3; // insert data starting from row 3
|
||||
// }
|
||||
|
||||
// public function map($record): array
|
||||
// {
|
||||
// return [
|
||||
// $record['Date'] ?? '',
|
||||
// $record['Output'] ?? '',
|
||||
// $record['Motor SNo'] ?? '',
|
||||
// $record['Item Code'] ?? '',
|
||||
// $record['Motor Type'] ?? '',
|
||||
// $record['kw'] ?? '',
|
||||
// $record['hp'] ?? '',
|
||||
// $record['phase'] ?? '',
|
||||
// $record['isi_model'] ?? '',
|
||||
// $record['Voltage_Before'] ?? '',
|
||||
// $record['Current_Before'] ?? '',
|
||||
// $record['Power_Before'] ?? '',
|
||||
// $record['Resistance_RY'] ?? '',
|
||||
// $record['Resistance_YB'] ?? '',
|
||||
// $record['Resistance_BR'] ?? '',
|
||||
// $record['Insulation_Resistance'] ?? '',
|
||||
// $record['Frequency_Before'] ?? '',
|
||||
// $record['Speed_Before'] ?? '',
|
||||
// $record['Voltage_After'] ?? '',
|
||||
// $record['Current_After'] ?? '',
|
||||
// $record['Power_After'] ?? '',
|
||||
// $record['IR_Hot'] ?? '',
|
||||
// $record['IR_Cool'] ?? '',
|
||||
// $record['Leakage_Current'] ?? '',
|
||||
// $record['Frequency_After'] ?? '',
|
||||
// $record['Speed_After'] ?? '',
|
||||
// $record['Voltage_Locked'] ?? '',
|
||||
// $record['Current_Locked'] ?? '',
|
||||
// $record['Power_Locked'] ?? '',
|
||||
// $record['No_Load_Pickup_Voltage'] ?? '',
|
||||
// $record['Room_Temp'] ?? '',
|
||||
// $record['High_Voltage_Test'] ?? '',
|
||||
// $record['Batch_Number'] ?? '',
|
||||
// $record['Batch_Count'] ?? '',
|
||||
// $record['Result'] ?? '',
|
||||
// $record['Remark'] ?? '',
|
||||
// $record['Tested_By'] ?? '',
|
||||
// ];
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
class MotorFreeRunExport implements WithCustomStartCell, WithMapping, WithStartRow, WithChunkReading
|
||||
{
|
||||
protected $records;
|
||||
protected $templatePath;
|
||||
|
||||
public function __construct($records)
|
||||
{
|
||||
$this->records = $records;
|
||||
// dd($this->records);
|
||||
}
|
||||
|
||||
public function collection()
|
||||
{
|
||||
return $this->records;
|
||||
}
|
||||
|
||||
public function startRow(): int
|
||||
{
|
||||
return 7; // Start inserting data from row 7
|
||||
}
|
||||
|
||||
public function startCell(): string
|
||||
{
|
||||
return 'A7'; // Start inserting data from row 7 column A
|
||||
}
|
||||
|
||||
public function map($record): array
|
||||
{
|
||||
return [
|
||||
$record['Date'] ?? '',
|
||||
$record['Output'] ?? '',
|
||||
$record['Motor SNo'] ?? '',
|
||||
$record['Item Code'] ?? '',
|
||||
$record['Motor Type'] ?? '',
|
||||
$record['kw'] ?? '',
|
||||
$record['hp'] ?? '',
|
||||
$record['phase'] ?? '',
|
||||
$record['isi_model'] ?? '',
|
||||
$record['Voltage_Before'] ?? '',
|
||||
$record['Current_Before'] ?? '',
|
||||
$record['Power_Before'] ?? '',
|
||||
$record['Resistance_RY'] ?? '',
|
||||
$record['Resistance_YB'] ?? '',
|
||||
$record['Resistance_BR'] ?? '',
|
||||
$record['Insulation_Resistance'] ?? '',
|
||||
$record['Frequency_Before'] ?? '',
|
||||
$record['Speed_Before'] ?? '',
|
||||
$record['Voltage_After'] ?? '',
|
||||
$record['Current_After'] ?? '',
|
||||
$record['Power_After'] ?? '',
|
||||
$record['IR_Hot'] ?? '',
|
||||
$record['IR_Cool'] ?? '',
|
||||
$record['Leakage_Current'] ?? '',
|
||||
$record['Frequency_After'] ?? '',
|
||||
$record['Speed_After'] ?? '',
|
||||
$record['Voltage_Locked'] ?? '',
|
||||
$record['Current_Locked'] ?? '',
|
||||
$record['Power_Locked'] ?? '',
|
||||
$record['No_Load_Pickup_Voltage'] ?? '',
|
||||
$record['Room_Temp'] ?? '',
|
||||
$record['High_Voltage_Test'] ?? '',
|
||||
$record['Batch_Number'] ?? '',
|
||||
$record['Batch_Count'] ?? '',
|
||||
$record['Result'] ?? '',
|
||||
$record['Remark'] ?? '',
|
||||
$record['Tested_By'] ?? '',
|
||||
];
|
||||
}
|
||||
|
||||
public function chunkSize(): int
|
||||
{
|
||||
return 1000; // load 1000 records at a time
|
||||
}
|
||||
}
|
||||
159
app/Exports/TestingPanelReadingExport.php
Normal file
159
app/Exports/TestingPanelReadingExport.php
Normal file
@@ -0,0 +1,159 @@
|
||||
<?php
|
||||
|
||||
namespace App\Exports;
|
||||
|
||||
use App\Models\TestingPanelReading;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Maatwebsite\Excel\Concerns\FromCollection;
|
||||
use Maatwebsite\Excel\Concerns\FromQuery;
|
||||
use Maatwebsite\Excel\Concerns\WithChunkReading;
|
||||
// use Maatwebsite\Excel\Concerns\ShouldQueue;
|
||||
use Maatwebsite\Excel\Concerns\WithHeadings;
|
||||
|
||||
// class TestingPanelReadingExport implements FromCollection
|
||||
// {
|
||||
// /**
|
||||
// * @return \Illuminate\Support\Collection
|
||||
// */
|
||||
// public function collection()
|
||||
// {
|
||||
// return TestingPanelReading::all();
|
||||
// }
|
||||
// }
|
||||
|
||||
// class TestingPanelReadingExport implements FromQuery, WithChunkReading, ShouldQueue, WithHeadings
|
||||
// {
|
||||
// protected array $ids;
|
||||
// protected int $counter = 0;
|
||||
|
||||
// public function __construct(array $ids)
|
||||
// {
|
||||
// $this->ids = $ids;
|
||||
// }
|
||||
// public function query()
|
||||
// {
|
||||
// return TestingPanelReading::query()
|
||||
// ->whereIn('id', $this->ids)
|
||||
// ->select('id', 'plant_id', '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', 'update_count', 'output_flag', 'tested_by', 'updated_by', 'created_at', 'updated_at', 'scanned_at', 'created_at');
|
||||
// }
|
||||
|
||||
// public function chunkSize(): int
|
||||
// {
|
||||
// return 1000; // process 1000 rows at a time
|
||||
// }
|
||||
|
||||
// public function headings(): array
|
||||
// {
|
||||
// return ['NO', 'PLANT', 'LINE', 'MOTORTESTINGMASTER', 'MACHINE', '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', 'UPDATE COUNT', 'OUTPUT FLAG', 'TETSED BY', 'UPDATED BY', 'CREATED AT', 'UPDATED AT', 'SCANNED AT', 'CREATED AT'];
|
||||
// }
|
||||
|
||||
// public function map($record): array
|
||||
// {
|
||||
// $this->counter++;
|
||||
// return [
|
||||
// $this->counter, // No.
|
||||
// $record->plant_id,
|
||||
// $record->line_id,
|
||||
// $record->motor_testing_master_id,
|
||||
// $record->machine_id,
|
||||
// $record->output,
|
||||
// $record->serial_number,
|
||||
// $record->winded_serial_number,
|
||||
// $record->before_fr_volt,
|
||||
// $record->before_fr_cur,
|
||||
// $record->before_fr_pow,
|
||||
// $record->before_fr_res_ry,
|
||||
// $record->before_fr_res_yb,
|
||||
// $record->before_fr_res_br,
|
||||
// $record->before_fr_ir,
|
||||
// $record->before_fr_ir_r,
|
||||
// $record->before_fr_ir_y,
|
||||
// $record->before_fr_ir_b,
|
||||
// $record->before_fr_freq,
|
||||
// $record->before_fr_speed,
|
||||
// $record->after_fr_vol,
|
||||
// $record->after_fr_cur,
|
||||
// $record->after_fr_pow,
|
||||
// $record->after_fr_ir_hot,
|
||||
// $record->after_fr_ir_hot_r,
|
||||
// $record->after_fr_ir_hot_y,
|
||||
// $record->after_fr_ir_hot_b,
|
||||
// $record->after_fr_ir_cool,
|
||||
// $record->after_fr_ir_cool_r,
|
||||
// $record->after_fr_ir_cool_y,
|
||||
// $record->after_fr_ir_cool_b,
|
||||
// $record->after_fr_freq,
|
||||
// $record->after_fr_speed,
|
||||
// $record->after_fr_leak_cur,
|
||||
// $record->locked_rt_volt,
|
||||
// $record->locked_rt_cur,
|
||||
// $record->locked_rt_pow,
|
||||
// $record->no_load_pickup_volt,
|
||||
// $record->room_temperature,
|
||||
// $record->hv_test,
|
||||
// $record->batch_number,
|
||||
// $record->batch_count,
|
||||
// $record->result,
|
||||
// $record->remark,
|
||||
// $record->rework_count,
|
||||
// $record->update_count,
|
||||
// $record->output_flag,
|
||||
// $record->tested_by,
|
||||
// $record->updated_by,
|
||||
// // $record->created_at,
|
||||
// $record->updated_at,
|
||||
// $record->scanned_at,
|
||||
// $record->created_at,
|
||||
// ];
|
||||
// }
|
||||
// }
|
||||
|
||||
class TestingPanelReadingExport implements FromCollection, WithHeadings
|
||||
{
|
||||
protected $records;
|
||||
protected $isAllStarDelta;
|
||||
|
||||
public function __construct($records, $isAllStarDelta)
|
||||
{
|
||||
$this->records = $records;
|
||||
$this->isAllStarDelta = $isAllStarDelta;
|
||||
}
|
||||
|
||||
public function collection()
|
||||
{
|
||||
return collect($this->records)->map(function ($record) {
|
||||
if (!$this->isAllStarDelta) {
|
||||
return [
|
||||
'Date' => date('Y-m-d', strtotime($record['created_at'] ?? '')),
|
||||
'Output' => $record['output'] ?? '',
|
||||
'Motor SNo' => $record['serial_number'] ?? '',
|
||||
'Item Code' => $record->motorTestingMaster->item->code ?? '',
|
||||
'Motor Type' => $record->motorTestingMaster->item->description ?? '',
|
||||
'IR_Hot' => $record['after_fr_ir_hot'] ?? '',
|
||||
'IR_Cool' => $record['after_fr_ir_cool'] ?? '',
|
||||
'Leakage_Current' => $record['after_fr_leak_cur'] ?? '',
|
||||
];
|
||||
} else {
|
||||
return [
|
||||
'Date' => date('Y-m-d', strtotime($record['created_at'] ?? '')),
|
||||
'Output' => $record['output'] ?? '',
|
||||
'Motor SNo' => $record['serial_number'] ?? '',
|
||||
'Item Code' => $record->motorTestingMaster->item->code ?? '',
|
||||
'Motor Type' => $record->motorTestingMaster->item->description ?? '',
|
||||
'IR_Hot_R' => $record['after_fr_ir_hot_r'] ?? '',
|
||||
'IR_Hot_Y' => $record['after_fr_ir_hot_y'] ?? '',
|
||||
'IR_Hot_B' => $record['after_fr_ir_hot_b'] ?? '',
|
||||
'IR_Cool_R' => $record['after_fr_ir_cool_r'] ?? '',
|
||||
'IR_Cool_Y' => $record['after_fr_ir_cool_y'] ?? '',
|
||||
'IR_Cool_B' => $record['after_fr_ir_cool_b'] ?? '',
|
||||
'Leakage_Current' => $record['after_fr_leak_cur'] ?? '',
|
||||
];
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public function headings(): array
|
||||
{
|
||||
return array_keys($this->collection()->first() ?? []);
|
||||
}
|
||||
}
|
||||
@@ -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')
|
||||
|
||||
@@ -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'),
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -357,18 +357,6 @@ class InvoicePendingReason extends Page
|
||||
]);
|
||||
return;
|
||||
}
|
||||
// else if(!empty($import->remarkEmpty)) {
|
||||
|
||||
// Notification::make()
|
||||
// ->title('Import failed')
|
||||
// ->body("Remark can't be empty")
|
||||
// ->danger()
|
||||
// ->send();
|
||||
// $this->filtersForm->fill([
|
||||
// 'file' => null,
|
||||
// ]);
|
||||
// return;
|
||||
// }
|
||||
else if (! empty($import->duplicateExcelDocs)) {
|
||||
|
||||
$duplicates = collect($import->duplicateExcelDocs)
|
||||
|
||||
@@ -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 '';
|
||||
}
|
||||
|
||||
0
app/Filament/Pages/test.php
Normal file
0
app/Filament/Pages/test.php
Normal 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 () {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
@@ -2899,7 +2925,7 @@ class CreateInvoiceValidation extends CreateRecord
|
||||
if ($dupRecord) {
|
||||
Notification::make()
|
||||
->title('Duplicate: Material QR')
|
||||
->body("Scanned 'Material QR' already completed the scanning process.")
|
||||
->body("Scanned Material QR : '{$serialNumber}' already completed the scanning process..!")
|
||||
->danger()
|
||||
->seconds(2)
|
||||
->send();
|
||||
@@ -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()
|
||||
@@ -2998,19 +3030,19 @@ class CreateInvoiceValidation extends CreateRecord
|
||||
}
|
||||
} else {
|
||||
if (str_contains($serialNumber, '|')) {
|
||||
Notification::make()
|
||||
->title('Duplicate: Material QR')
|
||||
->body("Scanned Material QR : '{$serialNumber}' already completed the scanning process..!")
|
||||
->danger()
|
||||
->seconds(2)
|
||||
->send();
|
||||
|
||||
$itemCode = null;
|
||||
$this->currentItemCode = '';
|
||||
$batchNumber = null;
|
||||
$serNo = null;
|
||||
$serialNumber = null;
|
||||
|
||||
Notification::make()
|
||||
->title('Duplicate: Material QR')
|
||||
->body("Scanned 'Material QR' already completed the scanning process.")
|
||||
->danger()
|
||||
->seconds(2)
|
||||
->send();
|
||||
|
||||
$this->dispatch('playWarnSound');
|
||||
|
||||
$this->form->fill([
|
||||
@@ -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;
|
||||
@@ -3359,7 +3392,7 @@ class CreateInvoiceValidation extends CreateRecord
|
||||
} elseif ($hadMotorQr == $hasMotorQr) {
|
||||
Notification::make()
|
||||
->title('Duplicate: Motor QR')
|
||||
->body("Scanned 'Motor' serial number already completed the scanning process.")
|
||||
->body("Scanned Motor Serial Number : '{$serialNumber}' already completed the scanning process.")
|
||||
->danger()
|
||||
->seconds(3)
|
||||
->send();
|
||||
@@ -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;
|
||||
@@ -3476,7 +3510,7 @@ class CreateInvoiceValidation extends CreateRecord
|
||||
} elseif ($hadPumpQr == $hasPumpQr) {
|
||||
Notification::make()
|
||||
->title('Duplicate: Pump QR')
|
||||
->body("Scanned 'Pump' serial number already completed the scanning process.")
|
||||
->body("Scanned Pump Serial Number : '{$serialNumber}' already completed the scanning process.")
|
||||
->danger()
|
||||
->seconds(3)
|
||||
->send();
|
||||
@@ -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;
|
||||
@@ -3595,7 +3630,7 @@ class CreateInvoiceValidation extends CreateRecord
|
||||
} elseif ($hadCapacitorQr == '1' && $hasCapacitorQr) {
|
||||
Notification::make()
|
||||
->title('Duplicate: Capacitor QR')
|
||||
->body("Scanned 'Capacitor' serial number already completed the scanning process.")
|
||||
->body("Scanned Capacitor Serial Number : '{$serialNumber}' already completed the scanning process.")
|
||||
->danger()
|
||||
->seconds(3)
|
||||
->send();
|
||||
@@ -3657,7 +3692,7 @@ class CreateInvoiceValidation extends CreateRecord
|
||||
} elseif ($hadPumpSetQr == $hasPumpSetQr) {
|
||||
Notification::make()
|
||||
->title('Duplicate: Pump Set QR')
|
||||
->body("Scanned 'Pump Set' serial number already completed the scanning process.")
|
||||
->body("Scanned Pump Set Serial Number : '{$serialNumber}' already completed the scanning process.")
|
||||
->danger()
|
||||
->seconds(3)
|
||||
->send();
|
||||
@@ -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;
|
||||
|
||||
@@ -156,6 +156,9 @@ class LineResource extends Resource
|
||||
'Base FG Line' => 'Base FG Line',
|
||||
'SFG Line' => 'SFG Line',
|
||||
'FG Line' => 'FG Line',
|
||||
'Process Base FG Line' => 'Process Base FG Line',
|
||||
'Process SFG Line' => 'Process SFG Line',
|
||||
'Process FG Line' => 'Process FG Line',
|
||||
'Machining Cell' => 'Machining Cell',
|
||||
'Blanking Cell' => 'Blanking Cell',
|
||||
'Forming Cell' => 'Forming Cell',
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -15,6 +15,9 @@ use Storage;
|
||||
use Maatwebsite\Excel\Facades\Excel;
|
||||
use Livewire\Livewire;
|
||||
use Str;
|
||||
use Livewire\Attributes\On;
|
||||
use App\Services\SmbService;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
class CreateSerialValidation extends CreateRecord
|
||||
{
|
||||
@@ -61,10 +64,13 @@ class CreateSerialValidation extends CreateRecord
|
||||
return $this->getResource()::getUrl('create');
|
||||
}
|
||||
|
||||
|
||||
public function processInvoice($invoiceNumber)
|
||||
{
|
||||
$invoiceNumber = trim($invoiceNumber);
|
||||
|
||||
$fileName = $invoiceNumber . '.txt';
|
||||
|
||||
$this->showCapacitorInput = false;
|
||||
|
||||
$user = Filament::auth()->user();
|
||||
@@ -88,6 +94,187 @@ class CreateSerialValidation extends CreateRecord
|
||||
|
||||
//..GET SERIAL INVOICE API
|
||||
|
||||
$content = SmbService::readTextFile($fileName);
|
||||
|
||||
if ($content == '') {
|
||||
Notification::make()
|
||||
->title('File Not Found')
|
||||
->body("Unable to locate file: {$fileName}")
|
||||
->danger()
|
||||
->send();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$lines = preg_split("/\r\n|\n|\r/", trim($content));
|
||||
|
||||
$insertData = [];
|
||||
$missingItemCodes = [];
|
||||
$InvalidLenSno = [];
|
||||
$InvalidSno = [];
|
||||
$InvalidLenItem = [];
|
||||
$InvalidItem = [];
|
||||
|
||||
foreach ($lines as $line)
|
||||
{
|
||||
$line = trim($line);
|
||||
if ($line == '') {
|
||||
continue;
|
||||
}
|
||||
|
||||
$parts = array_map('trim', explode(',', $line));
|
||||
|
||||
if (count($parts) != 2) {
|
||||
Notification::make()
|
||||
->title("Invalid data found inside the file.")
|
||||
->danger()
|
||||
->seconds(1)
|
||||
->send();
|
||||
return;
|
||||
}
|
||||
|
||||
[$itemCode, $serialNumber] = $parts;
|
||||
|
||||
$sticker = StickerMaster::where('plant_id', $plantId)
|
||||
->whereHas('item', function ($query) use ($itemCode, $plantId) {
|
||||
$query->where('plant_id', $plantId)
|
||||
->where('code', $itemCode);
|
||||
})
|
||||
->first();
|
||||
|
||||
if (Str::length($itemCode) < 6)
|
||||
{
|
||||
$InvalidLenItem [] = $itemCode;
|
||||
continue;
|
||||
}
|
||||
else if(!is_numeric($itemCode)){
|
||||
$InvalidItem [] = $itemCode;
|
||||
continue;
|
||||
}
|
||||
if (Str::length($serialNumber) < 9)
|
||||
{
|
||||
$InvalidLenSno [] = $serialNumber;
|
||||
continue;
|
||||
}
|
||||
else if(!ctype_alnum($serialNumber)){
|
||||
$InvalidSno [] = $serialNumber;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!$sticker) {
|
||||
$missingItemCodes[] = $itemCode;
|
||||
continue;
|
||||
}
|
||||
|
||||
$insertData[] = [
|
||||
'plant_id' => $plantId,
|
||||
'sticker_master_id' => $sticker->id,
|
||||
'invoice_number' => $invoiceNumber,
|
||||
'serial_number' => $serialNumber,
|
||||
'created_at' => now(),
|
||||
'operator_id' => $operatorName,
|
||||
'updated_at' => now(),
|
||||
];
|
||||
}
|
||||
|
||||
if (!empty($InvalidLenItem))
|
||||
{
|
||||
$count = count($InvalidLenItem);
|
||||
|
||||
if ($count <= 10) {
|
||||
$body = 'Item Code should contain minimum 6 digits: ' . implode(', ', $InvalidLenItem);
|
||||
} else {
|
||||
$body = "{$count} item codes contain minimum 6 digits.";
|
||||
}
|
||||
Notification::make()
|
||||
->title("Invalid Item Code.")
|
||||
->body("$body")
|
||||
->danger()
|
||||
->seconds(1)
|
||||
->send();
|
||||
return;
|
||||
}
|
||||
else if (!empty($InvalidItem))
|
||||
{
|
||||
$count = count($InvalidItem);
|
||||
|
||||
if ($count <= 10) {
|
||||
$body = 'Item code must be in numeric values: ' . implode(', ', $InvalidSno);
|
||||
} else {
|
||||
$body = "{$count} item codes must be in numeric values.";
|
||||
}
|
||||
Notification::make()
|
||||
->title("Invalid Item Code.")
|
||||
->body("$body")
|
||||
->danger()
|
||||
->seconds(1)
|
||||
->send();
|
||||
return;
|
||||
}
|
||||
else if (!empty($InvalidLenSno))
|
||||
{
|
||||
$count = count($InvalidLenSno);
|
||||
|
||||
if ($count <= 10) {
|
||||
$body = 'Serial number should be minimum 9 digits: ' . implode(', ', $InvalidLenSno);
|
||||
} else {
|
||||
$body = "{$count} serial number should be minimum 9 digits.";
|
||||
}
|
||||
Notification::make()
|
||||
->title("Invalid Serial Number.")
|
||||
->body("$body")
|
||||
->danger()
|
||||
->seconds(1)
|
||||
->send();
|
||||
return;
|
||||
}
|
||||
else if (!empty($InvalidSno))
|
||||
{
|
||||
$count = count($InvalidSno);
|
||||
|
||||
if ($count <= 10) {
|
||||
$body = 'Serial number should be conatin alpha numeric values: ' . implode(', ', $InvalidSno);
|
||||
} else {
|
||||
$body = "{$count} serial number should be conatin alpha numeric values.";
|
||||
}
|
||||
Notification::make()
|
||||
->title("Invalid Serial Number.")
|
||||
->body("$body")
|
||||
->danger()
|
||||
->seconds(1)
|
||||
->send();
|
||||
return;
|
||||
}
|
||||
else if (!empty($missingItemCodes))
|
||||
{
|
||||
$count = count($missingItemCodes);
|
||||
|
||||
if ($count <= 10) {
|
||||
$body = 'Item codes not found in sticker master: ' . implode(', ', $missingItemCodes);
|
||||
} else {
|
||||
$body = "{$count} item codes not found in sticker master table.";
|
||||
}
|
||||
Notification::make()
|
||||
->title("Unknown Item Code.")
|
||||
->body("$body")
|
||||
->danger()
|
||||
->seconds(1)
|
||||
->send();
|
||||
return;
|
||||
}
|
||||
|
||||
if (!empty($insertData)) {
|
||||
SerialValidation::insert($insertData);
|
||||
}
|
||||
else{
|
||||
Notification::make()
|
||||
->title("Insert Failed.")
|
||||
->body("Data insertion failed")
|
||||
->danger()
|
||||
->seconds(1)
|
||||
->send();
|
||||
return;
|
||||
}
|
||||
|
||||
//..
|
||||
|
||||
@@ -2311,8 +2498,9 @@ class CreateSerialValidation extends CreateRecord
|
||||
}
|
||||
}
|
||||
|
||||
public function processSerialNumber($serNo)
|
||||
public function processSer($serNo)
|
||||
{
|
||||
|
||||
$serNo = trim($serNo);
|
||||
$user = Filament::auth()->user();
|
||||
$operatorName = $user->name;
|
||||
@@ -2795,24 +2983,28 @@ class CreateSerialValidation extends CreateRecord
|
||||
return;
|
||||
}
|
||||
|
||||
$this->dispatch('openCapacitorModal', itemCode: $itemCode, serialNumber: $serialNumber, plantId: $plantId);
|
||||
// $this->dispatch('openCapacitorModal', itemCode: $itemCode, serialNumber: $serialNumber, plantId: $plantId);
|
||||
//$this->dispatch('focusCapacitor', invoiceNumber: $invoiceNumber, plantId: $plantId);
|
||||
|
||||
$scannedQuantity = SerialValidation::where('invoice_number', $invoiceNumber)->where('scanned_status', 'Scanned')->where('plant_id', $plantId)->count();
|
||||
$this->dispatch('focusCapacitor', itemCode: $itemCode);
|
||||
|
||||
$totQuan = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->count();
|
||||
$scanSQuan = SerialValidation::where('invoice_number', $invoiceNumber)->where('scanned_status', 'Scanned')->where('plant_id', $plantId)->count();
|
||||
$totMQuan = SerialValidation::where('invoice_number', $invoiceNumber)->whereNotNull('quantity')->where('plant_id', $plantId)->count(); //->where('quantity', '!=', '')
|
||||
$scanMQuan = SerialValidation::where('invoice_number', $invoiceNumber)->whereNotNull('serial_number')->where('serial_number', '!=', '')->where('plant_id', $plantId)->count();
|
||||
|
||||
$this->form->fill([
|
||||
'plant_id' => $plantId,
|
||||
'invoice_number' => $invoiceNumber,
|
||||
'serial_number' => null,
|
||||
'total_quantity' => $totQuan,
|
||||
'update_invoice' => false,
|
||||
'scanned_quantity'=> $scannedQuantity,
|
||||
]);
|
||||
$this->dispatch( 'refreshInvoiceData', invoiceNumber: $invoiceNumber, plantId: $plantId);
|
||||
//$scannedQuantity = SerialValidation::where('invoice_number', $invoiceNumber)->where('scanned_status', 'Scanned')->where('plant_id', $plantId)->count();
|
||||
|
||||
// $totQuan = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->count();
|
||||
// $scanSQuan = SerialValidation::where('invoice_number', $invoiceNumber)->where('scanned_status', 'Scanned')->where('plant_id', $plantId)->count();
|
||||
// $totMQuan = SerialValidation::where('invoice_number', $invoiceNumber)->whereNotNull('quantity')->where('plant_id', $plantId)->count(); //->where('quantity', '!=', '')
|
||||
// $scanMQuan = SerialValidation::where('invoice_number', $invoiceNumber)->whereNotNull('serial_number')->where('serial_number', '!=', '')->where('plant_id', $plantId)->count();
|
||||
|
||||
// $this->form->fill([
|
||||
// 'plant_id' => $plantId,
|
||||
// 'invoice_number' => $invoiceNumber,
|
||||
// 'serial_number' => $serNo,
|
||||
// 'total_quantity' => $totQuan,
|
||||
// 'update_invoice' => false,
|
||||
// 'scanned_quantity'=> $scanSQuan,
|
||||
// ]);
|
||||
// $this->dispatch( 'refreshInvoiceData', invoiceNumber: $invoiceNumber, plantId: $plantId);
|
||||
return;
|
||||
}
|
||||
else if ($isMarkPs)
|
||||
@@ -2958,6 +3150,173 @@ class CreateSerialValidation extends CreateRecord
|
||||
}
|
||||
}
|
||||
|
||||
#[On('process-scan')]
|
||||
public function processSerial($serial)
|
||||
{
|
||||
$this->processSer($serial);
|
||||
}
|
||||
|
||||
public function processCapacitor($serial, $itemCode)
|
||||
{
|
||||
$user = Filament::auth()->user();
|
||||
$operatorName = $user->name;
|
||||
|
||||
$this->currentItemCode = $itemCode;
|
||||
|
||||
if (!$serial) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!preg_match('/^[^\/]+\/[^\/]+\/.+$/', $serial)) {
|
||||
Notification::make()
|
||||
->title('Invalid Panel Box QR Format:')
|
||||
->body('Scan the valid panel box QR code to proceed!')
|
||||
->danger()
|
||||
// ->duration(3000)
|
||||
->seconds(2)
|
||||
->send();
|
||||
return;
|
||||
}
|
||||
|
||||
$parts = explode('/', $serial);
|
||||
|
||||
$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();
|
||||
return;
|
||||
}
|
||||
|
||||
foreach ($this->invoiceData as &$row) {
|
||||
if (
|
||||
($row['code'] ?? '') === $this->currentItemCode &&
|
||||
($row['serial_number'] ?? '') === $this->currentSerialNumber
|
||||
) {
|
||||
$row['panel_box_supplier'] = $supplier;
|
||||
$row['panel_box_item_code'] = $itemCode;
|
||||
$row['panel_box_serial_number'] = $serialNumber;
|
||||
$row['capacitor_scanned_status'] = 1;
|
||||
// $row['scanned_status_set'] = true;
|
||||
|
||||
$matchingValidation = SerialValidation::with('stickerMaster.item')
|
||||
->where('serial_number', $this->currentSerialNumber)
|
||||
->where('plant_id', $this->plantId)
|
||||
->get()
|
||||
->first(function ($validation) {
|
||||
return $validation->stickerMaster?->item?->code === $this->currentItemCode;
|
||||
});
|
||||
|
||||
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_item_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_item_code' => $itemCode,
|
||||
'panel_box_serial_number' => $serialNumber,
|
||||
'capacitor_scanned_status' => 1,
|
||||
'operator_id'=> $operatorName,
|
||||
]);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$matchingValidation->update([
|
||||
'panel_box_supplier' => $supplier,
|
||||
'panel_box_item_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 = SerialValidation::where('invoice_number', $matchingValidation->invoice_number)->where('plant_id', $this->plantId)->count();
|
||||
$scannedQuantity = SerialValidation::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);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
$this->showCapacitorInput = false;
|
||||
$this->dispatch('focus-serial-number');
|
||||
}
|
||||
|
||||
public function getHeading(): string
|
||||
{
|
||||
return 'Scan Serial Validation';
|
||||
|
||||
@@ -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
|
||||
{
|
||||
@@ -24,16 +24,83 @@ class TestingTempResource extends Resource
|
||||
|
||||
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
|
||||
|
||||
protected static ?string $navigationGroup = 'IIOT Temp';
|
||||
|
||||
public static function form(Form $form): Form
|
||||
{
|
||||
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
|
||||
@@ -41,100 +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()
|
||||
->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()
|
||||
@@ -143,6 +267,8 @@ class TestingTempResource extends Resource
|
||||
return;
|
||||
}
|
||||
|
||||
$set('updated_by', Filament::auth()->user()?->name);
|
||||
|
||||
Notification::make()
|
||||
->title('File downloaded successfully')
|
||||
->success()
|
||||
@@ -153,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(),
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
@@ -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');
|
||||
}),
|
||||
]);
|
||||
|
||||
294
app/Http/Controllers/CharacteristicApprovalController.php
Normal file
294
app/Http/Controllers/CharacteristicApprovalController.php
Normal file
@@ -0,0 +1,294 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\RequestCharacteristic;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class CharacteristicApprovalController extends Controller
|
||||
{
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
public function approve(Request $request)
|
||||
{
|
||||
return $this->updateStatus($request, 'Approved');
|
||||
}
|
||||
|
||||
public function reject(Request $request)
|
||||
{
|
||||
return $this->updateStatus($request, 'Rejected');
|
||||
}
|
||||
|
||||
public function holdForm(Request $request)
|
||||
{
|
||||
$id = $request->query('id');
|
||||
|
||||
$level = (int) $request->query('level');
|
||||
|
||||
$record = RequestCharacteristic::findOrFail($id);
|
||||
|
||||
[$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'),
|
||||
};
|
||||
|
||||
$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'));
|
||||
}
|
||||
|
||||
public function rejectForm(Request $request)
|
||||
{
|
||||
$id = $request->query('id');
|
||||
// $level = $request->query('level');
|
||||
$level = (int) $request->query('level');
|
||||
|
||||
$record = RequestCharacteristic::findOrFail($id);
|
||||
|
||||
[$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'),
|
||||
};
|
||||
|
||||
$levels = [
|
||||
1 => 'approver_status1',
|
||||
2 => 'approver_status2',
|
||||
3 => 'approver_status3',
|
||||
];
|
||||
|
||||
$currentStatusColumn = $levels[$level];
|
||||
|
||||
$currentStatus = $record->$statusColumn;
|
||||
|
||||
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.reject-form', compact('id', 'level'));
|
||||
}
|
||||
|
||||
public function holdSave(Request $request)
|
||||
{
|
||||
$request->validate([
|
||||
'id' => 'required|integer',
|
||||
'level' => 'required|integer',
|
||||
'remark' => 'required|string',
|
||||
]);
|
||||
|
||||
return $this->updateStatus($request, 'Hold', false);
|
||||
}
|
||||
|
||||
public function rejectSave(Request $request)
|
||||
{
|
||||
$request->validate([
|
||||
'id' => 'required|integer',
|
||||
'level' => 'required|integer',
|
||||
'remark' => 'required|string',
|
||||
]);
|
||||
|
||||
return $this->updateStatus($request, 'Rejected', false);
|
||||
}
|
||||
|
||||
protected function updateStatus(Request $request, string $status, bool $returnView = true)
|
||||
{
|
||||
$requestId = $request->input('id');
|
||||
$level = (int) $request->input('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();
|
||||
|
||||
$processRecords = 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)
|
||||
->where(function ($query) {
|
||||
$query->whereNotNull('approver_status1')
|
||||
->orWhereNotNull('approver_status2')
|
||||
->orWhereNotNull('approver_status3');
|
||||
})
|
||||
->get();
|
||||
|
||||
$alreadyProcessed = RequestCharacteristic::whereIn($statusColumn, ['Approved', 'Rejected'])->exists();
|
||||
|
||||
if ($alreadyProcessed) {
|
||||
if ($returnView) {
|
||||
return view('approval.already-processed', [
|
||||
'status' => 'Already processed',
|
||||
]);
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'status' => false,
|
||||
'message' => 'This request has already been processed.',
|
||||
], 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();
|
||||
// }
|
||||
|
||||
foreach ($pendingRecords as $rec) {
|
||||
$rec->update($updateData);
|
||||
}
|
||||
|
||||
foreach ($processRecords as $recd) {
|
||||
$recd->update($updateData);
|
||||
}
|
||||
|
||||
if ($returnView) {
|
||||
return match ($status) {
|
||||
'Approved' => view('approval.success'),
|
||||
'Hold' => view('approval.hold-success'),
|
||||
'Rejected' => view('approval.reject-success'),
|
||||
default => abort(500),
|
||||
};
|
||||
}
|
||||
|
||||
return response()->json(['status' => true, 'message' => 'Status updated successfully']);
|
||||
}
|
||||
|
||||
public function index()
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*/
|
||||
public function store(Request $request)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the specified resource.
|
||||
*/
|
||||
public function show(string $id)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
*/
|
||||
public function update(Request $request, string $id)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified resource from storage.
|
||||
*/
|
||||
public function destroy(string $id)
|
||||
{
|
||||
//
|
||||
}
|
||||
}
|
||||
@@ -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' => "Machine name '{$machineName}' not found for the work center '{$workCenter}' in characteristic approver master!",
|
||||
'status_description' => "Master characteristic field value '{$charField}' not found in characteristic approver master!",
|
||||
], 404);
|
||||
}
|
||||
|
||||
$mNameAgaWorkCenterForPlant = CharacteristicApproverMaster::where('machine_name', $machineName)->where('machine_id', $MachineId)->where('plant_id', $plantId)->first();
|
||||
if (! $mNameAgaWorkCenterForPlant) {
|
||||
$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);
|
||||
}
|
||||
|
||||
$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);
|
||||
}
|
||||
|
||||
|
||||
@@ -808,4 +808,29 @@ class InvoiceValidationController extends Controller
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
// public function handle(Request $request)
|
||||
// {
|
||||
// $invoice = InvoiceValidation::withCount([
|
||||
// 'serialNumbers as scanned_count' => function ($q) {
|
||||
// $q->where('is_scanned', 1);
|
||||
// }
|
||||
// ])->find($request->invoice_id);
|
||||
|
||||
// if (!$invoice) {
|
||||
// return response()->json(['error' => 'Invoice not found'], 404);
|
||||
// }
|
||||
|
||||
// if ($invoice->scanned_count < $invoice->total_serials) {
|
||||
|
||||
// Mail::to('alerts@example.com')->send(
|
||||
// new \App\Mail\IncompleteInvoiceMail(
|
||||
// $invoice,
|
||||
// $invoice->scanned_count,
|
||||
// $invoice->total_serials
|
||||
// )
|
||||
// );
|
||||
// }
|
||||
// return response()->json(['status' => 'ok']);
|
||||
// }
|
||||
}
|
||||
|
||||
@@ -33,29 +33,28 @@ class MachineController extends Controller
|
||||
public function get_all_data(Request $request)
|
||||
{
|
||||
$expectedUser = env('API_AUTH_USER');
|
||||
$expectedPw = env('API_AUTH_PW');
|
||||
$header_auth = $request->header('Authorization');
|
||||
$expectedToken = $expectedUser . ':' . $expectedPw;
|
||||
$expectedPw = env('API_AUTH_PW');
|
||||
$header_auth = $request->header('Authorization');
|
||||
$expectedToken = $expectedUser.':'.$expectedPw;
|
||||
|
||||
if ("Bearer " . $expectedToken != $header_auth)
|
||||
{
|
||||
if ('Bearer '.$expectedToken != $header_auth) {
|
||||
return response()->json([
|
||||
'status_code' => 'ERROR',
|
||||
'status_description' => 'Invalid authorization token!'
|
||||
'status_description' => 'Invalid authorization token!',
|
||||
], 403);
|
||||
}
|
||||
|
||||
$machines = Machine::with('plant')->with('workGroupMaster')->orderBy('plant_id')->get();
|
||||
$machinesData = $machines->map(function($machine) {
|
||||
$machinesData = $machines->map(function ($machine) {
|
||||
return [
|
||||
'plant_code' => $machine->plant ? (String)$machine->plant->code : "",
|
||||
'group_work_center' => $machine->workGroupMaster ? (String)$machine->workGroupMaster->name : "",
|
||||
'work_center' => $machine->work_center ?? "",
|
||||
'plant_code' => $machine->plant ? (string) $machine->plant->code : '',
|
||||
'group_work_center' => $machine->workGroupMaster ? (string) $machine->workGroupMaster->name : '',
|
||||
'work_center' => $machine->work_center ?? '',
|
||||
];
|
||||
});
|
||||
|
||||
return response()->json([
|
||||
'machines' => $machinesData
|
||||
'machines' => $machinesData,
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -65,80 +64,70 @@ class MachineController extends Controller
|
||||
public function get_data(Request $request)
|
||||
{
|
||||
$expectedUser = env('API_AUTH_USER');
|
||||
$expectedPw = env('API_AUTH_PW');
|
||||
$header_auth = $request->header('Authorization');
|
||||
$expectedToken = $expectedUser . ':' . $expectedPw;
|
||||
$expectedPw = env('API_AUTH_PW');
|
||||
$header_auth = $request->header('Authorization');
|
||||
$expectedToken = $expectedUser.':'.$expectedPw;
|
||||
|
||||
if ("Bearer " . $expectedToken != $header_auth)
|
||||
{
|
||||
if ('Bearer '.$expectedToken != $header_auth) {
|
||||
return response()->json([
|
||||
'status_code' => 'ERROR',
|
||||
'status_description' => 'Invalid authorization token!'
|
||||
'status_description' => 'Invalid authorization token!',
|
||||
], 403);
|
||||
}
|
||||
|
||||
$plantCode = $request->header('plant-code');
|
||||
$lineName = $request->header('line-name');
|
||||
|
||||
if ($plantCode == null || $plantCode == '')
|
||||
{
|
||||
if ($plantCode == null || $plantCode == '') {
|
||||
return response()->json([
|
||||
'status_code' => 'ERROR',
|
||||
'status_description' => "Plant code can't be empty!"
|
||||
'status_description' => "Plant code can't be empty!",
|
||||
], 400);
|
||||
}
|
||||
else if (Str::length($plantCode) < 4 || !is_numeric($plantCode) || !preg_match('/^[1-9]\d{3,}$/', $plantCode))
|
||||
{
|
||||
} elseif (Str::length($plantCode) < 4 || ! is_numeric($plantCode) || ! preg_match('/^[1-9]\d{3,}$/', $plantCode)) {
|
||||
return response()->json([
|
||||
'status_code' => 'ERROR',
|
||||
'status_description' => "Invalid plant code found!"
|
||||
'status_description' => 'Invalid plant code found!',
|
||||
], 400);
|
||||
}
|
||||
else if ($lineName == null || $lineName == '' || Str::length($lineName) <= 0)
|
||||
{
|
||||
} elseif ($lineName == null || $lineName == '' || Str::length($lineName) <= 0) {
|
||||
return response()->json([
|
||||
'status_code' => 'ERROR',
|
||||
'status_description' => "Line name can't be empty!"
|
||||
'status_description' => "Line name can't be empty!",
|
||||
], 400);
|
||||
}
|
||||
|
||||
$plant = Plant::where('code', $plantCode)->first();
|
||||
if (!$plant)
|
||||
{
|
||||
if (! $plant) {
|
||||
return response()->json([
|
||||
'status_code' => 'ERROR',
|
||||
'status_description' => "Plant Code '{$plantCode}' not found!"
|
||||
'status_description' => "Plant Code '{$plantCode}' not found!",
|
||||
], 400);
|
||||
}
|
||||
|
||||
$plantId = $plant->id;
|
||||
|
||||
$line = Line::where('name', $lineName)->first();
|
||||
if (!$line)
|
||||
{
|
||||
if (! $line) {
|
||||
return response()->json([
|
||||
'status_code' => 'ERROR',
|
||||
'status_description' => "Line Name '{$lineName}' not found!"
|
||||
'status_description' => "Line Name '{$lineName}' not found!",
|
||||
], 400);
|
||||
}
|
||||
|
||||
$line = Line::where('name', $lineName)->where('plant_id', $plantId)->first();
|
||||
if (!$line)
|
||||
{
|
||||
if (! $line) {
|
||||
return response()->json([
|
||||
'status_code' => 'ERROR',
|
||||
'status_description' => "Line Name '{$lineName}' not found for the plant!"
|
||||
'status_description' => "Line Name '{$lineName}' not found for the plant!",
|
||||
], 400);
|
||||
}
|
||||
|
||||
$lineId = $line->id;//no_of_operation
|
||||
$lineId = $line->id; // no_of_operation
|
||||
$lineWorkGroup1Id = $line->work_group1_id;
|
||||
$lineWorkGroup2Id = $line->work_group2_id;
|
||||
if ($line->no_of_operation == null || $line->no_of_operation == '' || $line->no_of_operation == 0 || !is_numeric($line->no_of_operation))
|
||||
{
|
||||
if ($line->no_of_operation == null || $line->no_of_operation == '' || $line->no_of_operation == 0 || ! is_numeric($line->no_of_operation)) {
|
||||
return response()->json([
|
||||
'status_code' => 'ERROR',
|
||||
'status_description' => "Group work center not found for the plant & line!"
|
||||
'status_description' => 'Group work center not found for the plant & line!',
|
||||
], 400);
|
||||
}
|
||||
|
||||
@@ -146,26 +135,22 @@ class MachineController extends Controller
|
||||
$lineWorkGroupIds = [];
|
||||
for ($i = 1; $i <= $line->no_of_operation; $i++) {
|
||||
$curWorkGroupId = $line->{"work_group{$i}_id"};
|
||||
if (in_array($curWorkGroupId, $lineWorkGroupIds))
|
||||
{
|
||||
if (in_array($curWorkGroupId, $lineWorkGroupIds)) {
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
$lineWorkGroupIds[] = $curWorkGroupId;
|
||||
}
|
||||
|
||||
$test[] = [
|
||||
'group_work_center' => WorkGroupMaster::where('id', $curWorkGroupId)->first()->name ?? "",
|
||||
'operation_number' => WorkGroupMaster::where('id', $curWorkGroupId)->first()->operation_number ?? "",
|
||||
'work_centers' => Machine::where('plant_id', $plantId)->where('work_group_master_id', $curWorkGroupId)->orderBy('work_center')->pluck('work_center')->toArray() ?? [],
|
||||
'group_work_center' => WorkGroupMaster::where('id', $curWorkGroupId)->first()->name ?? '',
|
||||
'operation_number' => WorkGroupMaster::where('id', $curWorkGroupId)->first()->operation_number ?? '',
|
||||
'work_centers' => Machine::where('plant_id', $plantId)->where('work_group_master_id', $curWorkGroupId)->orderBy('work_center')->pluck('work_center')->toArray() ?? [],
|
||||
];
|
||||
}
|
||||
|
||||
if($lineWorkGroupIds)
|
||||
{
|
||||
if ($lineWorkGroupIds) {
|
||||
return response()->json([
|
||||
'machines' => $test
|
||||
'machines' => $test,
|
||||
]);
|
||||
}
|
||||
// $machines = Machine::with('plant')->with('workGroupMaster')->orderBy('plant_id')->get();
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use Filament\Notifications\Notification;
|
||||
use Illuminate\Http\Request;
|
||||
use Mpdf\Mpdf;
|
||||
use Mpdf\QrCode\Output;
|
||||
@@ -20,11 +21,11 @@ class PalletController extends Controller
|
||||
public function downloadReprintQrPdf($palletNo)
|
||||
{
|
||||
$qrCode = new QrCode($palletNo);
|
||||
$output = new Output\Png();
|
||||
$output = new Output\Png;
|
||||
$qrBinary = $output->output($qrCode, 100);
|
||||
$qrBase64 = base64_encode($qrBinary);
|
||||
|
||||
return '
|
||||
return '
|
||||
<html>
|
||||
<head>
|
||||
<style>
|
||||
@@ -39,10 +40,10 @@ class PalletController extends Controller
|
||||
<table class="sticker-table">
|
||||
<tr>
|
||||
<td class="qr-cell">
|
||||
<img class="qr" src="data:image/png;base64,' . $qrBase64 . '" alt="QR" />
|
||||
<img class="qr" src="data:image/png;base64,'.$qrBase64.'" alt="QR" />
|
||||
</td>
|
||||
<td class="text-cell">
|
||||
' . htmlspecialchars($palletNo) . '
|
||||
'.htmlspecialchars($palletNo).'
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
@@ -73,26 +74,182 @@ class PalletController extends Controller
|
||||
// $mpdf->Output('qr-label.pdf', 'I');
|
||||
}
|
||||
|
||||
public function downloadQrPdf($palletNo)
|
||||
public function downloadReprintProcess($plant, $item, $process_order, $coil_number, $name)
|
||||
{
|
||||
$qrCode = new QrCode($palletNo);
|
||||
$output = new Output\Png();
|
||||
// dd($plant,$item,$process_order,$coil_number);
|
||||
|
||||
$processOrder = \App\Models\ProcessOrder::where('plant_id', $plant)
|
||||
->where('item_id', $item)
|
||||
->where('process_order', $process_order)
|
||||
->where('coil_number', $coil_number)
|
||||
->first();
|
||||
|
||||
if (! $processOrder) {
|
||||
return response()->json(['error' => 'Process order not found'], 404);
|
||||
}
|
||||
|
||||
$receivedQuantity = $processOrder->received_quantity;
|
||||
$machineName = $processOrder->machine_name;
|
||||
$user = $processOrder->created_by;
|
||||
|
||||
$icode = \App\Models\Item::find($item);
|
||||
|
||||
$pCode = \App\Models\Plant::find($plant);
|
||||
|
||||
$plCode = $pCode->code;
|
||||
|
||||
if (! $plCode) {
|
||||
Notification::make()
|
||||
->title('Unknown Plant')
|
||||
->body('Plant not found.')
|
||||
->warning()
|
||||
->send();
|
||||
}
|
||||
|
||||
if (! $icode) {
|
||||
Notification::make()
|
||||
->title('Unknown Item')
|
||||
->body('Item not found.')
|
||||
->warning()
|
||||
->send();
|
||||
}
|
||||
|
||||
$itCode = $icode->code;
|
||||
|
||||
$itemAgaPlant = \App\Models\Item::where('code', $itCode)
|
||||
->where('plant_id', $plant)
|
||||
->first();
|
||||
|
||||
if (! $itemAgaPlant) {
|
||||
Notification::make()
|
||||
->title('Unknown Item')
|
||||
->body("Item not found against plant code $plCode.")
|
||||
->warning()
|
||||
->send();
|
||||
} else {
|
||||
$itemDescription = $itemAgaPlant->description;
|
||||
}
|
||||
|
||||
$nowDT = now()->format('d-m-Y H:i:s');
|
||||
|
||||
// Build QR content
|
||||
$qrContent = "{$receivedQuantity}|{$itCode}|{$process_order}-{$coil_number}";
|
||||
|
||||
$qrCode = new QrCode($qrContent);
|
||||
$output = new Output\Png;
|
||||
$qrBinary = $output->output($qrCode, 100);
|
||||
$qrBase64 = base64_encode($qrBinary);
|
||||
|
||||
$htmlBlock = '
|
||||
return '
|
||||
<html>
|
||||
<head>
|
||||
<style>
|
||||
@page {
|
||||
size: 60mm 30mm;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
width: 60mm;
|
||||
font-size: 9pt;
|
||||
font-family: "DejaVu Sans Condensed", "FreeSans", sans-serif;
|
||||
}
|
||||
|
||||
.sticker-table {
|
||||
width: 60mm;
|
||||
border-collapse: collapse;
|
||||
page-break-inside: avoid;
|
||||
}
|
||||
|
||||
.text-cell {
|
||||
text-align: left;
|
||||
vertical-align: top;
|
||||
font-size: 9pt;
|
||||
padding-left: 2mm;
|
||||
padding-top: 2mm; /* was 6mm ❌ */
|
||||
font-weight: bold;
|
||||
line-height: 1.1; /* IMPORTANT */
|
||||
white-space: nowrap;
|
||||
width: 40mm;
|
||||
}
|
||||
|
||||
.qr-cell {
|
||||
width: 20mm;
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.lbl {
|
||||
display: inline-block;
|
||||
width: 11mm;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.text-cell b {
|
||||
font-size: 10pt; /* was 12pt ❌ */
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
img.qr {
|
||||
width: 12mm;
|
||||
height: 12mm;
|
||||
display: block;
|
||||
margin: auto;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<table class="sticker-table">
|
||||
<tr>
|
||||
<td class="text-cell">
|
||||
<span class="lbl">D/T</span>: '.htmlspecialchars($nowDT).'<br>
|
||||
<span class="lbl">OP ID</span>: '.htmlspecialchars($user).'<br>
|
||||
<span class="lbl">PO NO</span>: '.htmlspecialchars($process_order).'<br>
|
||||
<span class="lbl">M/C</span>: '.htmlspecialchars($itCode).'<br>
|
||||
<span class="lbl">DES</span>: '.htmlspecialchars($itemDescription).'<br>
|
||||
<span class="lbl">WGT</span>: <b>'.htmlspecialchars($receivedQuantity).' KGS</b><br>
|
||||
<span class="lbl">MAC</span>: '.htmlspecialchars($machineName).'
|
||||
</td>
|
||||
<td class="qr-cell">
|
||||
<img class="qr" src="data:image/png;base64,'.$qrBase64.'" alt="QR" />
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<script>
|
||||
window.onload = function () {
|
||||
window.print();
|
||||
setTimeout(function () { window.close(); }, 500);
|
||||
};
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
';
|
||||
|
||||
}
|
||||
|
||||
public function downloadQrPdf($palletNo)
|
||||
{
|
||||
$qrCode = new QrCode($palletNo);
|
||||
$output = new Output\Png;
|
||||
$qrBinary = $output->output($qrCode, 100);
|
||||
$qrBase64 = base64_encode($qrBinary);
|
||||
|
||||
$htmlBlock = '
|
||||
<table class="sticker-table">
|
||||
<tr>
|
||||
<td class="qr-cell">
|
||||
<img class="qr" src="data:image/png;base64,' . $qrBase64 . '" alt="QR" />
|
||||
<img class="qr" src="data:image/png;base64,'.$qrBase64.'" alt="QR" />
|
||||
</td>
|
||||
<td class="text-cell">
|
||||
' . htmlspecialchars($palletNo) . '
|
||||
'.htmlspecialchars($palletNo).'
|
||||
</td>
|
||||
</tr>
|
||||
</table>';
|
||||
|
||||
return '
|
||||
return '
|
||||
<html>
|
||||
<head>
|
||||
<style>
|
||||
@@ -104,7 +261,7 @@ class PalletController extends Controller
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
' . $htmlBlock . $htmlBlock . '
|
||||
'.$htmlBlock.$htmlBlock.'
|
||||
<script>
|
||||
window.onload = function () {
|
||||
window.print();
|
||||
|
||||
@@ -873,6 +873,15 @@ class PdfController extends Controller
|
||||
'status_description' => "Rework value should be either 'Yes' or 'No'!",
|
||||
], 404);
|
||||
}
|
||||
else if ($rework == 'No')
|
||||
{
|
||||
if($scrapQty != 0){
|
||||
return response()->json([
|
||||
'status_code' => 'ERROR',
|
||||
'status_description' => "Scrap Quanity value should be '0'!",
|
||||
], 404);
|
||||
}
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\DriverMaster;
|
||||
use App\Models\VehicleMaster;
|
||||
use Illuminate\Http\Request;
|
||||
use Str;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
@@ -19,10 +21,21 @@ class SapFileController extends Controller
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*/
|
||||
// public function store(Request $request)
|
||||
// {
|
||||
// //
|
||||
// }
|
||||
public function store(Request $request)
|
||||
{
|
||||
$request->validate([
|
||||
'name' => 'required|string',
|
||||
'identification1' => 'nullable|string',
|
||||
'identification2' => 'nullable|string',
|
||||
'identification3' => 'nullable|string',
|
||||
'contact_number' => 'nullable|string',
|
||||
'alternate_number' => 'nullable|string',
|
||||
]);
|
||||
|
||||
DriverMaster::create($request->all());
|
||||
|
||||
return response()->json(['success' => true]);
|
||||
}
|
||||
|
||||
public function getSapData(Request $request)
|
||||
{
|
||||
@@ -145,40 +158,6 @@ class SapFileController extends Controller
|
||||
], 500);
|
||||
}
|
||||
|
||||
// $table = 'class_characteristics';
|
||||
// $columns = Schema::getColumnListing($table); // returns lowercase column names
|
||||
|
||||
// $rows = [];
|
||||
// foreach ($lines as $line) {
|
||||
// $values = str_getcsv($line); // split by comma
|
||||
|
||||
// $row = [];
|
||||
// foreach ($columns as $index => $column) {
|
||||
// $value = $values[$index] ?? null; // if missing, set null
|
||||
// if ($value === '') $value = null; // empty string -> null
|
||||
// $row[$column] = $value;
|
||||
// }
|
||||
|
||||
// $rows[] = $row;
|
||||
// }
|
||||
|
||||
// return response()->json([
|
||||
// 'status' => 'DEBUG_ROWS',
|
||||
// 'rows_sample' => array_slice($rows, 0, 5),
|
||||
// ]);
|
||||
|
||||
|
||||
// Insert into database
|
||||
// foreach ($rows as $row) {
|
||||
// \App\Models\ClassCharacteristic::create($row);
|
||||
// }
|
||||
|
||||
// return response()->json([
|
||||
// 'status' => 'SUCCESS',
|
||||
// 'rows_imported' => count($rows),
|
||||
// ]);
|
||||
|
||||
|
||||
// Prepare arrays
|
||||
// $serialNumbers = [];
|
||||
// $remainingRows = [];
|
||||
@@ -251,7 +230,7 @@ class SapFileController extends Controller
|
||||
if (!empty($invalidSerials)) {
|
||||
return response()->json([
|
||||
'status' => 'ERROR',
|
||||
'status_description' => 'Some serial numbers are invalid (less than 13 characters)',
|
||||
'status_description' => 'serial numbers are invalid (less than 13 characters)',
|
||||
'invalid_serials' => $invalidSerials
|
||||
], 400);
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\Plant;
|
||||
use App\Models\User;
|
||||
//use Carbon\Carbon;
|
||||
// use Carbon\Carbon;
|
||||
use Hash;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
@@ -29,72 +29,65 @@ class UserController extends Controller
|
||||
/**
|
||||
* Display the specified resource.
|
||||
*/
|
||||
//show(string $id)
|
||||
// show(string $id)
|
||||
public function get_testing_data(Request $request)
|
||||
{
|
||||
$expectedUser = env('API_AUTH_USER');
|
||||
$expectedPw = env('API_AUTH_PW');
|
||||
$header_auth = $request->header('Authorization');
|
||||
$header_user = $request->header('User-Name');
|
||||
$header_pass = $request->header('User-Pass');
|
||||
$expectedToken = $expectedUser . ':' . $expectedPw;
|
||||
$expectedPw = env('API_AUTH_PW');
|
||||
$header_auth = $request->header('Authorization');
|
||||
$header_user = $request->header('User-Name');
|
||||
$header_pass = $request->header('User-Pass');
|
||||
$expectedToken = $expectedUser.':'.$expectedPw;
|
||||
|
||||
if ("Bearer " . $expectedToken != $header_auth)
|
||||
{
|
||||
if ('Bearer '.$expectedToken != $header_auth) {
|
||||
return response()->json([
|
||||
'status_code' => 'ERROR',
|
||||
'status_description' => 'Invalid authorization token!'
|
||||
'status_description' => 'Invalid authorization token!',
|
||||
], 403);
|
||||
}
|
||||
|
||||
if (!$header_user)
|
||||
{
|
||||
if (! $header_user) {
|
||||
return response()->json([
|
||||
'status_code' => 'ERROR',
|
||||
'status_description' => 'Invalid user name found!'
|
||||
'status_description' => 'Invalid user name found!',
|
||||
], 400);
|
||||
}
|
||||
else if (!$header_pass)
|
||||
{
|
||||
} elseif (! $header_pass) {
|
||||
return response()->json([
|
||||
'status_code' => 'ERROR',
|
||||
'status_description' => 'Invalid password found!'
|
||||
'status_description' => 'Invalid password found!',
|
||||
], 400);
|
||||
}
|
||||
|
||||
$existUser = User::where('name', $header_user)->first();
|
||||
$existPlant = "All Plants";
|
||||
$existPlant = 'All Plants';
|
||||
|
||||
if (!$existUser)
|
||||
{
|
||||
if (! $existUser) {
|
||||
return response()->json([
|
||||
'status_code' => 'ERROR',
|
||||
'status_description' => 'Unknown user name found!'
|
||||
'status_description' => 'Unknown user name found!',
|
||||
], 400);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
$codeExist = Plant::where('id', $existUser->plant_id)->first();
|
||||
if ($codeExist) {
|
||||
$existPlant = $codeExist->code;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Retrieve the user by email
|
||||
//$user = User::where('email', $email)->first();
|
||||
// $user = User::where('email', $email)->first();
|
||||
if (Hash::check($header_pass, $existUser->password)) {
|
||||
return response()->json([
|
||||
'created_at' => $existUser->created_at->format('Y-m-d H:i:s') ?? "",
|
||||
'updated_at' => $existUser->updated_at->format('Y-m-d H:i:s') ?? "",
|
||||
'requested_at' => now()->format('Y-m-d H:i:s') ?? "", //Carbon::now(config('app.timezone'))->format('Y-m-d H:i:s') ?? "",
|
||||
'plant' => (String)$existPlant ?? "",
|
||||
'email' => $existUser->email ?? "",
|
||||
'roles' => $existUser->roles()->pluck('name')->toArray()
|
||||
'created_at' => $existUser->created_at->format('Y-m-d H:i:s') ?? '',
|
||||
'updated_at' => $existUser->updated_at->format('Y-m-d H:i:s') ?? '',
|
||||
'requested_at' => now()->format('Y-m-d H:i:s') ?? '', // Carbon::now(config('app.timezone'))->format('Y-m-d H:i:s') ?? "",
|
||||
'plant' => (string) $existPlant ?? '',
|
||||
'email' => $existUser->email ?? '',
|
||||
'roles' => $existUser->roles()->pluck('name')->toArray(),
|
||||
], 200);
|
||||
} else {
|
||||
return response()->json([
|
||||
'status_code' => 'ERROR',
|
||||
'status_description' => 'Password does not match!'
|
||||
'status_description' => 'Password does not match!',
|
||||
], 400);
|
||||
}
|
||||
|
||||
|
||||
@@ -114,6 +114,7 @@ class InvoicePendingReasonImport implements ToCollection
|
||||
continue;
|
||||
}
|
||||
|
||||
// dd($row['document_number'], bin2hex($row['document_number']));
|
||||
|
||||
$this->validRows[] = [
|
||||
'plant_id' => $plantId,
|
||||
|
||||
51
app/Jobs/SendApprover1MailJob.php
Normal file
51
app/Jobs/SendApprover1MailJob.php
Normal file
@@ -0,0 +1,51 @@
|
||||
<?php
|
||||
|
||||
namespace App\Jobs;
|
||||
|
||||
use App\Mail\CharacteristicApprovalMail;
|
||||
use App\Models\CharacteristicApproverMaster;
|
||||
use App\Models\RequestCharacteristic;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Foundation\Queue\Queueable;
|
||||
use Illuminate\Support\Facades\Mail;
|
||||
|
||||
class SendApprover1MailJob implements ShouldQueue
|
||||
{
|
||||
use Queueable;
|
||||
|
||||
/**
|
||||
* Create a new job instance.
|
||||
*/
|
||||
public function __construct(public RequestCharacteristic $request) {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the job.
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
// Already approved? stop
|
||||
if (!is_null($this->request->approver_status1)) return;
|
||||
|
||||
if ($this->request->approver1_mail_sent) return;
|
||||
|
||||
$approver = CharacteristicApproverMaster::where('plant_id', $this->request->plant_id)
|
||||
->where('machine_id', $this->request->machine_id)
|
||||
->first();
|
||||
|
||||
if (! $approver || ! $approver->mail1) return;
|
||||
|
||||
Mail::to($approver->mail1)
|
||||
->queue(new CharacteristicApprovalMail(
|
||||
$this->request,
|
||||
$approver->name1,
|
||||
1
|
||||
));
|
||||
|
||||
$this->request->update(['approver1_mail_sent' => 1]);
|
||||
|
||||
SendApprover2MailJob::dispatch($this->request)
|
||||
->delay(now()->addMinutes(5));
|
||||
}
|
||||
}
|
||||
58
app/Jobs/SendApprover2MailJob.php
Normal file
58
app/Jobs/SendApprover2MailJob.php
Normal file
@@ -0,0 +1,58 @@
|
||||
<?php
|
||||
|
||||
namespace App\Jobs;
|
||||
|
||||
use App\Mail\CharacteristicApprovalMail;
|
||||
use App\Models\CharacteristicApproverMaster;
|
||||
use App\Models\RequestCharacteristic;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Foundation\Queue\Queueable;
|
||||
use Illuminate\Support\Facades\Mail;
|
||||
|
||||
class SendApprover2MailJob implements ShouldQueue
|
||||
{
|
||||
use Queueable;
|
||||
|
||||
/**
|
||||
* Create a new job instance.
|
||||
*/
|
||||
// public function __construct()
|
||||
// {
|
||||
// //
|
||||
// }
|
||||
|
||||
/**
|
||||
* Execute the job.
|
||||
*/
|
||||
public function __construct(public RequestCharacteristic $request) {}
|
||||
|
||||
public function handle()
|
||||
{
|
||||
// If approver-1 approved → STOP
|
||||
if (!is_null($this->request->approver_status1)) return;
|
||||
|
||||
// If approver-2 already approved → STOP
|
||||
if (!is_null($this->request->approver_status2)) return;
|
||||
|
||||
if ($this->request->approver2_mail_sent) return;
|
||||
|
||||
$approver = CharacteristicApproverMaster::where('plant_id', $this->request->plant_id)
|
||||
->where('machine_id', $this->request->machine_id)
|
||||
->first();
|
||||
|
||||
if (! $approver || ! $approver->mail2) return;
|
||||
|
||||
Mail::to($approver->mail2)
|
||||
->queue(new CharacteristicApprovalMail(
|
||||
$this->request,
|
||||
$approver->name2,
|
||||
2
|
||||
));
|
||||
|
||||
$this->request->update(['approver2_mail_sent' => 1]);
|
||||
|
||||
// Schedule Approver-3 after 5 minutes
|
||||
SendApprover3MailJob::dispatch($this->request)
|
||||
->delay(now()->addMinutes(5));
|
||||
}
|
||||
}
|
||||
56
app/Jobs/SendApprover3MailJob.php
Normal file
56
app/Jobs/SendApprover3MailJob.php
Normal file
@@ -0,0 +1,56 @@
|
||||
<?php
|
||||
|
||||
namespace App\Jobs;
|
||||
|
||||
use App\Mail\CharacteristicApprovalMail;
|
||||
use App\Models\CharacteristicApproverMaster;
|
||||
use App\Models\RequestCharacteristic;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Foundation\Queue\Queueable;
|
||||
use Illuminate\Support\Facades\Mail;
|
||||
|
||||
class SendApprover3MailJob implements ShouldQueue
|
||||
{
|
||||
use Queueable;
|
||||
|
||||
/**
|
||||
* Create a new job instance.
|
||||
*/
|
||||
// public function __construct()
|
||||
// {
|
||||
// //
|
||||
// }
|
||||
|
||||
/**
|
||||
* Execute the job.
|
||||
*/
|
||||
public function __construct(public RequestCharacteristic $request) {}
|
||||
|
||||
public function handle()
|
||||
{
|
||||
if (
|
||||
!is_null($this->request->approver_status1) ||
|
||||
!is_null($this->request->approver_status2) ||
|
||||
!is_null($this->request->approver_status3)
|
||||
) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ($this->request->approver3_mail_sent) return;
|
||||
|
||||
$approver = CharacteristicApproverMaster::where('plant_id', $this->request->plant_id)
|
||||
->where('machine_id', $this->request->machine_id)
|
||||
->first();
|
||||
|
||||
if (! $approver || ! $approver->mail3) return;
|
||||
|
||||
Mail::to($approver->mail3)
|
||||
->queue(new CharacteristicApprovalMail(
|
||||
$this->request,
|
||||
$approver->name3,
|
||||
3
|
||||
));
|
||||
|
||||
$this->request->update(['approver3_mail_sent' => 1]);
|
||||
}
|
||||
}
|
||||
@@ -13,23 +13,41 @@ class GuardPatrolEntryDataTable extends Component
|
||||
// public $date;
|
||||
|
||||
public $newNameFound;
|
||||
|
||||
public $guardName;
|
||||
|
||||
public $checkPointName;
|
||||
|
||||
public $startTime;
|
||||
|
||||
public $endTime;
|
||||
|
||||
public $start;
|
||||
|
||||
public $finish;
|
||||
|
||||
public $begin;
|
||||
|
||||
public $end;
|
||||
|
||||
public $labTime;
|
||||
|
||||
public $minDiff;
|
||||
|
||||
public $seqNoCnt = 0;
|
||||
|
||||
public $seqNo = 0;
|
||||
|
||||
public $isSequenced = true;
|
||||
|
||||
public $sequences = [];
|
||||
|
||||
public $seqTime;
|
||||
|
||||
public $seqTimes = [];
|
||||
|
||||
public $startSeqCheckPoints = [];
|
||||
|
||||
public $records = [];
|
||||
|
||||
protected $listeners = [
|
||||
@@ -61,9 +79,9 @@ class GuardPatrolEntryDataTable extends Component
|
||||
$this->seqTimes = [];
|
||||
$this->startSeqCheckPoints = [];
|
||||
|
||||
if (!$plantId || !$date)
|
||||
{
|
||||
if (! $plantId || ! $date) {
|
||||
$this->records = [];
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -73,20 +91,19 @@ class GuardPatrolEntryDataTable extends Component
|
||||
$this->startSeqCheckPoints[$i] = CheckPointTime::with('checkPointNames1')->with('checkPointNames2')->where('sequence_number', $i)->where('plant_id', $plantId)->first();
|
||||
}
|
||||
|
||||
$this->sequences = array_fill(1, $this->seqNoCnt, "X");
|
||||
$this->sequences = array_fill(1, $this->seqNoCnt, 'X');
|
||||
$this->seqTimes = array_fill(1, $this->seqNoCnt, null);
|
||||
|
||||
$hasSingleGuard = GuardPatrolEntry::whereDate('patrol_time', $date)->where('plant_id', $plantId)->orderBy('patrol_time', 'asc')->get();
|
||||
|
||||
$checking = 0;
|
||||
$records = GuardPatrolEntry::with('guardNames')->with('checkPointNames')->whereDate('patrol_time', $date)->where('plant_id', $plantId)->orderBy('patrol_time', 'asc')->get(); //desc Carbon::parse($record->patrol_time)->toTimeString()
|
||||
foreach ($records as $index => $record) { //foreach ($startSeqCheckPoints as $seq => $checkpoint)
|
||||
$records = GuardPatrolEntry::with('guardNames')->with('checkPointNames')->whereDate('patrol_time', $date)->where('plant_id', $plantId)->orderBy('patrol_time', 'asc')->get(); // desc Carbon::parse($record->patrol_time)->toTimeString()
|
||||
foreach ($records as $index => $record) { // foreach ($startSeqCheckPoints as $seq => $checkpoint)
|
||||
$checking++;
|
||||
$guardName = $record->guardNames ? $record->guardNames->name : null;
|
||||
$checkPointName = $record->checkPointNames ? $record->checkPointNames->name : null;
|
||||
if ($this->guardName != $guardName || $this->newNameFound) {//if ($this->newNameFound) {
|
||||
if ($this->guardName)
|
||||
{
|
||||
if ($this->guardName != $guardName || $this->newNameFound) {// if ($this->newNameFound) {
|
||||
if ($this->guardName) {
|
||||
$recordData = [
|
||||
'guard_name' => $this->guardName,
|
||||
'start_time' => $this->startTime,
|
||||
@@ -105,27 +122,25 @@ class GuardPatrolEntryDataTable extends Component
|
||||
$this->seqTimes = array_fill(1, $this->seqNoCnt, null);
|
||||
|
||||
$this->guardName = $guardName;
|
||||
$this->startTime = Carbon::parse($record->patrol_time)->toTimeString(); //"2025-06-01 00:07:12"
|
||||
$this->startTime = Carbon::parse($record->patrol_time)->toTimeString(); // "2025-06-01 00:07:12"
|
||||
$this->start = Carbon::parse($record->patrol_time);
|
||||
$this->endTime = Carbon::parse($record->patrol_time)->toTimeString(); //"2025-06-01 00:07:12"
|
||||
$this->endTime = Carbon::parse($record->patrol_time)->toTimeString(); // "2025-06-01 00:07:12"
|
||||
$this->finish = Carbon::parse($record->patrol_time);
|
||||
$this->begin = Carbon::parse($record->patrol_time);
|
||||
$this->end = Carbon::parse($record->patrol_time);
|
||||
$this->labTime = (int)$this->start->diffInMinutes($this->finish);
|
||||
$this->minDiff = (int)$this->begin->diffInMinutes($this->end);
|
||||
$this->seqTime = $this->begin->toTimeString(). " - " . $this->end->toTimeString();
|
||||
$this->labTime = (int) $this->start->diffInMinutes($this->finish);
|
||||
$this->minDiff = (int) $this->begin->diffInMinutes($this->end);
|
||||
$this->seqTime = $this->begin->toTimeString().' - '.$this->end->toTimeString();
|
||||
$this->seqNo = 0;
|
||||
$this->newNameFound = false;
|
||||
$this->isSequenced = true;
|
||||
}
|
||||
else if ($this->guardName == $guardName && $this->start && $this->begin)
|
||||
{
|
||||
$this->endTime = Carbon::parse($record->patrol_time)->toTimeString(); //"2025-06-01 00:07:12"
|
||||
} elseif ($this->guardName == $guardName && $this->start && $this->begin) {
|
||||
$this->endTime = Carbon::parse($record->patrol_time)->toTimeString(); // "2025-06-01 00:07:12"
|
||||
$this->finish = Carbon::parse($record->patrol_time);
|
||||
$this->end = Carbon::parse($record->patrol_time);
|
||||
$this->labTime = (int)$this->start->diffInMinutes($this->finish);
|
||||
$this->minDiff = (int)$this->begin->diffInMinutes($this->end);
|
||||
$this->seqTime = $this->begin->toTimeString(). " - " . $this->end->toTimeString();
|
||||
$this->labTime = (int) $this->start->diffInMinutes($this->finish);
|
||||
$this->minDiff = (int) $this->begin->diffInMinutes($this->end);
|
||||
$this->seqTime = $this->begin->toTimeString().' - '.$this->end->toTimeString();
|
||||
$this->begin = Carbon::parse($record->patrol_time);
|
||||
// $this->seqNo = 0;
|
||||
}
|
||||
@@ -133,19 +148,16 @@ class GuardPatrolEntryDataTable extends Component
|
||||
$this->seqNo++;
|
||||
|
||||
if ($this->seqNo == 1) {
|
||||
if ($checkPointName == $this->startSeqCheckPoints[$this->seqNo]->checkPointNames1->name) {//"STP BACKSIDE"
|
||||
if ($checkPointName == $this->startSeqCheckPoints[$this->seqNo]->checkPointNames1->name) {// "STP BACKSIDE"
|
||||
$this->isSequenced = true;
|
||||
$this->sequences = array_fill(1, $this->seqNoCnt, "X");
|
||||
}
|
||||
else {
|
||||
$this->sequences = array_fill(1, $this->seqNoCnt, 'X');
|
||||
} else {
|
||||
$this->isSequenced = false;
|
||||
$this->sequences = array_fill(1, $this->seqNoCnt, "X");
|
||||
$this->sequences = array_fill(1, $this->seqNoCnt, 'X');
|
||||
}
|
||||
|
||||
if (($index+1) == count($hasSingleGuard))
|
||||
{
|
||||
if ($this->guardName)
|
||||
{
|
||||
if (($index + 1) == count($hasSingleGuard)) {
|
||||
if ($this->guardName) {
|
||||
$recordData = [
|
||||
'guard_name' => $this->guardName,
|
||||
'start_time' => $this->startTime,
|
||||
@@ -161,26 +173,37 @@ class GuardPatrolEntryDataTable extends Component
|
||||
$this->records[] = $recordData;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ($this->seqNo >= ($this->seqNoCnt+1)) {
|
||||
$this->seqTimes[$this->seqNo-1] = $this->seqTime;
|
||||
if ($checkPointName == $this->startSeqCheckPoints[$this->seqNo-1]->checkPointNames2->name) {//"D 72 END"
|
||||
} elseif ($this->seqNo >= ($this->seqNoCnt + 1)) {
|
||||
$this->seqTimes[$this->seqNo - 1] = $this->seqTime;
|
||||
if ($checkPointName == $this->startSeqCheckPoints[$this->seqNo - 1]->checkPointNames2->name) {// "D 72 END"
|
||||
if ($this->isSequenced) {
|
||||
$this->sequences[$this->seqNo-1] = $this->minDiff;
|
||||
$this->sequences[$this->seqNo - 1] = $this->minDiff;
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
$this->isSequenced = false;
|
||||
}
|
||||
$this->newNameFound = true;
|
||||
|
||||
if ($hasSingleGuard->unique('guard_name_id')->count() == 1)
|
||||
{
|
||||
if (($this->seqNoCnt+1) == count($hasSingleGuard))
|
||||
{
|
||||
//dd("Has 1 Guard and single patrol round (".($this->seqNoCnt+1).") is present");
|
||||
if ($this->guardName)
|
||||
{
|
||||
if ($hasSingleGuard->unique('guard_name_id')->count() == 1) {
|
||||
if (($this->seqNoCnt + 1) == count($hasSingleGuard)) {
|
||||
// dd("Has 1 Guard and single patrol round (".($this->seqNoCnt+1).") is present");
|
||||
if ($this->guardName) {
|
||||
$recordData = [
|
||||
'guard_name' => $this->guardName,
|
||||
'start_time' => $this->startTime,
|
||||
'end_time' => $this->endTime,
|
||||
'lap_time' => $this->labTime,
|
||||
];
|
||||
|
||||
for ($i = 1; $i <= $this->seqNoCnt; $i++) {
|
||||
$recordData["Sequence_$i"] = $this->sequences[$i];
|
||||
$recordData["Sequence_Time_$i"] = $this->seqTimes[$i];
|
||||
}
|
||||
|
||||
$this->records[] = $recordData;
|
||||
}
|
||||
} elseif (($index + 1) == count($hasSingleGuard)) {
|
||||
if ($this->guardName) {
|
||||
$recordData = [
|
||||
'guard_name' => $this->guardName,
|
||||
'start_time' => $this->startTime,
|
||||
@@ -196,30 +219,8 @@ class GuardPatrolEntryDataTable extends Component
|
||||
$this->records[] = $recordData;
|
||||
}
|
||||
}
|
||||
else if (($index+1) == count($hasSingleGuard))
|
||||
{
|
||||
if ($this->guardName)
|
||||
{
|
||||
$recordData = [
|
||||
'guard_name' => $this->guardName,
|
||||
'start_time' => $this->startTime,
|
||||
'end_time' => $this->endTime,
|
||||
'lap_time' => $this->labTime,
|
||||
];
|
||||
|
||||
for ($i = 1; $i <= $this->seqNoCnt; $i++) {
|
||||
$recordData["Sequence_$i"] = $this->sequences[$i];
|
||||
$recordData["Sequence_Time_$i"] = $this->seqTimes[$i];
|
||||
}
|
||||
|
||||
$this->records[] = $recordData;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (($index+1) == count($hasSingleGuard))
|
||||
{
|
||||
if ($this->guardName)
|
||||
{
|
||||
} elseif (($index + 1) == count($hasSingleGuard)) {
|
||||
if ($this->guardName) {
|
||||
$recordData = [
|
||||
'guard_name' => $this->guardName,
|
||||
'start_time' => $this->startTime,
|
||||
@@ -235,26 +236,36 @@ class GuardPatrolEntryDataTable extends Component
|
||||
$this->records[] = $recordData;
|
||||
}
|
||||
}
|
||||
}
|
||||
else // if ($this->seqNo >= 2) {
|
||||
{
|
||||
$this->seqTimes[$this->seqNo-1] = $this->seqTime;
|
||||
if ($checkPointName == $this->startSeqCheckPoints[$this->seqNo]->checkPointNames1->name) {//"CANTEEN"
|
||||
} else { // if ($this->seqNo >= 2) {
|
||||
$this->seqTimes[$this->seqNo - 1] = $this->seqTime;
|
||||
if ($checkPointName == $this->startSeqCheckPoints[$this->seqNo]->checkPointNames1->name) {// "CANTEEN"
|
||||
if ($this->isSequenced) {
|
||||
$this->sequences[$this->seqNo-1] = $this->minDiff;
|
||||
$this->sequences[$this->seqNo - 1] = $this->minDiff;
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
$this->isSequenced = false;
|
||||
}
|
||||
|
||||
if ($hasSingleGuard->unique('guard_name_id')->count() == 1)
|
||||
{
|
||||
if ($this->seqNo == count($hasSingleGuard))
|
||||
{
|
||||
//dd("Has 1 Guard and single patrol round (".($this->seqNoCnt+1).") is present");
|
||||
if ($this->guardName)
|
||||
{
|
||||
if ($hasSingleGuard->unique('guard_name_id')->count() == 1) {
|
||||
if ($this->seqNo == count($hasSingleGuard)) {
|
||||
// dd("Has 1 Guard and single patrol round (".($this->seqNoCnt+1).") is present");
|
||||
if ($this->guardName) {
|
||||
$recordData = [
|
||||
'guard_name' => $this->guardName,
|
||||
'start_time' => $this->startTime,
|
||||
'end_time' => $this->endTime,
|
||||
'lap_time' => $this->labTime,
|
||||
];
|
||||
|
||||
for ($i = 1; $i <= $this->seqNoCnt; $i++) {
|
||||
$recordData["Sequence_$i"] = $this->sequences[$i];
|
||||
$recordData["Sequence_Time_$i"] = $this->seqTimes[$i];
|
||||
}
|
||||
|
||||
$this->records[] = $recordData;
|
||||
}
|
||||
} elseif (($index + 1) == count($hasSingleGuard)) {
|
||||
if ($this->guardName) {
|
||||
$recordData = [
|
||||
'guard_name' => $this->guardName,
|
||||
'start_time' => $this->startTime,
|
||||
@@ -270,30 +281,8 @@ class GuardPatrolEntryDataTable extends Component
|
||||
$this->records[] = $recordData;
|
||||
}
|
||||
}
|
||||
else if (($index+1) == count($hasSingleGuard))
|
||||
{
|
||||
if ($this->guardName)
|
||||
{
|
||||
$recordData = [
|
||||
'guard_name' => $this->guardName,
|
||||
'start_time' => $this->startTime,
|
||||
'end_time' => $this->endTime,
|
||||
'lap_time' => $this->labTime,
|
||||
];
|
||||
|
||||
for ($i = 1; $i <= $this->seqNoCnt; $i++) {
|
||||
$recordData["Sequence_$i"] = $this->sequences[$i];
|
||||
$recordData["Sequence_Time_$i"] = $this->seqTimes[$i];
|
||||
}
|
||||
|
||||
$this->records[] = $recordData;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (($index+1) == count($hasSingleGuard))
|
||||
{
|
||||
if ($this->guardName)
|
||||
{
|
||||
} elseif (($index + 1) == count($hasSingleGuard)) {
|
||||
if ($this->guardName) {
|
||||
$recordData = [
|
||||
'guard_name' => $this->guardName,
|
||||
'start_time' => $this->startTime,
|
||||
|
||||
@@ -6,15 +6,25 @@ use App\Models\InvoiceValidation;
|
||||
use App\Models\StickerMaster;
|
||||
use Filament\Facades\Filament;
|
||||
use Filament\Notifications\Notification;
|
||||
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 = '';
|
||||
@@ -47,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;
|
||||
|
||||
@@ -176,10 +186,193 @@ 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)
|
||||
// {
|
||||
// $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;
|
||||
|
||||
// $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) {
|
||||
|
||||
// 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;
|
||||
// $stickCount += ($sm->tube_sticker_pump || ($sm->tube_sticker_pumpset != 1 && !$sm->tube_sticker_pump && $sm->pack_slip_pump)) ? 1 : 0;
|
||||
// $stickCount += $sm->tube_sticker_pumpset ? 1 : 0;
|
||||
// }
|
||||
// // Pack slips (only if tube stickers not applied)
|
||||
// elseif ($sm->pack_slip_motor || $sm->pack_slip_pump || $sm->pack_slip_pumpset) {
|
||||
// $stickCount += $sm->pack_slip_motor ? 1 : 0;
|
||||
// $stickCount += $sm->pack_slip_pump ? 1 : 0;
|
||||
// $stickCount += $sm->pack_slip_pumpset ? 1 : 0;
|
||||
// }
|
||||
// }
|
||||
|
||||
// // 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);
|
||||
// });
|
||||
|
||||
// $this->dispatch($onCapFocus ? 'focus-capacitor-input' : 'focus-serial-number');
|
||||
// }
|
||||
|
||||
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;
|
||||
@@ -187,78 +380,189 @@ 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)
|
||||
{
|
||||
$this->plantId = $plantId;
|
||||
@@ -323,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();
|
||||
@@ -339,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;
|
||||
}
|
||||
|
||||
@@ -371,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;
|
||||
@@ -387,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;
|
||||
@@ -413,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',
|
||||
@@ -422,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,
|
||||
@@ -431,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',
|
||||
@@ -480,8 +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');
|
||||
return view('livewire.invoice-data-table', [
|
||||
'records' => $this->invoiceRecords,
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,7 +37,8 @@ class SerialValidationData extends Component
|
||||
'refreshEmptyInvoice' => 'loadEmptyData',
|
||||
'refreshInvoiceData' => 'loadData',
|
||||
'refreshMaterialInvoiceData' => 'loadMaterialData',
|
||||
'openCapacitorModal' => 'showCapacitorInputBox',
|
||||
'focusCapacitor' => 'focusCapacitorInput'
|
||||
//'openCapacitorModal' => 'showCapacitorInputBox',
|
||||
];
|
||||
|
||||
public $capacitorInput = '';
|
||||
@@ -48,6 +49,8 @@ class SerialValidationData extends Component
|
||||
|
||||
public $panel_box_serial_number;
|
||||
|
||||
public $itemcode;
|
||||
|
||||
public string $currentItemCode = '';
|
||||
|
||||
public string $currentSerialNumber = '';
|
||||
@@ -64,6 +67,11 @@ class SerialValidationData extends Component
|
||||
// // $this->showCapacitorInput = false;
|
||||
// }
|
||||
|
||||
public function focusCapacitorInput($itemCode)
|
||||
{
|
||||
$this->dispatch('focus-capacitor-input', itemCode: $itemCode);
|
||||
}
|
||||
|
||||
public function loadCompletedData($invoiceNumber, $plantId, $isSerial)
|
||||
{
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@ class CharacteristicApproverMaster extends Model
|
||||
'plant_id',
|
||||
'machine_id',
|
||||
'machine_name',
|
||||
'characteristic_field',
|
||||
'name1',
|
||||
'mail1',
|
||||
'name2',
|
||||
@@ -23,8 +24,6 @@ class CharacteristicApproverMaster extends Model
|
||||
'duration1',
|
||||
'duration2',
|
||||
'duration3',
|
||||
'characteristic_field',
|
||||
|
||||
'created_at',
|
||||
'updated_at',
|
||||
'created_by',
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 GuardPatrolEntry extends Model
|
||||
{
|
||||
use Prunable;
|
||||
use SoftDeletes;
|
||||
|
||||
protected $fillable = [
|
||||
@@ -27,13 +30,24 @@ class GuardPatrolEntry extends Model
|
||||
|
||||
public function guardNames(): BelongsTo
|
||||
{
|
||||
//return $this->belongsTo(CheckPointName::class);
|
||||
// return $this->belongsTo(CheckPointName::class);
|
||||
return $this->belongsTo(GuardName::class, 'guard_name_id');
|
||||
}
|
||||
|
||||
public function checkPointNames(): BelongsTo
|
||||
{
|
||||
//return $this->belongsTo(CheckPointName::class);
|
||||
// return $this->belongsTo(CheckPointName::class);
|
||||
return $this->belongsTo(CheckPointName::class, 'check_point_name_id');
|
||||
}
|
||||
|
||||
public function prunable(): Builder
|
||||
{
|
||||
// // Start of two months ago (first day of that month)
|
||||
// $startOfTwoMonthsAgo = now()->subMonthsNoOverflow(6)->startOfMonth();
|
||||
// // End of previous month (last day of last month)
|
||||
// $endOfPrevMonth = now()->subMonthNoOverflow()->endOfMonth();
|
||||
|
||||
// return static::whereBetween('created_at', [$startOfTwoMonthsAgo, $endOfPrevMonth]);
|
||||
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,28 +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 InvoiceDataValidation extends Model
|
||||
{
|
||||
use Prunable;
|
||||
use SoftDeletes;
|
||||
|
||||
protected $dates = ['deleted_at'];
|
||||
|
||||
protected $fillable = [
|
||||
"plant_id",
|
||||
"distribution_channel_desc",
|
||||
"customer_code",
|
||||
"document_number",
|
||||
"document_date",
|
||||
"customer_trade_name",
|
||||
"customer_location",
|
||||
"location",
|
||||
"created_at",
|
||||
"created_by",
|
||||
"updated_by",
|
||||
"updated_at"
|
||||
'plant_id',
|
||||
'distribution_channel_desc',
|
||||
'customer_code',
|
||||
'document_number',
|
||||
'document_date',
|
||||
'customer_trade_name',
|
||||
'customer_location',
|
||||
'location',
|
||||
'remark',
|
||||
'created_at',
|
||||
'created_by',
|
||||
'updated_by',
|
||||
'updated_at',
|
||||
];
|
||||
|
||||
public function plant(): BelongsTo
|
||||
@@ -31,4 +36,8 @@ class InvoiceDataValidation extends Model
|
||||
return $this->belongsTo(Plant::class);
|
||||
}
|
||||
|
||||
public function prunable(): Builder
|
||||
{
|
||||
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,27 +2,37 @@
|
||||
|
||||
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'];
|
||||
|
||||
protected $fillable = [
|
||||
"plant_id",
|
||||
"qr_code",
|
||||
"scanned_at",
|
||||
"scanned_by",
|
||||
"created_at",
|
||||
"created_by",
|
||||
"updated_by",
|
||||
"updated_at"
|
||||
'plant_id',
|
||||
'qr_code',
|
||||
'scanned_at',
|
||||
'scanned_by',
|
||||
'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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 WeightValidation extends Model
|
||||
{
|
||||
use Prunable;
|
||||
use SoftDeletes;
|
||||
|
||||
protected $fillable = [
|
||||
@@ -22,6 +25,8 @@ class WeightValidation extends Model
|
||||
'bundle_number',
|
||||
'picked_weight',
|
||||
'scanned_by',
|
||||
'created_at',
|
||||
'updated_at',
|
||||
];
|
||||
|
||||
public function plant(): BelongsTo
|
||||
@@ -33,4 +38,13 @@ class WeightValidation extends Model
|
||||
{
|
||||
return $this->belongsTo(Item::class);
|
||||
}
|
||||
|
||||
public function prunable(): Builder
|
||||
{
|
||||
// $startOfTwoMonthsAgo = now()->subMonthsNoOverflow(3)->startOfMonth();
|
||||
// $endOfPrevMonth = now()->subMonthNoOverflow()->endOfMonth();
|
||||
|
||||
// return static::whereBetween('created_at', [$startOfTwoMonthsAgo, $endOfPrevMonth]);
|
||||
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
|
||||
}
|
||||
}
|
||||
|
||||
61
app/Observers/RequestCharacteristicObserver.php
Normal file
61
app/Observers/RequestCharacteristicObserver.php
Normal file
@@ -0,0 +1,61 @@
|
||||
<?php
|
||||
|
||||
namespace App\Observers;
|
||||
|
||||
use App\Jobs\SendApprover1MailJob;
|
||||
use App\Models\RequestCharacteristic;
|
||||
use App\Models\CharacteristicApproverMaster;
|
||||
use App\Mail\CharacteristicApprovalMail;
|
||||
use Illuminate\Support\Facades\Mail;
|
||||
|
||||
class RequestCharacteristicObserver
|
||||
{
|
||||
/**
|
||||
* Handle the RequestCharacteristic "created" event.
|
||||
*/
|
||||
public function created(RequestCharacteristic $request): void
|
||||
{
|
||||
// Only if all statuses are NULL
|
||||
if (
|
||||
!is_null($request->approver_status1) ||
|
||||
!is_null($request->approver_status2) ||
|
||||
!is_null($request->approver_status3)
|
||||
) {
|
||||
return;
|
||||
}
|
||||
|
||||
SendApprover1MailJob::dispatch($request);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle the RequestCharacteristic "updated" event.
|
||||
*/
|
||||
public function updated(RequestCharacteristic $requestCharacteristic): void
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle the RequestCharacteristic "deleted" event.
|
||||
*/
|
||||
public function deleted(RequestCharacteristic $requestCharacteristic): void
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle the RequestCharacteristic "restored" event.
|
||||
*/
|
||||
public function restored(RequestCharacteristic $requestCharacteristic): void
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle the RequestCharacteristic "force deleted" event.
|
||||
*/
|
||||
public function forceDeleted(RequestCharacteristic $requestCharacteristic): void
|
||||
{
|
||||
//
|
||||
}
|
||||
}
|
||||
192
config/livewire.php
Normal file
192
config/livewire.php
Normal file
@@ -0,0 +1,192 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|---------------------------------------------------------------------------
|
||||
| Class Namespace
|
||||
|---------------------------------------------------------------------------
|
||||
|
|
||||
| This value sets the root class namespace for Livewire component classes in
|
||||
| your application. This value will change where component auto-discovery
|
||||
| finds components. It's also referenced by the file creation commands.
|
||||
|
|
||||
*/
|
||||
|
||||
'class_namespace' => 'App\\Livewire',
|
||||
|
||||
/*
|
||||
|---------------------------------------------------------------------------
|
||||
| View Path
|
||||
|---------------------------------------------------------------------------
|
||||
|
|
||||
| This value is used to specify where Livewire component Blade templates are
|
||||
| stored when running file creation commands like `artisan make:livewire`.
|
||||
| It is also used if you choose to omit a component's render() method.
|
||||
|
|
||||
*/
|
||||
|
||||
'view_path' => resource_path('views/livewire'),
|
||||
|
||||
/*
|
||||
|---------------------------------------------------------------------------
|
||||
| Layout
|
||||
|---------------------------------------------------------------------------
|
||||
| The view that will be used as the layout when rendering a single component
|
||||
| as an entire page via `Route::get('/post/create', CreatePost::class);`.
|
||||
| In this case, the view returned by CreatePost will render into $slot.
|
||||
|
|
||||
*/
|
||||
|
||||
'layout' => 'components.layouts.app',
|
||||
|
||||
/*
|
||||
|---------------------------------------------------------------------------
|
||||
| Lazy Loading Placeholder
|
||||
|---------------------------------------------------------------------------
|
||||
| Livewire allows you to lazy load components that would otherwise slow down
|
||||
| the initial page load. Every component can have a custom placeholder or
|
||||
| you can define the default placeholder view for all components below.
|
||||
|
|
||||
*/
|
||||
|
||||
'lazy_placeholder' => null,
|
||||
|
||||
/*
|
||||
|---------------------------------------------------------------------------
|
||||
| Temporary File Uploads
|
||||
|---------------------------------------------------------------------------
|
||||
|
|
||||
| Livewire handles file uploads by storing uploads in a temporary directory
|
||||
| before the file is stored permanently. All file uploads are directed to
|
||||
| a global endpoint for temporary storage. You may configure this below:
|
||||
|
|
||||
*/
|
||||
|
||||
// 'temporary_file_upload' => [
|
||||
// 'disk' => null, // Example: 'local', 's3' | Default: 'default'
|
||||
// 'rules' => null, // Example: ['file', 'mimes:png,jpg'] | Default: ['required', 'file', 'max:12288'] (12MB)
|
||||
// 'directory' => null, // Example: 'tmp' | Default: 'livewire-tmp'
|
||||
// 'middleware' => null, // Example: 'throttle:5,1' | Default: 'throttle:60,1'
|
||||
// 'preview_mimes' => [ // Supported file types for temporary pre-signed file URLs...
|
||||
// 'png', 'gif', 'bmp', 'svg', 'wav', 'mp4',
|
||||
// 'mov', 'avi', 'wmv', 'mp3', 'm4a',
|
||||
// 'jpg', 'jpeg', 'mpga', 'webp', 'wma',
|
||||
// ],
|
||||
// 'max_upload_time' => 5, // Max duration (in minutes) before an upload is invalidated...
|
||||
// 'cleanup' => true, // Should cleanup temporary uploads older than 24 hrs...
|
||||
// ],
|
||||
|
||||
|
||||
|
||||
'temporary_file_upload' => [
|
||||
'max_upload_file_size' => 20480, // 20 MB
|
||||
],
|
||||
|
||||
/*
|
||||
|---------------------------------------------------------------------------
|
||||
| Render On Redirect
|
||||
|---------------------------------------------------------------------------
|
||||
|
|
||||
| This value determines if Livewire will run a component's `render()` method
|
||||
| after a redirect has been triggered using something like `redirect(...)`
|
||||
| Setting this to true will render the view once more before redirecting
|
||||
|
|
||||
*/
|
||||
|
||||
'render_on_redirect' => false,
|
||||
|
||||
/*
|
||||
|---------------------------------------------------------------------------
|
||||
| Eloquent Model Binding
|
||||
|---------------------------------------------------------------------------
|
||||
|
|
||||
| Previous versions of Livewire supported binding directly to eloquent model
|
||||
| properties using wire:model by default. However, this behavior has been
|
||||
| deemed too "magical" and has therefore been put under a feature flag.
|
||||
|
|
||||
*/
|
||||
|
||||
'legacy_model_binding' => false,
|
||||
|
||||
/*
|
||||
|---------------------------------------------------------------------------
|
||||
| Auto-inject Frontend Assets
|
||||
|---------------------------------------------------------------------------
|
||||
|
|
||||
| By default, Livewire automatically injects its JavaScript and CSS into the
|
||||
| <head> and <body> of pages containing Livewire components. By disabling
|
||||
| this behavior, you need to use @livewireStyles and @livewireScripts.
|
||||
|
|
||||
*/
|
||||
|
||||
'inject_assets' => true,
|
||||
|
||||
/*
|
||||
|---------------------------------------------------------------------------
|
||||
| Navigate (SPA mode)
|
||||
|---------------------------------------------------------------------------
|
||||
|
|
||||
| By adding `wire:navigate` to links in your Livewire application, Livewire
|
||||
| will prevent the default link handling and instead request those pages
|
||||
| via AJAX, creating an SPA-like effect. Configure this behavior here.
|
||||
|
|
||||
*/
|
||||
|
||||
'navigate' => [
|
||||
'show_progress_bar' => true,
|
||||
'progress_bar_color' => '#2299dd',
|
||||
],
|
||||
|
||||
/*
|
||||
|---------------------------------------------------------------------------
|
||||
| HTML Morph Markers
|
||||
|---------------------------------------------------------------------------
|
||||
|
|
||||
| Livewire intelligently "morphs" existing HTML into the newly rendered HTML
|
||||
| after each update. To make this process more reliable, Livewire injects
|
||||
| "markers" into the rendered Blade surrounding @if, @class & @foreach.
|
||||
|
|
||||
*/
|
||||
|
||||
'inject_morph_markers' => true,
|
||||
|
||||
/*
|
||||
|---------------------------------------------------------------------------
|
||||
| Smart Wire Keys
|
||||
|---------------------------------------------------------------------------
|
||||
|
|
||||
| Livewire uses loops and keys used within loops to generate smart keys that
|
||||
| are applied to nested components that don't have them. This makes using
|
||||
| nested components more reliable by ensuring that they all have keys.
|
||||
|
|
||||
*/
|
||||
|
||||
'smart_wire_keys' => false,
|
||||
|
||||
/*
|
||||
|---------------------------------------------------------------------------
|
||||
| Pagination Theme
|
||||
|---------------------------------------------------------------------------
|
||||
|
|
||||
| When enabling Livewire's pagination feature by using the `WithPagination`
|
||||
| trait, Livewire will use Tailwind templates to render pagination views
|
||||
| on the page. If you want Bootstrap CSS, you can specify: "bootstrap"
|
||||
|
|
||||
*/
|
||||
|
||||
'pagination_theme' => 'tailwind',
|
||||
|
||||
/*
|
||||
|---------------------------------------------------------------------------
|
||||
| Release Token
|
||||
|---------------------------------------------------------------------------
|
||||
|
|
||||
| This token is stored client-side and sent along with each request to check
|
||||
| a users session to see if a new release has invalidated it. If there is
|
||||
| a mismatch it will throw an error and prompt for a browser refresh.
|
||||
|
|
||||
*/
|
||||
|
||||
'release_token' => 'a',
|
||||
];
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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) {
|
||||
// //
|
||||
// });
|
||||
}
|
||||
};
|
||||
@@ -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) {
|
||||
// //
|
||||
// });
|
||||
}
|
||||
};
|
||||
@@ -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>
|
||||
|
||||
@@ -18,9 +18,29 @@
|
||||
@endif
|
||||
@endif
|
||||
</h2>
|
||||
<div class="mt-2">
|
||||
|
||||
<!-- Serial Number Search Bar -->
|
||||
|
||||
{{-- <div class="flex items-center space-x-2">
|
||||
<input
|
||||
type="text"
|
||||
wire:model.debounce.500ms="serialSearch"
|
||||
placeholder="Check Serial Number..."
|
||||
class="border border-gray-300 rounded px-3 py-1 focus:ring-1 focus:ring-indigo-500 focus:border-indigo-500"
|
||||
/>
|
||||
<button
|
||||
wire:click="checkSerialNumber"
|
||||
class="bg-indigo-600 text-white px-3 py-1 rounded hover:bg-indigo-700"
|
||||
>
|
||||
Search
|
||||
</button>
|
||||
</div> --}}
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<div class="mt-2">
|
||||
<hr class="border-t-2 border-gray-300">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{-- Modal for completed invoice--}}
|
||||
@@ -44,11 +64,11 @@
|
||||
@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"> --}}
|
||||
<table class="min-w-full text-sm text-center border border-gray-300">
|
||||
<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">
|
||||
<table class="min-w-full 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>
|
||||
@@ -61,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>
|
||||
@@ -78,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>
|
||||
@@ -91,6 +113,61 @@
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
@endif --}}
|
||||
|
||||
|
||||
@if ($hasSearched)
|
||||
<div class="overflow-x-auto" style="height: 385px;">
|
||||
<table class="min-w-full text-sm text-center border border-gray-300">
|
||||
<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>
|
||||
<th class="border px-4 py-2">Serial Number</th>
|
||||
<th class="border px-4 py-2">Motor Scanned Status</th>
|
||||
<th class="border px-4 py-2">Pump Scanned Status</th>
|
||||
<th class="border px-4 py-2">Capacitor Scanned Status</th>
|
||||
<th class="border px-4 py-2">Scanned Status Set</th>
|
||||
<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>
|
||||
</thead>
|
||||
|
||||
<tbody>
|
||||
@forelse ($records as $index => $record)
|
||||
<tr wire:key="inv-{{ $record->id }}" class="border-t">
|
||||
<td class="border px-2 py-2">{{ $records->firstItem() + $index }}</td>
|
||||
<td class="border px-2 py-2">{{ $record->stickerMasterRelation?->item?->code ?? 'N/A' }}</td>
|
||||
<td class="border px-2 py-2">{{ $record->serial_number ?? 'N/A' }}</td>
|
||||
<td class="border px-2 py-2">{{ $record->motor_scanned_status ? '1' : '' }}</td>
|
||||
<td class="border px-2 py-2">{{ $record->pump_scanned_status ? '1' : '' }}</td>
|
||||
<td class="border px-2 py-2">{{ $record->capacitor_scanned_status ? '1' : '' }}</td>
|
||||
<td class="border px-2 py-2">{{ $record->scanned_status_set ? '1' : '' }}</td>
|
||||
<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>
|
||||
@empty
|
||||
<tr>
|
||||
<td colspan="12" class="py-4 text-gray-500">
|
||||
No data found for invoice <strong>{{ $invoiceNumber }}</strong>
|
||||
</td>
|
||||
</tr>
|
||||
@endforelse
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="mt-3 flex justify-center">
|
||||
{{ $records->onEachSide(3)->links() }}
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
{{-- Modal for Capacitor Input --}}
|
||||
@@ -128,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>
|
||||
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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')
|
||||
|
||||
Reference in New Issue
Block a user