Wer als Selbstständiger seine Dienste anbieten möchte, ist irgendwann damit konfrontiert, Rechnungen dafür stellen und versenden zu müssen. In meinem Umfeld kannte ich jemanden, der sich selbstständig machen musste
(Sport Trainer), um im Auftrag von Fitnessstudios Kurse geben zu können.
Das Problem war nur, dass diese Person am Computer nicht fit war. Rechnungen schreiben, inklusive dem Versandt per Mail waren immer eine Herrausforderung. Das Bearbeiten einer Vorlage stellte ein großes Problem da, denn allein, welche
Taste auf der Tastatur welche Auswirkung hatte, nicht bewusst war. Regelmäßig war das Layout der Vorlage verändert, weil statt dem Rechnungsdatum der übrige Text entfernt wurde.
Es gibt zwar professionelle Programme dafür, aber deren Bedienung wäre denkbar genau so gescheitert. Jemand anderes Fragen, wäre einerseits aufwendig für den Jenigen geworden und andererseits schwer planbar gewesen, da
die Aufträge sehr zufällig ausfielen.
Es musste also für die Person allein möglich sein, Rechnungen zu erstellen, ohne jedes mal die Vorlage zu zerstören. Es wurden ja auch nur ein Paar wenige Änderungen an Daten vorgenommen. Ein professionelles Programm
hätte diese "Einfachheit" nicht leisten können.
Ich dachte daran, dass man dies mit Hilfe einer speziell entwickelten Softwarelösung das Problem lösen könnte. Die Zielplattform war Windows und aus meiner Arbeit kannte ich die Möglichkeit Programme von Microsoft Office
per COM Schnittstelle verwenden zu können, um so programmatisch Dokumente zu erstellen / bearbeiten. Doch Erfahrungen hatte ich damit nicht. Jedoch hatte ich gerade Erfahrungen mit LaTeX und habe dort genaue Vorstellungen gehabt, wie
ich Rechnungen mit Hilfe einer Vorlage erzeugen lassen kann.
Die Person musste alles auf einem Computer mit Windows bearbeiten können. Damit kam die Entwicklung eines Programms für Windows in Frage. Am leichtesten viel mir (es sollte relativ bald fertig sein) eine Anwendung mit VB.NET zu
entwickeln.
Mit LaTeX hatte ich Erfahrungen in Linux Umgebungen. Es gibt auch LaTeX Compiler für Windows, aber mit denen hatte ich keine Erfahrung. Das Kompilieren von LaTeX musste im Hintergrund als Unterprozess der Anwendung passieren. Dies
lässt sich einfach mittels Makefile erreichen, wobei mir unklar war, ob es mit Windows ebenfalls so einfach funktionieren würde. Ebenfalls unklar war, wie die Verarbeitung zu PDF Dateien unter Windows funktionieren würde.
Ferner mussten Informationen über die erstellten Rechnungen und die dafür verwendeten Adressen permanent gespeichert werden.
Insgesamt tendierte ich von diesen Vorrausetzungen zu einem Build unter Linux. Es wäre nun möglich gewesen unter dem Windows System eine WSL Umgebung für LaTeX einzurichten. Doch jede Software Komponente mehr auf diesem
System hätte die Wartung komplexer gemacht, da ich nicht immer Zugriff haben konnte. So sollte der Linux Teil auf einem LXC Container unter Proxmox installiert werden und auf dem Computer des Nutzers nur ein Clientprogramm.
Auf dem Container befinden sich dann der "Invoice Service", ein Python Flask basierter Anwendungsserver. Dieser stellt API Aufrufe bereit um Daten in der Datenbank einzutragen oder abzurufen. Ferner tut dieser den "make"
Prozess für LaTeX aufrufen. Damit die Vorlage änderbar ist, schreibt der Service "\newcommand" Anweisungen in eine Tex include Datei, welche er von der Datenbank bekommt. Ein Webserver sitzt als Proxy dazwischen und
ermöglicht über einen bestimmten HTTP-Pfad den Download von PDF Datein.
Auf dem Windows PC wird nur das sog. "Invoice Tool" installiert. Dieses tauscht Daten in beide Richtungen per API Request aus, ggf. als JSON Format. Der "Bau" einer Rechnung wird von dem Tool mit Hilfe des Service in
mehreren Schritten realisiert und im Anschluss vom Server herruntergeladen.
Bild 1: Bockschaltbild des Invoice Service
Der Invoice Service ist mit Flask entwickelt und stellt die API Aufrufe für das Invoice Tool bereit. Er ist in einem Linux Container installiert neben der LaTeX Umgebung. Die Datenbank befindet sich auf einem anderen System.
Um diese Komponenten besser warten zu können, wurden diese im LXC installiert, statt zum Beispiel in WSL.
Der Service bietet transparenten Zugriff auf die Daten der Datenbank mittels API Funktionen. So können alle Abfragen und Änderungsoperationen durchgeführt werden, indem der Aufruf am Service (mit ggf. erforderlichen
Parametern / Daten) erfolgt. Das Ausführen der Aktionen auf der Datenbank übernimmt der Service. Da das Windows Tool mit dem Service auf jeden Fall Daten tauschen muss und der Service ebenso Zugriff auf die Daten der Datenbank
benötigt, wurde der Zugriff vollständig durch den Service gekapselt. Größere Daten tauschen beide Programme im JSON Format aus.
Über die API ist der Zugriff auf Adressbuch und Rechnungs Tabelle möglich.
Soll eine Rechnung "gebaut" werden, übermittelt das Windows Tool zuerst die Daten an den Service. Dieser speichert diese in der Datenbank und quittiert dies per Textstatus. Das Tool ruft in zweiten Schritt den
"make" API Aufruf auf, welcher mit den Daten der geg. Rechnung eine Tex Datei schreibt. Dann wird "make" als Unterprozess gestartet, um das Erzeugen der PDF "Makefile gesteuert" ablaufen zu lassen. Die erzeugte
Datei wird in den Datenbereich des Webservers geschoben. Das Tool soll dann von dem Webserver die PDF bekommen.
Über den Make Prozess wird zur eventuellen Fehlerermittlung ein eigener Log geführt, welcher den vom LaTeX Compiler automatisch angelegten Log integriert.
Bild 2: Dateneingabe Formular zum erstellen von Rechnungen im Invoice Tool. Zum Zoomen klicken.
Bild 3: PDF Anzeige einer erstellten Rechnung im Invoice Tool. Zum Zoomen klicken.
Das Invoice Tool am Windows PC hat zu Beginn eine Tabelle aller alten Rechnungen. Man kommt von dort aus ins Adressbuch, wo man Adressen hinzufügen, ändern und löschen kann.
Adressen umfassen neben der Postanschrift auch ein Feld für eine E-Mail Adresse, an die eine PDF für eine Rechnung dann gesandt werden kann.
Wenn der Nutzer eine neue Rechnung generieren will, bekommt er den im Bild 2Bild 2 gezeigten Dialog. Dieser enthält in der linken Hälfte eine virtuell angedeutete Rechnung. Deren Werte werden in der rechten Hälfte eingestellt.
Ändert man rechts Einstellungen, werden diese in der linken Hälfte in die virtuelle Rechnung übernommen. Zur Veranschaulichung wird der Rechnungsbetrag bei Ändern der Anzahl der Kurse oder des Einzelpreises mit
ausgerechnet und in der virtellen Rechnng eingetragen.
Alles im Invoice Tool ist von der Darstellung größer als Normal gewählt, um Leseproblemen entgegen zu treten. Mit Labels wird teilweise auf die Verwendung hingewiesen, da dies oftmals (unabhängig vom Tool) unklar ist.
Außerdem wird ein Logfile angelegt, um im Fehlerfall analysieren zu können, was passiert ist. Denn der Nutzer hätte nie beschreiben können, wo es hakt.
Wird in dem Dialog Speichern ausgewählt, wird noch einen Kontrolldialog eingeblendet, der an die Bearbeitung der wichtigen Eckdaten errinert. Wird dieser bestätigt, wird der Invoice Service in den erforderlichen Schritten
aufgerufen, um die Rechnung generieren zu lassen. Im Anschluss lädt das Invoice Tool diese vom Webserver des Linux Containers und Speichert diese unter einem Abgestimmten Pfad und Namen.
Nach dem Erstellen der Rechnung schließen sich alle Dialoge und das andere im Bild 3Bild 3 gezeigte Fenster wird geöffnet. Es dient zur Anzeige der PDF Datei und kann auch nachträglich vom Haupfenster aus geöffnet werden. Von dort aus, als auch von der Tabelle aus dem Hauptfenster aus lässt sich diese Rechnung Drucken und/oder per E-Mail versenden (vorrausgesetzt eine E-Mail Adresse ist hinterlegt).
Die Arbeit am Invoice Service und dem Invoice Tool wurden eingestellt, weil die Person, für die das Programm entwickelt worden ist, mit ihrer Tätigkeit aufhörte. Leider fiel diese Entscheidung sehr bald, nachdem das Programm
den ersten Meilenstein genommen hatte.
Im ersten Meilenstein sollte das generieren von Rechnungen an sich möglich sein, sodass man die Entwicklung mit dem Nutzer besser absprechen kann und ggf. testen kann.
Im nächsten Meilenstein sollte die Funktion mit Zugriff auf Microsoft Outlook durch das Invoice Tool und drucken einer PDF Datei möglich werden. Hier sollte der Zugriff auf Outlook erfolgen, da dieses zum einen der verwendete
Mailclient ist und das Absenden einer E-Mail bedeutet, dass diese von Outlook in den "Gesendet" Ordner des Postfachs kopiert wird. Man hätte die E-Mail vom Programm auch direkt per SMTP-Client funktion von .NET Framework
versenden können, jedoch hätte man keine automatische Kopie der Mail im Postfach behalten. So war das Invoice Tool in die Lage versetzt worden, Outlook eine neue Mail als Template öffnen zu lassen (ggf. einer Adresse für
Rechnungen) und Absender, Zieladresse, Betreff, einen Mail Text, sowie die PDF als Anhang voreinzustellen. Sofern die Voreinstellung in Ordnung gewesen wäre, hätte der Nutzer nur noch auf "Senden" im Fenster von Outlook
klicken müssen.
All diese Änderungen wurden in der Entwicklungsumgebung (IDE und VM mit zusätzlichen Programmen) getestet und schienen zu Funktionieren. Nun sollte es einen Versuch mit einer echten Rechung an eine echte Adresse durchlaufen.
Jedoch kam zu der Zeit die Entscheidung, die Tätigkeit einzustellen, welche Grundlage für die Entwicklung des Invoice Service war. Daher musste die Entwicklung am gesamten System eingestellt werden, ohne das die neuen Funktionen
des zweiten Meilensteins jehmals außerhalb der Entwicklungsumgebung genutzt wurden.