Juni 24, 2019

Blitz!Kasse TSE / INSIKA 2020 für ENTWICKLER -DEMO API

Blitz!Kasse Rest API / als ZIP

© M&S SystemSolutions GmbH und Fa. Compilager.de

Im Folgenden werden Beispiele anhand der gemanagten .Net Version der API genannt.
Wir haben unter anderem auch eine native API als alternative jedoch wird derzeit nur die
.NEt Variante aktiv von uns genutzt da mono/core mittlerweile zuverlässig und anstandslos
auf Linux basierten Systemen funktionieren
Die Bibliothek wurde gegen .Net Standart 2.0 kompiliert und benötigt eine .Net
Laufzeitumgebung von 4.6.1, Mono 5.2.0 oder Net Core 2.0

REST API für Blitzkasse Restaurant / Handel

Es basiert sich auf JSON Format als Datenübertragungscontainer, als Transportprotokol wird http benutzt.
Wenn man z.B. Restaurant L installiert, wird Office unter localhost:8001 ansprechbar sein.

Es gibt zwei Typen von Commandosaufrufe – get und set und get alle(Listen).

Get – Alle sind für Holen von Stammdaten da, z.B:
http://localhost:8001/getUsers – alle Benutzer
http://localhost:8001/getLevels – alle Verkaufebenen
http://localhost:8001/getLevelDetails – alle Tische
http://localhost:8001/getCategories – alle Warengruppen
http://localhost:8001/getProducts – alle Artikeln

Wenn man Product by EAN finden muss
http://localhost:8001/GetProductsByBarcode in POST Aufruf EAN als Parameter
http://localhost:8001/getTaxes – alle Mehrwertsteuern
http://localhost:8001/getSupplements – alle Beilagen/Artikelvarianten
http://localhost:8001/getAdditions – alle Zutaten
http://localhost:8001/getDiscounts – alle Rabate
http://localhost:8001/getPrinterDrivers – alle Drucker
http://localhost:8001/getPrintersInCategories – alle Zuordnungen der Drucker zu Warengruppen
http://localhost:8001/ConfigComplete – alle Configvariablen
http://localhost:8001/getCustomers – alle Kunden
http://localhost:8001/getDiscounts – alle Rabbat typen
http://localhost:8001/getHappyHours – alle HappyHour
http://localhost:8001/getBarcodeFormats – alle Barcode formats
http://localhost:8001/getBarcodeFormatFields – alle Feldeinstellungen für Barcode formats

Rechnungs-Daten
http://localhost:8001/getLookupReceipts

Letzte Rechnung:
http://localhost:8001/getLastReceipt – gibt den gesammten letzten Bon zurueck mit den Products schon drinnen.

Dinamische Daten
http://localhost:8001/getAllCompositeOrders – alle Bestellungen

