#accounting#gl#journal#rebuild#postgres
กระบวนการสร้างสมุดรายวัน GL ใหม่ (rebuildGLTx)
GL ของเอกสารอัตโนมัติไม่ได้ถูกแก้ทีละบรรทัด แต่จะลบ journal อัตโนมัติเดิมทิ้ง แล้วสร้างใหม่จากเอกสารต้นทางทุกครั้ง ทั้งตอนบันทึกเอกสาร (ทีละเอกสาร) และตอนสั่ง RebuildGL (ตามช่วงวันที่) โดยลองใช้ template ของรูปแบบเอกสารก่อน ถ้าไม่มีจึงใช้การลงบัญชีมาตรฐาน
ทำงานอย่างไร
การล็อก
RebuildGL(service.go:1297) ต้องระบุเลขเอกสารหรือช่วงวันที่ และใช้ lock แบบ exclusive- การบันทึกเอกสารปกติใช้
lockGLShared(service.go:1370) = shared lock บน key "gl_journal:rebuild" จึงบันทึกเอกสารพร้อมกันได้ แต่จะรอ RebuildGL ทั้งช่วง
ขั้นตอน (service.go:1378)
- ลบหัว
gl_journalที่ไม่มีบรรทัด (orphan) แม้จะเป็นtrans_direct= 1 (:1413) - ลบ
gl_journal_detailและgl_journalที่trans_direct<> 1 ของเอกสารในขอบเขต (journal ที่คีย์มือtrans_direct= 1 ไม่ถูกแตะ) - ดึงเอกสารที่ต้องลง GL (:1480)
ic_transที่is_cancel= 0 และ flag อยู่ในglRebuildTransFlagsและไม่มี GL คีย์มือ- UNION
ap_ar_trans19/239 (ยอด = ผลรวม sum_pay_money) - เอกสารสต็อก/เงินที่
total_amount= 0 ใช้ผลรวมบรรทัด (sum_of_cost,sum_amount,transfer_amountหรือ ROUND(qty x average_cost, 2))
- ต่อเอกสาร (:1567)
- ลอง
tpl.post(template จากerp_doc_format_gl) ก่อน ดู เครื่องมือลงบัญชีตามรูปแบบ GL (GL Template Engine) - ถ้า template จัดการแล้ว ข้าม; ถ้าไม่มี template ใช้
buildStandardGLLinesดู การลงบัญชี Dr/Cr มาตรฐานแยกตามชนิดเอกสาร (Standard GL Posting) - ยอดติดลบไม่ลง; ยอดศูนย์ลงได้เฉพาะใบที่ตัดมัดจำเต็มจำนวน
- งวด/ปีบัญชี: หาจาก
erp_account_periodตามวันที่เอกสาร ไม่พบ = 0 (:1585) - สมุดบัญชีจาก
erp_doc_format.gl_bookและคำอธิบายจากgl_description ValidateAndBalanceJournal(lines, 2)(:1614, ฟังก์ชันที่ :508): ทุกบรรทัดต้องไม่ติดลบ และ Dr = Cr ที่ 2 ตำแหน่ง มิฉะนั้น errorErrUnbalancedJournalและ rollback- INSERT
gl_journal(debit = credit = ยอดรวม,trans_direct= 0) และgl_journal_detail(debit_or_credit0 = Dr, 1 = Cr)
- ลอง
postTemplateOnly: โพสต์เอกสารที่มีแต่ template เช่น 72, 418 และขายสินทรัพย์ 1802- ปรับบัญชีของยอดยกมาสินค้า 54 ที่ไม่มีในผังบัญชี (สินค้า 1131/1130/1140, ทุน 3110/3100/3210)
reverseCancelledGL(doc_cancel.go:585) กลับรายการเอกสารยกเลิก (:1678)- Normalize หัว journal: period/year,
branch_codeว่าง = '00000', book
จุดเสี่ยง
- GL standard ไม่ตรวจงวดปิด: หางวดอย่างเดียว ไม่อ่าน
status(:1585-1592) ขณะที่ template ข้ามเอกสารในงวดปิด ดังนั้นRebuildGLทั้งช่วงอาจเขียน GL ใหม่ในงวดที่ปิดแล้ว ส่วนการบันทึกเอกสารปกติมีด่านงวดก่อนแล้ว ดู งวดบัญชีและด่านตรวจงวดปิด (Accounting Period Guard) - สร้างผังบัญชีอัตโนมัติ: INSERT
gl_chart_of_accountรหัส '212015' (เจ้าหนี้ไม่ถึงกำหนดตั้งหนี้) (:1655-1659) และ '1122-01' (เช็ครับระหว่างเรียกเก็บ) โดยไม่สนใจ error - 411 แก้ GL ของเอกสารอื่น: ตอนสร้าง GL ของ 411 จะ UPDATE บัญชีฝั่ง Dr ของเอกสาร 410 ที่ใช้เช็คเดียวกันเป็น 1122-01 ดู วงจรเช็ครับ/เช็คจ่าย บัตรเครดิต และโอนเงินระหว่างบัญชี (Cheque Lifecycle & Bank Transfer)
- งวดไม่พบ = 0 ทำให้ GL มี
period_number0 ได้ - บัญชีที่หาไม่เจอทั้งชุด fallback ไป "9999" (บัญชีพัก) ผ่าน
resolveChartAccount
ที่มาในโค้ด
backend/internal/application/process/service.go:1297RebuildGLbackend/internal/application/process/service.go:1370lockGLSharedbackend/internal/application/process/service.go:1378rebuildGLTxbackend/internal/application/process/service.go:1413ลบ journal เดิมbackend/internal/application/process/service.go:1480ดึงเอกสารbackend/internal/application/process/service.go:1567template ก่อน standardbackend/internal/application/process/service.go:1585หางวดโดยไม่ดู statusbackend/internal/application/process/service.go:1614ตรวจสมดุลbackend/internal/application/process/service.go:1655สร้างผังบัญชี 212015backend/internal/application/process/service.go:508ValidateAndBalanceJournal