การชำระเงินที่จอ POS
หน้าต่างชำระเงิน (PaymentDialog) มี 3 แท็บ: "เงินสด (Cash)" · "พร้อมเพย์ QR" · "โอน/บัตรเครดิต" (payment_dialog.dart:217-219) ปุ่มใหญ่ "ชำระเงิน" เปิดแท็บเงินสด ปุ่มด่วน QR และบัตรเปิดแท็บของตัวเอง (cart_panel.dart:804-835,890-952) เมื่อเปิดหน้าต่างระบบจะพูดแจ้งยอดรวมทั้งสิ้น (เฉพาะรัน Flutter Web, ดู โครงสร้างแอปแคชเชียร์ BC Ai POS (Flutter) และหน้าจอขาย (sys-pos-app-structure)) ใน ระบบ POS ขายหน้าร้าน ภาพรวม การเปิดใช้ และแผนที่บันทึก (sys-pos-overview) มีภาพรวมทั้งระบบ
ชนิดการชำระเงิน
แอปรองรับ 4 ชนิดตามค่า PaymentType และแปลงเป็นรหัสที่ส่งไปเซิร์ฟเวอร์ (pos_bill.dart:4, pos_provider.dart:1192-1197):
| ชนิดในแอป | ป้ายบนใบเสร็จ | รหัสที่ส่ง (payments[].method) |
|---|---|---|
cash |
เงินสด | CASH |
promptPay |
พร้อมเพย์ QR | PROMPTPAY |
bankTransfer |
โอนเงิน | TRANSFER |
creditCard |
บัตรเครดิต | CARD |
หนึ่งบิลมีการชำระได้รายการเดียว (รายการ payments มีแถวเดียวเสมอ, pos_provider.dart:1186-1188) ไม่มีการแบ่งจ่ายหลายวิธี การบันทึกฝั่งเซิร์ฟเวอร์ดู POS รับบิลขายจากเครื่องแคชเชียร์ กล่องรับบิล/ประมวลผล/ยกเลิก/ตัดสต็อกเป็นชุด (POS Bill Inbox)
แท็บเงินสด
- ช่อง "รับเงินมา (Tendered)" เริ่มต้นเท่ากับยอดสุทธิ แสดง "เงินทอน (Change)" ทันที (สีเขียวเมื่อรับพอ สีแดงเมื่อรับไม่พอ) (
payment_dialog.dart:30-33,246-300) - ปุ่มลัด: "พอดี" (เท่ายอดสุทธิ) 1,000 / 500 / 100 / 50 / 20 บาท (ตั้งยอดรับเงินเท่าค่านั้น) และ +100 / +500 (บวกเพิ่มจากยอดที่มี) (
payment_dialog.dart:335-348) - ถ้าเงินที่รับน้อยกว่ายอดสุทธิ แจ้ง "จำนวนเงินที่รับมาน้อยกว่ายอดชำระ" และไม่บันทึกบิล (
payment_dialog.dart:76-85) - เงินทอนคำนวณในแอป (
รับ - ยอดสุทธิ) เก็บในข้อมูลการชำระของบิลและพิมพ์บนใบเสร็จ (pos_provider.dart:1119-1130)
แท็บพร้อมเพย์ QR
- สร้าง QR มาตรฐาน EMVCo ของพร้อมเพย์จาก "เลขพร้อมเพย์ร้านค้า" ในค่าเครื่อง (ซิงก์มาจากตั้งค่า QR ของ BC Ai Account; เบอร์มือถือ 10 หลักหรือเลข 13 หลัก) และยอดสุทธิของบิล (
app_config.dart:172,promptpay_service.dart:6-35) - เมื่อยอดมากกว่าศูนย์เป็น QR แบบกำหนดยอด (Dynamic) ฝังยอด 2 ทศนิยม สกุลบาท ประเทศ TH และคำนวณ CRC16 (CCITT) ปิดท้าย (
promptpay_service.dart:29-48,50-66) วาดภาพด้วยแพ็กเกจqr_flutter(payment_dialog.dart:396) - แอปไม่ตรวจว่าลูกค้าโอนแล้วจริง ไม่มีการเชื่อมกับธนาคารหรือผู้ให้บริการชำระเงิน แคชเชียร์ดูสลิป/เงินเข้าเองแล้วกดปุ่มยืนยัน (
payment_dialog.dart:410) - ค่าเริ่มต้นของเลขพร้อมเพย์ในแอปคือว่าง (
app_config.dart:46) จึงต้องตั้งในหน้าตั้งค่า QR ให้ซิงก์ลงเครื่อง (ตั้งค่าและควบคุมระบบขายหน้าร้าน POS (PosSetupAndControlScreen))
แท็บโอน/บัตรเครดิต
มีช่อง "เลขที่อ้างอิงสลิป / สลิปโอนเงิน / เลขอนุมัติบัตร" (ไม่บังคับ) และสองปุ่ม "โอนเงินผ่านธนาคาร" กับ "บัตรเครดิต/เดบิต" (payment_dialog.dart:419-470) ยอดที่บันทึกเท่ากับยอดสุทธิพอดี เลขอ้างอิงถูกต่อท้ายหมายเหตุบิลเป็น "อ้างอิงชำระ ..." (pos_provider.dart:1160-1166) แอปไม่ได้สั่งเครื่องรูดบัตรหรือรับผลจากเครื่องรูดบัตร (ในโค้ดแอปไม่มีการเชื่อมต่อกับเครื่องรูดบัตร)
หลังกดยืนยัน
processPaymentตั้งเลขที่บิล เวลา ข้อมูลการชำระ แล้วบันทึกเข้าคิวรอส่ง (ดู ขั้นตอนขายสินค้าที่จอแคชเชียร์ ตั้งแต่ยิงบาร์โค้ดถึงปิดบิล (sys-pos-sale-flow) ขั้นตอนปิดบิล และ การซิงก์ฝั่งแอป POS ส่งบิลขึ้น ดึงข้อมูลลง และลองใหม่ (sys-pos-sync-client))- ถ้าออกบิลไม่ได้ (ยังไม่เชื่อมเครื่อง หรือยังไม่ได้รูปแบบเลขที่บิล) หน้าต่างไม่ปิด และแสดงข้อความสาเหตุสีแดง (
payment_dialog.dart:103-111,pos_provider.dart:1105-1115) - สำเร็จ → ปิดหน้าต่างชำระ → เปิดใบเสร็จรับเงิน (ใบเสร็จ POS การพิมพ์ซ้ำ และการอัปโหลดรูปสลิป (sys-pos-receipt-printing)) พร้อมประกาศเสียง (รับเงิน เงินทอน) บนเว็บ
ที่มาในโค้ด
frontend/pos/lib/ui/widgets/payment_dialog.dart:22-125,217-236,246-470หน้าต่างชำระเงินทั้งสามแท็บfrontend/pos/lib/services/promptpay_service.dart:6-66สร้าง QR และ CRC16frontend/pos/lib/providers/pos_provider.dart:1097-1197บันทึกการชำระและรหัสวิธีชำระ- ดูเพิ่ม: ระบบ POS ขายหน้าร้าน ภาพรวม การเปิดใช้ และแผนที่บันทึก (sys-pos-overview) · ขั้นตอนขายสินค้าที่จอแคชเชียร์ ตั้งแต่ยิงบาร์โค้ดถึงปิดบิล (sys-pos-sale-flow) · ใบเสร็จ POS การพิมพ์ซ้ำ และการอัปโหลดรูปสลิป (sys-pos-receipt-printing) · กะแคชเชียร์ รับ-ส่งเงิน ยกเลิกบิล และกู้คืนข้อมูลเครื่อง POS (sys-pos-shift-cash) · POS รับบิลขายจากเครื่องแคชเชียร์ กล่องรับบิล/ประมวลผล/ยกเลิก/ตัดสต็อกเป็นชุด (POS Bill Inbox) · API จุดขาย POS (POS endpoints /api/v1/pos)