Transfer Pricing Algorithm WIP: Difference between revisions
Jump to navigation
Jump to search
(Added and modified WIP page for Thin-Capitalisation in TP Algorithm) |
No edit summary |
||
Line 1: | Line 1: | ||
== Thin-Capitalisation (“Thin-Cap”) module == | == Thin-Capitalisation (“Thin-Cap”) module == | ||
=== Context === | === Context === | ||
This module | This module runs '''<u>after</u>''' the TP-convergence loop and '''<u>before</u>''' the withholding-tax stage. | ||
It caps interest deductibility, adjusts '''ATP PBT''', and manages an interest carry-forward bucket. | |||
=== Data structure additions === | === Data structure additions === | ||
Line 10: | Line 9: | ||
{| class="wikitable sortable mw-collapsible mw-collapsed" | {| class="wikitable sortable mw-collapsible mw-collapsed" | ||
|+Input Data Points – Thin-Cap | |+Input Data Points – Thin-Cap | ||
!Role | !Role!!Label!!Definition!!Typing!!Multiplicity behaviour!!Mandatory | ||
!Label | |||
!Definition | |||
!Typing | |||
!Multiplicity | |||
!Mandatory | |||
|- | |- | ||
|Financials | |Financials||ATP Debt – Related-party||Average debt owed to associated enterprises||Couple (Decimal; ISO 3 Currency)||Aggregate||No (=0 if absent) | ||
|ATP Debt – Related-party | |||
|Average | |||
|Couple (Decimal;ISO 3 Currency | |||
| | |||
|No | |||
|- | |- | ||
|Financials | |Financials||ATP Debt – Third-party||Average debt owed to independent lenders||Couple (Decimal; ISO 3 Currency)||Aggregate||No (=0 if absent) | ||
|ATP Debt – Third-party | |||
|Average | |||
|Couple (Decimal;ISO 3 Currency | |||
| | |||
|No | |||
|- | |- | ||
|Financials | |Financials||ATP Equity – Thin-Cap||Equity figure prescribed by local thin-cap rules||Couple (Decimal; ISO 3 Currency)||Aggregate||Yes if Thin-Cap in scope | ||
|ATP Equity – Thin-Cap | |||
| | |||
|Couple (Decimal;ISO 3 Currency | |||
| | |||
|Yes | |||
|- | |- | ||
|Financials | |Financials||ATP Net Interest Expense||Interest expense – interest income (post-TP)||Couple (Decimal; ISO 3 Currency)||Aggregate||Yes if Thin-Cap in scope | ||
|ATP Net Interest Expense | |||
| | |||
|Couple (Decimal;ISO 3 Currency | |||
| | |||
|Yes | |||
|- | |- | ||
|Financials | |Financials||ATP EBITDA||EBITDA (after TP Adjustment)||Couple (Decimal; ISO 3 Currency)||Aggregate||Only for EBITDA-based rules | ||
|ATP EBITDA | |||
| | |||
|Couple (Decimal;ISO 3 Currency | |||
| | |||
| | |||
|- | |- | ||
|Financials | |Financials||ATP Excess Interest Carry-forward N-1||Disallowed interest still available||Couple (Decimal; ISO 3 Currency)||Aggregate||No (default 0) | ||
|ATP Excess Interest Carry-forward N-1 | |||
|Disallowed interest | |||
|Couple (Decimal;ISO 3 Currency | |||
| | |||
|No | |||
|} | |} | ||
==== Rules ==== | ==== Rules ==== | ||
<small>(multiple rows per entity allowed; tightest cap wins)</small> | |||
{| class="wikitable sortable mw-collapsible mw-collapsed" | {| class="wikitable sortable mw-collapsible mw-collapsed" | ||
|+Input Rules – Thin-Cap | |+Input Rules – Thin-Cap | ||
!Role | !Role!!Label!!Definition!!Typing / Domain!!Multiplicity behaviour!!Mandatory | ||
!Label | |- | ||
!Definition | |Thin-Cap||ATP Thin-Cap in scope||Flags whether any thin-capitalisation restriction applies to the entity.||Boolean||One per segment||No, default False | ||
!Typing | |||
!Multiplicity | |||
!Mandatory | |||
|- | |- | ||
|Thin-Cap | |Thin-Cap||ATP Thin-Cap rule type||Chooses the statutory approach.<br>• '''Fixed-Ratio''' – a cap expressed as A / B ≤ Threshold (covers debt-equity, interest-EBITDA, interest-assets, etc.).<br>• '''Safe-Harbour-None''' – no mechanical limitation; deduct all interest.||Enum:{Fixed-Ratio; Safe-Harbour-None}||Several rows may coexist (e.g. 30 % EBITDA '''AND''' 3 : 1 debt-equity).||Yes if “in scope” is True | ||
|ATP Thin-Cap rule type | |||
| | |||
| | |||
| | |||
|Yes if | |||
|- | |- | ||
|Thin-Cap | |Thin-Cap||ATP Fixed-Ratio numerator||Variable '''A''' in the ratio to be tested (what is limited).||Enum:{NetInterestExpense; DebtRelatedParty; DebtTotal}||One per Fixed-Ratio row||Yes for Fixed-Ratio | ||
|ATP | |||
| | |||
| | |||
| | |||
| | |||
|- | |- | ||
|Thin-Cap | |Thin-Cap||ATP Fixed-Ratio denominator||Variable '''B''' that forms the economic base.||Enum:{EBITDA; EBIT; PBT; EquityThinCap; TotalAssets; TaxableIncome; OperatingCashFlow}||One per Fixed-Ratio row||Yes for Fixed-Ratio | ||
|ATP | |||
| | |||
| | |||
| | |||
| | |||
|- | |- | ||
|Thin-Cap | |Thin-Cap||ATP Fixed-Ratio threshold||Numeric limit '''T'''.<br>Enter 0 – 1 for percentage caps (e.g. 0.30 = 30 %) or > 1 for pure ratios (e.g. 3 = 3 : 1).||Decimal||One per Fixed-Ratio row||Yes for Fixed-Ratio | ||
|ATP Fixed-Ratio | |||
| | |||
| | |||
| | |||
| | |||
|- | |- | ||
|Thin-Cap | |Thin-Cap||ATP De-minimis interest threshold||Absolute amount of net interest always deductible before applying any ratio test (e.g. €3 m in ATAD).||Couple (Decimal; ISO 3 Currency)||Several rows allowed (but typically one) ||No, default 0 | ||
|ATP De-minimis interest threshold | |||
| | |||
|Couple (Decimal;ISO 3 Currency | |||
| | |||
| | |||
|- | |- | ||
|Thin-Cap | |Thin-Cap||ATP Group-Ratio election||True if the taxpayer elects to substitute the Group-Ratio cap in this row (ATAD art. 4 §5; UK CIR).||Boolean||One per Fixed-Ratio row||No, default False | ||
|ATP Group-Ratio election | |||
| | |||
|Boolean | |||
| | |||
| | |||
|- | |- | ||
|Thin-Cap | |Thin-Cap||ATP Group-Ratio %||Group net-interest ÷ group EBITDA used when the election above is True.||Percentage||One per Fixed-Ratio row||Yes if election = True | ||
|ATP Group-Ratio % | |||
|Group net-interest ÷ EBITDA | |||
| | |||
| | |||
| | |||
|- | |- | ||
|Thin-Cap | |Thin-Cap||ATP Excess-Interest carry-forward period||Number of years disallowed interest can be carried forward (FIFO bucket; ≥ 5 y for ATAD countries, ∞ allowed).||Integer (years)||One per segment||No, default ∞ | ||
|ATP Excess Interest carry-forward period | |||
|Number of years disallowed interest | |||
|Integer | |||
| | |||
| | |||
|} | |} | ||
Line 130: | Line 52: | ||
{| class="wikitable" | {| class="wikitable" | ||
|+New Output Data Points | |+New Output Data Points | ||
!Role | !Role!!Label!!Definition | ||
!Label | |||
!Definition | |||
|- | |- | ||
|Taxation | |Taxation||ATP Disallowed Interest N||Interest denied in current year (−PBT) | ||
|ATP Disallowed Interest N | |||
| | |||
|- | |- | ||
|Taxation | |Taxation||ATP Excess Interest Carry-forward N||Disallowed interest carried forward | ||
|ATP Excess Interest Carry-forward N | |||
|Disallowed interest | |||
|} | |} | ||
=== Computational step – Thin-Cap limitation === | === Computational step – Thin-Cap limitation === | ||
This step is | This step is executed '''entity-by-entity''' at the Declaring-Entity level. | ||
# '''Pre-checks''' | |||
#* If <code>Thin-Cap in scope = False</code> ⇒ skip module. | |||
# '''Net interest expense (NI) after de-minimis''' | |||
#* <code>NI = max(0 ; ATP Net Interest Expense − ATP De-minimis interest threshold)</code> | |||
# '''Allowable Interest Ceiling (AIC)''' | |||
#* For each rule row i where rule type = Fixed-Ratio: | |||
#** Fetch <code>Numerator_i ← choose(NumeratorTag_i , data block)</code> | |||
#** Fetch <code>Denominator_i ← choose(DenominatorTag_i , data block)</code> | |||
#** if <code>Denominator_i = 0</code> → raise validation error | |||
#** <code>Threshold_i ← ATP Fixed-Ratio threshold_i</code> | |||
#** <code>Cap_i ← Threshold_i × Denominator_i</code> | |||
#** if <code>NumeratorTag_i ∈ { NetInterestExpense }</code>: | |||
#*** <code>AIC_i = min( NI , Cap_i )</code> | |||
#** if <code>NumeratorTag_i ∈ { DebtRelatedParty ; DebtTotal }</code>: | |||
#*** <code>AllowedDebt = Cap_i</code> | |||
#*** <code>ActualDebt = Numerator_i</code> | |||
#*** <code>AllowedInterest = NI × AllowedDebt / ActualDebt</code> (if ActualDebt > 0) | |||
#*** <code>AIC_i = min( NI , AllowedInterest )</code> | |||
#** if <code>Group-Ratio election_i = True</code> (Apply group-ratio uplift if elected on this row): | |||
#*** <code>GRCap = Group-Ratio %_i × Denominator_i</code> | |||
#*** <code>AIC_i = min( NI , max( Cap_i , GRCap ) )</code> | |||
#* Combine multiple rows: | |||
#** <code>AIC_final = MIN( AIC_i for all Fixed-Ratio rows )</code> | |||
#** If the entity has only one row and <code>ATP Thin-Cap rule type = Safe-Harbour-None</code>: | |||
#*** <code>AIC_final = NI</code> | |||
# '''Current-year disallowance''' | |||
#* <code>Disallowed_Before_Carry = max(0 ; NI − AIC_final)</code> | |||
# '''Utilise carry-forward bucket (FIFO single pool)''' | |||
#* <code>Headroom = max( 0 ; AIC_final – ( NI – Disallowed_Before_Carry ) )</code> | |||
#* <code>Allowed_from_carry = min(ATP Excess Interest Carry-forward N-1 ; Headroom)</code> | |||
#* <code>Disallowed_N = Disallowed_Before_Carry − Allowed_from_carry</code> | |||
# '''Update variables''' | |||
## <code>ΔPBT_Thin-Cap = − Disallowed_N</code> | |||
## <code>ATP Disallowed Interest N = Disallowed_N</code> | |||
## <code>ATP Excess Interest Carry-forward N = Disallowed_N</code> (drops FIFO after ‘‘carry-forward period’’) | |||
## Replace <code>ATP_PBT</code> downstream with: <code>New_ATP_PBT = ATP PBT + ΔPBT_Thin-Cap + ΔPBT_WHT (paid + due)</code> | |||
=== Interaction with other modules === | === Interaction with other modules === | ||
* ''' | * '''TP convergence''' – uses after TP Ajustment interest; does NOT trigger another TP loop. | ||
* '''Withholding-tax | * '''Withholding-tax''' – unchanged (WHT on gross interest). | ||
* '''Tax-loss computation''' | * '''Tax-loss computation''' – starts from <code>New_ATP_PBT</code>. | ||
* ''' | * '''Optimiser''' – may vary Debt/Equity Ratio or other Fixed Ratio, interest rate or Group-Ratio election. '''ΔPBT_Thin-Cap''' feeds into the objective function. | ||
=== Example – Fixed-ratio cap that creates a disallowance === | |||
==== Data ==== | |||
{| class="wikitable" | |||
!Role!!Label!!Value | |||
|- | |||
|Matching||ATP Declaring Entity segmentation||("Entity"; "FR001") | |||
|- | |||
|Financials||ATP Debt – Related-party||(15 000 000; EUR) | |||
|- | |||
|Financials||ATP Debt – Third-party||(10 000 000; EUR) | |||
|- | |||
|Financials||ATP Equity – Thin-Cap||(8 000 000; EUR) | |||
|- | |||
|Financials||ATP Net Interest Expense||(4 000 000; EUR) | |||
|- | |||
|Financials||ATP EBITDA||(10 000 000; EUR) | |||
|- | |||
|Financials||ATP Excess Interest Carry-forward N-1||(0; EUR) | |||
|} | |||
==== Rules ==== | |||
{| class="wikitable" | |||
!Role!!Label!!Value | |||
|- | |||
|Thin-Cap||ATP Thin-Cap in scope||True | |||
|- | |||
|Thin-Cap||ATP Thin-Cap rule type||Fixed-Ratio | |||
|- | |||
|Thin-Cap||ATP Fixed-Ratio numerator||NetInterestExpense | |||
|- | |||
|Thin-Cap||ATP Fixed-Ratio denominator||EBITDA | |||
|- | |||
|Thin-Cap||ATP Fixed-Ratio threshold||0.30 <!-- 30 % --> | |||
|- | |||
|Thin-Cap||ATP De-minimis interest threshold||(500 000; EUR) | |||
|- | |||
|Thin-Cap||ATP Group-Ratio election||False | |||
|- | |||
|Thin-Cap||ATP Excess-Interest carry-forward period||5 | |||
|} | |||
==== Thin-Cap computation ==== | |||
* '''Step 1 – Pre-checks''' | |||
ATP Thin-Cap in scope = TRUE so continue with the following steps | |||
* '''Step 2 – De-minimis''' | |||
ATP Net Interest Expense = €4 000 000 | |||
ATP De-minimis interest threshold = €500 000 | |||
NI = max(0 ; ATP Net Interest Expense − ATP De-minimis interest threshold) = €3 500 000 | |||
* '''Step 3 – Fixed-ratio cap''' | |||
Cap = 0.30 × EBITDA = €3 000 000 | |||
AIC_final = min(NI , Cap) = €3 000 000 | |||
* '''Step 4 – Disallowance before carry-forward''' | |||
Disallowed_Before_Carry = NI − AIC = €500 000 | |||
* '''Step 5 – Utilise carry-forward''' | |||
Prior bucket = €0 ⇒ Allowed_from_carry = €0 | |||
Disallowed_N = €500 000 | |||
* '''Step 6 – Outputs''' | |||
ATP Disallowed Interest N = €500 000 | |||
ATP Excess Interest Carry-forward N = €500 000 | |||
ΔPBT_Thin-Cap = –€500 000 | |||
New_ATP_PBT = ATP PBT – €500 000 + ΔPBT_WHT | |||
Revision as of 16:16, 13 June 2025
Thin-Capitalisation (“Thin-Cap”) module
Context
This module runs after the TP-convergence loop and before the withholding-tax stage. It caps interest deductibility, adjusts ATP PBT, and manages an interest carry-forward bucket.
Data structure additions
Data
Role | Label | Definition | Typing | Multiplicity behaviour | Mandatory |
---|---|---|---|---|---|
Financials | ATP Debt – Related-party | Average debt owed to associated enterprises | Couple (Decimal; ISO 3 Currency) | Aggregate | No (=0 if absent) |
Financials | ATP Debt – Third-party | Average debt owed to independent lenders | Couple (Decimal; ISO 3 Currency) | Aggregate | No (=0 if absent) |
Financials | ATP Equity – Thin-Cap | Equity figure prescribed by local thin-cap rules | Couple (Decimal; ISO 3 Currency) | Aggregate | Yes if Thin-Cap in scope |
Financials | ATP Net Interest Expense | Interest expense – interest income (post-TP) | Couple (Decimal; ISO 3 Currency) | Aggregate | Yes if Thin-Cap in scope |
Financials | ATP EBITDA | EBITDA (after TP Adjustment) | Couple (Decimal; ISO 3 Currency) | Aggregate | Only for EBITDA-based rules |
Financials | ATP Excess Interest Carry-forward N-1 | Disallowed interest still available | Couple (Decimal; ISO 3 Currency) | Aggregate | No (default 0) |
Rules
(multiple rows per entity allowed; tightest cap wins)
Role | Label | Definition | Typing / Domain | Multiplicity behaviour | Mandatory |
---|---|---|---|---|---|
Thin-Cap | ATP Thin-Cap in scope | Flags whether any thin-capitalisation restriction applies to the entity. | Boolean | One per segment | No, default False |
Thin-Cap | ATP Thin-Cap rule type | Chooses the statutory approach. • Fixed-Ratio – a cap expressed as A / B ≤ Threshold (covers debt-equity, interest-EBITDA, interest-assets, etc.). • Safe-Harbour-None – no mechanical limitation; deduct all interest. |
Enum:{Fixed-Ratio; Safe-Harbour-None} | Several rows may coexist (e.g. 30 % EBITDA AND 3 : 1 debt-equity). | Yes if “in scope” is True |
Thin-Cap | ATP Fixed-Ratio numerator | Variable A in the ratio to be tested (what is limited). | Enum:{NetInterestExpense; DebtRelatedParty; DebtTotal} | One per Fixed-Ratio row | Yes for Fixed-Ratio |
Thin-Cap | ATP Fixed-Ratio denominator | Variable B that forms the economic base. | Enum:{EBITDA; EBIT; PBT; EquityThinCap; TotalAssets; TaxableIncome; OperatingCashFlow} | One per Fixed-Ratio row | Yes for Fixed-Ratio |
Thin-Cap | ATP Fixed-Ratio threshold | Numeric limit T. Enter 0 – 1 for percentage caps (e.g. 0.30 = 30 %) or > 1 for pure ratios (e.g. 3 = 3 : 1). |
Decimal | One per Fixed-Ratio row | Yes for Fixed-Ratio |
Thin-Cap | ATP De-minimis interest threshold | Absolute amount of net interest always deductible before applying any ratio test (e.g. €3 m in ATAD). | Couple (Decimal; ISO 3 Currency) | Several rows allowed (but typically one) | No, default 0 |
Thin-Cap | ATP Group-Ratio election | True if the taxpayer elects to substitute the Group-Ratio cap in this row (ATAD art. 4 §5; UK CIR). | Boolean | One per Fixed-Ratio row | No, default False |
Thin-Cap | ATP Group-Ratio % | Group net-interest ÷ group EBITDA used when the election above is True. | Percentage | One per Fixed-Ratio row | Yes if election = True |
Thin-Cap | ATP Excess-Interest carry-forward period | Number of years disallowed interest can be carried forward (FIFO bucket; ≥ 5 y for ATAD countries, ∞ allowed). | Integer (years) | One per segment | No, default ∞ |
Taxation / Output
Role | Label | Definition |
---|---|---|
Taxation | ATP Disallowed Interest N | Interest denied in current year (−PBT) |
Taxation | ATP Excess Interest Carry-forward N | Disallowed interest carried forward |
Computational step – Thin-Cap limitation
This step is executed entity-by-entity at the Declaring-Entity level.
- Pre-checks
- If
Thin-Cap in scope = False
⇒ skip module.
- If
- Net interest expense (NI) after de-minimis
NI = max(0 ; ATP Net Interest Expense − ATP De-minimis interest threshold)
- Allowable Interest Ceiling (AIC)
- For each rule row i where rule type = Fixed-Ratio:
- Fetch
Numerator_i ← choose(NumeratorTag_i , data block)
- Fetch
Denominator_i ← choose(DenominatorTag_i , data block)
- if
Denominator_i = 0
→ raise validation error Threshold_i ← ATP Fixed-Ratio threshold_i
Cap_i ← Threshold_i × Denominator_i
- if
NumeratorTag_i ∈ { NetInterestExpense }
:AIC_i = min( NI , Cap_i )
- if
NumeratorTag_i ∈ { DebtRelatedParty ; DebtTotal }
:AllowedDebt = Cap_i
ActualDebt = Numerator_i
AllowedInterest = NI × AllowedDebt / ActualDebt
(if ActualDebt > 0)AIC_i = min( NI , AllowedInterest )
- if
Group-Ratio election_i = True
(Apply group-ratio uplift if elected on this row):GRCap = Group-Ratio %_i × Denominator_i
AIC_i = min( NI , max( Cap_i , GRCap ) )
- Fetch
- Combine multiple rows:
AIC_final = MIN( AIC_i for all Fixed-Ratio rows )
- If the entity has only one row and
ATP Thin-Cap rule type = Safe-Harbour-None
:AIC_final = NI
- For each rule row i where rule type = Fixed-Ratio:
- Current-year disallowance
Disallowed_Before_Carry = max(0 ; NI − AIC_final)
- Utilise carry-forward bucket (FIFO single pool)
Headroom = max( 0 ; AIC_final – ( NI – Disallowed_Before_Carry ) )
Allowed_from_carry = min(ATP Excess Interest Carry-forward N-1 ; Headroom)
Disallowed_N = Disallowed_Before_Carry − Allowed_from_carry
- Update variables
ΔPBT_Thin-Cap = − Disallowed_N
ATP Disallowed Interest N = Disallowed_N
ATP Excess Interest Carry-forward N = Disallowed_N
(drops FIFO after ‘‘carry-forward period’’)- Replace
ATP_PBT
downstream with:New_ATP_PBT = ATP PBT + ΔPBT_Thin-Cap + ΔPBT_WHT (paid + due)
Interaction with other modules
- TP convergence – uses after TP Ajustment interest; does NOT trigger another TP loop.
- Withholding-tax – unchanged (WHT on gross interest).
- Tax-loss computation – starts from
New_ATP_PBT
. - Optimiser – may vary Debt/Equity Ratio or other Fixed Ratio, interest rate or Group-Ratio election. ΔPBT_Thin-Cap feeds into the objective function.
Example – Fixed-ratio cap that creates a disallowance
Data
Role | Label | Value |
---|---|---|
Matching | ATP Declaring Entity segmentation | ("Entity"; "FR001") |
Financials | ATP Debt – Related-party | (15 000 000; EUR) |
Financials | ATP Debt – Third-party | (10 000 000; EUR) |
Financials | ATP Equity – Thin-Cap | (8 000 000; EUR) |
Financials | ATP Net Interest Expense | (4 000 000; EUR) |
Financials | ATP EBITDA | (10 000 000; EUR) |
Financials | ATP Excess Interest Carry-forward N-1 | (0; EUR) |
Rules
Role | Label | Value |
---|---|---|
Thin-Cap | ATP Thin-Cap in scope | True |
Thin-Cap | ATP Thin-Cap rule type | Fixed-Ratio |
Thin-Cap | ATP Fixed-Ratio numerator | NetInterestExpense |
Thin-Cap | ATP Fixed-Ratio denominator | EBITDA |
Thin-Cap | ATP Fixed-Ratio threshold | 0.30 |
Thin-Cap | ATP De-minimis interest threshold | (500 000; EUR) |
Thin-Cap | ATP Group-Ratio election | False |
Thin-Cap | ATP Excess-Interest carry-forward period | 5 |
Thin-Cap computation
- Step 1 – Pre-checks
ATP Thin-Cap in scope = TRUE so continue with the following steps
- Step 2 – De-minimis
ATP Net Interest Expense = €4 000 000 ATP De-minimis interest threshold = €500 000 NI = max(0 ; ATP Net Interest Expense − ATP De-minimis interest threshold) = €3 500 000
- Step 3 – Fixed-ratio cap
Cap = 0.30 × EBITDA = €3 000 000 AIC_final = min(NI , Cap) = €3 000 000
- Step 4 – Disallowance before carry-forward
Disallowed_Before_Carry = NI − AIC = €500 000
- Step 5 – Utilise carry-forward
Prior bucket = €0 ⇒ Allowed_from_carry = €0 Disallowed_N = €500 000
- Step 6 – Outputs
ATP Disallowed Interest N = €500 000 ATP Excess Interest Carry-forward N = €500 000 ΔPBT_Thin-Cap = –€500 000 New_ATP_PBT = ATP PBT – €500 000 + ΔPBT_WHT