Geisenheim (TODO) API-Docs v0.9.2 (2020-09-30)

Geisenheim (TODO) JSON API Dokumentation v0.9.2

Diese JSON API ist vorgesehen direkt mit dem Backend/der Datenbank von Geisenheim (TODO) zu kommunizieren (TODO.eu).

Dies ist Version 0.9.2 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:

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.

1. API Grundlagen

Die Geisenheim (TODO) API ist eine HTTP API die alle Eingabtedaten im JSON-Format erwartet, alle Antwortdaten werden ebenfalls im JSON-Format ausgegeben.

Achtung: Die Basis-URL ist bisher nur ein Platzhalter und wird erst ab Version 1.x der Dokumentation korrekt aufgelistet.

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:

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.

1.1 Basis-URL

Achtung: Die Basis-URL ist bisher nur ein Platzhalter und wird erst ab Version 1.x der Dokumentation korrekt aufgelistet.

Die Basis-URL für alle API-Requests ist 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.

1.2 Test-API

Achtung: Die Basis-URL ist bisher nur ein Platzhalter und wird erst ab Version 1.x der Dokumentation korrekt aufgelistet.

Es existiert eine Testumgebung. Es bietet die gleiche API aber opertiert auf einer separaten Datenbank um sicheres Testen zu ermöglichen.

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.

2. /orders API Routen

Über die /orders Routen können neue Rechnungen angelegt, aufgelistet und entfernt werden.

2.1 POST /orders

Die 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.5 Liste möglicher Qualitätsstufen (“quality”) */

            // 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 3.7 Liste möglicher Geschmacksausprägungen (“taste”) */
            "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.

2.2 DELETE /orders/??ID??

Die DELETE /orders/ID Route ermöglicht es, die Erstattung / Stornierung einer Bestellung vorzunehmen.
Dieser Request benötigt keinen Request-Body.

Die ID in der Route entspricht der id, die beim Anlegen der Bestellung - wie in 2.1 POST /orders dargestellt - verwendet wird. Antworten:

3. Definition möglicher Werte

3.1 Liste möglicher Kundentypen (“type”)

Die möglichen Werte für “type”:

1 Endverbraucher
2 Fachhandel
3 Gastronomie
4 Lebensmitteleinzelhandel
5 Großhändler / Importeur
6 Export
7 Onlinehandel
8 Duty Free
9 Airline

3.2 Liste möglicher Zahlungsmethoden (“paymentMethod”)

"cash" Barzahlung bei Abholung
"paypal" PayPal
"invoice" Rechnung
"credit" Kreditkarte
"sepa" SEPA Lastschrift
"other" Sonstiges

3.3 Liste möglicher Produktkategorien (“category”)

1 Wein
2 Schaumwein
3 Perlwein
4 alkoholfreier Wein
5 Offenwein
9 Sonstiges (z.B. Tresterbrand, Traubensaft, etc.)

3.4 Liste von möglichen Flaschengrößen (“bottlesize”)

3.5 Liste möglicher Qualitätsstufen (“quality”)

Werte für Weine (category == 1):
1 Deutscher Wein
2 Landwein
3 Qualitätswein
4 Prädikatswein
Werte für Schaumwein (category == 2):
5 Winzersekt
6 Sekt b.A.
7 Sekt

3.6 Liste von akzeptieren Rebsorten “grapes

(Amtliche Sortennummern)

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.

3.7 Liste möglicher Geschmacksausprägungen (“taste”)

Werte für Wein und Sekt
dry trocken
medium-dry halbtrocken
Werte für Weine (category == 1):
off-dry feinherb
medium-sweet lieblich
sweet süß
Werte für Schaumwein (category == 2):
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.

3.8 Liste möglicher VDP-Klassifikationen (“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.

4. Änderungsprotokoll

v0.9.2 (2020-09-30)
  • Hinweis über Platzhalter URL eingefügt
v0.9.1 (2020-09-30)
  • Anpassungen der Formatierung, textliche Anpassungen
v0.9 (2020-09-30)
  • Erste vorläufige Fassung der Dokumentation