“ขาดทุนสะสมยกไป” คือสิทธิทางภาษีที่มีมูลค่าจริง — ขาดทุนปีนี้ใช้หักกำไรปีหน้าได้ ปัญหาคือ SAP มาตรฐานไม่มีที่เก็บตัวเลขนี้ RPT-5 จึงถูกสร้างขึ้นเพื่อเป็น “สมุดบัญชี LCF” ของทั้งกลุ่ม — เก็บ · แสดง · และแปลงสกุลเงินให้ SAC ใช้ต่อ Complexity = Simple แต่ criticality สูงมาก เพราะถ้าตัวเลขนี้ผิด ภาษีทุกปีถัดไปผิดหมด
ZTAXB_T03 = ตารางบอกว่า “บริษัทไหนต้องแปลง LC1→LC2 ด้วย exchange rate type อะไร”TCURR)Current tax report คำนวณ “ขาดทุนคงเหลือหลังหัก LCF” ได้ทุกเดือน — แต่พอปิดปีแล้ว ตัวเลขนั้นไม่ได้ถูกเก็บไว้ที่ไหน ปีถัดไปโปรแกรมจะไม่รู้ว่ามียอดยกมาเท่าไหร่ ในโลก ECC เดิมใช้วิธี อัปโหลด flat file เข้า item type “Loss carried forward” ทุกปี = งาน manual + เสี่ยงพิมพ์ผิด
ZTAXB_T01 เก็บ LCF ต่อ (บริษัท · ปี · งวด · profit center · segment · tax rate · TAX_INFO …)ZTAXB_R03_LCF แสดงยอด LCF ในมุมมองต่าง ๆ (รายเดือน/รายปี · สรุป/ละเอียด · LC1/2/3)| กรณี | แสดงสกุลอะไร |
|---|---|
| ไทย | LC1 · LC2 · LC3 ครบ 3 |
| ประเทศที่ ไม่มี LC3 | LC1 · LC2 เท่านั้น |
| ประเทศ/บริษัทที่ต้องแปลง (เช่น มาเลเซีย) | เพิ่ม LC2 Conversion คำนวณจาก LC1 ด้วย month-end selling rate |
| มาเลเซีย | แสดง Unabsorbed capital allowances เพิ่มอีกชุด |
ZTAXB_T03 — ตารางกำหนด exchange rate typeตารางเล็กที่สุดในโปรเจกต์ (2 field) แต่เป็นตัวตัดสินว่าจะแปลงสกุลเงินหรือไม่
| # | Table | Field | Type | Length | Description |
|---|---|---|---|---|---|
| 1 | ZTAXB_T03 | BUKRS | CHAR | 4 | Company code |
| 2 | ZTAXB_T03 | KURST | CHAR | 9 | Exchange rate type |
| Company code | Exchange rate type |
|---|---|
1088 | ZMY |
1102 | ZMY |
1xxx | Zxx |
TCURR ของงวดที่รายงานTCURR
(from-currency / to-currency และ ratio) · FD เขียนชัดว่า “LC1 Bal divided by FX Rate”
→ ตอนเทสต์ต้องเช็คทั้งค่าและทิศทางด้วยการคำนวณมือ 1 บรรทัด อย่าเชื่อว่าถูกเพราะไม่ errorZTAXB_T01 — โครงสร้างตาราง LCFแบ่งเป็น 3 กลุ่มคอลัมน์: key ฝั่ง main · key ฝั่ง branch · ยอดเงิน
| Company code (Main) | Reporting year | Reporting period | Profit center | Recovery Indicator | Depreciation area | Ledger | Segment (main) | Tax rate | TAX_INFO |
|---|---|---|---|---|---|---|---|---|---|
| xx | xx | xx | xx | xx | xx | xx | xx | xx | xx |
| BOI | IBC | Company code (Branch) | Profit center (Branch) | Recovery indicator (branch) | Depreciation area (branch) | Ledger (branch) | Segment (branch) |
|---|---|---|---|---|---|---|---|
| xx | xx | xx | xx | xx | xx | xx | xx |
| Currency type | LCF Original balance | LCF Conversion balance | LCF movement | Unabsorbed CA balance | Unabsorbed CA Conversion | Unabsorbed CA Movement | Type of report |
|---|---|---|---|---|---|---|---|
| xx | xx | xx | xx | xx | xx | xx | LCF / Unabsorbed capital allowances |
| ยอด | ความหมาย | ที่มา |
|---|---|---|
| Original balance | ยอดคงเหลือตามสกุลที่ current tax report ให้มา | current tax report โดยตรง |
| Conversion balance | ยอดคงเหลือหลังแปลงด้วย month-end rate | LC1 ÷ FX rate (เฉพาะบริษัทใน ZTAXB_T03) |
| Movement | การเปลี่ยนแปลงในงวด | ยอดงวดนี้ − ยอดงวดก่อน |
Balance includes movement + ITD (inception-to-date) จากปีก่อน — ในตัวอย่าง output ของ FD จะเห็นแถว “ITD- Dec 2023” เป็นยอดตั้งต้นของปี 2024
“Selection screen design will be similar to that of the current tax report” + radio ใหม่ 4 กลุ่ม
| Field | Attr | Default | Validation / หมายเหตุ |
|---|---|---|---|
| Company code (Main) | Mandatory | — | T001-BUKRS · ถ้าไม่มี → error “Company code does not exist” · multiple selection |
| Reporting Year | Mandatory | — | กำหนดปีที่แสดง LCF |
| Reporting Period | Input | — | กำหนดงวดที่แสดง LCF |
| Profit center | Input | — | CEPC-PRCTR · error “Profit center does not exist” · from–to + multiple |
| Recovery Indicator | Input | — | T8JJ-RECID · error “recovery indicator does not exist” · multiple |
| Depreciation area | Mandatory | — | N/A |
| Ledger | Mandatory | — | N/A |
| Segment (Main) | Mandatory | — | N/A |
| TAX_INFO | Input | — | ใช้ระบุประเทศ เมื่อ LCF มาจาก company + profit center + segment เดียวกันทั้งไทยและต่างประเทศ · เช่น MTJDA_MY, CITTH_MM |
| IBC (checkbox) | Input | — | N/A |
| BOI (checkbox) | Input | — | N/A |
| Company code (Branch) | Input | — | validation เดียวกับ main |
| Profit center / Recovery indicator (Branch) | Input | — | validation เดียวกับ main |
| Depreciation area / Ledger / Segment (Branch) | Input | — | N/A |
| กลุ่ม | ตัวเลือก | Default | ผลลัพธ์ |
|---|---|---|---|
| Display Currency | LC1 / LC2 / LC3 | LC2 | เลือกสกุลที่แสดง |
| Timeperiod | Monthly / Yearly | Monthly | แสดงยอดรายเดือน หรือสรุปรายปี |
| Type of Report | Summary of Report / Detailed Report | Summary | Summary = แสดงแค่ LC balance · Detailed = แสดง balance + movement + conversion + FX rate |
| Malaysia Specific | Loss carried forward / Unabsorbed capital allowances | Loss carried forward | เลือกว่าจะดึงยอดจาก section ไหนของ current tax report ต่างประเทศ |
MTJDA_MY — MTJDA คือ segment · MY คือมาเลเซีย → โปรแกรมคำนวณ LCF ตามกฎหมายมาเลเซีย”
ผู้ใช้ ต้องกรอก TAX_INFO ตอนรัน current tax report ต่างประเทศ เพื่อให้ข้อมูลถูกส่งมาที่ LCF report ถูกช่อง —
ถ้าลืม ค่า LCF ของสองประเทศจะปนกันโดยไม่มี errorสกุลเงิน (3) × ช่วงเวลา (2) × ระดับรายละเอียด (2) = 12 มุมมอง
| Period/Year | Profit center 1 | Profit center 2 | Total | |||
|---|---|---|---|---|---|---|
| LC1 Balance | LC1 movement | LC1 Balance | LC1 movement | LC1 Balance | LC1 movement | |
| ITD- Dec 2023 | 500 | — | 1,000 | — | 1,500 | — |
| 1.2024 | 1,500 | 1,000 | xx | xx | xx | xx |
| 2.2024 | 1,700 | 200 | xx | xx | xx | xx |
| 3.2024 | – | -1,700 | ||||
| 5.2024 | 600 | 600 | ||||
| 6.2024 | 100 | -500 | ||||
| 12.2024 | 2,300 | 1,300 | ||||
| ITD- Dec 2024 | 2,300 | N/A | ||||
Balance = movement + ITD ของปีก่อน · แถว ITD ปิดท้ายคือยอดที่จะเป็นยอดตั้งต้นของปีถัดไป
| Period/Year | LC2 Original Balance | LC2 Original movement | LC1 balance | FX rate | LC2 Conversion Balance |
|---|---|---|---|---|---|
| ITD- Dec 2023 | xx | xx | |||
| 01.2024 | xx | xx | xx | xx | = LC1 Bal ÷ FX Rate |
| … 12.2024 |
| Column | Format | Source | Note |
|---|---|---|---|
| LC2 Original Balance | NUMERIC-16 | current tax report (รันด้วย LC2) | รวม movement + ITD ปีก่อน |
| LC2 Original movement | NUMERIC-16 | current tax report (LC2) | — |
| LC1 balance | NUMERIC-16 | current tax report (LC1) | รวม movement + ITD ปีก่อน |
| FX Rate | NUMERIC-16 | TCURR · rate type จาก ZTAXB_T03 | อัตราสิ้นเดือน ของงวดที่เลือก |
| LC2 Conversion balance | NUMERIC-16 | คำนวณ | = LC1 Original balance ÷ FX rate |
| Company code | TH01 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
| Segment | CIT_TH | PITA_TH | PSC_TH | ||||||
| Profit center | C1 | C2 | C3 | C4 | C5 | C6 | C7 | C8 | |
| Period 1 … 12 | xx | xx | xx | xx | xx | xx | xx | xx | |
ZTAXB_T01 → แสดงค่า conversion| Period/Year | LC3 Balance | LC3 movement |
|---|---|---|
| ITD 2023 | 500 | N/A |
| 2024 | 300 | -200 |
| 2025 | 200 | -100 |
| 2026 | 200 | – |
| 2027 | 1,300 | 1,100 |
| 2028 | 1,500 | 200 |
| 2029 | 2,800 | 1,300 |
FD ระบุว่าบางกรณีมี profit center เกิน 10 ตัว ทำให้เลื่อนหาคอลัมน์ Total ลำบาก จึงต้องมี ไอคอน grouping — กดแล้วเห็นเฉพาะ Total · กด ungrouping แล้วกางทุก profit center กลับมา ต้องมีทั้ง LC1, LC2 และ LC3
| เลือก radio | ดึงค่าจาก section ไหนของ RPT-4 | เก็บลง field | คอลัมน์ Type of report |
|---|---|---|---|
| Loss carried forward | Unabsorbed business loss | LCF balance | LCF |
| Unabsorbed capital allowances | Unabsorbed capital allowances | Unabsorbed CA balance | Unabsorbed capital allowances |
อ้างอิงจาก TAX-RPT-4 §11 — มาเลเซียมีการหักขาดทุน 2 ชั้น: ACL10 C/F Unabsorbed capital allowances (ชั้นที่ 1) และ ACL15 C/F Unabsorbed business loss (ชั้นที่ 2) → RPT-5 จึงต้องเก็บทั้งสองแยกกัน ใช้ layout เดียวกัน แต่เปลี่ยนแหล่งข้อมูล
สำหรับ IBCTC และ IBCSVCS ค่า LCF ไม่ได้เก็บที่ระดับ company segment แต่เก็บ ตามอัตราภาษี — เพราะบริษัทเดียวมีรายได้ 2 อัตรา (3% intercompany / 20% non-intercompany) ที่ต้องคำนวณภาษีแยกกันตามกฎหมาย
| Period/Year | Profit center 1 | Profit center 2 | Total | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 3% | 20% | 3% | 20% | 3% | 20% | |||||||
| ITD- Dec 2023 | 500 | xx | xx | xx | xx | xx | ||||||
| 1.2024 | 1,500 | xx | xx | xx | xx | xx | ||||||
| ITD- Dec 2024 | 2,300 | |||||||||||
VBUND) ที่ validate กับ ZTAXA_T04
→ นั่นคือเหตุผลที่ ZTAXB_T01 ต้องมี Tax rate เป็นหนึ่งใน key| Test ID | Condition | Expected result |
|---|---|---|
| TC-001 | Selection screen parameters | มีทุก field ตามที่ระบุ |
| TC-002 | การอัปเดตค่า LCF | ดึงค่า LCF ถูกต้อง |
| TC-003 | Monthly vs Annual report | แสดงตาม radio ที่เลือก |
| TC-004 | Unabsorbed capital allowances (มาเลเซีย) | แสดงถูกต้องตาม current tax report |
| TC-005 | LC2 Conversion | สำหรับมาเลเซียและบริษัทอื่นที่ต้องแปลงในอนาคต — การคำนวณต้องแม่นยำ |
| TC-006 | การบันทึกค่า LCF ลงตาราง | ค่าของ LC1, LC2, LC3 ถูกอัปเดตในตาราง custom |
| TC-007 | IBCTC และ IBCSVCS layout | คำนวณและพิจารณา LCF ตามอัตราภาษี |
| TC-008 | Detailed vs Summary output | แสดงตาม radio ที่เลือก |
ZTAXB_T03 → ต้องไม่แปลง ใช้ LC2 originalFD ให้ complexity = Simple เพราะ logic น้อย (อ่านตาราง + แปลงสกุล + แสดงผล) แต่ในเชิงธุรกิจ object นี้เป็น single source of truth ของสิทธิทางภาษี ที่มีมูลค่าเป็นตัวเงินจริง → ควรได้รับการทดสอบละเอียดกว่าที่ complexity บ่งบอก และควรมี control เรื่องสิทธิ์การกดปุ่ม Update TODO: verify ว่ามีการจำกัดสิทธิ์กดปุ่มหรือไม่ (FD ระบุ role เป็น “Display the tables and transaction”)
5 จุดตรวจ LCF รายเดือน
ZTAXB_T03 ต้องไม่มีค่า conversion ·
(5) IBCTC/IBCSVCS — ยอดแยกตามอัตราครบทั้ง 3% และ 20%
| ศัพท์ในระบบ | ศัพท์ที่ทีมภาษีใช้ |
|---|---|
| LCF (Loss Carried Forward) | ผลขาดทุนสะสมยกไป |
| Unabsorbed capital allowances | ค่าเสื่อมราคาทางภาษีที่ยังใช้ไม่หมด |
| Unabsorbed business loss | ผลขาดทุนจากการประกอบกิจการที่ยังใช้ไม่หมด |
| ITD (Inception To Date) | ยอดสะสมตั้งแต่เริ่มโครงการ |
| Movement | การเคลื่อนไหวในงวด |
| Deferred tax | ภาษีเงินได้รอการตัดบัญชี |
1. ข้อมูลเข้าตาราง LCF ได้อย่างไร และอ่านจาก node อะไร?
2. ZTAXB_T03 มีกี่ field และใช้ทำอะไร?
BUKRS CHAR(4) และ KURST CHAR(9)
· ใช้บอกว่า บริษัทไหนต้องแปลง LC1→LC2 และใช้ exchange rate type อะไร
· ถ้า company code ไม่มีในตาราง → ไม่แปลง ใช้ LC2 original
3. สูตร LC2 Conversion Balance
TCURR (อัตรา สิ้นเดือน ของงวดที่เลือก)
· rate type มาจาก ZTAXB_T03-KURST
4. ทำไม IBCTC/IBCSVCS ต้องเก็บ LCF ตามอัตราภาษี?
ZTAXB_T01 จึงมี Tax rate เป็น key
5. ถ้ากดปุ่ม Update ซ้ำ จะเกิดอะไรขึ้น และต้องป้องกันยังไง?
6. TAX_INFO ใช้ตอนไหน ยกตัวอย่าง 2 ค่า
MTJDA_MY (segment MTJDA · มาเลเซีย) และ CITTH_MM
· ผู้ใช้ต้องกรอกตอนรัน current tax report ต่างประเทศ ไม่งั้นค่าจะปนกัน
7. รายงานนี้มี radio button กี่กลุ่ม อะไรบ้าง และ default คืออะไร?
8. ค่า LC2 conversion ถูกใช้ต่อโดยใคร?
ZTAXB_T03
→ นี่คือเหตุผลที่ต้องแปลงด้วยอัตราสิ้นงวด ไม่ใช่ใช้ LC2 ที่แปลง ณ วัน posting