← หน้ารวม (Hub)
FD Deep-Dive · Report (New) ANONYMIZED · PUBLIC EDITION 01.01.07.04 Period-End Tax Reporting

TAX-RPT-4 — Current Tax Report ต่างประเทศ (ZTAXB_R02)

Type · Report Nature · New T-code · ZTAXB_R02 Output · FIORI custom report Complexity · Complex Priority · P1 Geo · Overseas (12+ ประเทศ)

ตัวเดียวกับ TAX-RPT-3 ในเชิงแนวคิด แต่ต้องรองรับ กฎหมายภาษีของหลายประเทศพร้อมกัน — วิธีแก้คือ “Standard layout 3 ต้น (CIT / PITA / PSC) + country overlay” โดยความต่างรายประเทศถูกผลักลงไปอยู่ใน ตาราง GL mapping ตัวใหม่ ZTAXB_T02 ไม่ใช่ในโค้ด · นี่คือ design decision ที่สำคัญที่สุดของ object นี้

Data source
SAP + non-SAP
flat file เข้า custom table
Frequency
M / Q / Y / Ad hoc
รายเดือน–รายปี
Users
Accountant · Tax Compliance
+ Business Analyst (display)
🔗 อ่านเป็นชุด: TAX-RPT-3 (ไทย) · TAX-RPT-4 (ต่างประเทศ · หน้านี้) · TAX-RPT-5 (LCF) · SE16N (ไล่ตาราง ZTAXB_T* ด้วยตัวเอง)
Key Takeaways — 8 ข้อ
1

ภาพรวม — โจทย์และวิธีแก้

โจทย์

Client มีกิจการใน แอลจีเรีย · โอมาน · คาซัคสถาน · UAE · ไซปรัส · โมซัมบิก · เมียนมา · เวียดนาม · มาเลเซีย ฯลฯ แต่ละประเทศมี (ก) กฎหมายภาษีต่างกัน (ข) ผังบัญชี/GL ที่ใช้ต่างกัน (ค) ระบบภาษีปิโตรเลียมคนละแบบ จะเขียนรายงานแยกประเทศละตัว = 12+ โปรแกรม = maintain ไม่ไหว

วิธีแก้ — 2 ชั้น

ชั้นที่ 1
Standard layout
CIT / PITA / PSC
+ ชั้นที่ 2
Country overlay
item type เฉพาะประเทศ
+ ZTAXB_T02
GL mapping ต่อ layout × com code
→ รายงาน 1 ประเทศ

ตัวอย่างที่ FD ยกมา: user เลือก segment report = PSC_OM และใส่ company code โอมาน → โปรแกรมแสดง item type ทั้งหมดของ PSC_Standard ก่อน → แล้วไปดู ZTAXB_T02 ว่า company code นั้น map GL ตัวไหน → ถ้าเป็น OM01 ใช้ GL1xxx · ถ้าเป็น OM02 ใช้ GL2xxx

Selection: Com OM01 · Layout PSC_OM Selection: Com OM02 · Layout PSC_OM GL1001 500 >> Standard GL1001 500 >> Standard GL2001 600 >> Standard GL2001 600 >> Standard GL3001 250 >> Standard GL3001 250 >> Standard GL1999 482 >> Standard GL1999 482 >> Standard GL2999 650 >> Standard GL2999 650 >> Standard GL3999 140 >> Standard GL3999 140 >> Standard GL1 200 >> Specific GL2 5,750 >> Specific ──────────────── ──────────────── Total 2,822.00 Total 8,372.00
Assumption ของ FD: “Revaluated information will be based on LC3 … จะอยู่ใน ACDOCA field ของ LC3 ไม่ว่าฝั่ง GL จะใช้ standard หรือ custom solution” → เหมือนกับ RPT-3 ทุกประการ — เป็นข้อตกลงระดับ workstream
2

Dependencies — object นี้พึ่งใครบ้าง

RPT-4 เป็น “ปลายน้ำ” ที่รวบข้อมูลจาก WRICEF อื่นถึง 4 ตัว

#WRICEFให้อะไรผ่านตาราง
1TAX-ENH-10อัปโหลด manual adjustment เข้า SAPZTAXA_T03
2TAX-RPT-5เก็บ/คืนค่า Loss carried forward ปีก่อนZTAXB_T01
3SAC-RPT-1ค่า %CR และ ITD cost recovery balanceZTAXB_T06 · ZTAXB_T08
4TAX-RPT-9asset class พิเศษ และค่า DD&A (depreciation)ZTAXB_T07 · ZTAXB_T09

ผลกระทบย้อนกลับ (constraint ข้อ 5)

การเปลี่ยนโครงตารางของ current tax report กระทบ (ก) Annual Tax Report (P2) และ (ข) interface ส่งข้อมูลไป BI FD ลงตารางไว้ว่าตารางแต่ละตัวถูกใช้โดยโปรแกรมไหน:

ตารางถูกใช้โดย
ZTAXA_T05ZTAXA_R05 · ZTAXA_I01 (BI interface)
ZTAXA_T06ZTAXA_R05 · ZTAXA_I01 · ZTAXA_R06 (upload) · ZTAXA_R08
ZTAXA_T07ZTAXA_R05
ZTAXA_T03ZTAXA_R05 · ZTAXA_R06 · ZTAXA_R07 (annual) · ZTAXA_R08
ZTAXA_T08ZTAXA_R05 · ZTAXA_R07
ZTAXA_T02ZTAXA_R05 · ZTAXA_R06 · ZTAXA_R07 · ZTAXA_R08
⚠ นี่คือเหตุผลว่าทำไม RPT-4 ถึงเป็น “Complex”: ไม่ใช่เพราะสูตรยาก แต่เพราะ ต้องแชร์ตารางกับรายงานไทยที่ใช้งานอยู่แล้ว การเพิ่ม field “Overseas” จึงเป็นทางเลือกที่ปลอดภัยกว่าการสร้างตารางใหม่ทั้งชุด — แต่แลกมาด้วย ความเสี่ยง regression กับรายงานไทย ทุกครั้งที่แก้
3

