Icon Rufen Sie uns an
+49 441.309197-69 +49 441.309197-69
 
DE

Tooling im Alltag - REST-API und Lexware

Posted by Felix Kronlage on Tuesday, February 14, 2017

REST-API als Microservice vor Lexware

Wir mögen Schnittstellen die als REST API implementiert sind, wir finden Microservices ganz klasse - aber vor allem sind Arbeitsabläufe, die sich angenehm in bestehende Werkzeuge einbetten lassen, im Alltag eine tolle Arbeitserleichterung. An dieser Stelle sind Microservices ein schönes Werkzeug.

Problemstellung: Zugriff auf die Datenbestände im Lexware

Das Herz eines Wirtschaftsbetriebes - auch wenn technik-verliebt wie die bytemine - ist die Faktura, Warenwirtschaft, Angebots- und Auftragsverfolgung. Wir setzen hier seit vielen Jahren Lexware ein. Dies wurde bei uns 2007 (seinerzeit "Faktura + Auftrag") eingeführt und ist bisher zwar immer wieder aktualisiert (mittlerweile sind wir bei Warenwirtschaft Pro) - jedoch nicht abgelöst worden (dazu gerne an anderer Stelle mehr).

Damit ist Lexware eine der wenigen nicht Open Source Lösungen die wir einsetzen. Bereits seit Längerem gibt es einige Arbeitsabläufe, die wir gerne anders als von Lexware vorgesehen gestalten würden. Des weiteren war die Verzahnung von Faktura und unserem Ticketing (Request Tracker) etwas, das wir zunehmend vermisst haben. Gerade in einem Betrieb, der primär im ITSM Bereich unterwegs ist, stecken viele abrechnungsrelevante Informationen im Ticketing.

Basierend auf RT-REST hab ich schon vor einigen Jahren ein internes Java-Tool geschrieben, mit dem wir die Erstellung von Abrechnungen aus dem Ticketing heraus stark vereinfachen konnten. Mittels dieses Werkzeuges erzeugen wir auch monatliche Übersichten für unsere Kunden mit Stundenkontingenten.

Letztes Jahr wollten wir dann zusätzlich einen E-Mailversand unserer Rechnungen etablieren. Dabei sollte es jedoch so sein, das alle Rechnungen (welche im Lexware entstehen) und digital verschickt werden, über das Ticketing versendet werden, so dass sichergestellt ist, das der Versand jeder Rechnung mit Datum und Empfänger(n) jederzeit nachvollzogen werden kann.

Click to enlarge

Für eine möglichst universelle Nutzung und damit wir es in eines unserer internen Tools - die Team-App (die Daniel bereits im November vorgestellt hat) - integriert bekommen, wollte ich dies als REST-API implementieren.

Dropwizard

Als Framework für die Implementierung des REST-Service habe ich mich für das Java Framework Dropwizard entschieden. Damit lässt sich mit wenigen Schritten ein einfacher Webservice programmieren. Eine Alternative dazu wäre sicherlich Spark gewesen. Der Service exportiert jetzt Ressourcen wie Kunden, Aufträge (von Angebot, über Auftragsbestätigungen zu Rechnungen und Gutschriften) und diverse Jobs.

SQL Anywhere

Die grosse Hürde stellt dann - so dachte ich - die Sybase Datenbank von Lexware dar. Diese läuft auf dem Windows Server zusammen mit Lexware. Unter Windows gibt es diverse Tools, mit denen man sich einen weiteren Datenbankbenutzer anlegen kann, um als dieser von Windows Systemen dann via ODBC auf die Sybase zuzugreifen. Mir war aber die Zugriffsmöglichkeit von einem Linuxsystem aus wichtig. Wenn man im Internet nach "Sybase Lexware" sucht, findet man ausschliesslich Zugriffe aus Windows heraus. Erst wenn man konkret nach "JDBC Sybase" schaut, findet man hilfreiche Anleitungen.

SAP hat vor einiger Zeit Sybase aufgekauft und so gibt es - mittlerweile bei SAP - das SQL Anywhere. Dies kann man in der Version 16 auf OS X, Linux und Windows installieren. Unter Linux hat man dann einen JDBC-Treiber (sajdbc4.jar) sowie ein Shared-Object. Beides wird für den Zugriff benötigt.

Im Java-Code verwendet man dann einen regulären JDCB Treiber:

String lxodbcUrl= "jdbc:sqlanywhere:uid=USERNAME;pwd=PASSWORD;eng=LXDBSRV;
database=F2;links=tcpip(host=10.10.1.10:2638);driverType=4;"

DriverManager.getConnection(lxodbcUrl);

10.10.1.10 ist hierbei die Adresse des Windows Servers. LXDBSRV ist ein Alias (welcher automatisch(?) in Lexware Mehrplatzumgebungen existiert).

$ export LD_LIBRARY_PATH=/opt/sqlanyhwere/lib64
$ /usr/bin/java -Djava.library.path=/opt/sqlanywhere16/lib64/ -jar rt-crm-api-0.0.1-SNAPSHOT.jar server rt-api.yml

Hier sieht man auch den typischen Aufruf eines Dropwizard-Programms. In der rt-api.yml sind diverse Konfigurationsoptionen abgelegt.

Voilà: REST Api

Auf diesem Wege haben wir jetzt eine schöne REST-API um bestimmte Aktionen und Informationen im Lexware abzufragen, und können diese gleichzeitig mit Abfragen aus dem Ticketing verknüpfen.

Im folgenden Screenshot sieht man die Maske zum Verschicken einer Rechnung. Es muss lediglich die Rechnungsnummer eingeben werden. Anhand dieser wird der richtige Adressat aus dem Lexwarebestand geholt, und das passende Rechnungs-PDF anschließend über unser Ticketing verschickt. Gibt es dazu bereits einen bestehenden Vorgang (=> Ticket), beispielsweise mit dem Angebot, dann kann hier auch das bestehende Ticket angegeben werden.

Click to enlarge

Als nettes Nebenprodukt ist gleichzeitig ein Lexware-Adapter für die IDB entstanden: Kontakte aus dem Lexware können so bei den entsprechenden Ressourcen in der IDB angezeigt werden. Aber dazu mehr in einem separaten Blogpost.