#history#vat#tax#wht#etax
ภาพรวม
ปัญหาภาษีส่วนใหญ่ไม่ใช่สูตร แต่เป็นแถวภาษีที่ไม่ถูกลงทะเบียน, ปีภาษีเก็บคนละระบบ (พ.ศ./ค.ศ.), เลขใบกำกับซ้ำ และรายงานนับเอกสารที่ยกเลิก ช่วง 2026-10-19 .. 2026-10-29 เนื้อหามาจากโค้ดและ commit ยังไม่ได้ตรวจกับต้นทางสรรพากร (ข้อ 17) ดู ทะเบียนภาษีซื้อ/ภาษีขาย และภาษีหัก ณ ที่จ่าย (VAT Register & WHT)
อาการ
- V1 ปีภาษี (68f5a4d4, 13f953cc): รายงานภาษีขาย/ซื้อ/ภ.พ.30 ไม่นับรายการที่บันทึกตั้งแต่ 24/10 (UAT S1 #16) เพราะเก็บ
vat_effective_yearเป็น ค.ศ. แต่รายงานลบ 543 เสมอ - V2 แถวภาษีหาย (6983d7ea, 65dc0666, 13f953cc): ใบจ่าย/รับชำระหนี้ 19/239 และขายสินทรัพย์ 1802 ไม่มีแท็บ/แถวภาษี; เงินมัดจำ VAT (11/25/110/112) ไม่ลงทะเบียนภาษี ทั้งที่ GL ลงแล้ว (#17); รายงานภาษีหัก ณ ที่จ่ายนับใบที่ยกเลิก (#8, #18)
- V3 อัตรา VAT เป็น 0 (a3809aba): ตามชื่อ commit แถวภาษีหัวบิลมีฐานและภาษีแต่อัตราว่าง
- V4 เลขใบกำกับซ้ำ (7ff7d659):
tax_doc_noไม่ตามเลขที่เอกสารที่พิมพ์และไม่ตรวจซ้ำ - V5 กฎภาษีซื้อตอนบันทึก (5f188fc3): ตามชื่อ commit เพิ่มกฎตรวจ input VAT ตาม C#
- V6 อื่นๆ: e-Tax ปัดสตางค์ (a47413ec, ดู บทเรียนบั๊กการปัดเศษและทศนิยมเงิน (Rounding & Decimal Bugs)); ภาษีหลายใบกำกับ (6e9ae03e) และ e-VRT (d6bfe1b5) เป็นฟีเจอร์
สาเหตุ (root cause)
- V1: เดิมโค้ดเก็บ +543; ลุงจืดตัดสินวันที่ 2026-10-24 ว่าฐานข้อมูลเก็บ ค.ศ. เท่านั้น จอแปลงตาม
year_typeแต่ SQL รายงานglfaPeriodSQLยังลบ 543 ทุกแถว - V2: backend ยังไม่เขียนแถว VAT/WHT ของ 19/239 และ WHT ของ 1802 (ตามข้อความ 6983d7ea);
transVatTabsไม่มี flag มัดจำ; รายงาน WHT หาlast_statusจากic_transอย่างเดียว ทั้งที่ 19/239 อยู่ในap_ar_trans(diff 13f953cc) - V3:
trans_tax.goใช้h.vatRateตรง ๆ - V4: ไม่มีการตรวจเลขใบกำกับซ้ำเลยก่อน 7ff7d659
วิธีแก้
- V1: ค่าเริ่ม
vat_effective_year= ปีของวันที่ภาษี (ค.ศ.);JournalTaxTabsแสดงตามyear_typeและแปลงค่า > 2400 กลับ ค.ศ.; SQL รายงานลบ 543 เฉพาะค่า > 2400 - V2: backend ยังไม่เขียนแถว VAT/WHT ของ 19/239 และ WHT ของ 1802 (ตามข้อความ 6983d7ea);
transVatTabsไม่มี flag มัดจำ; รายงาน WHT หาlast_statusจากic_transอย่างเดียว ทั้งที่ 19/239 อยู่ในap_ar_trans(diff 13f953cc) - V3: ถ้าอัตราเป็น 0 แต่ฐานและภาษีมีค่า ให้คำนวณอัตราจากภาษี x 100 / ฐาน ปัดสองตำแหน่ง
- V4: ไม่มีการตรวจเลขใบกำกับซ้ำเลยก่อน 7ff7d659
- V5: ตัวเลือก
erp_option.check_input_vatตรวจเฉพาะ flag ในinputVatFlagsและ vat_type 0/1
commit ที่เกี่ยวข้อง
6983d7ea/65dc0666— VAT/WHT ของ 19/239/1802 และแท็บหน้าจอ68f5a4d4— เก็บปีภาษีเป็น ค.ศ.13f953cc— รายงานปี > 2400, flag มัดจำ, สถานะยกเลิกa3809aba— อัตรา VAT เป็น 07ff7d659—tax_doc_noตามเลขเอกสาร + ตรวจซ้ำ5f188fc3— กฎภาษีซื้อ;a47413ec,4d6cb8de(ดูบันทึกปัดเศษ)6e9ae03e/d6bfe1b5— ภาษีหลายใบกำกับ / e-VRT (ตามข้อความ commit; backend ของ d6bfe1b5 แก้แค่ป้ายรูปแนบetax/handler.go:902; ประกาศสรรพากรที่ commit อ้างยังไม่ verify)
โค้ดปัจจุบันที่ป้องกัน
backend/internal/application/process/report_menu_gl_fa.go:1023glfaPeriodSQL; เทสuat_s1_fixes_test.go:139backend/internal/application/process/trans_tax.go:37transVatTabs(เทสuat_s1_fixes_test.go:146);:80คำนวณอัตราย้อนกลับbackend/internal/application/process/journaltax.go:29ปีเป็น ค.ศ.;:153vatInsertSQLbackend/internal/application/process/trans_tax_doc_no.go:18checkTaxDocNo; เทสtrans_tax_doc_no_test.go:16backend/internal/application/process/trans_save_rules.go:53inputVatFlags,:140ตรวจcheckInputVat
บทเรียน / กฎที่ได้
- เก็บปีเป็น ค.ศ. ที่เดียว แปลงเฉพาะที่จอ และ SQL ที่อ่านปีต้องรองรับค่าเก่า (> 2400) ต่อไป
- ทุกชนิดเอกสารที่ GL ลงภาษีต้องมีแถวทะเบียนภาษีคู่กันเสมอ เทสด้วยตาราง flag
- สถานะยกเลิกอยู่คนละตารางตามชนิดเอกสาร รายงานต้องเลือกตารางตาม
trans_flag - การตรวจเลขใบกำกับซ้ำต้องล็อก ไม่งั้นสองคำขอผ่านพร้อมกัน
ดูเพิ่ม
ทะเบียนภาษีซื้อ/ภาษีขาย และภาษีหัก ณ ที่จ่าย (VAT Register & WHT) · บทเรียนบั๊กการปัดเศษและทศนิยมเงิน (Rounding & Decimal Bugs) · บทเรียน ปี พ.ศ./ค.ศ. และวันที่ (Dates, Buddhist year and year_type) · บทเรียนบั๊กการชำระเงิน เช็ค และช่องทางรับจ่าย (Payment, Cheque & Tender Bugs) · history-overview
ที่มาในโค้ด
- git:
6983d7ea,65dc0666,68f5a4d4,7ff7d659,a3809aba,13f953cc,5f188fc3,6e9ae03e,d6bfe1b5 tests/uat/out/20261028/summary.md(#8, #16-#18),docs/HANDOFF_SMLCM_PARITY_2026-10-22.md(TAXDOC-OVERRIDE)