← back to StudentLoanTracker

src/lib/calculators/poverty-guidelines.ts

65 lines

/**
 * 2026 Federal Poverty Guidelines (HHS)
 * Source: Federal Register / HHS ASPE
 *
 * The poverty guideline is used to calculate "discretionary income"
 * for income-driven repayment plans:
 *   - SAVE/IBR/PAYE: AGI minus 225% of poverty guideline (SAVE uses 225%, others 150%)
 *   - ICR: AGI minus 100% of poverty guideline
 *
 * Update annually when HHS publishes new guidelines (typically January).
 * Alaska and Hawaii have separate, higher guidelines.
 */

interface PovertyData {
  baseAmount: number;       // For 1-person household
  perAdditional: number;    // Additional amount per person beyond 1
}

const POVERTY_2026: Record<string, PovertyData> = {
  // 48 contiguous states + DC
  default: { baseAmount: 15650, perAdditional: 5530 },
  // Alaska
  AK: { baseAmount: 19560, perAdditional: 6910 },
  // Hawaii
  HI: { baseAmount: 18010, perAdditional: 6360 },
};

/**
 * Get the federal poverty guideline for a given family size and state.
 */
export function getPovertyGuideline(familySize: number, state: string = 'CA'): number {
  const upperState = state.toUpperCase();
  const data = POVERTY_2026[upperState] || POVERTY_2026.default;
  const size = Math.max(1, Math.round(familySize));
  return data.baseAmount + data.perAdditional * (size - 1);
}

/**
 * Calculate discretionary income.
 *
 * @param agi - Adjusted gross income
 * @param familySize - Household size
 * @param state - 2-letter state code
 * @param povertyMultiplier - 1.5 for most IDR plans, 2.25 for SAVE, 1.0 for ICR
 */
export function getDiscretionaryIncome(
  agi: number,
  familySize: number,
  state: string,
  povertyMultiplier: number
): number {
  const guideline = getPovertyGuideline(familySize, state);
  return Math.max(0, agi - guideline * povertyMultiplier);
}

/**
 * Poverty multipliers by plan type.
 */
export const POVERTY_MULTIPLIERS: Record<string, number> = {
  SAVE: 2.25,    // 225% of poverty line
  IBR: 1.5,      // 150% of poverty line
  PAYE: 1.5,     // 150% of poverty line
  ICR: 1.0,      // 100% of poverty line
};