CluPilotCloud/resources/views/livewire/admin
nexxo f00cbf18d3
tests / pest (push) Failing after 7m59s Details
tests / assets (push) Successful in 23s Details
tests / release (push) Has been skipped Details
Let an operator correct a customer's details
The console could show them and not touch them, so a moved office or a new
contact person meant impersonating the customer or editing the database by
hand. Both are worse than a form. R20: a modal, opened from the Stammdaten
tab, authorising again and reading the record itself rather than trusting
anything the browser hydrated.

Most of the work is in what saving must NOT quietly do.

The customer type is never reset to "nobody asked". The field opens on
"leave unchanged" precisely so that saving an address correction cannot
undo it — that answer decides whether a withdrawal right exists, and losing
it silently would be the expensive kind of quiet.

A changed VAT number is unverified from the moment it is stored — the
verification is bound to the value, so that happens by itself — but
`vat_id_verified_value` is left alone: it is the record of what WAS checked,
and clearing it would destroy the evidence rather than the claim.

The address is also the sign-in address and the key inbound mail is matched
by, so changing it moves the linked portal login in the same transaction and
puts it back to unverified, which is what Laravel's own profile update does
for the same reason: nobody has shown they can read the new address. No mail
is sent from here — the portal asks for the confirmation at the next
sign-in, and a mail an operator did not knowingly send is a surprise.

Three addresses are refused: one belonging to an operator (R21 — no index
spans the two tables, so it is checked), one belonging to another customer,
and one belonging to somebody else's user row, which can outlive or predate
a matching customer.

