Late-fee policy

Past-due assessment engine. Reads BillingPolicy.lateFeePolicyand emits DEBIT BillingAdjustments. Idempotent per (invoice, round) — re-runs don't duplicate fees.

Policy shape

Edit on the BillingPolicy row (JSON). Future iteration adds a form.

{
  "gracePeriodDays": 7,
  "firstFee": { "amount": 15.00, "capPct": 5 },
  "subsequentFees": {
    "intervalDays": 14,
    "amount": 10.00,
    "capPct": 10,
    "maxAssessments": 3
  }
}

Run assessment

Operator-triggered. The dunning scheduler also calls this on its own cadence.