#standards#data-integrity#money#transaction#backend#go
ความถูกต้องของข้อมูล: เงิน ภาษี และ Transaction
Backend (Go) เป็นผู้คุมกฎทั้งหมด (กฎข้อ 10: Thin Client) ข้อมูลดิบเขียนต่อท้าย ผลลัพธ์ที่คำนวณต้อง rebuild ซ้ำได้ตรงกัน 100% (กฎข้อ 9) และเงิน/ภาษี/สต็อกต้องไม่มีการปัดเศษผิดหรือเขียนครึ่งๆ กลางๆ
กฎ/วิธีทำ
- หนึ่งคำสั่งผู้ใช้ = หนึ่ง
ExecBatch(Service.ExecBatch,application/query/service.go:137): เขียนหลายตารางต้องอยู่ใน transaction เดียว และบันทึก raw log ก่อนตาราง derived- ตัวอย่างที่แก้แล้ว:
AdvanceFulfillment(wms/handler.go:217) เดิม commit สถานะ SHIPPED ก่อนแล้วตัดสต็อกแยก และทิ้ง error → สถานะ SHIPPED แต่สต็อกไม่ถูกตัด;CreateMovement(:534) ยอด bin เปลี่ยนแต่ไม่มี movement log เมื่อ insert log ล้ม - Market checkout, TMS, Procure ทุก action เป็น transaction เดียว ใช้
platform/sqllitรวม insert เข้าExecBatch
- ตัวอย่างที่แก้แล้ว:
- ห้ามทิ้ง error (
_, _ = h.insertUseCase.Insert(...)) ในเส้นทางที่ตอบผู้ใช้ — insert หลักล้มต้องresponse.Errorแล้วreturnไม่ตัดเครดิต/สร้างเอกสารต่อ และไม่ตอบ 200 (ตัวอย่าง:etax,market,tms) - เงิน/ภาษี: Go ใช้
math/big.Ratปัดครึ่งขึ้นที่สตางค์ —etaxAmounts()(etax/handler.go:1016) แก้กรณี 1% ของ 14.50 ที่ float ได้ 0.14 (ที่ถูก 0.15); ฝั่ง Frontend ใช้decimalSql,roundSml,evalArithmeticSafeในnumeric.tsห้ามMath.round(x*100)/100กับ float fmt.Sprintfต้องมี%ครบตามจำนวน argument — เคยบันทึกข้อความเสีย...ERP%!(EXTRA string=PCS)ลง DB และgo vetล้ม;go vetต้องผ่านก่อน commit (กฎข้อ 20)- เลขที่เอกสารใช้
platform/docno.Stamp(docno.go:23) กันเลขชน; วันที่ market/tms/procure/etax เก็บYYYY-MM-DD(ค.ศ.) - Dashboard/KPI ห้ามค่าสำรองเป็นตัวเลขสมมติ เช่น
?? 98.6ให้ใช้?? 0 - Rebuild สต็อก WMS (
wms_stock_binจากwms_movement_log): สร้างแถวmove_type='OPENING'ครั้งเดียวต่อic_code + bin_code(physical_qty - SUM(movement เดิม)), คำนวณphysical_qty = OPENING + SUM(signed movement)แบบ idempotent ใน transaction เดียว (WmsBinOpeningSQL,WmsBinRebuildSQL,WmsEnsureTargetBinSQLใช้ในwms,tms,procurehandler) และแสดงยอดติดลบเป็นคำเตือนที่WmsDashboard.tsx - Market checkout: เครดิต/rebate คำนวณจาก
SUM(market_b2b_order)+credit_used_opening/rebate_opening; คำนวณเงินในmarket/handler.go,procure/handler.goใช้big.Rat
บทเรียนตัวเลขฝั่ง Frontend (แก้แล้ว พร้อม test)
| รหัส | อาการ | วิธีแก้ |
|---|---|---|
| N1 | เครื่องคิดเลข 100+7% ได้ 100.07 (ต้อง 107) |
left + left × pct เมื่อ term ขวาเป็น <number>% |
| N2 | ช่องจำนวนเต็ม "30.00" → "300", วาง "1,234.00" ได้ 123400 |
ตัดส่วนหลังจุดทิ้งใน cleanNumericString |
| N3 | พิมพ์ .5 บันทึกได้ 0/NULL หรือ throw |
แปลง .5→0.5, 5.→5 ใน decimalSql / sml-query-builder.ts |
| N4 | วางตัวเลขกลางค่า 1,234 แทรกผิดตำแหน่ง; blur ค่า - ค้าง |
ตัดจาก input.value ก่อนล้าง comma, finishNumber() ใน NumberBox.tsx |
ธุรกรรมที่บันทึกหลายส่วน (รอบที่ 3)
- Serial Number: ส่ง
serialsเข้าSaveTransInput(process/trans.go) บันทึก/ลบic_trans_serial_numberใน transaction เดียวกับเอกสาร (รวมใบรับโอนอัตโนมัติ70ของใบขอโอน72) แล้ว rebuildic_serial(rebuildSerialTx) - ข้อมูลจัดส่ง
ic_trans_shipment(transport_code/name/address/telephone,tracking_no,latitude,longitude) บันทึก/ลบ/โหลดในsaveTransTx/deleteTransTx - รับ/จ่ายเงินหลายรายการ: โอน (
cb_trans_detail.doc_type=1), PromptPay (doc_type=21+cb_trans.wallet_amount), เช็ก (doc_type=2+cb_chq_list), บัตรเครดิต (doc_type=3+cb_chq_list) คิดเงินสดคงเหลืออัตโนมัติ (TransPayTendersGrid.tsx,trans.go,pay_check.go) - ทศนิยมแสดงผลตาม
erp_option(item_amount_decimal,item_qty_decimal) —recalcItemLine(frontend) และtrans.goต้องใช้ค่าตรงกัน - สูตรต้นทุน/Serial/คลัง ดู ยอดคงเหลือและต้นทุนสินค้า (Stock Balance and Costing, rebuildStockTx) และ หน่วยนับขนาน Serial และการดึงเอกสารอ้างอิง (Parallel Unit, Serial, Ref Document Import)
ที่มา
.agents/skills/secure-api-data-integrity-checklist/SKILL.mdWorkflow C ข้อ 9–16docs/kms/KMS_SECURITY_DATA_INTEGRITY_LESSONS.mdB3–B9, N1–N4, D1, รอบที่ 2–3AGENTS.mdกฎข้อ 9, 10, 20
ดูเพิ่ม
สารบัญมาตรฐานและกฎเหล็กของ SML Ai Account (Standards Overview) · เช็กลิสต์ความปลอดภัย API: ตัวตน สิทธิ์ และช่องโหว่เว็บ (Secure API Checklist) · บทเรียนบั๊ก UX/หน้าจอธุรกรรม/Master/แท็บ MDI (Frontend UX Bug Lessons) · ยอดคงเหลือและต้นทุนสินค้า (Stock Balance and Costing, rebuildStockTx) · ภาพรวมระบบบัญชี SML AI Account (Accounting Overview) · ภาพรวม Backend Go ของ SML Ai Account (Backend overview)