Es gibt verschiedene Arten von Zahlungen: - auto - cash: Bar - cashless: EC / Kreditkarte - loyalty: secucard- demo: Test-Modus

In der Methode transactions.start(trans.getId(), type, null) muss an der Stelle type die gewünschte Eigenschaft übergeben werden.

Erstellen und Abschließen einer Transaktion

JAVA-SDK

// Select an ident (card) which will be charged for the basket.
// Usually the value is the id of a scanned card or the id of a Checkin object taken from the global Check-In list.
Ident ident = new Ident();
ident.setValue("my-ident-id");
 
// Now you can proceed in two ways:
// - creating a "empty" transaction first and adding products afterwards by updating this transaction step by step
// - adding products to the basket first and creating a new transactions afterwards with the complete basket.
// The second approach may be faster but you get product errors late and all at once while the first approach shows
// possible errors immediately after each update.
 
 
// We show the first way: create a empty product basket and the basket summary and create a new transaction first.
Transaction newTrans = new Transaction();
newTrans.setIdents(Collections.singletonList(ident));
Transaction trans = transactions.create(newTrans);
assert (trans.getStatus().equals(Transaction.STATUS_CREATED));
 
Basket basket = new Basket();
BasketInfo basketInfo = new BasketInfo(0, "EUR");
trans.setBasket(basket);
trans.setBasketInfo(basketInfo);
 
 
// Add products to the basket and update.
ProductGroup productGroup = new ProductGroup("group1", "beverages", 1);
Product product = new Product(1, null, "123", "5060215249804", "desc1", "2", 5000, 1900, Arrays.asList(productGroup));
basket.addProduct(product);
basketInfo.setSum(1000000);
Transaction result = transactions.update(trans);
 
// Add other product again and update.
product = new Product(2, null, "456", "1060215249800", "desc2", "1", 1000, 1900, Arrays.asList(productGroup));
basket.addProduct(product);
basketInfo.setSum(1100000);
result = transactions.update(trans);
 
// demo|auto|cash|cashless|loyalty, demo instructs the server to simulate a different (random) transaction for each invocation of
// startTransaction, also different formatted receipt lines will be returned.
String type = "cash";
 
trans = transactions.start(trans.getId(), type, null);
assert (trans.getStatus().equals(Transaction.STATUS_OK));
 
System.out.println("Transaction started!");
 
// "Print" receipt
List<ReceiptLine> receiptLines = trans.getReceiptLines();
for (ReceiptLine line : receiptLines) {
    System.out.println("Receipt Line: " + line.getLineType() + ", " + line.getValue());
}

Response

Nach einer Transaktion werden zusätzlich zu dem Ergebnis noch Belege zurück gegeben. Das Kassensystem muss diese receipts unterhalb des Rechnungs-Bons mit ausdrucken.

Diese Belege beinhalten die Informationen zu der getätigten Transaktion.

Es gibt hier zwei Arten von Belegen: - receipt_merchant: Händlerbeleg - receipt: Kundenbeleg