ตารางที่เกี่ยวข้อง 12 ตัว

6 ตัวยืมจาก RPT-3 · 6 ตัวใหม่จาก WRICEF อื่น (รวม 1 ตัวที่ RPT-4 สร้างเอง)

#Tableหน้าที่ที่มา
1ZTAXA_T05Node masterเดิมจาก TAX-RPT-3 · เพิ่ม field “Overseas”
2ZTAXA_T06Define node + descriptionเดิมจาก TAX-RPT-3 · เพิ่ม “Overseas”
3ZTAXA_T07Define report layoutเดิมจาก TAX-RPT-3
4ZTAXA_T03Upload data (flat file)เดิมจาก TAX-RPT-3
5ZTAXA_T08Asset class (include/exclude)เดิมจาก TAX-RPT-3
6ZTAXA_T02Master table — tax rateเดิมจาก TAX-RPT-3
7ZTAXB_T02GL mapping สำหรับ OS-CTRใหม่ — สร้างโดย TAX-RPT-4
8ZTAXB_T01Loss carried forward storeใหม่จาก TAX-RPT-5
9ZTAXB_T06Manual adjustment สำหรับ CR%ใหม่จาก SAC-RPT-1
10ZTAXB_T08ITD cost recovery balanceใหม่จาก SAC-RPT-1
11ZTAXB_T07Specific asset classes (เช่น IDC, QEE)ใหม่จาก TAX-RPT-9
12ZTAXB_T09Depreciation & NBV (DD&A)ใหม่จาก TAX-RPT-9

field “Overseas” ทำงานยังไง

ZTAXA_T05 (Node master) Node Code Description Overseas ACL ANNUAL CALCULATION (blank) ← ใช้กับ current tax ไทย ACL ANNUAL CALCULATION x ← ใช้กับ current tax ต่างประเทศ

→ node code ซ้ำกันได้ แต่ ติ๊ก checkbox Overseas เพื่อแยกชุดข้อมูล (ZTAXA_T06 ก็มี field เดียวกัน พร้อมกับ Proportion/Fixed · Fixed Rate ที่ retrofit มาจาก RPT-3)

ZTAXB_T06 — กติกาการเลือก CR% (สำคัญตอนกระทบยอด)

Period/YearComp CodeCR%
1.2024101015
2.2024101010
4.2024101020
Scenario 1: เลือกงวด 3.2024 → ใช้ 10% (จาก 2.2024 = งวดล่าสุดที่มีในตาราง) Scenario 2: เลือกงวด 4.2024 → ใช้ 20% (จาก 4.2024 ตรง ๆ) กติกา: ใช้ค่า CR% ของงวดล่าสุดที่ไม่เกินงวดที่เลือก — ไม่ใช่ค่าล่าสุดในตาราง
4

ZTAXB_T02 — ตารางที่ทำให้ object นี้เป็นไปได้

GL mapping table สำหรับ overseas · 14 คอลัมน์ · เก็บทั้ง mapping และ “กติกาเฉพาะประเทศ”

#Columnทำหน้าที่
1Layoutผูกกับ tax regime (เช่น PSC_OM, CIT_DZ)
2Com codeตัวที่ทำให้ layout เดียวกันมี mapping ต่างกันได้
3SegmentSegment ทางบัญชี
4NodeNode ในรายงาน
5TypeItem type
6Descriptionคำอธิบายบรรทัด
7GL Accountเลขบัญชี · รองรับ ช่วง (from–to) และ ดอกจัน
8%Add back from Each GL accountคูณ % รายบัญชี (แต่ละบัญชี % ต่างกันได้)
9%Add back from total GL NODEคูณ % กับ ผลรวมทั้ง node
10Profit centerถ้าใส่ = ดึงเฉพาะ profit center นั้น
11Capped amountยอดเพดานคงที่ (ใช้กับ แอลจีเรีย)
12CCYสกุลเงินของ capped amount
13–14Valid from / Valid toควบคุมช่วงเวลาที่ mapping มีผล
15Exclude GLตัดบัญชีบางตัวออกจากช่วงที่ระบุ

4 กติกาการเขียน GL account (ต้องจำ)

1) ช่วง (from–to) From = A100000 To = A100099 → ได้ A100000 ถึง A100099 ทั้งหมด 2) Exclude From = A100000 To = A100099 Exclude GL = A100059 → ได้ทุกบัญชี ยกเว้น A100059 3) ดอกจัน (star) GL = A212* → A2120000 ถึง A2129999 GL = A1* → A100000 ถึง A199999 4) Profit center condition ถ้าคอลัมน์ Profit center มีค่า เช่น C_PC31 → ดึงยอดของ GL นั้น เฉพาะ profit center ดังกล่าว (ส่งเข้า ACDOCA-PRCTR)

%Add back — สองแบบที่คนสับสนบ่อย

คอลัมน์คูณกับอะไรตัวอย่างการใช้
%Add back from Each GL accountยอดของแต่ละบัญชี แล้วค่อยรวมแอลจีเรีย — “REPRESENTATION EXPENSES” แต่ละบัญชีมี % ไม่เท่ากัน (%Actual non-deduction ของ 3 ปีก่อน)
%Add back from total GL NODEยอดรวมทั้ง node ครั้งเดียวUAE — “Abu Dhabi administrative costs” × 20% · โมซัมบิก — 80% / 50% · คาซัคสถาน — “Non-deductible OPEX”
ทำไมต้องมี 2 แบบ: กฎหมายบางประเทศกำหนดสัดส่วนรายจ่ายต้องห้าม ต่อประเภทรายจ่าย (จึงต้องคูณรายบัญชี) ขณะที่บางประเทศกำหนด ต่อกลุ่มรายจ่ายทั้งก้อน (จึงคูณที่ node) ถ้าใช้ผิดแบบ ผลลัพธ์จะต่างกันเมื่อบัญชีในกลุ่มมี % ไม่เท่ากัน
⚠ ชื่อตารางใน FD ไม่นิ่ง: เนื้อความบางจุดอ้างถึง ZTAXB_T10 และ ZTAXA_T01 แทนที่จะเป็น ZTAXB_T02 — จากบริบททั้งฉบับ ตารางที่ถูกต้องคือ ZTAXB_T02 (ทั้งหัวข้อ 2.1.3.7 และ TC-045 ยืนยัน) TODO: verify กับทีม functional ก่อนส่ง technical design
5

