CluPilotCloud/resources/views
nexxo 34874adec3
tests / pest (push) Failing after 8m6s Details
tests / assets (push) Successful in 21s Details
tests / release (push) Has been skipped Details
Apply a bought plan change instead of only pricing it
PlanChange could say what a move would cost and whether it was allowed, and
that was all it could do. Billing::purchase() wrote an upgrade order and
nothing ever consumed it: same snapshot, same machine, same quota. A customer
could pay for a bigger package and receive nothing.

ApplyPlanChange is now the single place a change lands — it moves the contract
onto the target's current version, writes one register row, settles the custom
domain, and starts a run that resizes the machine. Applying the same order
twice is a no-op, enforced by a unique event key rather than by a check two
callers could both pass.

Two things a plan change must not do, and now does not. A disk is never shrunk
— Proxmox cannot, so the QUOTA shrinks instead, which is what was sold anyway.
And a live machine is never rebooted as a side effect: cores and RAM are
written, and where they need a restart the instance says so where an operator
and the customer can both see it.

The storage allowance also joins the build pipeline. ApplyStorageQuota was
written for plan changes and ran only there, so a brand-new customer still got
no quota at all — quota_gb reached the instance row and stopped, and every
package delivered the whole disk. The test guarding that pipeline only counted
its steps, which is how a list missing the one step that makes a package's
storage real stayed green for its whole life. It now names the step.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-29 17:18:55 +02:00
..
components Give people a way back in, and put the URL in English 2026-07-29 16:50:29 +02:00
errors One wordmark, one typeface, and the address the server actually issues 2026-07-29 14:30:44 +02:00
layouts Give the update screen the product's colours, and only one window 2026-07-29 14:11:01 +02:00
livewire Apply a bought plan change instead of only pricing it 2026-07-29 17:18:55 +02:00
mail Give people a way back in, and put the URL in English 2026-07-29 16:50:29 +02:00
partials Stop root workers breaking every page, and let the panel be closed 2026-07-29 15:43:54 +02:00
pdf Issue an invoice from what somebody bought, and freeze it there 2026-07-29 02:09:05 +02:00
vendor/wire-elements-modal fix(admin): no admin lockout (is_admin fallback); centered modal width; datacenter edit modal + country dropdown 2026-07-25 18:09:17 +02:00
coming-soon.blade.php One wordmark, one typeface, and the address the server actually issues 2026-07-29 14:30:44 +02:00
landing.blade.php Always name the host we are being served from, and stop promising a duration 2026-07-29 17:10:06 +02:00
legal.blade.php Rebuild the public website in the shared design system 2026-07-29 11:26:35 +02:00
security.blade.php Put customer instances on their own domain, and say which domains are ours 2026-07-29 16:03:13 +02:00
status.blade.php Rebuild the status page as a status page 2026-07-29 12:45:18 +02:00