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.InvoiceBodyfür den Rechnungskopfai.InvoiceItemsfü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:
- Bei aktivierter Option
EnableInvoiceToSql = truewird die lokale KI-Auswahl gelesen. - Verbotene Dateitypen werden abgewiesen.
-
Der Upload muss eine echte PDF-Datei sein.
-
Bereits vorhandene Dateien werden per Hash und Dateilänge erkannt (Dublettenerkennung).
- 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.