Zum Inhalt springen
meniodevelopermenio DashboardVorschau

POST basket · Web API v3 · Deutsch

POST basket

Web API v3 · Deutsch v3baskets
Aktualität laut Confluence unklar. Die englische POS API v3 ist die aktuelle Referenz.
POST/baskets/{basketId}?consumerIdentToken={token1}&giftCardId={token2}

Ein basket ist der Inhalt einer Rechnung und stellt die Grundlage für die meisten menio-Funktionen dar. Das Ergebnis dieses Calls beinhaltet immer die möglichen Rewards, für die im basket enthaltenen Produkte. Diese errechneten Rewards stellen ein vorläufiges Ergebnis fest und müssen von Ihrer Software als granted markiert werden, sobald der Rechnungsbetrag voll beglichen ist, damit die Rewards wirksam werden und dem consumer als eingelöst gemeldet werden können (siehe POST baskets/{basketId}/grant)

Wurden beim Call ein consumerIdentToken oder eine giftCardId angegeben, so kann der Response auch die Information über potentiell vorhandene Guthaben entweder auf dem Konsumenten-Profil oder auf der Geschenk-Karte enthalten.

Solange ein basket nicht granted ist, kann er über den erneuten Call auf diese Ressource beliebig oft geupdated werden, z.B. weil kurzerhand noch eine Position nachgebucht oder gestrichen wurde (ein häufiger Fall in der Gastronomie). Jeder neue Call wird dabei eine erneute Berechnung der Rewards anstoßen und ausliefern.

Parameter im Request-Body

Da die Bedeutung der meisten Properties über den Namen klar sein sollte, hier nur einige wenige Erklärungen zu den erklärungsbedürftigen Properties.

Name Beschreibung
Timestamp DateTime : required - hier sollte der Zeitpunkt der Rechnungsstellung im ISO8601-Format inkl. Zeitzone angegeben werden. Beispiel: 2015-04-30T08:45:15+02:00 für 08:45:15 Uhr am 30. April 2015 in Berlin (MESZ – Sommerzeit)
HasDiscounts bool : required - wird hier true angegeben, findet für diesen basket keine Reward-Berechnung im menio-System statt
CurrencyISO string : optional - Geben Sie die Währung, in der abgerechnet wird, als 3-stellige Abkürzung nach ISO 4217
WaiterName string : optional - hier sollte der Name des Bedieners/Kassierers stehen, der den Kunden maßgeblich bedient/beraten hat
BillPdf Byte-Array : optional - Um das Features des Digitalen Bons auch den Konsumenten ohne Smartphone anbieten zu können, kann Ihre Software die Kopie der Rechnung als eine PDF-Datei an uns schicken, damit wir diese einerseits im menio Consumer Portal anzeigen, aber auch direkt per Email an den Konsumenten verschicken können. Schicken Sie hier dazu den Inhalt der PDF-Datei als base64-kodierter Byte-Array
ContextIdentifiers String-Array : optional - Wurden zum Warenkorb Coupon-Identifiers oder ein Profil-Identifier beigefügt (siehe Context-Identifiers), dann sollten sie hier angegeben werden
RegularGrossPrice double : optional - hier sollte der normale Verkaufspreis für den Artikel angegeben werden
CurrentGrossPrice double : optional - hier sollte der Preis stehen, unter welchem dieser Artikel in dieser Rechnung verkauft wird, z.B. wenn irgendwelche Discounts (Aktionen, Mitarbeiterrabatte etc.) auf diesen Artikel angewendet wurden.
PositionId int - geben Sie hier eine eindeutige Nummer, welche die Position referenzierbar macht. Dies wird benötigt, um einen von unserem System evtl. errechneten Rabatt auf die inh auslösende Position zu referenzieren.
ProductId string : optional - geben Sie hier die PLU des Produkts, unter welcher das Produkt an unser System eingereicht wurde, damit wir dieses korrekt für die Berechnung der produktbasierten Rewards erkennen können. Haben Sie in Ihrer Software keine Unterstützung für produktbasierte Rewards implementiert, können Sie dieses Feld auslassen
OrderTime DateTime : optional - in der Gastronomie ist häufig anzutreffen, dass eine Rechnung längere Zeit offen steht und Positionen nach und nach gebucht werden. Ist dies bei Ihnen auch der Fall, geben Sie hier den genauen Buchungszeitpunkt der jeweiligen Position im ISO8601-Format (inkl. Zeitzone) an. Dies wird uns erlauben, sog. “Happy Hour”-Rewards auf eine Position genau berechnen zu können. Beispiel: 2015-04-30T08:45:15+02:00 für 08:45:15 Uhr am 30. April 2015 in Berlin (MESZ – Sommerzeit)
Unit int - Das ist die Einheit der Mengenangabe in Amount. 0 für Stückzahl, 1 für Kilogramm.
Amount decimal - Mengenangabe des Artikels. Kann als Stückzahl oder Kilogramm angegeben werden (siehe Unit).
ProductProps dictionary[string, string] : optional - Haben Ihre Produkte besondere Eigenschaften, die auf dem Digitalen Kassenbon strukturiert angezeigt werden sollen, so ist diese Liste der Key-Value-Pairs genau der richtige Ort für diese Eigenschaften
Response

