Dies ist Version 0.9.0 der Dokumentation
(zuletzt geändert: 2020-09-30).
Es beschreibt die API Version 0.
Jegliche Weiterentwicklung der API ist vollkommen abwärtskompatibel:
Alle Dokumentationen der Version v0.x beschreiben die v0 API,
während neuere Versionen der Dokumentation
(so wie die, die Sie gerade lesen)
nur zusätzliche inkrementelle Funktionen enthalten
und dabei keine Änderung von bestehenden Funktionen beschreiben.
Inhaltsverzeichnis:
/orders API Routen
POST /orders
DELETE /orders/ID
quality”)
Dieses Dokument beschreibt den aktuellen Entwicklungsstand der Geisenheim (TODO) API. Wir Wir legen großen Wert darauf, so genau wie möglich zu sein. Sollten Sie dennoch einen Fehler in der Dokumentation finden, kontaktieren Sie uns direkt damit wir so schnell wie möglich eine Lösung finden können. Im Falle eines unerwarteten API-Verhaltens, unvollständige Definitionen, zusätzliche Vorschläge, und alle anderen Anfragen bezüglich der API, Bitte kontaktieren Sie uns, das Euvino GmbH Entwicklerteam, at 030 983 959 16 or api@euvinopro.eu.
Basis-URL für alle Requests:
https://rest.TODO.de,
siehe 1.1 Basis-URL.
(Die Test-API benutzt eine abweichende Basis-URL, siehe 1.2 Test-API.)
Zugang zur API: Um die jeweiligen Zugangsdaten zu generieren, besuchen Sie das Geisenheim (TODO) Backend (app.euvinopro.eu/winegrower/interfaces) loggen sich mit dem Account des jeweiligen Weinguts ein und aktivieren die API. Dadurch werden Zugangsdaten erstellt bzw. neu generiert, die aus einem Nutzernamen (üblicherweise die E-Mail-Adresse des Nutzers die auch für den Backend-Login genutzt wird) und einem Passwort (zufällig generiert) besteht.
Authentifizierung:
Jeder API-Request muss einen Authorization HTTP Header
mit den API Authentifizierungsdaten enthalten,
im Standard HTTP Basic format:
Der Wert des Headers ist “Basic ”
gefolgt durch die Base64 Repräsentierung
des Nutzernamen gefolgt durch einen Doppeltpunkt und dem Passwort.
Um zum Beispiel die API mit dem Nutzernamen api@test.de
und dem password pw141819 zu nutzen:
$username = "api@test.de";
$password = "pw141819";
$header = "Authorization: Basic " . base64_encode($username . ":" . $password);
// $header == "Authorization: Basic YXBpQHRlc3QuZGU6cHcxNDE4MTk=
Generische HTTP Antworten:
Das Resultat eines jeden Requests wird durch den HTTP-Status der Antwort mitgeteilt.
Die Requests werden üblicherweise mit einem
200 OkStatus beantwortet.
Zusätzlich gibt es folgende Stati im Fehlerfall:
Authorization-Header fehlt oder enthält ungültige Daten
JSON Definitionen:
optionale JSON Schlüssel können üblicherweise ausgelassen
oder auf null gesetzt werden, ohne das Fehler entstehen.
Ein leerer String ("")
ist damit nicht gleichwertig
sondern wird als Eingabe verarbeitet.
Wie üblich ist die Reihenfolge der JSON Objektschlüssel irrelevant.
Jeglicher whitespace (außerhalb von Stringwerten) wird ignoriert.
Alle Eingaben dürfen ausschließlich im UTF-8 Encoding gesendet werden.
Alle JSON Antworten entsprechen der JSON-Spezifikation
(json.org,
RFC 7159).
Die API erwartet, dass alle Eingabedaten ebenfalls diesem Standard entsprechen.
Standard-Header:
Alle Requests müssen den Content‑Type: application/json
oder Content‑Type: application/json; encoding=utf-8 HTTP Header enthalten,
um den Inhaltstyp des Requests zu beschreiben.
Alle API-Antworten werden diesen Header ebenfalls beinthalten.
https://rest.TODO.de.
Alle API-Routen in diesem Dokument beziehen sich auf diese URL.
Wenn zum Beispiel von der Route (/orders) die Rede ist,
lautet die vollständige URL
https://rest.TODO.de/orders.
Die Testumgebung nutzt eine abweichende Basis-URL:
https://rest.test.TODO.de.
Aus Sicherheitsgründen nutzt die Test-API nicht nur eine separate Datenbank sondern auch abweichende Zugangsdaten.
/orders API Routen /orders Routen können neue Rechnungen angelegt, aufgelistet und entfernt werden.
POST /orders POST /orders Route legt eine neue Bestellung / Rechnung an.
Retouren bzw Negativbuchungen können hierüber ebenfalls eingebucht werden.
Diese Route erwartet ein JSON-Objekt im Request Body, das gewisse Pflichtfelder erfüllen muss. Alle Felder sind verpflichtend, wenn nicht anders vermerkt.
Die möglichen Ausprägungen der Felder finden Sie unter 3. Definition möglicher Werte bzw. neben den jeweiligen Feldern. Es folgt der Inhalt eines Beispiel-Requests:
{
"date": "2020-09-22", /* Rechnungsdatum im Format JJJJ-MM-TT, nicht das Datum der Übertragung */
"id": 3459872, /* fortlaufende Datenbank ID, nicht die Rechnungsnummer.
Wird zur späteren Erfassung von Stornierungen und zur Nachvollziehbarkeit von ggf. Übertragungsfehlern verwendet */
"recipient": /* Informationen zum Rechnungsempfänger */ {
"id": "OQU0-XUI3", /* Interner eindeutiger Identifikator des Empfängers.
Alle Formate werden akzeptiert: Zahlen, Buchstaben, ... */
"type": 1, /* Art des Empfängers, für mögliche Werte siehe 3.1 Liste möglicher Kundentypen (“type”) */
"source": "online", /* Quelle der Buchung, "online" für Bestellungen im Onlineshop, "local" für Direktbuchungen, Hofverkauf, etc. */
"delivery": "DHL", /* Lieferweg - mögliche Werte: "DHL", "DPD", "GLS", "Zufuhr", und für Speditionen den Namen der Spedition, z.B. "Spedition XYZ" */
"postalCode": 124, /* Die ersten drei Stellen der Postleitzahl des Empfängers */
"country": "DE", /* Land des Empfängers (nach ISO 3166-1 alpha-2) */
// folgende Felder sind nur für Endverbraucher anwendbar (type == 1)
// alle dieser Felder sind optional
"yearOfBirth": 1972, /* Geburtsjar im Format JJJJ */
"agreesToMarketing": true, /* Zustimmmung zum Onlinemarketing (true/false) */
"gender": "m", /* Geschlecht des Kunden: m für männlich, f für weiblich, x für divers */
"paymentMethod": "paypal", /* Zahlungsmethode, für mögliche Werte siehe 3.2 Liste möglicher Zahlungsmethoden (“paymentMethod”) */
},
"items": /* Liste der bestellten Produkte */ [
{
"quantity": 6, /* Anzahl der gekauften Flaschen dieses Weines */
"category": 1, /* Produktkategorie, für mögliche Werte siehe 3.3 Liste möglicher Produktkategorien (“category”) */
"size": 750, /* Flaschengröße in ml, akzeptierte Werte siehe 3.4 Liste von möglichen Flaschengrößen (“bottlesize”) */
"price": 7.5, /* Einzelpreis der Einzelflasche inkl. eventueller Abzüge / Rabatte */
"tax": 1.2, /* enthaltene Umsatzsteuer der Einzelflasche */
"discount": 0.0, /* ggf. gewährter Rabatt bezogen auf die Einzelflasche */
// das folgende Feld ist nur für Wein und Schaumwein anwendbar (category == 1 bzw. category == 1)
"quality": 2, /* Qualitätsstufe, für mögliche Werte siehe 3.7 Liste möglicher Geschmacksausprägungen (“taste”) */
// folgende Felder sind nur für Weine anwendbar (category == 1)
"grapes": [2473, 2455], /* Liste der Rebsorten des Weines, amtl. Rebsortennummer. Erlaubte Werte siehe 3.6 Liste von akzeptieren Rebsorten “grapes” */
"taste": 1, /* Geschmack, für mögliche Werte siehe */
"vdp": null, /* VDP-Klassifikation, optional, für mögliche Werte siehe 3.8 Liste möglicher VDP-Klassifikationen (“vdp”) */
}
]
}
Antworten:
⚠ Im Fall einer 400 Bad Request Antwort müssen die Daten anhand der Validierungsantwort angepasst und erneut übertragen werden.
Im Sonderfall einer 500 Internal Server Error Antwort gibt es ein temporäres Serverproblem. In diesem Fall ist die Übertragung zu einem späteren Zeitpunkt zu wiederholen.
DELETE /orders/ID DELETE /orders/ID Route
ermöglicht es, die Erstattung / Stornierung einer Bestellung vorzunehmen.
Die ID in der Route entspricht der id, die beim Anlegen der Bestellung -
wie in 2.1 POST /orders dargestellt - verwendet wird.
Antworten:
type”) type”:
1 – Endverbraucher 2 – Fachhandel 3 – Gastronomie 4 – Lebensmitteleinzelhandel 5 – Großhändler / Importeur 6 – Export 7 – Onlinehandel 8 – Duty Free 9 – Airline paymentMethod”) type”:
"cash" – Barzahlung bei Abholung "paypal" – PayPal "invoice" – Rechnung "credit" – Kreditkarte "sepa" – SEPA Lastschrift "other" – Sonstiges category”) type”:
1 – Wein 2 – Schaumwein 3 – Perlwein 4 – alkoholfreier Wein 5 – Offenwein 9 – Sonstiges (z.B. Tresterbrand, Traubensaft, etc.) bottlesize”)
200
250
375
500
620
700
750
1000
1500
3000
quality”) type”:
1 – Deutscher Wein 2 – Landwein 3 – Qualitätswein 4 – Prädikatswein 5 – Winzersekt 6 – Sekt b.A. 7 – Sekt grapes”
10077 – Riesling 8141 – Müller-Thurgau 9275 – Grauburgunder 9272 – Weißburgunder 11805 – Silvaner 6123 – Kerner 2455 – Chardonnay 851 – Bacchus 10818 – Scheurebe 10790 – Sauvignon Blanc 2473 – Gutedel 12609 – Traminer 3865 – Elbling 8811 – Ortega 5463 – Huxelrebe 9279 – Spätburgunder 3659 – Dornfelder 9620 – Portugieser 12665 – Trollinger 1459 – Lemberger/ Blaufränkisch 9278 – Schwarzriesling 4572 – Regent 7657 – Merlot 10470 – St-Laurent 17123 – Acolon 1929 – Cabernet Sauvignon 3632 – Domina 15499 – Cabernet Mitos 20002 – Cabernet Dorsa 9280 – Frühburgunder 3724 – Dunkelfelder
Sollte ein Wein keine der oben genannten Rebsorten enthalten, so wird der Schlüssel
grapes mit einem leeren Array [] übertragen.
taste”) type”:
dry – trocken medium-dry – halbtrocken
off-dry – feinherb medium-sweet – lieblich sweet – süß brut-natur – Brut Nature extra-brut – Extra Brut brut – Brut extra-dry – Extra Trocken mild – Mild
Sollte ein Wert nicht zutreffen, kann null übergeben werden.
vdp”) vdp”:
1 – VDP.GROSSE LAGE® 2 – VDP.ERSTE LAGE® 3 – VDP.ORTSWEIN 4 – VDP.GUTSWEIN 6 – VDP.GROSSES GEWÄCHS®
Ist der Wein außerhalb der VDP-Klassifikation soll null übergeben werden.