|
tests / pest (push) Failing after 9m49s
Details
tests / assets (push) Successful in 21s
Details
tests / release (push) Has been skipped
Details
Two complaints, one cause: the customer page was a compose box with three
lists under it. It showed nothing ABOUT the customer, and every answer was
typed from scratch.
The page is five tabs now. Stammdaten — contact, phone, since when,
language, and the tax standing: consumer or business, with "nobody asked"
saying so rather than passing for business, because that answer decides
whether a withdrawal right exists at all. Paket — the contract's own
FROZEN figures, the modules at the price they were booked at, and the
machine: address, state, host, datacenter. Zahlungen — invoices with net,
gross and their PDF, and the orders beside them, because an order is a
purchase and an invoice is a document about one. Nachrichten — the portal
requests in the customer's own words, the mail they sent, the mail we
sent. Schreiben — last, because it is what you do after reading.
The tab is in the query string, like Settings and Integrations: a reload,
a bookmark and the back button all land where the operator was, and a link
can point at the tab that matters.
And templates, under Betrieb → E-Mail-Vorlagen. Most customer questions
are the same five questions, and typing the answer again every time is how
two customers get told two different things about one subject. A template
is INSERTED into the compose field with the customer's own details filled
in — never sent as it stands, because the last two sentences always belong
to the person asking. What goes out is what the operator saw and edited.
Three decisions worth naming. {{contact}} takes the contact person where
one is on record and the company name otherwise, because "Guten Tag
Beispiel GmbH" is the line that gives away a mail written by a database.
{{amount}} is the gross figure — what the price sheet quoted them and what
their bank statement says. And a typo comes out as {{kunde}}, standing
there in the field where the operator sees it, rather than as an empty
string that produces "Guten Tag ,". A placeholder with no value for this
customer stays empty; nothing is invented.
Placeholders are named in English because they are identifiers, not prose:
a template has to survive somebody switching the console's language. The
list the page documents is the renderer's own, so a token added in one
place appears in the other without being written down twice.
Blade's echo tag ends at the first }} it finds, which turned a literal
placeholder in the documentation into compiled nonsense. Assembled in PHP
now, and caught by the test that renders the page rather than by somebody
opening it.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
||
|---|---|---|
| .. | ||
| admin.php | ||
| admin_incidents.php | ||
| admin_settings.php | ||
| auth.php | ||
| backups.php | ||
| billing.php | ||
| capacity.php | ||
| checkout.php | ||
| cloud.php | ||
| coming_soon.php | ||
| common.php | ||
| customer_detail.php | ||
| customer_message.php | ||
| dashboard.php | ||
| datacenters.php | ||
| delivery.php | ||
| devices.php | ||
| domain.php | ||
| errors.php | ||
| finance.php | ||
| hosts.php | ||
| impersonate.php | ||
| inbox.php | ||
| instances.php | ||
| integrations.php | ||
| invoice.php | ||
| invoice_mail.php | ||
| invoices.php | ||
| invoices_admin.php | ||
| mail.php | ||
| mail_log.php | ||
| mail_settings.php | ||
| maintenance.php | ||
| new_invoice.php | ||
| order.php | ||
| orders.php | ||
| plans.php | ||
| provisioning.php | ||
| reset_password.php | ||
| secrets.php | ||
| security.php | ||
| sessions.php | ||
| settings.php | ||
| status.php | ||
| support.php | ||
| templates.php | ||
| two_factor_setup.php | ||
| updating.php | ||
| users.php | ||
| verify_email.php | ||
| vpn.php | ||
| withdrawal.php | ||