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. 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) bigint Auto-Inkrement-Spalte FileID nvarchar(50) Eindeutige Mappen-ID für UPDATE-Befehle Barcode nvarchar(50) Optional: Barcode-Nummer zur Rechnung DateOfReceipt date Wird am Mappentypen mit dem aktuellen Tagesdatum vorbelegt InvoiceNumber nvarchar(50) Externe Rechnungsnummer InvoiceCreditVoucher nvarchar(15) "invoice" für Rechnung bzw. "creditvoucher" für Gutschriften InvoiceDate date Rechnungsdatum DueDate date Fälligkeitsdatum ServiceDate date Leistungsdatum Principal nvarchar(50) Mandanten-Nummer CompanyCode nvarchar(50) Buchungskreis-Nummer CreditorID nvarchar(50) Kreditor ID CreditorName nvarchar(100) Kreditor Bezeichnung Creditor_Street nvarchar(200) Kreditor-Anschrift: Straßenname Creditor_City nvarchar(100) Kreditor-Anschrift: Stadt Creditor_PostCode nvarchar(50) Kreditor-Anschrift: Postleitzahl Creditor_Country nvarchar(50) Kreditor-Anschrift: Land Creditor_Mail nvarchar(50) Kreditor Mail-Adresse Creditor_Phone nvarchar(50) Kreditor Telefonnummer SenderMail nvarchar(50) Absender-Adresse bei Mail-Rechnungen BankName nvarchar(150) Kontoverbindung: Bank-Name BankAccountHolder nvarchar(150) Kontoverbindung: Konto-Inhaber IBAN nvarchar(50) Kontoverbindung: IBAN BIC nvarchar(50) Kontoverbindung: BIC BankID nvarchar(50) Kontoverbindung: Bankleitzahl BankAccountID nvarchar(50) Kontoverbindung: Kontonummer Net decimal(18,2) Netto-Betrag Gross decimal(18,2) Brutto-Betrag Tax decimal(18,2) Steuer-Betrag Net1 decimal(18,2) Netto zum MwSt-Satz 1 VatCode1 nvarchar(100) MwSt-Code 1 VatRate1 decimal(18,2) MwSt-Satz 1 Tax1 decimal(18,2) Steuer zum MwSt-Satz 1 Net2 decimal(18,2) Netto zum MwSt-Satz 2 VatCode2 nvarchar(100) MwSt-Code 2 VatRate2 decimal(18,2) MwSt-Satz 2 Tax2 decimal(18,2) Steuer zum MwSt-Satz 2 Net3 decimal(18,2) Netto zum MwSt-Satz 3 VatCode3 nvarchar(100) MwSt-Code 3 VatRate3 decimal(18,2) MwSt-Satz 3 Tax3 decimal(18,2) Steuer zum MwSt-Satz 3 ReducedNet decimal(18,2) Netto gekürzt ReducedGross decimal(18,2) Brutto gekürzt ReducedTax decimal(18,2) Steuer gekürzt DiscountNet decimal(18,2) Rabatt Netto DiscountGross decimal(18,2) Rabatt Brutto DiscountTax decimal(18,2) Rabatt Steuer DiscountRate decimal(18,2) Rabatt-Rate AmountEligibleForCashDiscountNet decimal(18,2) Skontofähiger Betrag Netto AmountEligibleForCashDiscountGross decimal(18,2) Skontofähiger Betrag Brutto Currency nvarchar(5) Währung (ISO-Code 4217) HasOrder bit Angabe ob die Rechnung einen Bestellbezug hat DivergentOrderCreditor bit Angabe ob die Bestellung bei einem abweichenden Lieferanten erfolgt ist OrderNumber nvarchar(250) Bestellnummer(n) OrderCheck bit Ergebnis der Prüfung gegen die Bestellung GoodsReceiptCheck bit Ergebnis der Prüfung gegen den Wareneingang ThreeWayMatchCheck bit Ergebnis 3-Way-Match IgnoreOrderLimitErrors bit Angabe ob Fehler bei Limit Bestellungen ignoriert werden sollen DeliveryNoteID nvarchar(250) Lieferschein-Nummern Subject nvarchar(250) Betreff bei Mail-Eingang OwnCustomerID nvarchar(50) Eigene Kundennummer beim Lieferanten Department nvarchar(50) Interne Abteilung Comment nvarchar(MAX) Angaben aus dem Kommentar-Historien-Feld AssignedUsers nvarchar(1500) Liste aus Benutzern bei manueller Zuordnung AssignedUser nvarchar(50) Manuell zugeordneter Benutzer SqueezeID nvarchar(50) Eindeutige ID aus Squeeze SqueezeStatus nvarchar(20) Squeeze Status WorkflowID nvarchar(50) Technischer Workflow-Name WorkflowStart datetime Workflow-Start WorkflowEnd datetime Workflow-Ende ActionID nvarchar(50) Technischer Workflow-Aktions-Name ActionStatus nvarchar(50) Status zur Workflow-Aktion ActionStatus2 nvarchar(50) Status2 zur Workflow-Aktion ActionStart datetime Zeitstempel für den Beginn der Aktion ActionTask nvarchar(150) Aufgabenbeschreibung für die aktuelle Aktion ActionUser nvarchar(75) Login zum aktuell sperrenden Benutzer ActionAccessProfile nvarchar(75) Technischer Zugriffsprofil-Name der aktuell sperrenden Gruppe ActionHeadRule nvarchar(50) Workflow-Regel ID ActionRulesHelper nvarchar(50) Technische Informationen ActionInfoJSON nvarchar(MAX) JSON-String mit Informationen zur aktuellen Workflow-Aktion AskQuestionUser nvarchar(75) Benutzer-Login bei einer Rückfrage TechAccessProfile nvarchar(75) Name technisches Zugriffsprofil für technische Workflow-Aktionen Rights nvarchar(MAX) GACL-Zurgiffsberechtigungen RightsInitial nvarchar(MAX) Initiale Zugriffsberechtigungen PrePostingStatus nvarchar(20) Status für Vorerfassung ("workflow", "ready", "transfer", "transferred", "preposted", "error") PrePostingNumber nvarchar(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 PostingText1 nvarchar(250) Buchungstext 1 PostingText2 nvarchar(250) Buchungstext 2 PostingError nvarchar(250) Fehlermeldung bei der Buchung PostingPeriod nvarchar(50) Buchungsperiode PostingDate date Buchungsdatum PostingUser nvarchar(75) Benutzer für Buchung  ConditionsOfPayment_ID nvarchar(50) Zahlungsbedingung ID ConditionsOfPayment_NetDays int Zahlungsbedingung Netto: Anzahl an Tagen ConditionsOfPayment_NetDate date Zahlungsbedingung Netto: Berechnetes Datum ConditionsOfPayment_NetSign nvarchar(50) Zahlungsbedingung Netto: Symbol für Eskalation ConditionsOfPayment_Percent1 decimal(18,2) Zahlungsbedingung Stufe 1: Prozentangabe ConditionsOfPayment_Days1 int Zahlungsbedingung Stufe 1: Anzahl an Tagen ConditionsOfPayment_Date1 date Zahlungsbedingung Stufe 1: Berechnetes Datum ConditionsOfPayment_1Sign nvarchar(50) Zahlungsbedingung Stufe 1: Symbol für Eskalation PaymentStatus nvarchar(50) Status der Zahlung ("unpaid", "payblock", "releasepayblock", "paid", "cash") PaymentBlockReason nvarchar(250) Grund für die Zahlsperre PaymentID nvarchar(50) ID für den Zahlungsvorgang PaymentList nvarchar(50) ID für die Zahlungsvorschlagsliste PaymentDate date Zahldatum DuplicateState nvarchar(50) Dublette Status ("unique", "duplicate", "allowed") DuplicateInfo nvarchar(250) Info zur Zulassung der Rechnungs-Dublette InvoiceID nvarchar(50) Interne ID ArchiveKey nvarchar(250) Archiv-Schlüssel InsertTS datetime Zeitstempel initialer INSERT UpdateTS datetime Zeitstempel 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 workflow Initialer Status. Der Beleg befindet sich im Workflow und wurde noch nicht gebucht. ready Der Status signalisiert, dass der Datensatz bereit zur Abholung ist. transfer Optionaler Zwischen-Status, der beim Transfer-Start gesetzt werden kann. transferred Optionaler Zwischen-Status, der nach dem Transfer gesetzt werden kann. posted Status für gebuchte Rechnungen. error Status für Fehler beim buchungsvorgang. disqualified Status 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. 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 workflow Initialer Status. Der Beleg befindet sich im Workflow und wurde noch nicht vorerfasst. ready Der Status signalisiert, dass der Datensatz bereit zur Abholung ist. transfer Optionaler Zwischen-Status, der beim Transfer-Start gesetzt werden kann. transferred Optionaler Zwischen-Status, der nach dem Transfer gesetzt werden kann. preposted Status für vor-erfasste Rechnungen. error Status 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 unpaid Initialer Bezahl-Status. payblock Status für eine Zahlsperre. releasepayblock Rückmeldung, dass eine Zahlsperre entfernt werden kann (für projektspezifische Umsetzungen). paid Status für eine bezahlte Rechnung. cash Status für eine bar bezahlte Rechnung. Die Felder "PaymentStatus", "PaymentID", "PaymentList", "PaymentDate" und "PostingError" werden mit den Werten aus der Datenbank gesetzt.