Selection screen — 2 บล็อกหลัก + display report

แบ่งเป็น General Selection (Main) · General Selection (Branch) · Display Report · Display Currency

FieldAttrDefaultValidation
Company code (Main)Mandatory—T001-BUKRS · multiple selection
Reporting YearMandatory—บังคับกรอก
Reporting PeriodInputFrom: 1ต้องมีทั้ง From และ To
Profit centerInput—CEPC-PRCTR · from–to
Recovery IndicatorInput—T8JJ-RECID · คู่กับ BUKRS · multiple
Depreciation Area (Main)Input—T093B-AFABE · ตรวจคู่กับ BUKRS
Ledger (Main)Input—N/A
Segment (Main)Input—FAGL_SEGM-SEGMENT · multiple
Segment ReportMandatory—ตัวกำหนด layout + tax regime · ZTAXA_T07-REPORT
TAX_INFOInput—ดึง tax rate จาก ZTAXA_T02 กรณี profit center เดียวกันแต่ต้องคำนวณ 2 ประเทศ
Company code (Branch)Input—T001-BUKRS · multiple
Profit center (Branch)Input—CEPC-PRCTR
Recovery indicator (Branch)Input—T8JJ คู่กับ company code
Depreciation area (Branch)Input—T093B-AFABE คู่กับ BUKRS
Ledger (Branch)Input—N/A
Segment (Branch)Input—FAGL_SEGM-SEGMENT
Display currencyMandatoryLC2radio LC1 / LC2 / LC3 · เปลี่ยนได้

ตารางที่ใช้ validate — สรุปให้จำ

สิ่งที่ validateตารางFieldเงื่อนไขพิเศษ
Company codeT001BUKRS—
Profit centerCEPCPRCTR—
Recovery indicatorT8JJRECIDคู่กับ BUKRS
Depreciation areaT093BAFABEคู่กับ BUKRS
SegmentFAGL_SEGMSEGMENT—
Segment Report (layout)ZTAXA_T07REPORT—
Tax rate (ผ่าน TAX_INFO)ZTAXA_T02Tax rate %ใช้ร่วมกับ company code + segment

TAX_INFO — field ที่ต้องเข้าใจให้ลึก

ปัญหา: บางกรณี company code เดียวกัน · profit center เดียวกัน · segment เดียวกัน แต่ต้องคำนวณภาษีตามกฎของ สองประเทศ (เช่น กิจการร่วมไทย–มาเลเซีย) → ระบบแยกไม่ออกว่าจะใช้ tax rate ตัวไหน

ตัวอย่างค่าใน ZTAXA_T02: COMCODE TYPE Segment PROFIT CENTER TAX_INFO TAX RATE% VALID FROM VALID TO TH02 CIT_TH 10000x 20 01.06.2019 31.12.9999 TH02 CIT_TH 10000x CIT_THMM 25 (MM) TH02 MTJDA MTJDA * MTJDA_TH 10 01.01.2024 31.12.9999 TH02 MTJDA MTJDA * MTJDA_MY 10 01.01.2024 31.12.9999 MTJDA_MY = segment MTJDA + ประเทศ MY → ใช้กฎมาเลเซีย MTJDA_TH = segment MTJDA + ประเทศ TH → ใช้กฎไทย

TAX_INFO ยังถูกส่งต่อไปที่ TAX-RPT-5 เพื่อแยก LCF ของสองประเทศไม่ให้ปนกัน — ดังนั้น ถ้ารัน RPT-4 โดยไม่ใส่ TAX_INFO ในเคสเหล่านี้ LCF จะผิด

6

Processing flow 010 → 110

อ่านครั้งเดียวแล้วเห็นภาพทั้ง object

Ref#Process stepData
010บันทึกรายการ Asset และ Tax ใน S/4HANAAsset transactions · Tax postings
020รายการ Asset ปรากฏใน Asset History SheetS_ALR_87011990
030รายการภาษีลง G/L → trial balanceACDOCA
040Manual adjustment ผ่าน flat fileZTAXA_T03 (ผ่าน TAX-ENH-10)
050User รันรายงานselection screen input
060ดึงข้อมูล 3 ทาง: trial balance · asset history sheet · flat fileACDOCA · AHS · custom table
070ดึงจาก custom table ของ WRICEF อื่นZTAXB_T01 · 012 · 014 · 016 · 018
080แสดงค่าตาม tax regime ที่เลือก—
090แสดงราย node · คอลัมน์แยกตาม segment + profit center · มีคอลัมน์ Total—
100กด “Update LCF table” → เก็บผลขาดทุนลงตารางZTAXB_T01 (TAX-RPT-5)
110ปีถัดไป ดึงกลับมาเป็นยอดยกมา—

รูปแบบการแสดงผล

Item Type descriptionSegment 1Segment 2Total
Profit center 1Profit center 2Profit center 3
TEST4603004401,200
GL Account 111050140300
GL Account 2300100100500
GL Account 350150200400

→ 1 item type ที่ผูกกับหลาย GL จะแสดง ยอดรวม (grouping) และ กางราย GL (ungrouping) ได้ พร้อมแตกคอลัมน์ตาม profit center และปิดท้ายด้วย Total

7

6 แหล่งข้อมูล — บรรทัดหนึ่งในรายงานมาจากไหนได้บ้าง

