CluPilotCloud/database/factories
nexxo ac250071cb feat(billing): immutable subscription snapshots and pro-rata plan changes
The plan catalogue describes what we sell today; a customer who signed up last
year bought last year's terms. Every commercially relevant condition — price,
quotas, seats, the hardware behind the plan — is now frozen onto a subscription
at signup, and the model refuses to let any of it be rewritten afterwards. A
price rise applies to new subscriptions and cannot reach back into an existing
contract.

PlanChange holds the two rules, computed against the frozen price rather than
today's catalogue:

- Upgrading is immediate and pro rata: the new plan for the days left in the
  paid term, minus what the old plan was worth over those same days. On the
  last day of a month that is one day's difference, not a month's.
- Downgrading waits for the end of the term. A yearly customer bought a year
  and can move down when it is up; a month is a month. A mid-term downgrade is
  a goodwill decision, not a self-service button, and its credit covers only
  the unused part of the difference.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-26 09:49:48 +02:00
..
CustomerFactory.php fix: seat limit + suspend guard per Codex; harden factory email uniqueness 2026-07-25 14:53:15 +02:00
DatacenterFactory.php test: widen DatacenterFactory code space (fix faker unique() pool exhaustion) 2026-07-25 14:23:49 +02:00
HostFactory.php fix(admin): confirm maintenance delivery via MessageSent (retryable until sent); guard resend/cancel on derived state; fix flaky non-unique host wg_ip 2026-07-25 16:14:01 +02:00
InstanceFactory.php feat(engine-b): customer domain models + migrations 2026-07-25 11:38:01 +02:00
MaintenanceWindowFactory.php feat(admin): maintenance windows — schedule once, assign many hosts, notify 2026-07-25 15:53:50 +02:00
OrderFactory.php feat(engine-b): customer domain models + migrations 2026-07-25 11:38:01 +02:00
ProvisioningRunFactory.php feat(engine): core provisioning data model + hosts 2026-07-25 09:49:43 +02:00
SeatFactory.php fix: seat limit + suspend guard per Codex; harden factory email uniqueness 2026-07-25 14:53:15 +02:00
SubscriptionFactory.php feat(billing): immutable subscription snapshots and pro-rata plan changes 2026-07-26 09:49:48 +02:00
UserFactory.php feat(admin): staff RBAC (spatie) + admin settings page 2026-07-25 15:47:42 +02:00
VpnPeerFactory.php feat(vpn): ownership, a Developer role, and password-gated config retrieval 2026-07-25 22:31:54 +02:00