#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)
โน้ตในหมวดนี้
เอกสารและการบันทึก
- รหัสชนิดเอกสาร trans_flag และทิศทางสต็อก (Trans Flag Map) รหัสชนิดเอกสาร
trans_flagและทิศทางสต็อกcalc_flag - ลำดับการบันทึกเอกสาร (Transaction Save Flow) ลำดับการบันทึกเอกสาร, lock, transaction
- การลบ แก้ไข และล็อกเอกสาร (Transaction Delete / Edit Guards) การลบ/แก้ไข/ล็อกเอกสาร
- ด่านตรวจก่อนบันทึกเอกสารและวงเงินเครดิต (Save Rules & Credit Limit) กฎตรวจก่อนบันทึก (ต่ำกว่าทุน, ติดลบ, lot, วงเงินเครดิต, ยอดอ้างอิง)
- งวดบัญชีและด่านตรวจงวดปิด (Accounting Period Guard) การปิดงวดบัญชี
การคำนวณยอดและภาษี
- การคำนวณยอดท้ายบิล VAT และส่วนลด (Document Totals / vatCalc) ยอดท้ายบิล VAT ส่วนลด (vatCalc) และ VAT ระดับบรรทัด
- การปัดเศษ ทศนิยม และตัวเลขเงิน (Rounding & Decimal Policy) การปัดเศษ, scale, decimal และจุดเสี่ยง
- ทะเบียนภาษีซื้อ/ภาษีขาย และภาษีหัก ณ ที่จ่าย (VAT Register & WHT) ทะเบียนภาษีซื้อ/ขาย และภาษีหัก ณ ที่จ่าย
- หลายสกุลเงินและกำไรขาดทุนจากอัตราแลกเปลี่ยน (Multi-Currency & FX Gain/Loss) หลายสกุลเงินและกำไร/ขาดทุนจากอัตราแลกเปลี่ยน
สต็อกและต้นทุน
- การคำนวณยอดสต็อกคงเหลือใหม่ (Stock Balance Rebuild) การคำนวณยอดคงเหลือ และหน่วยนับขนาน (qty_2)
- ต้นทุนสินค้าแบบถัวเฉลี่ยเคลื่อนที่ (Moving Average Cost) ต้นทุนถัวเฉลี่ย, lock cost, สถานะ FIFO
- เอกสารสต็อกพิเศษ: ยอดยกมา ปรับปรุง Lot และตรวจนับ (Opening Stock, Lot Adjust, Stock Count) ยอดยกมาสินค้า (54), ปรับปรุง lot, ตรวจนับ (76) และ lot อัตโนมัติ
บัญชีแยกประเภท (GL)
- กระบวนการสร้างสมุดรายวัน GL ใหม่ (GL Rebuild Process) กระบวนการสร้าง GL ใหม่ของเอกสาร
- การลงบัญชี Dr/Cr มาตรฐานแยกตามชนิดเอกสาร (Standard GL Posting) ตาราง Dr/Cr มาตรฐานแยกตาม flag
- เครื่องมือลงบัญชีตามรูปแบบ GL (GL Template Engine) รูปแบบการลงบัญชีจาก
erp_doc_format_gl
เงิน เช็ค มัดจำ สินทรัพย์
- แท็บรับ/จ่ายเงิน และการชำระหนี้ตามบิล (Payment Tab & Bill Settlement) แท็บรับ/จ่ายเงิน, รายได้/ค่าใช้จ่ายอื่น, ตัดชำระบิล
- เงินมัดจำและเงินล่วงหน้า (Deposits & Advances) เงินมัดจำ/เงินล่วงหน้า
- วงจรเช็ครับ/เช็คจ่าย บัตรเครดิต และโอนเงินระหว่างบัญชี (Cheque Lifecycle & Bank Transfer) เช็ครับ/จ่าย, บัตรเครดิต, โอนเงินระหว่างบัญชี
- ค่าเสื่อมราคาสินทรัพย์ถาวร (Fixed Asset Depreciation) ค่าเสื่อมราคาสินทรัพย์ (1801)
- ขายสินทรัพย์ถาวร (Fixed Asset Sale 1802) ขายสินทรัพย์ (1802)
จุดเสี่ยงหลักที่พบ (สรุป)
- ต้นทุน FIFO มีฟังก์ชันแต่ไม่ถูกเรียกใช้: ระบบใช้ Moving Average เสมอ ดู ต้นทุนสินค้าแบบถัวเฉลี่ยเคลื่อนที่ (Moving Average Cost)
- หลายจุด hardcode scale 2 และ VAT 7% ดู การปัดเศษ ทศนิยม และตัวเลขเงิน (Rounding & Decimal Policy)
- GL แบบ standard ไม่ตรวจงวดปิด และสร้างผังบัญชีให้อัตโนมัติ ดู กระบวนการสร้างสมุดรายวัน GL ใหม่ (GL Rebuild Process)
- GL ของ IA (66) ไม่เท่ากับมูลค่าสต็อก (known gap ที่ระบุไว้ในโค้ด) ดู การลงบัญชี Dr/Cr มาตรฐานแยกตามชนิดเอกสาร (Standard GL Posting)
ที่มาในโค้ด
backend/internal/application/process/trans.go:267SaveTransbackend/internal/application/process/trans.go:510saveTransTxbackend/internal/application/process/trans.go:593rebuildTransDerivedbackend/internal/application/process/service.go:1007rebuildStockTxbackend/internal/application/process/service.go:1378rebuildGLTx