Sourceวิธีทำงานตัวอย่าง item type
GLดึงยอด trial balance จาก ACDOCA ตรง ๆ ผ่าน ZTAXB_T02HG1 · HG2 · DONATION · TAX PENALTY
GL with conditionดึงจาก GL แต่มีเงื่อนไขเพิ่ม — % · profit center · segment · movement (C/F − B/F) · SHKZGROU: UNREALIZED FX GAIN/LOSS (REVAL) · DECOM FUND - ACTUAL PAID
GL with calculationเฉพาะ PSC_Standard — ยอด GL ลบ ทุก node ที่อยู่หลัง node CL_N ก่อนหน้าOTHER INCOME · OPERATING COST · FINANCE COST
Formulaคำนวณจาก node อื่นHC3 = HG1 − HG2 · ACL3 · ACL
Flat fileอ่านจาก ZTAXA_T03 · item type ต่างประเทศใช้ prefix OS_*OS_PU1–28 · OS_TU1–18 · OS_AU1–2
Asset history sheet / custom tableS_ALR_87011990 หรือ ZTAXB_T09 (จาก TAX-RPT-9)PPE: DD&A PER TAX (3 แบบ)

“GL movement” — C/F − B/F

GL movement = ยอดยกไป (carried forward) − ยอดยกมา (brought forward) = การเคลื่อนไหวของบัญชีงบดุลในงวด ใช้กับ item type ที่มาจาก บัญชีงบดุล ไม่ใช่บัญชีกำไรขาดทุน เช่น - ROU: UNREALIZED FX GAIN/LOSS (REVAL) → ไม่กลับเครื่องหมาย - DECOM LIAB: UNREALIZED FX GAIN/LOSS → ไม่กลับเครื่องหมาย - DECOM FUND - ACTUAL PAID → (deductible) - INTANGIBLE DRILLING COSTS: PER TAX → (deductible)
ทำไมบัญชีงบดุลต้องใช้ movement: บัญชี P&L ยอดในงวด = การเคลื่อนไหวอยู่แล้ว แต่บัญชีงบดุลเก็บ ยอดสะสม — ถ้าเอายอดคงเหลือมาใส่รายงานภาษี จะได้ยอดสะสมทั้งชีวิตของบัญชี ไม่ใช่ของงวดนี้ → นี่คือเหตุผลที่ item type เดียวกันอาจถูกระบุเป็น “GL” ในที่หนึ่ง แต่ “GL with condition” ในอีกที่

PPE: DD&A PER TAX — 3 ทางที่ต่างกัน

Item typeSourceกติกา asset class
PPE: DD&A PER TAX (ASSET HISTORY SHEET)AHS S_ALR_87011990Exclude asset class ตาม ZTAXA_T08
PPE: DD&A PER TAX (PRE-OPERATING)AHSInclude เฉพาะ asset class ที่กำหนด เช่น N999910, N999920
PPE: DD&A PER TAX (TAX AA REPORT)ZTAXB_T09 (TAX-RPT-9)ค่าถูกคำนวณมาแล้วจากรายงาน AA

กรณีพิเศษ (เช่น IDC, QEE) ใช้ ZTAXB_T07 ซึ่งเก็บ Country · Com code · Segment · Profit center · Asset class · Asset type → กติกากลับด้าน: “include แทน exclude”

8

Node chain — โครงกระดูกที่ทุก layout ใช้ร่วมกัน

จำ chain นี้ได้ = อ่านรายงานของทุกประเทศออก

HG1 NET (INCOME) LOSS PER ACCOUNTING [GL] HG2 INCOME TAXES [GL] HC3 NET (INCOME) LOSS BEFORE TAX [Formula] = HG1 − HG2 PMD PERMANENT DIFFERENCE = PGL_N + PGL_T + OS_PU PGL_N Permanent · non-deductible items [GL · reverse sign] PGL_T Permanent · taxable items [GL / GL with condition] OS_PU Permanent · manual adjustment [Flat file · OS_PU1…OS_PU28] TMD TEMPORARY DIFFERENCE = TGL-N + TGL-T + OS_TU TGL-N Temporary · non-deductible items [GL / GL with condition] TGL-T Temporary · taxable items TCL_T PPE: DD&A PER TAX (AHS / Pre-op / AA report) OS_TU Temporary · manual adjustment [Flat file · OS_TU1…OS_TU18] ACL1 TAXABLE (INCOME) LOSS − BEFORE LCF [Calculation] = ผลรวมทุก node ตั้งแต่ HC3 ACL2 LOSS CARRIED FORWARD [ZTAXB_T01 · TAX-RPT-5] OS_AU1 MANUAL ADJUSTMENT: LOSS CARRIED FORWARD [Flat file] ACL3 TAXABLE (INCOME) LOSS − AFTER LCF [Calculation] = ACL1 + ACL2 + OS_AU1 ACL4 TAX RATE [ZTAXA_T02] ACL5 INCOME TAX EXPENSE (SAVING): YTD − CURRENT MONTH [Calculation] ACL6 INCOME TAX EXPENSE (SAVING): YTD − PREVIOUS MONTH [GL] OS_AU2 MANUAL ADJUSTMENT: INCOME TAX − TRUE UP [Flat file] ACL INCOME TAX EXPENSE (SAVING): MTD [Calculation] = ACL5 − ACL6 − OS_AU2

ACL5 — จุดที่ตรรกะ “ขาดทุน = ไม่มีภาษี” อยู่

ถ้า TAXABLE INCOME AFTER LCF (Total) เป็น ยอดเดบิต (>= 0) → ขาดทุน → ACL5 = 0 และ เก็บผลขาดทุนลง LCF table ZTAXB_T01 ถ้า TAXABLE INCOME AFTER LCF (Total) เป็น ยอดเครดิต (< 0) → กำไร → ACL5 = ACL3 × ACL4 กลับเครื่องหมาย
⚠ อย่าสับสนเรื่องเครื่องหมาย: ในรายงานนี้ เดบิต = ขาดทุน · เครดิต = กำไร ซึ่งตรงข้ามกับสัญชาตญาณของคนที่คุ้นกับงบกำไรขาดทุน (ที่รายได้อยู่เครดิต ค่าใช้จ่ายอยู่เดบิต — จึงถูกต้องแล้ว) สิ่งที่ต้องระวังคือ เงื่อนไข “>= 0” หมายถึงเดบิต ตามที่ FD เขียน — เวลาเทสต์ให้ทำทั้งเคสกำไรและขาดทุน

PSC_Standard — โครงที่ต่างจาก CIT/PITA

