# Tabelle "Invoice_Posting_Head" für Kopfdaten Direkt zu Beginn des Workflows wird für jede Rechnung ein Eintrag in der Tabelle "Invoice\_Posting\_Head" erzeugt. Die Tabelle enthält eine Auto-Inkrement-Spalte "ID". Die Daten werden über die eindeutige Mappen-ID (Spalte "FileID") aktualisiert. Diese ID wird in dem gleichnamigen Mappen-Feld "FileID" gespeichert. Die Zeitstempel-Spalte "InsertTS" wird beim initialen "INSERT" mit dem aktuellen Zeitstempel vorbelegt und wird im Anschluss nicht verändert. Die Zeitstempel-Spalte "UpdateTS" wird bei jedem "UPDATE"-Befehl mit dem aktuellen Zeitstempel überschrieben. Die übrigen Spalten-Namen entsprechen den technischen Feldbezeichnungen der Rechnungs-Mappen. In der Feldkonfiguration "Kopf-Felder" kann pro Feld separat konfiguriert werden, ob der Feldwert in die SQL-Tabelle geschrieben werden soll oder nicht. Sollte zu einem Feld noch keine passende Spalte in der Tabelle existieren, so kann die Spalte direkt über die Feldkonfiguration hinzugefügt werden. [![image-1601901896286.png](https://docs.squeeze.one/uploads/images/gallery/2020-10/scaled-1680-/image-1601901896286.png)](https://docs.squeeze.one/uploads/images/gallery/2020-10/image-1601901896286.png) Die Daten werden bei jedem Speichern und nach jeder Weiterleitung aktualisiert. Hierdurch sollten die Daten in der Rechnungs-Mappe fast immer identisch mit den Daten in den Rechnungs-Mappen sein. Einzig Änderungen durch Job-Skripte oder durch projektspezifische benutzerdefinierte Aktion werden nur dann direkt in die Tabelle geschrieben, wenn der Schreib-Befehl in den Skripten explizit ausgeführt wird. Für die Übergabe an das Buchungssystem wird in der Regel nur ein Bruchteil der Informationen benötigt. Die Tabelle kann in den Projekten beliebig angepasst und erweitert werden. Der folgende Aufbau und die folgenden Datentypen entsprechen der MS SQL Variante.
**Spaltenname****Datentyp****Beschreibung**
**ID (Key)**bigintAuto-Inkrement-Spalte
**FileID**nvarchar(50)Eindeutige Mappen-ID für UPDATE-Befehle
Barcodenvarchar(50)Optional: Barcode-Nummer zur Rechnung
DateOfReceiptdateWird am Mappentypen mit dem aktuellen Tagesdatum vorbelegt
InvoiceNumbernvarchar(50)Externe Rechnungsnummer
InvoiceCreditVouchernvarchar(15)"invoice" für Rechnung bzw. "creditvoucher" für Gutschriften
InvoiceDatedateRechnungsdatum
DueDatedateFälligkeitsdatum
ServiceDatedateLeistungsdatum
Principalnvarchar(50)Mandanten-Nummer
CompanyCodenvarchar(50)Buchungskreis-Nummer
CreditorIDnvarchar(50)Kreditor ID
CreditorNamenvarchar(100)Kreditor Bezeichnung
Creditor\_Streetnvarchar(200)Kreditor-Anschrift: Straßenname
Creditor\_Citynvarchar(100)Kreditor-Anschrift: Stadt
Creditor\_PostCodenvarchar(50)Kreditor-Anschrift: Postleitzahl
Creditor\_Countrynvarchar(50)Kreditor-Anschrift: Land
Creditor\_Mailnvarchar(50)Kreditor Mail-Adresse
Creditor\_Phonenvarchar(50)Kreditor Telefonnummer
SenderMailnvarchar(50)Absender-Adresse bei Mail-Rechnungen
BankNamenvarchar(150)Kontoverbindung: Bank-Name
BankAccountHoldernvarchar(150)Kontoverbindung: Konto-Inhaber
IBANnvarchar(50)Kontoverbindung: IBAN
BICnvarchar(50)Kontoverbindung: BIC
BankIDnvarchar(50)Kontoverbindung: Bankleitzahl
BankAccountIDnvarchar(50)Kontoverbindung: Kontonummer
Netdecimal(18,2)Netto-Betrag
Grossdecimal(18,2)Brutto-Betrag
Taxdecimal(18,2)Steuer-Betrag
Net1decimal(18,2)Netto zum MwSt-Satz 1
VatCode1nvarchar(100)MwSt-Code 1
VatRate1decimal(18,2)MwSt-Satz 1
Tax1decimal(18,2)Steuer zum MwSt-Satz 1
Net2decimal(18,2)Netto zum MwSt-Satz 2
VatCode2nvarchar(100)MwSt-Code 2
VatRate2decimal(18,2)MwSt-Satz 2
Tax2decimal(18,2)Steuer zum MwSt-Satz 2
Net3decimal(18,2)Netto zum MwSt-Satz 3
VatCode3nvarchar(100)MwSt-Code 3
VatRate3decimal(18,2)MwSt-Satz 3
Tax3decimal(18,2)Steuer zum MwSt-Satz 3
ReducedNetdecimal(18,2)Netto gekürzt
ReducedGrossdecimal(18,2)Brutto gekürzt
ReducedTaxdecimal(18,2)Steuer gekürzt
DiscountNetdecimal(18,2)Rabatt Netto
DiscountGrossdecimal(18,2)Rabatt Brutto
DiscountTaxdecimal(18,2)Rabatt Steuer
DiscountRatedecimal(18,2)Rabatt-Rate
AmountEligibleForCashDiscountNetdecimal(18,2)Skontofähiger Betrag Netto
AmountEligibleForCashDiscountGrossdecimal(18,2)Skontofähiger Betrag Brutto
Currencynvarchar(5)Währung (ISO-Code 4217)
HasOrderbitAngabe ob die Rechnung einen Bestellbezug hat
DivergentOrderCreditorbitAngabe ob die Bestellung bei einem abweichenden Lieferanten erfolgt ist
OrderNumbernvarchar(250)Bestellnummer(n)
OrderCheckbitErgebnis der Prüfung gegen die Bestellung
GoodsReceiptCheckbitErgebnis der Prüfung gegen den Wareneingang
ThreeWayMatchCheckbitErgebnis 3-Way-Match
IgnoreOrderLimitErrorsbitAngabe ob Fehler bei Limit Bestellungen ignoriert werden sollen
DeliveryNoteIDnvarchar(250)Lieferschein-Nummern
Subjectnvarchar(250)Betreff bei Mail-Eingang
OwnCustomerIDnvarchar(50)Eigene Kundennummer beim Lieferanten
Departmentnvarchar(50)Interne Abteilung
Commentnvarchar(MAX)Angaben aus dem Kommentar-Historien-Feld
AssignedUsersnvarchar(1500)Liste aus Benutzern bei manueller Zuordnung
AssignedUsernvarchar(50)Manuell zugeordneter Benutzer
SqueezeIDnvarchar(50)Eindeutige ID aus Squeeze
SqueezeStatusnvarchar(20)Squeeze Status
WorkflowIDnvarchar(50)Technischer Workflow-Name
WorkflowStartdatetimeWorkflow-Start
WorkflowEnddatetimeWorkflow-Ende
ActionIDnvarchar(50)Technischer Workflow-Aktions-Name
ActionStatusnvarchar(50)Status zur Workflow-Aktion
ActionStatus2nvarchar(50)Status2 zur Workflow-Aktion
ActionStartdatetimeZeitstempel für den Beginn der Aktion
ActionTasknvarchar(150)Aufgabenbeschreibung für die aktuelle Aktion
ActionUser nvarchar(75)Login zum aktuell sperrenden Benutzer
ActionAccessProfilenvarchar(75)Technischer Zugriffsprofil-Name der aktuell sperrenden Gruppe
ActionHeadRulenvarchar(50)Workflow-Regel ID
ActionRulesHelpernvarchar(50)Technische Informationen
ActionInfoJSONnvarchar(MAX)JSON-String mit Informationen zur aktuellen Workflow-Aktion
AskQuestionUsernvarchar(75)Benutzer-Login bei einer Rückfrage
TechAccessProfilenvarchar(75)Name technisches Zugriffsprofil für technische Workflow-Aktionen
Rightsnvarchar(MAX)GACL-Zurgiffsberechtigungen
RightsInitialnvarchar(MAX)Initiale Zugriffsberechtigungen
PrePostingStatusnvarchar(20)Status für Vorerfassung ("workflow", "ready", "transfer", "transferred", "preposted", "error")
PrePostingNumbernvarchar(50)ID Vorerfassung
PrePostingUser Benutzer für die Vorerfassung
**PostingStatus**nvarchar(20)Buchungs-Status ("workflow", "ready", "transfer", "transferred", "posted", "error", "disqualified")
**PostingNumber**nvarchar(50)Buchungsnummer
PostingKey nvarchar(500)Technischer Schlüssel bei Übertragung via SOAP
PostingText1nvarchar(250)Buchungstext 1
PostingText2nvarchar(250)Buchungstext 2
PostingErrornvarchar(250)Fehlermeldung bei der Buchung
PostingPeriodnvarchar(50)Buchungsperiode
PostingDatedateBuchungsdatum
PostingUsernvarchar(75)Benutzer für Buchung
ConditionsOfPayment\_IDnvarchar(50)Zahlungsbedingung ID
ConditionsOfPayment\_NetDaysintZahlungsbedingung Netto: Anzahl an Tagen
ConditionsOfPayment\_NetDatedateZahlungsbedingung Netto: Berechnetes Datum
ConditionsOfPayment\_NetSignnvarchar(50)Zahlungsbedingung Netto: Symbol für Eskalation
ConditionsOfPayment\_Percent1decimal(18,2)Zahlungsbedingung Stufe 1: Prozentangabe
ConditionsOfPayment\_Days1intZahlungsbedingung Stufe 1: Anzahl an Tagen
ConditionsOfPayment\_Date1dateZahlungsbedingung Stufe 1: Berechnetes Datum
ConditionsOfPayment\_1Signnvarchar(50)Zahlungsbedingung Stufe 1: Symbol für Eskalation
PaymentStatusnvarchar(50)Status der Zahlung ("unpaid", "payblock", "releasepayblock", "paid", "cash")
PaymentBlockReasonnvarchar(250)Grund für die Zahlsperre
PaymentIDnvarchar(50)ID für den Zahlungsvorgang
PaymentListnvarchar(50)ID für die Zahlungsvorschlagsliste
PaymentDatedateZahldatum
DuplicateStatenvarchar(50)Dublette Status ("unique", "duplicate", "allowed")
DuplicateInfonvarchar(250)Info zur Zulassung der Rechnungs-Dublette
InvoiceIDnvarchar(50)Interne ID
ArchiveKeynvarchar(250)Archiv-Schlüssel
InsertTSdatetimeZeitstempel initialer INSERT
UpdateTSdatetimeZeitstempel letztes UPDATE
Es werden immer alle Feldwerte zu den Feldern aus der Feldkonfiguration in die Tabelle geschrieben, bei denen die Checkbox "SQL Insert?" aktiviert wurde. Ausgenommen sind die Felder "FileID", "PrePostingStatus", "PostingStatus" und "PaymentStatus". Über die "FileID" wird das Update ausgeführt und über die Status-Felder werden die entsprechenden technischen Workflow-Aktionen gesteuert.
Bei der technischen Aktion "**Posting**" für die Buchungsschnittstelle wird im ersten Schritt die UserExit-Funktion "**ue\_Post()**" aufgerufen (Skript "**DEXPRO\_\_UserExit\_TechActionLib**"). In der Funktion wird zunächst der aktuelle Buchungsstatus überprüft. Es gibt folgende Status:
**Status****Beschreibung**
workflowInitialer Status. Der Beleg befindet sich im Workflow und wurde noch nicht gebucht.
readyDer Status signalisiert, dass der Datensatz bereit zur Abholung ist.
transferOptionaler Zwischen-Status, der beim Transfer-Start gesetzt werden kann.
transferredOptionaler Zwischen-Status, der nach dem Transfer gesetzt werden kann.
postedStatus für gebuchte Rechnungen.
errorStatus für Fehler beim buchungsvorgang.
disqualifiedStatus für ausgesteuerte Rechnungen.
Eine bereits gebuchte Rechnung solle nicht nochmals gebucht werden können. Sobald der Status auf "ready" gestellt wird hat das Workflow-System in der Regel keinen Einfluss mehr auf die weitere Verarbeitung. Die Status "transfer" und "transferred" sind optional und werden selten verwendet. Daher kann es selbst beim Status "ready" sein, dass die Daten bereits übertragen werden. Daher werden auch diese Status in der Standardauslieferung nicht überschrieben. Das Verhalten kann in dem UserExit angepasst werden.
Im Normalfall werden die Rechnungen nur einmal den Workflow-Schritt "Posting" durchlaufen. Im User-Exit werden nochmals die Positions-Daten und die Kopf-Daten geschrieben. Am Ende wird der Buchungs-Status auf "ready" gesetzt.
[![image-1602158901952.png](https://docs.squeeze.one/uploads/images/gallery/2020-10/scaled-1680-/image-1602158901952.png)](https://docs.squeeze.one/uploads/images/gallery/2020-10/image-1602158901952.png)
Der Rechnungsbeleg wird im Anschluss an die technisch Gruppe "TechAccessProfile" gesendet. Das Job-Skript "**Invoice\_JOB\_CheckPostingStatus**" prüft in den konfigurierten Abständen den Buchungsstatus der wartenden Rechnungen. Beim Buchungsstatus "posted" werden die Felder "PostingStatus", "PostingNumber", "PostingPeriod", "PostingDate", "PostingUser" und "PostingError" mit den Werten aus der Datenbank gesetzt und die Rechnung-Mappe wird im Workflow weiter geleitet. Das Skript schreibt ein separates Log (...\DEXPRO\Logs\), sobald mindestens ein Beleg untersucht wird.
Bei Fehlern in der Buchungs-Schnittstelle kann der Status "error" zurückgemeldet werden. Die Fehler-Beschreibung kann in das Feld "Posting Error" geschrieben werden. Die Rechnungs-Mappe wird in dem Fall an die im Feld "ActionAccessProfile" hinterlegte Gruppe mit der im Feld "TechActionErrorTask" hinterlegten Aufgaben-Beschreibung gesendet.

Am Workflow-Ende wird der Buchungs-Status im UserExit "**ue\_CheckFileDataAtTheEndOfTheWorkflow()**" nochmals überprüft. hierdurch soll verhindert werden, dass Rechnungen ohne Übergabe an das Buchungssystem durch den Workflow laufen. Aus diesem Grund sollte der Buchungs-Status in der Tabelle auch dann auf "posted" gesetzt werden, wenn die Buchungs-Daten über andere Wege übertragen werden!

Auch die Vorerfassung und der Bezahlvorgang können über diese Schnittstellen-Tabelle und entsprechende technischen Aktionen "**PrePosting**" und "**Payment**" abgebildet werden. Der Ablauf ist ähnlich. In beiden Fällen werden zunächst die Rechnungs-Daten in die Tabellen geschrieben. Im Anschluss läuft die Mappe weiter zur technischen Gruppe.
Bei der Vorerfassung ("**PrePosting**") prüft das Job-Skript "**Invoice\_JOB\_CheckPrePostingStatus**" das Status-Feld "**PrePostingStatus**". Es gibt die folgenden Status:
**Status****Beschreibung**
workflowInitialer Status. Der Beleg befindet sich im Workflow und wurde noch nicht vorerfasst.
readyDer Status signalisiert, dass der Datensatz bereit zur Abholung ist.
transferOptionaler Zwischen-Status, der beim Transfer-Start gesetzt werden kann.
transferredOptionaler Zwischen-Status, der nach dem Transfer gesetzt werden kann.
prepostedStatus für vor-erfasste Rechnungen.
errorStatus für Fehler bei der Vor-Erfassung.
Die Felder "PrePostingStatus", "PrePostingNumber", "PrePostingUser" und "PostingError" werden mit den Werten aus der Datenbank gesetzt.
Bei der Bezahlung ("**Payment**") erfolgt der Abgleich hingegen über das Status-Feld "**PaymentStatus**". Das Job-Skript "**Invoice\_JOB\_CheckPrePostingStatus**" prüft in den konfigurierten Abständen den Buchungsstatus der wartenden Rechnungen und erwartet den Status "paid" oder "cash".
**Status****Beschreibung**
unpaidInitialer Bezahl-Status.
payblockStatus für eine Zahlsperre.
releasepayblockRückmeldung, dass eine Zahlsperre entfernt werden kann (für projektspezifische Umsetzungen).
paidStatus für eine bezahlte Rechnung.
cashStatus für eine bar bezahlte Rechnung.
Die Felder "PaymentStatus", "PaymentID", "PaymentList", "PaymentDate" und "PostingError" werden mit den Werten aus der Datenbank gesetzt.