Skip to Content
Saldo is currently in alpha - report bugs here
Dependent WorkerAPI Reference

API Reference

Dependent worker APIs for Portuguese payroll. For self-employed calculations, see the independent worker API.

Main Function

simulateDependentWorker(options)

Calculates Portuguese dependent worker taxes and net salary using the official retention tables. Returns a full 12-month breakdown, applying the correct tax period per month.

Parameters

interface SimulateDependentWorkerOptions { year: number; income: number; married?: boolean; disabled?: boolean; partnerDisabled?: boolean; location?: LocationT; numberOfHolders?: number | null; numberOfDependents?: number | null; numberOfDependentsDisabled?: number | null; socialSecurityContributionRate?: number; twelfths?: Twelfths; lunchAllowanceDailyValue?: number; lunchAllowanceMode?: "cupon" | "salary"; lunchAllowanceDaysCount?: number; includeLunchAllowanceInJune?: boolean; oneHalfMonthTwelfthsLumpSumMonth?: "june" | "december"; isencaoHorarioMonthly?: number; benefitsOfYouthIrs?: boolean; yearOfYouthIrs?: number; }
ParameterTypeDefaultDescription
yearnumberRequiredTax year (e.g. 2025)
incomenumberRequiredMonthly gross income in euros
marriedbooleanfalseWhether the person is married
disabledbooleanfalseWhether the person has a disability
partnerDisabledbooleanfalseWhether the spouse has a disability
locationLocationT'continent'Tax region: 'continent', 'azores', or 'madeira'
numberOfHoldersnumber | nullnullNumber of income holders in marriage (1 or 2)
numberOfDependentsnumber | nullnullNumber of dependents
numberOfDependentsDisablednumber | nullnullNumber of dependents with disabilities
socialSecurityContributionRatenumber0.11Social security contribution rate (11%)
twelfthsTwelfthsTwelfths.TWO_MONTHSHoliday allowance distribution
lunchAllowanceDailyValuenumber10.2Daily lunch allowance amount in euros
lunchAllowanceMode"cupon" | "salary""cupon"Type of lunch allowance
lunchAllowanceDaysCountnumber22Working days per month for lunch allowance
includeLunchAllowanceInJunebooleanfalseWhether June includes lunch allowance
oneHalfMonthTwelfthsLumpSumMonth"june" | "december""december"Month for the ONE_HALF_MONTH lump sum payment
isencaoHorarioMonthlynumber0Monthly “isenção de horário” supplement (Art. 218.º–219.º + 265.º CT). Counts in subsídio de férias but not in subsídio de Natal
benefitsOfYouthIrsbooleanfalseApply IRS Jovem partial monthly retention exemption (Art. 2.º-C CIRS)
yearOfYouthIrsnumber1Year of benefit (1–10 from 2025 onwards, 1–5 for 2023/2024)

Return Value