PSC_Standard ไม่แบ่งเป็น permanent/temporary แต่แบ่งเป็น TX (Taxable items) และ NT (Non-deductible items) พร้อม node สรุป CL_T / NCL และมี item type ที่เป็น “GL with calculation” ซึ่งใช้สูตรพิเศษ:

OTHER INCOME = [A4*] + [B4*] − node ทั้งหมดหลัง CL_N ก่อนหน้า UTILITIES AND OFFICE COST = [A5005*] + [B5005*] − node ทั้งหมดหลัง CL_N ก่อนหน้า OPERATING COST = A51* − node ทั้งหมดหลัง CL_N ก่อนหน้า ADMINISTRATIVE EXPENSE (G&A) = A53* − node ทั้งหมดหลัง CL_N ก่อนหน้า PPE: DDA PER AC = [A5401*]+[A5402*]+[A5404*] − node ทั้งหมดหลัง CL_N ก่อนหน้า IMPAIRMENT LOSS ON ASSETS = A5403* − node ทั้งหมดหลัง CL_N ก่อนหน้า FINANCE COST = A56* − node ทั้งหมดหลัง CL_N ก่อนหน้า OTHER EXPENSES = [A58*] + [A59*] − node ทั้งหมดหลัง CL_N ก่อนหน้า
อ่านสูตร “ลบ node ที่อยู่ระหว่างกลาง” ยังไง: แนวคิดคือ CL_N คือยอด “ที่เหลือ” ของกลุ่มบัญชีนั้น หลังหักรายการที่ถูกแยกออกไปแสดงเป็น GL_N ทีละบรรทัดแล้ว → กันไม่ให้ยอดถูกนับซ้ำสองรอบ (รอบแรกในบรรทัดย่อย รอบสองในยอดกลุ่ม) ลำดับ node จึงสำคัญมาก — ต้องดูตาราง PSC_Standard ประกอบเสมอ
9

Layout รายประเทศ — overlay ทั้ง 14 ตัว

“Standard + สิ่งที่ประเทศนั้นมีเพิ่ม” · company code เป็นตัวชี้ GL mapping

LayoutประเทศCom codeต่อยอดจากจุดเด่นที่ต้องจำ
CIT_DZแอลจีเรียXB01CIT_StandardCapped amount ค่าเช่ารถ 200,000 DZD · REPRESENTATION EXPENSES %รายบัญชี · TRP tax expense เฉพาะ segment PITA_DZ งวดปัจจุบัน
PITA_OMโอมาน (Block 6)OM02PITA_StandardADDITIONAL MAKE-UP PAYMENT · MUKHAIZNA differential revenue · HO ALLOCATION CHARGED · OS_PU26/27 (%MEC)
PITA_KZคาซัคสถาน1119PITA_Standardเงื่อนไข profit center เฉพาะ C_PC31 (HO / PGH / realized FX) · NON-DEDUCTIBLE OPEX ×%
PITA_UAEUAE (AGP)1110PITA_StandardABU DHABI ADMIN COSTS ×20% non-deductible · ROU กลุ่มหนึ่งใช้ Formula reverse sign · PPE DD&A PER TAX (TB) เฉพาะ PC N_PC35
CIT_CYไซปรัส1074CIT_StandardCOMPANY REGISTRATION FEE · REVOLVING INTEREST TO INTERCO · pre-op asset class N999910/N999920 (ใช้ทั้ง 1074 และ 1081)
PITA_MZโมซัมบิก1081PITA_Standard3 อัตรา %: REPRESENTATION 80% · TRAVEL ALLOWANCES 50% · VEHICLE (rental/repair/fuel) 50%
CIT_MMเมียนมา—CIT_StandardPROVISION FOR PENSION & SEVERANCE PAY (+ accretion + unrealized FX reval)
PSC_DZแอลจีเรีย1012PSC_StandardDEEMED SALES — สูตร 3 ขั้นเทียบกับ LCF (ดู §10)
PSC_MMเมียนมาTH02PSC_StandardSALE PER TAX · TRANSPORTATION FEE · ROYALTY · COST RECOVERED จาก ZTAXB_T08
PSC_VNเวียดนาม1009 · 1010PSC_Standardเหมือน PSC_MM แต่ ไม่มี TRANSPORTATION FEE ในตาราง node
PSC_OMโอมานOM01 · OM02PSC_StandardOM01 เท่านั้น มี SALE PER TAX–GL · OM02 เท่านั้น มี SALE PER TAX–TAX CR REPORT · DEEMED SALES ใช้ทั้งคู่
MTJDA_MYไทย–มาเลเซีย JDA—ไม่ใช้ standardโครง ACL7–ACL16 (ดู §11)
PSC_MYมาเลเซีย1102ไม่ใช้ standardEntertainment 50%/100% ตาม text · abandonment cess (doc type KR) · FPS lease (SNP/GK) · marginal 25% / non-marginal 38%
CIT_MYมาเลเซีย——Interest income (75090100 interco · 75000100) · Tax at 15%
⚠ ประโยคที่ต้องขีดเส้นใต้ใน FD: “Noted: The standard layout will not apply to PSC_MY, MTJDA_MY” → สอง layout นี้ต้องอ่าน spec ของตัวเองล้วน ๆ ห้าม assume ว่าต่อยอดจาก PSC_Standard เป็นจุดที่ทำให้ประเมิน effort ผิดได้ง่ายที่สุด

PITA_KZ — ตัวอย่างพฤติกรรม segment/profit center บนหน้าจอ

CaseInputผลลัพธ์
Case 1Com 1119 · profit center blank · segment blank · report PITA_KZแสดง ทุก segment และทุก profit center (เช่น CIT_KZ / C_PC31 = 5,000 และ PSC_KZ / N_PC36 = 1,000)
Case 2Com 1119 · profit center blank · segment PSC_KZแสดง เฉพาะ segment นั้น และ profit center ที่ผูกกับ segment นั้น
10

สูตรพิเศษ 2 ตัวที่ถามบ่อยที่สุด

ก) Capped amount — แอลจีเรีย (CIT_DZ)

