Estonian Payroll Calculator
A complete Estonian payroll calculation engine that processes gross-to-net for all employees in a payroll run. Applies all Estonian tax formulas: 33% social tax (employer), 22% income tax, 1.6% unemployment insurance (employee), 0.8% unemployment insurance (employer), and funded pension at 2%, 3%, or 6% depending on the employee's tier. Handles the basic tax exemption, pre-tax and post-tax voluntary deductions, and pro-rating for mid-month starts/exits. Generates TSD declaration XML files for direct upload to the EMTA (Estonian Tax and Customs Board) portal.

Two commands.
Two procedures.
Both run inside Claude against the governed ledger.
- 01
/calculate-payroll — Calculate gross-to-net payroll for all employees in a payroll run. Loads the payroll run, fetches employees with compensation/tax settings/deductions, applies all Estonian tax formulas, validates net pay within 0.02 tolerance, and submits calculated results. Shows summary table with per-employee breakdown.
- 02
/generate-tsd — Generate the Estonian monthly TSD declaration XML for EMTA filing. Fetches calculated payroll data, builds structured JSON input, and runs the generate_tsd.py script to produce validated XML with correct namespace and per-employee data (personal ID, gross pay, income tax, social tax, unemployment, pension).
All Estonian tax formulas (social, income, unemployment, pension). Multiple funded pension tiers (2%, 3%, 6%). Pre-tax and post-tax deduction handling. TSD declaration XML generation for EMTA.
How a run behaves.
Two procedures, step by step.
- 01Load payroll run and verify status is "draft"
- 02Fetch all active employees with compensation records, tax settings, and voluntary deductions
- 03Load Estonian tax rates from payroll tax jurisdiction configuration
- 04For each employee: calculate gross pay (pro-rated if mid-month start/exit)
- 05Calculate employee deductions: unemployment insurance (1.6%), funded pension (2%/3%/6%)
- 06Apply pre-tax voluntary deductions
- 07Calculate taxable income = gross - unemployment - pension - pre-tax deductions - basic exemption
- 08Calculate income tax = max(0, taxable income x 22%)
- 09Apply post-tax voluntary deductions
- 10Calculate net pay = gross - all employee taxes and deductions
- 11Calculate employer costs: social tax (33%), employer unemployment (0.8%)
- 12Validate: net pay = gross - total taxes - total deductions (within 0.02 tolerance)
- 13Submit calculation results and show summary table
- 01Fetch calculated or approved payroll run data
- 02Build structured JSON input with per-employee tax details
- 03Run generate_tsd.py script to produce validated XML
- 04Output includes header, summary totals, and Annex 1 per-employee lines
- 05XML ready for upload to e-MTA portal
Payroll run exists and is in "draft" status. All employees in the run have active compensation records. All employees have tax settings (pension tier, basic exemption). Tax rates loaded from payroll tax jurisdiction (country_code = "EE"). For each employee: net pay equals gross minus total taxes minus deductions (within 0.02). Submission succeeds without validation errors.
Your procedures,
written down.
Swap the reference files for your policies and run it in Claude. Writes still go through the governed gateway.