1.5 · ภาษีเงินได้
บทนี้อธิบาย flow ภาษีเงินได้ใน VTRC — ทั้ง "ดูใบภาษี" และ "แก้ความคุม" (allowance)
VTRC ไม่ได้คำนวณภาษี — คำนวณที่ HRMI ตามข้อมูล allowance ที่ส่งไป VTRC เป็นที่เก็บ draft และ channel ส่งข้อมูล
ประเภทเอกสารภาษี
| Query | สิ่งที่ได้ | ใช้ตอนไหน |
|---|---|---|
fetchUrlTax(month, year) | ภ.ง.ด. 1ก (50 ทวิ) | ภาษีรายเดือน |
fetchUrlTax6Month(...) | ภ.ง.ด. 40(6) ม.ค.–มิ.ย. | ภาษี 6 เดือนแรก |
fetchUrlTaxYears(...) | ภ.ง.ด. 40(6) ทั้งปี | ภาษี 12 เดือน |
Source — vtrc-api/api/src/typeDefs/slip.js:29-48
ทั้งสาม query คืน URL ที่มี hash คล้าย slip PDF — เปิดผ่าน browser จะ trigger PDF generation ฝั่ง vtrc-api/routes.js
password ของ PDF ภาษี = วันเดือนปีเกิด เช่นเดียวกับสลิป (DDMMYYYY ปี พศ.)
Tax Draft — ความคุมลดหย่อน
พนักงานสามารถแก้ allowance (ความคุมลดหย่อน) ผ่าน TaxDraft — vtrc-api/api/src/typeDefs/taxDraft.js:1-337
flow คร่าว ๆ
พนักงานเปิดหน้า "ความคุมลดหย่อน"
│
▼
fetchTaxDraft(month, year) → ดึง draft ปัจจุบัน
│
│ (ถ้ายังไม่เคยกรอก ระบบ prefill จาก HRMI)
▼
templateFormTax → ขอ form schema (field อะไรบ้าง)
│
▼
พนักงานแก้ข้อมูล → createTaxDraft / updateTaxDraft
│
▼
draft ถูกเก็บใน MariaDB (table TaxDraft)
│
│ (sync ไป HRMI ใน batch — ไม่ใช่ทันที)
▼
HRMI ใช้ draft คำนวณภาษีเดือนถัดไปField ของ TaxDraft — ทั้งหมดที่กรอกได้
taxDraft.js:18-198 — payload ของ createTaxDraft และ updateTaxDraft
| กลุ่ม | Field สำคัญ |
|---|---|
| บุตร | childBirthBefore2561, childBirthAfter2561, adoptedChild |
| บิดา-มารดา | (เลือกผ่าน relation code) |
| พ่อ-แม่ของคู่สมรส | (เลือกผ่าน relation code) |
| ผู้พิการ | disabledPerson1..disabledPerson10 |
| ประกัน | healthInsurance, insuraAmount |
| ลงทุน | rmfDeposit, ssfDeposit |
| ดอกเบี้ยกู้บ้าน | interestLoan |
| ประกันสังคม | accumulateSocial |
| บริจาค | donationEducate, donationCharity |
| Soft delete | isDelete (0/1) |
จุดสำคัญ — childBirthBefore2561 และ childBirthAfter2561 แยกกัน เพราะกฎภาษีไทยเปลี่ยนปี 2561 (เด็กเกิดก่อน/หลังได้หักคนละจำนวน)
Dynamic form — ทำไมต้องมี templateFormTax
templateFormTax (taxDraft.js:295-322) คืน schema ของ form แบบ dynamic
type FormTemplate {
name: String
conditions: String
keyForm: String
disableTitle: Boolean
input: [FormInput]
}
type FormInput {
label: String
name: String
type: String # text, number, radio
min: Float
max: Float
radioChoices: [String]
}เหตุผล — กฎภาษีไทยเปลี่ยนบ่อยมาก (เกือบทุกปี) ถ้า hardcode ใน frontend ต้อง deploy ใหม่ทุกครั้ง
VTRC เลย expose form schema จาก backend — HR แก้ใน MasterData ได้ โดยไม่ต้อง deploy frontend
Form Schema source — MasterData
template form ไม่ได้ hardcode ในโค้ด แต่ดึงจากตาราง MasterData ใน MariaDB
HR สามารถแก้ label, min/max, radioChoices ผ่านเมนู MasterData (menu key masterData) ได้ — แต่ field name (เช่น rmfDeposit) ต้องตรงกับ TaxDraft model
ถ้า HR เปลี่ยน field name ใน MasterData — form จะ submit แต่ VTRC จะไม่รู้จัก field และทิ้งข้อมูล
Static instructional content
นอกจาก form schema ยังมี static content 3 อย่าง
| Query | หน้าที่ |
|---|---|
guideLineTax | คู่มือความคุมลดหย่อนประจำปี |
detailTax | คำอธิบายแต่ละ field |
confirmTextTaxDraft | ข้อความยืนยันก่อน submit draft |
content ทั้งหมดมาจาก HR ผ่าน MasterData — ไม่ใช่จากกรมสรรพกร
6 เดือน vs 12 เดือน — กำหนดเองไม่ได้
fetchUrlTax6Month และ fetchUrlTaxYears ใช้วันที่ตายตัว ปีภาษีไทย (ม.ค.–ธ.ค.)
- 6 เดือนแรก = ม.ค.–มิ.ย.
- 6 เดือนหลัง = ก.ค.–ธ.ค. (ออกใบ 40(6) ครึ่งปีหลังในไฟล์เดียวกับ 12 เดือน)
- 12 เดือน = ม.ค.–ธ.ค.
repository layer — checkExistYearPayroll(args, fromMonth, toMonth, session) ตรวจว่า HRMI ปิดบัญชีเดือนเหล่านั้นแล้วหรือยัง — ถ้ายัง ใบ 40(6) จะไม่สมบูรณ์
หมายเหตุ — dynamic dropdown ที่ใช้ flag นี้ถูก comment ไว้ในปัจจุบัน (controllers/slip/slip.js:90-152) frontend ใช้ fixed list แทน แปลว่าบางครั้งใบ 40(6) แสดงให้ดาวน์โหลด แม้ HRMI ยังไม่ปิดเดือนสุดท้าย
เมื่อไร tax draft ส่งผลต่อสลิป
พนักงานแก้ TaxDraft (เดือน N)
│
▼
sync ไป HRMI (เดือน N หรือ N+1)
│
▼
HRMI คำนวณภาษีเดือน N+2 เป็นต้นไป
│
▼
พนักงานเห็นภาษีเปลี่ยนในสลิปเดือน N+2delay 1-2 เดือน เป็นเรื่องปกติ — HR ต้อง batch sync และ HRMI ต้อง reprocess
ถ้าพนักงานบอกว่า "แก้ความคุมแล้วสลิปไม่เปลี่ยน" — อย่าเพิ่งคิดว่าเป็น bug ให้ถาม HR ก่อนว่า sync ไป HRMI หรือยัง
ข้อจำกัดที่ต้องรู้
- VTRC ไม่คำนวณภาษี — ทุกตัวเลขในสลิปและใบ 40(6) มาจาก HRMI
- TaxDraft sync ไป HRMI เป็น batch ไม่ใช่ real-time
- แก้ TaxDraft ได้แค่ "ของตัวเอง" — HR แก้แทนไม่ได้ผ่านระบบ (ต้องแก้ใน HRMI โดยตรง)
- ถ้า HRMI ปิดเดือนแล้ว การแก้ TaxDraft จะไม่มีผลย้อนหลัง