{
    "object": "smart.transactions",
    "id": "STX_397SJ4YU32M8S5WFX75XUYGHS87YA6",
    "device_source": {
        "object": "smart.devices",
        "id": "SDV_3YMH7U6332M74SQ5R5GQGUCVJNVVAU"
    },
    "created": "2017-05-17T12:39:27+02:00",
    "updated": "2017-05-17T12:39:35+02:00",
    "status": "ok",
    "transactionRef": "201705171239-999-901-36",
    "merchantRef": "DemoMerchantRef",
    "basket": {
        "products": [
            {
                "id": 1,
                "parent": null,
                "articleNumber": "1722",
                "ean": "null",
                "desc": "Champagnersahne Stück",
                "quantity": 1,
                "priceOne": 200,
                "tax": 700,
                "group": [
                    {
                        "id": "20",
                        "desc": "Torten Stück",
                        "level": 2
                    }
                ]
            }
        ],
        "texts": []
    },
    "receipt": [
        {
            "type": "separator",
            "value": {
                "caption": "Kundenkarte"
            }
        },
        {
            "type": "name-value",
            "value": {
                "name": "Kartennummer:",
                "value": "9276004420558112",
                "decoration": []
            }
        },
        {
            "type": "name-value",
            "value": {
                "name": "TA Code:",
                "value": "9568749",
                "decoration": []
            }
        },
        {
            "type": "space"
        },
        {
            "type": "textline",
            "value": {
                "text": "Zahlung über:",
                "decoration": []
            }
        },
        {
            "type": "textline",
            "value": {
                "text": "2,00 EUR",
                "decoration": [
                    "important"
                ]
            }
        },
        {
            "type": "space"
        },
        {
            "type": "textline",
            "value": {
                "text": "Aktuelles Guthaben:",
                "decoration": []
            }
        },
        {
            "type": "textline",
            "value": {
                "text": "48,33 EUR",
                "decoration": [
                    "important"
                ]
            }
        },
        {
            "type": "space"
        },
        {
            "type": "textline",
            "value": {
                "text": "Umsatz erfasst:",
                "decoration": []
            }
        },
        {
            "type": "textline",
            "value": {
                "text": "2,00 EUR",
                "decoration": [
                    "important"
                ]
            }
        },
        {
            "type": "space"
        },
        {
            "type": "textline",
            "value": {
                "text": "Bonus:",
                "decoration": []
            }
        },
        {
            "type": "textline",
            "value": {
                "text": "0,20 EUR",
                "decoration": [
                    "important"
                ]
            }
        },
        {
            "type": "space"
        },
        {
            "type": "textline",
            "value": {
                "text": "Neues Guthaben:",
                "decoration": []
            }
        },
        {
            "type": "textline",
            "value": {
                "text": "48,53 EUR",
                "decoration": [
                    "important"
                ]
            }
        }
    ],
    "basket_info": {
        "sum": 200,
        "currency": "EUR"
    },
    "idents": [
        {
            "object": "smart.idents",
            "id": "smi_1",
            "prefix": "9276",
            "name": "secucard Kundenkarte",
            "type": "card",
            "value": "9276004420558112",
            "valid": true,
            "merchantcard": {
                "object": "loyalty.merchantcards",
                "id": "MCD_WJAFQ69XN2YD80HNUMBHHAEWEAPPAB",
                "merchant": {
                    "object": "general.merchants",
                    "id": "MRC_2E3VNPKAVSF39BHX82T97DK4PED8PJ"
                },
                "created_for_merchant": {
                    "object": "general.merchants",
                    "id": "MRC_2E3VNPKAVSF39BHX82T97DK4PED8PJ"
                },
                "created_for_store": {
                    "object": "general.stores",
                    "id": "STO_3MAPAHG70K4C7FJ0FQ3MKZT5PED8PM"
                },
                "card": {
                    "object": "loyalty.cards",
                    "id": "CRD_3T7NX2CHEF0XWVW8MFB7JHPMH6PWP0",
                    "cardnumber": "9276004420558112",
                    "created": "2015-02-20T08:54:13+01:00"
                },
                "is_base_card": true,
                "cardgroup": {
                    "object": "loyalty.cardgroups",
                    "id": "CRG_5H046SSFZV22TVSSZ43TUNXX5F4HR5",
                    "display_name": "secucard Bonus",
                    "display_name_raw": "secucard Bonus",
                    "stock_warn_limit": null,
                    "picture": "https://connect.secucard.com/ds_g/d994e0572c5f3748b5ad467c38413b38"
                },
                "balance": 3588,
                "points": 0,
                "last_usage": "2017-04-24T16:32:42+02:00",
                "last_charge": "2017-04-24T16:32:42+02:00",
                "stock_status": "active",
                "lock_status": "unlocked",
                "passcode": 1
            }
        }
    ]
}

Zahlung Bar

Falls der Kunde vor dem Bezahlvorgang noch nicht hinzugefügt wurde (Scan, Check-In) kommt stets die Abfrage nach einer Kundenkarte.

Es erscheint eine Anzeige mit einem Tastenfeld. Es wird eines der vorgefertigten Buttons (5€, 10€, 20€, 50€) gewählt oder man gibt den Betrag manuell ein.

Im Anschluss kommt eine Anzeige über die erfolgreiche Zahlung inkl. der Information über den Bonus und dem neuen Guthaben.

Zahlung EC

Falls der Kunde vor dem Bezahlvorgang noch nicht hinzugefügt wurde (Scan, Check-In) kommt stets die Abfrage nach einer Kundenkarte.

Im nächsten Fenster einen die identischen Statusmeldungen wie am EC-Terminal. Dann kommen die Statusmeldungen bezüglich des EC-Terminals – bitte Karte einstecken – bitte Geheimzahl eingeben – während Transaktion verarbeitet wird Im ersten Schritt erfolgt die Aufforderung die EC-Karte oder Kreditkarte in das Terminal einzustecken.

Wenn die Karte richtig eingesteckt wurde, verlangt das EC-Terminal nach der Geheimzahl diese Aufforderung muss auch in der Kasse erscheinen.

Wurde die Geheimzahl des Kunden am Terminal bestätigt prüft das Terminal ob diese Transaktion möglich ist (Tageslimit, Karte gesperrt, Karte abgelaufen etc).

