/**
* Equalization payment data for 2024-25 fiscal year
* Source: Department of Finance Canada
* https://www.canada.ca/en/department-finance/programs/federal-transfers/equalization.html
*/
import { EqualizationData, ProvinceEqualizationData, RevenueCategory, NationalStandard } from './equalizationTypes';
export const FISCAL_YEAR = '2024-25';
export const nationalStandard: NationalStandard = {
averageFiscalCapacity: 10927, // per capita
totalEnvelopeMillions: 25300,
fiscalYear: FISCAL_YEAR,
};
export const revenueCategories: RevenueCategory[] = [
{
id: 'personal-income',
name: { en: 'Personal Income Tax', fr: 'Impôt sur le revenu des particuliers' },
description: {
en: 'Revenue from provincial income taxes on individuals',
fr: 'Revenus provenant des impôts provinciaux sur le revenu des particuliers'
},
weight: 35,
icon: 'user',
},
{
id: 'business-income',
name: { en: 'Business Income Tax', fr: 'Impôt sur le revenu des entreprises' },
description: {
en: 'Corporate income tax and business revenue',
fr: 'Impôt sur le revenu des sociétés et revenus des entreprises'
},
weight: 15,
icon: 'building',
},
{
id: 'consumption',
name: { en: 'Consumption Taxes', fr: 'Taxes à la consommation' },
description: {
en: 'Sales taxes and other consumption-based revenue',
fr: 'Taxes de vente et autres revenus basés sur la consommation'
},
weight: 25,
icon: 'shopping-cart',
},
{
id: 'property',
name: { en: 'Property Taxes', fr: 'Taxes foncières' },
description: {
en: 'Revenue from property and real estate taxation',
fr: 'Revenus provenant de la taxation immobilière et foncière'
},
weight: 10,
icon: 'home',
},
{
id: 'natural-resources',
name: { en: 'Natural Resource Revenue', fr: 'Revenus des ressources naturelles' },
description: {
en: 'Oil, gas, mining royalties and other resource revenue',
fr: 'Redevances pétrolières, gazières, minières et autres revenus de ressources'
},
weight: 15,
icon: 'mountain',
},
];
const provinceData: Record<string, ProvinceEqualizationData> = {
BC: {
provinceCode: 'BC',
provinceName: { en: 'British Columbia', fr: 'Colombie-Britannique' },
paymentMillions: 0,
perCapitaPayment: 0,
population: 5368000,
isReceiving: false,
fiscalCapacityIndex: 107,
},
AB: {
provinceCode: 'AB',
provinceName: { en: 'Alberta', fr: 'Alberta' },
paymentMillions: 0,
perCapitaPayment: 0,
population: 4647000,
isReceiving: false,
fiscalCapacityIndex: 156,
},
SK: {
provinceCode: 'SK',
provinceName: { en: 'Saskatchewan', fr: 'Saskatchewan' },
paymentMillions: 0,
perCapitaPayment: 0,
population: 1214000,
isReceiving: false,
fiscalCapacityIndex: 112,
},
MB: {
provinceCode: 'MB',
provinceName: { en: 'Manitoba', fr: 'Manitoba' },
paymentMillions: 3510,
perCapitaPayment: 2456,
population: 1429000,
isReceiving: true,
fiscalCapacityIndex: 78,
},
ON: {
provinceCode: 'ON',
provinceName: { en: 'Ontario', fr: 'Ontario' },
paymentMillions: 421,
perCapitaPayment: 28,
population: 15262000,
isReceiving: true,
fiscalCapacityIndex: 99,
},
QC: {
provinceCode: 'QC',
provinceName: { en: 'Quebec', fr: 'Québec' },
paymentMillions: 13340,
perCapitaPayment: 1534,
population: 8695000,
isReceiving: true,
fiscalCapacityIndex: 82,
},
NB: {
provinceCode: 'NB',
provinceName: { en: 'New Brunswick', fr: 'Nouveau-Brunswick' },
paymentMillions: 2680,
perCapitaPayment: 3225,
population: 831000,
isReceiving: true,
fiscalCapacityIndex: 71,
},
NS: {
provinceCode: 'NS',
provinceName: { en: 'Nova Scotia', fr: 'Nouvelle-Écosse' },
paymentMillions: 2840,
perCapitaPayment: 2712,
population: 1047000,
isReceiving: true,
fiscalCapacityIndex: 74,
},
PE: {
provinceCode: 'PE',
provinceName: { en: 'Prince Edward Island', fr: 'Île-du-Prince-Édouard' },
paymentMillions: 561,
perCapitaPayment: 3266,
population: 172000,
isReceiving: true,
fiscalCapacityIndex: 70,
},
NL: {
provinceCode: 'NL',
provinceName: { en: 'Newfoundland and Labrador', fr: 'Terre-Neuve-et-Labrador' },
paymentMillions: 0,
perCapitaPayment: 0,
population: 531000,
isReceiving: false,
fiscalCapacityIndex: 104,
},
// Territories receive Territorial Formula Financing (TFF), not equalization
// TFF amounts for 2024-25 from Department of Finance Canada
YT: {
provinceCode: 'YT',
provinceName: { en: 'Yukon', fr: 'Yukon' },
paymentMillions: 1238, // TFF amount
perCapitaPayment: 28136,
population: 44000,
isReceiving: false, // Not equalization, but TFF
fiscalCapacityIndex: 0, // Not applicable - receives TFF
isTFF: true,
},
NT: {
provinceCode: 'NT',
provinceName: { en: 'Northwest Territories', fr: 'Territoires du Nord-Ouest' },
paymentMillions: 1566, // TFF amount
perCapitaPayment: 34800,
population: 45000,
isReceiving: false,
fiscalCapacityIndex: 0, // Not applicable - receives TFF
isTFF: true,
},
NU: {
provinceCode: 'NU',
provinceName: { en: 'Nunavut', fr: 'Nunavut' },
paymentMillions: 2022, // TFF amount
perCapitaPayment: 50550,
population: 40000,
isReceiving: false,
fiscalCapacityIndex: 0, // Not applicable - receives TFF
isTFF: true,
},
};
export const equalizationData: EqualizationData = {
provinces: provinceData,
nationalStandard,
revenueCategories,
};
/**
* Get equalization data for a specific province
*/
export function getProvinceEqualizationData(provinceCode: string): ProvinceEqualizationData | undefined {
return provinceData[provinceCode];
}
/**
* Get all provinces sorted by payment amount (descending)
*/
export function getProvincesByPayment(): ProvinceEqualizationData[] {
return Object.values(provinceData)
.filter(p => p.fiscalCapacityIndex > 0) // Exclude territories
.sort((a, b) => b.paymentMillions - a.paymentMillions);
}
/**
* Get all receiving provinces
*/
export function getReceivingProvinces(): ProvinceEqualizationData[] {
return Object.values(provinceData).filter(p => p.isReceiving);
}
/**
* Get all contributing provinces (above national standard)
*/
export function getContributingProvinces(): ProvinceEqualizationData[] {
return Object.values(provinceData).filter(p => !p.isReceiving && p.fiscalCapacityIndex > 0);
}
/**
* Check if a province is a territory
*/
export function isTerritory(provinceCode: string): boolean {
return ['YT', 'NT', 'NU'].includes(provinceCode);
}
/**
* Format currency in billions/millions
*/
export function formatPayment(amountMillions: number, locale: 'en' | 'fr' = 'en'): string {
if (amountMillions === 0) return locale === 'en' ? '$0' : '0 $';
if (amountMillions >= 1000) {
const billions = amountMillions / 1000;
return locale === 'en'
? `$${billions.toFixed(2)}B`
: `${billions.toFixed(2)} G$`;
}
return locale === 'en'
? `$${amountMillions}M`
: `${amountMillions} M$`;
}
/**
* Format per-capita amount
*/
export function formatPerCapita(amount: number, locale: 'en' | 'fr' = 'en'): string {
if (amount === 0) return locale === 'en' ? '$0' : '0 $';
return locale === 'en'
? `$${amount.toLocaleString('en-CA')}`
: `${amount.toLocaleString('fr-CA')} $`;
}