ประวัติและบทเรียนของระบบ SML Ai Account
หน้านี้คือศูนย์กลาง (hub) ของมิติ "ประวัติและบทเรียน": ระบบวิวัฒนาการอย่างไร และบั๊กหรือกับดักชนิดใดที่เจอซ้ำ สกัดจาก git log กับเอกสารส่งต่องาน (handoff) ทุกอย่างอ้าง SHA แบบ 8 ตัวอักษร และ path:line ของโค้ดปัจจุบัน
ภาพรวม
- ประวัติใน git ทั้งหมดอยู่ในช่วงเดียว 19–29 ต.ค. 2026 (ไม่มี commit วันที่ 28) รวม 234 commit; ในนั้น 175 commit แตะ
backend/หรือfrontend/account/(ขอบเขตของมิตินี้) - commit แรก
8bd921d1(19 ต.ค.) รวม Go backend + Next.js 16 แบบแยกโมดูล + POS เข้า monorepo เดียว ส่วนTODO.mdถูกเพิ่มใน commit นี้และไม่เคยถูกแก้อีก จึงเป็นภาพนิ่งของยุค "เว็บพอร์ต + mock ข้อมูล" ก่อนมี Go backend จริง (ดู งานค้างที่ยังเปิดอยู่ (Open Items Verified Against Code)) - จำนวน commit ที่แตะขอบเขตต่อวัน: 19=10, 20=12, 21=25, 22=45, 23=8, 24=33, 25=12, 26=17, 27=3, 29=10 (วันที่ 22 และ 24 หนักสุด)
- วันที่ใน log เป็น author date ตามลำดับ commit จริง บางช่วงเวลาไม่เรียงต่อเนื่อง (เช่น
a47413ec01:30 อยู่หลัง6e9ae03e07:24 ของวันที่ 24) - commit ที่อยู่นอกขอบเขต (59 ตัว เช่น Balloon Help, build stamp, AutoCare, form print ฝั่ง portal, เอกสาร KMS) ไม่เล่าที่นี่ ยกเว้นที่เป็นที่มาของบทเรียน เช่น
faa6e6d0(ชุดแก้ความปลอดภัยฝั่งfrontend/src)
ไทม์ไลน์ (ต.ค. 2026)
19 ต.ค. — รวมระบบ และไล่ปิด issue จาก GitHub เป็นก้อน
8bd921d1รวม Go backend, frontend, POS เป็น monorepo1ae4ac0cปิด issue #1–#35 (PO, C# parity) พร้อม watcher อ่าน issue อัตโนมัติ;bc8d27d4#36–#48 (AR);866328e7#49–#72 (IC layout);bbf81811#73–#91;72d402f3#92–#93 (ตรวจนับสต็อก/serial)e7168c84/6983d7eaรอบ audit r2: cancel/delete/VAT ตาม C#, คอลัมน์รูปเป็น bytea, partial cancel, ภาษี 19/239/1802, seed เฉพาะsmldemo2c273e19บังคับสิทธิ์เมนู SML บน/process;65dc0666แท็บ VAT/WHT ในจอ 19/239/1802 → บทเรียนระบบสิทธิ์เมนู (Permission & Menu Rights), บทเรียนบั๊กภาษีมูลค่าเพิ่มและภาษีหัก ณ ที่จ่าย (VAT, WHT & e-Tax Mistakes)
20 ต.ค. — พอร์ตเมนูและจอหลักให้ตรง C#
04fb2f9f/a352b60fจอสินค้า 2.1.1 บันทึกผ่าน Go (itemmaster);ebe66efdrebuildic_serialตอนบันทึกสินค้าa396c7b8,3aad0b1a,2c97aa3a,c201ca5aไล่ปรับเมนู 816 → 1,457 → 742 → 708 รายการให้ตรง SMLCM และกำหนด trans_flag 276/801/802360ff250ครบ 26 จอในเมนู 1.1;769fc3bbคลัง/ที่เก็บic_wh_shelf;6ba1a6d9แก้ 401 token refresh และ auto stock adjust 2.19.6/2.19.7 → บทเรียนการบันทึก master data ไม่ให้ข้อมูลหาย (Master Save: Preserve Columns)
21 ต.ค. — ชุด SMLCM parity และ "กฎ R-" ฝั่ง backend
28307282ดึงพิมพ์เขียว (blueprint) C#/Java ทั้งชุดมาเทียบ → สถานะ Parity กับ SMLCM ตามเอกสาร (SMLCM Parity Status)- ชุด
fix(smlcm-parity)10 commit (8698303f…a0b12158): header default, price engine, AP/AR, stock rebuild/average cost, docflow, GL + ค่าเสื่อม, lookup, รายงาน 239b0997ย้าย SQL เขียนฝั่ง frontend เข้า backend + ล็อกการเขียน/query/exec(923fae86ปรับเลข ADR เป็น 0011) → บทเรียนการล็อกการเขียนผ่าน query gateway (Query Gateway Write Lockdown)- ห้ากลุ่ม "R-":
5f188fc3R-SAVE,2a125c8eR-CALC,d51fcdd4R-REPORT,21bb411bR-GRID-UI,9f47a34cR-LOOKUP → บทเรียนกฎตอนบันทึกเอกสาร (Trans Save Rules & Validation), บทเรียนบั๊กการปัดเศษและทศนิยมเงิน (Rounding & Decimal Bugs) 7b6fe34bพอร์ต GL template engine;9e29f6dfต้นทุนแฝง (flag 66) → บทเรียนบั๊กลงบัญชี GL และความสมดุล (GL Posting & Balance Bugs), บทเรียนบั๊กสต็อกและต้นทุนถัวเฉลี่ย (Stock & Moving Average Cost Bugs)
22 ต.ค. — วันที่หนักสุด: คลื่น R3 และปิดรอบ parity
- รอบ R3: FX (
ee422543), price center (26c7af0d), pay tab (d1ebfe18),find_lot_auto+ credit approval (b002e065), set items (054c6063),perm_wh_shelf(1b79fbc9), ref-import เป็น endpoint เดียว (070e845d,f0c1eee8) → บทเรียนเอกสารอ้างอิงและ Doc Flow (Document Reference & Flow), บทเรียนบั๊กการชำระเงิน เช็ค และช่องทางรับจ่าย (Payment, Cheque & Tender Bugs) - กันบั๊กพร้อมกัน:
4341ae81ล็อกต่อสินค้ากัน deadlock40P01,ac839a65ล็อก GL rebuild กับการบันทึก → บทเรียนบั๊กการทำงานพร้อมกันและ advisory lock (Concurrency & Advisory Locks) - ช่องกรอก/รายงาน:
82dbe5d4DateBox/NumberBox,09bed48b,5e33f5c2,77780f6e→ บทเรียน ช่องตัวเลข/วันที่และกฎ 'ศูนย์แสดงเป็นว่าง' (Numeric input, DateBox and blank-zero), บทเรียน เครื่องมือรายงานให้ตรง C# (Report engine parity), บทเรียน ข้อความไทยใน PDF และงานพิมพ์ (Thai text, PDF and print) - ทิ้งโค้ดเดิม:
20dd8f27ลบ legacy report runners และจอ tax amendment - เริ่มใช้ตั๋ว IssueMate:
b9502e64(SMLAIACC-106) ถึง3b55658e(SMLAIACC-113) → บทเรียนรอบ UAT และบั๊ก S1 วันที่ 2026-10-29 (UAT Rounds & S1 Bugs) - ปิดรอบ: เอกสารส่งต่อ
a087ff10, merge62c7098f(R3E/R3F/R3G), อัปเดตรายงาน parity58fe0ccf
23 ต.ค. — จอข้อมูลภูมิศาสตร์/ธนาคาร และ UX
a422b74fตรวจงานที่ยังไม่บันทึกก่อนปิดแท็บ → แท็บ MDI: คีย์ลัดแท็บซ่อน, listKey ชน, กันทิ้งข้อมูล (Hidden-Tab Hotkeys & Dirty Guard)ab7d1893,bd57ff05,c0bcbb85,3839482dต้นไม้จังหวัด/อำเภอ/ตำบล, GPS, แผนที่ Leaflet, โลโก้ธนาคาร33cf6477แท็บย่อยกลายเป็น Section Card;5fa7e098ย้ายโดเมนผลิตจริง, ตัดคำไทย,year_typeแบบไดนามิก → บั๊กตาราง/เลย์เอาต์ที่เคยถอยหลัง (Grid & Layout UX Regressions), บทเรียน ปี พ.ศ./ค.ศ. และวันที่ (Dates, Buddhist year and year_type)
24 ต.ค. — ไล่หาบั๊กทั้งโปรเจกต์ (security + data integrity sweep)
- ความปลอดภัย:
faa6e6d0(ตรวจ Google ID token, ปิด open redirect, escape popup แผนที่, จำกัด content-type),7ab65d38(fail closed ถ้าไม่มี admin key),a47413ec(/blob/insert ต้องผ่าน lockdown) → บทเรียนช่องโหว่เว็บ XSS และ open redirect (Web Vulnerabilities), บทเรียนตัวตนผู้เช่า การล็อกอิน และ session (Tenant, Auth & Sessions) - ธุรกรรม:
a47413ec,4de91436(checkout ตลาดเป็น transaction เดียว, เลขเอกสารกันชน),5e3dbd36(rebuild ถัง WMS แบบกำหนดผลได้) → บทเรียนธุรกรรมอะตอมมิกและ error ที่ถูกกลืน (Atomic Transactions & Swallowed Errors) - หน้าจอ:
678fc5fc,7dc1b3a6,324bd2a6,6cb904f7(คีย์ลัดแท็บซ่อน, ถามก่อนทิ้งข้อมูล, ทศนิยมตามerp_option) - ข้อมูลเอกสาร:
2ab00c67serial,dc975db9shipment,a133ded8ชำระหลายแถว,68f5a4d4ปี ค.ศ.,ceda88d1ปีตามyear_type→ บทเรียน Serial / Lot / ข้อมูลขนส่ง (Serial, Lot & Shipment Persistence) - สิทธิ์/ผู้ใช้:
a264a99a,0d77e6fbสิทธิ์แยกตามฐานข้อมูลและบังคับฝั่ง backend;a94b0748ผู้ดูแลส่วนกลาง + เปลี่ยนรหัสผ่านเอง;6e9ae03eGoogle PDPA หลายผู้เช่า + VAT หลายใบกำกับ 6e89ce3aกราฟ Document Flow; ชุด969decaf…792a6eefตัวออกแบบฟอร์ม;0a7580cfAutoCare (นอกขอบเขตมิตินี้)
25–27 ต.ค. — รุ่น (edition), ประเภทธุรกิจ, ภาษา
b9c13081กฎ "เว็บใช้ปุ่มบนจอ ไม่ใช้ F1–F12";a67dc5f0เมนูเฉพาะแอดมิน;3e69b2b5MCP แบบอ่านอย่างเดียว6442540d/422b5996สลับรุ่น Starter/Account/Pro;a4b2fa88→4d238d4b17 ประเภทธุรกิจ;b10adb77รหัสเมนู 4 หลัก;9a2ce199เลิกรุ่น Express + บังคับล็อกอินใหม่เมื่อ session หมด89d49042,3ec04525,09d490a5พิมพ์ฟอร์มเอกสาร;d6bfe1b5ขอคืน VAT นักท่องเที่ยว (e-VRT) → บทเรียน ข้อความไทยใน PDF และงานพิมพ์ (Thai text, PDF and print)47fce10e(27 ต.ค.) สลับภาษาไทย/อังกฤษทั้งระบบ + Balloon Help สองภาษา
29 ต.ค. — รอบ UAT S1 และตั๋ว IssueMate
13f953ccแก้ 13 บั๊กระดับ S1 + 5 รายการ Hold (ลง GL, ต้นทุนถัวเฉลี่ย, สิทธิ์, ความปลอดภัยรายงาน, bcrypt)a3809abaห้ามเรียก query/list ก่อนล็อกอิน, seed ลูกค้า POS, อนุมานอัตรา VAT เมื่อเป็น 0;8dad8a4d(SMLAIACC-122);3ca3b07b(SMLAIACC-123…169)- ชุด SMLAIACC-234/235:
536f2f7c,5f76fd75,4c503032,e6c8e0af,91799b37,75c8a5b6(คงคอลัมน์นอกจอตอน UPDATE ของar_dealer) = commit ล่าสุดในขอบเขต → บทเรียนการบันทึก master data ไม่ให้ข้อมูลหาย (Master Save: Preserve Columns)
รูปแบบบั๊กที่วนซ้ำ (cross-cutting)
- เดา/สร้างเองแทนอ่านโค้ด C# — จอ 1.1.2 รอบแรกสร้างจาก markdown ได้ฟิลด์หาย 7 และเดาเอง 3 (บทเรียนบรรทัดแรกของ
TODO.md), คอลัมน์ส่วนลดบาร์โค้ดที่แต่งขึ้นถูกถอดใน7064535f→ บทเรียน schema drift และคอลัมน์ที่เดาเอง (Schema Drift & Invented Columns) - ตัวเลขปัดไม่ตรงจุดของ C# (ToEven/HALF_UP/double,
2ตายตัว) → บทเรียนบั๊กการปัดเศษและทศนิยมเงิน (Rounding & Decimal Bugs) - งาน async ลงผิดเอกสาร/ผิดแท็บ (โหลดซ้อน, คีย์ลัดแท็บที่ซ่อน, listKey ชน) → แท็บ MDI: คีย์ลัดแท็บซ่อน, listKey ชน, กันทิ้งข้อมูล (Hidden-Tab Hotkeys & Dirty Guard)
- เขียนครึ่งๆ กลางๆ + ทิ้ง error แล้วตอบ 200 → บทเรียนธุรกรรมอะตอมมิกและ error ที่ถูกกลืน (Atomic Transactions & Swallowed Errors)
- ประตูเขียนข้อมูลหลายบาน (
/query/exec,/blob/insert, proxy) ต้องใช้นโยบายเดียวกัน → บทเรียนการล็อกการเขียนผ่าน query gateway (Query Gateway Write Lockdown) - วันที่/ปี:
toISOString()เป็น UTC,+543ตายตัว → บทเรียน ปี พ.ศ./ค.ศ. และวันที่ (Dates, Buddhist year and year_type) - ข้อมูลทดสอบค้างใน DB สาธิต ลบผ่าน API ของแอป ไม่ใช่ SQL ดิบ → บทเรียนรอบ UAT และบั๊ก S1 วันที่ 2026-10-29 (UAT Rounds & S1 Bugs)
แผนที่บันทึกบทเรียน
วิธีอ่านประวัติอย่างระวัง
git log -- backend frontend/accountไม่รวมไฟล์ในfrontend/src/และfrontend/shared/; ชุดแก้ความปลอดภัยฝั่งหน้าเว็บอยู่ที่faa6e6d0ซึ่งไม่ผ่านตัวกรองนี้- ข้อความ commit ช่วง 21–24 ต.ค. มักบอกแค่ชื่อเรื่อง โน้ตบทเรียนจึงระบุว่าเคสไหน "ตรวจ diff แล้ว" และเคสไหน "ตามข้อความ commit"
- working tree ปัจจุบันมีไฟล์ที่ยังไม่ commit (เช่น
AGENTS.md,backend/internal/adapter/inbound/http/mcp/gateway.go) โน้ตที่อ้างpath:lineอ้างตามไฟล์บนดิสก์ ณ 2026-10-31
ดูเพิ่ม
สารบัญมาตรฐานและกฎเหล็กของ SML Ai Account (Standards Overview) · สารบัญ ADR ของ backend (Architecture Decision Records) · ความถูกต้องของข้อมูล: เงิน ภาษี Transaction เดียว และ Rebuild (Data Integrity, big.Rat, ExecBatch) · บทเรียนบั๊ก UX/หน้าจอธุรกรรม/Master/แท็บ MDI (Frontend UX Bug Lessons) · บทเรียนบั๊กสิทธิ์และการข้ามฐานข้อมูล (Auth Bypass, Cross-Tenant, Demo Read-Only, Screen Rights) · การปัดเศษ ทศนิยม และตัวเลขเงิน (Rounding & Decimal Policy) · กระบวนการสร้างสมุดรายวัน GL ใหม่ (GL Rebuild Process) · การคำนวณยอดสต็อกคงเหลือใหม่ (Stock Balance Rebuild) · ตัดคำไทยใน PDF ไม่แยกสระ/วรรณยุกต์ และรายงานหลายชั้น (Thai Wrap, Multi-Level Report)
ที่มาในโค้ด
git log --reverse --format='%h %ad %s' --date=short -- backend frontend/account(175 commit ณ HEAD3ac50564ซึ่งเองอยู่นอกขอบเขต; commit ล่าสุดในขอบเขตคือ75c8a5b6)TODO.md(เพิ่มใน8bd921d1, ไม่เคยถูกแก้หลังจากนั้น),docs/HANDOFF_SMLCM_PARITY_2026-10-22.md,docs/HANDOFF_CLAUDE_CODE_100_CLONE.md,docs/HANDOFF_CLAUDE_CODE_AUDIT.mddocs/kms/KMS_SECURITY_DATA_INTEGRITY_LESSONS.md(ผลไล่หาบั๊ก 24 ต.ค.)