|
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>
|
||
|---|---|---|
| .. | ||
| Builders | ||
| Concerns | ||
| Backup.php | ||
| Customer.php | ||
| Datacenter.php | ||
| DnsRecord.php | ||
| ExportTarget.php | ||
| Host.php | ||
| InboundMail.php | ||
| Incident.php | ||
| IncidentUpdate.php | ||
| Instance.php | ||
| InstanceMetric.php | ||
| InstanceTraffic.php | ||
| Invoice.php | ||
| InvoiceExport.php | ||
| InvoiceSeries.php | ||
| LoginSession.php | ||
| MailTemplate.php | ||
| Mailbox.php | ||
| MaintenanceNotification.php | ||
| MaintenanceWindow.php | ||
| MonitoringTarget.php | ||
| OnboardingTask.php | ||
| Operator.php | ||
| Order.php | ||
| PlanFamily.php | ||
| PlanPrice.php | ||
| PlanVersion.php | ||
| ProvisioningRun.php | ||
| ProvisioningStepEvent.php | ||
| RunResource.php | ||
| Seat.php | ||
| SentMail.php | ||
| StatusDay.php | ||
| StripeAddonPrice.php | ||
| StripePendingEvent.php | ||
| Subscription.php | ||
| SubscriptionAddon.php | ||
| SubscriptionRecord.php | ||
| SupportRequest.php | ||
| User.php | ||
| UserDevice.php | ||
| VpnPeer.php | ||