interface DependentWorkerResult { yearly: YearlyDependentWorkerSummary; socialSecurityContributionRate: number; monthlyBreakdown: MonthlyBreakdownResult[]; } interface YearlyDependentWorkerSummary { totalGrossIncomeAmount: number; // Total gross income for the year totalNetIncomeAmount: number; // Total net income for the year totalLunchAllowanceGrossAmount: number; // Total gross lunch allowance for the year } interface MonthlyBreakdownResult { month: MonthName; period: PeriodT; taxableIncomeForIrsCalculation: number; incomeSubjectToIrsAndSocialSecurity: number; grossIncome: GrossIncomeAmountBreakdown; irsWithholdingTax: IncomeComponentAmountBreakdown; socialSecurityContribution: IncomeComponentAmountBreakdown; netIncome: IncomeComponentAmountBreakdown; lunchAllowance: LunchAllowanceAmountBreakdown; subsidyTwelfths: SubsidyTwelfthsAmountBreakdown; bracket: BracketResult; taxRetentionTable: TaxRetentionTableResult; youthIrs: YouthIrsBreakdown; } interface YouthIrsBreakdown { applied: boolean; // true when IRS Jovem reduces this month's retention yearOfBenefit: number; // resolved year of benefit (1–10) exemptionPercentage: number; // 0–1, e.g. 0.75 for 2.º–4.º year in 2025+ monthlyExemptCap: number; // (multiplier × IAS) / 14 in euros exemptIncome: number; // amount exempted this month, after the cap }
PropertyTypeDescription
yearly.totalGrossIncomeAmountnumberAnnual gross income (14 months + lunch allowance)
yearly.totalNetIncomeAmountnumberAnnual net income
yearly.totalLunchAllowanceGrossAmountnumberAnnual gross lunch allowance
socialSecurityContributionRatenumberSocial security contribution rate applied
monthlyBreakdownMonthlyBreakdownResult[]Array of 12 monthly breakdowns
monthlyBreakdown[n].grossIncome.baseSalaryAmountnumberMonthly base salary
monthlyBreakdown[n].grossIncome.totalWithLunchAllowanceAndSubsidyTwelfthsAmountnumberTotal monthly gross including allowances
monthlyBreakdown[n].irsWithholdingTax.totalAmountnumberTotal IRS withheld that month
monthlyBreakdown[n].socialSecurityContribution.totalAmountnumberTotal SS contribution that month
monthlyBreakdown[n].netIncome.totalAmountnumberTotal monthly net income
monthlyBreakdown[n].lunchAllowance.grossAmountnumberGross lunch allowance for the month
monthlyBreakdown[n].lunchAllowance.taxableAmountnumberTaxable portion of lunch allowance
monthlyBreakdown[n].lunchAllowance.taxExemptAmountnumberTax-exempt portion of lunch allowance
monthlyBreakdown[n].subsidyTwelfths.distributedMonthlyAmountnumberMonthly distributed twelfths
monthlyBreakdown[n].subsidyTwelfths.lumpSumAmountnumberLump-sum twelfths for this month
monthlyBreakdown[n].bracketBracketResultTax bracket information
monthlyBreakdown[n].taxRetentionTableTaxRetentionTableResultComplete tax retention table data
monthlyBreakdown[n].youthIrs.appliedbooleantrue when IRS Jovem reduces this month’s retention
monthlyBreakdown[n].youthIrs.exemptionPercentagenumberExemption percentage for the resolved year of benefit (01)
monthlyBreakdown[n].youthIrs.monthlyExemptCapnumberPer-payment cap = (multiplier × IAS) / 14
monthlyBreakdown[n].youthIrs.exemptIncomenumberExempt portion of this month’s remuneration (after cap)

Example

Interactive Example

Types and Enums

LocationT

type LocationT = "continent" | "azores" | "madeira";

Twelfths

enum Twelfths { NONE = 0, // No holiday allowances ONE_HALF_MONTH = 0.5, // 1x50% - One allowance at 50% (half month) ONE_MONTH = 1, // 2x50% - Two allowances at 50% each (one month total) TWO_MONTHS = 2 // 2x100% - Two allowances at 100% each (two months total) }

GrossIncomeAmountBreakdown

interface GrossIncomeAmountBreakdown { baseSalaryAmount: number; baseSalaryAndLunchAllowanceAmount: number; totalWithLunchAllowanceAndSubsidyTwelfthsAmount: number; }

IncomeComponentAmountBreakdown

Used for irsWithholdingTax, socialSecurityContribution, and netIncome:

interface IncomeComponentAmountBreakdown { totalAmount: number; fromBaseSalaryAmount: number; fromLunchAllowanceAmount: number; fromSubsidyTwelfthsAmount: number; }

LunchAllowanceAmountBreakdown

interface LunchAllowanceAmountBreakdown { grossAmount: number; taxableAmount: number; taxExemptAmount: number; isPaidInThisMonth: boolean; }

Tax Rules:

  • Meal vouchers ("cupon"): Tax-free up to €10.20/day
  • Cash allowance ("salary"): Tax-free up to €6.00/day

SubsidyTwelfthsAmountBreakdown

interface SubsidyTwelfthsAmountBreakdown { distributedMonthlyAmount: number; // Monthly distributed portion lumpSumAmount: number; // Lump-sum payment in June/December totalAmount: number; // distributedMonthlyAmount + lumpSumAmount }

SituationCodesT

type SituationCodesT = | "TABLE1_SINGLE_OR_MARRIED_2_HOLDERS" // Single or married with 2 holders | "TABLE2_SINGLE_ONE_OR_MORE_DEPENDENTS" // Single with dependents | "TABLE3_MARRIED_1_HOLDER" // Married, single holder | "TABLE4_SINGLE_OR_MARRIED_2_HOLDERS_NO_DEPENDENTS_PERSON_WITH_DISABILITY" // Single or married 2 holders + disability | "TABLE5_SINGLE_ONE_OR_MORE_DEPENDENTS_PERSON_WITH_DISABILITY" // Single with dependents + disability | "TABLE6_MARRIED_2_HOLDERS_ONE_OR_MORE_DEPENDENTS_PERSON_WITH_DISABILITY" // Married 2 holders with dependents + disability | "TABLE7_MARRIED_1_HOLDER_PERSON_WITH_DISABILITY"; // Married single holder + disability

Situation

interface Situation { code: SituationCodesT; description: string; conditions: Condition[]; }

Condition

interface Condition { married: boolean; dependents: boolean; disabled: boolean; partnerDisabled: boolean; description: string; numberOfHolders?: number | null; }

BracketResult

interface BracketResult { signal: "max" | "min"; limit: number; max_marginal_rate: number; deduction: number; var1_deduction: number; var2_deduction: number; dependent_aditional_deduction: number; effective_mensal_rate: number; }

TaxRetentionTableResult

interface TaxRetentionTableResult { situation: string; description: string; brackets: BracketResult[]; dependent_disabled_addition_deduction?: number; }

Utility Functions

SituationUtils.getSituation()

SituationUtils.getSituation( married: boolean, disabled: boolean, partnerDisabled: boolean, numberOfHolders?: number | null, numberOfDependents?: number ): Situation | undefined

Determines the appropriate tax situation based on personal circumstances.

SituationUtils.getSituationFromCode()

SituationUtils.getSituationFromCode(code: string): Situation | undefined

Retrieves a tax situation by its code.

Validation Functions

The library includes internal validation functions called automatically:

  • validateNumberOfHolders(numberOfHolders)
  • validateMarriedAndNumberOfHolders(married, numberOfHolders)
  • validatePartnerDisabled(married, partnerDisabled)
  • validateDependents(numberOfDependents, numberOfDependentsDisabled)
  • validateLunchAllowanceMode(lunchAllowanceMode)
  • validateYear(year)
  • validateYouthIrsForDependentWorker(benefitsOfYouthIrs, yearOfYouthIrs, year)

Error Handling

Interactive Example

Advanced Usage

Disability Benefits

Interactive Example

IRS Jovem (Youth IRS)

Partial monthly IRS retention exemption for young workers. Bracket lookup uses the full monthly remuneration; the resulting effective rate is then applied only to the non-exempt portion. The exempt amount per payment is capped at (multiplier × IAS) / 14.

Year-of-benefit table (2025 onwards, per Lei n.º 45-A/2024 — Orçamento do Estado para 2025):

Year of benefitExemptionIAS multiplier (annual cap)
1.º100 %55 × IAS
2.º – 4.º75 %55 × IAS
5.º – 7.º50 %55 × IAS
8.º – 10.º25 %55 × IAS

For 2023 and 2024 the regime is narrower (5 years, lower percentages) — see youth-irs-data.ts.

Legal references:

Interactive Example

Custom Social Security Rate

Interactive Example
Last updated on