Skip to main content

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:

ModelPurposePRD
gold_acquisition_adjustmentsP&L proration + goodwill + fair-value uplift on acquisitionPRD-11
gold_disposal_adjustmentsDisposal gain/loss + CTA recycling to P&LPRD-12
gold_nci_movement_scheduleNCI opening/closing reconciliation per entity/periodPRD-13
note

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:

ColumnUsed byMeaning
consolidation_group, data_area_idallGroup + legal entity key
ownership_pctacquisition, disposalGroup ownership percentage (0–100)
consolidation_methodacquisitione.g. full
acquisition_dateacquisitionAcquisition / step-acquisition date
is_first_acquisitionacquisitionFlags the initial acquisition (goodwill/FVA trigger)
acquisition_priceacquisitionConsideration paid
fair_value_adjustmentacquisitionFair-value uplift on net assets
is_disposal, disposal_date, disposal_pricedisposalDisposal 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.

Acquisition-date (IAS 21) rate handling

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

CTESourceOutput
nci_profitCTB is_pnl = 1, sum(nci_amount)share_of_profit per period
nci_bs_balanceCTB 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.

note

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 modelamount mapped frommain_accountjournal_id
gold_acquisition_adjustmentsadjustment_amountpassthrough (1800/1900/proration account)ACQ_<data_area_id>
gold_disposal_adjustmentsgain_loss_amountDISPOSALDSP_<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.sql
  • dbt_project/models/gold/gold_disposal_adjustments.sql
  • dbt_project/models/gold/gold_nci_movement_schedule.sql
  • dbt_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