feat: Packstation ueber DHL-Standortsuche als Lieferziel waehlbar
Docker Image bauen und veroeffentlichen / build-and-push (push) Successful in 2m8s
Docker Image bauen und veroeffentlichen / build-and-push (push) Successful in 2m8s
Im Checkout laesst sich unter "Versand" jetzt zwischen der eigenen
Anschrift und einer DHL-Packstation waehlen. Postleitzahl eingeben,
suchen, Packstation aus der Trefferliste anklicken, DHL-Postnummer
eintragen — die Auswahl wird an der Bestellung gespeichert.
Aufbau:
- lib/dhl-locations.ts: Client fuer die DHL Location Finder Unified API
(GET /find-by-address). Bewusst getrennt von lib/dhl.ts — das ist ein
anderer DHL-Dienst mit anderer Authentifizierung: nur der API-Key im
Header, kein OAuth und kein Geschaeftskundenvertrag. Die
Packstation-Auswahl funktioniert damit auch, solange die
Versandmarken-Erstellung noch nicht eingerichtet ist.
- api/shop/packstationen: serverseitiger Zwischenschritt, damit der
DHL-API-Key nicht ins Browser-Bundle geraet. Streng rate-limitiert
(15/Minute statt 60 wie die Produktsuche) und mit 15-Minuten-Cache:
dahinter steht ein FREMDES Kontingent von 500 Aufrufen pro Tag, das ein
ungebremstes Suchfeld an einem Nachmittag aufbrauchen koennte.
- Order/Address: packstationNumber + postNumber (Migration
20260915222938_add_packstation_delivery, beide nullable).
- checkoutSchema: Postnummer als 6-10 Ziffern, plus zwei refine-Regeln —
ohne Postnummer keine Packstation (DHL verlangt sie zwingend), und eine
Packstation nur bei Versand, nicht bei Abholung.
Zwei Entscheidungen, die Folgearbeit ersparen:
- Bei Packstation-Auswahl tragen street/zip/city zusaetzlich die lesbare
Anschrift ("Packstation 145", PLZ, Ort). Dadurch zeigen Rechnung,
Bestaetigungsmail, Sendungsverfolgung und Admin-Ansicht ohne jede
Aenderung etwas Sinnvolles; packstationNumber/postNumber tragen daneben
das, was DHL technisch braucht.
- lib/dhl.ts baut daraus einen Locker-Empfaenger statt einer
Hausanschrift. DHL kennt fuer den Empfaenger zwei sich ausschliessende
Formen; eine Packstation als Strassentext zu schicken ergaebe eine Marke
auf eine Anschrift, die es nicht gibt.
Die Option erscheint nur, wenn DHL_API_KEY gesetzt ist — sonst wuerde
Kundschaft in eine Suche laufen, die immer fehlschlaegt.
Geprueft: sechs Tests fuer das Umsetzen der DHL-Antwort (die
Packstation-Nummer steht in location.keywordId, NICHT in
location.ids[0].locationId — letzteres ist ein Systemcode, mit dem weder
Kundschaft noch DHL etwas anfangen kann). Dazu am laufenden
Produktions-Build: ohne Key liefert der Endpunkt 503 und der Checkout
zeigt die Option gar nicht; mit Key 400 bei ungueltiger PLZ und ein echter
Aufruf an api.dhl.com, der mit 401 quittiert wird — URL, Header und
Anfrageformat stimmen also. Im Browser durchgeklickt: Umschalten blendet
das Strassenfeld aus und Postnummer samt Suche ein, die Suche ruft die
Route und zeigt die Fehlermeldung an.
Feldnamen beider DHL-APIs vorab gegen developer.dhl.com geprueft. Ein
Lauf gegen einen echten Schluessel steht noch aus.
Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
This commit is contained in:
1 parent
ff365c3cb1
commit
9dd71ffb9a
16 files changed
+757
-8
No files matched your search
@@ -1034,6 +1034,7 @@ export const de: Dictionary = {
|
||||
noInquiriesYet: "Noch keine Firmenanfragen eingegangen.",
|
||||
},
|
||||
adminOrderDetailPage: {
|
||||
postNumberLabel: "DHL-Postnummer",
|
||||
backToOrders: "Zurück zu Bestellungen",
|
||||
saveStatus: "Status speichern",
|
||||
giftHeading: "🎁 Geschenk: Nachricht beilegen",
|
||||
@@ -1324,6 +1325,22 @@ export const de: Dictionary = {
|
||||
shippingOption: "Versand",
|
||||
pickupOption: "Abholung in Altenmünster",
|
||||
deliveryTimeNote: "Übliche Lieferzeit: 2–4 Werktage nach Zahlungseingang.",
|
||||
deliveryTargetAddress: "An meine Adresse",
|
||||
deliveryTargetPackstation: "An eine Packstation",
|
||||
packstationIntro:
|
||||
"Gib die Postleitzahl ein, in deren Nähe die Packstation liegen soll. Die Standorte kommen direkt von DHL.",
|
||||
packstationZipLabel: "Postleitzahl",
|
||||
packstationSearchButton: "Packstationen suchen",
|
||||
packstationSearching: "Suche läuft …",
|
||||
packstationNoResults: "Zu dieser Postleitzahl wurde keine Packstation gefunden.",
|
||||
packstationChooseHint: "Bitte wähle eine Packstation aus der Liste.",
|
||||
packstationSelectedLabel: "Gewählte Packstation",
|
||||
packstationChange: "Andere Packstation wählen",
|
||||
packstationDistance: (meters: number) =>
|
||||
meters < 1000 ? `ca. ${meters} m entfernt` : `ca. ${(meters / 1000).toFixed(1)} km entfernt`,
|
||||
postNumberLabel: "DHL-Postnummer",
|
||||
postNumberHint:
|
||||
"Deine 6- bis 10-stellige Postnummer aus dem DHL-Kundenkonto. DHL kann ohne sie nicht an eine Packstation liefern.",
|
||||
streetLabel: "Straße und Hausnummer",
|
||||
zipLabel: "PLZ",
|
||||
cityLabel: "Ort",
|
||||
|
||||
Reference in new issue
Block a user