From 24f2ab34f7aa8ae38336cc15d58941f06ae2e9c1 Mon Sep 17 00:00:00 2001 From: Vahid Ahmadi Date: Wed, 12 Nov 2025 14:30:58 +0100 Subject: [PATCH 1/3] Add provincial tax credit programs --- .../gov/provinces/ab/benefits/benefits.yaml | 3 + .../seniors_benefit/max_amount/couple.yaml | 11 ++ .../seniors_benefit/max_amount/single.yaml | 11 ++ .../seniors_benefit/reduction_rate.yaml | 10 ++ .../seniors_benefit/threshold/couple.yaml | 11 ++ .../seniors_benefit/threshold/single.yaml | 11 ++ .../bc/tax/income/credits/refundable.yaml | 4 + .../credits/sales_tax_credit/amount.yaml | 10 ++ .../sales_tax_credit/reduction_rate.yaml | 10 ++ .../sales_tax_credit/threshold/couple.yaml | 10 ++ .../sales_tax_credit/threshold/single.yaml | 10 ++ .../solidarity/housing/couple_base.yaml | 10 ++ .../solidarity/housing/reduction_rate.yaml | 10 ++ .../solidarity/housing/single_base.yaml | 10 ++ .../housing/single_parent_base.yaml | 10 ++ .../credits/solidarity/housing/threshold.yaml | 10 ++ .../solidarity/qst/per_person_amount.yaml | 10 ++ .../solidarity/qst/reduction_rate.yaml | 10 ++ .../credits/solidarity/qst/threshold.yaml | 10 ++ .../ab_seniors_benefit.yaml | 109 ++++++++++++++++++ .../bc_sales_tax_credit.yaml | 79 +++++++++++++ .../solidarity/qc_solidarity_tax_credit.yaml | 79 +++++++++++++ .../ab_seniors_benefit/ab_seniors_benefit.py | 17 +++ .../ab_seniors_benefit_base.py | 20 ++++ .../ab_seniors_benefit_eligible.py | 18 +++ .../ab_seniors_benefit_reduction.py | 25 ++++ .../bc_sales_tax_credit.py | 16 +++ .../bc_sales_tax_credit_base.py | 21 ++++ .../bc_sales_tax_credit_reduction.py | 27 +++++ .../qc_solidarity_housing_component.py | 32 +++++ .../solidarity/qc_solidarity_qst_component.py | 26 +++++ .../solidarity/qc_solidarity_tax_credit.py | 16 +++ 32 files changed, 666 insertions(+) create mode 100644 policyengine_canada/parameters/gov/provinces/ab/benefits/seniors_benefit/max_amount/couple.yaml create mode 100644 policyengine_canada/parameters/gov/provinces/ab/benefits/seniors_benefit/max_amount/single.yaml create mode 100644 policyengine_canada/parameters/gov/provinces/ab/benefits/seniors_benefit/reduction_rate.yaml create mode 100644 policyengine_canada/parameters/gov/provinces/ab/benefits/seniors_benefit/threshold/couple.yaml create mode 100644 policyengine_canada/parameters/gov/provinces/ab/benefits/seniors_benefit/threshold/single.yaml create mode 100644 policyengine_canada/parameters/gov/provinces/bc/tax/income/credits/sales_tax_credit/amount.yaml create mode 100644 policyengine_canada/parameters/gov/provinces/bc/tax/income/credits/sales_tax_credit/reduction_rate.yaml create mode 100644 policyengine_canada/parameters/gov/provinces/bc/tax/income/credits/sales_tax_credit/threshold/couple.yaml create mode 100644 policyengine_canada/parameters/gov/provinces/bc/tax/income/credits/sales_tax_credit/threshold/single.yaml create mode 100644 policyengine_canada/parameters/gov/provinces/qc/tax/income/credits/solidarity/housing/couple_base.yaml create mode 100644 policyengine_canada/parameters/gov/provinces/qc/tax/income/credits/solidarity/housing/reduction_rate.yaml create mode 100644 policyengine_canada/parameters/gov/provinces/qc/tax/income/credits/solidarity/housing/single_base.yaml create mode 100644 policyengine_canada/parameters/gov/provinces/qc/tax/income/credits/solidarity/housing/single_parent_base.yaml create mode 100644 policyengine_canada/parameters/gov/provinces/qc/tax/income/credits/solidarity/housing/threshold.yaml create mode 100644 policyengine_canada/parameters/gov/provinces/qc/tax/income/credits/solidarity/qst/per_person_amount.yaml create mode 100644 policyengine_canada/parameters/gov/provinces/qc/tax/income/credits/solidarity/qst/reduction_rate.yaml create mode 100644 policyengine_canada/parameters/gov/provinces/qc/tax/income/credits/solidarity/qst/threshold.yaml create mode 100644 policyengine_canada/tests/gov/provinces/ab/benefits/ab_seniors_benefit/ab_seniors_benefit.yaml create mode 100644 policyengine_canada/tests/gov/provinces/bc/tax/income/credits/bc_sales_tax_credit/bc_sales_tax_credit.yaml create mode 100644 policyengine_canada/tests/gov/provinces/qc/tax/income/credits/solidarity/qc_solidarity_tax_credit.yaml create mode 100644 policyengine_canada/variables/gov/provinces/ab/benefits/ab_seniors_benefit/ab_seniors_benefit.py create mode 100644 policyengine_canada/variables/gov/provinces/ab/benefits/ab_seniors_benefit/ab_seniors_benefit_base.py create mode 100644 policyengine_canada/variables/gov/provinces/ab/benefits/ab_seniors_benefit/ab_seniors_benefit_eligible.py create mode 100644 policyengine_canada/variables/gov/provinces/ab/benefits/ab_seniors_benefit/ab_seniors_benefit_reduction.py create mode 100644 policyengine_canada/variables/gov/provinces/bc/tax/income/credits/bc_sales_tax_credit/bc_sales_tax_credit.py create mode 100644 policyengine_canada/variables/gov/provinces/bc/tax/income/credits/bc_sales_tax_credit/bc_sales_tax_credit_base.py create mode 100644 policyengine_canada/variables/gov/provinces/bc/tax/income/credits/bc_sales_tax_credit/bc_sales_tax_credit_reduction.py create mode 100644 policyengine_canada/variables/gov/provinces/qc/tax/income/credits/solidarity/qc_solidarity_housing_component.py create mode 100644 policyengine_canada/variables/gov/provinces/qc/tax/income/credits/solidarity/qc_solidarity_qst_component.py create mode 100644 policyengine_canada/variables/gov/provinces/qc/tax/income/credits/solidarity/qc_solidarity_tax_credit.py diff --git a/policyengine_canada/parameters/gov/provinces/ab/benefits/benefits.yaml b/policyengine_canada/parameters/gov/provinces/ab/benefits/benefits.yaml index 815e118ce..46c471c6f 100644 --- a/policyengine_canada/parameters/gov/provinces/ab/benefits/benefits.yaml +++ b/policyengine_canada/parameters/gov/provinces/ab/benefits/benefits.yaml @@ -1,5 +1,8 @@ description: Alberta list of benefits. values: + 2024-01-01: + - alberta_child_and_family_benefit + - ab_seniors_benefit 2022-01-01: - alberta_child_and_family_benefit diff --git a/policyengine_canada/parameters/gov/provinces/ab/benefits/seniors_benefit/max_amount/couple.yaml b/policyengine_canada/parameters/gov/provinces/ab/benefits/seniors_benefit/max_amount/couple.yaml new file mode 100644 index 000000000..8077f0577 --- /dev/null +++ b/policyengine_canada/parameters/gov/provinces/ab/benefits/seniors_benefit/max_amount/couple.yaml @@ -0,0 +1,11 @@ +description: Alberta Seniors Benefit maximum amount for senior couples +values: + 2024-01-01: 5687 + 2025-01-01: 5756 + +metadata: + unit: currency-CAD + label: Alberta Seniors Benefit maximum (couple) + reference: + - title: Alberta Seniors Benefit + href: https://www.alberta.ca/alberta-seniors-benefit diff --git a/policyengine_canada/parameters/gov/provinces/ab/benefits/seniors_benefit/max_amount/single.yaml b/policyengine_canada/parameters/gov/provinces/ab/benefits/seniors_benefit/max_amount/single.yaml new file mode 100644 index 000000000..ac5ce1c93 --- /dev/null +++ b/policyengine_canada/parameters/gov/provinces/ab/benefits/seniors_benefit/max_amount/single.yaml @@ -0,0 +1,11 @@ +description: Alberta Seniors Benefit maximum amount for single seniors +values: + 2024-01-01: 3792 + 2025-01-01: 5756 + +metadata: + unit: currency-CAD + label: Alberta Seniors Benefit maximum (single) + reference: + - title: Alberta Seniors Benefit + href: https://www.alberta.ca/alberta-seniors-benefit diff --git a/policyengine_canada/parameters/gov/provinces/ab/benefits/seniors_benefit/reduction_rate.yaml b/policyengine_canada/parameters/gov/provinces/ab/benefits/seniors_benefit/reduction_rate.yaml new file mode 100644 index 000000000..a4db6299b --- /dev/null +++ b/policyengine_canada/parameters/gov/provinces/ab/benefits/seniors_benefit/reduction_rate.yaml @@ -0,0 +1,10 @@ +description: Alberta Seniors Benefit reduction rate ($0.1561 per $1 of income) +values: + 2024-01-01: 0.1561 + +metadata: + unit: /1 + label: Alberta Seniors Benefit reduction rate + reference: + - title: Alberta Seniors Benefit + href: https://www.alberta.ca/alberta-seniors-benefit diff --git a/policyengine_canada/parameters/gov/provinces/ab/benefits/seniors_benefit/threshold/couple.yaml b/policyengine_canada/parameters/gov/provinces/ab/benefits/seniors_benefit/threshold/couple.yaml new file mode 100644 index 000000000..072579234 --- /dev/null +++ b/policyengine_canada/parameters/gov/provinces/ab/benefits/seniors_benefit/threshold/couple.yaml @@ -0,0 +1,11 @@ +description: Alberta Seniors Benefit income threshold for senior couples +values: + 2024-01-01: 56820 + 2025-01-01: 54640 + +metadata: + unit: currency-CAD + label: Alberta Seniors Benefit threshold (couple) + reference: + - title: Alberta Seniors Benefit + href: https://www.alberta.ca/alberta-seniors-benefit diff --git a/policyengine_canada/parameters/gov/provinces/ab/benefits/seniors_benefit/threshold/single.yaml b/policyengine_canada/parameters/gov/provinces/ab/benefits/seniors_benefit/threshold/single.yaml new file mode 100644 index 000000000..a0b329966 --- /dev/null +++ b/policyengine_canada/parameters/gov/provinces/ab/benefits/seniors_benefit/threshold/single.yaml @@ -0,0 +1,11 @@ +description: Alberta Seniors Benefit income threshold for single seniors +values: + 2024-01-01: 34770 + 2025-01-01: 33410 + +metadata: + unit: currency-CAD + label: Alberta Seniors Benefit threshold (single) + reference: + - title: Alberta Seniors Benefit + href: https://www.alberta.ca/alberta-seniors-benefit diff --git a/policyengine_canada/parameters/gov/provinces/bc/tax/income/credits/refundable.yaml b/policyengine_canada/parameters/gov/provinces/bc/tax/income/credits/refundable.yaml index ce313c801..c1088a035 100644 --- a/policyengine_canada/parameters/gov/provinces/bc/tax/income/credits/refundable.yaml +++ b/policyengine_canada/parameters/gov/provinces/bc/tax/income/credits/refundable.yaml @@ -1,5 +1,9 @@ description: British Columbia provides ty of refundable tax credits. values: + 2024-01-01: + - bc_climate_action_tax_credit + - bc_disability_credit + - bc_sales_tax_credit 2022-01-01: - bc_climate_action_tax_credit - bc_disability_credit diff --git a/policyengine_canada/parameters/gov/provinces/bc/tax/income/credits/sales_tax_credit/amount.yaml b/policyengine_canada/parameters/gov/provinces/bc/tax/income/credits/sales_tax_credit/amount.yaml new file mode 100644 index 000000000..e085ee761 --- /dev/null +++ b/policyengine_canada/parameters/gov/provinces/bc/tax/income/credits/sales_tax_credit/amount.yaml @@ -0,0 +1,10 @@ +description: British Columbia sales tax credit amount per eligible person +values: + 2024-01-01: 75 + +metadata: + unit: currency-CAD + label: British Columbia sales tax credit amount + reference: + - title: British Columbia Sales Tax Credit + href: https://www2.gov.bc.ca/gov/content/taxes/income-taxes/personal/credits/sales-tax diff --git a/policyengine_canada/parameters/gov/provinces/bc/tax/income/credits/sales_tax_credit/reduction_rate.yaml b/policyengine_canada/parameters/gov/provinces/bc/tax/income/credits/sales_tax_credit/reduction_rate.yaml new file mode 100644 index 000000000..55ab3f1b2 --- /dev/null +++ b/policyengine_canada/parameters/gov/provinces/bc/tax/income/credits/sales_tax_credit/reduction_rate.yaml @@ -0,0 +1,10 @@ +description: British Columbia sales tax credit reduction rate (2% of income over threshold) +values: + 2024-01-01: 0.02 + +metadata: + unit: /1 + label: BC sales tax credit reduction rate + reference: + - title: British Columbia Sales Tax Credit + href: https://www2.gov.bc.ca/gov/content/taxes/income-taxes/personal/credits/sales-tax diff --git a/policyengine_canada/parameters/gov/provinces/bc/tax/income/credits/sales_tax_credit/threshold/couple.yaml b/policyengine_canada/parameters/gov/provinces/bc/tax/income/credits/sales_tax_credit/threshold/couple.yaml new file mode 100644 index 000000000..9671db9f0 --- /dev/null +++ b/policyengine_canada/parameters/gov/provinces/bc/tax/income/credits/sales_tax_credit/threshold/couple.yaml @@ -0,0 +1,10 @@ +description: British Columbia sales tax credit income threshold for couples +values: + 2024-01-01: 18000 + +metadata: + unit: currency-CAD + label: BC sales tax credit threshold (couple) + reference: + - title: British Columbia Sales Tax Credit + href: https://www2.gov.bc.ca/gov/content/taxes/income-taxes/personal/credits/sales-tax diff --git a/policyengine_canada/parameters/gov/provinces/bc/tax/income/credits/sales_tax_credit/threshold/single.yaml b/policyengine_canada/parameters/gov/provinces/bc/tax/income/credits/sales_tax_credit/threshold/single.yaml new file mode 100644 index 000000000..56c3e357d --- /dev/null +++ b/policyengine_canada/parameters/gov/provinces/bc/tax/income/credits/sales_tax_credit/threshold/single.yaml @@ -0,0 +1,10 @@ +description: British Columbia sales tax credit income threshold for single individuals +values: + 2024-01-01: 15000 + +metadata: + unit: currency-CAD + label: BC sales tax credit threshold (single) + reference: + - title: British Columbia Sales Tax Credit + href: https://www2.gov.bc.ca/gov/content/taxes/income-taxes/personal/credits/sales-tax diff --git a/policyengine_canada/parameters/gov/provinces/qc/tax/income/credits/solidarity/housing/couple_base.yaml b/policyengine_canada/parameters/gov/provinces/qc/tax/income/credits/solidarity/housing/couple_base.yaml new file mode 100644 index 000000000..f4f907155 --- /dev/null +++ b/policyengine_canada/parameters/gov/provinces/qc/tax/income/credits/solidarity/housing/couple_base.yaml @@ -0,0 +1,10 @@ +description: Quebec Solidarity Tax Credit housing component base amount for couples +values: + 2024-01-01: 1222 + +metadata: + unit: currency-CAD + label: QC Solidarity housing base (couple) + reference: + - title: Quebec Solidarity Tax Credit + href: https://www.revenuquebec.ca/en/citizens/tax-credits/solidarity-tax-credit/ diff --git a/policyengine_canada/parameters/gov/provinces/qc/tax/income/credits/solidarity/housing/reduction_rate.yaml b/policyengine_canada/parameters/gov/provinces/qc/tax/income/credits/solidarity/housing/reduction_rate.yaml new file mode 100644 index 000000000..fff13df11 --- /dev/null +++ b/policyengine_canada/parameters/gov/provinces/qc/tax/income/credits/solidarity/housing/reduction_rate.yaml @@ -0,0 +1,10 @@ +description: Quebec Solidarity Tax Credit housing component reduction rate +values: + 2024-01-01: 0.03 + +metadata: + unit: /1 + label: QC Solidarity housing reduction rate + reference: + - title: Quebec Solidarity Tax Credit + href: https://www.revenuquebec.ca/en/citizens/tax-credits/solidarity-tax-credit/ diff --git a/policyengine_canada/parameters/gov/provinces/qc/tax/income/credits/solidarity/housing/single_base.yaml b/policyengine_canada/parameters/gov/provinces/qc/tax/income/credits/solidarity/housing/single_base.yaml new file mode 100644 index 000000000..53e41ab29 --- /dev/null +++ b/policyengine_canada/parameters/gov/provinces/qc/tax/income/credits/solidarity/housing/single_base.yaml @@ -0,0 +1,10 @@ +description: Quebec Solidarity Tax Credit housing component base amount for single individuals +values: + 2024-01-01: 814 + +metadata: + unit: currency-CAD + label: QC Solidarity housing base (single) + reference: + - title: Quebec Solidarity Tax Credit + href: https://www.revenuquebec.ca/en/citizens/tax-credits/solidarity-tax-credit/ diff --git a/policyengine_canada/parameters/gov/provinces/qc/tax/income/credits/solidarity/housing/single_parent_base.yaml b/policyengine_canada/parameters/gov/provinces/qc/tax/income/credits/solidarity/housing/single_parent_base.yaml new file mode 100644 index 000000000..1e69de4fa --- /dev/null +++ b/policyengine_canada/parameters/gov/provinces/qc/tax/income/credits/solidarity/housing/single_parent_base.yaml @@ -0,0 +1,10 @@ +description: Quebec Solidarity Tax Credit housing component base amount for single parents +values: + 2024-01-01: 1222 + +metadata: + unit: currency-CAD + label: QC Solidarity housing base (single parent) + reference: + - title: Quebec Solidarity Tax Credit + href: https://www.revenuquebec.ca/en/citizens/tax-credits/solidarity-tax-credit/ diff --git a/policyengine_canada/parameters/gov/provinces/qc/tax/income/credits/solidarity/housing/threshold.yaml b/policyengine_canada/parameters/gov/provinces/qc/tax/income/credits/solidarity/housing/threshold.yaml new file mode 100644 index 000000000..1f0a614c2 --- /dev/null +++ b/policyengine_canada/parameters/gov/provinces/qc/tax/income/credits/solidarity/housing/threshold.yaml @@ -0,0 +1,10 @@ +description: Quebec Solidarity Tax Credit housing component income threshold +values: + 2024-01-01: 35000 + +metadata: + unit: currency-CAD + label: QC Solidarity housing threshold + reference: + - title: Quebec Solidarity Tax Credit + href: https://www.revenuquebec.ca/en/citizens/tax-credits/solidarity-tax-credit/ diff --git a/policyengine_canada/parameters/gov/provinces/qc/tax/income/credits/solidarity/qst/per_person_amount.yaml b/policyengine_canada/parameters/gov/provinces/qc/tax/income/credits/solidarity/qst/per_person_amount.yaml new file mode 100644 index 000000000..bc691134f --- /dev/null +++ b/policyengine_canada/parameters/gov/provinces/qc/tax/income/credits/solidarity/qst/per_person_amount.yaml @@ -0,0 +1,10 @@ +description: Quebec Solidarity Tax Credit QST component per person amount +values: + 2024-01-01: 306 + +metadata: + unit: currency-CAD + label: QC Solidarity QST per person + reference: + - title: Quebec Solidarity Tax Credit + href: https://www.revenuquebec.ca/en/citizens/tax-credits/solidarity-tax-credit/ diff --git a/policyengine_canada/parameters/gov/provinces/qc/tax/income/credits/solidarity/qst/reduction_rate.yaml b/policyengine_canada/parameters/gov/provinces/qc/tax/income/credits/solidarity/qst/reduction_rate.yaml new file mode 100644 index 000000000..e188324f0 --- /dev/null +++ b/policyengine_canada/parameters/gov/provinces/qc/tax/income/credits/solidarity/qst/reduction_rate.yaml @@ -0,0 +1,10 @@ +description: Quebec Solidarity Tax Credit QST component reduction rate +values: + 2024-01-01: 0.03 + +metadata: + unit: /1 + label: QC Solidarity QST reduction rate + reference: + - title: Quebec Solidarity Tax Credit + href: https://www.revenuquebec.ca/en/citizens/tax-credits/solidarity-tax-credit/ diff --git a/policyengine_canada/parameters/gov/provinces/qc/tax/income/credits/solidarity/qst/threshold.yaml b/policyengine_canada/parameters/gov/provinces/qc/tax/income/credits/solidarity/qst/threshold.yaml new file mode 100644 index 000000000..7356495e1 --- /dev/null +++ b/policyengine_canada/parameters/gov/provinces/qc/tax/income/credits/solidarity/qst/threshold.yaml @@ -0,0 +1,10 @@ +description: Quebec Solidarity Tax Credit QST component income threshold +values: + 2024-01-01: 53425 + +metadata: + unit: currency-CAD + label: QC Solidarity QST threshold + reference: + - title: Quebec Solidarity Tax Credit + href: https://www.revenuquebec.ca/en/citizens/tax-credits/solidarity-tax-credit/ diff --git a/policyengine_canada/tests/gov/provinces/ab/benefits/ab_seniors_benefit/ab_seniors_benefit.yaml b/policyengine_canada/tests/gov/provinces/ab/benefits/ab_seniors_benefit/ab_seniors_benefit.yaml new file mode 100644 index 000000000..7f3156966 --- /dev/null +++ b/policyengine_canada/tests/gov/provinces/ab/benefits/ab_seniors_benefit/ab_seniors_benefit.yaml @@ -0,0 +1,109 @@ +- name: Single senior - no income - maximum benefit + period: 2025 + input: + province_code: AB + age: 65 + individual_net_income: 0 + is_married: false + oas_net: 8_000 + output: + ab_seniors_benefit: 5_756 + +- name: Single senior - under threshold + period: 2025 + input: + province_code: AB + age: 70 + individual_net_income: 30_000 + is_married: false + oas_net: 8_000 + output: + ab_seniors_benefit: 5_756 + +- name: Single senior - at threshold + period: 2025 + input: + province_code: AB + age: 75 + individual_net_income: 33_410 + is_married: false + oas_net: 8_000 + output: + ab_seniors_benefit: 5_756 + +- name: Single senior - partial reduction + period: 2025 + input: + province_code: AB + age: 68 + individual_net_income: 35_000 + is_married: false + oas_net: 8_000 + output: + ab_seniors_benefit: 5_507.801 + +- name: Single senior - high income reduced + period: 2025 + input: + province_code: AB + age: 80 + individual_net_income: 70_000 + is_married: false + oas_net: 8_000 + output: + ab_seniors_benefit: 44.301 + +- name: Couple - maximum benefit + period: 2025 + input: + province_code: AB + age: 65 + individual_net_income: 0 + is_married: true + oas_net: 8_000 + output: + ab_seniors_benefit: 5_756 + +- name: Couple - partial reduction + period: 2025 + input: + province_code: AB + age: 70 + individual_net_income: 55_000 + is_married: true + oas_net: 8_000 + output: + ab_seniors_benefit: 5_699.804 + +- name: Under 65 - not eligible + period: 2025 + input: + province_code: AB + age: 64 + individual_net_income: 0 + is_married: false + oas_net: 0 + output: + ab_seniors_benefit: 0 + +- name: No OAS - not eligible + period: 2025 + input: + province_code: AB + age: 65 + individual_net_income: 0 + is_married: false + oas_net: 0 + output: + ab_seniors_benefit: 0 + +- name: 2024 amounts - single + period: 2024 + input: + province_code: AB + age: 65 + individual_net_income: 20_000 + is_married: false + oas_net: 8_000 + output: + ab_seniors_benefit: 3_792 diff --git a/policyengine_canada/tests/gov/provinces/bc/tax/income/credits/bc_sales_tax_credit/bc_sales_tax_credit.yaml b/policyengine_canada/tests/gov/provinces/bc/tax/income/credits/bc_sales_tax_credit/bc_sales_tax_credit.yaml new file mode 100644 index 000000000..d4e8148ee --- /dev/null +++ b/policyengine_canada/tests/gov/provinces/bc/tax/income/credits/bc_sales_tax_credit/bc_sales_tax_credit.yaml @@ -0,0 +1,79 @@ +- name: Single person - no income + period: 2024 + input: + province_code: BC + age: 25 + individual_net_income: 0 + is_married: false + output: + bc_sales_tax_credit: 75 + +- name: Single person - under threshold + period: 2024 + input: + province_code: BC + age: 30 + individual_net_income: 15_000 + is_married: false + output: + bc_sales_tax_credit: 75 + +- name: Single person - partial reduction + period: 2024 + input: + province_code: BC + age: 35 + individual_net_income: 20_000 + is_married: false + output: + bc_sales_tax_credit: 0 + +- name: Single person - above threshold reduces to zero + period: 2024 + input: + province_code: BC + age: 40 + individual_net_income: 18_750 + is_married: false + output: + bc_sales_tax_credit: 0 + +- name: Couple - under threshold + period: 2024 + input: + province_code: BC + age: 45 + individual_net_income: 18_000 + is_married: true + output: + bc_sales_tax_credit: 75 + +- name: Couple - partial reduction + period: 2024 + input: + province_code: BC + age: 50 + individual_net_income: 20_000 + is_married: true + output: + bc_sales_tax_credit: 35 + +- name: Couple - fully reduced + period: 2024 + input: + province_code: BC + age: 55 + individual_net_income: 25_000 + is_married: true + output: + bc_sales_tax_credit: 0 + +- name: Under 18 - not eligible + period: 2024 + input: + province_code: BC + age: 17 + individual_net_income: 0 + is_married: false + output: + bc_sales_tax_credit: 0 diff --git a/policyengine_canada/tests/gov/provinces/qc/tax/income/credits/solidarity/qc_solidarity_tax_credit.yaml b/policyengine_canada/tests/gov/provinces/qc/tax/income/credits/solidarity/qc_solidarity_tax_credit.yaml new file mode 100644 index 000000000..8dd5908d0 --- /dev/null +++ b/policyengine_canada/tests/gov/provinces/qc/tax/income/credits/solidarity/qc_solidarity_tax_credit.yaml @@ -0,0 +1,79 @@ +- name: Single person - no income - maximum credit + period: 2024 + input: + province_code: QC + household_size: 1 + is_married: false + adjusted_family_net_income: 0 + output: + qc_solidarity_tax_credit: 1_120 + +- name: Single person - under housing threshold + period: 2024 + input: + province_code: QC + household_size: 1 + is_married: false + adjusted_family_net_income: 30_000 + output: + qc_solidarity_tax_credit: 1_120 + +- name: Single person - with housing reduction + period: 2024 + input: + province_code: QC + household_size: 1 + is_married: false + adjusted_family_net_income: 40_000 + output: + qc_solidarity_tax_credit: 970 + +- name: Couple - no income + period: 2024 + input: + province_code: QC + household_size: 2 + is_married: true + adjusted_family_net_income: 0 + output: + qc_solidarity_tax_credit: 1_834 + +- name: Couple - partial reduction + period: 2024 + input: + province_code: QC + household_size: 2 + is_married: true + adjusted_family_net_income: 45_000 + output: + qc_solidarity_tax_credit: 1_534 + +- name: Single parent with one child - no income + period: 2024 + input: + province_code: QC + household_size: 2 + is_married: false + adjusted_family_net_income: 0 + output: + qc_solidarity_tax_credit: 1_834 + +- name: Family with 3 members - high income - reduced + period: 2024 + input: + province_code: QC + household_size: 3 + is_married: true + adjusted_family_net_income: 60_000 + output: + qc_solidarity_tax_credit: 1_192.75 + +- name: Very high income - minimum credit + period: 2024 + input: + province_code: QC + household_size: 1 + is_married: false + adjusted_family_net_income: 100_000 + output: + qc_solidarity_tax_credit: 0 diff --git a/policyengine_canada/variables/gov/provinces/ab/benefits/ab_seniors_benefit/ab_seniors_benefit.py b/policyengine_canada/variables/gov/provinces/ab/benefits/ab_seniors_benefit/ab_seniors_benefit.py new file mode 100644 index 000000000..5ef4a02a6 --- /dev/null +++ b/policyengine_canada/variables/gov/provinces/ab/benefits/ab_seniors_benefit/ab_seniors_benefit.py @@ -0,0 +1,17 @@ +from policyengine_canada.model_api import * + + +class ab_seniors_benefit(Variable): + value_type = float + entity = Person + label = "Alberta Seniors Benefit" + unit = CAD + definition_period = YEAR + defined_for = ProvinceCode.AB + reference = "https://www.alberta.ca/alberta-seniors-benefit" + + def formula(person, period, parameters): + base = person("ab_seniors_benefit_base", period) + reduction = person("ab_seniors_benefit_reduction", period) + eligible = person("ab_seniors_benefit_eligible", period) + return where(eligible, max_(0, base - reduction), 0) diff --git a/policyengine_canada/variables/gov/provinces/ab/benefits/ab_seniors_benefit/ab_seniors_benefit_base.py b/policyengine_canada/variables/gov/provinces/ab/benefits/ab_seniors_benefit/ab_seniors_benefit_base.py new file mode 100644 index 000000000..272fceb90 --- /dev/null +++ b/policyengine_canada/variables/gov/provinces/ab/benefits/ab_seniors_benefit/ab_seniors_benefit_base.py @@ -0,0 +1,20 @@ +from policyengine_canada.model_api import * + + +class ab_seniors_benefit_base(Variable): + value_type = float + entity = Person + label = "Alberta Seniors Benefit base amount" + unit = CAD + documentation = "Maximum Alberta Seniors Benefit amount before income reduction" + definition_period = YEAR + defined_for = ProvinceCode.AB + + def formula(person, period, parameters): + household = person.household + is_married = household("is_married", period) + + p = parameters(period).gov.provinces.ab.benefits.seniors_benefit + + # Different maximum amounts for single vs couple + return where(is_married, p.max_amount.couple, p.max_amount.single) diff --git a/policyengine_canada/variables/gov/provinces/ab/benefits/ab_seniors_benefit/ab_seniors_benefit_eligible.py b/policyengine_canada/variables/gov/provinces/ab/benefits/ab_seniors_benefit/ab_seniors_benefit_eligible.py new file mode 100644 index 000000000..7a7957f88 --- /dev/null +++ b/policyengine_canada/variables/gov/provinces/ab/benefits/ab_seniors_benefit/ab_seniors_benefit_eligible.py @@ -0,0 +1,18 @@ +from policyengine_canada.model_api import * + + +class ab_seniors_benefit_eligible(Variable): + value_type = bool + entity = Person + label = "Eligible for Alberta Seniors Benefit" + definition_period = YEAR + defined_for = ProvinceCode.AB + + def formula(person, period, parameters): + # Must be 65 or older + age = person("age", period) + + # Must be receiving Old Age Security + receives_oas = person("oas_net", period) > 0 + + return (age >= 65) & receives_oas diff --git a/policyengine_canada/variables/gov/provinces/ab/benefits/ab_seniors_benefit/ab_seniors_benefit_reduction.py b/policyengine_canada/variables/gov/provinces/ab/benefits/ab_seniors_benefit/ab_seniors_benefit_reduction.py new file mode 100644 index 000000000..bb29dc259 --- /dev/null +++ b/policyengine_canada/variables/gov/provinces/ab/benefits/ab_seniors_benefit/ab_seniors_benefit_reduction.py @@ -0,0 +1,25 @@ +from policyengine_canada.model_api import * + + +class ab_seniors_benefit_reduction(Variable): + value_type = float + entity = Person + label = "Alberta Seniors Benefit reduction" + unit = CAD + documentation = "Reduction to Alberta Seniors Benefit based on income" + definition_period = YEAR + defined_for = ProvinceCode.AB + + def formula(person, period, parameters): + income = person("individual_net_income", period) + household = person.household + is_married = household("is_married", period) + + p = parameters(period).gov.provinces.ab.benefits.seniors_benefit + + # Income threshold differs for single vs couple + threshold = where(is_married, p.threshold.couple, p.threshold.single) + + # Reduction is $0.1561 for every $1 of income + excess_income = max_(0, income - threshold) + return excess_income * p.reduction_rate diff --git a/policyengine_canada/variables/gov/provinces/bc/tax/income/credits/bc_sales_tax_credit/bc_sales_tax_credit.py b/policyengine_canada/variables/gov/provinces/bc/tax/income/credits/bc_sales_tax_credit/bc_sales_tax_credit.py new file mode 100644 index 000000000..183492e22 --- /dev/null +++ b/policyengine_canada/variables/gov/provinces/bc/tax/income/credits/bc_sales_tax_credit/bc_sales_tax_credit.py @@ -0,0 +1,16 @@ +from policyengine_canada.model_api import * + + +class bc_sales_tax_credit(Variable): + value_type = float + entity = Person + label = "British Columbia sales tax credit" + unit = CAD + definition_period = YEAR + defined_for = ProvinceCode.BC + reference = "https://www2.gov.bc.ca/gov/content/taxes/income-taxes/personal/credits/sales-tax" + + def formula(person, period, parameters): + base = person("bc_sales_tax_credit_base", period) + reduction = person("bc_sales_tax_credit_reduction", period) + return max_(0, base - reduction) diff --git a/policyengine_canada/variables/gov/provinces/bc/tax/income/credits/bc_sales_tax_credit/bc_sales_tax_credit_base.py b/policyengine_canada/variables/gov/provinces/bc/tax/income/credits/bc_sales_tax_credit/bc_sales_tax_credit_base.py new file mode 100644 index 000000000..6e76299df --- /dev/null +++ b/policyengine_canada/variables/gov/provinces/bc/tax/income/credits/bc_sales_tax_credit/bc_sales_tax_credit_base.py @@ -0,0 +1,21 @@ +from policyengine_canada.model_api import * + + +class bc_sales_tax_credit_base(Variable): + value_type = float + entity = Person + label = "British Columbia sales tax credit base" + unit = CAD + documentation = "Base amount of BC sales tax credit before reduction" + definition_period = YEAR + defined_for = ProvinceCode.BC + + def formula(person, period, parameters): + p = parameters( + period + ).gov.provinces.bc.tax.income.credits.sales_tax_credit + # Each person gets the base amount ($75 in 2024) + # Only the individual and their spouse/common-law partner are eligible + household = person.household + is_adult = person("age", period) >= 18 + return where(is_adult, p.amount, 0) diff --git a/policyengine_canada/variables/gov/provinces/bc/tax/income/credits/bc_sales_tax_credit/bc_sales_tax_credit_reduction.py b/policyengine_canada/variables/gov/provinces/bc/tax/income/credits/bc_sales_tax_credit/bc_sales_tax_credit_reduction.py new file mode 100644 index 000000000..7103a1591 --- /dev/null +++ b/policyengine_canada/variables/gov/provinces/bc/tax/income/credits/bc_sales_tax_credit/bc_sales_tax_credit_reduction.py @@ -0,0 +1,27 @@ +from policyengine_canada.model_api import * + + +class bc_sales_tax_credit_reduction(Variable): + value_type = float + entity = Person + label = "British Columbia sales tax credit reduction" + unit = CAD + documentation = "Reduction to BC sales tax credit based on income" + definition_period = YEAR + defined_for = ProvinceCode.BC + + def formula(person, period, parameters): + income = person("individual_net_income", period) + household = person.household + is_married = household("is_married", period) + + p = parameters( + period + ).gov.provinces.bc.tax.income.credits.sales_tax_credit + + # Income threshold differs for single vs couple + threshold = where(is_married, p.threshold.couple, p.threshold.single) + + # Reduction is 2% of income over threshold + excess_income = max_(0, income - threshold) + return excess_income * p.reduction_rate diff --git a/policyengine_canada/variables/gov/provinces/qc/tax/income/credits/solidarity/qc_solidarity_housing_component.py b/policyengine_canada/variables/gov/provinces/qc/tax/income/credits/solidarity/qc_solidarity_housing_component.py new file mode 100644 index 000000000..61653e405 --- /dev/null +++ b/policyengine_canada/variables/gov/provinces/qc/tax/income/credits/solidarity/qc_solidarity_housing_component.py @@ -0,0 +1,32 @@ +from policyengine_canada.model_api import * + + +class qc_solidarity_housing_component(Variable): + value_type = float + entity = Household + label = "Quebec Solidarity Tax Credit - Housing Component" + unit = CAD + definition_period = YEAR + defined_for = ProvinceCode.QC + + def formula(household, period, parameters): + p = parameters( + period + ).gov.provinces.qc.tax.income.credits.solidarity.housing + + # Base amounts differ by family composition + household_size = household("household_size", period) + is_married = household("is_married", period) + + # Simplified formula - actual formula is more complex + base_amount = where( + is_married, + p.couple_base, + where(household_size > 1, p.single_parent_base, p.single_base), + ) + + # Income-tested reduction + income = household("adjusted_family_net_income", period) + reduction = p.reduction_rate * max_(0, income - p.threshold) + + return max_(0, base_amount - reduction) diff --git a/policyengine_canada/variables/gov/provinces/qc/tax/income/credits/solidarity/qc_solidarity_qst_component.py b/policyengine_canada/variables/gov/provinces/qc/tax/income/credits/solidarity/qc_solidarity_qst_component.py new file mode 100644 index 000000000..68bdb2ba9 --- /dev/null +++ b/policyengine_canada/variables/gov/provinces/qc/tax/income/credits/solidarity/qc_solidarity_qst_component.py @@ -0,0 +1,26 @@ +from policyengine_canada.model_api import * + + +class qc_solidarity_qst_component(Variable): + value_type = float + entity = Household + label = "Quebec Solidarity Tax Credit - QST Component" + unit = CAD + documentation = "Quebec Sales Tax (QST) offset component of the Solidarity Tax Credit" + definition_period = YEAR + defined_for = ProvinceCode.QC + + def formula(household, period, parameters): + p = parameters( + period + ).gov.provinces.qc.tax.income.credits.solidarity.qst + + # Base amounts per person + household_size = household("household_size", period) + base_amount = household_size * p.per_person_amount + + # Income-tested reduction + income = household("adjusted_family_net_income", period) + reduction = p.reduction_rate * max_(0, income - p.threshold) + + return max_(0, base_amount - reduction) diff --git a/policyengine_canada/variables/gov/provinces/qc/tax/income/credits/solidarity/qc_solidarity_tax_credit.py b/policyengine_canada/variables/gov/provinces/qc/tax/income/credits/solidarity/qc_solidarity_tax_credit.py new file mode 100644 index 000000000..ec5ed121e --- /dev/null +++ b/policyengine_canada/variables/gov/provinces/qc/tax/income/credits/solidarity/qc_solidarity_tax_credit.py @@ -0,0 +1,16 @@ +from policyengine_canada.model_api import * + + +class qc_solidarity_tax_credit(Variable): + value_type = float + entity = Household + label = "Quebec Solidarity Tax Credit" + unit = CAD + definition_period = YEAR + defined_for = ProvinceCode.QC + reference = "https://www.revenuquebec.ca/en/citizens/tax-credits/solidarity-tax-credit/" + + adds = [ + "qc_solidarity_housing_component", + "qc_solidarity_qst_component", + ] From 192b2adfb72a30966b4f525607f2ca1202c81a2a Mon Sep 17 00:00:00 2001 From: Vahid Ahmadi Date: Wed, 12 Nov 2025 14:41:30 +0100 Subject: [PATCH 2/3] changelog --- changelog_entry.yaml | 6 ++++++ .../benefits/ab_seniors_benefit/ab_seniors_benefit_base.py | 4 +++- .../credits/solidarity/qc_solidarity_qst_component.py | 4 +++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/changelog_entry.yaml b/changelog_entry.yaml index e69de29bb..55d5a3517 100644 --- a/changelog_entry.yaml +++ b/changelog_entry.yaml @@ -0,0 +1,6 @@ +- bump: minor + changes: + added: + - BC Sales Tax Credit + - Alberta Seniors Benefit + - Quebec Solidarity Tax Credit (housing and QST components) diff --git a/policyengine_canada/variables/gov/provinces/ab/benefits/ab_seniors_benefit/ab_seniors_benefit_base.py b/policyengine_canada/variables/gov/provinces/ab/benefits/ab_seniors_benefit/ab_seniors_benefit_base.py index 272fceb90..fc0f81835 100644 --- a/policyengine_canada/variables/gov/provinces/ab/benefits/ab_seniors_benefit/ab_seniors_benefit_base.py +++ b/policyengine_canada/variables/gov/provinces/ab/benefits/ab_seniors_benefit/ab_seniors_benefit_base.py @@ -6,7 +6,9 @@ class ab_seniors_benefit_base(Variable): entity = Person label = "Alberta Seniors Benefit base amount" unit = CAD - documentation = "Maximum Alberta Seniors Benefit amount before income reduction" + documentation = ( + "Maximum Alberta Seniors Benefit amount before income reduction" + ) definition_period = YEAR defined_for = ProvinceCode.AB diff --git a/policyengine_canada/variables/gov/provinces/qc/tax/income/credits/solidarity/qc_solidarity_qst_component.py b/policyengine_canada/variables/gov/provinces/qc/tax/income/credits/solidarity/qc_solidarity_qst_component.py index 68bdb2ba9..a534a8fa7 100644 --- a/policyengine_canada/variables/gov/provinces/qc/tax/income/credits/solidarity/qc_solidarity_qst_component.py +++ b/policyengine_canada/variables/gov/provinces/qc/tax/income/credits/solidarity/qc_solidarity_qst_component.py @@ -6,7 +6,9 @@ class qc_solidarity_qst_component(Variable): entity = Household label = "Quebec Solidarity Tax Credit - QST Component" unit = CAD - documentation = "Quebec Sales Tax (QST) offset component of the Solidarity Tax Credit" + documentation = ( + "Quebec Sales Tax (QST) offset component of the Solidarity Tax Credit" + ) definition_period = YEAR defined_for = ProvinceCode.QC From 535bc89d6276476acd390ba87a4ee19e46050ab7 Mon Sep 17 00:00:00 2001 From: Vahid Ahmadi Date: Wed, 12 Nov 2025 14:44:45 +0100 Subject: [PATCH 3/3] debug --- .github/workflows/push.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/push.yaml b/.github/workflows/push.yaml index dc58f7c33..b61e4ee8d 100644 --- a/.github/workflows/push.yaml +++ b/.github/workflows/push.yaml @@ -85,6 +85,8 @@ jobs: python-version: 3.13 - name: Publish a git tag run: ".github/publish-git-tag.sh || true" + - name: Install build dependencies + run: pip install wheel setuptools - name: Install package run: make install - name: Build package