Skip to main content

Rechnung zu Sql

Einleitung

Rechnung zu SQL extrahiert Rechnungsdaten aus PDF-Dateien im FileStore und speichert strukturierte Daten in SQL-Tabellen. Die Abbildung erfolgt in zwei Tabellen im Schema ai:

  • ai.InvoiceBody für den Rechnungskopf
  • ai.InvoiceItems für Rechnungspositionen

Die Funktion arbeitet asynchron im Hintergrund im Asset Manager Service. Nach einem erfolgreichen PDF-Upload in den Dateispeicher wird abhängig von der lokalen KI-Konfiguration ein Hintergrundjob geplant. Vorab werden folgende Prüfungen und Schritte ausgeführt:

  1. Bei aktivierter Option EnableInvoiceToSql = true wird die lokale KI-Auswahl gelesen.
  2. Verbotene Dateitypen werden abgewiesen.
  3. Der Upload muss eine echte PDF-Datei sein.

  4. Bereits vorhandene Dateien werden per Hash und Dateilänge erkannt (Dublettenerkennung).

  5. Ein Hintergrundjob wird geplant.

Rechnung zu SQL arbeitet ausschließlich mit einer lokalen KI, denn Rechnungen enthalten vertrauliche Finanz- und Geschäftsdaten. Bei einer KI-gestützten Verarbeitung sind sie als schutzbedürftige Unternehmensdaten zu behandeln. Je nach Inhalt können zusätzlich personenbezogene Daten enthalten sein.

Persistenzmodell

Tabelle Schema Kardinalität Zweck
InvoiceBody ai Einzelner Datensatz pro Rechnung Rechnungskopf mit Absender, Empfänger, Beträgen, Datumsangaben und Zahlungsangaben
InvoiceItems ai Mehrere Datensätze pro Rechnung Positionen der Rechnung mit Artikel, Menge, Preis, Steuer und Seriennummer

Die Klasse InvoiceItems definiert zusätzlich eine Fremdschlüsselbeziehung:

Tabelle ai.InvoiceBody

ai.InvoiceBody speichert den Rechnungskopf: eine Zeile pro erkannter Rechnung mit Rechnungsnummer, Empfänger, Absender, Rechnungsdatum, Kundendaten, Bestell- und Lieferbezug, Währung, Netto-, Steuer- und Bruttobetrag, Zahlungsbedingungen, Fälligkeitsdatum sowie Änderungsinformationen.

Feld SQL-Typ / Länge Pflichtfeld Beschreibung
__id uniqueidentifier Ja Technische ID des Rechnungskopfs, Primärschlüssel; im Import mit invoiceId aus dem FileStore-Kontext belegt.
InvoiceNumber nvarchar(256) Nein Rechnungsnummer.
RecipientCompany nvarchar(1024) Nein Firma des Rechnungsempfängers.
RecipientStreet nvarchar(256) Nein Straße und Hausnummer des Rechnungsempfängers.
RecipientPostalCode nvarchar(32) Nein Postleitzahl des Rechnungsempfängers.
RecipientCity nvarchar(256) Nein Ort des Rechnungsempfängers.
RecipientCountry nvarchar(256) Nein Land des Rechnungsempfängers.
SenderCompany nvarchar(1024) Nein Firma des Rechnungsausstellers.
SenderStreet nvarchar(256) Nein Straße und Hausnummer des Rechnungsausstellers.
SenderPostalCode nvarchar(32) Nein Postleitzahl des Rechnungsausstellers.
SenderCity nvarchar(256) Nein Ort des Rechnungsausstellers.
SenderCountry nvarchar(256) Nein Land des Rechnungsausstellers.
InvoiceDate datetime Nein Rechnungsdatum.
CustomerNumber nvarchar(256) Nein Kundennummer.
CustomerReference nvarchar(256) Nein Kundenreferenz oder Zeichen des Kunden.
OrderNumber nvarchar(256) Nein Auftragsnummer oder Bestellnummer.
ShippingDate datetime Nein Versanddatum oder Lieferdatum, soweit im Dokument vorhanden.
DeliveryNumber nvarchar(256) Nein Lieferscheinnummer.
Currency nvarchar(32) Nein Währung der Rechnung.
NetAmount decimal(10,2) Nein Nettobetrag.
VATAmount decimal(10,2) Nein Umsatzsteuerbetrag.
GrossAmount decimal(10,2) Nein Bruttobetrag.
PaymentTerms nvarchar(1024) Nein Zahlungsbedingungen.
DueDate datetime Nein Fälligkeitsdatum.
__lastUpdate datetime Ja Technischer Zeitstempel; im Import mit DateTime.Now gesetzt.
__lastUser nvarchar(255) Ja Technischer Bearbeiter; im Import mit AI Task gesetzt.

Tabelle ai.InvoiceItems

ai.InvoiceItems speichert die Rechnungspositionen: mehrere Zeilen pro Rechnung mit Positionsnummer, Beschreibung, Artikelnummer, Menge, Preis, Währung, Mehrwertsteuer, Seriennummer sowie Änderungsinformationen.

Feld SQL-Typ / Länge Pflichtfeld Beschreibung
__id uniqueidentifier Ja Technische ID der Rechnungsposition, Primärschlüssel; im Import pro Position neu generiert.
InvoiceBodyId uniqueidentifier Ja Fremdschlüssel auf InvoiceBody.__id; im Import mit invoiceId belegt.
LineNumber nvarchar(1024) Nein Positionsnummer oder Zeilennummer.
Description nvarchar(4000) Nein Beschreibung der Position.
ArticleNumber nvarchar(1024) Nein Artikelnummer oder Materialnummer.
Quantity decimal(10,2) Nein Menge der Position.
Price decimal(10,2) Nein Preis der Position.
Currency nvarchar(32) Nein Währung der Position.
VATPercent decimal(10,2) Nein Umsatzsteuersatz in Prozent.
SerialNumber nvarchar(1024) Nein Seriennummer, falls in der Position angegeben.
__lastUpdate datetime Ja Technischer Zeitstempel; im Import mit DateTime.Now gesetzt.
__lastUser nvarchar(255) Ja Technischer Bearbeiter; im Import mit AI Task gesetzt.

Wichtige Konfigurationen der appsettings.json

Option Bedeutung
DocumentToSqlOptions.EnableInvoiceToSql Aktiviert die Planung des Invoice-to-SQL-Jobs nach PDF-Upload.
ServiceOptions.UseFileStore und ServiceOptions.FileStoreRoot Aktivieren den FileStore und definieren dessen Speicherort.
OllamaOptions.Url Endpoint für Ollama.
OllamaOptions.LlmInvoice Modell für Rechnungserkennung und Rechnungsextraktion über Ollama.
OllamaOptions.Enabled Aktiviert den Ollama-Service.
PdfOptions.PdfToTextPath Pfad zum pdftotext-Programm.
PdfOptions.PdfInfoPath Pfad zum pdfinfo-Programm.

Löschverhalten

Beim Entfernen einer Datei aus dem FileStore wird die zugehörige Rechnung gelöscht, wenn sie existiert. Das geschieht nur, wenn DeleteInvoice gesetzt ist, eine FileStore-GUID existiert und Ollama aktiv ist. Beim vollständigen Entfernen des FileStores wird aktuell nur der File Store geleert; für Rechnungen ist im Code ein ToDo vermerkt.