Prototype
Buckets
- Consume
- Sink for consumed service; source for refunds
- Service
- Current allocation for service (can go negative if customer desires, or act as access cutoff)
- Balance
- Current customer balance not allocated for service (can go negative as consumed, or positive if prepaid)
- Invoice
- Amount owed on current invoice
Ticks
Automatic Ticks
Service tick
Service -> Consume
Consumes a bit of service
- once a day for daily consumption (disk, etc)
- once a month for granular service (hosting)
- once a year for registration (domain)
Billing tick
Balance -> Service
- Replenishes Service with enough to cover the next billing period
Invoice tick
Invoice -> Balance
- Bring Balance from negative to zero to account for currently owed outstanding
- Bring Invoice from positive to zero to account for overpayment
Payment tick
Outside -> Invoice
- Incoming payments are placed here until they're accounted for by an invoice run
Manual Ticks
Prepay tick
Invoice -> Balance
- Preemptively move money to indicate a customer's desire to prepay by owing more on next invoice than is actually outstanding
Service Refund tick
Consume -> Service
- Refund for consumed but unprovided service (outage, etc)
Balance Refund tick
Service -> Balance
- Refund for unused service, in case of overprovisioning or unconfigured service
Invoice Generation
- Generate Balance Refund tick to refund unused service
- Generate Billing tick to fund next billing period
- Generate Invoice tick to account for payments and refunds
- Compute invoice values and lines from all ticks between current and previous Invoice tick