- Shipped
- November 11, 2026 at 9:06 AM UTC
- Author
- Kamo
- Commit
- 6615574
The public "view your invoice online" page already exists for subscription invoices: the signer app's sign.<org domain>/<locale>/i/<token>, branded, phone-ready, with a PDF download, served on a host every organization already has. InvoicePublicController now resolves a token as a subscription invoice's link first and a work order invoice's (CommerceInvoiceLink) second; both answer the same PublicInvoice, so the signer page is unchanged. A link is 256 random bits stored as a SHA-256, expires after a year **************** and dies when turned off, replaced or the invoice is voided (a void or draft invoice never resolves; voiding through the relay also stamps its links). The PDF is the issued document from InvoicingService, the same file the member opens. ServiceJobInvoiceController: GET /delivery (recipient, the email as it will read, every send and link), POST /send (Manage Service Work; editable recipient and note; canonical commerce.invoice_sent through the same EmailService call as subscription invoices, PDF attached; each send recorded with who, when, to whom and whether it was handed over), POST /link (a fresh link; earlier ones stop), DELETE /link (all off). Only an invoice with something owed is emailed; nothing is ever sent on its own. No online card payment: the platform checkout pays the platform's own account and stays subscription-only. Account page: GET **************** lists work order (View Service Work), retail order and subscription (View Subscription Invoices) invoices on indexed, org-scoped queries. InvoiceDelivery.Line takes a decimal quantity (labor bills 1.5 h).