Item type: PCL_T — Car rental expense (Capped amount) ดึงค่าจากคอลัมน์ Capped amount ใน ZTAXB_T02 LC1 → ใช้ค่าตรง ๆ = 200,000 DZD LC2 → แปลงจาก LC1 ด้วย exchange rate type ZTH (standard setup) LC3 → แสดงยอดเท่ากับ capped amount ในตาราง
ทำไม LC3 ไม่แปลง: LC3 คือ freely-defined currency ที่เก็บค่าที่ตีราคาแล้ว — เพดานตามกฎหมายเป็นจำนวนเงินคงที่ในสกุลท้องถิ่น จึงไม่ควรถูกตีราคาใหม่ · ส่วน LC2 (สกุลกลุ่ม) ต้องแปลงเพื่อให้เทียบกับรายการอื่นได้ → นี่คือเหตุผลที่ TC-011/012/013 แยกเทสต์ LC1/LC2/LC3 ของแอลจีเรียโดยเฉพาะ

ข) Deemed sales — แอลจีเรีย (PSC_DZ) · สูตร 3 ขั้น

ขั้นที่ 1 — เช็ค LCF ก่อน มี LCF (จาก TAX-RPT-5) ? → Deemed sale = 0 (จบ) ไม่มี → ไปขั้นที่ 2 ขั้นที่ 2 — เทียบ EBT กับ LCF EBT > 0 (ขาดทุน) → Deemed sale = 0 EBT < 0 (กำไร) และ > LCF-R022 → ไปขั้นที่ 3 EBT < LCF-R022 → Deemed sale = 0 ขั้นที่ 3 — คำนวณ X = [ (Manual Adj SALE PER TAX) + (Manual Adj OPEX) + (PPE: DD&A PER TAX) + (Manual Adj DD&A) + (Manual Adj Other Perm diff) + (Manual Adj Other Temp diff) ] ÷ (1 − tax rate) × tax rate Deemed sales = [X] − [GL A410X031 Domestic Sales: Deemed Inc_Tax Pay by Gov YTD − PREVIOUS MONTH]

PSC_OM (โอมาน) — สูตรเดียวกันแต่ฐานต่างกัน

X = [ (Sale per tax) + (Cost recovered − Utilised during the year) + (Manual Adj OPEX) + (Manual Adj DD&A) + (Manual Adj Other Perm diff) + (Manual Adj Other Temp diff) ] ÷ (1 − tax rate) × tax rate Deemed sales = [X] − [GL A410X031 … YTD − PREVIOUS MONTH] ใช้ได้ทั้ง OM01 และ OM02 (PSC_OM ไม่ต้องเช็ค LCF ก่อน ต่างจาก PSC_DZ)
“Deemed sales tax paid by government” คืออะไร: ในสัญญาแบ่งปันผลผลิตบางฉบับ รัฐเป็นผู้ชำระภาษีแทนผู้รับสัมปทาน แต่ทางภาษีถือว่าเงินภาษีนั้นเป็น รายได้เพิ่มของผู้รับสัมปทาน → ต้อง gross-up กลับเข้าไปในฐานภาษี สูตร ÷ (1 − rate) × rate คือสูตร gross-up มาตรฐาน ส่วนการลบ GL A410X031 คือ หักส่วนที่บันทึกไปแล้วในเดือนก่อน (กันนับซ้ำ)

ค) SALE PER TAX — TAX CR REPORT (PSC_OM · OM02 เท่านั้น)

= Cost recovered: Utilised during the year ÷ %CR = คำนวณ รายเดือน แล้วรวม 12 เดือน (เพราะ %CR เปลี่ยนทุกเดือน) = กลับเครื่องหมาย แสดงเป็นค่าติดลบ Source: Utilised during the year → ZTAXB_T08 %CR → ZTAXB_T06 (ถ้าเดือนนั้นไม่มี ใช้ค่าล่าสุดที่ไม่เกินงวดที่เลือก)
11

มาเลเซีย — โครง ACL7 → ACL16 (ต่างจากที่อื่นทั้งหมด)

ใช้กับ MTJDA_MY และ PSC_MY · มี 2 ชั้นการหักขาดทุน

ACL7 Current year: ADJUSTED (Income)/Loss = ผลรวมของ perm non-deductible + perm taxable + temp non-deductible + temp taxable + perm manual adj + temp manual adj + net (income) loss before tax ชั้นที่ 1 — Capital Allowance ACL8 B/F: Unabsorbed capital allowances [TAX-RPT-5] + ADD: PPE − DD&A PER TAX (TAX AA REPORT) [TAX-RPT-9] + ADD: PPE − DD&A PER TAX (ASSET HISTORY SHEET) + OS_TU2 ADD: MANUAL ADJUSTMENT − PPE: DD&A PER TAX [Flat file] ACL9 Less: Utilised during the year [Formula] ACL10 C/F: Unabsorbed capital allowances [TAX-RPT-5] = ACL8 + Current year CA + Adj + ACL9 ACL11 Statutory (income)/Loss OS_PU25 Manual Adjustment − Investment allowance [Flat file] ชั้นที่ 2 — Business Loss ACL12 B/F: Unabsorbed business loss [TAX-RPT-5] ACL13 Add: Current year business loss [Formula] OS_AU1 MANUAL ADJUSTMENT: LOSS CARRIED FORWARD [Flat file] ACL14 Less: Utilised during the year [Formula] ACL15 C/F: Unabsorbed business loss [TAX-RPT-5] ACL16 Assessable (Income)/Loss = ACL11 + OS_PU25 − ACL14 ACL4 TAX RATE → PSC_MY: marginal 25% · non-marginal 38%

ACL9 — Less: Utilised during the year (capital allowance)

Case 1) ACL7 >= 0 (ขาดทุน) → Utilised = 0 Case 2) ACL7 < 0 (กำไร) ให้ CA_total = ACL8 + PPE DD&A (AA report) + PPE DD&A (AHS) + Manual adj PPE DD&A 2.1) ถ้า (ACL7 × −1) < CA_total → Utilised = ACL7 (ใช้ได้แค่เท่าที่มีกำไร) 2.2) ถ้า (ACL7 × −1) > CA_total → Utilised = CA_total × (−1) (ใช้ CA ได้หมดแต่ไม่พอหักกำไร)