Der Response-Body enthält eine Liste der auf den eingereichten basket anwendbaren Preisreduzierungen (Rewards) sowie Treuepunkte. Die Rewards-Liste wird leer sein, wenn kein Reward anwendbar ist. Anderenfalls ist es eine Liste mit Objekten, die jeweils einen Reward pro einzelnen Artikel darstellen oder sich auf den Gesamt-Rechnungsbetrag beziehen. Wurde ein Reward durch eine Artikelkombination getriggert, so wird dieser Reward aus Steuerrechtlichen Gründen auf alle ihn auslösenden Artikel proportional aufgespalten. Dabei besitzt jeder Reward-Eintrag eine Referenz auf die Position des baskets, welcher er zuzuordnen ist. Es ist nun die Aufgabe der Kasse, diese Preisreduzierungen buchhalterisch korrekt in die Rechnung einzuarbeiten. Die errechnete Reward-Höhe basiert dabei stets auf dem im basket angegebenen Bruttopreis der jeweiligen Position. Jedes Objekt hat dabei folgende Properties:

Name Beschreibung
RewardType int: 1 = Reward auf Produkt. 2 = Reward auf Gesamt-Rechnungsbetrag. Bei 1 wird die ProductId mit der PLU des Produktes belegt, für welchen dieser Reward ermittelt wurde. Bei 2 bleibt das Feld ProductId leer.
ProductId string: die PLU des im basket-Datensatz übermittelten Artikels, auf welchen ein Reward ermittelt werden konnte.
GrossRewardValue decimal: das ist der errechnete Wert des Rewards, der auf der Grundlage des Bruttopreises der jeweiligen Position ermittelt wurde.
RewardTriggeringPositionId int: PositionId der den aktuellen Reward auslösenden Position des übermittelten Baskets.
CouponId int: Id des Coupons im menio-System für Dokumentationszwecke.
Name string: Name des Coupons im menio-System für Dokumentationszwecke.

Und hier die Erklärung der Properties eines LoyaltyInfo-Objekts:

Name Beschreibung
LoyaltyId int: Id des Treuepunkte-Schemas im menio-System für Dokumentationszwecke.
Name string: Name des Treuepunkte-Schemas im menio-System für Dokumentationszwecke.
PointsInScheme int: Anzahl der Punkte, die gesammelt werden müssen, damit ein Reward ausgegeben wird.
PreviousPoints int: Anzahl der Punkte vor dem aktuellen Kauf
NewPoints int: Anzahl der neuen, mit diesem Kauf erzeugten Punkte
GrossRewardValue decimal: das ist der errechnete Wert des Rewards, der auf der Grundlage des Bruttopreises der jeweiligen Position ermittelt wurde. Er wird nur gesetzt, wenn PreviousPoints+NewPoints >= PointsInScheme ist.
RewardTriggeringPositionId int: PositionId der den aktuellen Reward auslösenden Position des übermittelten Baskets.

Parameter

basketIdstringErforderlich

Ein frei von Ihrem Client erzeugbarer String, welcher den basket eindeutig identifiziert. Sie können hier z.B. die Rechnungsnummer als basketId verwenden.

Beispiel: 'ab12345'
token1string

Hat sich der Konsument bereits am POS z.B. durch Vorzeigen einer Kundenkarte identifiziert, in welcher der mit seinem Konsumenten-Profil verlinkte token gespeichert ist, sollte dieser token hier angegeben werden.

Beispiel: 'member123'
token2string

Hatte der Konsument beim Kauf eine Geschenkkarte vorgezeigt und wurde diese von Ihrem System erfasst, sollte hier die in der Karte gespeicherte ID angegeben werden

Beispiel: 'giftCardABC'

Request-Header

