Public-safe technical companion to the portfolio finance case study.
This repository demonstrates how a multi-entity management reporting problem should be approached — using completely synthetic data — from operating-company facts through a dimensional model and finance semantic layer to Power BI views for P&L, Actual vs Budget / Forecast / Prior Year, MTD / YTD, and like-for-like (LFL) comparisons.
It is evidence for modelling, DAX, reconciliation and data-governance thinking (aligned with PL-300, DP-600, FMVA and DAMA concepts). It is not a recreation of any employer system.
Disclosure: All companies, figures and structures here are synthetic. This does not represent discoverIE (or any employer) data, systems or internal architecture.
Group finance needs comparable management reporting across operating companies:
- Actual vs Budget (and Forecast)
- Period views: MTD, YTD, Prior Year, LFL
- Entity and account drill-down without each team maintaining private spreadsheet logic
When definitions live in spreadsheets, variance explanations become slow, reconciliation weakens, and executives struggle to trust the pack. The goal is a single controlled analytical product: shared dimensions, explicit P&L logic, and checks that make the numbers reviewable.
See docs/business-context.md and docs/requirements.md.
A small holding-style group with three operating companies (OpCos), one reporting currency (GBP), and a shared chart of accounts suitable for management P&L:
| Entity ID | Name | Region |
|---|---|---|
| OPCO_A | North Ops | North |
| OPCO_B | Central Ops | Central |
| OPCO_C | South Ops | South |
Scenarios in the fact grain: Actual, Budget, Forecast.
Periods: monthly from Jan 2025 through Jun 2026 (extendable).
Account families: Product / Service revenue, Cost of sales, SG&A, R&D — rolled into Revenue, COGS, Gross profit, OpEx and Operating profit.
Details: docs/business-context.md. Dataset: data/synthetic/.
Minimum reporting outcomes the model must support:
- Management P&L by entity and at group
- Actual vs Budget and Actual vs Forecast variance (£ and %)
- Group and OpCo operating-profit trend by period
- Budget → Actual operating-profit variance bridge
- MTD / YTD / Prior Year / LFL period comparisons on shared definitions
- Traceability from visual → measure → fact → dimension
Requirements and KPI definitions: docs/requirements.md, docs/kpi-dictionary.md, docs/finance-logic.md.
Star-style dimensional design:
Synthetic OpCo facts
↓
Dimensional model
(Entity · Account · Period · Scenario)
↓
Finance semantic model
(P&L · Variance · MTD/YTD/LFL)
↓
Power BI
- Fact:
fact_finance— amount by entity, account, period, scenario (GBP) - Dimensions: entity, account, calendar/period, scenario
- Semantic layer: measures for P&L lines and comparisons (documented DAX)
See model/dimensional-model.md and model/architecture.svg.
Trust is designed in, not added as a dashboard footnote:
- Shared metric definitions (KPI dictionary)
- Single currency and labelled scenarios
- Explicit sign / roll-up rules for P&L
- Reconciliation checks (fact totals ↔ P&L lines ↔ group vs OpCo sum)
- Synthetic watermark / disclosure on public evidence
- Documented lineage: CSV → measures → report views
See docs/reconciliation-controls.md.
Native Power BI Project: powerbi/Finance_Analysis.pbip
| Page | Content |
|---|---|
| 01 Management Overview | KPI strip (Revenue, GP, OP, vs Budget, vs PY) + trend |
| 02 Group Trend | Actual vs Budget vs Forecast |
| 03 OpCo Variance | OpCo bars + Budget → Actual bridge |
Measure catalogue: powerbi/dax-measures.md
SOTA audits: docs/audits/
Portable refresh: docs/portable-refresh.md
Native page stills: powerbi/screenshots/native/
Portfolio narrative: bmborne.github.io — finance case.
This is a reference implementation, not a production finance platform:
- Synthetic data only; no ERP connectors or live consolidation
- Single currency (no FX translation or intercompany eliminations yet)
- Simplified chart of accounts
- Native PBIP is source-controlled in this repository. Fabric deployment, production RLS and deployment pipelines are intentionally out of scope for v1
- Fabric / lakehouse path is a related portfolio topic, not required for this repo’s core story
Full list: docs/limitations.md.
multi-entity-finance-analytics/
├── README.md ← you are here
├── LICENSE
├── data/
│ ├── synthetic/ ← public-safe OpCo facts & dimensions
│ └── processed/ ← derived outputs (local / CI)
├── docs/ ← business problem → controls → limits
├── model/ ← dimensional design + architecture
├── powerbi/ ← PBIP + TMDL + PBIR + screenshots
├── sql/ ← optional star-schema DDL / checks
├── python/ ← synthetic data generation & validation
└── tests/ ← reconciliation / schema tests
python -m venv .venv
# Windows: .venv\Scripts\activate
# Unix: source .venv/bin/activate
pip install -r python/requirements.txt
python python/generate_synthetic_finance.py
python python/generate_report_stills.py
pytest tests/ -q| Artefact | Location |
|---|---|
| Portfolio case study | https://bmborne.github.io/work/finance-reporting.html |
| Synthetic CSVs | data/synthetic/ |
| KPI dictionary | docs/kpi-dictionary.md |
| Dimensional model | model/dimensional-model.md |
| DAX measures | powerbi/dax-measures.md |
| Report stills | powerbi/screenshots/native/ |
| Portable refresh | docs/portable-refresh.md |
Boniphace Mkindi — Data & Analytics Engineer
Portfolio: bmborne.github.io