ACL11 / ACL13 / ACL14

ACL11 Statutory (income)/Loss ถ้า (ACL7 − ACL9) >= 0 → แสดง 0 ถ้า (ACL7 − ACL9) < 0 → แสดงค่าตามจริง ACL13 Add: Current year business loss Case 1) ACL11 = 0 (ขาดทุน) ACL7 >= 0 (ขาดทุน) → ACL13 = ACL7 ACL7 < 0 (กำไร) → ACL13 = 0 Case 2) ACL11 < 0 (กำไร) → ACL13 = 0 ACL14 Less: Utilised during the year (business loss) Case 1) ACL11 < 0 (กำไร) ให้ BL_total = ACL12 + ACL13 + OS_AU1 1.1) ถ้า ((ACL11 + OS_PU25) × −1) < BL_total → Utilised = (ACL11 + OS_PU25) 1.2) ถ้า ((ACL11 + OS_PU25) × −1) > BL_total → Utilised = BL_total × (−1) Case 2) ACL11 >= 0 (ขาดทุน) → Utilised = 0
รูปแบบที่ซ้ำกันใน 2 ชั้น — จำ pattern เดียวใช้ได้ทั้งคู่
  • ขาดทุน → ใช้สิทธิไม่ได้ (Utilised = 0)
  • กำไร → ใช้สิทธิได้ แต่ไม่เกิน 2 ค่า: (ก) จำนวนกำไรที่มี (ข) จำนวนสิทธิที่เหลือ — เอาตัวที่น้อยกว่า
  • ที่เหลือยกไปปีหน้า (C/F) → เก็บลง TAX-RPT-5

PSC_MY — เงื่อนไขเฉพาะที่ต้องรู้

⚠ กติกา “ห้ามข้ามประเภท” คือกับดักตอนออกแบบตาราง: LCF ของ marginal ต้องเก็บแยกจาก non-marginal ตั้งแต่ต้น — ถ้าเก็บรวมแล้วค่อยแยกทีหลัง จะแยกไม่ออก ดังนั้นต้องดูให้แน่ว่า ZTAXB_T01 มีมิติพอที่จะแยก 4 ประเภทได้ (ผ่าน tax rate / TAX_INFO) TODO: verify
12

Key Test Conditions — TC-001 ถึง TC-045 (จัดกลุ่ม)

45 เคส · แบ่งเป็น 4 กลุ่มใหญ่ จำเป็นกลุ่มง่ายกว่าจำเป็นข้อ

กลุ่มTest IDทดสอบอะไร
A · พื้นฐานTC-001 – TC-003selection screen · ledger field · เคส main + branch company code (เช่น main CY 1074 + branch MZ 1081 แต่เลือก layout CY → ต้องแสดงตาม CY)
B · ตารางTC-004 – TC-009 · TC-045ZTAXB_T02 (GL mapping ต่าง com code) · ZTAXB_T09 (DD&A) · ZTAXB_T07 (asset class) · ZTAXB_T01 (LCF) · ZTAXB_T06 (CR%) · ZTAXB_T08 (cost recovery)
C · LayoutTC-010 · 014 · 017 · 020 · 023 · 026 · 029 · 032 · 033 · 035 · 038 · 039 · 043 · 044ทุก layout ต้องแสดงถูกต้องพร้อม calculation logic — CIT_DZ · PITA_OM · PITA_KZ · PITA_UAE · CIT_CY · PITA_MZ · CIT_MM · PSC_DZ · PSC_MM · PSC_VN · PSC_OM · MTJDA_MY · PSC_MY · CIT_MY
D · สกุลเงินTC-011 – 013 · 015 – 016 · 018 – 019 · 021 – 022 · 024 – 025 · 027 – 028 · 030 – 031 · 036 – 037 · 040 – 041LC1 / LC2 (และ LC3 เฉพาะแอลจีเรีย) ของแต่ละประเทศ
E · เฉพาะเคสTC-034 · TC-042TC-034: ดึง tax rate จาก ZTAXA_T02 ผ่าน TAX_INFO (เคสเมียนมา) · TC-042: ledger S1 สำหรับนิติบุคคลมาเลเซีย
สังเกต pattern ของ test: ทุก layout มี “คู่แฝด” — 1 เคสทดสอบ layout · 2 เคสทดสอบสกุลเงิน ยกเว้นแอลจีเรียที่มี 3 (LC1/LC2/LC3 เพราะมี capped amount) → เวลาวางแผน FUT ให้เตรียมข้อมูลทดสอบ ต่อประเทศ ไม่ใช่ต่อเคส จะประหยัดเวลามาก
13

Expert notes

1) design pattern ที่ควรจดจำ — “config over code”

ความต่างของ 12+ ประเทศ ถูกผลักลงไปอยู่ใน ตาราง เกือบทั้งหมด (mapping · % · capped · profit center · validity) สิ่งที่เหลือในโค้ดคือ โครง node chain และ สูตรพิเศษไม่กี่ตัว (deemed sales, Malaysia ACL9/13/14) → ผลคือ เพิ่มประเทศใหม่โดยไม่ต้องแก้โปรแกรม ตราบใดที่กฎหมายเข้าโครงเดิมได้ นี่คือคำตอบที่ดีมากเมื่อถูกถามว่า “ทำไมออกแบบแบบนี้”

2) จุดที่ design นี้ “แตก” — และ FD ก็ยอมรับ

PSC_MY และ MTJDA_MY ไม่ใช้ standard layout เพราะกฎหมายมาเลเซีย มีโครงการหักขาดทุน 2 ชั้น (capital allowance → business loss) ที่ยัดเข้าโครง permanent/temporary ไม่ได้ → บทเรียน: pattern ที่ดีไม่ได้แปลว่าครอบคลุม 100% · การยอมรับข้อยกเว้นแต่เนิ่น ๆ ดีกว่าฝืนบิด standard

3) การอ่าน “reverse sign” ให้ถูก

