99 lines
3.4 KiB
PHP
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'),
|
|
];
|
|
}
|
|
}
|