หัวเอกสารใบวางบิล / รับชำระหนี้ / จ่ายชำระหนี้ (ap_ar_trans)
เก็บ หัว (header) ของเอกสารฝั่งเจ้าหนี้-ลูกหนี้ที่ไม่ใช่เอกสารซื้อขาย (เอกสารซื้อขายอยู่ใน หัวเอกสารสินค้า/ซื้อ/ขาย (ic_trans)) คือ ใบวางบิล และ ใบรับชำระหนี้/จ่ายชำระหนี้ รายการบรรทัดที่ชำระอยู่ใน รายการบรรทัดใบวางบิล/ชำระหนี้ (ap_ar_trans_detail) และช่องทางรับ/จ่ายเงิน (เงินสด โอน เช็ค บัตร) อยู่ใน หัวสรุปการรับ/จ่ายเงิน (cb_trans) / รายละเอียดรับ/จ่ายเงินแยกรายการ (cb_trans_detail) โดย key เดียวกัน (doc_no + trans_flag).
ตารางนี้เป็น "ตารางเงิน" ตาม moneyTablePattern — แก้ได้เฉพาะผ่านงาน /api/process (ไม่ผ่าน generic query write) ดู domain/query/write_policy.go:24.
เอกสารที่ใช้ตารางนี้ (trans_flag)
| trans_flag | เอกสาร | ฝั่ง (trans_type) |
|---|---|---|
| 213 | ใบวางบิลเจ้าหนี้ (AP billing) | 1 (เจ้าหนี้) |
| 235 | ใบวางบิลลูกหนี้ (AR billing) | 2 (ลูกหนี้) |
| 19 | จ่ายชำระหนี้เจ้าหนี้ | 1 |
| 239 | รับชำระหนี้ลูกหนี้ | 2 |
| 214 / 23 / 236 / 240 | เอกสารยกเลิกของ 213 / 19 / 235 / 239 ตามลำดับ | ตามต้นฉบับ |
ที่มา: billSides ใน docs.go:528 (235,239 → ลูกหนี้ trans_type 2, 213,19 → เจ้าหนี้ trans_type 1), คู่ยกเลิกใน doc_cancel.go:59-62 (214→213, 23→19, 236→235, 240→239). ดูตารางรวมรหัสใน รหัสชนิดเอกสาร trans_flag และทิศทางสต็อก (Trans Flag Map).
คอลัมน์สำคัญ (จาก INSERT ใน docs.go:354-363)
| column | ความหมาย | ใช้ที่ไหน |
|---|---|---|
doc_no |
เลขที่เอกสาร (key ร่วมกับ trans_flag) |
ทุกที่ที่ join หัว-ราย-การจ่ายเงิน |
trans_flag |
ชนิดเอกสาร (ตารางด้านบน) | docs.go:354, ทุก report |
trans_type |
1 = เจ้าหนี้, 2 = ลูกหนี้ | billSides docs.go:528; dashboard ใช้ trans_type = 2 เป็นยอดลูกหนี้ (adapter/inbound/http/dashboard/handler.go:126) |
doc_date, doc_time |
วัน-เวลาเอกสาร | ทุก report |
cust_code |
รหัสลูกหนี้ (ทะเบียนลูกหนี้/ลูกค้า (ar_customer)) หรือเจ้าหนี้ (ทะเบียนเจ้าหนี้/ผู้ขาย (ap_supplier)) ตาม trans_type |
docs.go:354; รายงาน report_menu_ap_ar.go:406,475 |
branch_code, department_code |
สาขา / แผนก | docs.go:354 (erp_branch_list — ทะเบียนสาขา) |
vat_type, vat_rate |
ชนิด/อัตราภาษี | docs.go:354 |
total_value, total_before_vat, total_vat_value, total_after_vat |
ยอดรวมก่อน/หลังภาษี | docs.go:354 — ค่าที่ INSERT มาจาก t.Value, t.BeforeVat, t.VatValue, t.Amount |
total_net_value |
ยอดสุทธิ (INSERT ด้วยค่าเดียวกับ total_after_vat) |
docs.go:357 ($14 ซ้ำสองคอลัมน์); report ลูกหนี้ใช้ -total_net_value เป็นยอดรับชำระ (report_menu_ap_ar.go:406) |
total_pay_money |
ยอดชำระรวม (Σ sum_pay_money ของบรรทัด) |
docs.go:354,566 |
remark, doc_ref, doc_ref_date |
หมายเหตุ / เอกสารอ้างอิง | docs.go:354 |
doc_format_code |
รูปแบบเลขที่เอกสาร (erp_doc_format — รูปแบบ/ชนิดเอกสารและเลขที่รัน) | docs.go:354; doc_picture.go:164 |
credit_day, due_date |
วันเครดิต / วันครบกำหนด | docs.go:354 |
sale_code, project_code, allocate_code, side_code, job_code, doc_group |
มิติวิเคราะห์ต่อเอกสาร | docs.go:354 |
currency_code, exchange_rate, discount_word |
สกุลเงิน / อัตรา / ข้อความส่วนลด | docs.go:354; หลายสกุลดู หลายสกุลเงินและกำไรขาดทุนจากอัตราแลกเปลี่ยน (Multi-Currency & FX Gain/Loss) |
last_status |
0 = ใช้งาน, 1 = ยกเลิก (INSERT ด้วย 0 เสมอ; ค่าจริงถูกคำนวณตาม doc flow) | docs.go:354; report_menu_ap_ar.go:406 กรอง last_status = 0 |
sum_pay_money_cash, sum_pay_money_chq, sum_pay_money_transfer, sum_pay_money_diff |
แยกยอดชำระตามช่องทาง และส่วนต่าง — รายงานใช้อ่านค่า แต่โค้ดระบุว่าเป็น "assumed source mapping" | report_menu_ap_ar.go:866-880 (ไม่เห็น INSERT ที่เขียนคอลัมน์เหล่านี้ใน docs.go → ที่มาของค่า "ไม่ชัดจากโค้ด") |
คอลัมน์อื่นที่ทั้งตารางมีจริงแต่ไม่ถูกใช้ในโค้ด backend ที่อ่าน: "(ไม่ชัดจากโค้ด)".
ความสัมพันธ์
doc_no + trans_flag→ รายการบรรทัดใบวางบิล/ชำระหนี้ (ap_ar_trans_detail) (บรรทัดบิลที่ชำระ; ลบ-สร้างใหม่พร้อมหัว)doc_no + trans_flag→ หัวสรุปการรับ/จ่ายเงิน (cb_trans) / รายละเอียดรับ/จ่ายเงินแยกรายการ (cb_trans_detail) (แท็บรับ/จ่ายชำระของ 19/239) และ ทะเบียนเช็ค/บัตรเครดิต/กระเป๋าเงิน (cb_chq_list) ผ่านdoc_ref = doc_no(เช็คที่รับ/จ่าย)cust_code→ ทะเบียนลูกหนี้/ลูกค้า (ar_customer) หรือ ทะเบียนเจ้าหนี้/ผู้ขาย (ap_supplier)- ผลบัญชี: เอกสารเหล่านี้ลง GL ผ่าน template (เครื่องมือลงบัญชีตามรูปแบบ GL (GL Template Engine), การลงบัญชี Dr/Cr มาตรฐานแยกตามชนิดเอกสาร (Standard GL Posting), หัวสมุดรายวันทั่วไป (gl_journal)); ภาษีหัก ณ ที่จ่ายที่เกิดจากการชำระดู ทะเบียนภาษีซื้อ/ภาษีขาย และภาษีหัก ณ ที่จ่าย (VAT Register & WHT) / หัวเอกสารหัก ณ ที่จ่าย (gl_wht_list)
- ตัวหนี้ที่ถูกชำระคือเอกสาร หัวเอกสารสินค้า/ซื้อ/ขาย (ic_trans) (ขาย/ซื้อ/ลด-เพิ่มหนี้) และ หัวเอกสารสินทรัพย์ (as_trans) (ขายสินทรัพย์ flag 1802) — ดู
billDebtSourcedocs.go:610-617
ใครเขียน / ใครอ่าน
- เขียน:
SaveDoc(docs.go:33-95structSaveDocInput, แผนapArPlandocs.go:483-495). วิธี save เป็นแบบ idempotent — ใน transaction เดียว ลบap_ar_trans_detail,ap_ar_trans,cb_trans_detail,cb_trans,cb_chq_list(ที่doc_ref = doc_no) ของ (doc_no, trans_flag) นั้นก่อน แล้ว INSERT ใหม่ (docs.go:488-494) แล้ว rebuild สถานะเช็ค/GL ตามต่อท้าย. ดูภาพรวมใน ลำดับการบันทึกเอกสาร (Transaction Save Flow) - อัปเดตสถานะยกเลิก:
doc_flow.go:262-263และdoc_cancel.go:317,354ส่งต่อlast_statusระหว่างต้นฉบับกับเอกสารยกเลิก. ดู ยกเลิกและอนุมัติเอกสาร (Document cancel / approve), การลบ แก้ไข และล็อกเอกสาร (Transaction Delete / Edit Guards) - อ่าน: รายงานเจ้าหนี้/ลูกหนี้ (
report_menu_ap_ar.go:309-360,406,475,780-905), CRM dashboard (crm/handler.go:166-223), dashboard (dashboard/handler.go:126), GL template ชุดจ่ายหนี้ (gl_template.go:820-842อ่านเงินจากcb_transและหมายเหตุ/สาขาจากap_ar_trans), ค้นหาภาพเอกสาร (doc_picture.go:128-219), หาเลขเอกสารถัดไป (doc_no_next.go:12อยู่ในnextDocNoTables). - ระบบอื่น: dashboard / crm / ai / mcp gateway อ่านตารางนี้ (
adapter/inbound/http/...) — ไม่เขียน.
ข้อควรระวัง
- ใช้
trans_flagผิดชุดได้ง่าย: โค้ด CRM อ่านap_ar_transด้วยtrans_flag = 41(วางบิล) และ43(ใบเสร็จ) (crm/handler.go:177-178) ซึ่ง ไม่ตรง กับbillSidesที่ใช้ 235/239 — อย่าเชื่อชุด 41/43 เมื่ออ้างข้อมูลจริง (ไม่ชัดจากโค้ดว่ามีเอกสาร 41/43 ในตารางนี้หรือไม่). - Dashboard ลูกหนี้คงค้างรวม
total_net_valueทุกแถวที่trans_type = 2โดยไม่กรองlast_status(dashboard/handler.go:126) — เป็นการประมาณของ dashboard ไม่ใช่ยอดบัญชี. - ห้ามแก้ตารางนี้ตรงด้วย SQL: ผ่านนโยบาย money-table ต้องใช้
/api/processเพื่อให้สถานะ/GL/เช็คสอดคล้อง (กลุ่มตาราง ap_* / ar_* / ap_ar_* — เจ้าหนี้ ลูกหนี้ และใบวางบิล-รับ/จ่ายชำระ). - ยอดเงินเป็นทศนิยมเชิงบัญชี รับ-ส่งเป็น string (กฎ ACCOUNTING NUMBER);
ParseDecimalRatในdocs.go:560-571. - เอกสารถูกลบ-สร้างใหม่ทุกครั้งที่แก้ →
roworder(ถ้ามี) ไม่คงที่ ไม่ควรใช้เป็น key อ้างอิงถาวร.
ที่มาในโค้ด
backend/internal/application/process/docs.go:21(docKindCheque),:33-95(SaveDocInput),:354-363(INSERT ap_ar_trans),:432(cheque register read-only),:483-495(apArPlan),:528(billSides),:600-626(เงื่อนไขหนี้/paid)backend/internal/application/process/doc_cancel.go:59-62,112,317,354backend/internal/application/process/doc_flow.go:262-263,487backend/internal/application/process/gl_template.go:820-842backend/internal/application/process/report_menu_ap_ar.go:309-360,406,475,780-905backend/internal/domain/query/write_policy.go:23-24backend/internal/adapter/inbound/http/crm/handler.go:177-178backend/internal/adapter/inbound/http/dashboard/handler.go:126