CluPilotCloud/app
nexxo e0c109c449
tests / pest (push) Failing after 7m59s Details
tests / assets (push) Successful in 18s Details
tests / release (push) Has been skipped Details
Ask for the express request to begin, and send it to Stripe
The withdrawal machinery has always read `immediate_start` off the
checkout session's metadata — StripeWebhookController stamps
`immediate_start_consent_at` from it, WithdrawalRight refunds pro rata
when it is there and in full when it is not. The checkout never put it
there. So every contract concluded through this application carried no
consent, and a withdrawal on day thirteen of a running cloud took back
the whole amount however many days the machine had run. That is the
lawful outcome without the consent, and it was the only outcome
available.

Now the checkout asks. The box is required — validated `accepted`, not
`present`, because an empty field is what an unticked checkbox sends and
a consent that can be produced by leaving something blank is not a
consent — and the metadata carries exactly the string '1' the webhook
compares against.

One box for the page rather than one per card: the sentence is the
statutory wording and four copies of it is a wall nobody reads. The forms
carry it as a hidden field bound to that box, and the buy buttons stay
disabled until it is ticked. With JavaScript off the field arrives empty
and the server refuses with the sentence explaining why — the safe
direction to fail in. Ticking a box in a browser was never the record
anyway: the record is the timestamp taken when the payment lands.

Tested at both seams and along the whole chain: refused without it,
refused for '', '0' and a word that is not yes, carried to Stripe as '1',
and a webhook carrying it lands as a timestamp on the order while one
without it lands as null.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-29 21:19:03 +02:00
..
Actions Ask whether they are a consumer, and let one change their mind 2026-07-29 21:06:06 +02:00
Console Bill a booked module every month, and put it on the invoice 2026-07-29 20:22:02 +02:00
Exceptions Refuse a portal login for an address that already belongs to an operator 2026-07-28 14:42:16 +02:00
Http Ask for the express request to begin, and send it to Stripe 2026-07-29 21:19:03 +02:00
Jobs Let the export have as many destinations as somebody wants 2026-07-29 02:43:15 +02:00
Listeners Keep a register of what was sent, and answer the customer from here 2026-07-29 21:02:36 +02:00
Livewire Ask whether they are a consumer, and let one change their mind 2026-07-29 21:06:06 +02:00
Mail Keep a register of what was sent, and answer the customer from here 2026-07-29 21:02:36 +02:00
Models Ask whether they are a consumer, and let one change their mind 2026-07-29 21:06:06 +02:00
Notifications Add the SSH identity to the vault, and give deployment config a console page 2026-07-29 00:52:44 +02:00
Observers Apply a bought plan change instead of only pricing it 2026-07-29 17:18:55 +02:00
Policies Move the console's identity out of the customer table 2026-07-28 10:31:43 +02:00
Providers Keep a register of what was sent, and answer the customer from here 2026-07-29 21:02:36 +02:00
Provisioning Deliver the storage a customer actually buys 2026-07-29 19:13:10 +02:00
Services Ask whether they are a consumer, and let one change their mind 2026-07-29 21:06:06 +02:00
Support Keep a register of what was sent, and answer the customer from here 2026-07-29 21:02:36 +02:00