diff --git a/changelog.d/1795.fixed.md b/changelog.d/1795.fixed.md new file mode 100644 index 0000000000..5c778366a7 --- /dev/null +++ b/changelog.d/1795.fixed.md @@ -0,0 +1 @@ +- Updated the Scottish Additional Dwelling Supplement to 8% for annual model years from 2025, retaining its statutory 5 December 2024 parameter date. diff --git a/policyengine_uk/parameters/gov/revenue_scotland/lbtt/residential/README.md b/policyengine_uk/parameters/gov/revenue_scotland/lbtt/residential/README.md index a95cd5ccd6..4dd344a612 100644 --- a/policyengine_uk/parameters/gov/revenue_scotland/lbtt/residential/README.md +++ b/policyengine_uk/parameters/gov/revenue_scotland/lbtt/residential/README.md @@ -1 +1,20 @@ # Residential + +## Additional Dwelling Supplement + +[SSI 2024/367, articles 1–3](https://www.legislation.gov.uk/ssi/2024/367/made) +raises the supplement from 6% to 8% for transactions with an effective date +on or after 5 December 2024. Transactions under contracts entered into on or +before 4 December 2024 retain the previous 6% rate, even if their effective +date is later. [Revenue Scotland's guidance](https://revenue.scot/taxes/land-buildings-transaction-tax/additional-dwelling-supplement-ads) +confirms the rate and transition. + +The parameter retains the statutory 5 December 2024 change date. The model's +existing annual transactional-tax convention samples parameters on 30 April, +so annual 2024 calculations use 6% and annual 2025 onward calculations use +8%. The annual household purchase inputs have no contract or effective-date +field: they cannot select protected contracts or distinguish purchases before +and after the December change within 2024. These annual calculations do not +represent every actual transaction in those years. The rate update preserves +that convention and does not introduce a blended annual rate or new date +inputs. diff --git a/policyengine_uk/parameters/gov/revenue_scotland/lbtt/residential/additional_residence_surcharge.yaml b/policyengine_uk/parameters/gov/revenue_scotland/lbtt/residential/additional_residence_surcharge.yaml index d334549514..2e70fcd2c1 100644 --- a/policyengine_uk/parameters/gov/revenue_scotland/lbtt/residential/additional_residence_surcharge.yaml +++ b/policyengine_uk/parameters/gov/revenue_scotland/lbtt/residential/additional_residence_surcharge.yaml @@ -3,6 +3,17 @@ values: 2016-04-01: 0.03 2019-01-25: 0.04 2022-12-16: 0.06 + # The annual model samples 30 April; the raw statutory date remains here. + # Pre-5 December contracts protected by article 3 cannot be selected + # individually without contract/effective-date inputs (see README.md). + 2024-12-05: + value: 0.08 + metadata: + reference: + - title: The Land and Buildings Transaction Tax (additional amount) (Scotland) Amendment Order 2024, arts. 1–3 + href: https://www.legislation.gov.uk/ssi/2024/367/made + - title: Revenue Scotland, ADS rates and transitional provision + href: https://revenue.scot/taxes/land-buildings-transaction-tax/additional-dwelling-supplement-ads metadata: unit: /1 label: Lbtt fixed rate increase for secondary residences diff --git a/policyengine_uk/tests/policy/baseline/gov/revenue_scotland/lbtt/additional_dwelling_supplement.yaml b/policyengine_uk/tests/policy/baseline/gov/revenue_scotland/lbtt/additional_dwelling_supplement.yaml new file mode 100644 index 0000000000..00872b8afb --- /dev/null +++ b/policyengine_uk/tests/policy/baseline/gov/revenue_scotland/lbtt/additional_dwelling_supplement.yaml @@ -0,0 +1,90 @@ +# SSI 2024/367 arts1–3:8% from5December2024 for unprotected contracts. +# https://www.legislation.gov.uk/ssi/2024/367/made +# Existing annual transactional-tax convention samples30April, so2024 +# retains6% and2025onward uses8%. These cases do not simulate actual +# late2024transaction dates or the protected pre5December contract rule. +# A £300,000 purchase's unchanged ordinary LBTT is£4,600: +# £105,000*2%+£50,000*5% (SSI2015/126 TableA). +# ADS adds£18,000 at6%, or£24,000 at8%. Purchase/rent inputs are explicit; +# no liability flag, intermediate tax or property stock is forced. + +- name: Annual 2024 additional purchase retains the April sample at six percent + period: 2024 + absolute_error_margin: 0.01 + input: + age: 45 + region: SCOTLAND + main_residential_property_purchased: 0 + additional_residential_property_purchased: 300_000 + non_residential_property_purchased: 0 + rent: 0 + cumulative_residential_rent: 0 + non_residential_rent: 0 + cumulative_non_residential_rent: 0 + output: + land_and_buildings_transaction_tax: 22_600 + +- name: Annual 2025 additional purchase pays eight percent ADS + period: 2025 + absolute_error_margin: 0.01 + input: + age: 45 + region: SCOTLAND + main_residential_property_purchased: 0 + additional_residential_property_purchased: 300_000 + non_residential_property_purchased: 0 + rent: 0 + cumulative_residential_rent: 0 + non_residential_rent: 0 + cumulative_non_residential_rent: 0 + output: + land_and_buildings_transaction_tax: 28_600 + +- name: Annual 2026 additional purchase retains eight percent ADS + period: 2026 + absolute_error_margin: 0.01 + input: + age: 45 + region: SCOTLAND + main_residential_property_purchased: 0 + additional_residential_property_purchased: 300_000 + non_residential_property_purchased: 0 + rent: 0 + cumulative_residential_rent: 0 + non_residential_rent: 0 + cumulative_non_residential_rent: 0 + output: + land_and_buildings_transaction_tax: 28_600 + +- name: Ordinary main-home purchase receives no ADS + period: 2025 + absolute_error_margin: 0.01 + input: + age: 45 + region: SCOTLAND + main_residential_property_purchased: 300_000 + main_residential_property_purchased_is_first_home: false + additional_residential_property_purchased: 0 + non_residential_property_purchased: 0 + rent: 0 + cumulative_residential_rent: 0 + non_residential_rent: 0 + cumulative_non_residential_rent: 0 + output: + land_and_buildings_transaction_tax: 4_600 + +- name: English purchase has no Scottish LBTT liability + period: 2025 + absolute_error_margin: 0.01 + input: + age: 45 + region: LONDON + main_residential_property_purchased: 0 + additional_residential_property_purchased: 300_000 + non_residential_property_purchased: 0 + rent: 0 + cumulative_residential_rent: 0 + non_residential_rent: 0 + cumulative_non_residential_rent: 0 + output: + land_and_buildings_transaction_tax: 0 diff --git a/policyengine_uk/tests/test_lbtt_additional_dwelling_rate.py b/policyengine_uk/tests/test_lbtt_additional_dwelling_rate.py new file mode 100644 index 0000000000..ee182e5059 --- /dev/null +++ b/policyengine_uk/tests/test_lbtt_additional_dwelling_rate.py @@ -0,0 +1,48 @@ +"""ADS statutory date and the existing annual transactional-tax convention. + +SSI 2024/367 arts1–3 changes6% to8% from5December2024, with protection +for contracts entered on/before4December. Annual purchase inputs have no +contract/effective date; processed parameters sample30April, so these +annual readings cannot select protected contracts or late2024 purchases. +""" + +from pathlib import Path + +import pytest +import yaml +from policyengine_core.parameters import Parameter + +import policyengine_uk +from policyengine_uk import CountryTaxBenefitSystem + +PATH = "gov.revenue_scotland.lbtt.residential.additional_residence_surcharge" +FILE = ( + Path(policyengine_uk.__file__).parent + / "parameters/gov/revenue_scotland/lbtt/residential/additional_residence_surcharge.yaml" +) + + +def test_raw_ads_rate_keeps_history_and_changes_on_5_december_2024(): + data = yaml.safe_load(FILE.read_text()) + data["values"] = {str(date): value for date, value in data["values"].items()} + raw = Parameter(PATH, data=data, file_path=str(FILE)) + for date, expected in [ + ("2016-04-01", 0.03), + ("2019-01-25", 0.04), + ("2022-12-16", 0.06), + ("2024-12-04", 0.06), + ("2024-12-05", 0.08), + ]: + assert raw(date) == expected, date + assert not raw.metadata.get("fiscal_year_blend", False) + assert not raw.metadata.get("preserve_calendar_dates", False) + + +@pytest.fixture(scope="module") +def system(): + return CountryTaxBenefitSystem() + + +@pytest.mark.parametrize("year,expected", [(2024, 0.06), (2025, 0.08), (2026, 0.08)]) +def test_annual_ads_rate_preserves_april30_sampling(system, year, expected): + assert system.parameters.get_child(PATH)(f"{year}-01-01") == expected