Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 12s
Gemini PR Review / review (pull_request) Failing after 29s
Laravel Pint / pint (pull_request) Successful in 2m16s
Laravel Larastan / larastan (pull_request) Failing after 3m17s
405 lines
17 KiB
PHP
405 lines
17 KiB
PHP
<?php
|
|
|
|
namespace App\Livewire;
|
|
|
|
use App\Models\InvoiceValidation;
|
|
use App\Models\StickerMaster;
|
|
use Filament\Facades\Filament;
|
|
use Filament\Notifications\Notification;
|
|
use Livewire\Component;
|
|
use Str;
|
|
|
|
class InvoiceDataTable extends Component
|
|
{
|
|
public $invoiceData = [];
|
|
|
|
public $plantId = 0;
|
|
|
|
public $packageCount = 0;
|
|
|
|
public string $invoiceNumber = '';
|
|
|
|
public bool $completedInvoice = false;
|
|
|
|
public bool $isSerial = false;
|
|
|
|
public bool $onCapFocus = false;
|
|
|
|
public bool $emptyInvoice = false;
|
|
|
|
public bool $hasSearched = false;
|
|
|
|
public bool $materialInvoice = false;
|
|
|
|
public bool $showCapacitorInput = false;
|
|
|
|
// protected $listeners = ['refreshInvoiceData' => 'loadData',];
|
|
|
|
protected $listeners = [
|
|
'refreshCompletedInvoice' => 'loadCompletedData',
|
|
'refreshEmptyInvoice' => 'loadEmptyData',
|
|
'refreshInvoiceData' => 'loadData',
|
|
'refreshMaterialInvoiceData' => 'loadMaterialData',
|
|
'openCapacitorModal' => 'showCapacitorInputBox',
|
|
];
|
|
|
|
public $capacitorInput = '';
|
|
|
|
public $panel_box_supplier;
|
|
|
|
public $panel_box_item_code;
|
|
|
|
public $panel_box_serial_number;
|
|
|
|
public string $currentItemCode = '';
|
|
|
|
public string $currentSerialNumber = '';
|
|
|
|
public function loadCompletedData($invoiceNumber, $plantId, $isSerial)
|
|
{
|
|
$this->plantId = $plantId;
|
|
$this->invoiceNumber = $invoiceNumber;
|
|
$this->completedInvoice = true;
|
|
$this->isSerial = $isSerial;
|
|
$this->onCapFocus = false;
|
|
$this->emptyInvoice = false;
|
|
$this->hasSearched = false;
|
|
$this->materialInvoice = false;
|
|
$this->packageCount = 0;
|
|
// $this->showCapacitorInput = false;
|
|
$this->dispatch('focus-invoice-number');
|
|
}
|
|
|
|
public function loadEmptyData($invoiceNumber, $plantId)
|
|
{
|
|
$this->plantId = $plantId;
|
|
$this->invoiceNumber = $invoiceNumber;
|
|
$this->completedInvoice = false;
|
|
$this->onCapFocus = false;
|
|
$this->emptyInvoice = true;
|
|
$this->hasSearched = false;
|
|
$this->materialInvoice = false;
|
|
$this->packageCount = 0;
|
|
// $this->showCapacitorInput = false;
|
|
}
|
|
|
|
public function loadData($invoiceNumber, $plantId, $onCapFocus)
|
|
{
|
|
$this->plantId = $plantId;
|
|
$this->invoiceNumber = $invoiceNumber;
|
|
$this->completedInvoice = false;
|
|
$this->isSerial = true;
|
|
$this->onCapFocus = $onCapFocus;
|
|
$this->emptyInvoice = false;
|
|
$this->hasSearched = true;
|
|
$this->materialInvoice = false;
|
|
// $this->showCapacitorInput = false;
|
|
|
|
// ->where('serial_number', '!=', '')
|
|
$this->invoiceData = InvoiceValidation::where('invoice_number', $this->invoiceNumber)
|
|
->where('plant_id', $plantId)->where('scanned_status', null)
|
|
->get()
|
|
->map(function ($record) {
|
|
return [
|
|
'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,
|
|
];
|
|
})
|
|
->toArray();
|
|
|
|
$this->packageCount = 0;
|
|
|
|
// Loop through and replace 'code' using related StickerMaster > Item > code
|
|
foreach ($this->invoiceData as &$row) {
|
|
$stickCount = 0;
|
|
$scannedCount = 0;
|
|
|
|
// $stickerMaster = \App\Models\StickerMaster::with('item')->find($row['sticker_master_id'] ?? null);
|
|
$row['code'] = StickerMaster::with('item')->find($row['sticker_master_id'] ?? null)?->item?->code ?? 'N/A';
|
|
$curStick = StickerMaster::where('id', $row['sticker_master_id'])->first();
|
|
if ($curStick) {
|
|
if (Str::length($curStick->panel_box_code) > 0) {
|
|
$stickCount++;
|
|
}
|
|
if ($curStick->tube_sticker_motor == 1 || $curStick->tube_sticker_pump == 1 || $curStick->tube_sticker_pumpset == 1) {
|
|
if ($curStick->tube_sticker_motor == 1) {
|
|
$stickCount++;
|
|
}
|
|
if ($curStick->tube_sticker_pump == 1 || ($curStick->tube_sticker_pumpset != 1 && $curStick->tube_sticker_pump != 1 && $curStick->pack_slip_pump == 1)) {
|
|
$stickCount++;
|
|
}
|
|
if ($curStick->tube_sticker_pumpset == 1) {
|
|
$stickCount++;
|
|
}
|
|
} elseif ($curStick->pack_slip_motor == 1 || $curStick->pack_slip_pump == 1 || $curStick->pack_slip_pumpset == 1) {
|
|
if ($curStick->pack_slip_motor == 1) {
|
|
$stickCount++;
|
|
}
|
|
if ($curStick->pack_slip_pump == 1) {
|
|
$stickCount++;
|
|
}
|
|
if ($curStick->pack_slip_pumpset == 1) {
|
|
$stickCount++;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($row['motor_scanned_status'] == 1) {
|
|
$scannedCount++;
|
|
}
|
|
if ($row['pump_scanned_status'] == 1) {
|
|
$scannedCount++;
|
|
}
|
|
if ($row['capacitor_scanned_status'] == 1) {
|
|
$scannedCount++;
|
|
}
|
|
if ($row['scanned_status_set'] == 1) {
|
|
$scannedCount++;
|
|
}
|
|
|
|
$this->packageCount += $stickCount - $scannedCount;
|
|
}
|
|
|
|
if ($onCapFocus) {
|
|
$this->dispatch('focus-capacitor-input');
|
|
} else {
|
|
$this->dispatch('focus-serial-number');
|
|
}
|
|
}
|
|
|
|
public function loadMaterialData($invoiceNumber, $plantId)
|
|
{
|
|
$this->plantId = $plantId;
|
|
$this->invoiceNumber = $invoiceNumber;
|
|
$this->completedInvoice = false;
|
|
$this->isSerial = false;
|
|
$this->onCapFocus = false;
|
|
$this->emptyInvoice = false;
|
|
$this->hasSearched = false;
|
|
$this->materialInvoice = true;
|
|
// $this->showCapacitorInput = false;
|
|
|
|
// ->where('serial_number', '!=', '')
|
|
$this->invoiceData = InvoiceValidation::where('invoice_number', $this->invoiceNumber)->where('plant_id', $plantId)->where('serial_number', null)
|
|
->get()
|
|
->map(function ($record) {
|
|
return [
|
|
'sticker_master_id' => $record->sticker_master_id,
|
|
// 'material_type' => StickerMaster::where('id', $record->sticker_master_id)->first()->material_type ?? '',
|
|
'quantity' => $record->quantity ?? '',
|
|
'serial_number' => $record->serial_number ?? '',
|
|
'batch_number' => $record->batch_number ?? '',
|
|
'created_at' => $record->created_at,
|
|
'operator_id' => $record->operator_id,
|
|
];
|
|
})
|
|
->toArray();
|
|
|
|
// Loop through and replace 'code' using related StickerMaster > Item > code
|
|
foreach ($this->invoiceData as &$row) {
|
|
// $stickerMaster = \App\Models\StickerMaster::with('item')->find($row['sticker_master_id'] ?? null);
|
|
$row['code'] = StickerMaster::with('item')->find($row['sticker_master_id'] ?? null)?->item?->code ?? 'N/A';
|
|
$matType = StickerMaster::where('id', $row['sticker_master_id'] ?? null)->first()->material_type ?? '';
|
|
if ($matType === 1) {
|
|
$row['material_type'] = 'Individual';
|
|
} elseif ($matType === 2) {
|
|
$row['material_type'] = 'Bundle';
|
|
} elseif ($matType === 3) {
|
|
$row['material_type'] = 'Quantity';
|
|
} else {
|
|
$row['material_type'] = 'N/A';
|
|
}
|
|
}
|
|
$this->dispatch('focus-serial-number');
|
|
}
|
|
|
|
public function showCapacitorInputBox($itemCode, $serialNumber, $plantId)
|
|
{
|
|
$this->plantId = $plantId;
|
|
$this->currentItemCode = $itemCode;
|
|
$this->currentSerialNumber = $serialNumber;
|
|
$this->showCapacitorInput = true;
|
|
// $this->capacitorInput = '';
|
|
$this->completedInvoice = false;
|
|
$this->isSerial = true;
|
|
$this->onCapFocus = false;
|
|
$this->emptyInvoice = false;
|
|
$this->hasSearched = false;
|
|
$this->materialInvoice = false;
|
|
$this->dispatch('focus-capacitor-input');
|
|
}
|
|
|
|
public function cancelCapacitorInput()
|
|
{
|
|
$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 code to proceed!')
|
|
->danger()
|
|
// ->duration(3000)
|
|
->seconds(2)
|
|
->send();
|
|
|
|
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_item_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;
|
|
});
|
|
|
|
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 = 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 render()
|
|
{
|
|
return view('livewire.invoice-data-table');
|
|
}
|
|
}
|