Skip to content

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 (ความคุมลดหย่อน) ผ่าน TaxDraftvtrc-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 deleteisDelete (0/1)

จุดสำคัญ — childBirthBefore2561 และ childBirthAfter2561 แยกกัน เพราะกฎภาษีไทยเปลี่ยนปี 2561 (เด็กเกิดก่อน/หลังได้หักคนละจำนวน)


Dynamic form — ทำไมต้องมี templateFormTax

templateFormTax (taxDraft.js:295-322) คืน schema ของ form แบบ dynamic

graphql
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+2

delay 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 จะไม่มีผลย้อนหลัง

ขั้นตอนถัดไป

ไป บท 1.6 การลา →