NodeReverse sign?เหตุผล
PERMANENT DIFFERENCE: NON-DEDUCTIBLE ITEMSใช่ดึง 100 → แสดง −100 (FD ยกตัวอย่างตรง ๆ)
TEMPORARY DIFFERENCE: NON-DEDUCTIBLE ITEMSใช่เหตุผลเดียวกัน
GL movement (ROU / DECOM LIAB unrealized FX reval)ไม่FD ย้ำ “with no reversed sign” ทุกประเทศ
ACL5 (income tax expense)ใช่ผลคูณ ACL3 × ACL4 ต้องกลับเครื่องหมาย
PSC_MY Entertainmentไม่FD ระบุ “For this sign reverse is not required”
PITA_UAE — ROU กลุ่ม Formulaใช่“Reversed sign of GL Node”

4) ข้อควรระวังเรื่องเอกสาร (สำหรับคนที่ต้อง review FD)

ทำไมต้องจดพวกนี้ไว้: การชี้จุดพิมพ์ผิดใน FD อย่างสุภาพและมีหลักฐาน คือวิธีสร้างความน่าเชื่อถือที่เร็วที่สุดสำหรับ consultant ใหม่ — และมันช่วยทีม dev จริง ๆ เพราะถ้าปล่อยไป dev จะไปหา table ที่ไม่มีอยู่จริง

5) แผนที่ความรู้ — เชื่อมกับสิ่งที่คุณรู้อยู่แล้ว

สิ่งที่รู้แล้วจาก RPT-3 / งานเดิมใช้ต่อได้ทันทีใน RPT-4
LC1/LC2/LC3 = HSL/KSL/OSL + RHCUR/RKCUR/ROCURเหมือนกัน 100%
ACDOCA เป็น Universal Journal (line item)แหล่งหลักของทุก GL node
Validation: CEPC / T8JJ+BUKRSเหมือนกัน + เพิ่ม T093B, FAGL_SEGM
สูตร ANNUAL (P/L) AFTER LCF ของไทยเทียบเท่า ACL3 ของ overseas
ปุ่ม “Update table for LCF”มีทั้งใน RPT-3 และ RPT-4 → เขียนลงตารางเดียวกัน
Self-check

ทวนความเข้าใจ

1. Standard layout มีกี่ต้น และมี layout ไหนที่ไม่ใช้ standard เลย?

3 ต้น — CIT_Standard · PITA_Standard · PSC_Standard · layout ที่ ไม่ใช้ standard คือ PSC_MY และ MTJDA_MY

2. บริษัท OM01 และ OM02 ใช้ layout PSC_OM เหมือนกัน แต่ผลลัพธ์ต่างกันได้อย่างไร?

เพราะ ZTAXB_T02 มีคอลัมน์ Com code → map GL คนละชุดได้ (OM01 ใช้ GL1xxx · OM02 ใช้ GL2xxx) และยังมี item type ที่ใช้ได้เฉพาะบางบริษัท — เช่น SALE PER TAX – GL เฉพาะ OM01 · SALE PER TAX – TAX CR REPORT เฉพาะ OM02

3. TAX_INFO ใช้แก้ปัญหาอะไร ยกตัวอย่าง

แก้กรณีที่ company code + profit center + segment เหมือนกัน แต่ต้องคำนวณตามกฎ 2 ประเทศ เช่น MTJDA_MY (มาเลเซีย) vs MTJDA_TH (ไทย) หรือ CIT_THMM — ระบบจะใช้ TAX_INFO เลือก tax rate จาก ZTAXA_T02 และแยก LCF ใน TAX-RPT-5 ไม่ให้ปนกัน

4. เขียนสูตร ACL3 และ ACL

ACL3 = ACL1 + ACL2 + OS_AU1 (taxable income/loss ก่อน LCF + LCF + manual adj LCF) · ACL = ACL5 − ACL6 − OS_AU2 (ภาษี YTD เดือนนี้ − YTD เดือนก่อน − true-up = ภาษีของเดือนนี้ MTD)

5. ถ้า TAXABLE INCOME AFTER LCF เป็นยอดเดบิต ACL5 เท่ากับเท่าไร?

เท่ากับ 0 — เพราะเดบิต = ขาดทุน จึงไม่มีภาษี · และโปรแกรมต้อง เก็บผลขาดทุนลง ZTAXB_T01 เพื่อยกไปใช้ปีหน้า · ถ้าเป็นเครดิต (กำไร) → ACL5 = ACL3 × ACL4 กลับเครื่องหมาย

6. A212* ใน GL mapping แปลว่าอะไร?

แปลว่าบัญชี A2120000 ถึง A2129999 — ใช้ดอกจันแทนการพิมพ์ช่วง (เช่นเดียวกับ A1* = A100000–A199999) ใช้คู่กับคอลัมน์ Exclude GL เพื่อตัดบัญชีบางตัวออกจากช่วงได้

7. Deemed sales ของ PSC_DZ ต่างจาก PSC_OM ตรงไหน?

PSC_DZ ต้องเช็ค LCF และเทียบ EBT ก่อน 2 ขั้น — ถ้ามี LCF หรือขาดทุน → deemed sale = 0 · ส่วน PSC_OM คำนวณตรง ๆ ไม่มีขั้นเช็ค LCF · นอกจากนี้ฐานการคำนวณต่างกัน (DZ ใช้ Manual Adj SALE PER TAX · OM ใช้ Sale per tax + Cost recovered − Utilised) ทั้งคู่ปิดท้ายด้วยการหัก GL A410X031 ของเดือนก่อน

8. มาเลเซียมีการหักขาดทุนกี่ชั้น อะไรบ้าง?

2 ชั้น — ชั้นที่ 1 Unabsorbed capital allowances (ACL8→ACL10 · หักด้วย ACL9) ชั้นที่ 2 Unabsorbed business loss (ACL12→ACL15 · หักด้วย ACL14) ปิดท้ายที่ ACL16 Assessable (Income)/Loss = ACL11 + OS_PU25 − ACL14 · และ C/F ทั้ง 4 ประเภท (marginal / non-marginal / investment / non-investment) โอนข้ามประเภทไม่ได้