Sind diese Informationen alle erfolgreich, wird die Zahlung durchgeführt und angezeigt. Ebenfalls wird in dieser Maske mit angezeigt welchen Bonus der Kunde erhalten hat und wie das neue Guthaben ist.

Zahlung Secucard

Falls der Kunde vor dem Bezahlvorgang noch nicht hinzugefügt wurde (Scan, Check-In) kommt stets die Abfrage nach einer Kundenkarte.

ein separates Display mit Guthaben und zu zahlendem Betrag erscheint. Transaktion wird bestätigt Ein seperates Display erscheint mit dem Guthaben und dem zu zahlendem Betrag. Es wird dann nur die Transaktion bestätigt.

Die Transaktion wird nun durchgeführt und erfolgreich abgeschlossen. Ebenfalls wird in dieser Maske mit angezeigt, welchen Bonus der Kunde erhalten hat und wie das neue Guthaben ist.

Bonus-Produkte abrufen

Die Boninfizierung von umsatzsteuerpflichtigen Produkten muss zu gleichen Teilen auf diese erfolgen. Sind z.B. im Warenkorb Produkte mit 7% MwSt und 19% MwSt, so muss der Bonus auch auf diesen beiden Steuersätze gleichmäßig verteilt werden und darf nicht nur auf die Artikel mit der höchsten MwSt verrechnet werden. Um die Aufteilung des Bonus kümmert sich die Schnittstelle. Hierzu müssen als erstes die Artikel in den Warenkorb hinzugefügt werden:

JAVA-SDK

Transaction trans = transactions.create(new Transaction());
 
// Add products to the basket and update
Product product = new Product(1, null, "123", "5060215249804", "product1", "2", 5000, 1900);
basket.addProduct(product);
basketInfo.setSum(10000);
Transaction result = transactions.update(trans);
 
// Add another product and update
product = new Product(2, null, "456", "1060215249800", "product2", "1", 1000, 1900);
basket.addProduct(product);
basketInfo.setSum(11000);
result = transactions.update(trans);

Nachdem die Produkte zum Warenkorb hinzugefügt wurden, können über einem separaten Aufruf die sogenannten Bonus-Artikel abgefragt werden. Im Java-SDK kann dies sehr einfach durch den Aufruf der Funktion appendLoyaltyBonusProducts mit der ID der Transaktion (welche die regulären Produkte beinhaltet) ausgeführt werden. Neben der ID wird auch eine Callback-Funktion übergeben welche in Ihrem System dafür sorgt das die Bonus-Artikel dem Kassierer angezeigt werden.

JAVA-SDK

transactions.appendLoyaltyBonusProducts(result.getId(), new Callback<LoyaltyBonus>() {
    @Override
    public void completed(LoyaltyBonus loyaltyBonus) {
        System.out.println(loyaltyBonus);
    }
 
    @Override
    public void failed(Throwable cause) {
        // Handle the error case
    }
});

Response

Der Rückgabewert der Funktion ist ein LoyaltyBonus-Objekt. Wichtig hierbei ist das Feld "missing_sum", welches den Restbetrag enthält der nicht über das vorhandene Loyalty-Bonusguthaben abgerechnet werden kann. Die Artikelnummern, die EAN und die Beschreibung können mit dem Support entsprechend eingerichtet werden. Standardmäßig besteht die Artikelnummer aus der Zeichenkette "11111111" + dem MwSt-Satz mal 100. Für 19% z.B. "111111111900" Als Beschreibung wird standardmäßig der Text "Bonus Steuer " + dem MwSt-Satz mal 100, also z.B. für 19% "Bonus Steuer 1900" zurückgegeben.

{
    "LoyaltyBonus":{
        "missing_sum":9500,
        "bonus_products":[
            {
                "Product":{
                    "id":"2",
                    "parent":null,
                    "articleNumber":"111111111900",
                    "ean":"111111111900",
                    "desc":null,
                    "quantity":1,
                    "priceOne":-500,
                    "tax":1900,
                    "productGroups":[]
                }
            }
        ]
    }
}

In der Transaktion werden dann automatisch die entsprechenden Bonus-Produkte zum Warenkorb hinzugefügt.

Anschließend muss die Transaktion wie gewohnt gestartet werden:

JAVA-SDK

trans = transactions.start(trans.getId(), type, null);
 
System.out.println("Transaction started!");
 
// "Print" receipt
List<ReceiptLine> receiptLines = trans.getReceiptLines();
for (ReceiptLine line : receiptLines) {
    System.out.println("Receipt Line: " + line.getLineType() + ", " + line.getValue());
}