/** * Vela Payroll Engine — New Zealand Tax Jurisdiction * * Based on IRD 2025 tax year (1 April 2025 – 31 March 2026). * Source: https://www.ird.govt.nz/income-tax-rates * * PAYE Income Tax — 2025-26 * ┌──────────────────────────────────┬────────┐ * │ Taxable Income │ Rate │ * ├──────────────────────────────────┼────────┤ * │ $0 – $15,600 │ 10.5% │ * │ $15,601 – $53,500 │ 17.5% │ * │ $53,501 – $78,100 │ 30.0% │ * │ $78,101 – $180,000 │ 33.0% │ * │ $180,001 and over │ 39.0% │ * └──────────────────────────────────┴────────┘ * * ACC Earner Levy: 1.60% of gross earnings (capped at max annual earner levy) * ACC Employer Levy: ~1.39% (WorkSafe account, varies by industry) * — Not included in MVP as it's industry-specific. * * KiwiSaver: Voluntary employee savings scheme (3%, 4%, 6%, 8%, 10%). * Employer must contribute 3% minimum if employee is a KiwiSaver member. * Not auto-included in MVP — would require member status input. * * No social security / pension contributions are mandatory beyond ACC. */ import { TaxJurisdiction, TaxBracket, DeductionLineItem, EmployerContribution, progressiveTaxCalc, round2, } from "../types"; // ── 2025-26 PAYE Tax Brackets ── const TAX_BRACKETS: TaxBracket[] = [ { min: 0, max: 15_600, rate: 0.105 }, { min: 15_600, max: 53_500, rate: 0.175 }, { min: 53_500, max: 78_100, rate: 0.30 }, { min: 78_100, max: 180_000, rate: 0.33 }, { min: 180_000, max: null, rate: 0.39 }, ]; const ACC_EARNER_LEVY_RATE = 0.016; // 1.60% of gross // Max earner levy per year is around $32.74 — but for simplicity // we apply the flat rate (the cap is small enough to be negligible // for most salaries; can be added as an enhancement). export class NewZealandTax implements TaxJurisdiction { readonly name = "New Zealand"; readonly countryCode = "NZ"; readonly currency = "NZD"; calculate(grossAnnual: number): { deductions: DeductionLineItem[]; employerContributions: EmployerContribution[]; } { // 1. PAYE Income Tax const incomeTax = progressiveTaxCalc(grossAnnual, TAX_BRACKETS); // 2. ACC Earner Levy (1.60% of gross, capped) const accEarner = round2(Math.min(grossAnnual * ACC_EARNER_LEVY_RATE, 32.74)); // No mandatory employer contributions in MVP // (ACC Employer Levy is industry-specific and billed separately by WorkSafe) const employerContributions: EmployerContribution[] = []; const deductions: DeductionLineItem[] = [ { name: "PAYE Income Tax", amount: round2(incomeTax), type: "tax", description: "IRD PAYE withholding (2025-26 brackets)", }, { name: "ACC Earner Levy", amount: accEarner, type: "levy", description: "1.60% of gross earnings (accident compensation)", }, ]; return { deductions, employerContributions }; } }