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'), ]; } }