สมอง SML

คลังความรู้ / ตรรกะบัญชี

#accounting#hub#overview

ภาพรวมระบบบัญชี SML AI Account

เอกสารทุกใบ (ซื้อ ขาย สต็อก เงินสด/ธนาคาร เช็ค มัดจำ) จะถูกบันทึกเป็น "ข้อมูลดิบ" (raw) ลง ic_trans / ic_trans_detail / cb_trans จากนั้นระบบจะ "คำนวณใหม่" (rebuild) ยอดสต็อก ต้นทุน และสมุดรายวัน GL ภายใน database transaction เดียวกัน หากขั้นใดล้มเหลว จะ rollback ทั้งเอกสาร ตัวเลขเงินทุกตัวคำนวณด้วย *big.Rat และส่งต่อกันเป็น decimal string (ไม่ใช้ float)

ทำงานอย่างไร

หน้าจอเอกสาร (trans_flag)
   |  SaveTrans  (trans.go:267)
   v
ตรวจก่อนบันทึก: งวดบัญชี, สิทธิ์แก้ไข, เลขใบกำกับซ้ำ, ห้ามติดลบ, วงเงินเครดิต
   v
saveTransTx (trans.go:510)  = ลบแถวเดิมของเอกสาร แล้ว insert ใหม่
   ic_trans + ic_trans_detail + VAT/WHT + cb_trans (แท็บจ่าย) + มัดจำ
   v
rebuildTransDerived (trans.go:593)
   |- rebuildStockTx      -> balance_qty, average_cost, sum_of_cost  (service.go:1007)
   |- SyncTransferPair    -> 422 โอนเงินออก สร้างคู่ 420
   |- rebuildGLTx         -> gl_journal / gl_journal_detail          (service.go:1378)
   |     ใช้ template (erp_doc_format_gl) ก่อน ถ้าไม่มีจึงใช้ standard
   |- syncStockTransferIn -> 72 โอนออก / 70 โอนเข้า
   '- RebuildChequeStatus -> cb_chq_list.status
   v
COMMIT  (ล้มที่ขั้นใดก็ rollback ทั้งหมด)

หลักการสำคัญ (ตามที่ comment ในโค้ดเรียกว่า "AGENTS.md rule 9" raw vs derived)

  • ข้อมูลที่ผู้ใช้คีย์ = raw (บรรทัดรายการ, แท็บจ่าย, WHT, VAT ที่คีย์เอง)
  • ยอดคงเหลือ, ต้นทุนเฉลี่ย, GL อัตโนมัติ, VAT แถวแรก, สถานะเช็ค, ยอดมัดจำคงเหลือ = derived คำนวณใหม่ได้เสมอ (idempotent)

โน้ตในหมวดนี้

เอกสารและการบันทึก

การคำนวณยอดและภาษี

สต็อกและต้นทุน

บัญชีแยกประเภท (GL)

เงิน เช็ค มัดจำ สินทรัพย์

จุดเสี่ยงหลักที่พบ (สรุป)

ที่มาในโค้ด

  • backend/internal/application/process/trans.go:267 SaveTrans
  • backend/internal/application/process/trans.go:510 saveTransTx
  • backend/internal/application/process/trans.go:593 rebuildTransDerived
  • backend/internal/application/process/service.go:1007 rebuildStockTx
  • backend/internal/application/process/service.go:1378 rebuildGLTx

ดูเพิ่ม