Das Problem
Wer Drucksachen bestellt, hat zuerst zwei Fragen: Was kostet es und wann ist es da. Bei Denia Print wollte ich beide beantworten, während man sich durch die Optionen klickt, auf einer statischen Seite und ohne Ladeanzeige nach jeder Auswahl.
Der Preis ist die leichtere Hälfte. Das Lieferdatum ist schwieriger. Es hängt von den Produktionstagen genau der gewählten Kombination ab, vom täglichen Bestellschluss des Lieferanten, von Feiertagen in zwei Ländern und davon, wie spät es gerade ist.
Der Ansatz
Preis. Die Seite ist statisches Astro auf Cloudflare Pages. Bei den meisten Produkten liest der Rechner eine Preistabelle, die in die Seite eingebaut ist. Diese Tabelle wird jede Woche aus der API des Lieferanten neu gebaut und ausgeliefert. Eine Auflage oder ein Papier zu wählen braucht also keine einzige Anfrage. Banner haben einen Preis pro Maß und fragen deshalb einen kleinen Endpunkt nach einem Live-Preis. Der erweiterte Katalog macht es genauso, wobei die Antwort pro Variante 12 Stunden im Edge-Cache liegt.
Lieferdatum. Der Rechner zeigt eine Zeile wie “Bestelle vor 11:30 (noch 2 Std. 14 Min.) und erhalte es Mi., 7. Okt. bis Do., 8. Okt.”. Sie wird im Browser aus vier Dingen berechnet:
- den Produktionstagen der gewählten Kombination, die schon mit den Preisdaten kommen
- dem Bestellschluss des Lieferanten: 11:30 Uhr Amsterdamer Zeit, Montag bis Freitag
- einem Werktag für meine eigene Bearbeitung, weil ich die Datei prüfe, bevor sie zum Lieferanten geht
- einer Liste von Feiertagen: den niederländischen für die Produktion, den spanischen landesweiten und denen der Comunitat Valenciana für die Zustellung in Dénia und der Marina Alta
Der Bestellschluss wird in der Amsterdamer Zeitzone berechnet, sodass der Browser die Zeitumstellung übernimmt, und in der Zeitzone des Besuchers angezeigt. Die Zeile wird alle 30 Sekunden neu gezeichnet, außerdem wenn der Tab wieder sichtbar wird und wenn sich das Feld für die Abholung im Bestellformular ändert. Bei Abholung in Dénia steht dort “verfügbar ab” mit dem späteren Datum. Screenreadern wird nur das Datum angesagt, wenn es sich ändert, nie der laufende Countdown.
Die Regel habe ich am frühesten Lieferdatum des Lieferanten selbst geeicht, für 40 Kombinationen aus Produkt und Geschwindigkeit. Bestelltag plus Produktionstage stimmte 21-mal, lag 17-mal später und 2-mal früher. Mit meinem Bearbeitungstag obendrauf liegt der Zeitraum, den ich zeige, in 39 von 40 Fällen auf der späten Seite. Einige Produkte laufen langsamer, als ihre Produktionstage vermuten lassen. Sie bekommen zusätzliche Werktage aus einer kleinen Tabelle.
Das Datum wandert in die Bestellzeilen und in die E-Mails, sodass der Kunde und ich auf dasselbe Versprechen schauen.
Den Preis noch einmal prüfen. Einem Preis, den der Browser berechnet hat, kann der Server nicht trauen. Der Warenkorb liegt im localStorage mit höchstens 20 Zeilen. Ist der Speicher blockiert, funktioniert die Seite weiterhin pro Produkt. Bevor der Warenkorb abgeschickt wird, fragt die Seite die Preise erneut bei denselben Quellen ab wie die Rechner. Ein geänderter Preis oder ein Produkt, das nicht mehr verkauft wird, wird markiert und blockiert das Absenden. Still angepasst wird nie etwas.
Danach macht der Server es für jede Zeile noch einmal: Tabellenprodukte gegen die Preistabelle, Banner und Katalogartikel gegen ein Live-Angebot des Lieferanten. Eine Zeile, die nicht passt, wird markiert, und das Dashboard hält die Bestellung beim Lieferanten für diese Zeile zurück, bis jemand sie angesehen hat. Beim erweiterten Katalog kennt der Browser nur die Positionen der Optionen. Die Artikelnummer des Lieferanten bleibt auf dem Server.
Die Abwägungen
- Das Datum ist eine Schätzung, und das zeige ich mit einem Zeitraum. Ich liege lieber zu spät: Jeder gezählte Tag muss in beiden Ländern ein Werktag sein. Eine Bestellung, die einen Tag früher kommt, ist in Ordnung, umgekehrt nicht.
- Die Feiertagsliste ist Handarbeit, einmal im Jahr. Ein Test schlägt zwei Monate vor dem Ende der Liste fehl, vergessen geht also nicht. Ein fehlendes Jahr würde Daten rund um seine Feiertage höchstens einen Tag zu optimistisch machen.
- Der Bestellschluss steht fest im Code. Verschiebt ihn der Lieferant, muss ich nachziehen. Die Eichung muss ab und zu wiederholt werden.
- Der Countdown nutzt die Uhr des Besuchers. Geht die Uhr des Geräts falsch, stimmt der Countdown nicht.
- Live-Angebote sind gedeckelt. Höchstens 10 Zeilen pro Bestellung bekommen ein Live-Angebot des Lieferanten. Der Rest wird für eine Prüfung von Hand markiert, damit ein Warenkorb nicht in 20 Aufrufe beim Lieferanten ausufert.
Mehr zum Shop steht auf der Projektseite von Denia Print.