#faq#pos#sale#stock#gl
บิลขาย POS เข้าบัญชีและตัดสต็อกอย่างไร
ตอบสั้น: บิลที่เครื่อง POS ส่งมาถูกเก็บลง pos_bill_inbox ก่อน แล้วแปลงเป็นเอกสารขายสด flag 44 ลงบัญชีทันทีด้วยสูตรเดียวกับใบขายสด ส่วนสต็อกและต้นทุนไม่ได้ตัดในจังหวะบันทึก ระบบใส่รหัสสินค้าลงคิว pos_stock_queue แล้วรีบิลด์เป็นชุดหลังประมาณ 2 วินาที
รายละเอียด
ลำดับต่อบิล (ReceivePosBill → processPosBill ใน transaction เดียว):
- รับบิล เก็บ JSON ลง
pos_bill_inboxคีย์bill_guidส่งซ้ำไม่สร้างเอกสารซ้ำ (pos_bill.go:123, handlerpos/sync.go:111) - สร้างเอกสาร
savePosBillTxสร้างic_transเป็นTransType 2,TransFlag 44,InquiryType 1(ขายสด) ตั้งis_pos = 1ทั้งหัวและบรรทัด (pos_bill.go:314,:360-361,:402-405) ราคาในบรรทัดใช้ราคาตอนขายจากเครื่อง - บันทึกการรับเงิน
savePosPaymentTxเขียนcb_transและcb_trans_detailแยกยอดตามวิธีจ่าย (เงินสด, โอน, QR/วอลเล็ต, บัตร) (pos_bill.go:411-412,:424) - ลงบัญชี
rebuildGLTxของ flag 44 (pos_bill.go:415) เพราะเป็นขายสด สูตรจึงแตกบรรทัดเดบิตตามยอดในcb_trans: เงินสดเข้าบัญชีเงินสด, โอนกับ QR/วอลเล็ตเข้าบัญชีธนาคาร, บัตรเข้าบัญชีลูกหนี้ แล้วเครดิตรายได้ขายและภาษีขาย (service.go:2001-2047) ถ้ายอดสามช่องรวมไม่เท่ายอดบิล สูตรจะใช้ช่องทางรับเงินตามปกติแทน (service.go:2017) สูตรนี้ไม่มีบรรทัดต้นทุนขาย ดู ขายสินค้า (ใบกำกับ 44) แล้วลงบัญชี GL อะไรบ้าง - สต็อก บิลตั้ง
deferStock = true(pos_bill.go:368)saveTransTxจึงไม่รีบิลด์สต็อกทันที แต่ใส่รหัสสินค้า (ทั้งของเดิมและใหม่) ลงpos_stock_queue(trans.go:573,pos_bill.go:517) แล้วschedulePosStockDrainรวมบิลที่ทยอยเข้ามาให้รีบิลด์ครั้งเดียวต่อฐานบริษัท หน่วง 2 วินาที (pos_bill.go:682-686) และDrainPosStockดึงจากคิวทีละ 200 รหัสแล้วrebuildStockTx(pos_bill.go:703,:725) - แต้มสมาชิกและคูปอง รีบิลด์ใหม่จากบิลทั้งหมด ไม่ได้บวกลบทีละรายการ (
pos_bill.go:636,:668)
- ผลต่อสต็อก: 44 อยู่ในรายการ flag ที่ตัวนับสต็อกรับ (
stock_rebuild.go:18-19) ยอดคงเหลือและต้นทุนจึงมาจากการรีบิลด์ในคิว ดู คำนวณยอดสต๊อกใหม่ (Rebuild Stock) ทำอะไรบ้าง ต้องกดเมื่อไหร่ และ ต้นทุนสินค้าคิดแบบไหน ถัวเฉลี่ยเคลื่อนที่คำนวณยังไง - ยกเลิกบิล: ตั้ง
cancelled_atบน inbox แล้วประมวลผลบิลซ้ำ (pos_bill.go:575-594)cancelPosBillTxตั้งlast_status = 1ที่ic_trans,ic_trans_detail,cb_trans_detailของใบ 44 (หัวic_transตั้งis_cancel = 1ด้วย) สร้างหัวเอกสาร flag 45 เลขCNM-<เลขบิลเดิม>ที่doc_refชี้บิลเดิม แล้วเรียกรีบิลด์ GL ของบิลเดิม ซึ่งเพราะis_cancel = 1จะลบ journal เดิมออกและไม่สร้างใหม่ (pos_bill.go:601-630,service.go:1413-1440,:1479-1480) ส่วนสต็อก บิลเดิมหลุดจากการนับเมื่อคิวรีบิลด์รอบถัดไปทำงาน การยกเลิกจากเครื่อง POS เรียก actioncancel_bill(pos_config.go:991-997) เทียบกับการยกเลิกใบขายปกติได้ที่ ยกเลิก แก้ไข ลบเอกสาร ต่างกันอย่างไร ผลต่อสต็อกและ GL - ประมวลผลซ้ำ: บิลที่ค้างสถานะผิดพลาดสั่ง
ReprocessPosBillsได้ (pos_bill.go:175) การตั้งค่าเครื่อง กะ และการเงินในกะอยู่ใน POS ตั้งค่าร้าน/เครื่อง/โปรโมชัน และกะขาย รับ-ส่งเงิน (POS Config and Shift) ส่วนการซิงก์ข้อมูลเครื่องอยู่ใน POS ซิงก์ข้อมูลเครื่องแคชเชียร์ ผูกเครื่อง/ดึงส่วนต่าง/กู้คืน/รูปภาพ (POS Device Sync)
ข้อควรระวัง
- บิล POS ที่ส่งมาแล้วสต็อกยังไม่ลด ให้ตรวจก่อนว่ามีรหัสสินค้านั้นค้างใน
pos_stock_queueหรือไม่ การรีบิลด์ที่พลาดไม่ทำให้บิลล้ม รายการยังค้างคิวรอรอบถัดไป (pos_bill.go:703) - เลขที่บิลที่ซ้ำกับใบขาย flag 44 ที่ไม่ใช่บิล POS ของเครื่องเดียวกันจะบันทึกไม่ได้ (
pos_bill.go:372-376) - ยอดรับชำระรวมต้องไม่น้อยกว่ายอดบิลที่เซิร์ฟเวอร์คำนวณ ไม่เช่นนั้นเกิด error "ยอดรับชำระ … น้อยกว่ายอดบิล" (
pos_bill.go:391) และบิลค้างสถานะผิดพลาดใน inbox - ใบ 45 (
CNM-…) ไม่อยู่ในรายการ flag ที่ลง GL (service.go:1731-1745) บิลที่ยกเลิกจึงไม่มีรายการบัญชีเหลือเลย ไม่ได้เก็บคู่กับรายการกลับ ต่างจากคอมเมนต์ที่service.go:1479ที่เขียนว่าเอกสารที่ยกเลิกเก็บ GL ไว้และให้ใบยกเลิกลงรายการกลับ
ดูเพิ่ม
- POS รับบิลขายจากเครื่องแคชเชียร์ กล่องรับบิล/ประมวลผล/ยกเลิก/ตัดสต็อกเป็นชุด (POS Bill Inbox) · แท็บรับ/จ่ายชำระ (เงินสด โอน เช็ค บัตร PromptPay ภาษีหัก) เก็บและลงบัญชีอย่างไร ทำไมขึ้น "ยอดการจ่ายเงินไม่สมบูรณ์" · ต้องกดประมวลผลลงบัญชี (Rebuild GL) ใหม่เมื่อไร มันลบอะไรทิ้งบ้าง · ทำไมสต็อกติดลบได้ และตั้งห้ามติดลบที่ไหน · ขายถึงรับเงิน (Order-to-Cash)
ที่มาในโค้ด
backend/internal/application/process/pos_bill.go:26(posBillFlag = 44),:123(ReceivePosBill),:202(processPosBill),:314(savePosBillTx),:360-368,:402-405,:411-415,:424(savePosPaymentTx)backend/internal/application/process/pos_bill.go:517(queuePosStock),:682-686,:703-725(DrainPosStock)backend/internal/application/process/pos_bill.go:575-594(CancelPosBill),:601-630(cancelPosBillTx),:391(ตรวจยอดรับชำระ)backend/internal/application/process/trans.go:573(deferStock→ คิว)backend/internal/application/process/service.go:2001-2047(GL ของ 44 แยกตามช่องทางรับเงิน),:1413-1440และ:1479-1480(รีบิลด์ลบ journal แล้วเลือกเฉพาะis_cancel = 0)backend/internal/application/process/stock_rebuild.go:18-19(flag ที่นับสต็อก)backend/internal/application/process/pos_config.go:991-997(actioncancel_bill)