- Shipped
- October 22, 2026 at 10:38 PM UTC
- Author
- Kamo
- Commit
- a73db3f
SubscriptionBillingJob (hourly, one pod, and at startup) runs the cycle: - raise each renewal invoice as a draft lead-days before its billing day - move subscriptions onto the next period once invoiced - tell the seller's owners in-app (BILLING_INVOICE) and by email that a draft is waiting - send drafts on the billing day only in markets set to auto-send (default: hold for approval) - mark late invoices overdue, alert the owners and remind the customer weekly InvoiceDelivery emails the customer the invoice with a PDF (InvoicePdfRenderer, PDFBox) and a view-online link on the signer host, with the org's remittance details. InvoicePublicController serves that link (token in the body, rate limited, one answer for unknown tokens). POS endpoints: - edit a draft - send/resend with recipient and message - default recipient - PDF - record payments with the date received, method and reference (partial OK) - void with a reason - per-market invoicing policy - add-on license quantities in the price calculator
