diff --git a/chronicle/bundle.py b/chronicle/bundle.py index 8f0969db..649eebec 100644 --- a/chronicle/bundle.py +++ b/chronicle/bundle.py @@ -106,6 +106,7 @@ "dwp-uc-two-child-limit-2025", "hmrc-cgt-age-2026", "hmrc-cgt-asset-type-2026", + "hmrc-cgt-badr-ir-2026", "hmrc-cgt-carried-interest-2026", "hmrc-cgt-country-region-2026", "hmrc-cgt-gain-by-income-2026", diff --git a/chronicle/source_package.py b/chronicle/source_package.py index 21d894a8..f411de37 100644 --- a/chronicle/source_package.py +++ b/chronicle/source_package.py @@ -101,6 +101,7 @@ ), "hmrc-cgt-age-2026": Path("hmrc/cgt_age_2026"), "hmrc-cgt-asset-type-2026": Path("hmrc/cgt_asset_type_2026"), + "hmrc-cgt-badr-ir-2026": Path("hmrc/cgt_badr_ir_2026"), "hmrc-cgt-carried-interest-2026": Path("hmrc/cgt_carried_interest_2026"), "hmrc-cgt-country-region-2026": Path("hmrc/cgt_country_region_2026"), "hmrc-cgt-gain-by-income-2026": Path("hmrc/cgt_gain_by_income_2026"), diff --git a/db/data/hmrc/cgt_badr_ir_2026/Table_4_2026_Business_asset_disposal_and_investors_reliefs.ods b/db/data/hmrc/cgt_badr_ir_2026/Table_4_2026_Business_asset_disposal_and_investors_reliefs.ods new file mode 100644 index 00000000..397653de Binary files /dev/null and b/db/data/hmrc/cgt_badr_ir_2026/Table_4_2026_Business_asset_disposal_and_investors_reliefs.ods differ diff --git a/db/data/hmrc/cgt_badr_ir_2026/manifest.yaml b/db/data/hmrc/cgt_badr_ir_2026/manifest.yaml new file mode 100644 index 00000000..ca979452 --- /dev/null +++ b/db/data/hmrc/cgt_badr_ir_2026/manifest.yaml @@ -0,0 +1,18 @@ +source_id: hmrc +package_id: hmrc-cgt-badr-ir-2026 +dataset: hmrc_hmrc-cgt-badr-ir-2026 +source_page: https://www.gov.uk/government/statistics/capital-gains-tax-statistics +table: 'Capital Gains Tax statistics Table 4: BADR and Investors'' Relief by size of qualifying gain' +files: + 2026: + filename: Table_4_2026_Business_asset_disposal_and_investors_reliefs.ods + source_url: https://assets.publishing.service.gov.uk/media/6a7b242a347b198efd290ed7/Table_4_2026_Business_asset_disposal_and_investors_reliefs.ods + sha256: 7bd0098913e44e3c79a533690cd25ee08f627cd72935c46a874a7eab5442d5ca + size_bytes: 6559 + fetched_at: '2026-09-24T15:44:57.841104+00:00' + storage: + r2: + provider: r2 + bucket: ledger-raw + key: raw/uk/hmrc/hmrc-cgt-badr-ir-2026/2026/7bd0098913e44e3c79a533690cd25ee08f627cd72935c46a874a7eab5442d5ca/Table_4_2026_Business_asset_disposal_and_investors_reliefs.ods + uri: r2://ledger-raw/raw/uk/hmrc/hmrc-cgt-badr-ir-2026/2026/7bd0098913e44e3c79a533690cd25ee08f627cd72935c46a874a7eab5442d5ca/Table_4_2026_Business_asset_disposal_and_investors_reliefs.ods diff --git a/docs/pe-uk-source-checklist.md b/docs/pe-uk-source-checklist.md index dd280b51..b8675fb8 100644 --- a/docs/pe-uk-source-checklist.md +++ b/docs/pe-uk-source-checklist.md @@ -52,7 +52,7 @@ cannot be obtained. Nothing in uk-data is absent from this table. | ONS savings interest ([`ons_savings.py`](https://github.com/PolicyEngine/policyengine-uk-data/blob/ebf733c/policyengine_uk_data/targets/sources/ons_savings.py)) | 1 `ons/savings_interest_income` | **ported** | `ons-savings-interest-income` (8 facts, 2018–2025) | [#139](https://github.com/PolicyEngine/chronicle/pull/139) | **Same series, pinned snapshot.** Both read the [HAXV/UKEA series](https://www.ons.gov.uk/economy/grossdomesticproductgdp/timeseries/haxv/ukea); uk-data downloads at runtime and flat-fills the last actual through 2029 (**excluded, computed**); Chronicle pins the 2026-06-30 CSV release bytes. | | Household types ([`ons_households.py`](https://github.com/PolicyEngine/policyengine-uk-data/blob/ebf733c/policyengine_uk_data/targets/sources/ons_households.py)) | household-type counts | **ported** | `ons-families-households-2025` (816 facts: Table 7 households by type, Table 5 household size, and, from [#235](https://github.com/PolicyEngine/chronicle/issues/235), Tables 1 and 3 families by family type and presence of children / number of dependent children with the published CI± half-widths and CV-category guards, UK, 2018–2025); `ons-households-by-type-country-2025` (1 fact, Scotland 2025 couple households with 3+ dependent children) | [#139](https://github.com/PolicyEngine/chronicle/pull/139), [#196](https://github.com/PolicyEngine/chronicle/issues/196) | **Same UK artifact plus country worksheet add-on.** The UK row uses `familiesandhouseholdsuk2025.xlsx` from [Families and households](https://www.ons.gov.uk/peoplepopulationandcommunity/birthsdeathsandmarriages/families/datasets/familiesandhouseholdsfamiliesandhouseholds). The #196 add-on pins [Households by type of household and family, regions and GB constituent countries](https://www.ons.gov.uk/peoplepopulationandcommunity/birthsdeathsandmarriages/families/datasets/householdsbytypeofhouseholdandfamilyregionsofenglandandgbconstituentcountries) and ports Scotland worksheet cell `B21`: 57 thousand couple households with 3+ dependent children in 2025 (`survey_aggregate`, LFS). | | Salary-sacrifice relief ([`hmrc_salary_sacrifice.py`](https://github.com/PolicyEngine/policyengine-uk-data/blob/ebf733c/policyengine_uk_data/targets/sources/hmrc_salary_sacrifice.py)) | 3 `hmrc/salary_sacrifice_*`; #196 gross contribution base | **ported; contribution base has no publisher measure** | `hmrc-salary-sacrifice-relief-2024` (6 facts, TY2024-25) | [#139](https://github.com/PolicyEngine/chronicle/pull/139), [#196](https://github.com/PolicyEngine/chronicle/issues/196) | **Updated — uk-data's asset is dead.** uk-data pins `media/687a294e…/Tables_6_1_and_6_2.csv`, which now returns `{"status":"gone"}` (its runtime download silently drops the targets). Chronicle packages the current asset from [Private pension statistics](https://www.gov.uk/government/statistics/personal-and-stakeholder-pensions-statistics) (updated 2026-07-30). uk-data's ×1.03 growth uprating and #196's £24.72bn salary-sacrifice contribution base are **excluded (computed / no publisher measure)**; the current HMRC table prints relief values, not gross contributions. | -| CGT ([`hmrc_cgt.py`](https://github.com/PolicyEngine/policyengine-uk-data/blob/ebf733c/policyengine_uk_data/targets/sources/hmrc_cgt.py)) | CGT totals and distributions by gain, income, region, age, asset type, holding period, residential reporting channel, and carried interest | **ported** | `hmrc-cgt-statistics-2026` (342 facts); `hmrc-cgt-size-of-gain-2026` (51); `hmrc-cgt-gain-by-income-2026` (290); `hmrc-cgt-country-region-2026` (84); `hmrc-cgt-age-2026` (60); `hmrc-cgt-asset-type-2026` (171); `hmrc-cgt-residential-property-2026` (268); `hmrc-cgt-carried-interest-2026` (68) | [#139](https://github.com/PolicyEngine/chronicle/pull/139), [#196](https://github.com/PolicyEngine/chronicle/issues/196), [#202](https://github.com/PolicyEngine/chronicle/pull/202), [#272](https://github.com/PolicyEngine/chronicle/issues/272) | **Updated to the 2026 release across Tables 1–3 and 5–9.** Table 7 records sample-based TY2023-24 disposal counts, proceeds, and gains for financial and non-financial asset types and published holding-period bands. Table 8 records TY2023-24 through TY2025-26 residential-property taxpayers, returns, disposals, gains, and tax by reporting channel, taxpayer type, and tax month; each named month covers the 6th through the 5th. Table 9 records carried-interest taxpayers, gains, and tax for TY2023-24 and TY2024-25, plus the TY2024-25 gain-size and age distributions. Chronicle preserves `[Unavailable]` and `[Less than 1]` cells without emitting numeric facts. Repeated publisher margins retain distinct table lineage and equal values. HMRC replaces attachment URLs in place, so each manifest pins the 2026 bytes and checksum. Target selection, asset imputation, and calibration remain Microcosm-owned. | +| CGT ([`hmrc_cgt.py`](https://github.com/PolicyEngine/policyengine-uk-data/blob/ebf733c/policyengine_uk_data/targets/sources/hmrc_cgt.py)) | CGT totals and distributions by gain, income, region, age, asset type, holding period, residential reporting channel, carried interest, and BADR/Investors’ Relief | **ported** | `hmrc-cgt-statistics-2026` (342 facts); `hmrc-cgt-size-of-gain-2026` (51); `hmrc-cgt-gain-by-income-2026` (290); `hmrc-cgt-country-region-2026` (84); `hmrc-cgt-age-2026` (60); `hmrc-cgt-asset-type-2026` (171); `hmrc-cgt-residential-property-2026` (268); `hmrc-cgt-carried-interest-2026` (68); `hmrc-cgt-badr-ir-2026` (126) | [#139](https://github.com/PolicyEngine/chronicle/pull/139), [#196](https://github.com/PolicyEngine/chronicle/issues/196), [#202](https://github.com/PolicyEngine/chronicle/pull/202), [#272](https://github.com/PolicyEngine/chronicle/issues/272), [#287](https://github.com/PolicyEngine/chronicle/issues/287) | **Updated to the 2026 release across Tables 1–9.** Table 7 records sample-based TY2023-24 disposal counts, proceeds, and gains for financial and non-financial asset types and published holding-period bands. Table 8 records TY2023-24 through TY2025-26 residential-property taxpayers, returns, disposals, gains, and tax by reporting channel, taxpayer type, and tax month; each named month covers the 6th through the 5th. Table 9 records carried-interest taxpayers, gains, and tax for TY2023-24 and TY2024-25, plus the TY2024-25 gain-size and age distributions. Table 4 records BADR/Investors’ Relief taxpayers, qualifying gains, and tax by qualifying-gain band for TY2021-22 through TY2024-25; the distinct concepts separate these relief claims from all CGT. Chronicle preserves `[Unavailable]`, `[Less than 1]`, and `[Fewer than 1]` cells without emitting numeric facts. Repeated publisher margins retain distinct table lineage and equal values. HMRC replaces attachment URLs in place, so each manifest pins the 2026 bytes and checksum. Target selection, asset imputation, and calibration remain Microcosm-owned. | | SPI income bands ([`hmrc_spi.py`](https://github.com/PolicyEngine/policyengine-uk-data/blob/ebf733c/policyengine_uk_data/targets/sources/hmrc_spi.py)) | 4 `hmrc/spi_*` | **ported** | `hmrc-spi-income-bands-2023` (182 facts, Tables 3.6/3.7, TY2023-24) | [#139](https://github.com/PolicyEngine/chronicle/pull/139) | **Re-pinned.** uk-data's docstring cites the summarised-accounts page; Chronicle pins the [SPI collated tables ODS](https://www.gov.uk/government/statistics/personal-incomes-statistics-for-the-tax-year-2023-to-2024) that actually carries the 13 bands × 7 income types — the same artifact populace's national HMRC stage parses (single-homing candidate). The ×1.9 property-income scale and uprated projections are **excluded (computed)**. | | Benefit cap ([`dwp.py`](https://github.com/PolicyEngine/policyengine-uk-data/blob/ebf733c/policyengine_uk_data/targets/sources/dwp.py)) | `dwp/benefit_capped_households`; #196 total reduction | **ported; total reduction excluded (computed)** | `dwp-benefit-cap-november-2025` (15 facts, Table 4, Nov-2025) | [#139](https://github.com/PolicyEngine/chronicle/pull/139), [#196](https://github.com/PolicyEngine/chronicle/issues/196) | **Same publication, from bytes.** uk-data hand-transcribes 110,637 from the [Nov-2025 publication](https://www.gov.uk/government/statistics/benefit-cap-number-of-households-capped-to-november-2025) HTML; Chronicle parses the ODS (110,637 is the GB Total row) plus the 13 amount-capped bands. uk-data's £320.9m annualized reduction is **not** a publisher row and remains **excluded (computed)** — a midpoint-by-band annualization Microcosm/populace can re-declare over the ported band distribution. | | Two-child limit ([`dwp.py`](https://github.com/PolicyEngine/policyengine-uk-data/blob/ebf733c/policyengine_uk_data/targets/sources/dwp.py)) | 11 `dwp/uc/two_child_limit/*` | **ported** | `dwp-uc-two-child-limit-2025` (92 facts, tables 01/03A/03B/04A/04B, Apr-2025) | [#139](https://github.com/PolicyEngine/chronicle/pull/139) | **Same publication, from bytes.** uk-data hand-transcribes from the [April-2025 publication](https://www.gov.uk/government/statistics/universal-credit-claimants-statistics-on-the-two-child-limit-policy-april-2025) HTML; Chronicle parses the ODS data tables, adding the exception-granted rows uk-data skips. uk-data's `{2026: …}` timing on Apr-2025 values is a populace-side declaration. | diff --git a/packages/hmrc/cgt_badr_ir_2026/source_package.yaml b/packages/hmrc/cgt_badr_ir_2026/source_package.yaml new file mode 100644 index 00000000..b0bbba1b --- /dev/null +++ b/packages/hmrc/cgt_badr_ir_2026/source_package.yaml @@ -0,0 +1,2217 @@ +schema_version: ledger.source_package.v1 +package_id: hmrc-cgt-badr-ir-2026 +label: 'HMRC Capital Gains Tax statistics 2026, Table 4: BADR and Investors'' Relief by qualifying gain, + 2021-22 to 2024-25' +dimension_labels: + cgt_badr_ir_gain_band: BADR/IR qualifying gain band + taxpayer_type: Taxpayer type +dimension_value_labels: + cgt_badr_ir_gain_band: + gain_0_to_9999: GBP 0 to GBP 9,999 + gain_10000_to_24999: GBP 10,000 to GBP 24,999 + gain_25000_to_49999: GBP 25,000 to GBP 49,999 + gain_50000_to_99999: GBP 50,000 to GBP 99,999 + gain_100000_to_249999: GBP 100,000 to GBP 249,999 + gain_250000_to_499999: GBP 250,000 to GBP 499,999 + gain_500000_to_999999: GBP 500,000 to GBP 999,999 + gain_1000000_plus: GBP 1,000,000 and over + total: Total + taxpayer_type: + individuals: Individuals + trusts: Trusts + all: All +artifact: + source_name: hmrc + source_table: 'Capital Gains Tax statistics Table 4: BADR and Investors'' Relief by size of qualifying + gain' + resource_package: db + resource_directory: data/hmrc/cgt_badr_ir_2026 + manifest: manifest.yaml + vintage: cgt_statistics_2026 + extracted_at: '2026-09-24' + extraction_method: ODS whole-workbook used-range parse with numeric-text coercion + parser: ods_numeric_text_used_range + artifact_year: 2026 +record_sets: +# Each worksheet is split into complementary regions only where HMRC suppresses +# a measure. Guard cells retain the suppressed text without creating a fact. +- record_set_id: hmrc.cgt_badr_ir_2026.table4_4.ty2021.first_band + provenance_class: administrative + assertion: observation + record_set_spec_id: hmrc.cgt_badr_ir_2026.table4_4.ty2021.first_band.v1 + source_record_id_prefix: hmrc.cgt_badr_ir_2026.table4_4.ty2021 + sheet_name: 4_4_2021-22 + period_type: tax_year + period: 2021 + period_coverage: + basis: tax + source_period_label: 2021 to 2022 tax year + start_date: '2021-04-06' + end_date: '2022-04-05' + notes: HMRC updates provisional figures for late and amended returns. + geography_id: K02000001 + geography_level: country + geography_name: United Kingdom + geography_vintage: current + entity: person + entity_role: taxpayer + domain: capital_gains_tax + groupby_dimension: cgt_badr_ir_gain_band + rows: + - value_id: gain_0_to_9999 + label: GBP 0 to GBP 9,999 + ordinal: 0 + row_number: 7 + expected_row_header_column: A + expected_row_header: Individuals (0) + table_record_kind: detail + filters: + cgt_badr_ir_gain_band: gain_0_to_9999 + taxpayer_type: individuals + constraints: + - variable: cgt_badr_ir_gain_band + operator: == + value: gain_0_to_9999 + label: BADR/IR qualifying gain band + - variable: taxpayer_type + operator: == + value: individuals + label: Taxpayer type + - variable: cgt_badr_ir_qualifying_gain + operator: '>=' + value: 0 + unit: gbp + label: Qualifying gain lower bound + - variable: cgt_badr_ir_qualifying_gain + operator: < + value: 10000 + unit: gbp + label: Qualifying gain upper bound + guard_cells: + - column: D + expected_value: '[Less than 1]' + label: Publisher-suppressed value retained without a numeric fact + measures: + - measure_id: taxpayers + label: BADR/IR liable taxpayers + ordinal: 0 + column: B + source_column_id: taxpayers + expected_column_header_row: 6 + expected_column_header: Number of BADR/IR liable taxpayers + concept: hmrc.cgt_badr_ir_taxpayers + source_concept: hmrc.cgt_badr_ir_taxpayers + concept_relation: source_label + concept_authority: hmrc + concept_evidence_url: https://www.gov.uk/government/statistics/capital-gains-tax-statistics + concept_evidence_notes: HMRC Capital Gains Tax statistics 2026, Table 4. Gains are before deducting + losses and the Annual Exempt Amount. Counts are thousands; gains and tax are GBP millions. Totals + may not sum due to rounding. Provisional figures are updated for late and amended returns. + unit: count + aggregation: sum + expected_cell_type: number + value_scale: 1000 + - measure_id: gains + label: Gains qualifying for BADR or Investors' Relief + ordinal: 1 + column: C + source_column_id: gains + expected_column_header_row: 6 + expected_column_header: Gains on which BADR/IR claimed + concept: hmrc.cgt_badr_ir_qualifying_gains + source_concept: hmrc.cgt_badr_ir_qualifying_gains + concept_relation: source_label + concept_authority: hmrc + concept_evidence_url: https://www.gov.uk/government/statistics/capital-gains-tax-statistics + concept_evidence_notes: HMRC Capital Gains Tax statistics 2026, Table 4. Gains are before deducting + losses and the Annual Exempt Amount. Counts are thousands; gains and tax are GBP millions. Totals + may not sum due to rounding. Provisional figures are updated for late and amended returns. + unit: gbp + aggregation: sum + expected_cell_type: number + value_scale: 1000000 +- record_set_id: hmrc.cgt_badr_ir_2026.table4_4.ty2021.main + provenance_class: administrative + assertion: observation + record_set_spec_id: hmrc.cgt_badr_ir_2026.table4_4.ty2021.main.v1 + source_record_id_prefix: hmrc.cgt_badr_ir_2026.table4_4.ty2021 + sheet_name: 4_4_2021-22 + period_type: tax_year + period: 2021 + period_coverage: + basis: tax + source_period_label: 2021 to 2022 tax year + start_date: '2021-04-06' + end_date: '2022-04-05' + notes: HMRC updates provisional figures for late and amended returns. + geography_id: K02000001 + geography_level: country + geography_name: United Kingdom + geography_vintage: current + entity: person + entity_role: taxpayer + domain: capital_gains_tax + groupby_dimension: cgt_badr_ir_gain_band + rows: + - value_id: gain_10000_to_24999 + label: GBP 10,000 to GBP 24,999 + ordinal: 1 + row_number: 8 + expected_row_header_column: A + expected_row_header: Individuals (10,000) + table_record_kind: detail + filters: + cgt_badr_ir_gain_band: gain_10000_to_24999 + taxpayer_type: individuals + constraints: + - variable: cgt_badr_ir_gain_band + operator: == + value: gain_10000_to_24999 + label: BADR/IR qualifying gain band + - variable: taxpayer_type + operator: == + value: individuals + label: Taxpayer type + - variable: cgt_badr_ir_qualifying_gain + operator: '>=' + value: 10000 + unit: gbp + label: Qualifying gain lower bound + - variable: cgt_badr_ir_qualifying_gain + operator: < + value: 25000 + unit: gbp + label: Qualifying gain upper bound + - value_id: gain_25000_to_49999 + label: GBP 25,000 to GBP 49,999 + ordinal: 2 + row_number: 9 + expected_row_header_column: A + expected_row_header: Individuals (25,000) + table_record_kind: detail + filters: + cgt_badr_ir_gain_band: gain_25000_to_49999 + taxpayer_type: individuals + constraints: + - variable: cgt_badr_ir_gain_band + operator: == + value: gain_25000_to_49999 + label: BADR/IR qualifying gain band + - variable: taxpayer_type + operator: == + value: individuals + label: Taxpayer type + - variable: cgt_badr_ir_qualifying_gain + operator: '>=' + value: 25000 + unit: gbp + label: Qualifying gain lower bound + - variable: cgt_badr_ir_qualifying_gain + operator: < + value: 50000 + unit: gbp + label: Qualifying gain upper bound + - value_id: gain_50000_to_99999 + label: GBP 50,000 to GBP 99,999 + ordinal: 3 + row_number: 10 + expected_row_header_column: A + expected_row_header: Individuals (50,000) + table_record_kind: detail + filters: + cgt_badr_ir_gain_band: gain_50000_to_99999 + taxpayer_type: individuals + constraints: + - variable: cgt_badr_ir_gain_band + operator: == + value: gain_50000_to_99999 + label: BADR/IR qualifying gain band + - variable: taxpayer_type + operator: == + value: individuals + label: Taxpayer type + - variable: cgt_badr_ir_qualifying_gain + operator: '>=' + value: 50000 + unit: gbp + label: Qualifying gain lower bound + - variable: cgt_badr_ir_qualifying_gain + operator: < + value: 100000 + unit: gbp + label: Qualifying gain upper bound + - value_id: gain_100000_to_249999 + label: GBP 100,000 to GBP 249,999 + ordinal: 4 + row_number: 11 + expected_row_header_column: A + expected_row_header: Individuals (100,000) + table_record_kind: detail + filters: + cgt_badr_ir_gain_band: gain_100000_to_249999 + taxpayer_type: individuals + constraints: + - variable: cgt_badr_ir_gain_band + operator: == + value: gain_100000_to_249999 + label: BADR/IR qualifying gain band + - variable: taxpayer_type + operator: == + value: individuals + label: Taxpayer type + - variable: cgt_badr_ir_qualifying_gain + operator: '>=' + value: 100000 + unit: gbp + label: Qualifying gain lower bound + - variable: cgt_badr_ir_qualifying_gain + operator: < + value: 250000 + unit: gbp + label: Qualifying gain upper bound + - value_id: gain_250000_to_499999 + label: GBP 250,000 to GBP 499,999 + ordinal: 5 + row_number: 12 + expected_row_header_column: A + expected_row_header: Individuals (250,000) + table_record_kind: detail + filters: + cgt_badr_ir_gain_band: gain_250000_to_499999 + taxpayer_type: individuals + constraints: + - variable: cgt_badr_ir_gain_band + operator: == + value: gain_250000_to_499999 + label: BADR/IR qualifying gain band + - variable: taxpayer_type + operator: == + value: individuals + label: Taxpayer type + - variable: cgt_badr_ir_qualifying_gain + operator: '>=' + value: 250000 + unit: gbp + label: Qualifying gain lower bound + - variable: cgt_badr_ir_qualifying_gain + operator: < + value: 500000 + unit: gbp + label: Qualifying gain upper bound + - value_id: gain_500000_to_999999 + label: GBP 500,000 to GBP 999,999 + ordinal: 6 + row_number: 13 + expected_row_header_column: A + expected_row_header: Individuals (500,000) + table_record_kind: detail + filters: + cgt_badr_ir_gain_band: gain_500000_to_999999 + taxpayer_type: individuals + constraints: + - variable: cgt_badr_ir_gain_band + operator: == + value: gain_500000_to_999999 + label: BADR/IR qualifying gain band + - variable: taxpayer_type + operator: == + value: individuals + label: Taxpayer type + - variable: cgt_badr_ir_qualifying_gain + operator: '>=' + value: 500000 + unit: gbp + label: Qualifying gain lower bound + - variable: cgt_badr_ir_qualifying_gain + operator: < + value: 1000000 + unit: gbp + label: Qualifying gain upper bound + - value_id: gain_1000000_plus + label: GBP 1,000,000 and over + ordinal: 7 + row_number: 14 + expected_row_header_column: A + expected_row_header: Individuals (1,000,000) + table_record_kind: detail + filters: + cgt_badr_ir_gain_band: gain_1000000_plus + taxpayer_type: individuals + constraints: + - variable: cgt_badr_ir_gain_band + operator: == + value: gain_1000000_plus + label: BADR/IR qualifying gain band + - variable: taxpayer_type + operator: == + value: individuals + label: Taxpayer type + - variable: cgt_badr_ir_qualifying_gain + operator: '>=' + value: 1000000 + unit: gbp + label: Qualifying gain lower bound + - value_id: individuals_total + label: Individuals total + ordinal: 8 + row_number: 15 + expected_row_header_column: A + expected_row_header: Individuals (Total) + table_record_kind: total + filters: + cgt_badr_ir_gain_band: total + taxpayer_type: individuals + constraints: + - variable: cgt_badr_ir_gain_band + operator: == + value: total + label: BADR/IR qualifying gain band + - variable: taxpayer_type + operator: == + value: individuals + label: Taxpayer type + measures: + - measure_id: taxpayers + label: BADR/IR liable taxpayers + ordinal: 0 + column: B + source_column_id: taxpayers + expected_column_header_row: 6 + expected_column_header: Number of BADR/IR liable taxpayers + concept: hmrc.cgt_badr_ir_taxpayers + source_concept: hmrc.cgt_badr_ir_taxpayers + concept_relation: source_label + concept_authority: hmrc + concept_evidence_url: https://www.gov.uk/government/statistics/capital-gains-tax-statistics + concept_evidence_notes: HMRC Capital Gains Tax statistics 2026, Table 4. Gains are before deducting + losses and the Annual Exempt Amount. Counts are thousands; gains and tax are GBP millions. Totals + may not sum due to rounding. Provisional figures are updated for late and amended returns. + unit: count + aggregation: sum + expected_cell_type: number + value_scale: 1000 + - measure_id: gains + label: Gains qualifying for BADR or Investors' Relief + ordinal: 1 + column: C + source_column_id: gains + expected_column_header_row: 6 + expected_column_header: Gains on which BADR/IR claimed + concept: hmrc.cgt_badr_ir_qualifying_gains + source_concept: hmrc.cgt_badr_ir_qualifying_gains + concept_relation: source_label + concept_authority: hmrc + concept_evidence_url: https://www.gov.uk/government/statistics/capital-gains-tax-statistics + concept_evidence_notes: HMRC Capital Gains Tax statistics 2026, Table 4. Gains are before deducting + losses and the Annual Exempt Amount. Counts are thousands; gains and tax are GBP millions. Totals + may not sum due to rounding. Provisional figures are updated for late and amended returns. + unit: gbp + aggregation: sum + expected_cell_type: number + value_scale: 1000000 + - measure_id: tax + label: Tax charged at the BADR/IR rate + ordinal: 2 + column: D + source_column_id: tax + expected_column_header_row: 6 + expected_column_header: Tax charged at BADR/IR rate + concept: hmrc.cgt_badr_ir_tax + source_concept: hmrc.cgt_badr_ir_tax + concept_relation: source_label + concept_authority: hmrc + concept_evidence_url: https://www.gov.uk/government/statistics/capital-gains-tax-statistics + concept_evidence_notes: HMRC Capital Gains Tax statistics 2026, Table 4. Gains are before deducting + losses and the Annual Exempt Amount. Counts are thousands; gains and tax are GBP millions. Totals + may not sum due to rounding. Provisional figures are updated for late and amended returns. + unit: gbp + aggregation: sum + expected_cell_type: number + value_scale: 1000000 +- record_set_id: hmrc.cgt_badr_ir_2026.table4_4.ty2021.trusts_total + provenance_class: administrative + assertion: observation + record_set_spec_id: hmrc.cgt_badr_ir_2026.table4_4.ty2021.trusts_total.v1 + source_record_id_prefix: hmrc.cgt_badr_ir_2026.table4_4.ty2021 + sheet_name: 4_4_2021-22 + period_type: tax_year + period: 2021 + period_coverage: + basis: tax + source_period_label: 2021 to 2022 tax year + start_date: '2021-04-06' + end_date: '2022-04-05' + notes: HMRC updates provisional figures for late and amended returns. + geography_id: K02000001 + geography_level: country + geography_name: United Kingdom + geography_vintage: current + entity: person + entity_role: taxpayer + domain: capital_gains_tax + groupby_dimension: cgt_badr_ir_gain_band + rows: + - value_id: trusts_total + label: Trusts total + ordinal: 9 + row_number: 16 + expected_row_header_column: A + expected_row_header: Trusts (Total) + table_record_kind: total + filters: + cgt_badr_ir_gain_band: total + taxpayer_type: trusts + constraints: + - variable: cgt_badr_ir_gain_band + operator: == + value: total + label: BADR/IR qualifying gain band + - variable: taxpayer_type + operator: == + value: trusts + label: Taxpayer type + guard_cells: + - column: B + expected_value: '[Fewer than 1]' + label: Publisher-suppressed value retained without a numeric fact + measures: + - measure_id: gains + label: Gains qualifying for BADR or Investors' Relief + ordinal: 1 + column: C + source_column_id: gains + expected_column_header_row: 6 + expected_column_header: Gains on which BADR/IR claimed + concept: hmrc.cgt_badr_ir_qualifying_gains + source_concept: hmrc.cgt_badr_ir_qualifying_gains + concept_relation: source_label + concept_authority: hmrc + concept_evidence_url: https://www.gov.uk/government/statistics/capital-gains-tax-statistics + concept_evidence_notes: HMRC Capital Gains Tax statistics 2026, Table 4. Gains are before deducting + losses and the Annual Exempt Amount. Counts are thousands; gains and tax are GBP millions. Totals + may not sum due to rounding. Provisional figures are updated for late and amended returns. + unit: gbp + aggregation: sum + expected_cell_type: number + value_scale: 1000000 + - measure_id: tax + label: Tax charged at the BADR/IR rate + ordinal: 2 + column: D + source_column_id: tax + expected_column_header_row: 6 + expected_column_header: Tax charged at BADR/IR rate + concept: hmrc.cgt_badr_ir_tax + source_concept: hmrc.cgt_badr_ir_tax + concept_relation: source_label + concept_authority: hmrc + concept_evidence_url: https://www.gov.uk/government/statistics/capital-gains-tax-statistics + concept_evidence_notes: HMRC Capital Gains Tax statistics 2026, Table 4. Gains are before deducting + losses and the Annual Exempt Amount. Counts are thousands; gains and tax are GBP millions. Totals + may not sum due to rounding. Provisional figures are updated for late and amended returns. + unit: gbp + aggregation: sum + expected_cell_type: number + value_scale: 1000000 +- record_set_id: hmrc.cgt_badr_ir_2026.table4_4.ty2021.all_total + provenance_class: administrative + assertion: observation + record_set_spec_id: hmrc.cgt_badr_ir_2026.table4_4.ty2021.all_total.v1 + source_record_id_prefix: hmrc.cgt_badr_ir_2026.table4_4.ty2021 + sheet_name: 4_4_2021-22 + period_type: tax_year + period: 2021 + period_coverage: + basis: tax + source_period_label: 2021 to 2022 tax year + start_date: '2021-04-06' + end_date: '2022-04-05' + notes: HMRC updates provisional figures for late and amended returns. + geography_id: K02000001 + geography_level: country + geography_name: United Kingdom + geography_vintage: current + entity: person + entity_role: taxpayer + domain: capital_gains_tax + groupby_dimension: cgt_badr_ir_gain_band + rows: + - value_id: all_total + label: All total + ordinal: 10 + row_number: 17 + expected_row_header_column: A + expected_row_header: All (Total) + table_record_kind: total + filters: + cgt_badr_ir_gain_band: total + taxpayer_type: all + constraints: + - variable: cgt_badr_ir_gain_band + operator: == + value: total + label: BADR/IR qualifying gain band + - variable: taxpayer_type + operator: == + value: all + label: Taxpayer type + measures: + - measure_id: taxpayers + label: BADR/IR liable taxpayers + ordinal: 0 + column: B + source_column_id: taxpayers + expected_column_header_row: 6 + expected_column_header: Number of BADR/IR liable taxpayers + concept: hmrc.cgt_badr_ir_taxpayers + source_concept: hmrc.cgt_badr_ir_taxpayers + concept_relation: source_label + concept_authority: hmrc + concept_evidence_url: https://www.gov.uk/government/statistics/capital-gains-tax-statistics + concept_evidence_notes: HMRC Capital Gains Tax statistics 2026, Table 4. Gains are before deducting + losses and the Annual Exempt Amount. Counts are thousands; gains and tax are GBP millions. Totals + may not sum due to rounding. Provisional figures are updated for late and amended returns. + unit: count + aggregation: sum + expected_cell_type: number + value_scale: 1000 + - measure_id: gains + label: Gains qualifying for BADR or Investors' Relief + ordinal: 1 + column: C + source_column_id: gains + expected_column_header_row: 6 + expected_column_header: Gains on which BADR/IR claimed + concept: hmrc.cgt_badr_ir_qualifying_gains + source_concept: hmrc.cgt_badr_ir_qualifying_gains + concept_relation: source_label + concept_authority: hmrc + concept_evidence_url: https://www.gov.uk/government/statistics/capital-gains-tax-statistics + concept_evidence_notes: HMRC Capital Gains Tax statistics 2026, Table 4. Gains are before deducting + losses and the Annual Exempt Amount. Counts are thousands; gains and tax are GBP millions. Totals + may not sum due to rounding. Provisional figures are updated for late and amended returns. + unit: gbp + aggregation: sum + expected_cell_type: number + value_scale: 1000000 + - measure_id: tax + label: Tax charged at the BADR/IR rate + ordinal: 2 + column: D + source_column_id: tax + expected_column_header_row: 6 + expected_column_header: Tax charged at BADR/IR rate + concept: hmrc.cgt_badr_ir_tax + source_concept: hmrc.cgt_badr_ir_tax + concept_relation: source_label + concept_authority: hmrc + concept_evidence_url: https://www.gov.uk/government/statistics/capital-gains-tax-statistics + concept_evidence_notes: HMRC Capital Gains Tax statistics 2026, Table 4. Gains are before deducting + losses and the Annual Exempt Amount. Counts are thousands; gains and tax are GBP millions. Totals + may not sum due to rounding. Provisional figures are updated for late and amended returns. + unit: gbp + aggregation: sum + expected_cell_type: number + value_scale: 1000000 +- record_set_id: hmrc.cgt_badr_ir_2026.table4_3.ty2022.first_band + provenance_class: administrative + assertion: observation + record_set_spec_id: hmrc.cgt_badr_ir_2026.table4_3.ty2022.first_band.v1 + source_record_id_prefix: hmrc.cgt_badr_ir_2026.table4_3.ty2022 + sheet_name: 4_3_2022-23 + period_type: tax_year + period: 2022 + period_coverage: + basis: tax + source_period_label: 2022 to 2023 tax year + start_date: '2022-04-06' + end_date: '2023-04-05' + notes: HMRC marks this sheet provisional and updates figures for late and amended returns. + geography_id: K02000001 + geography_level: country + geography_name: United Kingdom + geography_vintage: current + entity: person + entity_role: taxpayer + domain: capital_gains_tax + groupby_dimension: cgt_badr_ir_gain_band + rows: + - value_id: gain_0_to_9999 + label: GBP 0 to GBP 9,999 + ordinal: 0 + row_number: 8 + expected_row_header_column: A + expected_row_header: Individuals (0) + table_record_kind: detail + filters: + cgt_badr_ir_gain_band: gain_0_to_9999 + taxpayer_type: individuals + constraints: + - variable: cgt_badr_ir_gain_band + operator: == + value: gain_0_to_9999 + label: BADR/IR qualifying gain band + - variable: taxpayer_type + operator: == + value: individuals + label: Taxpayer type + - variable: cgt_badr_ir_qualifying_gain + operator: '>=' + value: 0 + unit: gbp + label: Qualifying gain lower bound + - variable: cgt_badr_ir_qualifying_gain + operator: < + value: 10000 + unit: gbp + label: Qualifying gain upper bound + guard_cells: + - column: D + expected_value: '[Less than 1]' + label: Publisher-suppressed value retained without a numeric fact + measures: + - measure_id: taxpayers + label: BADR/IR liable taxpayers + ordinal: 0 + column: B + source_column_id: taxpayers + expected_column_header_row: 7 + expected_column_header: Number of BADR/IR liable taxpayers + concept: hmrc.cgt_badr_ir_taxpayers + source_concept: hmrc.cgt_badr_ir_taxpayers + concept_relation: source_label + concept_authority: hmrc + concept_evidence_url: https://www.gov.uk/government/statistics/capital-gains-tax-statistics + concept_evidence_notes: HMRC Capital Gains Tax statistics 2026, Table 4. Gains are before deducting + losses and the Annual Exempt Amount. Counts are thousands; gains and tax are GBP millions. Totals + may not sum due to rounding. Provisional figures are updated for late and amended returns. + unit: count + aggregation: sum + expected_cell_type: number + value_scale: 1000 + - measure_id: gains + label: Gains qualifying for BADR or Investors' Relief + ordinal: 1 + column: C + source_column_id: gains + expected_column_header_row: 7 + expected_column_header: Gains on which BADR/IR claimed + concept: hmrc.cgt_badr_ir_qualifying_gains + source_concept: hmrc.cgt_badr_ir_qualifying_gains + concept_relation: source_label + concept_authority: hmrc + concept_evidence_url: https://www.gov.uk/government/statistics/capital-gains-tax-statistics + concept_evidence_notes: HMRC Capital Gains Tax statistics 2026, Table 4. Gains are before deducting + losses and the Annual Exempt Amount. Counts are thousands; gains and tax are GBP millions. Totals + may not sum due to rounding. Provisional figures are updated for late and amended returns. + unit: gbp + aggregation: sum + expected_cell_type: number + value_scale: 1000000 +- record_set_id: hmrc.cgt_badr_ir_2026.table4_3.ty2022.main + provenance_class: administrative + assertion: observation + record_set_spec_id: hmrc.cgt_badr_ir_2026.table4_3.ty2022.main.v1 + source_record_id_prefix: hmrc.cgt_badr_ir_2026.table4_3.ty2022 + sheet_name: 4_3_2022-23 + period_type: tax_year + period: 2022 + period_coverage: + basis: tax + source_period_label: 2022 to 2023 tax year + start_date: '2022-04-06' + end_date: '2023-04-05' + notes: HMRC marks this sheet provisional and updates figures for late and amended returns. + geography_id: K02000001 + geography_level: country + geography_name: United Kingdom + geography_vintage: current + entity: person + entity_role: taxpayer + domain: capital_gains_tax + groupby_dimension: cgt_badr_ir_gain_band + rows: + - value_id: gain_10000_to_24999 + label: GBP 10,000 to GBP 24,999 + ordinal: 1 + row_number: 9 + expected_row_header_column: A + expected_row_header: Individuals (10,000) + table_record_kind: detail + filters: + cgt_badr_ir_gain_band: gain_10000_to_24999 + taxpayer_type: individuals + constraints: + - variable: cgt_badr_ir_gain_band + operator: == + value: gain_10000_to_24999 + label: BADR/IR qualifying gain band + - variable: taxpayer_type + operator: == + value: individuals + label: Taxpayer type + - variable: cgt_badr_ir_qualifying_gain + operator: '>=' + value: 10000 + unit: gbp + label: Qualifying gain lower bound + - variable: cgt_badr_ir_qualifying_gain + operator: < + value: 25000 + unit: gbp + label: Qualifying gain upper bound + - value_id: gain_25000_to_49999 + label: GBP 25,000 to GBP 49,999 + ordinal: 2 + row_number: 10 + expected_row_header_column: A + expected_row_header: Individuals (25,000) + table_record_kind: detail + filters: + cgt_badr_ir_gain_band: gain_25000_to_49999 + taxpayer_type: individuals + constraints: + - variable: cgt_badr_ir_gain_band + operator: == + value: gain_25000_to_49999 + label: BADR/IR qualifying gain band + - variable: taxpayer_type + operator: == + value: individuals + label: Taxpayer type + - variable: cgt_badr_ir_qualifying_gain + operator: '>=' + value: 25000 + unit: gbp + label: Qualifying gain lower bound + - variable: cgt_badr_ir_qualifying_gain + operator: < + value: 50000 + unit: gbp + label: Qualifying gain upper bound + - value_id: gain_50000_to_99999 + label: GBP 50,000 to GBP 99,999 + ordinal: 3 + row_number: 11 + expected_row_header_column: A + expected_row_header: Individuals (50,000) + table_record_kind: detail + filters: + cgt_badr_ir_gain_band: gain_50000_to_99999 + taxpayer_type: individuals + constraints: + - variable: cgt_badr_ir_gain_band + operator: == + value: gain_50000_to_99999 + label: BADR/IR qualifying gain band + - variable: taxpayer_type + operator: == + value: individuals + label: Taxpayer type + - variable: cgt_badr_ir_qualifying_gain + operator: '>=' + value: 50000 + unit: gbp + label: Qualifying gain lower bound + - variable: cgt_badr_ir_qualifying_gain + operator: < + value: 100000 + unit: gbp + label: Qualifying gain upper bound + - value_id: gain_100000_to_249999 + label: GBP 100,000 to GBP 249,999 + ordinal: 4 + row_number: 12 + expected_row_header_column: A + expected_row_header: Individuals (100,000) + table_record_kind: detail + filters: + cgt_badr_ir_gain_band: gain_100000_to_249999 + taxpayer_type: individuals + constraints: + - variable: cgt_badr_ir_gain_band + operator: == + value: gain_100000_to_249999 + label: BADR/IR qualifying gain band + - variable: taxpayer_type + operator: == + value: individuals + label: Taxpayer type + - variable: cgt_badr_ir_qualifying_gain + operator: '>=' + value: 100000 + unit: gbp + label: Qualifying gain lower bound + - variable: cgt_badr_ir_qualifying_gain + operator: < + value: 250000 + unit: gbp + label: Qualifying gain upper bound + - value_id: gain_250000_to_499999 + label: GBP 250,000 to GBP 499,999 + ordinal: 5 + row_number: 13 + expected_row_header_column: A + expected_row_header: Individuals (250,000) + table_record_kind: detail + filters: + cgt_badr_ir_gain_band: gain_250000_to_499999 + taxpayer_type: individuals + constraints: + - variable: cgt_badr_ir_gain_band + operator: == + value: gain_250000_to_499999 + label: BADR/IR qualifying gain band + - variable: taxpayer_type + operator: == + value: individuals + label: Taxpayer type + - variable: cgt_badr_ir_qualifying_gain + operator: '>=' + value: 250000 + unit: gbp + label: Qualifying gain lower bound + - variable: cgt_badr_ir_qualifying_gain + operator: < + value: 500000 + unit: gbp + label: Qualifying gain upper bound + - value_id: gain_500000_to_999999 + label: GBP 500,000 to GBP 999,999 + ordinal: 6 + row_number: 14 + expected_row_header_column: A + expected_row_header: Individuals (500,000) + table_record_kind: detail + filters: + cgt_badr_ir_gain_band: gain_500000_to_999999 + taxpayer_type: individuals + constraints: + - variable: cgt_badr_ir_gain_band + operator: == + value: gain_500000_to_999999 + label: BADR/IR qualifying gain band + - variable: taxpayer_type + operator: == + value: individuals + label: Taxpayer type + - variable: cgt_badr_ir_qualifying_gain + operator: '>=' + value: 500000 + unit: gbp + label: Qualifying gain lower bound + - variable: cgt_badr_ir_qualifying_gain + operator: < + value: 1000000 + unit: gbp + label: Qualifying gain upper bound + - value_id: gain_1000000_plus + label: GBP 1,000,000 and over + ordinal: 7 + row_number: 15 + expected_row_header_column: A + expected_row_header: Individuals (1,000,000) + table_record_kind: detail + filters: + cgt_badr_ir_gain_band: gain_1000000_plus + taxpayer_type: individuals + constraints: + - variable: cgt_badr_ir_gain_band + operator: == + value: gain_1000000_plus + label: BADR/IR qualifying gain band + - variable: taxpayer_type + operator: == + value: individuals + label: Taxpayer type + - variable: cgt_badr_ir_qualifying_gain + operator: '>=' + value: 1000000 + unit: gbp + label: Qualifying gain lower bound + - value_id: individuals_total + label: Individuals total + ordinal: 8 + row_number: 16 + expected_row_header_column: A + expected_row_header: Individuals (Total) + table_record_kind: total + filters: + cgt_badr_ir_gain_band: total + taxpayer_type: individuals + constraints: + - variable: cgt_badr_ir_gain_band + operator: == + value: total + label: BADR/IR qualifying gain band + - variable: taxpayer_type + operator: == + value: individuals + label: Taxpayer type + measures: + - measure_id: taxpayers + label: BADR/IR liable taxpayers + ordinal: 0 + column: B + source_column_id: taxpayers + expected_column_header_row: 7 + expected_column_header: Number of BADR/IR liable taxpayers + concept: hmrc.cgt_badr_ir_taxpayers + source_concept: hmrc.cgt_badr_ir_taxpayers + concept_relation: source_label + concept_authority: hmrc + concept_evidence_url: https://www.gov.uk/government/statistics/capital-gains-tax-statistics + concept_evidence_notes: HMRC Capital Gains Tax statistics 2026, Table 4. Gains are before deducting + losses and the Annual Exempt Amount. Counts are thousands; gains and tax are GBP millions. Totals + may not sum due to rounding. Provisional figures are updated for late and amended returns. + unit: count + aggregation: sum + expected_cell_type: number + value_scale: 1000 + - measure_id: gains + label: Gains qualifying for BADR or Investors' Relief + ordinal: 1 + column: C + source_column_id: gains + expected_column_header_row: 7 + expected_column_header: Gains on which BADR/IR claimed + concept: hmrc.cgt_badr_ir_qualifying_gains + source_concept: hmrc.cgt_badr_ir_qualifying_gains + concept_relation: source_label + concept_authority: hmrc + concept_evidence_url: https://www.gov.uk/government/statistics/capital-gains-tax-statistics + concept_evidence_notes: HMRC Capital Gains Tax statistics 2026, Table 4. Gains are before deducting + losses and the Annual Exempt Amount. Counts are thousands; gains and tax are GBP millions. Totals + may not sum due to rounding. Provisional figures are updated for late and amended returns. + unit: gbp + aggregation: sum + expected_cell_type: number + value_scale: 1000000 + - measure_id: tax + label: Tax charged at the BADR/IR rate + ordinal: 2 + column: D + source_column_id: tax + expected_column_header_row: 7 + expected_column_header: Tax charged at BADR/IR rate + concept: hmrc.cgt_badr_ir_tax + source_concept: hmrc.cgt_badr_ir_tax + concept_relation: source_label + concept_authority: hmrc + concept_evidence_url: https://www.gov.uk/government/statistics/capital-gains-tax-statistics + concept_evidence_notes: HMRC Capital Gains Tax statistics 2026, Table 4. Gains are before deducting + losses and the Annual Exempt Amount. Counts are thousands; gains and tax are GBP millions. Totals + may not sum due to rounding. Provisional figures are updated for late and amended returns. + unit: gbp + aggregation: sum + expected_cell_type: number + value_scale: 1000000 +- record_set_id: hmrc.cgt_badr_ir_2026.table4_3.ty2022.trusts_total + provenance_class: administrative + assertion: observation + record_set_spec_id: hmrc.cgt_badr_ir_2026.table4_3.ty2022.trusts_total.v1 + source_record_id_prefix: hmrc.cgt_badr_ir_2026.table4_3.ty2022 + sheet_name: 4_3_2022-23 + period_type: tax_year + period: 2022 + period_coverage: + basis: tax + source_period_label: 2022 to 2023 tax year + start_date: '2022-04-06' + end_date: '2023-04-05' + notes: HMRC marks this sheet provisional and updates figures for late and amended returns. + geography_id: K02000001 + geography_level: country + geography_name: United Kingdom + geography_vintage: current + entity: person + entity_role: taxpayer + domain: capital_gains_tax + groupby_dimension: cgt_badr_ir_gain_band + rows: + - value_id: trusts_total + label: Trusts total + ordinal: 9 + row_number: 17 + expected_row_header_column: A + expected_row_header: Trusts (Total) + table_record_kind: total + filters: + cgt_badr_ir_gain_band: total + taxpayer_type: trusts + constraints: + - variable: cgt_badr_ir_gain_band + operator: == + value: total + label: BADR/IR qualifying gain band + - variable: taxpayer_type + operator: == + value: trusts + label: Taxpayer type + guard_cells: + - column: B + expected_value: '[Fewer than 1]' + label: Publisher-suppressed value retained without a numeric fact + measures: + - measure_id: gains + label: Gains qualifying for BADR or Investors' Relief + ordinal: 1 + column: C + source_column_id: gains + expected_column_header_row: 7 + expected_column_header: Gains on which BADR/IR claimed + concept: hmrc.cgt_badr_ir_qualifying_gains + source_concept: hmrc.cgt_badr_ir_qualifying_gains + concept_relation: source_label + concept_authority: hmrc + concept_evidence_url: https://www.gov.uk/government/statistics/capital-gains-tax-statistics + concept_evidence_notes: HMRC Capital Gains Tax statistics 2026, Table 4. Gains are before deducting + losses and the Annual Exempt Amount. Counts are thousands; gains and tax are GBP millions. Totals + may not sum due to rounding. Provisional figures are updated for late and amended returns. + unit: gbp + aggregation: sum + expected_cell_type: number + value_scale: 1000000 + - measure_id: tax + label: Tax charged at the BADR/IR rate + ordinal: 2 + column: D + source_column_id: tax + expected_column_header_row: 7 + expected_column_header: Tax charged at BADR/IR rate + concept: hmrc.cgt_badr_ir_tax + source_concept: hmrc.cgt_badr_ir_tax + concept_relation: source_label + concept_authority: hmrc + concept_evidence_url: https://www.gov.uk/government/statistics/capital-gains-tax-statistics + concept_evidence_notes: HMRC Capital Gains Tax statistics 2026, Table 4. Gains are before deducting + losses and the Annual Exempt Amount. Counts are thousands; gains and tax are GBP millions. Totals + may not sum due to rounding. Provisional figures are updated for late and amended returns. + unit: gbp + aggregation: sum + expected_cell_type: number + value_scale: 1000000 +- record_set_id: hmrc.cgt_badr_ir_2026.table4_3.ty2022.all_total + provenance_class: administrative + assertion: observation + record_set_spec_id: hmrc.cgt_badr_ir_2026.table4_3.ty2022.all_total.v1 + source_record_id_prefix: hmrc.cgt_badr_ir_2026.table4_3.ty2022 + sheet_name: 4_3_2022-23 + period_type: tax_year + period: 2022 + period_coverage: + basis: tax + source_period_label: 2022 to 2023 tax year + start_date: '2022-04-06' + end_date: '2023-04-05' + notes: HMRC marks this sheet provisional and updates figures for late and amended returns. + geography_id: K02000001 + geography_level: country + geography_name: United Kingdom + geography_vintage: current + entity: person + entity_role: taxpayer + domain: capital_gains_tax + groupby_dimension: cgt_badr_ir_gain_band + rows: + - value_id: all_total + label: All total + ordinal: 10 + row_number: 18 + expected_row_header_column: A + expected_row_header: All (Total) + table_record_kind: total + filters: + cgt_badr_ir_gain_band: total + taxpayer_type: all + constraints: + - variable: cgt_badr_ir_gain_band + operator: == + value: total + label: BADR/IR qualifying gain band + - variable: taxpayer_type + operator: == + value: all + label: Taxpayer type + measures: + - measure_id: taxpayers + label: BADR/IR liable taxpayers + ordinal: 0 + column: B + source_column_id: taxpayers + expected_column_header_row: 7 + expected_column_header: Number of BADR/IR liable taxpayers + concept: hmrc.cgt_badr_ir_taxpayers + source_concept: hmrc.cgt_badr_ir_taxpayers + concept_relation: source_label + concept_authority: hmrc + concept_evidence_url: https://www.gov.uk/government/statistics/capital-gains-tax-statistics + concept_evidence_notes: HMRC Capital Gains Tax statistics 2026, Table 4. Gains are before deducting + losses and the Annual Exempt Amount. Counts are thousands; gains and tax are GBP millions. Totals + may not sum due to rounding. Provisional figures are updated for late and amended returns. + unit: count + aggregation: sum + expected_cell_type: number + value_scale: 1000 + - measure_id: gains + label: Gains qualifying for BADR or Investors' Relief + ordinal: 1 + column: C + source_column_id: gains + expected_column_header_row: 7 + expected_column_header: Gains on which BADR/IR claimed + concept: hmrc.cgt_badr_ir_qualifying_gains + source_concept: hmrc.cgt_badr_ir_qualifying_gains + concept_relation: source_label + concept_authority: hmrc + concept_evidence_url: https://www.gov.uk/government/statistics/capital-gains-tax-statistics + concept_evidence_notes: HMRC Capital Gains Tax statistics 2026, Table 4. Gains are before deducting + losses and the Annual Exempt Amount. Counts are thousands; gains and tax are GBP millions. Totals + may not sum due to rounding. Provisional figures are updated for late and amended returns. + unit: gbp + aggregation: sum + expected_cell_type: number + value_scale: 1000000 + - measure_id: tax + label: Tax charged at the BADR/IR rate + ordinal: 2 + column: D + source_column_id: tax + expected_column_header_row: 7 + expected_column_header: Tax charged at BADR/IR rate + concept: hmrc.cgt_badr_ir_tax + source_concept: hmrc.cgt_badr_ir_tax + concept_relation: source_label + concept_authority: hmrc + concept_evidence_url: https://www.gov.uk/government/statistics/capital-gains-tax-statistics + concept_evidence_notes: HMRC Capital Gains Tax statistics 2026, Table 4. Gains are before deducting + losses and the Annual Exempt Amount. Counts are thousands; gains and tax are GBP millions. Totals + may not sum due to rounding. Provisional figures are updated for late and amended returns. + unit: gbp + aggregation: sum + expected_cell_type: number + value_scale: 1000000 +- record_set_id: hmrc.cgt_badr_ir_2026.table4_2.ty2023.main + provenance_class: administrative + assertion: observation + record_set_spec_id: hmrc.cgt_badr_ir_2026.table4_2.ty2023.main.v1 + source_record_id_prefix: hmrc.cgt_badr_ir_2026.table4_2.ty2023 + sheet_name: 4_2_2023-24 + period_type: tax_year + period: 2023 + period_coverage: + basis: tax + source_period_label: 2023 to 2024 tax year + start_date: '2023-04-06' + end_date: '2024-04-05' + notes: HMRC marks this sheet provisional and updates figures for late and amended returns. + geography_id: K02000001 + geography_level: country + geography_name: United Kingdom + geography_vintage: current + entity: person + entity_role: taxpayer + domain: capital_gains_tax + groupby_dimension: cgt_badr_ir_gain_band + rows: + - value_id: gain_0_to_9999 + label: GBP 0 to GBP 9,999 + ordinal: 0 + row_number: 8 + expected_row_header_column: A + expected_row_header: Individuals (0) + table_record_kind: detail + filters: + cgt_badr_ir_gain_band: gain_0_to_9999 + taxpayer_type: individuals + constraints: + - variable: cgt_badr_ir_gain_band + operator: == + value: gain_0_to_9999 + label: BADR/IR qualifying gain band + - variable: taxpayer_type + operator: == + value: individuals + label: Taxpayer type + - variable: cgt_badr_ir_qualifying_gain + operator: '>=' + value: 0 + unit: gbp + label: Qualifying gain lower bound + - variable: cgt_badr_ir_qualifying_gain + operator: < + value: 10000 + unit: gbp + label: Qualifying gain upper bound + - value_id: gain_10000_to_24999 + label: GBP 10,000 to GBP 24,999 + ordinal: 1 + row_number: 9 + expected_row_header_column: A + expected_row_header: Individuals (10,000) + table_record_kind: detail + filters: + cgt_badr_ir_gain_band: gain_10000_to_24999 + taxpayer_type: individuals + constraints: + - variable: cgt_badr_ir_gain_band + operator: == + value: gain_10000_to_24999 + label: BADR/IR qualifying gain band + - variable: taxpayer_type + operator: == + value: individuals + label: Taxpayer type + - variable: cgt_badr_ir_qualifying_gain + operator: '>=' + value: 10000 + unit: gbp + label: Qualifying gain lower bound + - variable: cgt_badr_ir_qualifying_gain + operator: < + value: 25000 + unit: gbp + label: Qualifying gain upper bound + - value_id: gain_25000_to_49999 + label: GBP 25,000 to GBP 49,999 + ordinal: 2 + row_number: 10 + expected_row_header_column: A + expected_row_header: Individuals (25,000) + table_record_kind: detail + filters: + cgt_badr_ir_gain_band: gain_25000_to_49999 + taxpayer_type: individuals + constraints: + - variable: cgt_badr_ir_gain_band + operator: == + value: gain_25000_to_49999 + label: BADR/IR qualifying gain band + - variable: taxpayer_type + operator: == + value: individuals + label: Taxpayer type + - variable: cgt_badr_ir_qualifying_gain + operator: '>=' + value: 25000 + unit: gbp + label: Qualifying gain lower bound + - variable: cgt_badr_ir_qualifying_gain + operator: < + value: 50000 + unit: gbp + label: Qualifying gain upper bound + - value_id: gain_50000_to_99999 + label: GBP 50,000 to GBP 99,999 + ordinal: 3 + row_number: 11 + expected_row_header_column: A + expected_row_header: Individuals (50,000) + table_record_kind: detail + filters: + cgt_badr_ir_gain_band: gain_50000_to_99999 + taxpayer_type: individuals + constraints: + - variable: cgt_badr_ir_gain_band + operator: == + value: gain_50000_to_99999 + label: BADR/IR qualifying gain band + - variable: taxpayer_type + operator: == + value: individuals + label: Taxpayer type + - variable: cgt_badr_ir_qualifying_gain + operator: '>=' + value: 50000 + unit: gbp + label: Qualifying gain lower bound + - variable: cgt_badr_ir_qualifying_gain + operator: < + value: 100000 + unit: gbp + label: Qualifying gain upper bound + - value_id: gain_100000_to_249999 + label: GBP 100,000 to GBP 249,999 + ordinal: 4 + row_number: 12 + expected_row_header_column: A + expected_row_header: Individuals (100,000) + table_record_kind: detail + filters: + cgt_badr_ir_gain_band: gain_100000_to_249999 + taxpayer_type: individuals + constraints: + - variable: cgt_badr_ir_gain_band + operator: == + value: gain_100000_to_249999 + label: BADR/IR qualifying gain band + - variable: taxpayer_type + operator: == + value: individuals + label: Taxpayer type + - variable: cgt_badr_ir_qualifying_gain + operator: '>=' + value: 100000 + unit: gbp + label: Qualifying gain lower bound + - variable: cgt_badr_ir_qualifying_gain + operator: < + value: 250000 + unit: gbp + label: Qualifying gain upper bound + - value_id: gain_250000_to_499999 + label: GBP 250,000 to GBP 499,999 + ordinal: 5 + row_number: 13 + expected_row_header_column: A + expected_row_header: Individuals (250,000) + table_record_kind: detail + filters: + cgt_badr_ir_gain_band: gain_250000_to_499999 + taxpayer_type: individuals + constraints: + - variable: cgt_badr_ir_gain_band + operator: == + value: gain_250000_to_499999 + label: BADR/IR qualifying gain band + - variable: taxpayer_type + operator: == + value: individuals + label: Taxpayer type + - variable: cgt_badr_ir_qualifying_gain + operator: '>=' + value: 250000 + unit: gbp + label: Qualifying gain lower bound + - variable: cgt_badr_ir_qualifying_gain + operator: < + value: 500000 + unit: gbp + label: Qualifying gain upper bound + - value_id: gain_500000_to_999999 + label: GBP 500,000 to GBP 999,999 + ordinal: 6 + row_number: 14 + expected_row_header_column: A + expected_row_header: Individuals (500,000) + table_record_kind: detail + filters: + cgt_badr_ir_gain_band: gain_500000_to_999999 + taxpayer_type: individuals + constraints: + - variable: cgt_badr_ir_gain_band + operator: == + value: gain_500000_to_999999 + label: BADR/IR qualifying gain band + - variable: taxpayer_type + operator: == + value: individuals + label: Taxpayer type + - variable: cgt_badr_ir_qualifying_gain + operator: '>=' + value: 500000 + unit: gbp + label: Qualifying gain lower bound + - variable: cgt_badr_ir_qualifying_gain + operator: < + value: 1000000 + unit: gbp + label: Qualifying gain upper bound + - value_id: gain_1000000_plus + label: GBP 1,000,000 and over + ordinal: 7 + row_number: 15 + expected_row_header_column: A + expected_row_header: Individuals (1,000,000) + table_record_kind: detail + filters: + cgt_badr_ir_gain_band: gain_1000000_plus + taxpayer_type: individuals + constraints: + - variable: cgt_badr_ir_gain_band + operator: == + value: gain_1000000_plus + label: BADR/IR qualifying gain band + - variable: taxpayer_type + operator: == + value: individuals + label: Taxpayer type + - variable: cgt_badr_ir_qualifying_gain + operator: '>=' + value: 1000000 + unit: gbp + label: Qualifying gain lower bound + - value_id: individuals_total + label: Individuals total + ordinal: 8 + row_number: 16 + expected_row_header_column: A + expected_row_header: Individuals (Total) + table_record_kind: total + filters: + cgt_badr_ir_gain_band: total + taxpayer_type: individuals + constraints: + - variable: cgt_badr_ir_gain_band + operator: == + value: total + label: BADR/IR qualifying gain band + - variable: taxpayer_type + operator: == + value: individuals + label: Taxpayer type + measures: + - measure_id: taxpayers + label: BADR/IR liable taxpayers + ordinal: 0 + column: B + source_column_id: taxpayers + expected_column_header_row: 7 + expected_column_header: Number of BADR/IR liable taxpayers + concept: hmrc.cgt_badr_ir_taxpayers + source_concept: hmrc.cgt_badr_ir_taxpayers + concept_relation: source_label + concept_authority: hmrc + concept_evidence_url: https://www.gov.uk/government/statistics/capital-gains-tax-statistics + concept_evidence_notes: HMRC Capital Gains Tax statistics 2026, Table 4. Gains are before deducting + losses and the Annual Exempt Amount. Counts are thousands; gains and tax are GBP millions. Totals + may not sum due to rounding. Provisional figures are updated for late and amended returns. + unit: count + aggregation: sum + expected_cell_type: number + value_scale: 1000 + - measure_id: gains + label: Gains qualifying for BADR or Investors' Relief + ordinal: 1 + column: C + source_column_id: gains + expected_column_header_row: 7 + expected_column_header: Gains on which BADR/IR claimed + concept: hmrc.cgt_badr_ir_qualifying_gains + source_concept: hmrc.cgt_badr_ir_qualifying_gains + concept_relation: source_label + concept_authority: hmrc + concept_evidence_url: https://www.gov.uk/government/statistics/capital-gains-tax-statistics + concept_evidence_notes: HMRC Capital Gains Tax statistics 2026, Table 4. Gains are before deducting + losses and the Annual Exempt Amount. Counts are thousands; gains and tax are GBP millions. Totals + may not sum due to rounding. Provisional figures are updated for late and amended returns. + unit: gbp + aggregation: sum + expected_cell_type: number + value_scale: 1000000 + - measure_id: tax + label: Tax charged at the BADR/IR rate + ordinal: 2 + column: D + source_column_id: tax + expected_column_header_row: 7 + expected_column_header: Tax charged at BADR/IR rate + concept: hmrc.cgt_badr_ir_tax + source_concept: hmrc.cgt_badr_ir_tax + concept_relation: source_label + concept_authority: hmrc + concept_evidence_url: https://www.gov.uk/government/statistics/capital-gains-tax-statistics + concept_evidence_notes: HMRC Capital Gains Tax statistics 2026, Table 4. Gains are before deducting + losses and the Annual Exempt Amount. Counts are thousands; gains and tax are GBP millions. Totals + may not sum due to rounding. Provisional figures are updated for late and amended returns. + unit: gbp + aggregation: sum + expected_cell_type: number + value_scale: 1000000 +- record_set_id: hmrc.cgt_badr_ir_2026.table4_2.ty2023.trusts_total + provenance_class: administrative + assertion: observation + record_set_spec_id: hmrc.cgt_badr_ir_2026.table4_2.ty2023.trusts_total.v1 + source_record_id_prefix: hmrc.cgt_badr_ir_2026.table4_2.ty2023 + sheet_name: 4_2_2023-24 + period_type: tax_year + period: 2023 + period_coverage: + basis: tax + source_period_label: 2023 to 2024 tax year + start_date: '2023-04-06' + end_date: '2024-04-05' + notes: HMRC marks this sheet provisional and updates figures for late and amended returns. + geography_id: K02000001 + geography_level: country + geography_name: United Kingdom + geography_vintage: current + entity: person + entity_role: taxpayer + domain: capital_gains_tax + groupby_dimension: cgt_badr_ir_gain_band + rows: + - value_id: trusts_total + label: Trusts total + ordinal: 9 + row_number: 17 + expected_row_header_column: A + expected_row_header: Trusts (Total) + table_record_kind: total + filters: + cgt_badr_ir_gain_band: total + taxpayer_type: trusts + constraints: + - variable: cgt_badr_ir_gain_band + operator: == + value: total + label: BADR/IR qualifying gain band + - variable: taxpayer_type + operator: == + value: trusts + label: Taxpayer type + guard_cells: + - column: B + expected_value: '[Fewer than 1]' + label: Publisher-suppressed value retained without a numeric fact + measures: + - measure_id: gains + label: Gains qualifying for BADR or Investors' Relief + ordinal: 1 + column: C + source_column_id: gains + expected_column_header_row: 7 + expected_column_header: Gains on which BADR/IR claimed + concept: hmrc.cgt_badr_ir_qualifying_gains + source_concept: hmrc.cgt_badr_ir_qualifying_gains + concept_relation: source_label + concept_authority: hmrc + concept_evidence_url: https://www.gov.uk/government/statistics/capital-gains-tax-statistics + concept_evidence_notes: HMRC Capital Gains Tax statistics 2026, Table 4. Gains are before deducting + losses and the Annual Exempt Amount. Counts are thousands; gains and tax are GBP millions. Totals + may not sum due to rounding. Provisional figures are updated for late and amended returns. + unit: gbp + aggregation: sum + expected_cell_type: number + value_scale: 1000000 + - measure_id: tax + label: Tax charged at the BADR/IR rate + ordinal: 2 + column: D + source_column_id: tax + expected_column_header_row: 7 + expected_column_header: Tax charged at BADR/IR rate + concept: hmrc.cgt_badr_ir_tax + source_concept: hmrc.cgt_badr_ir_tax + concept_relation: source_label + concept_authority: hmrc + concept_evidence_url: https://www.gov.uk/government/statistics/capital-gains-tax-statistics + concept_evidence_notes: HMRC Capital Gains Tax statistics 2026, Table 4. Gains are before deducting + losses and the Annual Exempt Amount. Counts are thousands; gains and tax are GBP millions. Totals + may not sum due to rounding. Provisional figures are updated for late and amended returns. + unit: gbp + aggregation: sum + expected_cell_type: number + value_scale: 1000000 +- record_set_id: hmrc.cgt_badr_ir_2026.table4_2.ty2023.all_total + provenance_class: administrative + assertion: observation + record_set_spec_id: hmrc.cgt_badr_ir_2026.table4_2.ty2023.all_total.v1 + source_record_id_prefix: hmrc.cgt_badr_ir_2026.table4_2.ty2023 + sheet_name: 4_2_2023-24 + period_type: tax_year + period: 2023 + period_coverage: + basis: tax + source_period_label: 2023 to 2024 tax year + start_date: '2023-04-06' + end_date: '2024-04-05' + notes: HMRC marks this sheet provisional and updates figures for late and amended returns. + geography_id: K02000001 + geography_level: country + geography_name: United Kingdom + geography_vintage: current + entity: person + entity_role: taxpayer + domain: capital_gains_tax + groupby_dimension: cgt_badr_ir_gain_band + rows: + - value_id: all_total + label: All total + ordinal: 10 + row_number: 18 + expected_row_header_column: A + expected_row_header: All (Total) + table_record_kind: total + filters: + cgt_badr_ir_gain_band: total + taxpayer_type: all + constraints: + - variable: cgt_badr_ir_gain_band + operator: == + value: total + label: BADR/IR qualifying gain band + - variable: taxpayer_type + operator: == + value: all + label: Taxpayer type + measures: + - measure_id: taxpayers + label: BADR/IR liable taxpayers + ordinal: 0 + column: B + source_column_id: taxpayers + expected_column_header_row: 7 + expected_column_header: Number of BADR/IR liable taxpayers + concept: hmrc.cgt_badr_ir_taxpayers + source_concept: hmrc.cgt_badr_ir_taxpayers + concept_relation: source_label + concept_authority: hmrc + concept_evidence_url: https://www.gov.uk/government/statistics/capital-gains-tax-statistics + concept_evidence_notes: HMRC Capital Gains Tax statistics 2026, Table 4. Gains are before deducting + losses and the Annual Exempt Amount. Counts are thousands; gains and tax are GBP millions. Totals + may not sum due to rounding. Provisional figures are updated for late and amended returns. + unit: count + aggregation: sum + expected_cell_type: number + value_scale: 1000 + - measure_id: gains + label: Gains qualifying for BADR or Investors' Relief + ordinal: 1 + column: C + source_column_id: gains + expected_column_header_row: 7 + expected_column_header: Gains on which BADR/IR claimed + concept: hmrc.cgt_badr_ir_qualifying_gains + source_concept: hmrc.cgt_badr_ir_qualifying_gains + concept_relation: source_label + concept_authority: hmrc + concept_evidence_url: https://www.gov.uk/government/statistics/capital-gains-tax-statistics + concept_evidence_notes: HMRC Capital Gains Tax statistics 2026, Table 4. Gains are before deducting + losses and the Annual Exempt Amount. Counts are thousands; gains and tax are GBP millions. Totals + may not sum due to rounding. Provisional figures are updated for late and amended returns. + unit: gbp + aggregation: sum + expected_cell_type: number + value_scale: 1000000 + - measure_id: tax + label: Tax charged at the BADR/IR rate + ordinal: 2 + column: D + source_column_id: tax + expected_column_header_row: 7 + expected_column_header: Tax charged at BADR/IR rate + concept: hmrc.cgt_badr_ir_tax + source_concept: hmrc.cgt_badr_ir_tax + concept_relation: source_label + concept_authority: hmrc + concept_evidence_url: https://www.gov.uk/government/statistics/capital-gains-tax-statistics + concept_evidence_notes: HMRC Capital Gains Tax statistics 2026, Table 4. Gains are before deducting + losses and the Annual Exempt Amount. Counts are thousands; gains and tax are GBP millions. Totals + may not sum due to rounding. Provisional figures are updated for late and amended returns. + unit: gbp + aggregation: sum + expected_cell_type: number + value_scale: 1000000 +- record_set_id: hmrc.cgt_badr_ir_2026.table4_1.ty2024.main + provenance_class: administrative + assertion: observation + record_set_spec_id: hmrc.cgt_badr_ir_2026.table4_1.ty2024.main.v1 + source_record_id_prefix: hmrc.cgt_badr_ir_2026.table4_1.ty2024 + sheet_name: 4_1_2024-25 + period_type: tax_year + period: 2024 + period_coverage: + basis: tax + source_period_label: 2024 to 2025 tax year + start_date: '2024-04-06' + end_date: '2025-04-05' + notes: HMRC marks this sheet provisional and updates figures for late and amended returns. + geography_id: K02000001 + geography_level: country + geography_name: United Kingdom + geography_vintage: current + entity: person + entity_role: taxpayer + domain: capital_gains_tax + groupby_dimension: cgt_badr_ir_gain_band + rows: + - value_id: gain_0_to_9999 + label: GBP 0 to GBP 9,999 + ordinal: 0 + row_number: 8 + expected_row_header_column: A + expected_row_header: Individuals (0) + table_record_kind: detail + filters: + cgt_badr_ir_gain_band: gain_0_to_9999 + taxpayer_type: individuals + constraints: + - variable: cgt_badr_ir_gain_band + operator: == + value: gain_0_to_9999 + label: BADR/IR qualifying gain band + - variable: taxpayer_type + operator: == + value: individuals + label: Taxpayer type + - variable: cgt_badr_ir_qualifying_gain + operator: '>=' + value: 0 + unit: gbp + label: Qualifying gain lower bound + - variable: cgt_badr_ir_qualifying_gain + operator: < + value: 10000 + unit: gbp + label: Qualifying gain upper bound + - value_id: gain_10000_to_24999 + label: GBP 10,000 to GBP 24,999 + ordinal: 1 + row_number: 9 + expected_row_header_column: A + expected_row_header: Individuals (10,000) + table_record_kind: detail + filters: + cgt_badr_ir_gain_band: gain_10000_to_24999 + taxpayer_type: individuals + constraints: + - variable: cgt_badr_ir_gain_band + operator: == + value: gain_10000_to_24999 + label: BADR/IR qualifying gain band + - variable: taxpayer_type + operator: == + value: individuals + label: Taxpayer type + - variable: cgt_badr_ir_qualifying_gain + operator: '>=' + value: 10000 + unit: gbp + label: Qualifying gain lower bound + - variable: cgt_badr_ir_qualifying_gain + operator: < + value: 25000 + unit: gbp + label: Qualifying gain upper bound + - value_id: gain_25000_to_49999 + label: GBP 25,000 to GBP 49,999 + ordinal: 2 + row_number: 10 + expected_row_header_column: A + expected_row_header: Individuals (25,000) + table_record_kind: detail + filters: + cgt_badr_ir_gain_band: gain_25000_to_49999 + taxpayer_type: individuals + constraints: + - variable: cgt_badr_ir_gain_band + operator: == + value: gain_25000_to_49999 + label: BADR/IR qualifying gain band + - variable: taxpayer_type + operator: == + value: individuals + label: Taxpayer type + - variable: cgt_badr_ir_qualifying_gain + operator: '>=' + value: 25000 + unit: gbp + label: Qualifying gain lower bound + - variable: cgt_badr_ir_qualifying_gain + operator: < + value: 50000 + unit: gbp + label: Qualifying gain upper bound + - value_id: gain_50000_to_99999 + label: GBP 50,000 to GBP 99,999 + ordinal: 3 + row_number: 11 + expected_row_header_column: A + expected_row_header: Individuals (50,000) + table_record_kind: detail + filters: + cgt_badr_ir_gain_band: gain_50000_to_99999 + taxpayer_type: individuals + constraints: + - variable: cgt_badr_ir_gain_band + operator: == + value: gain_50000_to_99999 + label: BADR/IR qualifying gain band + - variable: taxpayer_type + operator: == + value: individuals + label: Taxpayer type + - variable: cgt_badr_ir_qualifying_gain + operator: '>=' + value: 50000 + unit: gbp + label: Qualifying gain lower bound + - variable: cgt_badr_ir_qualifying_gain + operator: < + value: 100000 + unit: gbp + label: Qualifying gain upper bound + - value_id: gain_100000_to_249999 + label: GBP 100,000 to GBP 249,999 + ordinal: 4 + row_number: 12 + expected_row_header_column: A + expected_row_header: Individuals (100,000) + table_record_kind: detail + filters: + cgt_badr_ir_gain_band: gain_100000_to_249999 + taxpayer_type: individuals + constraints: + - variable: cgt_badr_ir_gain_band + operator: == + value: gain_100000_to_249999 + label: BADR/IR qualifying gain band + - variable: taxpayer_type + operator: == + value: individuals + label: Taxpayer type + - variable: cgt_badr_ir_qualifying_gain + operator: '>=' + value: 100000 + unit: gbp + label: Qualifying gain lower bound + - variable: cgt_badr_ir_qualifying_gain + operator: < + value: 250000 + unit: gbp + label: Qualifying gain upper bound + - value_id: gain_250000_to_499999 + label: GBP 250,000 to GBP 499,999 + ordinal: 5 + row_number: 13 + expected_row_header_column: A + expected_row_header: Individuals (250,000) + table_record_kind: detail + filters: + cgt_badr_ir_gain_band: gain_250000_to_499999 + taxpayer_type: individuals + constraints: + - variable: cgt_badr_ir_gain_band + operator: == + value: gain_250000_to_499999 + label: BADR/IR qualifying gain band + - variable: taxpayer_type + operator: == + value: individuals + label: Taxpayer type + - variable: cgt_badr_ir_qualifying_gain + operator: '>=' + value: 250000 + unit: gbp + label: Qualifying gain lower bound + - variable: cgt_badr_ir_qualifying_gain + operator: < + value: 500000 + unit: gbp + label: Qualifying gain upper bound + - value_id: gain_500000_to_999999 + label: GBP 500,000 to GBP 999,999 + ordinal: 6 + row_number: 14 + expected_row_header_column: A + expected_row_header: Individuals (500,000) + table_record_kind: detail + filters: + cgt_badr_ir_gain_band: gain_500000_to_999999 + taxpayer_type: individuals + constraints: + - variable: cgt_badr_ir_gain_band + operator: == + value: gain_500000_to_999999 + label: BADR/IR qualifying gain band + - variable: taxpayer_type + operator: == + value: individuals + label: Taxpayer type + - variable: cgt_badr_ir_qualifying_gain + operator: '>=' + value: 500000 + unit: gbp + label: Qualifying gain lower bound + - variable: cgt_badr_ir_qualifying_gain + operator: < + value: 1000000 + unit: gbp + label: Qualifying gain upper bound + - value_id: gain_1000000_plus + label: GBP 1,000,000 and over + ordinal: 7 + row_number: 15 + expected_row_header_column: A + expected_row_header: Individuals (1,000,000) + table_record_kind: detail + filters: + cgt_badr_ir_gain_band: gain_1000000_plus + taxpayer_type: individuals + constraints: + - variable: cgt_badr_ir_gain_band + operator: == + value: gain_1000000_plus + label: BADR/IR qualifying gain band + - variable: taxpayer_type + operator: == + value: individuals + label: Taxpayer type + - variable: cgt_badr_ir_qualifying_gain + operator: '>=' + value: 1000000 + unit: gbp + label: Qualifying gain lower bound + - value_id: individuals_total + label: Individuals total + ordinal: 8 + row_number: 16 + expected_row_header_column: A + expected_row_header: Individuals (Total) + table_record_kind: total + filters: + cgt_badr_ir_gain_band: total + taxpayer_type: individuals + constraints: + - variable: cgt_badr_ir_gain_band + operator: == + value: total + label: BADR/IR qualifying gain band + - variable: taxpayer_type + operator: == + value: individuals + label: Taxpayer type + measures: + - measure_id: taxpayers + label: BADR/IR liable taxpayers + ordinal: 0 + column: B + source_column_id: taxpayers + expected_column_header_row: 7 + expected_column_header: Number of BADR/IR liable taxpayers + concept: hmrc.cgt_badr_ir_taxpayers + source_concept: hmrc.cgt_badr_ir_taxpayers + concept_relation: source_label + concept_authority: hmrc + concept_evidence_url: https://www.gov.uk/government/statistics/capital-gains-tax-statistics + concept_evidence_notes: HMRC Capital Gains Tax statistics 2026, Table 4. Gains are before deducting + losses and the Annual Exempt Amount. Counts are thousands; gains and tax are GBP millions. Totals + may not sum due to rounding. Provisional figures are updated for late and amended returns. + unit: count + aggregation: sum + expected_cell_type: number + value_scale: 1000 + - measure_id: gains + label: Gains qualifying for BADR or Investors' Relief + ordinal: 1 + column: C + source_column_id: gains + expected_column_header_row: 7 + expected_column_header: Gains on which BADR/IR claimed + concept: hmrc.cgt_badr_ir_qualifying_gains + source_concept: hmrc.cgt_badr_ir_qualifying_gains + concept_relation: source_label + concept_authority: hmrc + concept_evidence_url: https://www.gov.uk/government/statistics/capital-gains-tax-statistics + concept_evidence_notes: HMRC Capital Gains Tax statistics 2026, Table 4. Gains are before deducting + losses and the Annual Exempt Amount. Counts are thousands; gains and tax are GBP millions. Totals + may not sum due to rounding. Provisional figures are updated for late and amended returns. + unit: gbp + aggregation: sum + expected_cell_type: number + value_scale: 1000000 + - measure_id: tax + label: Tax charged at the BADR/IR rate + ordinal: 2 + column: D + source_column_id: tax + expected_column_header_row: 7 + expected_column_header: Tax charged at BADR/IR rate + concept: hmrc.cgt_badr_ir_tax + source_concept: hmrc.cgt_badr_ir_tax + concept_relation: source_label + concept_authority: hmrc + concept_evidence_url: https://www.gov.uk/government/statistics/capital-gains-tax-statistics + concept_evidence_notes: HMRC Capital Gains Tax statistics 2026, Table 4. Gains are before deducting + losses and the Annual Exempt Amount. Counts are thousands; gains and tax are GBP millions. Totals + may not sum due to rounding. Provisional figures are updated for late and amended returns. + unit: gbp + aggregation: sum + expected_cell_type: number + value_scale: 1000000 +- record_set_id: hmrc.cgt_badr_ir_2026.table4_1.ty2024.trusts_total + provenance_class: administrative + assertion: observation + record_set_spec_id: hmrc.cgt_badr_ir_2026.table4_1.ty2024.trusts_total.v1 + source_record_id_prefix: hmrc.cgt_badr_ir_2026.table4_1.ty2024 + sheet_name: 4_1_2024-25 + period_type: tax_year + period: 2024 + period_coverage: + basis: tax + source_period_label: 2024 to 2025 tax year + start_date: '2024-04-06' + end_date: '2025-04-05' + notes: HMRC marks this sheet provisional and updates figures for late and amended returns. + geography_id: K02000001 + geography_level: country + geography_name: United Kingdom + geography_vintage: current + entity: person + entity_role: taxpayer + domain: capital_gains_tax + groupby_dimension: cgt_badr_ir_gain_band + rows: + - value_id: trusts_total + label: Trusts total + ordinal: 9 + row_number: 17 + expected_row_header_column: A + expected_row_header: Trusts (Total) + table_record_kind: total + filters: + cgt_badr_ir_gain_band: total + taxpayer_type: trusts + constraints: + - variable: cgt_badr_ir_gain_band + operator: == + value: total + label: BADR/IR qualifying gain band + - variable: taxpayer_type + operator: == + value: trusts + label: Taxpayer type + guard_cells: + - column: B + expected_value: '[Fewer than 1]' + label: Publisher-suppressed value retained without a numeric fact + measures: + - measure_id: gains + label: Gains qualifying for BADR or Investors' Relief + ordinal: 1 + column: C + source_column_id: gains + expected_column_header_row: 7 + expected_column_header: Gains on which BADR/IR claimed + concept: hmrc.cgt_badr_ir_qualifying_gains + source_concept: hmrc.cgt_badr_ir_qualifying_gains + concept_relation: source_label + concept_authority: hmrc + concept_evidence_url: https://www.gov.uk/government/statistics/capital-gains-tax-statistics + concept_evidence_notes: HMRC Capital Gains Tax statistics 2026, Table 4. Gains are before deducting + losses and the Annual Exempt Amount. Counts are thousands; gains and tax are GBP millions. Totals + may not sum due to rounding. Provisional figures are updated for late and amended returns. + unit: gbp + aggregation: sum + expected_cell_type: number + value_scale: 1000000 + - measure_id: tax + label: Tax charged at the BADR/IR rate + ordinal: 2 + column: D + source_column_id: tax + expected_column_header_row: 7 + expected_column_header: Tax charged at BADR/IR rate + concept: hmrc.cgt_badr_ir_tax + source_concept: hmrc.cgt_badr_ir_tax + concept_relation: source_label + concept_authority: hmrc + concept_evidence_url: https://www.gov.uk/government/statistics/capital-gains-tax-statistics + concept_evidence_notes: HMRC Capital Gains Tax statistics 2026, Table 4. Gains are before deducting + losses and the Annual Exempt Amount. Counts are thousands; gains and tax are GBP millions. Totals + may not sum due to rounding. Provisional figures are updated for late and amended returns. + unit: gbp + aggregation: sum + expected_cell_type: number + value_scale: 1000000 +- record_set_id: hmrc.cgt_badr_ir_2026.table4_1.ty2024.all_total + provenance_class: administrative + assertion: observation + record_set_spec_id: hmrc.cgt_badr_ir_2026.table4_1.ty2024.all_total.v1 + source_record_id_prefix: hmrc.cgt_badr_ir_2026.table4_1.ty2024 + sheet_name: 4_1_2024-25 + period_type: tax_year + period: 2024 + period_coverage: + basis: tax + source_period_label: 2024 to 2025 tax year + start_date: '2024-04-06' + end_date: '2025-04-05' + notes: HMRC marks this sheet provisional and updates figures for late and amended returns. + geography_id: K02000001 + geography_level: country + geography_name: United Kingdom + geography_vintage: current + entity: person + entity_role: taxpayer + domain: capital_gains_tax + groupby_dimension: cgt_badr_ir_gain_band + rows: + - value_id: all_total + label: All total + ordinal: 10 + row_number: 18 + expected_row_header_column: A + expected_row_header: All (Total) + table_record_kind: total + filters: + cgt_badr_ir_gain_band: total + taxpayer_type: all + constraints: + - variable: cgt_badr_ir_gain_band + operator: == + value: total + label: BADR/IR qualifying gain band + - variable: taxpayer_type + operator: == + value: all + label: Taxpayer type + measures: + - measure_id: taxpayers + label: BADR/IR liable taxpayers + ordinal: 0 + column: B + source_column_id: taxpayers + expected_column_header_row: 7 + expected_column_header: Number of BADR/IR liable taxpayers + concept: hmrc.cgt_badr_ir_taxpayers + source_concept: hmrc.cgt_badr_ir_taxpayers + concept_relation: source_label + concept_authority: hmrc + concept_evidence_url: https://www.gov.uk/government/statistics/capital-gains-tax-statistics + concept_evidence_notes: HMRC Capital Gains Tax statistics 2026, Table 4. Gains are before deducting + losses and the Annual Exempt Amount. Counts are thousands; gains and tax are GBP millions. Totals + may not sum due to rounding. Provisional figures are updated for late and amended returns. + unit: count + aggregation: sum + expected_cell_type: number + value_scale: 1000 + - measure_id: gains + label: Gains qualifying for BADR or Investors' Relief + ordinal: 1 + column: C + source_column_id: gains + expected_column_header_row: 7 + expected_column_header: Gains on which BADR/IR claimed + concept: hmrc.cgt_badr_ir_qualifying_gains + source_concept: hmrc.cgt_badr_ir_qualifying_gains + concept_relation: source_label + concept_authority: hmrc + concept_evidence_url: https://www.gov.uk/government/statistics/capital-gains-tax-statistics + concept_evidence_notes: HMRC Capital Gains Tax statistics 2026, Table 4. Gains are before deducting + losses and the Annual Exempt Amount. Counts are thousands; gains and tax are GBP millions. Totals + may not sum due to rounding. Provisional figures are updated for late and amended returns. + unit: gbp + aggregation: sum + expected_cell_type: number + value_scale: 1000000 + - measure_id: tax + label: Tax charged at the BADR/IR rate + ordinal: 2 + column: D + source_column_id: tax + expected_column_header_row: 7 + expected_column_header: Tax charged at BADR/IR rate + concept: hmrc.cgt_badr_ir_tax + source_concept: hmrc.cgt_badr_ir_tax + concept_relation: source_label + concept_authority: hmrc + concept_evidence_url: https://www.gov.uk/government/statistics/capital-gains-tax-statistics + concept_evidence_notes: HMRC Capital Gains Tax statistics 2026, Table 4. Gains are before deducting + losses and the Annual Exempt Amount. Counts are thousands; gains and tax are GBP millions. Totals + may not sum due to rounding. Provisional figures are updated for late and amended returns. + unit: gbp + aggregation: sum + expected_cell_type: number + value_scale: 1000000 diff --git a/tests/test_chronicle_bundle.py b/tests/test_chronicle_bundle.py index 38ac821f..4d6fcd36 100644 --- a/tests/test_chronicle_bundle.py +++ b/tests/test_chronicle_bundle.py @@ -93,6 +93,7 @@ def fake_build_bundle(output_dir, **kwargs): assert "hmrc-cgt-size-of-gain-2025" not in UK_BUNDLE_SOURCES assert "hmrc-cgt-asset-type-2026" in UK_BUNDLE_SOURCES assert "hmrc-cgt-residential-property-2026" in UK_BUNDLE_SOURCES + assert "hmrc-cgt-badr-ir-2026" in UK_BUNDLE_SOURCES assert "hmrc-cgt-carried-interest-2026" in UK_BUNDLE_SOURCES assert tuple(captured["sources"]) == UK_BUNDLE_SOURCES assert captured["output_dir"] == tmp_path / "bundle" @@ -135,13 +136,13 @@ def test_build_bundle_writes_merged_consumer_contract(tmp_path): "aggregate_duplicate_key_count": 0, "entity_count": 12, "error_count": 0, - "fact_count": 350767, + "fact_count": 350893, "geography_count": 12592, "period_count": 494, "semantic_duplicate_key_count": 467, "skipped_source_count": 10, "source_count": 50, - "source_package_count": 226, + "source_package_count": 227, # 1 semantic-duplicate warning, plus the publisher wording Chronicle # keeps as published: values two packages word differently, groupby # rows that drift inside one package (chronicle#265, #266), and the @@ -149,7 +150,7 @@ def test_build_bundle_writes_merged_consumer_contract(tmp_path): # it does has stopped warning (chronicle#281). "warning_count": 76, } - assert len(rows) == 350767 + assert len(rows) == 350893 assert {row["provenance_class"] for row in rows} <= { "administrative", "census", @@ -167,7 +168,7 @@ def test_build_bundle_writes_merged_consumer_contract(tmp_path): ) assert rows[0]["aggregate_fact_key"].startswith("ledger.aggregate_fact.v2:") assert rows[0]["semantic_fact_key"].startswith("ledger.semantic_fact.v2:") - assert source_packages["source_package_count"] == 226 + assert source_packages["source_package_count"] == 227 assert source_packages["skipped_source_count"] == 10 assert sorted(item["source"] for item in source_packages["skipped_sources"]) == [ "census-acs-s0101-congressional-district-age-2024", @@ -181,7 +182,7 @@ def test_build_bundle_writes_merged_consumer_contract(tmp_path): "jct-obbba-revenue-estimates-2025", "jct-tax-expenditures-2024", ] - assert coverage["fact_count"] == 350767 + assert coverage["fact_count"] == 350893 assert coverage["counts"]["by_source"] == { "bea": 445, "bfp_economic_outlook": 5, @@ -204,7 +205,7 @@ def test_build_bundle_writes_merged_consumer_contract(tmp_path): "fpb_economic_outlook": 1000, "hhs_acf_liheap": 2, "hhs_acf_tanf": 110, - "hmrc": 31217, + "hmrc": 31343, "ici": 12, "irs_soi": 40063, "isc": 2, @@ -235,7 +236,14 @@ def test_build_bundle_writes_merged_consumer_contract(tmp_path): "welshgov": 9325, } table_counts = coverage["counts"]["by_source_table"] - assert len(table_counts) == 221 + assert len(table_counts) == 222 + assert ( + table_counts[ + "hmrc:Capital Gains Tax statistics Table 4: BADR and Investors' " + "Relief by size of qualifying gain" + ] + == 126 + ) assert ( table_counts[ "dwp:Households on Universal Credit by family type, " @@ -941,10 +949,10 @@ def test_build_bundle_writes_merged_consumer_contract(tmp_path): "tax_year:2018": 11, "tax_year:2019": 11, "tax_year:2020": 11, - "tax_year:2021": 11, - "tax_year:2022": 41239, - "tax_year:2023": 63310, - "tax_year:2024": 296, + "tax_year:2021": 42, + "tax_year:2022": 41270, + "tax_year:2023": 63342, + "tax_year:2024": 328, } for fiscal_year in range(2017, 2026): key = f"fiscal_year:{fiscal_year}" @@ -1195,7 +1203,7 @@ def test_build_bundle_writes_merged_consumer_contract(tmp_path): assert ( coverage["counts"]["by_geography"]["congressional_district:5001700US0601"] == 56 ) - assert coverage["counts"]["by_geography"]["country:K02000001"] == 10500 + assert coverage["counts"]["by_geography"]["country:K02000001"] == 10626 assert coverage["counts"]["by_geography"]["country:E92000001"] == 4053 assert coverage["counts"]["by_geography"]["country:K03000001"] == 9606 assert coverage["counts"]["by_geography"]["statistical_scope:ofgem:london"] == 216 @@ -1209,7 +1217,7 @@ def test_build_bundle_writes_merged_consumer_contract(tmp_path): "household": 53521, "institutional_sector": 1263, "pension_plan": 2, - "person": 74682, + "person": 74808, "return": 14600, "social_protection_scheme": 36, "tax_unit": 41368, @@ -1296,6 +1304,7 @@ def test_build_bundle_writes_merged_consumer_contract(tmp_path): "dfc-ni-uc-statistics-may-2026", "hmrc-cgt-age-2026", "hmrc-cgt-asset-type-2026", + "hmrc-cgt-badr-ir-2026", "hmrc-cgt-carried-interest-2026", "hmrc-cgt-country-region-2026", "hmrc-cgt-gain-by-income-2026", diff --git a/tests/test_chronicle_source_package.py b/tests/test_chronicle_source_package.py index de8f4b9c..60332610 100644 --- a/tests/test_chronicle_source_package.py +++ b/tests/test_chronicle_source_package.py @@ -355,6 +355,101 @@ def test_hmrc_cgt_size_of_gain_package_builds_microcosm_visible_band_facts(): assert row["observed_measure"]["source_concept"] == ("hmrc.cgt_gains_individuals") +def test_hmrc_cgt_badr_ir_table4_preserves_bands_totals_and_suppression(): + """Table 4 values follow HMRC's 2026 workbook, including its suppressed cells.""" + workbook = ( + REPO_ROOT + / "db/data/hmrc/cgt_badr_ir_2026" + / "Table_4_2026_Business_asset_disposal_and_investors_reliefs.ods" + ) + assert hashlib.sha256(workbook.read_bytes()).hexdigest() == ( + "7bd0098913e44e3c79a533690cd25ee08f627cd72935c46a874a7eab5442d5ca" + ) + package = load_source_package("hmrc-cgt-badr-ir-2026") + report = validate_source_package("hmrc-cgt-badr-ir-2026", year=2026) + assert report.valid, report.errors + + cells = package.build_source_cells(2026) + facts = package.build_facts(2026, cells=cells) + assert validate_source_cells(cells).valid + assert validate_facts(facts).valid + assert validate_consumer_fact_contract(facts).valid + assert len(facts) == 126 # 4 x 11 x 3 cells less 6 publisher suppressions. + assert {fact.period.value for fact in facts} == {2021, 2022, 2023, 2024} + assert {fact.period.type for fact in facts} == {"tax_year"} + assert {fact.provenance_class for fact in facts} == {"administrative"} + assert {fact.entity.name for fact in facts} == {"person"} + assert {fact.entity.role for fact in facts} == {"taxpayer"} + assert {fact.measure.concept for fact in facts} == { + "hmrc.cgt_badr_ir_taxpayers", + "hmrc.cgt_badr_ir_qualifying_gains", + "hmrc.cgt_badr_ir_tax", + } + + by_id = {fact.source_record_id: fact for fact in facts} + prefix = "hmrc.cgt_badr_ir_2026.table4_1.ty2024" + assert by_id[f"{prefix}.gain_1000000_plus.gains"].value == 6_787_000_000 + assert by_id[f"{prefix}.individuals_total.gains"].value == 18_443_000_000 + assert by_id[f"{prefix}.individuals_total.tax"].value == 1_821_000_000 + assert by_id[f"{prefix}.all_total.gains"].value == 18_475_000_000 + assert by_id[f"{prefix}.trusts_total.gains"].value == 32_000_000 + assert by_id[f"{prefix}.individuals_total.taxpayers"].value == 61_000 + published_2024_bands = ( + ("gain_0_to_9999", 5, 32, 2), + ("gain_10000_to_24999", 8, 129, 11), + ("gain_25000_to_49999", 6, 224, 21), + ("gain_50000_to_99999", 8, 575, 55), + ("gain_100000_to_249999", 11, 1_866, 182), + ("gain_250000_to_499999", 8, 2_901, 285), + ("gain_500000_to_999999", 8, 5_929, 588), + ("gain_1000000_plus", 7, 6_787, 678), + ) + for band, taxpayers, gains, tax in published_2024_bands: + assert by_id[f"{prefix}.{band}.taxpayers"].value == taxpayers * 1_000 + assert by_id[f"{prefix}.{band}.gains"].value == gains * 1_000_000 + assert by_id[f"{prefix}.{band}.tax"].value == tax * 1_000_000 + assert by_id[f"{prefix}.gain_1000000_plus.gains"].filters == { + "cgt_badr_ir_gain_band": "gain_1000000_plus", + "taxpayer_type": "individuals", + } + assert by_id[f"{prefix}.individuals_total.gains"].filters == { + "cgt_badr_ir_gain_band": "total", + "taxpayer_type": "individuals", + } + + assert all(".trusts_total.taxpayers" not in key for key in by_id) + for year, table in ((2021, "4_4"), (2022, "4_3")): + assert ( + f"hmrc.cgt_badr_ir_2026.table{table}.ty{year}.gain_0_to_9999.tax" + not in by_id + ) + for year, table, taxpayers, gains, tax in ( + (2021, "4_4", 48, 12_708, 1_220), + (2022, "4_3", 45, 12_606, 1_211), + (2023, "4_2", 42, 11_036, 1_077), + ): + total = f"hmrc.cgt_badr_ir_2026.table{table}.ty{year}.individuals_total" + assert by_id[f"{total}.taxpayers"].value == taxpayers * 1_000 + assert by_id[f"{total}.gains"].value == gains * 1_000_000 + assert by_id[f"{total}.tax"].value == tax * 1_000_000 + source_cells = {(cell.sheet_name, cell.address): cell for cell in cells} + for sheet, row in ( + ("4_1_2024-25", 17), + ("4_2_2023-24", 17), + ("4_3_2022-23", 17), + ("4_4_2021-22", 16), + ): + assert source_cells[(sheet, f"B{row}")].raw_value == "[Fewer than 1]" + assert source_cells[("4_3_2022-23", "D8")].raw_value == "[Less than 1]" + assert source_cells[("4_4_2021-22", "D7")].raw_value == "[Less than 1]" + assert by_id[f"{prefix}.individuals_total.gains"].period_coverage.start_date == ( + "2024-04-06" + ) + assert by_id[f"{prefix}.individuals_total.gains"].period_coverage.end_date == ( + "2025-04-05" + ) + + def test_dft_bus05i_package_preserves_2023_to_2025_revenue_and_support(): """BUS05i facts retain publisher periods and area definitions.""" report = validate_source_package("dft-bus05i-revenue-support-2025", year=2025)