#accounting#gl#template#debit-credit#go
เครื่องมือลงบัญชีตามรูปแบบ GL (template)
ถ้ารูปแบบเอกสาร (erp_doc_format) มีแถวใน erp_doc_format_gl ระบบจะลง GL ตามแถวเหล่านั้นแทนชุดบัญชีมาตรฐาน แต่ละแถวคือ 1 ขั้นการลงบัญชี โดย condition_number (action) เลือกว่าจะใช้ยอดไหนของเอกสาร โค้ดเป็น port ของ C# _transProcessUserControl.cs processWithData (gl_template.go:18)
ทำงานอย่างไร
หา template (format gl_template.go:966)
- อ่าน
erp_doc_formatตามcode(ตัวพิมพ์ใหญ่) ได้screen_code,gl_book,gl_description screen_codeต้องมีในglRuleByScreen(gl_template_rules.go:20) เช่น SI/SIP = 44, PU = 12, IA = 66, IM = 72, CND = 418, ASS = 1802 ไม่อยู่ในตาราง = ไม่มี template- ไม่มีแถว template = คืน nil แล้วไปใช้ การลงบัญชี Dr/Cr มาตรฐานแยกตามชนิดเอกสาร (Standard GL Posting)
คำนวณ (runGLTemplate gl_template.go:268)
- ยอดหัวเอกสารทุกช่องปัด HALF_EVEN ที่
fmt(=erp_option.gl_no_decimalค่าเริ่มต้น 2,glSQLOptions:730) - เอกสารที่ไม่ใช่ cb: VAT ที่ใช้ =
total_vat_value- VAT ยกไป - ภาษีซื้อไม่ขอคืน - ต่อแถว template: ฝั่ง Dr ถ้ามีรหัสเดบิต มิฉะนั้น Cr; เรียกฟังก์ชัน rule ของหน้าจอ (
glRuleNN) ตาม action และเงื่อนไขcondition_case(เทียบกับtrans_type+1) postLine(:305): ปัด HALF_EVEN; รหัส&ACCAP&/&ACCAR&แทนด้วยบัญชีในap_supplier_detail/ar_customer_detailถ้าไม่มีใช้รหัสหลังเครื่องหมาย "," (เช่น&ACCAR&,1121); ยอด 0 หรือรหัสว่างไม่ลง- action ที่กระจายตามบรรทัด (
byDetail:405) ใช้บัญชีจาก master ของบรรทัด เช่น "สินค้า_ราคา", "สินค้า_ต้นทุน", "ธนาคาร", "รายได้อื่น" compound(:353): ถ้าgl_trans_type= 1 (รวมบัญชี) บรรทัดบัญชีเดียวกันสาขาเดียวกันรวมเป็นบรรทัดแรกaddDiff(:378): ผลต่าง Dr-Cr ที่ไม่เกิน 0.1 x จำนวนบรรทัดรายการ ลงบัญชีผลต่าง (เดบิตถ้าผลต่าง <= 0) ถ้าเกินช่วงไม่ลง ยกเว้นตั้ง fixdiff ไว้
ตัวอย่าง action ของการขาย 44 (glRule55 gl_template_rules.go:5410)
- 1 = ยอดขาย (ยกเว้นภาษี 2/3 ใช้ total_amount + มัดจำ + ส่วนลด; มีภาษีใช้ total_before_vat + มัดจำ ...)
- 101 / 103 =
total_cost(ผลรวมic_trans_detail.sum_of_costของบรรทัด item_type ไม่ใช่ 1/3 :791) กระจายตาม "สินค้า_ต้นทุน" ใช้ลงต้นทุนขาย/สินค้า - action อื่นมีอีกหลายสิบตัว (2-19, 23, 30, 31, 81, 88-95, 1001-1004, 1901, 1902) ยังไม่ได้ไล่ทีละตัว
บันทึก (post gl_template.go:1008)
- หางวดจาก
erp_account_periodตามวันที่: ไม่พบหรืองวดปิด = handled แต่ไม่เขียน (n = 0) พร้อมคำเตือน (C# ข้ามเอกสารเช่นกัน) - ไม่มีบรรทัด (ยอดศูนย์) = ไม่ handled ให้ standard ตัดสิน
- Dr ไม่เท่า Cr (เทียบหลัง FormatRat ที่
fmt) = ไม่ handled + คำเตือน "...ไม่สมดุล..." แล้ว caller ไปใช้ standard แทน (service.go:1567-1580) ไม่ทำให้การบันทึกทั้งชุดล้ม - INSERT
gl_journal(trans_direct= 0,doc_format_code) และgl_journal_detailเรียงฝั่ง Dr ก่อนแล้วตามรหัสบัญชี - คำอธิบายหัว (
glDescriptiongl_post.go:26): placeholder&REMARK&,&CUST_CODE&,&CUST_NAME&,&AP_*&,&AR_*&,&DOC_NO&,&DOC_DATE&,&TAX_NO&,&DOC_REF&,&TAX_DATE&; วันที่เป็น d/M/yyyy บวก 543 เมื่อerp_option.year_type= 1; ไม่มี gl_description ใช้ remark
เอกสารที่มีแต่ template (glTemplateOnlyFlags :1096)
- 72 (โอนออก), 418 (เช็ครับตั้งหนี้ใหม่) และขายสินทรัพย์ 1802 โพสต์ผ่าน
postTemplateOnly(:1100) เท่านั้น ไม่มีชุดมาตรฐาน
รูปแบบเริ่มต้น (GLTemplateDefaults gl_template_defaults.go:56)
- ข้อมูลฝังใน
gl_template_defaults.json(go:embed) ใช้เติมแถว template ให้ผู้ใช้ - comment ที่ :56-57 ระบุว่าเมื่อ
inventory_gl_post= 0 (perpetual) จะตัด action 101/103 ทิ้ง (:89) ตาม C#
จุดเสี่ยง
- template ใช้ HALF_EVEN ที่
gl_no_decimalส่วน standard ใช้ HALF_UP ที่ 2 ตำแหน่ง ดู การปัดเศษ ทศนิยม และตัวเลขเงิน (Rounding & Decimal Policy) - template ไม่สมดุลไม่ error แต่ตกไปใช้ standard: GL ที่ได้จึงไม่ตรงกับรูปแบบที่ผู้ใช้ตั้งโดยมีแค่คำเตือน
- ยังไม่ได้ port การแยกแผนก/โครงการ (comment ponytail ใน
postอ้าง C# processDist)
ที่มาในโค้ด
backend/internal/application/process/gl_template.go:268runGLTemplatebackend/internal/application/process/gl_template.go:305postLinebackend/internal/application/process/gl_template.go:353compoundbackend/internal/application/process/gl_template.go:378addDiffbackend/internal/application/process/gl_template.go:966formatbackend/internal/application/process/gl_template.go:1008postbackend/internal/application/process/gl_template.go:1096glTemplateOnlyFlagsbackend/internal/application/process/gl_template_rules.go:20glRuleByScreenbackend/internal/application/process/gl_template_rules.go:5410glRule55backend/internal/application/process/gl_template_defaults.go:56ค่าเริ่มต้นและ perpetualbackend/internal/application/process/gl_post.go:26glDescription