Step-Acquisition & Disposal Accounting
How Konsolidat handles changes in ownership during the consolidation period: step acquisitions (P&L proration, goodwill, fair-value uplift), disposals / deconsolidation (gain/loss and CTA recycling), and the non-controlling interest (NCI) movement schedule.
Three gold models implement this, all reading temporal ownership data from the
epm_staging.ownership_periods source and posting into the consolidated output
via gold_fully_consolidated_tb:
| Model | Purpose | PRD |
|---|---|---|
gold_acquisition_adjustments | P&L proration + goodwill + fair-value uplift on acquisition | PRD-11 |
gold_disposal_adjustments | Disposal gain/loss + CTA recycling to P&L | PRD-12 |
gold_nci_movement_schedule | NCI opening/closing reconciliation per entity/period | PRD-13 |
The CTA-recycling and acquisition-accounting items that earlier design notes
(cta-calculation.md, minority-interest.md) marked Out of Scope are now
implemented here.
Shared inputs
ownership_periods source
epm_staging.ownership_periods (described in _staging__sources.yml as
"Temporal ownership periods with acquisition and disposal fields") supplies the
columns these models read:
| Column | Used by | Meaning |
|---|---|---|
consolidation_group, data_area_id | all | Group + legal entity key |
ownership_pct | acquisition, disposal | Group ownership percentage (0–100) |
consolidation_method | acquisition | e.g. full |
acquisition_date | acquisition | Acquisition / step-acquisition date |
is_first_acquisition | acquisition | Flags the initial acquisition (goodwill/FVA trigger) |
acquisition_price | acquisition | Consideration paid |
fair_value_adjustment | acquisition | Fair-value uplift on net assets |
is_disposal, disposal_date, disposal_price | disposal | Disposal trigger, date, proceeds |
Acquisition rows are recognised only where acquisition_date > '1900-01-01';
disposal rows only where is_disposal = 1 and disposal_date < '9999-12-31'.
Those sentinel dates are the "no constraint" markers used throughout (see the
proration macro below).
Net-asset and P&L base
Both acquisition and disposal models derive the entity's balances from
gold_consolidated_trial_balance (CTB), using its is_balance_sheet and
is_pnl flags and the local_amount column. Net assets are
sum(local_amount where is_balance_sheet = 1) per consolidation_group /
data_area_id.
Step-acquisition adjustments
Source: gold_acquisition_adjustments.sql. Output grain is one adjustment row
per group / entity / period, with columns main_account, account_name,
adjustment_type, adjustment_amount, acquisition_date. It produces three
adjustment_type values, unioned together.
1. P&L proration (pnl_proration)
Only post-acquisition P&L should enter the group result in the year of
acquisition. The model joins CTB P&L rows (is_pnl = 1) to the acquisition
period for the acquisition year (period dates between Jan 1 and Dec 31 of the
acquisition year, built with build_date_from_year_period) and prorates each
amount with the prorate_period_amount macro.
The macro (macros/prorate_period_amount.sql) returns a fraction
days_post_acquisition / days_in_period:
-- prorate_period_amount(amount, acq_date, year, period)
when acq_date <= '1900-01-01' then 1.0 -- no constraint
when acq_date < start_of_period then 1.0 -- acquired earlier
when acq_date >= start_of_next_period then 0.0 -- pre-acquisition month
else dateDiff('day', acq_date, next_period_start)
/ dateDiff('day', period_start, next_period_start) -- partial month
The proration entry removes the pre-acquisition slice rather than the prorated remainder:
pre_acquisition_excluded = local_amount - prorated_amount
adjustment_amount = -pre_acquisition_excluded
adjustment_type = 'pnl_proration'
Rows are emitted only where abs(pre_acquisition_excluded) > 0.01, so fully
post-acquisition periods produce no entry. The negative adjustment cancels the
months the group did not yet own the entity.
2. Goodwill (goodwill / goodwill_entries)
Goodwill is computed once per acquisition, gated on
is_first_acquisition = 1 AND acquisition_price > 0:
goodwill_amount = acquisition_price - (net_assets × ownership_pct / 100)
where net_assets is the CTB balance-sheet total for the entity. The entry is
posted to account 1800 "Goodwill on acquisition", dated to the
acquisition month (toYear/toMonth of acquisition_date), with
adjustment_type = 'goodwill'. Only material amounts (abs > 0.01) are kept.
3. Fair-value adjustment (fva_entries)
The fair_value_adjustment carried on the ownership period is posted directly to
account 1900 "Fair value adjustment on acquisition", dated to the
acquisition month, with adjustment_type = 'fair_value_adjustment'. Kept only
where abs > 0.01.
The model performs no explicit FX retranslation: goodwill and fair-value uplift
are taken from acquisition_price / fair_value_adjustment and from CTB net
assets as already carried in the consolidated trial balance. There is no
separate historical/acquisition-date rate lookup in this model — translation is
handled upstream in gold_fx_revaluation / CTB, and the acquisition-date
timing is applied through period dating and proration rather than a rate
re-fetch.
Disposal & deconsolidation
Source: gold_disposal_adjustments.sql. Output grain matches the acquisition
model's downstream shape — group / entity / period with a gain_loss_amount and
an adjustment_type. Two adjustment_type values are unioned.
1. Disposal gain/loss (disposal_gain_loss)
For each disposal period, net assets at the disposal date come from CTB
(is_balance_sheet = 1), and remaining goodwill is read back from this group's
own acquisition output:
-- remaining_goodwill
sum(adjustment_amount) from gold_acquisition_adjustments
where adjustment_type = 'goodwill'
The gain/loss is:
gain_loss_amount = disposal_price
- (net_assets × ownership_pct / 100)
- remaining_goodwill
Dated to the disposal month (toYear/toMonth of disposal_date),
adjustment_type = 'disposal_gain_loss', emitted only where
abs(gain_loss_amount) > 0.01.
2. CTA recycling (cta_recycling)
On loss of control the accumulated currency translation adjustment is
reclassified from equity to P&L (IAS 21.48). The model sums cta_amount from
gold_fx_revaluation for the disposed entity and reverses its sign:
gain_loss_amount = -sum(fx.cta_amount)
adjustment_type = 'cta_recycling'
disposal_price, net_assets, and remaining_goodwill are set to 0 on these
rows (they carry only the recycled CTA). Dated to the disposal month, emitted
where abs(gain_loss_amount) > 0.01.
NCI movement schedule
Source: gold_nci_movement_schedule.sql. This is a reporting/reconciliation
model — it is not unioned into the consolidated TB. It builds a per-entity,
per-period NCI roll-forward in the spirit of
opening → share_of_profit → OCI → dividends → acquisition → disposal → closing.
Scope
Only entities that are partially owned and fully consolidated qualify
(consolidation_groups seed: ownership_pct < 100 AND consolidation_method = 'full'). The model derives:
ownership_pct = ownership_pct / 100
nci_pct = 1 - ownership_pct / 100
Movements
| CTE | Source | Output |
|---|---|---|
nci_profit | CTB is_pnl = 1, sum(nci_amount) | share_of_profit per period |
nci_bs_balance | CTB is_balance_sheet = 1, sum(nci_amount) | nci_closing_balance per period |
Periods are the union (union distinct) of periods appearing in either P&L or
balance-sheet NCI, joined back to the qualifying entities. Output columns:
consolidation_group, data_area_id, entity_name, fiscal_year,
fiscal_period, nci_pct, nci_closing_balance, share_of_profit,
consolidation_method. Rows with a null fiscal_year are dropped.
The header comment references full vs partial goodwill methods and additional
movement lines (OCI, dividends, acquisition, disposal). The current
implementation populates share_of_profit and nci_closing_balance from the
consolidated TB nci_amount; the other movement lines are not yet computed as
separate columns.
How they post into consolidation
gold_acquisition_adjustments and gold_disposal_adjustments are folded into
gold_fully_consolidated_tb as Layer 6 ("Acquisition & disposal
adjustments"), unioned alongside entity balances, IC eliminations, CTA, top-side
adjustments, and equity-method entries:
| Source model | amount mapped from | main_account | journal_id |
|---|---|---|---|
gold_acquisition_adjustments | adjustment_amount | passthrough (1800/1900/proration account) | ACQ_<data_area_id> |
gold_disposal_adjustments | gain_loss_amount | DISPOSAL | DSP_<data_area_id> |
Both carry their adjustment_type forward, so the fully consolidated TB can
distinguish pnl_proration, goodwill, fair_value_adjustment,
disposal_gain_loss, and cta_recycling rows. The NCI movement schedule is a
standalone reporting model and does not feed the consolidated TB.
Source files
dbt_project/models/gold/gold_acquisition_adjustments.sqldbt_project/models/gold/gold_disposal_adjustments.sqldbt_project/models/gold/gold_nci_movement_schedule.sqldbt_project/models/gold/gold_fully_consolidated_tb.sql(Layer 6 integration)dbt_project/macros/prorate_period_amount.sql,dbt_project/macros/db_adapter.sql(build_date_from_year_period)dbt_project/models/staging/_staging__sources.yml(ownership_periods),dbt_project/seeds/consolidation_groups.csv