CluPilotCloud/app/Mail
nexxo 880b5f1998 Merge main into the operating-mode branch
Three real conflicts, and one file that did not conflict and mattered more.

Overview::notices(): both sides added notices. Kept all of them, and pointed
main's mail check at MailboxTransport::NON_DELIVERING — its own comment already
named the constant while the code carried a copy of the list.

billing.blade.php: main wrapped the page in a contract branch. The "payment is
not set up" error moved OUTSIDE it, because the customer most likely to meet
that message is the one buying for the first time, who has no contract yet and
would never have seen it from inside the @else.

ConsoleReportsRealDataTest: kept both sides rather than choosing. The renamed
test and its docblock explain why admin.systems_ok can no longer be asserted on
a bare install; main's mail pin still keeps "clean" clean in the mail
dimension. Picking one would have quietly weakened the other's claim.

HostStepsTest: git combined main's config()->set('provisioning.dns.zone',
'clupilot.com') with this branch's assertion on clupilot.cloud, and produced a
test that contradicted itself with no marker. Main's approach is the better one
— it pins the zone in the test and asserts the SHAPE of the name rather than
this box's domain — so its assertion stands.

HttpStripeClient merged silently and correctly: secret() still throws,
isConfigured() still reads the vault directly. Had it taken main's
filled($this->secret()), six callers that ask in order NOT to get an exception
would have become exception throwers, and the suite would have stayed green.
CheckoutWithoutStripeKeyTest is the lock that would have caught it.

StripeIdempotencyKeyTest (new on main) leaned on the environment fallback for
stripe.secret. That entry is strict now — no fallback in either direction, so
the .env cannot be a back door for a live key in test mode. It stores a real
vault row instead.

1966 tests pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-30 17:53:20 +02:00
..
Concerns Pin CloudReady's null-mailbox guard and share it with the trait 2026-07-27 23:59:05 +02:00
Transport Fix round: read the mailer against NON_DELIVERING, not against 'log' alone 2026-07-30 13:27:14 +02:00
DormantAccountWarningMail.php Accept terms instead of a start date, and fix the sender no server accepts 2026-07-30 15:22:35 +02:00
InvoiceMail.php Accept terms instead of a start date, and fix the sender no server accepts 2026-07-30 15:22:35 +02:00
MaintenanceAnnouncementMail.php Put every mail in one design, and confirm an order when the money arrives 2026-07-29 00:14:04 +02:00
MaintenanceCancelledMail.php Put every mail in one design, and confirm an order when the money arrives 2026-07-29 00:14:04 +02:00
NewDeviceSignInMail.php Recognise the devices an account signs in from, and warn about a new one 2026-07-28 23:28:34 +02:00
OperatorMessageMail.php Keep a register of what was sent, and answer the customer from here 2026-07-29 21:02:36 +02:00
OrderConfirmationMail.php Accept terms instead of a start date, and fix the sender no server accepts 2026-07-30 15:22:35 +02:00
ResetPasswordMail.php Give people a way back in, and put the URL in English 2026-07-29 16:50:29 +02:00
VerifyEmailMail.php Require a confirmed address before an account can use anything 2026-07-28 23:43:20 +02:00