จัดซื้อถึงจ่ายเงิน (Procure-to-Pay)
เส้นทางงานซื้อตั้งแต่ขอซื้อจนจ่ายเงินเจ้าหนี้ เอกสารฝั่งสินค้า (ic_trans) บันทึกผ่าน /api/v1/process/trans/save ส่วนวางบิลและจ่ายชำระ (ap_ar_trans) บันทึกผ่าน /api/v1/process/doc/save ดู ลำดับการบันทึกเอกสาร (Transaction Save Flow) และ สถานะต่อเนื่องของเอกสาร กราฟโยงเอกสาร และเลขที่เอกสารถัดไป (Doc flow & numbering)
ภาพรวม
flowchart LR
PR["ใบขอซื้อ (2)"] --> PRA["อนุมัติขอซื้อ (4)"]
PR --> PO["ใบสั่งซื้อ (6)"]
PRA --> PO
PO --> DEP["จ่ายล่วงหน้า/มัดจำ (10/11)"]
PO --> PI["ซื้อ/ตั้งหนี้ (12)"]
PO --> RCV["ทยอยรับสินค้า (310)"]
RCV --> PPI["ตั้งหนี้จากการรับ (315)"]
PI --> RET["ส่งคืน/ลดหนี้ (16) · เพิ่มหนี้ (14)"]
RCV --> RRET["ส่งคืนจากการรับ (311)"]
PPI --> PRET["ลดหนี้ (317) · เพิ่มหนี้ (316)"]
PI --> BILL["รับวางบิล (213)"]
PPI --> BILL
BILL --> PAY["จ่ายชำระหนี้ (19)"]
PI --> PAY
PAY --> CHQ["เช็คจ่าย (ดูโน้ตเงินสด-เช็ค)"]
ลูกศร "ดึงจากเอกสาร" มาจาก refImportSources (trans_ref_import_lines.go:52) ได้แก่ 6←{4,2}, 12←6, 310←6, 315←310, 16←12, 311←310, 317←315, 14←12, 316←315
ขั้นตอน
| ขั้น | เอกสาร/หน้าจอ | ตารางที่เขียน | ผลบัญชี/สต็อก | path:line |
|---|---|---|---|---|
| 1 | ใบขอซื้อ (2) menu_purchase_requisition ใบเสนอซื้อ/ใบขอซื้อสินค้า (Purchase Requisition) |
หัวเอกสารสินค้า/ซื้อ/ขาย (ic_trans), รายการสินค้าในเอกสาร (ic_trans_detail) | ไม่ตัดสต็อก ไม่ลง GL (2 ไม่อยู่ใน stockRowsSQL และ glRebuildTransFlags) |
frontend/account/tabs/transMenuMap.ts:60, backend/internal/application/process/stock_rebuild.go:18, backend/internal/application/process/service.go:1731 |
| 2 | อนุมัติใบขอซื้อ (4) | หัวเอกสารสินค้า/ซื้อ/ขาย (ic_trans) | ไม่มีผลบัญชี | frontend/account/tabs/transMenuMap.ts:74 |
| 3 | ใบสั่งซื้อ (6) menu_po_purchase_order ใบสั่งซื้อสินค้า (Purchase Order) ดึงจาก 4/2 · อนุมัติใบสั่งซื้อ (8) |
หัวเอกสารสินค้า/ซื้อ/ขาย (ic_trans), รายการสินค้าในเอกสาร (ic_trans_detail) | ไม่ตัดสต็อก ไม่ลง GL | frontend/account/tabs/transMenuMap.ts:103, :119, backend/internal/application/process/trans_ref_import_lines.go:52 |
| 4 | จ่ายเงินล่วงหน้า (10) / จ่ายมัดจำ (11) จ่ายเงินล่วงหน้า / ยกมา / รับคืน (Purchase Advance Payment) จ่ายเงินมัดจำ / ยกมา / รับคืน (Purchase Deposit Payment) | หัวเอกสารสินค้า/ซื้อ/ขาย (ic_trans), หัวสรุปการรับ/จ่ายเงิน (cb_trans), รายละเอียดรับ/จ่ายเงินแยกรายการ (cb_trans_detail) | Dr เงินจ่ายล่วงหน้า 115710 หรือ มัดจำ 153010 / Cr ช่องทางจ่าย (payTenders) | backend/internal/application/process/trans_deposit.go:36-41, backend/internal/application/process/service.go:2185 |
| 5a | ซื้อสินค้า/ตั้งหนี้ (12) menu_po_purchase_billing ซื้อสินค้า/ตั้งหนี้ซื้อ (Purchase Invoice) ดึงจาก 6 |
หัวเอกสารสินค้า/ซื้อ/ขาย (ic_trans), รายการสินค้าในเอกสาร (ic_trans_detail), หัวสมุดรายวันทั่วไป (gl_journal), รายการบัญชีแยกประเภท (gl_journal_detail) (+ ภาษีซื้อ ดู ภาษีจากเอกสารถึงรายงาน VAT และ ภ.ง.ด. (Tax: Documents to VAT & WHT Reports)) | สต็อกเข้า (12 อยู่ใน stockRowsSQL) · Dr ซื้อ 5111 (รวมมัดจำที่ใช้ ex-VAT) + Dr ภาษีซื้อ 1154 / Cr เจ้าหนี้ 2111 (inquiry 0/2) หรือ Cr ช่องทางจ่าย (inquiry 1/3 = ซื้อเงินสด) / Cr บัญชีมัดจำที่ตัดใช้ |
frontend/account/tabs/transMenuMap.ts:299, backend/internal/application/process/service.go:1965-1983, :1828-1840 |
| 5b | ทยอยรับสินค้า (310) menu_po_purchase_partial_item รับสินค้าตามใบสั่งซื้อ (ทยอยรับ) (Goods Receipt) ดึงจาก 6 |
หัวเอกสารสินค้า/ซื้อ/ขาย (ic_trans), รายการสินค้าในเอกสาร (ic_trans_detail), GL | สต็อกเข้าที่ 310 · Dr ซื้อ / Cr เจ้าหนี้ไม่ถึงกำหนดตั้งหนี้ 212015 (สร้างผังบัญชีให้อัตโนมัติถ้าไม่มี) | frontend/account/tabs/transMenuMap.ts:330, backend/internal/application/process/service.go:1923, :1658 |
| 5c | ตั้งหนี้จากการรับ (315) menu_po_purchase_partial_1 ตั้งหนี้ซื้อจากการรับสินค้า (Purchase Invoice from Receipt) ดึงจาก 310 |
หัวเอกสารสินค้า/ซื้อ/ขาย (ic_trans), GL, ภาษีซื้อ | ไม่ตัดสต็อกซ้ำ (315 ไม่อยู่ใน stockRowsSQL) · Dr 212015 + ภาษีซื้อ / Cr เจ้าหนี้ (หรือช่องทางจ่ายเมื่อ inquiry 1/3) และ Cr มัดจำที่ใช้ |
frontend/account/tabs/transMenuMap.ts:361, backend/internal/application/process/service.go:1947 |
| 6 | ส่งคืน/ลดหนี้ (16) ← 12 · ส่งคืนจากการรับ (311) ← 310 · ลดหนี้ (317) ← 315 ส่งคืนสินค้า/ลดหนี้ซื้อ (Purchase Return / Credit Note) ส่งคืนสินค้าจากการรับ (ทยอยรับ) (Return of Goods Receipt) ลดหนี้ซื้อจากใบตั้งหนี้ (Credit Note on Receipt Invoice) | หัวเอกสารสินค้า/ซื้อ/ขาย (ic_trans), GL | สต็อกออก (16, 311) · GL กลับข้างของ 12/310/315 | frontend/account/tabs/transMenuMap.ts:392, :408, :424, backend/internal/application/process/service.go:1935, :1984 |
| 7 | เพิ่มหนี้ (14) ← 12 · เพิ่มหนี้ (316) ← 315 เพิ่มหนี้ซื้อ/ราคาผิด (Purchase Debit Note) เพิ่มหนี้ซื้อจากใบตั้งหนี้ (Debit Note on Receipt Invoice) | หัวเอกสารสินค้า/ซื้อ/ขาย (ic_trans), GL | 14/16/311 inquiry 1/3 = ปรับมูลค่าอย่างเดียวไม่เปลี่ยนจำนวน (stockValueOnlySQL) · GL เหมือน 12 แต่ 14/316 ลงเจ้าหนี้เสมอ |
frontend/account/tabs/transMenuMap.ts:483, backend/internal/application/process/stock_rebuild.go:26, backend/internal/application/process/service.go:1976-1981 |
| 8 | รับวางบิล (213) menu_ap_pay_bill ใบรับวางบิล เจ้าหนี้ (AP Bill Receipt) |
หัวเอกสารใบวางบิล/ใบเสร็จ-จ่ายชำระหนี้ (ap_ar_trans), รายการบรรทัดใบวางบิล/ชำระหนี้ (ap_ar_trans_detail) | ไม่ลง GL (glFlag มีแค่ 19/239) |
frontend/account/tabs/transMenuMap.ts:1349, backend/internal/application/process/docs.go:390 |
| 9 | จ่ายชำระหนี้ (19) menu_ap_debt_billing จ่ายชำระหนี้ เจ้าหนี้ (AP Payment) เลือกบิลจาก /doc/bills |
หัวเอกสารใบวางบิล/ใบเสร็จ-จ่ายชำระหนี้ (ap_ar_trans), รายการบรรทัดใบวางบิล/ชำระหนี้ (ap_ar_trans_detail), หัวสรุปการรับ/จ่ายเงิน (cb_trans), รายละเอียดรับ/จ่ายเงินแยกรายการ (cb_trans_detail), ทะเบียนเช็ค/บัตรเครดิต/กระเป๋าเงิน (cb_chq_list), GL | Dr เจ้าหนี้ / Cr ช่องทางจ่าย (เงินสด/ธนาคาร/เช็คจ่าย 2112/ภาษีหัก ณ ที่จ่าย 2122 ลำดับสำรอง 2123/2120) · กำไร 420040 / ขาดทุน 511030 จากอัตราแลกเปลี่ยน | frontend/account/tabs/transMenuMap.ts:1378, backend/internal/application/process/service.go:2159, backend/internal/adapter/inbound/http/router.go:181 |
ยอดค้างเจ้าหนี้ไม่ได้เก็บเป็นคอลัมน์ OutstandingBills คำนวณจากเอกสารหนี้ตาม apDebtWhere (12/315/260/264 inquiry 0/2, 14/316/81/83/87/89) ร่วมกับเอกสารลดหนี้ apCreditWhere (16/317 inquiry 0/1, 85/91, 262) ลบยอดที่จ่ายแล้วใน ap_ar_trans_detail.sum_pay_money (docs.go:599-628)
จุดตรวจสอบ/validation
- ก่อนบันทึก
checkTransScreenSave(trans_validate.go:43) ตรวจตามลำดับ:- งวดบัญชีเปิดอยู่ (งวดบัญชี ปิดงวด/ปิดปี และประมวลผล GL ใหม่ (Period & Year Close, GL Rebuild))
- เอกสารที่แก้ไม่ถูกล็อก/ยังแก้ได้
- เลขที่เอกสาร สาขา แผนก วันส่ง (
checkScreenFields:168) - รหัสเจ้าหนี้ (
checkParty:216) - รายการอ้างอิง (
checkReferencedLines:339) - จำนวนเกินเอกสารอ้างอิง
- กฎบันทึก (
checkTransSaveRules)
- ออปชัน
receive_more_poข้ามการตรวจรายการอ้างอิงของ 12/310 จึงรับเกินใบสั่งซื้อได้ ออปชันcheck_qty_over_doc_refเปิดการตรวจจำนวนเกิน (trans_qty_over_ref.go:41) - ใบสั่งซื้อที่ให้ดึงต้อง
doc_success=0สำหรับ 12/310/315 ส่วนการดึงเข้า 6 ต้องผ่านการอนุมัติตามออปชันref_po_approveและshow_branch_doc_onlyจำกัดสาขา (lookup_trans.go:140) ดู ตัวกรองหน้าค้นหา (Lookup filters: party / ref-doc / warehouse / held items) - ภาษีซื้อ: เมื่อเปิด
check_input_vatและ VatType 0/1 เอกสาร 12/315/14/316/16/317 ต้องมีเลขที่และวันที่ใบกำกับ (trans_save_rules.go:53,:140-145) และตรวจเลขใบกำกับซ้ำที่trans_tax_doc_no.go:18 - มัดจำ: ตอนใช้มัดจำจะล็อก
deposit:<doc>แล้วตรวจยอดคงเหลือ (trans_deposit.go:145) และห้ามลบมัดจำที่ถูกใช้แล้ว (trans_deposit.go:246) ดู เงินมัดจำและเงินล่วงหน้า (Deposits & Advances) - ใบอ้างอิงต้องมีสินค้าที่ดึงมา (
trans_ref_check.go:54)
ข้อผิดพลาดที่พบบ่อยตามโค้ด
| ข้อความ | สาเหตุ | path:line |
|---|---|---|
| "กรุณาป้อน รหัสเจ้าหนี้" / "ไม่พบข้อมูล : ..." | ไม่กรอกหรือรหัสไม่มีใน master | backend/internal/application/process/trans_validate.go:222-232 |
| "กรุณาป้อนเลขที่ใบกำกับภาษี" / "กรุณาป้อนวันที่ใบกำกับภาษี" | เปิด check_input_vat |
backend/internal/application/process/trans_save_rules.go:142, :145 |
| "จำนวนเกินเอกสารอ้างอิง" | รับ/ตั้งหนี้เกินใบสั่งซื้อ | backend/internal/application/process/trans_validate.go:287 |
| "ไม่พบสินค้าในเอกสารอ้างอิง" | รายการไม่ตรงใบอ้างอิง | backend/internal/application/process/trans_ref_check.go:54 |
| "วันที่เอกสาร ... ได้ถูกปิดงวดไปแล้ว หรือยังไม่ได้กำหนดงวดบัญชี" | ยังไม่สร้างงวดใน erp_account_period |
backend/internal/application/process/period.go:53-61 |
- ถ้าผังบัญชีไม่มีรหัสที่ระบบหา (เช่น 5111/1154/2111)
resolveChartAccountจะใช้รหัสตัวแรกเป็นทั้งรหัสและชื่อบัญชี จึงลง GL เป็นรหัสที่ไม่มีในผัง (service.go:1755-1772) ดู ตั้งบริษัท/ฐานข้อมูลใหม่และข้อมูลหลักขั้นต่ำ (New Company Setup & Minimum Master Data) - ถ้ามี template ใน
erp_doc_format_glระบบใช้ template ก่อนสูตรมาตรฐาน ดู เครื่องมือลงบัญชีตามรูปแบบ GL (GL Template Engine) และ การลงบัญชี Dr/Cr มาตรฐานแยกตามชนิดเอกสาร (Standard GL Posting) - ลดต้นทุนสินค้าด้วยต้นทุนเฉลี่ย ดู ต้นทุนสินค้าแบบถัวเฉลี่ยเคลื่อนที่ (Moving Average Cost) ส่วนยกเลิกเอกสาร ดู แก้ไข ลบ ยกเลิกเอกสาร และผลย้อนกลับ (Edit, Delete, Cancel & Reversal)
ที่มาในโค้ด
backend/internal/application/process/trans_ref_import_lines.go:52—refImportSources(โซ่ดึงเอกสาร)backend/internal/application/process/trans_ref_import.go:24—refImportSpecsยอดคงเหลือให้ดึง ({12,6} หักจาก {7,12,310})backend/internal/application/process/lookup_trans.go:140—refDocWherebackend/internal/application/process/trans_validate.go:43,:168,:216,:339— ลำดับตรวจก่อนบันทึกbackend/internal/application/process/trans_save_rules.go:30,:53,:134— ออปชันและกฎบันทึกbackend/internal/application/process/trans.go:267,:593—SaveTrans,rebuildTransDerivedbackend/internal/application/process/stock_rebuild.go:18,:26— ธงที่เข้าสต็อกbackend/internal/application/process/service.go:1731,:1785-1792,:1923-1997,:2159,:2185— GL มาตรฐานฝั่งซื้อbackend/internal/application/process/trans_deposit.go:36-41,:145,:246— มัดจำ/ล่วงหน้าbackend/internal/application/process/docs.go:119,:390,:599-628— วางบิล/จ่ายชำระ/ยอดค้างfrontend/account/tabs/transMenuMap.ts:60-483,:1349,:1378— เมนูหน้าจอฝั่งซื้อfrontend/account/transaction/UniversalTransScreen.tsx:2576—handleSaveแยกส่ง/trans/saveหรือ/doc/save