สมอง BC

คลังความรู้ / ระบบงานในชุด BC

#systems#pos#payment#promptpay#cash

การชำระเงินที่จอ 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) แอปไม่ได้สั่งเครื่องรูดบัตรหรือรับผลจากเครื่องรูดบัตร (ในโค้ดแอปไม่มีการเชื่อมต่อกับเครื่องรูดบัตร)

หลังกดยืนยัน

  1. processPayment ตั้งเลขที่บิล เวลา ข้อมูลการชำระ แล้วบันทึกเข้าคิวรอส่ง (ดู ขั้นตอนขายสินค้าที่จอแคชเชียร์ ตั้งแต่ยิงบาร์โค้ดถึงปิดบิล (sys-pos-sale-flow) ขั้นตอนปิดบิล และ การซิงก์ฝั่งแอป POS ส่งบิลขึ้น ดึงข้อมูลลง และลองใหม่ (sys-pos-sync-client))
  2. ถ้าออกบิลไม่ได้ (ยังไม่เชื่อมเครื่อง หรือยังไม่ได้รูปแบบเลขที่บิล) หน้าต่างไม่ปิด และแสดงข้อความสาเหตุสีแดง (payment_dialog.dart:103-111, pos_provider.dart:1105-1115)
  3. สำเร็จ → ปิดหน้าต่างชำระ → เปิดใบเสร็จรับเงิน (ใบเสร็จ POS การพิมพ์ซ้ำ และการอัปโหลดรูปสลิป (sys-pos-receipt-printing)) พร้อมประกาศเสียง (รับเงิน เงินทอน) บนเว็บ

ที่มาในโค้ด