Files
2026-09-16 23:20:08 +07:00

99 lines
3.4 KiB
PHP

<?php
namespace App\Models;
/**
* Class Payment
* POS Billing & Cashier Payment Model (PromptPay QR / Receipt / Tax Invoice)
*
* @package App\Models
*/
class Payment extends Model
{
protected string $table = 'payments';
/**
* Generate Receipt Number e.g. REC-202607-0001
*/
public function generateReceiptNo(int $branchId): string
{
$prefix = "REC-" . date('Ym') . "-";
$sql = "SELECT COUNT(*) as cnt FROM `{$this->table}`
WHERE `branch_id` = :bid AND `receipt_no` LIKE :pfx";
$stmt = self::getDB()->prepare($sql);
$stmt->execute(['bid' => $branchId, 'pfx' => "%{$prefix}%"]);
$row = $stmt->fetch();
$nextNum = ((int)($row['cnt'] ?? 0)) + 1;
return sprintf("%s%04d", $prefix, $nextNum);
}
/**
* Generate Tax Invoice Number e.g. TAX-202607-0001
*/
public function generateTaxInvoiceNo(int $branchId): string
{
$prefix = "TAX-" . date('Ym') . "-";
$sql = "SELECT COUNT(*) as cnt FROM `{$this->table}`
WHERE `branch_id` = :bid AND `tax_invoice_no` LIKE :pfx";
$stmt = self::getDB()->prepare($sql);
$stmt->execute(['bid' => $branchId, 'pfx' => "%{$prefix}%"]);
$row = $stmt->fetch();
$nextNum = ((int)($row['cnt'] ?? 0)) + 1;
return sprintf("%s%04d", $prefix, $nextNum);
}
/**
* Process Checkout & Issue Receipt
*/
public function processCheckout(array $data): array
{
$branchId = (int)$data['branch_id'];
$receiptNo = $this->generateReceiptNo($branchId);
$taxNo = !empty($data['request_tax_invoice']) ? $this->generateTaxInvoiceNo($branchId) : null;
$subtotal = (float)$data['subtotal'];
$discount = (float)($data['discount'] ?? 0.00);
$netAmount = max(0.00, $subtotal - $discount);
$method = $data['payment_method'] ?? 'Cash';
$status = 'Paid';
// Generate PromptPay Ref ID if method is PromptPay
$ppRef = ($method === 'PromptPay') ? ('PP-' . date('ymd') . rand(100000, 999999)) : null;
$paymentId = $this->create([
'queue_id' => (int)$data['queue_id'],
'patient_id' => (int)$data['patient_id'],
'branch_id' => $branchId,
'receipt_no' => $receiptNo,
'tax_invoice_no' => $taxNo,
'subtotal' => $subtotal,
'discount' => $discount,
'net_amount' => $netAmount,
'payment_method' => $method,
'payment_status' => $status,
'promptpay_ref' => $ppRef,
'paid_at' => date('Y-m-d H:i:s'),
'cashier_id' => (int)$data['cashier_id'],
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
]);
// อัปเดตสถานะคิวเป็น Completed เมื่อชำระเงินเรียบร้อย
(new Queue())->update((int)$data['queue_id'], [
'status' => 'Completed',
'actual_end_time' => date('Y-m-d H:i:s'),
]);
return [
'payment_id' => $paymentId,
'receipt_no' => $receiptNo,
'tax_invoice_no' => $taxNo,
'net_amount' => $netAmount,
'payment_method' => $method,
'promptpay_ref' => $ppRef,
'paid_at' => date('Y-m-d H:i:s'),
];
}
}