Geisenheim (Weinwirtschaftsportal) API-Docs v1.2.0 (2023-04-25)

Geisenheim (Weinwirtschaftsportal) JSON API Dokumentation v1.2.0

Diese JSON API ist vorgesehen direkt mit dem Backend/der Datenbank von Geisenheim (Weinwirtschaftsportal) zu kommunizieren (geisenheim-portal.de).

Dies ist Version 1.2.0 der Dokumentation (zuletzt geändert: 2023-04-25).
Es beschreibt die API Version 1.
Jegliche Weiterentwicklung der API ist vollkommen abwärtskompatibel: Alle Dokumentationen der Version v1.x beschreiben die v1 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 (Weinwirtschaftsportal)-API. 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ändiger Definitionen, zusätzlicher Vorschläge und aller anderen Anfragen bezüglich der API, bitte kontaktieren Sie uns, das Euvino GmbH-Entwicklerteam, unter 030 983 959 16 oder api@euvinopro.eu.

1. API Grundlagen

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

Basis-URL für alle Requests: https://api.geisenheim-portal.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 (Weinwirtschaftsportal)-Backend (backend.euvinopro.eu/winery/geisenheim/api) 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 Ok-Status 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 dass 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 beinhalten.

1.1 Basis-URL

Die Basis-URL für alle API-Requests ist https://api.geisenheim-portal.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://api.geisenheim-portal.de/orders.

1.2 Test-API

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

Die Testumgebung nutzt eine abweichende Basis-URL: https://api.staging.geisenheim-portal.de.

Aus Sicherheitsgründen nutzt die Test-API nicht nur eine separate Datenbank sondern auch abweichende Zugangsdaten.

2. /erp/orders API-Routen

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

2.1 POST /erp/orders