Not offered here, each for its own reason: `status`, because suspending has
consequences for access and a lifecycle switch hidden among address fields
is one somebody flips by accident; `stripe_customer_id`, because a wrong one
does not move a contract, it points our records at somebody else's payments;
the brand fields, because the customer sets those for themselves and an
operator overwriting a logo is not a correction. There is a test that fails
if any of them appears — with the comments stripped first, since the class
documents at length why they are absent and that documentation is not the
offence. This repository has fallen into that trap three times.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-29 23:18:46 +02:00
..
capacity.blade.php Take the order, park it, and say when it will be delivered 2026-07-29 18:50:46 +02:00
confirm-delete-datacenter.blade.php One definition of the navigation, and the country instead of the building 2026-07-27 16:09:39 +02:00
confirm-delete-incident.blade.php Let an incident be deleted, and start measuring whether the hosts answer 2026-07-29 15:16:48 +02:00
confirm-delete-plan-draft.blade.php feat(admin): a console for creating, pricing and scheduling plans 2026-07-26 12:41:51 +02:00
confirm-delete-vpn-peer.blade.php feat(admin): VPN access management with live peer state 2026-07-25 21:38:12 +02:00
confirm-disable-two-factor.blade.php Replace native confirm() dialogs with the app's own modal pattern 2026-07-28 19:34:27 +02:00
confirm-end-other-sessions.blade.php Show where an account is signed in, and let it sign the other places out 2026-07-28 23:38:17 +02:00
confirm-forget-secret.blade.php Replace native confirm() dialogs with the app's own modal pattern 2026-07-28 19:34:27 +02:00
confirm-reissue-vpn-peer.blade.php Replace native confirm() dialogs with the app's own modal pattern 2026-07-28 19:34:27 +02:00
confirm-remove-host.blade.php One definition of the navigation, and the country instead of the building 2026-07-27 16:09:39 +02:00
confirm-restart-instance.blade.php Restart a machine, enforce the quota that was sold, end a route that ended 2026-07-29 18:28:28 +02:00
confirm-save-env.blade.php Add a raw .env editor to the Integrations page, with a net under it 2026-07-29 01:51:27 +02:00
confirm-save-secret.blade.php Replace native confirm() dialogs with the app's own modal pattern 2026-07-28 19:34:27 +02:00
customer-detail.blade.php Let an operator correct a customer's details 2026-07-29 23:18:46 +02:00
customers.blade.php Ask whether they are a consumer, and let one change their mind 2026-07-29 21:06:06 +02:00
datacenters.blade.php Let a datacenter code be corrected while nothing depends on it, and say which building 2026-07-28 22:25:21 +02:00
edit-customer.blade.php Let an operator correct a customer's details 2026-07-29 23:18:46 +02:00
edit-datacenter.blade.php Let a datacenter code be corrected while nothing depends on it, and say which building 2026-07-28 22:25:21 +02:00
edit-export-target.blade.php Let a destination say how it is laid out and how long anything stays 2026-07-29 03:08:27 +02:00
edit-invoice-series.blade.php Give the console a Finance tab: company details, VAT rate, invoice series 2026-07-29 01:18:43 +02:00
edit-mail-template.blade.php Fix a cancel button that did nothing, and fit the answers on one screen 2026-07-29 22:50:16 +02:00
edit-plan-family.blade.php Move each plan's marketing copy from the controller into the console 2026-07-29 14:31:44 +02:00
finance.blade.php Quote what a person pays, and tab the settings page 2026-07-29 19:18:10 +02:00
grant-plan.blade.php Grant a package or module from the customer's row in the console 2026-07-29 12:42:21 +02:00
host-create.blade.php Let a datacenter code be corrected while nothing depends on it, and say which building 2026-07-28 22:25:21 +02:00
host-detail.blade.php Match the panel to the approved template, measured rather than assumed 2026-07-27 17:08:05 +02:00
hosts.blade.php Read VPN host state from the synced peer table, not a live hub call 2026-07-29 00:18:21 +02:00
inbox.blade.php Read the support mailbox into the console 2026-07-29 21:41:29 +02:00
incidents.blade.php Let an incident be deleted, and start measuring whether the hosts answer 2026-07-29 15:16:48 +02:00
instance-admin-access.blade.php One definition of the navigation, and the country instead of the building 2026-07-27 16:09:39 +02:00
instances.blade.php Restart a machine, enforce the quota that was sold, end a route that ended 2026-07-29 18:28:28 +02:00
integrations.blade.php Read the support mailbox into the console 2026-07-29 21:41:29 +02:00
invoices.blade.php Write an invoice for work that came off no price list 2026-07-29 20:12:26 +02:00
mail-log.blade.php Keep a register of what was sent, and answer the customer from here 2026-07-29 21:02:36 +02:00
mail-templates.blade.php Say that a click landed, and make moving one actually move it 2026-07-29 23:06:30 +02:00
mail.blade.php Bound the mail test-send and real send to a timeout instead of hanging 2026-07-28 16:36:14 +02:00
maintenance.blade.php Show times on the operator's clock, keep storing them in UTC 2026-07-27 17:32:21 +02:00
new-invoice.blade.php Write an invoice for work that came off no price list 2026-07-29 20:12:26 +02:00
overview.blade.php Keep a register of what was sent, and answer the customer from here 2026-07-29 21:02:36 +02:00
plan-versions.blade.php Paketversionen: Verkauf wieder aufnehmen und saubere Übergabe 2026-07-29 14:58:11 +02:00
plans.blade.php Let the owner mark one plan as recommended, from the console 2026-07-29 14:22:22 +02:00
provisioning.blade.php Match the panel to the approved template, measured rather than assumed 2026-07-27 17:08:05 +02:00
record-withdrawal.blade.php Charge the price the website shows, and hand a withdrawal back in full 2026-07-29 22:42:02 +02:00
revenue.blade.php Match the panel to the approved template, measured rather than assumed 2026-07-27 17:08:05 +02:00
settings.blade.php Quote what a person pays, and tab the settings page 2026-07-29 19:18:10 +02:00
two-factor-setup.blade.php Quote what a person pays, and tab the settings page 2026-07-29 19:18:10 +02:00
vpn-config-access.blade.php feat(vpn): ownership, a Developer role, and password-gated config retrieval 2026-07-25 22:31:54 +02:00
vpn.blade.php Replace native confirm() dialogs with the app's own modal pattern 2026-07-28 19:34:27 +02:00