Object นี้คือ “ตัวออกไฟล์ e-Filing” — ไม่ใช่รายงานให้คนอ่าน แต่เป็น text file ที่กรมสรรพากร (RD) อ่าน สร้างจาก DMEEX format tree 6 ต้น (ต้นละ 1 แบบยื่น) เกาะอยู่บน standard program Generic Withholding Tax Reporting เดียวกับที่ TAX-RPT-1 และ TAX-FRM-1 ใช้ delta ของ S/4HANA คือ Profit Center + Recovery Indicator ที่ทำให้ 1 การรัน แตกออกเป็นหลายไฟล์
WIT (Withholding tax transaction line-item identifier)CEPC-PRCTR) + Recovery Indicator (validate T8JJ-RECID คู่กับ BUKRS)Enhancement (ไม่ใช่ Report) ที่ต่อยอด standard program เพื่อ “พ่นไฟล์” ให้ RD
ในกระบวนการยื่นภาษีหัก ณ ที่จ่ายของไทย งานมี 3 ชิ้นที่ต้องออกมาพร้อมกันทุกเดือน — (1) ตัวแบบยื่น (ภ.ง.ด.) (2) ใบแนบ (attachment) และ (3) ไฟล์ e-Filing ที่อัปโหลดเข้าระบบ RD TAX-ENH-1 รับผิดชอบชิ้นที่ 3 สำหรับ 6 แบบ คือ ภ.ง.ด. 1, 1ก, 2, 2ก, 3 และ 53 (ภ.ง.ด. 54 ไม่อยู่ใน object นี้ — 54 เป็นเรื่องของ TAX-RPT-1 / TAX-FRM-1)
WITH_ITEM อยู่แล้ว งานที่เหลือคือ “ต่อท่อ” ให้ไปออก DMEEX ตัวที่ถูกZTAXA_E01นี่คือหัวใจของ object · จำ 3 ชั้นนี้ได้ = ตอบได้ทุกคำถามว่าธุรกรรมหนึ่งจะไปโผล่แบบไหน
| Field | ค่า | ความหมาย |
|---|---|---|
| Text (transaction key) | WIT | Withholding tax transaction line-item identifier — ใช้คัดว่าบรรทัดใน ACDOCA คือรายการ WHT (field KTOSL) |
WITH_ITEM-WITHT)| WHT Type | ไปแบบยื่น | ตีความ |
|---|---|---|
1A 1B 1D 1E | ภ.ง.ด. 1 และ ภ.ง.ด. 1ก | เงินได้จากการจ้างแรงงาน — บุคคลธรรมดา (เงินเดือน/ค่าจ้าง) |
2A | ภ.ง.ด. 2 และ ภ.ง.ด. 2ก | เงินได้ประเภทดอกเบี้ย/เงินปันผล ฯลฯ ของบุคคลธรรมดา |
3A–3F | ภ.ง.ด. 3 | จ่ายให้ บุคคลธรรมดา (ค่าบริการ/ค่าจ้างทำของ/ค่าเช่า ฯลฯ) |
4A–4F | ภ.ง.ด. 53 | จ่ายให้ นิติบุคคล ในประเทศ |
WITH_ITEM-QSREC) · ตัวยืนยันซ้ำ| Recipient Type | แบบยื่น |
|---|---|
01 | ภ.ง.ด. 1 / 1ก |
02 | ภ.ง.ด. 2 / 2ก |
03 | ภ.ง.ด. 3 |
53 | ภ.ง.ด. 53 |
WITH_ITEM-WT_WITHCD) · ประเภทเงินได้| ใช้กับ | WHT Codes | หมายเหตุ |
|---|---|---|
| ภ.ง.ด. 1 / 1ก | 01 02 03 GA G1 | รหัสตระกูล G* = กรณีพิเศษ/gross-up |
| ภ.ง.ด. 2 / 2ก | 04 05 06 07 08 | — |
| ภ.ง.ด. 3 และ 53 (ช่อง 5 ของแบบ) |
09 11 12 13 14 15 23 24 25 27 28 29 31 33 34 GB GC GD GE G2 G3 G4 G5 |
ชุดเดียวกันทั้ง 3 และ 53 — แยกกันด้วย WHT Type/Recipient Type ไม่ใช่ด้วย code |
KTOSL = WIT ไหม → (2) WITHT อยู่ในลิสต์ของแบบนั้นไหม →
(3) QSREC ตรงกับแบบไหม → (4) WT_WITHCD ว่างหรือเปล่า
ส่วนใหญ่ 80% หลุดที่ข้อ 3 หรือ 4 ซึ่งเป็น master data ของ vendor ไม่ใช่โค้ดหน้าจอเดิมของ standard + 2 field ใหม่ใน block “Further Selections”
| Block | Field | ใช้ทำอะไร |
|---|---|---|
| Output Groups | Process Type · Output Groups | เลือกว่าจะให้ออก output อะไร (ไฟล์/ฟอร์ม/list) |
| Mandatory Selections | Country Key · Reporting Period | TH + ช่วงงวดยื่น |
| General Selections | Company Code · Fiscal Year · Extended WH Tax Type · Extended WH Tax Code · Classic WH Tax Code · Suppliers · Customers | ตัวกรองหลัก — ทุกตัวเป็นช่วง/หลายค่าและ exclude ได้ |
| General Control | (standard) | คุมพฤติกรรมการรัน |
| Further Selections | Profit Center · Recovery Indicator | ← 2 ตัวนี้คือ delta ของ S/4HANA |
| Field | Type | Attribute | Parameter | Default | Validation |
|---|---|---|---|---|---|
| Profit Center | CHAR(10) | Optional | From, To + multiple selection | None | เช็คกับ CEPC-PRCTR |
| Recovery Indicator | CHAR(2) | Optional | Multiple selection | None | เช็คกับ T8JJ-RECID โดย ส่งคู่กับ Company Code (BUKRS) |
T8JJ เป็นตาราง JVA (Joint Venture Accounting) — recovery indicator ตัวเดียวกัน
อาจมีความหมาย/ใช้ได้ต่างกันในแต่ละ company code การ validate ลอย ๆ จะปล่อยค่าที่ไม่ควรใช้ผ่านเข้ามา
แล้วได้ไฟล์เปล่า (ไม่ error แต่ไม่มีข้อมูล) ซึ่งแย่กว่า errorส่วนเดียวที่เป็น “ตรรกะใหม่” จริง ๆ ในเอกสารฉบับนี้
จำนวนไฟล์ ≈ (แบบยื่นที่มีข้อมูล) × (Business Place) × (Profit Center ที่เลือก | Recovery Indicator ที่เลือก)
→ ถ้าไม่เลือกทั้ง PC และ RECID ก็เหลือแค่ (แบบยื่น × สาขา) เหมือน ECC เดิม → นี่คือเหตุผลที่ volume ระบุไว้ว่า >1,000 records/เดือน แต่จำนวน “ไฟล์” อาจสูงกว่าที่คนคาดมาก
object ทางเทคนิคทั้งหมดที่ต้องส่งมอบ
| แบบยื่น | DMEEX Format Tree | จำนวน field ใน layout |
|---|---|---|
| ภ.ง.ด. 1 | ZWHTFILE_PND1 | 13 |
| ภ.ง.ด. 1ก | ZWHTFILE_P01A | 15 |
| ภ.ง.ด. 2 | ZWHTFILE_P02 | 13 |
| ภ.ง.ด. 2ก | ZWHTFILE_P02A | 18 |
| ภ.ง.ด. 3 | ZWHTFILE_P03 | 16 |
| ภ.ง.ด. 53 | ZWHTFILE_P53 | 14 |
สังเกต naming: prefix ZWHTFILE_ คงที่ ส่วนท้ายคือรหัสแบบ —
ต้นที่ยาวสุด (P02A, 18 field) คือ ภ.ง.ด.2ก เพราะเป็นแบบ “สรุปทั้งปี + ที่อยู่เต็ม + อัตราภาษี”
| EXIT Function Module | คำนวณอะไร |
|---|---|
ZDMEE_EXIT_WHT_BASE | WHT Base — ฐานภาษีที่ใช้คำนวณหัก ณ ที่จ่าย |
ZDMEE_EXIT_WHT_AMT | WHT Amount — ยอดภาษีที่หักและนำส่ง |
WITH_ITEM เสมอไป — มีเรื่อง สกุลเงิน / การปัดเศษ / รูปแบบตัวเลขที่ RD บังคับ
และกรณี gross-up (รหัส G*) ที่ฐานต้องถูกคำนวณย้อน DMEEX ทำ arithmetic ซับซ้อนได้จำกัด จึงโยนออกมาเป็น FMZTAXA_E01 (retrofit จาก ECC)อ่านเป็น “ผัง” ไม่ต้องท่อง — แต่ต้องรู้ว่าแบบไหนมีอะไรที่แบบอื่นไม่มี
| # | Field | คำอธิบาย |
|---|---|---|
| 1 | Company Tax ID | เลขประจำตัวผู้เสียภาษีของบริษัท |
| 2 | Business Place | สาขา |
| 3 | Income Type | ประเภทเงินได้ |
| 4 | Page No | แผ่นที่ |
| 5 | Seq. No | ลำดับที่ |
| 6 | Tax ID | เลขประจำตัวผู้เสียภาษีของผู้มีเงินได้ |
| 7 | Title | คำนำหน้า |
| 8 | Name | ชื่อผู้มีเงินได้ |
| 9 | Sur-Name | นามสกุล |
| 10 | Payment Date | วัน/เดือน/ปี ที่จ่าย |
| 11 | Payment Amount | จำนวนเงินที่จ่าย |
| 12 | Withholding tax amount | ภาษีที่หักและนำส่ง |
| 13 | Condition | เงื่อนไข: 1 หักภาษี ณ ที่จ่าย · 2 ออกให้ตลอดไป · 3 ออกให้ครั้งเดียว |
| # | Field | คำอธิบาย |
|---|---|---|
| 1 | Seq. No | ลำดับที่ |
| 2 | Income Type | ประเภทเงินได้ |
| 3 | Tax ID | เลขประจำตัวผู้เสียภาษี |
| 4 | Title | คำนำหน้า |
| 5 | Name | ชื่อ |
| 6 | Sur-Name | นามสกุล |
| 7 | House Number | บ้านเลขที่ |
| 8 | Street | ถนน |
| 9 | Tumbon | ตำบล/แขวง |
| 10 | District | อำเภอ/เขต |
| 11 | City | จังหวัด |
| 12 | Post Code | รหัสไปรษณีย์ |
| 13 | Payment Amount | ยอดรวมที่จ่ายทั้งปี |
| 14 | Withholding tax amount | ภาษีที่หักและนำส่ง |
| 15 | Condition | เงื่อนไข 1/2/3 |
| # | Field |
|---|---|
| 1 | Company Tax ID |
| 2 | Business Place |
| 3 | Income Type |
| 4 | Page No |
| 5 | Seq. No |
| 6 | Tax ID |
| 7 | Title |
| 8 | Name and Sur-Name (ช่องเดียว) |
| 9 | Payment Date |
| 10 | Tax Rate |
| 11 | Payment Amount |
| 12 | Withholding tax amount |
| 13 | Condition |
| # | Field |
|---|---|
| 1–5 | Company Tax ID · Business Place · Income Type · Page No. · Seq. No |
| 6–9 | Tax ID · Title · Name · Sur-Name |
| 10–14 | House Number · Tumbon · District · City · Post Code (สังเกต: 2ก ไม่มี Street ต่างจาก 1ก) |
| 15 | Payment Amount — ยอดรวมทั้งปี |
| 16 | Tax rate |
| 17 | Withholding tax amount |
| 18 | Condition |
| # | Field |
|---|---|
| 1–5 | Company Tax ID · Business Place · Income Type Text · Page No. · Seq. No |
| 6–8 | Tax ID · Title · Name and Sur-Name |
| 9–10 | City · Postal code (ที่อยู่แบบย่อ) |
| 11–14 | Payment date · Tax rate · Payment Amount · Withholding tax amount |
| 15 | Condition |
| 16 | Remarks |
| # | Field |
|---|---|
| 1–4 | Company Tax ID · Business Place · Income Type Text · Seq. No (ข้าม Page No) |
| 5–6 | Tax ID · Name (นิติบุคคลไม่มีคำนำหน้า/นามสกุล) |
| 7–8 | City · Postal code |
| 9–12 | Payment date · Tax rate · Payment Amount · Withholding tax amount |
| 13 | Condition |
| 14 | Remarks |
Retrofit หมายถึง “ยกของเดิมมา แล้วเพิ่ม delta” — ต้องรู้ว่าของเดิมคืออะไร
| T-code เดิม | ชื่อเมนู | แบบยื่น |
|---|---|---|
E01 | AP Attach P.N.D. 1 & E-Filing | ภ.ง.ด. 1 |
E1K | AP Attach P.N.D. 1A & E-Filing | ภ.ง.ด. 1ก |
E02 | AP Attach P.N.D. 2 & E-Filing | ภ.ง.ด. 2 |
E2K | AP Attach P.N.D. 2A & E-Filing | ภ.ง.ด. 2ก |
E03 | AP Attach P.N.D. 3 & E-Filing | ภ.ง.ด. 3 |
E04 | AP Attach P.N.D. 53 & E-Filing | ภ.ง.ด. 53 |
เอกสารอ้างอิง FS เดิมของ ECC ระบุเป็น 6 ไฟล์ ตามหมายเลข object เดิม —
1722_ZWHTFILE_P01 (PND1) · 1726_..._P01KOR (PND1A) ·
1723_..._P02 · 1727_..._P02K (PND2A) · 1724_..._P03 · 1725_..._P53
สังเกตว่า naming เดิมใช้ “KOR” แทน “ก” ส่วน S/4 เปลี่ยนมาใช้ “A”
ชุดนี้จะถูก upload เข้า TestRail แล้วขยายเป็น test script พร้อม expected result
| Test ID | Condition | Expected result |
|---|---|---|
| TC-001 | ดึงข้อมูลตามที่ระบุใน sec 2.2.3 และสร้าง text file | ได้ text file ครบตามข้อมูลที่กำหนด |
| TC-002 | เลือก Profit Center บน selection screen | ไฟล์ถูกแตกตาม profit center ที่เลือก |
| TC-003 | เลือก Recovery Indicator | ไฟล์ถูกแตกตาม recovery indicator |
| TC-004 | เลือก ทั้ง PC และ RECID พร้อมกัน | ไฟล์ถูกแตกตามทั้งสองเงื่อนไขพร้อมกัน |
| TC-005 | รันตาม Company Code + Business Place | ผลลัพธ์ออกตาม company code และสาขา |
| TC-006 | Negative: exclude WHT code / WHT type บน selection screen | ไฟล์ของ code/type ที่ถูก exclude ต้องไม่ถูกสร้าง |
| TC-007 | เอกสารกลับรายการ (reversal document) | ต้องไม่มีไฟล์ออกมา สำหรับเอกสาร reversal |
ของซี — สอนในคอร์ส TAX-405 (slides 28 และ 33 upper)
ADRC ไม่ได้อยู่ใน field คงที่ → กระทบ logic ที่อยู่ใน text file · ทำ ADRC trace ใน SE16N ก่อนเขียน mapping rules (owner: BP/MDG team + ENH-6 owner) · ownership ทับกันระหว่าง ENH-1 กับ ENH-6| แบบ | Output group | WHT type / QSREC |
|---|---|---|
| PND1 | E01 | 1A, 1B, 1D, 1E / 01 |
| PND1A (1ก) | E1K | 1A, 1B, 1D, 1E / 01 |
| PND2 | E02 | 2A / 02 |
| PND2A (2ก) | E2K | 2A / 02 |
| PND3 | E03 | 3A–3F / 03 |
| PND53 | E04 | 4A–4F / 53 |
E01/E02 = ใบแนบ + e-filing PND1/2 · E03/E04 = PND3/53 · E1K/E2K = PND1A/2A · PND54 ไม่อยู่ใน ENH-1 (เป็นของ RPT-1 / FRM-1) · WHT codes กำลัง redesign (G5) → ต้องอัปเดต constants
BKPF-STBLG / XREVERSALWITH_ITEM ต่อ WITHT / QSRECWT_QSSHH / WT_QBSHH แล้วบันทึกผลกระทบ GL-ENH-1มุมที่ทำให้ตอบ review/KT ได้เหนือกว่าการอ่านเอกสาร
ZTAXB_R01 ถูกใช้โดย TAX-RPT-1 (recon PND54↔VAT36), TAX-FRM-1 (ใบแนบ PDF) และ TAX-ENH-1 (text file) พร้อมกัน
แปลว่า การแก้ selection screen ของตัวหนึ่ง กระทบทั้งสามตัว
เวลารายงาน defect ต้องระบุ output group ให้ชัดว่าพังที่ไฟล์ ที่ฟอร์ม หรือที่รายงาน
ทั้ง ENH-1 / FRM-1 / RPT-1 ต่างเพิ่ม Profit Center พร้อมกัน — นี่ไม่ใช่ความบังเอิญ
แต่เป็น Key Design Decision ระดับ blueprint ที่ตัดสินว่างานภาษีของ Client ใน S/4 ต้องมองเห็นได้ระดับ profit center
(สอดคล้องกับที่ TAX-RPT-3 เลิกใช้กติกา “Exclude profit center O*” ของ ECC)
→ ผลคือ ทุก object ในกลุ่มนี้ validate Profit Center จาก CEPC เหมือนกันหมด
เพราะภาษีหัก ณ ที่จ่ายของไทยยื่น รายสาขา (สำนักงานใหญ่/สาขา มีเลขสาขาต่างกัน) ใน SAP เลขสาขาผูกกับ Business Place และปรากฏเป็น field ที่ 2 ของแทบทุก layout ถ้าไฟล์รวมสาขา จะยื่นไม่ได้เลย — นี่คือข้อบังคับทางกฎหมาย ไม่ใช่ทางเลือกของ design
| Ref | Notification level | สิ่งที่ควรใช้กับอะไร (ตีความ) |
|---|---|---|
| 1 | Error | เงื่อนไขที่ทำให้ไฟล์ผิดกฎหมาย — เช่น profit center / recovery indicator ที่ไม่มีในตาราง |
| 2 | Warning | เงื่อนไขที่ยังรันต่อได้แต่ต้องรู้ — เช่น ไม่พบข้อมูลของบางสาขา |
| 3 | Info | สรุปผล — จำนวนไฟล์/บรรทัดที่สร้าง |
TODO: verify ข้อความ exception จริง ๆ ยังเป็น N/A ใน FD v0.1 — ต้องตามจาก technical design หรือระบบจริง
ก่อนรัน — เตรียมข้อมูลด้วย SE16N 4 ตาราง
WITH_ITEM (มี WITHT/QSREC/WT_WITHCD ที่ต้องการไหม) →
ACDOCA (บรรทัดนั้น KTOSL = WIT และมี PRCTR/RECID ที่จะใช้ทดสอบไหม) →
CEPC (profit center ที่จะใส่มีจริงไหม) →
T8JJ (recovery indicator ใช้กับ company code นั้นได้ไหม)
หลังรัน — ตรวจไฟล์ 4 จุด
ตอบในใจก่อนกดดูเฉลย
1. ธุรกรรมหนึ่งมี WHT Type = 4C แต่ Recipient Type = 03 จะออกในไฟล์ไหน?
4C อยู่ในกลุ่ม ภ.ง.ด.53 (นิติบุคคล)
แต่ 03 คือ recipient type ของ ภ.ง.ด.3 (บุคคลธรรมดา) เงื่อนไขทั้งสองต้องสอดคล้องกัน
รายการนี้จะหลุดจากทั้งสองไฟล์แบบเงียบ ๆ → ต้องแก้ที่ vendor master / WHT type ของเอกสาร ไม่ใช่แก้โปรแกรม
2. Recovery Indicator validate จากตารางอะไร และทำไมต้องส่ง company code ไปด้วย?
T8JJ-RECID (ตาราง JVA) และต้องส่งคู่กับ BUKRS
เพราะ recovery indicator เป็นค่าที่นิยามภายใต้บริบทของ joint venture ในแต่ละ company code —
validate ลอย ๆ จะยอมรับค่าที่ใช้ไม่ได้จริง แล้วได้ไฟล์เปล่าโดยไม่มี error
3. ทำไม ภ.ง.ด. 1ก ต้องพึ่ง enhancement ZTAXA_E01 ในขณะที่แบบอื่นไม่ต้อง?
4. ถ้าเลือก Profit Center แล้ว ไฟล์จะยังแยกตามสาขาอยู่ไหม?
5. EXIT 2 ตัวชื่ออะไร และทำหน้าที่ต่างกันอย่างไร?
ZDMEE_EXIT_WHT_BASE = คำนวณ ฐานภาษี (WHT base) ·
ZDMEE_EXIT_WHT_AMT = คำนวณ ยอดภาษีที่หัก (WHT amount)
ทั้งคู่ถูกเรียกจาก DMEEX tree ทุกต้น (ทั้ง PND3 และ PND53 ระบุไว้ตรง ๆ ใน FD)