# Invoice Buchungs-Schnittstelle / Zahlung # NAV Buchung via SOAP Die Übergabe kann mit direktem Feedback über eine vordefinierte Schnittstelle erfolgen. # Datenbank-Tabellen Die Übergabe kann über die Standard-Datenbank-Tabellen "Invoice_Posting_Head" und "Invoice_Posting_Pos" erfolgen. # 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.
# Tabelle "Invoice_Posting_Pos" für Positionsdaten In die Tabelle werden die Positionsdaten der Rechnung geschrieben. Über die Auto-Inkrement-Spalte "ID" erhält jede Zeile eine eindeutige ID. Diese ID wird zurück in die Zeile der Rechnungs-Mappe geschrieben. Die Zuordnung zur Rechnung erfolgt auch hier über die Spalte "FileID". Bei einem Rechnungs-Split enthält das Feld sowohl die ID der Haupt-Mappe als auch der Split-Mappe. Sobald in einer Gentable-Zeile eine eindeutige ID angegeben ist werden die Daten via UPDATE aktualisiert. Während des Schreibvorgangs wird die Spalte "WorkStatus" verwendet. Am Ende werden nicht benötigte Zeilen gelöscht.
**Spaltenname****Datentyp****Beschreibung**
**ID (KEY)**bigintAuto-Inkrement-Spalte
**FileID**nvarchar(100)Eindeutige ID zur Rechnungs-Mappe bzw. Kombination aus der ID einer Split-Mappe und der Hauptmappe bei Rechnungs-Splits.
LineNumberintRechnungs-Zeilennummer
SqueezePosNointIn Squeeze erkannte Zeilennummer (noch ohne Funktion - ggf. zum Markieren von erkannten Rechnungspositionen auf der Rechnung)
ExtraLinebitAngabe, ob es sich um eine Zu-/Abschlagszeile handelt.
Principalnvarchar(50)Zeilen-Mandant
CompanyCodenvarchar(50)Zeilen-Buchungskreis
OrderErrornvarchar(500)Fehlermeldung bei Bestellabweichung
GoodsReceiptErrornvarchar(500)Fehlermeldung bei Abweichung zum Wareneingang
GoodsReceiptCheckbitErgebnis der Prüfung gegen den Wareneingang
GoodsReceiptIDnvarchar(100)Wareneingangs-ID
GoodsReceiptPositionnvarchar(100)Wareneingangs-Positionsnummer
DeliveryNoteIDnvarchar(50)Lieferscheinnummer
OrderNumbernvarchar(100)Bestellnummer
OrderPosnvarchar(100)Bestellposition (die Kombination aus Bestellnummer + Bestellposition muss zwingend eindeutig sein)
ArticleCodenvarchar(100)Artikelnummer vom Lieferanten
ArticleCodeInternnvarchar(100)Artikelnummer intern
ArticleDescriptionnvarchar(500)Artikelbeschreibung
ArticleDescriptionOrdernvarchar(500)Artikelbeschreibung bei der Bestellung
ProductGroupnvarchar(50)Produktgruppe
OrderDatedateBestelldatum
DeliveryDatedateTatsächliches Lieferdatum
DeliveryDateExpecteddateErwartetes Lieferdatum
RequesterLoginnvarchar(75)Login des Bestell-Anforderers
DebitCreditnvarchar(10)Soll ("debit") oder Haben ("credit")
Quantitydecimal(18,5)Menge
QuantityReduceddecimal(18,5)Reduzierte Menge
QuantityOrdereddecimal(18,5)Bestellte Menge
QuantityDelivereddecimal(18,5)Gelieferte Menge
QuantityOpendecimal(18,5)Offene Bestellmenge
QuantityUnitnvarchar(50)Mengeneinheit
QuantityUnitOrderednvarchar(50)Bestellte Mengeneinheit
Pricedecimal(18,3)Preis
PriceOrdereddecimal(18,3)Preis bei Bestellung
PriceUnitdecimal(18,5)Preiseinheit
PriceUnitOrdereddecimal(18,5)Preiseinheit bei Bestellung
Netdecimal(18,3)Nettobetrag
Currencynvarchar(10)Währung
CurrencyChangeRatedecimal(18,6)Wechselkurs
NetPrincipaldecimal(18,3)Nettobetrag in Währung des Mandanten
CurrencyPrincipalnvarchar(10)Währung des Mandanten
VatRatedecimal(18,2)Mwst-Satz
VatCodenvarchar(100)MwSt-Code
VatRate2decimal(18,2)MwSt-Satz 2
VatCode2nvarchar(100)MwSt-Code 2
Taxdecimal(18,2)Steuerbetrag
Grossdecimal(18,2)Bruttobetrag
DiscountRatedecimal(18,2)Rabatt in Prozent
DiscountNetdecimal(18,3)Netto nach Rabatt
DiscountGrossdecimal(18,3)Brutto nach Rabatt
DiscountTaxdecimal(18,3)Steuer nach Rabatt
ReductionRatedecimal(18,2)Kürzungsrate in Prozent
ReductionNetdecimal(18,3)Netto Kürzung um
ReducedNetdecimal(18,3)Netto gekürzter Betrag
ReductionGrossdecimal(18,3)Brutto Kürzung um
ReducedGrossdecimal(18,3)Brutto gekürzter Betrag
ReductionTaxdecimal(18,3)Steuer Kürzung um
ReducedTaxdecimal(18,3)Steuer gekürzter Betrag
AmountEligibleForCashDiscountNetdecimal(18,3)Skonto-Fähiger Betrag Netto
AmountEligibleForCashDiscountGrossdecimal(18,3)Skonto-Fähiger Betrag Brutto
GLAccountnvarchar(50)Sachkonto ID
GLAccount\_Descnvarchar(150)Sachkonto Beschreibung
CostCenternvarchar(50)Kostenstelle
CostCenter\_Descnvarchar(150)Kostenstelle Beschreibung
CostCenter\_Responsiblenvarchar(150)Kostenstellenverantwortlicher
CostUnitnvarchar(50)Kostenträger
CostUnit\_Descnvarchar(150)Kostenträger Beschreibung
Custom1nvarchar(50)Projektspezifisches Feld für Kontierung 1
Custom1\_Descnvarchar(150)Projektspezifisches Feld für Kontierung 1 Beschreibung
Custom2nvarchar(50)Projektspezifisches Feld für Kontierung 2
Custom2\_Descnvarchar(150)Projektspezifisches Feld für Kontierung 2 Beschreibung
Custom3nvarchar(50)Projektspezifisches Feld für Kontierung 3
Custom3\_Descnvarchar(150)Projektspezifisches Feld für Kontierung 3 Beschreibung
Custom4nvarchar(50)Projektspezifisches Feld für Kontierung 4
Custom4\_Descnvarchar(150)Projektspezifisches Feld für Kontierung 4 Beschreibung
Custom5nvarchar(50)Projektspezifisches Feld für Kontierung 5
Custom5\_Descnvarchar(150)Projektspezifisches Feld für Kontierung 5 Beschreibung
Custom6nvarchar(50)Projektspezifisches Feld für Kontierung 6
Custom6\_Descnvarchar(150)Projektspezifisches Feld für Kontierung 6 Beschreibung
Custom7nvarchar(50)Projektspezifisches Feld für Kontierung 7
Custom7\_Descnvarchar(150)Projektspezifisches Feld für Kontierung 7 Beschreibung
Custom8nvarchar(50)Projektspezifisches Feld für Kontierung 8
Custom8\_Descnvarchar(150)Projektspezifisches Feld für Kontierung 8 Beschreibung
Custom9nvarchar(50)Projektspezifisches Feld für Kontierung 9
Custom9\_Descnvarchar(150)Projektspezifisches Feld für Kontierung 9 Beschreibung
Custom10nvarchar(50)Projektspezifisches Feld für Kontierung 10
Custom10\_Descnvarchar(150)Projektspezifisches Feld für Kontierung 10 Beschreibung
OrderLimitCheckboxbitAngabe ob ein Bestell-Limit geprüft werden soll
OrderLimitAmountdecimal(18,2)Limit-Betrag
OrderCustomBit1bitProjektspezifisches zusätzliches Bit-Feld für Bestelldaten
OrderCustomBit2bitProjektspezifisches zusätzliches Bit-Feld für Bestelldaten
OrderCustomDate1dateProjektspezifisches zusätzliches Datums-Feld für Bestelldaten
OrderCustomDate2dateProjektspezifisches zusätzliches Datums-Feld für Bestelldaten
OrderCustomDatetime1datetimeProjektspezifisches zusätzliches Zeitstempel-Feld für Bestelldaten
OrderCustomNumeric1decimal(18,2)Projektspezifisches zusätzliches Betrags-Feld für Bestelldaten
OrderCustomNumeric2decimal(18,2)Projektspezifisches zusätzliches Betrags-Feld für Bestelldaten
OrderCustomString1nvarchar(50)Projektspezifisches zusätzliches String-Feld für Bestelldaten
OrderCustomString2nvarchar(50)Projektspezifisches zusätzliches String-Feld für Bestelldaten
OrderCustomString3nvarchar(50)Projektspezifisches zusätzliches String-Feld für Bestelldaten
StampCheckboxValidationbitPrüfstempel Checkbox Validierung
StampDatetimeValidationdatetimePrüfstempel Zeitstempel Validierung
StampLoginValidationnvarchar(75)Prüfstempel Login Validierung
StampNameValidationnvarchar(150)Prüfstempel Name Validierung
StampCheckboxFinalCheckbitPrüfstempel Checkbox Finale Prüfung
StampDatetimeFinalCheckdatetimePrüfstempel Zeitstempel Finale Prüfung
StampLoginFinalChecknvarchar(75)Prüfstempel Login Finale Prüfung
StampNameFinalChecknvarchar(150)Prüfstempel Name Finale Prüfung
StampCheckboxAppr1bitPrüfstempel Checkbox Prüfung 1
StampDatetimeAppr1datetimePrüfstempel Zeitstempel Prüfung 1
StampLoginAppr1nvarchar(75)Prüfstempel Login Prüfung 1
StampNameAppr1nvarchar(150)Prüfstempel Name Prüfung 1
...2-5 ...weitere Prüfstempel 2-5
StampCheckboxRel1bitPrüfstempel Checkbox Freigabe 1
StampDatetimeRel1datetimePrüfstempel Zeitstempel Freigabe 1
StampLoginRel1nvarchar(75)Prüfstempel Login Freigabe 1
StampNameRel1nvarchar(150)Prüfstempel Name Freigabe 1
...2-5 ...weitere Prüfstempel 2-5
StampCheckboxCust1bitPrüfstempel Checkbox projektspezifisch 1
StampDatetimeCust1datetimePrüfstempel Zeitstempel projektspezifisch 1
StampLoginCust1nvarchar(75)Prüfstempel Login projektspezifisch 1
StampNameCust1nvarchar(150)Prüfstempel Name projektspezifisch 1
...2-5 ...weitere Prüfstempel 2-5
InsertTSdatetimeZeitstempel für initialen Insert
UpdateTSdatetimeUpdate Zeitstempel
WorkStatusnvarchar(10)Arbeitstatus für Insert und Update (technisch)
# Workflow-Aktion "Buchungsschnittstelle" Die technische Workflow-Aktion für die Buchungsschnittstelle stellt die Rechnungsdaten im ersten Schritt in SQL-Tabellen zur Verfügung und wartet im zweiten Schritt auf die Rückmeldung vom Buchungssystem. [![image-1603090095856.png](https://docs.squeeze.one/uploads/images/gallery/2020-10/scaled-1680-/image-1603090095856.png)](https://docs.squeeze.one/uploads/images/gallery/2020-10/image-1603090095856.png) Technisch wird in dem Skript "DEXPRO\_WF\_TechAction1\_Send" die UserExit-Funktion "**ue\_post()**" aufgerufen. Die Funktion befindet sich im Skript "**DEXPRO\_\_UserExit\_TechActionLib**" und kann somit projektspezifisch angepasst und erweitert werden. Die Funktion erstellt ein PostObject(). [![image-1603091260281.png](https://docs.squeeze.one/uploads/images/gallery/2020-10/scaled-1680-/image-1603091260281.png)](https://docs.squeeze.one/uploads/images/gallery/2020-10/image-1603091260281.png) Das Skript ermittelt den aktuellen Status in der Tabelle über die Funktion "**postObj.getStatusValues()**". Wenn der ermittelte Status ok ist werden die Rechnungsdaten erneut in die Tabelle geschrieben. Sollte der Status bereits auf "ready" (cPostingStatusReady) stehen könnte es sein, dass die Daten bereits an das Zielsystem übertragen wurden. Ein erneutes Senden könnte zu zwei Buchungssätzen zu einer Rechnung führen. Dasselbe gilt für die Status "transfer" (cPostingStatusTransfer), "transferred" (cPostingStatusTansferred) und erst recht für bereits gebuchte Rechnungen mit dem Status "posted" (cPostingStatusPosted). Gültige Status bei denen die Rechnungsdaten geschrieben werden sind "workflow" (cPostingStatusWF) und "error" (cPostingStatusError).