Content-Type
application/json
DevKey
{Ihr Key}
TrackingUnitId
{trackingUnitId}
Originaler Blueprint-Ausschnitt
API Blueprint
### POST basket [POST]
Ein basket ist der Inhalt einer Rechnung und stellt die Grundlage für die meisten qnips-Funktionen dar. 
Das Ergebnis dieses Calls beinhaltet immer die möglichen `Rewards`, für die im basket enthaltenen Produkte. 
Diese errechneten `Rewards` stellen ein vorläufiges Ergebnis fest und müssen von Ihrer Software als `granted` markiert werden, 
sobald der Rechnungsbetrag voll beglichen ist, damit die Rewards wirksam werden und dem consumer als eingelöst gemeldet 
werden können (siehe *[POST baskets/{basketId}/grant](#reference/baskets/rewards-als-granted-markieren/post-baskets%2F%7Bbasketid%7D%2Fgrant%3Fredeemedinpos%3D%7Bredeemedinpos%7D)*)

Wurden beim Call ein *consumerIdentToken* oder eine *giftCardId* angegeben, so kann der Response auch die Information über 
potentiell vorhandene Guthaben entweder auf dem Konsumenten-Profil oder auf der  Geschenk-Karte enthalten.

Solange ein basket nicht `granted` ist, kann er über den erneuten Call auf diese Ressource beliebig oft geupdated werden, 
z.B. weil kurzerhand noch eine Position nachgebucht oder gestrichen wurde (ein häufiger Fall in der Gastronomie). 
Jeder neue Call wird dabei eine erneute Berechnung der Rewards anstoßen und ausliefern. 

#### Parameter im Request-Body
Da die Bedeutung der meisten Properties über den Namen klar sein sollte, hier nur einige wenige Erklärungen zu den erklärungsbedürftigen Properties.

| Name | Beschreibung |
| ---    | --- |
|`Timestamp`|**DateTime : required** - hier sollte der Zeitpunkt der Rechnungsstellung im *[ISO8601-Format](http://de.wikipedia.org/wiki/ISO_8601)* inkl. Zeitzone angegeben werden. Beispiel: 2015-04-30T08:45:15+02:00 für 08:45:15 Uhr am 30. April 2015 in Berlin (MESZ – Sommerzeit)|
|`HasDiscounts`|**bool : required** - wird hier true angegeben, findet für diesen basket keine Reward-Berechnung im qnips-System statt|
|`CurrencyISO`|**string : optional** - Geben Sie die Währung, in der abgerechnet wird, als 3-stellige Abkürzung nach *[ISO 4217](http://de.wikipedia.org/wiki/ISO_4217)*|
|`WaiterName`|**string : optional** - hier sollte der Name des Bedieners/Kassierers stehen, der den Kunden maßgeblich bedient/beraten hat|
|`BillPdf`|**Byte-Array : optional** - Um das Features des Digitalen Bons auch den Konsumenten ohne Smartphone anbieten zu können, kann Ihre Software die Kopie der Rechnung als eine PDF-Datei an uns schicken, damit wir diese einerseits im qnips Consumer Portal anzeigen, aber auch direkt per Email an den Konsumenten verschicken können. Schicken Sie hier dazu den Inhalt der PDF-Datei als base64-kodierter Byte-Array|
|`ContextIdentifiers`|**String-Array : optional** - Wurden zum Warenkorb Coupon-Identifiers oder ein Profil-Identifier beigefügt (siehe *[Context-Identifiers](https://qnipsapi1draft.docs.apiary.io/#reference/contextidentifiers)*), dann sollten sie hier angegeben werden |
|`RegularGrossPrice`|**double : optional** - hier sollte der normale Verkaufspreis für den Artikel angegeben werden|
|`CurrentGrossPrice`|**double : optional** - hier sollte der Preis stehen, unter welchem dieser Artikel in dieser Rechnung verkauft wird, z.B. wenn irgendwelche Discounts (Aktionen, Mitarbeiterrabatte etc.) auf diesen Artikel angewendet wurden.|
|`PositionId`|**int** - geben Sie hier eine eindeutige Nummer, welche die Position referenzierbar macht. Dies wird benötigt, um einen von unserem System evtl. errechneten Rabatt auf die inh auslösende Position zu referenzieren. |
|`ProductId`|**string : optional** - geben Sie hier die PLU des Produkts, unter welcher das Produkt an unser System eingereicht wurde, damit wir dieses korrekt für die Berechnung der produktbasierten Rewards erkennen können. Haben Sie in Ihrer Software keine Unterstützung für produktbasierte Rewards implementiert, können Sie dieses Feld auslassen|
|`OrderTime`|**DateTime : optional** - in der Gastronomie ist häufig anzutreffen, dass eine Rechnung längere Zeit offen steht und Positionen nach und nach gebucht werden. Ist dies bei Ihnen auch der Fall, geben Sie hier den genauen Buchungszeitpunkt der jeweiligen Position im *[ISO8601-Format](http://de.wikipedia.org/wiki/ISO_8601)* (inkl. Zeitzone) an. Dies wird uns erlauben, sog. “Happy Hour”-Rewards auf eine Position genau berechnen zu können. Beispiel: 2015-04-30T08:45:15+02:00 für 08:45:15 Uhr am 30. April 2015 in Berlin (MESZ – Sommerzeit)|
|`Unit`|**int** - Das ist die Einheit der Mengenangabe in Amount. 0 für Stückzahl, 1 für Kilogramm. |
|`Amount`|**decimal** - Mengenangabe des Artikels. Kann als Stückzahl oder Kilogramm angegeben werden (siehe Unit). |
|`ProductProps`|**dictionary[string, string] : optional** - Haben Ihre Produkte besondere Eigenschaften, die auf dem Digitalen Kassenbon strukturiert angezeigt werden sollen, so ist diese Liste der Key-Value-Pairs genau der richtige Ort für diese Eigenschaften|

#### Response
Der Response-Body enthält eine Liste der auf den eingereichten basket anwendbaren Preisreduzierungen (Rewards) sowie Treuepunkte. Die Rewards-Liste wird leer sein, 
wenn kein Reward anwendbar ist. Anderenfalls ist es eine Liste mit Objekten, die jeweils einen Reward pro einzelnen Artikel darstellen oder sich auf den Gesamt-Rechnungsbetrag beziehen. 
Wurde ein Reward durch eine Artikelkombination getriggert, so wird dieser Reward aus Steuerrechtlichen Gründen auf alle ihn auslösenden Artikel proportional aufgespalten. Dabei besitzt jeder Reward-Eintrag eine Referenz auf die Position des baskets, welcher er zuzuordnen ist.
Es ist nun die Aufgabe der Kasse, diese Preisreduzierungen buchhalterisch korrekt in die Rechnung einzuarbeiten. Die errechnete Reward-Höhe basiert dabei stets auf dem im basket angegebenen Bruttopreis der jeweiligen Position.
Jedes Objekt hat dabei folgende Properties:

| Name | Beschreibung |
| ---    | --- |
|`RewardType`|**int**: 1 = Reward auf Produkt. 2 = Reward auf Gesamt-Rechnungsbetrag. Bei 1 wird die `ProductId` mit der PLU des Produktes belegt, für welchen dieser Reward ermittelt wurde. Bei 2 bleibt das Feld `ProductId` leer.|
|`ProductId`|**string**: die PLU des im basket-Datensatz übermittelten Artikels, auf welchen ein Reward ermittelt werden konnte.|
|`GrossRewardValue`|**decimal**: das ist der errechnete Wert des Rewards, der auf der Grundlage des Bruttopreises der jeweiligen Position ermittelt wurde. |
|`RewardTriggeringPositionId`|**int**: PositionId der den aktuellen Reward auslösenden Position des übermittelten Baskets.|
|`CouponId`|**int**: Id des Coupons im qnips-System für Dokumentationszwecke.|
|`Name`|**string**: Name des Coupons im qnips-System für Dokumentationszwecke.|

Und hier die Erklärung der Properties eines LoyaltyInfo-Objekts:

| Name | Beschreibung |
| ---    | --- |
|`LoyaltyId`|**int**: Id des Treuepunkte-Schemas im qnips-System für Dokumentationszwecke.|
|`Name`|**string**: Name des Treuepunkte-Schemas im qnips-System für Dokumentationszwecke.|
|`PointsInScheme`|**int**: Anzahl der Punkte, die gesammelt werden müssen, damit ein Reward ausgegeben wird.|
|`PreviousPoints`|**int**: Anzahl der Punkte vor dem aktuellen Kauf|
|`NewPoints`|**int**: Anzahl der neuen, mit diesem Kauf erzeugten Punkte|
|`GrossRewardValue`|**decimal**: das ist der errechnete Wert des Rewards, der auf der Grundlage des Bruttopreises der jeweiligen Position ermittelt wurde. Er wird nur gesetzt, wenn PreviousPoints+NewPoints >= PointsInScheme ist.|
|`RewardTriggeringPositionId`|**int**: PositionId der den aktuellen Reward auslösenden Position des übermittelten Baskets.|

+ Parameters
    + basketId (string, `'ab12345'`) ... Ein frei von Ihrem Client erzeugbarer String, welcher den basket eindeutig identifiziert. Sie können hier z.B. die Rechnungsnummer als `basketId` verwenden.
    + token1 (optional, string, `'member123'`) ... Hat sich der Konsument bereits am POS z.B. durch Vorzeigen einer Kundenkarte identifiziert, in welcher der mit seinem Konsumenten-Profil verlinkte `token` gespeichert ist, sollte dieser `token` hier angegeben werden.
    + token2 (optional, string, `'giftCardABC'`) ... Hatte der Konsument beim Kauf eine Geschenkkarte vorgezeigt und wurde diese von Ihrem System erfasst, sollte hier die in der Karte gespeicherte ID angegeben werden

+ Request

    + Headers

            Content-Type: application/json
            DevKey: {Ihr Key}
            TrackingUnitId: {trackingUnitId}

    + Body

            {
               "BillNumber":"1234",
               "Timestamp":"2015-04-21T08:15:45.000+02:00",
               "TotalValue":159.90,
               "HasDiscounts":false,
               "TableId":"123",
               "WaiterName":"Max Mustermann",
               "CurrencyISO":"EUR",
               "Positions":[
                  {
                    "PositionId":1,
                    "ProductId":"20019",
                    "ProductName":"Kaffee Large",
                    "Amount":1,
                    "Unit":0,
                    "HasDiscounts":false,
                    "CurrentGrossPrice":2.39,
                    "RegularGrossPrice":2.39,
                    "VatInPercent":19.0,
                    "OrderTime":"2015-04-21T08:15:45.000+02:00",
                    "ImageUrl":"http://abc.de/xyz",
                    "ProductProps":{
                        "Bohne":"100% Arabica",
                        "Milch":"soja"
                    }
                  },
                  {
                    "PositionId":2,
                    "ProductId":"151",
                    "ProductName":"Vanille Donut",
                    "Amount":1,
                    "Unit":0,
                    "HasDiscounts":false,
                    "CurrentGrossPrice":1.79,
                    "RegularGrossPrice":1.79,
                    "VatInPercent":19.0,
                    "OrderTime":"2015-04-21T08:15:45.000+02:00"
                  }
               ],   
               "BillPdf":"98761238467129803470987809123489798172435980728347578091873645786..."
            }

+ Response 200

    + Headers

            Content-Type: application/json

    + Body

            {
                "Rewards":[
                    {
                        "ProductId": "20019",
                        "Name": "30% auf Großes Kaffeegetränk und einen Donut",
                        "GrossRewardValue": 0.72,
                        "CouponId": 683,
                        "RewardTriggeringPositionId": 1,
                        "RewardType": 1
                    },
                    {
                        "ProductId": "151",
                        "Name": "30% auf Großes Kaffeegetränk und einen Donut",
                        "GrossRewardValue": 0.53,
                        "CouponId": 683,
                        "RewardTriggeringPositionId": 2,
                        "RewardType": 1
                    }
                ],
                "LoyaltyInfo": [
                    {
                        "Name": "Ein Punkt für jedes Heißgetränk",
                        "LoyaltyId": 171,
                        "Details": [
                            {
                                "PreviousPoints": 7,
                                "NewPoints": 2,
                                "PointsInScheme": 10,
                                "GrossRewardValue": 0,
                                "RewardTriggeringPositionId": 1
                            }
                        ]
                    }
                ]
            }
            
+ Response 500

        // HTTP-InternalServerError: Ein unbekannten Problem bei der Verarbeitung aufgetreten

+ Response 401 

        // HTTP-Unauthorized: DevKey oder trackingUnitId nicht angegeben oder nicht vorhanden

+ Response 403 

        // HTTP-Forbidden: trackingUnitId ist noch nicht vom Merchant aktiviert
            
+ Response 400

        {
            "ErrorId":123,
            "ErrorText":"Details zum Fehler"
        }
        
        // hier alle möglichen ErrorCodes inkl. Texte für diese Ressource
        // 1000: Body enthält syntaktische Fehler und kann nicht deserialisiert werden            
        // 11004: consumerIdentToken nicht gefunden. Wiederholen Sie ggf. ohne diesen Token
        // 11005: consumerIdentToken gesperrt. Wiederholen Sie ggf. ohne diesen Token
        // 11006: consumerIdentToken abgelaufen. Wiederholen Sie ggf. ohne diesen Token
        // 11007: giftCardId nicht gefunden. Wiederholen Sie ggf. ohne diesen Token
        // 11008: giftCardId gesperrt. Wiederholen Sie ggf. ohne diesen Token
        // 11009: giftCardId abgelaufen. Wiederholen Sie ggf. ohne diesen Token 
        // 11010: dieser basket ist `granted` und somit nicht mehr veränderbar