Files
portal-api/app/Support/InvoiceLookup.php

73 lines
2.5 KiB
PHP

<?php
namespace App\Support;
use App\Enums\Invoice\InvoiceStatus;
use App\Models\Invoice;
class InvoiceLookup
{
public static function find(string $invoiceNumber, string $lookupCode): ?Invoice
{
$invoice = Invoice::query()
->where('invoice_number', $invoiceNumber)
->where('status', '!=', InvoiceStatus::CANCELLED->value)
->first();
if (!$invoice || !hash_equals((string) $invoice->lookup_code, strtoupper(trim($lookupCode)))) {
return null;
}
return $invoice;
}
public static function emailRow(Invoice $invoice): string
{
return $invoice->lookup_code ? EmailTemplateShell::row('Mã tra cứu', '<strong>' . e($invoice->lookup_code) . '</strong>') : '';
}
public static function emailNote(Invoice $invoice): string
{
if (!$invoice->lookup_code) {
return '';
}
$url = MailGlobals::frontendUrl() . '/tra-cuu-hoa-don';
return EmailTemplateShell::paragraph(
'Quý khách có thể tra cứu và tải hoá đơn tại <a href="' . e($url) . '">' . e($url) . '</a> bằng số hoá đơn <strong>'
. e($invoice->invoice_number) . '</strong> và mã tra cứu <strong>' . e($invoice->lookup_code) . '</strong>.'
);
}
public static function payload(Invoice $invoice): array
{
$invoice->loadMissing(['invoiceItems', 'customer']);
$buyer = InvoiceBuyer::forInvoice($invoice);
return [
'invoice_number' => $invoice->invoice_number,
'vat_serial' => $invoice->vat_serial,
'vat_number' => $invoice->vat_number,
'vat_issued_at' => $invoice->vat_issued_at?->toDateString(),
'date' => $invoice->date?->toDateString(),
'status' => $invoice->status,
'status_text' => $invoice->status_label,
'sub_total' => (int) $invoice->sub_total,
'discount_amount' => (int) $invoice->discount_amount,
'tax' => (int) $invoice->tax,
'total' => (int) $invoice->total,
'buyer' => [
'company' => $buyer['company'],
'tax_code' => $buyer['tax_code'],
],
'items' => $invoice->invoiceItems->map(fn ($item) => [
'description' => $item->description,
'quantity' => (float) ($item->quantity ?? 1),
'unit_price' => (int) $item->unit_price,
'total_price' => (int) $item->total_price,
])->values(),
];
}
}