Der Status darf erst auf "ready" umgestellt werden, wenn alle projektspezifischen Anpassungen erfolgreich durchgelaufen sind!

Nach dem Schreiben in die Datenbank kann eine weitere projektspezifische Verarbeitung angefügt werden. Die Rechnungswerte können zum Beispiel zusätzlich in einem definierten Dateiformat in ein Übergabe-Verzeichnis abgelegt werden oder können zusätzlich in eine weitere Tabelle geschrieben werden oder können via WEB-Service direkt das Zielsystem gesendet werden. [![image-1603090253251.png](https://docs.squeeze.one/uploads/images/gallery/2020-10/scaled-1680-/image-1603090253251.png)](https://docs.squeeze.one/uploads/images/gallery/2020-10/image-1603090253251.png) Im Anschluss wird die Rechnungs-Mappe an die im Feld "TechAccessProfile" hinterlegte Gruppe weitergeleitet. Im Standard steht die gleichnamige Gruppe im Feld. Das Feld "ActionStatus" wird auf den Wert "TechActionJob" gesetzt. Über diesen Wert zusammen mit dem Wert "Posting" aus dem Feld "ActionID" können die Mappen leicht gefiltert werden. [![image-1603093771819.png](https://docs.squeeze.one/uploads/images/gallery/2020-10/scaled-1680-/image-1603093771819.png)](https://docs.squeeze.one/uploads/images/gallery/2020-10/image-1603093771819.png) An dieser Stelle wird bewusst auf den Signaleingang verzichtet. Bei einem Signaleingang wird das hinterlegte Prüfskript alle 5 Minuten pro wartende Mappe ausgeführt. Das kann unter Umständen zu Performance-Problemen führen. Häufig werden alle bereitgestellten Daten nur einmal am Tag in einem Zug an das Zielsystem übertragen. Die Rückmeldung kann in vielen Fällen effizienter durch ein Job-Skript abgebildet werden. Das Job-Skript "**Invoice\_JOB\_CheckPostingStatus**" überprüft den Status in der Tabelle und leitet die Mappen beim Status "posted" weiter im Workflow. Beim Status "error" wird an die im Feld "ActionAccessProfile" hinterlegte Gruppe weitergeleitet und das Feld "ActionStatus" wird bei Eingang in die Aktion auf "TechActionError" gesetzt. Das Feld "ActionAccessProfile" wird übrigens in der UserExit-Funktion "ue\_Post()" gesetzt und kann auf eine beliebige Gruppe geändert werden. Das Job-Skript ist in der Standard-Auslieferung nicht aktiv und kann auf beliebige Ausführungszeitpunkte konfiguriert werden. Hierfür muss die Checkbox "Als Job starten" auf dem Register "Job" aktiviert werden. Job-Skripte können entweder zu fest definierten Zeitpunkten oder im Intervall ausgeführt werden. Falls das kürzeste Intervall "Viertelstündlich" nicht ausreichend sein sollte kann über die bereits gesetzte Eigenschaft "frequency" ein noch häufigeres Intervall konfiguriert werden (Angabe in Minuten). [![image-1603094666050.png](https://docs.squeeze.one/uploads/images/gallery/2020-10/scaled-1680-/image-1603094666050.png)](https://docs.squeeze.one/uploads/images/gallery/2020-10/image-1603094666050.png)

[Die voreingestellte "frequency" von einer Minute ist für Demo-Systeme und für ](https://docs.squeeze.one/uploads/images/gallery/2020-10/image-1603094666050.png)die Testphase vor der Produktivsetzung hilfreich. Beim Go-Live sollte die Ausführungshäufigkeit sinnvoll neu konfiguriert werden.

[![image-1603094815067.png](https://docs.squeeze.one/uploads/images/gallery/2020-10/scaled-1680-/image-1603094815067.png)](https://docs.squeeze.one/uploads/images/gallery/2020-10/image-1603094815067.png)