Die POST /erp/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.
                      Daher sollten keine Lücken in der fortlaufenden Nummerierung bestehen. */

    "recipient": /* Informationen zum Rechnungsempfänger */ {
        "id": "OQU0-XUI3",  /* Interner eindeutiger anonymer Identifikator des Empfängers.
                               die Email-Adresse des Kunden sollte z.B. nicht verwendet werden, ein Hash der Email-Adresse wäre in Ordnung.
                               Alle Formate werden akzeptiert: Zahlen, Buchstaben, Sonderzeichen ... */
        "category": 1,  /* Art des Empfängers, für mögliche Werte siehe 3.1 Liste möglicher Kundentypen (“category”) */
        "source": "online",  /* Quelle der Buchung, "online" für Bestellungen im Onlineshop, "local" für Direktbuchungen/Hofverkauf. Bei abweichenden Werten frei Eingabe */
    
        // folgende Felder sind nur für Onlinebestellungen verpflichtend (source == "online")
        "delivery": "DHL",  /* Lieferweg - mögliche Werte: "DHL", "DPD", "GLS", "Zufuhr", "Abholung", oder bei abweichenden Werten freie Eingabe, 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) oder freie Eingabe */

        // folgende Felder sind nur für Endverbraucher anwendbar (category == 1)
        // alle dieser Felder sind optional

        "yearOfBirth": 1972,  /* Geburtsjahr 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 */ [
        {
            "id": "127/4",  /* Artikelnummer */
            "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 brutto inkl. eventueller Abzüge / Rabatte, in EUR */
            "tax": 1.2,  /* enthaltene Umsatzsteuer der Einzelflasche, in EUR */
            "discount": 0.0,  /* ggf. gewährter Rabatt bezogen auf die Einzelflasche, in EUR */

            "organic": true,  /* Handelt es sich um ein zertifiziertes Bio-Produkt? optional */

            // das folgende Feld ist nur für Wein und Schaumwein anwendbar (category == 1 bzw. category == 2)
            "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 akzeptierten Rebsorten (“grapes”) */
            "wineType": "red",  /* Weinart, für mögliche Werte siehe 3.7 Liste möglicher Weintypen (“wineType”) */
            "taste": "dry",  /* Geschmack, für mögliche Werte siehe 3.8 Liste möglicher Geschmacksausprägungen (“taste”) */
            "vdp": null,  /* VDP-Klassifikation, optional, für mögliche Werte siehe 3.9 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 /erp/orders/ID

Die DELETE /erp/orders/ID Route ermöglicht es, die Erstattung / Stornierung einer Bestellung mitzuteilen.

Dieser Request benötigt keinen Request-Body. Beispiel:

DELETE https://api.geisenheim-portal.de/erp/orders/3459872

204 No Content

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

3. Definition möglicher Werte

3.1 Liste möglicher Kundentypen (“category”)

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

Sollte keiner dieser Werte zutreffen, kann auch ein anderer Textwert übergeben werden (freie Eingabe).

3.2 Liste möglicher Zahlungsmethoden (“paymentMethod”)

"cash" (Bar-)zahlung bei Abholung
"paypal" PayPal
"invoice" Rechnung
"advance" Vorkasse
"credit" Kreditkarte
"sepa" SEPA Lastschrift

Sollte keiner dieser Werte zutreffen, kann auch ein anderer Textwert übergeben werden (freie Eingabe).

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”)

Sollte keiner dieser Werte zutreffen, kann auch ein anderer Textwert übergeben werden (freie Eingabe).

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

Sollte keiner dieser Werte zutreffen, kann auch ein anderer Textwert übergeben werden (freie Eingabe).

3.6 Liste von akzeptierten 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

Sollten die Rebsorten des Weins nicht in dieser Liste enthalten sein, können im array auch freie Textwerte übertragen werden.

3.7 Liste möglicher Weintypen (“wineType”)

"red" Rotwein
"white" Weißwein
"rose" Roséwein
"rotling" Rotling
"blanc de noir" Blanc de Noir

Sollte keiner dieser Werte zutreffen, kann auch ein anderer Textwert übergeben werden (freie Eingabe).

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

Werte für Weine und Schaumweine:
"dry" trocken
"medium-dry" halbtrocken
Werte nur für Weine (category == 1):
"off-dry" feinherb
"medium-sweet" lieblich
"sweet" süß
Werte nur für Schaumweine (category == 2):
"brut-natur" Brut Nature
"extra-brut" Extra Brut
"brut" Brut
"extra-dry" Extra Trocken
"mild" Mild

Sollte keiner dieser Werte zutreffen, kann auch ein anderer Textwert übergeben werden (freie Eingabe).

3.9 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.

Sollte keiner dieser Werte zutreffen, kann auch ein anderer Textwert übergeben werden (freie Eingabe).

4. Änderungsprotokoll

v1.2.0 (2023-04-25)
  • Feld "id" - Artikelnummer ergänzt
v1.1.1 (2022-06-20)
  • Textfehler im Abschnitt "Zugang zur API" behoben
v1.1.0 (2022-03-28)
  • neues Feld für Weintyp
  • neues Feld für Ökologischen Anbau
  • Reduzierte Validierung bei übrigen Feldern
v1.0.0 (2022-01-25)
  • Verdeutlich bei Formulierung des Einzelpreises
v0.12.0 (2021-08-19)
  • Liste möglicher Kundentypen erweitert
v0.11.1 (2021-08-19)
  • falsch benanntes Feld korrigiert
v0.11.0 (2021-08-02)
  • Optionale Felder für Hofverkauf
v0.10.1 (2021-08-02)
  • Wert für Abholung
v0.10.0 (2021-06-01)
  • Wert für Zahlung per Vorkasse ergänzt
v0.9.9 (2021-04-21)
  • Test Basis-URL angepasst
v0.9.8 (2021-02-25)
  • API-Pfad angepasst
v0.9.7 (2021-02-25)
  • Fehler in Beispiel-JSON behoben
v0.9.6 (2021-02-12)
  • URLs angepasst
v0.9.5 (2020-10-01)
  • temporärer Projektname angepasst
v0.9.4 (2020-10-01)
  • kleine Fehlerkorrekturen
  • Textuelle Änderungen zur besseren Erklärung mancher Felder
v0.9.3 (2020-10-01)
  • Feldtyp der PLZ geändert
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