Beispiel von getLevels:
Wenn man in Browser http://localhost:8001/getLevels aufruft, bekommt man folgendes JSON-Antwort:
[
{„takeoutOrder“:true,“taxMode“:0,“name“:“S.Verkauf“,“id“:38,“priceDeviation“:0,“tagCaption“:““,“levelDetails“:[],“color“:“#0080FF“,“imageMode“:1,“description“:“S.Verkauf“,“modeId“:1285242460,“sortId“:1,“users“:[1,2,3,4,5,6,7],“userList“:[],“imageName“:“/BlitzkasseRestaurant;component/Data/Ressources/Images/Bar.png“,“runCustomerSelect“:false},
{„takeoutOrder“:false,“taxMode“:0,“name“:“Restaurant“,“id“:40,“priceDeviation“:0,“tagCaption“:““,“levelDetails“:[],“color“:“#008040″,“imageMode“:1,“description“:“Restaurant“,“modeId“:1,“sortId“:2,“users“:[1,2,3,4,5,6,7],“userList“:[],“imageName“:“/BlitzkasseRestaurant;component/Data/Ressources/Images/Restaurant.png“,“runCustomerSelect“:false},
{„takeoutOrder“:false,“taxMode“:0,“name“:“Terrasse“,“id“:41,“priceDeviation“:0,“tagCaption“:““,“levelDetails“:[],“color“:“Silver“,“imageMode“:1,“description“:“Terrasse“,“modeId“:2,“sortId“:3,“users“:[1,2,3,4,5,6,7],“userList“:[],“imageName“:“/BlitzkasseRestaurant;component/Data/Ressources/Images/Terrasse.png“,“runCustomerSelect“:false},
{„takeoutOrder“:false,“taxMode“:0,“name“:“Drausen“,“id“:42,“priceDeviation“:0,“tagCaption“:““,“levelDetails“:[],“color“:“#008040″,“imageMode“:1,“description“:“Drausen“,“modeId“:1,“sortId“:4,“users“:[1,2,3,4,5,6,7],“userList“:[],“imageName“:“/BlitzkasseRestaurant;component/Data/Ressources/Images/Terrasse.png“,“runCustomerSelect“:false}
]

So werden es z.B. so alle Verkaufsebenen ausgelesen und im weiteren Schritt die aktive Ebene für die laufende Session registriert.

using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;

namespace TseRpcTest
{
class TestClass
{
public static string ServerUrl { get; set; }
public static string SessionId { get; set; }

public static async Task<string> DownloadObjectAsync(string apiUrl)
{

using (var client = new WebClient())
{
client.Encoding = Encoding.UTF8;
var fromJson = await client.DownloadStringTaskAsync(new Uri(„http://“ + ServerUrl + „:8001/“ + apiUrl));
return fromJson;

}
}

public static string DownloadObject(string apiUrl)
{

using (var client = new WebClient())
{
client.Encoding = Encoding.UTF8;
var fromJson = client.DownloadString(new Uri(„http://“ + ServerUrl + „:8001/“ + apiUrl));
return fromJson;
}
}

public static async Task<string> PostToServerAsync(object payload, string apiUrl)
{
var httpClient = new HttpClient();
#pragma warning disable 618
var toSend = payload is string ? payload.ToString() : await JsonConvert.SerializeObjectAsync(payload);
#pragma warning restore 618
var content = new StringContent(toSend, Encoding.UTF8, „application/json“);
var response = await httpClient.PostAsync(„http://“ + ServerUrl + „:8001/“ + apiUrl, content)
.ConfigureAwait(false);
var result = await response.Content.ReadAsStringAsync();
return result;
}

public static string PostToServer(object payload, string apiUrl)
{
string resultJsonString;
var httpWebRequest =
(HttpWebRequest)WebRequest.Create(„http://“ + ServerUrl + „:8001/“ + apiUrl);
httpWebRequest.ContentType = „application/json“;
httpWebRequest.Method = „POST“;
payload ??= string.Empty;
var toSend = payload is string ? payload.ToString() : JsonConvert.SerializeObject(payload);
using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
{
streamWriter.Write(toSend);
streamWriter.Flush();
streamWriter.Close();
}
var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream() ?? throw new InvalidOperationException()))
{
resultJsonString = streamReader.ReadToEnd();
}
return resultJsonString;
}

public async Task<List<Level>> GetLevelsAsync()
{
var fromJson = await DownloadObjectAsync(„GetLevels“);
return JsonConvert.DeserializeObject<List<Level>>(fromJson);
}

public List<Level> GetLevels()
{
var fromJson = DownloadObject(„GetLevels“);
return JsonConvert.DeserializeObject<List<Level>>(fromJson);
}

public async Task<bool> SelectLevelAsync(Level selectedLevel)
{
var result = await PostToServerAsync(selectedLevel, „SelectLevel?me=“ + SessionId);
return JsonConvert.DeserializeObject<bool>(result);
}

public bool SelectLevel(Level selectedLevel)
{
var result = PostToServer(selectedLevel, „SelectLevel?me=“ + SessionId);
return JsonConvert.DeserializeObject<bool>(result);
}

}

public class Level
{
public bool TakeoutOrder { get; set; }
public int TaxMode { get; set; }
public string Name { get; set; } = string.Empty;
public int Id { get; set; }
public int PriceDeviation { get; set; }
public string TagCaption { get; set; } = string.Empty;
public string Color { get; set; } = string.Empty;
public int ImageMode { get; set; }
public string Description { get; set; } = string.Empty;
public int ModeId { get; set; }
public int SortId { get; set; }
public int[] Users { get; set; }
public string ImageName { get; set; } = string.Empty;
public bool RunCustomerSelect { get; set; } = false;
}

}

 

 



TSE