Skip to content

Fix Stay NJ benefit calculation formula and Senior Freeze offset #7417

@PavelMakarchuk

Description

@PavelMakarchuk

Summary

The Stay NJ benefit calculation formula in nj_staynj.py does not match the official NJ Treasury formula. There are two related issues:

1. Wrong order of operations

Current repo logic:

net_property_taxes = max_(property_taxes - anchor_benefit, 0)
calculated_benefit = net_property_taxes * p.rate
return min_(calculated_benefit, p.max_benefit)

This computes min((property_taxes - ANCHOR) * 50%, $6,500).

Official NJ Treasury formula:

"If the sum of the Senior Freeze and ANCHOR amount is less than 50% of your property taxes ($6,500 max), your Stay NJ amount will be the difference between 50% of the property taxes billed and the benefits you already received."

The correct formula is:

target = min(property_taxes * 0.50, $6,500)
stay_nj = max(target - ANCHOR - Senior_Freeze, 0)

Example: $10,000 property taxes, $1,750 ANCHOR, no Senior Freeze

  • Repo: max($10,000 - $1,750, 0) * 0.50 = $4,125
  • Official: min($10,000 * 0.50, $6,500) - $1,750 = $3,250
  • Difference: $875 overstatement

2. Senior Freeze benefits not subtracted

The repo only subtracts ANCHOR from the calculation, but the official formula subtracts both ANCHOR and Senior Freeze benefits. This means Stay NJ benefits are overstated for anyone who also receives Senior Freeze reimbursement.

Additional note: Disability eligibility

Both ANCHOR and Stay NJ grant senior-level benefits to applicants who are "65 or older OR disabled" (ANCHOR) / "receiving Federal Social Security Disability" (Stay NJ). The current implementations only check age, not disability status. This is a lower-priority gap but worth addressing.

References

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions