Workflow Konfiguration Middleware Connector

Einleitung

Ab der Version 2024.1 ist für die Nutzung der Schnittstelle, also dem Datenaustausch von Stamm- und Bewegungsdaten zu JobRouter, ein zusätzlicher Dienst - der Middleware Connector (kurz: MWC) - erforderlich. Der Middleware Connector übernimmt dabei die Kommunikation mit dem SQL-Server auf der einen Seite und Finance auf der anderen Seite. Letzteres läuft über eine eigene API, die in Finance zur Verfügung gestellt wird. Finance übernimmt wie zuvor die Bereitstellung der Stammdaten und die Verarbeitung von bereitgestellten Bewegungsdaten.

Installation und Einrichtung

Die Installation und Einrichtung sind in unserem Download-Portal zur jeweiligen Version beschrieben.

Für 2024.1: Installation & Update - Nevaris Middleware Connector - 2024.1

Konfigurationsbeispiele

Import

Es gibt mehrere Faktoren, die darüber entscheiden, ob die mitgelieferten Standardkonfigurationen verwendet werden können oder ob eigene verwendet werden müssen. Das sind:

  1. Tabellennamen auf SQL-Ebene
  2. Anzahl an unterschiedlichen Tabellen pro Import, wie z. B. zwei Tabellen für den Rechnungseingang
  3. Nicht alle Tabellen aus dem Standard werden verwendet

Definierter Standard:

ImportTabellenname
Rechnungseingang

REBUKOPF

REBUZEILE

Rechnungsausgang

RABUKOPF

RABUZEILE

Kassenbuch

KABUKOPF

KABUZEILE

BestellungenBESTELLKOPF
UrlaubsanträgeURLAUBANTRAG
NU-BescheinigungenSTAMMDATEN

Tabellennamen entsprechen dem definierten Standard 

Wenn die Tabellennamen dem definierten Standard entsprechen, können die mitgelieferten Standardkonfigurationen verwendet werden.

Tabellennamen entsprechen nicht dem definierten Standard

Wie in der Einrichtungsbeschreibung bereits vermerkt ist, wird dafür eine eigene Konfigurationsdatei benötigt.

In dem vorliegenden Beispiel wurden die Tabellen REBUKOPF, REBUZEILE, RABUKOPF und RABUZEILE umbenannt. Die geänderten Tabellennamen sind innerhalb der "DataSets" beim "TableName" zu ändern.

{
  "HttpApis": [
  ],
  "SqlDatabases": [
    {
      "Id": "JobRouterDB",
      "Schema": {
			...
      },
      "DataSets": [
        {
          "Name": "Rebukopf", "TableName": "REBUKOPFWEBCLIENT", "KeyColumns": "processid, step_id",
          "WhereFilter": "{{filterRebu}}"
        },
        {
          "Name": "Rebuzeile", "TableName": "REBUZEILEWEBCLIENT", "KeyColumns": "processid, step_id, row_id",
          "ParentDataSet": "Rebukopf", "ParentKeyColumns": "processid, step_id"
        },
        {
          "Name": "Kabukopf", "TableName": "KABUKOPF", "KeyColumns": "processid, step_id",
          "WhereFilter": "{{filterKabu}}"
        },
        {
          "Name": "Kabuzeile", "TableName": "KABUZEILE", "KeyColumns": "processid, step_id, row_id",
          "ParentDataSet": "Kabukopf", "ParentKeyColumns": "processid, step_id"
        },
        {
          "Name": "Rabukopf", "TableName": "RABUKOPFWEBCLIENT", "KeyColumns": "processid, step_id",
          "WhereFilter": "{{filterRabu}}"
        },
        {
          "Name": "Rabuzeile", "TableName": "RABUZEILEWEBCLIENT", "KeyColumns": "processid, step_id, row_id",
          "ParentDataSet": "Rabukopf", "ParentKeyColumns": "processid, step_id"
        },
        {
          "Name": "Urlaubantrag", "TableName": "URLAUBANTRAG", "KeyColumns": "processid, step_id",
          "WhereFilter": "{{filterBLO}}"
        },
        {
          "Name": "Bestellkopf", "TableName": "BESTELLKOPF", "KeyColumns": "processid, step_id",
          "WhereFilter": "{{filterEK}}"
        },
        {
          "Name": "Stammdaten", "TableName": "STAMMDATEN", "KeyColumns": "processid, step_id",
          "WhereFilter": "{{filterStamm}}"
        },
        {...}
      ],
      "ReadOptions": {
        "DataSets": [ "Rebukopf", "Rebuzeile", "Kabukopf", "Kabuzeile", "Rabukopf", "Rabuzeile", "Urlaubantrag", "Bestellkopf", "Stammdaten" ]
      },
      "WriteOptions": {
			...
      }
    }
  ]
}

Es sind mehrere Importtabellen vorhanden

Im vorliegenden Beispiel sind die Tabellen für den Rechnungseingang mehrfach vorhanden. In diesem Fall werden mindestens zwei eigene Konfigurationsdateien benötigt. Die Anzahl der Konfigurationen hängt von der Anzahl der unterschiedlichen Importtabellen ab. Bei der Erstellung der Konfigurationen sind die Felder "TableName" innerhalb der "DataSets" anzupassen, die "Id" bei den "SqlDatabases" sowie in einer eigenen Konfiguration für den Export* die "Id" bei den "HttpApis". Die ID wird zur Zuweisung der Konfiguration (über das Feld "Datenhaltung") zu einem MWC-Job verwendet. 

Die Status-Änderung für das Feld "BK_Status" wird über den Export-Job mit übertragen.

Konfiguration 1 (SQL > Finance):

{
  "HttpApis": [
  ],
  "SqlDatabases": [
    {
      "Id": "JobRouterDB",
      "Schema": {
			...
      },
      "DataSets": [
        {
          "Name": "Rebukopf", "TableName": "REBUKOPF", "KeyColumns": "processid, step_id",
          "WhereFilter": "{{filterRebu}}"
        },
        {
          "Name": "Rebuzeile", "TableName": "REBUZEILE", "KeyColumns": "processid, step_id, row_id",
          "ParentDataSet": "Rebukopf", "ParentKeyColumns": "processid, step_id"
        },
        {
          "Name": "Kabukopf", "TableName": "KABUKOPF", "KeyColumns": "processid, step_id",
          "WhereFilter": "{{filterKabu}}"
        },
        {
          "Name": "Kabuzeile", "TableName": "KABUZEILE", "KeyColumns": "processid, step_id, row_id",
          "ParentDataSet": "Kabukopf", "ParentKeyColumns": "processid, step_id"
        },
        {
          "Name": "Rabukopf", "TableName": "RABUKOPF", "KeyColumns": "processid, step_id",
          "WhereFilter": "{{filterRabu}}"
        },
        {
          "Name": "Rabuzeile", "TableName": "RABUZEILE", "KeyColumns": "processid, step_id, row_id",
          "ParentDataSet": "Rabukopf", "ParentKeyColumns": "processid, step_id"
        },
        {
          "Name": "Urlaubantrag", "TableName": "URLAUBANTRAG", "KeyColumns": "processid, step_id",
          "WhereFilter": "{{filterBLO}}"
        },
        {
          "Name": "Bestellkopf", "TableName": "BESTELLKOPF", "KeyColumns": "processid, step_id",
          "WhereFilter": "{{filterEK}}"
        },
        {
          "Name": "Stammdaten", "TableName": "STAMMDATEN", "KeyColumns": "processid, step_id",
          "WhereFilter": "{{filterStamm}}"
        },
        {...}
      ],
      "ReadOptions": {
        "DataSets": [ "Rebukopf", "Rebuzeile", "Kabukopf", "Kabuzeile", "Rabukopf", "Rabuzeile", "Urlaubantrag", "Bestellkopf", "Stammdaten" ]
      },
      "WriteOptions": {
			...
      }
    }
  ]
}


Konfiguration 1 (Finance > SQL):

{
  "HttpApis": [
    {
      "Id": "FinanceApi",
      "ModifiedAtField": "changedAt",
      "DeletedAtField": "deletedAt",
      "QueryArguments": [
        { "FilterMode": "ModifiedAt", "Parameter": "$filter", "Value": "changedAt gt {{lastSyncTime}} and tableNameExternal eq 'REBUKOPF'", "FallbackValue": "changedAt gt 0001-01-01T00:00:00Z" },
        { "FilterMode": "DeletedAt", "Parameter": "$filter", "Value": "deletedAt gt {{lastSyncTime}} and tableNameExternal eq 'REBUKOPF'", "FallbackValue": "deletedAt gt 0001-01-01T00:00:00Z" }
      ],
      "DataSets": [
        {...}
      ],
      "WriteOptions": {
        ...
      },
      "VariableProviderQuery": "workflowSetup",
      "ApiVersionQuery": "workflowApiVersion",
      "RequiredApiVersion": "1.0"
    }
  ],
  "SqlDatabases": [
  ]
}


Konfiguration 2 (SQL > Finance):

{
  "HttpApis": [
  ],
  "SqlDatabases": [
    {
      "Id": "JobRouterDB2",
      "Schema": {
			...
      },
      "DataSets": [
        {
          "Name": "Rebukopf", "TableName": "REBUKOPFWEBCLIENT", "KeyColumns": "processid, step_id",
          "WhereFilter": "{{filterRebu}}"
        },
        {
          "Name": "Rebuzeile", "TableName": "REBUZEILEWEBCLIENT", "KeyColumns": "processid, step_id, row_id",
          "ParentDataSet": "Rebukopf", "ParentKeyColumns": "processid, step_id"
        },
        {
          "Name": "Kabukopf", "TableName": "KABUKOPF", "KeyColumns": "processid, step_id",
          "WhereFilter": "{{filterKabu}}"
        },
        {
          "Name": "Kabuzeile", "TableName": "KABUZEILE", "KeyColumns": "processid, step_id, row_id",
          "ParentDataSet": "Kabukopf", "ParentKeyColumns": "processid, step_id"
        },
        {
          "Name": "Rabukopf", "TableName": "RABUKOPF", "KeyColumns": "processid, step_id",
          "WhereFilter": "{{filterRabu}}"
        },
        {
          "Name": "Rabuzeile", "TableName": "RABUZEILE", "KeyColumns": "processid, step_id, row_id",
          "ParentDataSet": "Rabukopf", "ParentKeyColumns": "processid, step_id"
        },
        {
          "Name": "Urlaubantrag", "TableName": "URLAUBANTRAG", "KeyColumns": "processid, step_id",
          "WhereFilter": "{{filterBLO}}"
        },
        {
          "Name": "Bestellkopf", "TableName": "BESTELLKOPF", "KeyColumns": "processid, step_id",
          "WhereFilter": "{{filterEK}}"
        },
        {
          "Name": "Stammdaten", "TableName": "STAMMDATEN", "KeyColumns": "processid, step_id",
          "WhereFilter": "{{filterStamm}}"
        },
        {...}
      ],
      "ReadOptions": {
        "DataSets": [ "Rebukopf", "Rebuzeile", "Kabukopf", "Kabuzeile", "Rabukopf", "Rabuzeile", "Urlaubantrag", "Bestellkopf", "Stammdaten" ]
      },
      "WriteOptions": {
			...
      }
    }
  ]
}


Konfiguration 2 (Finance > SQL):

{
  "HttpApis": [
    {
      "Id": "FinanceApiWeb",
      "ModifiedAtField": "changedAt",
      "DeletedAtField": "deletedAt",
      "QueryArguments": [
        { "FilterMode": "ModifiedAt", "Parameter": "$filter", "Value": "changedAt gt {{lastSyncTime}} and tableNameExternal eq 'REBUKOPFWEBCLIENT'", "FallbackValue": "changedAt gt 0001-01-01T00:00:00Z" },
        { "FilterMode": "DeletedAt", "Parameter": "$filter", "Value": "deletedAt gt {{lastSyncTime}} and tableNameExternal eq 'REBUKOPFWEBCLIENT'", "FallbackValue": "deletedAt gt 0001-01-01T00:00:00Z" }
      ],
      "DataSets": [
        {...}
      ],
      "WriteOptions": {
        ...
      },
      "VariableProviderQuery": "workflowSetup",
      "ApiVersionQuery": "workflowApiVersion",
      "RequiredApiVersion": "1.0"
    }
  ],
  "SqlDatabases": [
  ]
}

Nicht alle Tabellen aus dem definierten Standard werden verwendet

Wie in der Einrichtungsbeschreibung bereits vermerkt ist, wird dafür eine eigene Konfigurationsdatei benötigt.

In dem vorliegenden Beispiel werden die Tabellen REBUKOPF und REBUZEILE verwendet. Die übrigen Tabellen werden innerhalb der "DataSets" entfernt.

{
  "HttpApis": [
  ],
  "SqlDatabases": [
    {
      "Id": "JobRouterDB",
      "Schema": {
			...
      },
      "DataSets": [
        {
          "Name": "Rebukopf", "TableName": "REBUKOPF", "KeyColumns": "processid, step_id",
          "WhereFilter": "{{filterRebu}}"
        },
        {
          "Name": "Rebuzeile", "TableName": "REBUZEILE", "KeyColumns": "processid, step_id, row_id",
          "ParentDataSet": "Rebukopf", "ParentKeyColumns": "processid, step_id"
        },
        {...}
      ],
      "ReadOptions": {
        "DataSets": [ "Rebukopf", "Rebuzeile" ]
      },
      "WriteOptions": {
			...
      }
    }
  ]
}

Export

Mit Ausnahme des Importes über mehrere Tabellen ist keine eigene Konfiguration für den Export erforderlich. Die notwendigen Informationen zur Zieldatenbank ergeben sich aus der Job-Konfiguration (Verbindungsinformationen innerhalb des Zielabschnittes) des MWC.

Getrennte Übertragung der Stammdaten und BK_Status-Änderungen

Konfiguration 1 (BK_Status und Upload):

{
  "HttpApis": [
    {
      "Id": "FinanceApi",
      "ModifiedAtField": "changedAt",
      "DeletedAtField": "deletedAt",
      "QueryArguments": [
        { "FilterMode": "ModifiedAt", "Parameter": "$filter", "Value": "changedAt gt {{lastSyncTime}}", "FallbackValue": "changedAt gt 0001-01-01T00:00:00Z" },
        { "FilterMode": "DeletedAt", "Parameter": "$filter", "Value": "deletedAt gt {{lastSyncTime}}", "FallbackValue": "deletedAt gt 0001-01-01T00:00:00Z" }
      ],
      "DataSets": [
        { "Name": "Rebukopf", "Query": "rebukoepfe", "SupportsDeletedAt": false },
        { "Name": "Rebuzeile", "Query": "rebuzeilen" },
        { "Name": "Kabukopf", "Query": "kabukoepfe", "SupportsDeletedAt": false },
        { "Name": "Kabuzeile", "Query": "kabuzeilen", "SupportsDeletedAt": false },
        { "Name": "Rabukopf", "Query": "rabukoepfe", "SupportsDeletedAt": false },
        { "Name": "Rabuzeile", "Query": "rabuzeilen", "SupportsDeletedAt": false },
        { "Name": "Urlaubantrag", "Query": "personalUrlaube", "SupportsDeletedAt": false },
        { "Name": "Bestellkopf", "Query": "einkaufBestellungen", "SupportsDeletedAt": false },
        { "Name": "Stammdaten", "Query": "stammdatenImporte", "SupportsDeletedAt": false }
      ],
      "WriteOptions": {
        "OutputStringForNullDate": "0001-01-01T00:00:00Z",
        "FieldMappings": [
          { "DataSet": "Rebuzeile", "SourceField": "produktbuchungsgrupp", "TargetField": "produktbuchungsgruppe" },
          { "DataSet": "Urlaubantrag", "SourceField": "personalnr", "TargetField": "personalnummer" },
          { "DataSet": "Rebukopf", "SourceField": "freigabevermerk", "TargetField": "freigabevermerk@odata.mediaEditLink" },
          { "DataSet": "Rebukopf", "SourceField": "pruefvermerk", "TargetField": "pruefvermerk@odata.mediaEditLink" },
          { "DataSet": "Stammdaten", "SourceField": "Dokument_ID", "TargetField": null }
        ]
      },
      "VariableProviderQuery": "workflowSetup",
      "ApiVersionQuery": "workflowApiVersion",
      "RequiredApiVersion": "1.0"
    }
  ],
  "SqlDatabases": [
  ]
}

Konfiguration 2 (Stammdaten):

{
  "HttpApis": [
    {
      "Id": "FinanceApi",
      "ModifiedAtField": "changedAt",
      "DeletedAtField": "deletedAt",
      "QueryArguments": [
        { "FilterMode": "ModifiedAt", "Parameter": "$filter", "Value": "changedAt gt {{lastSyncTime}}", "FallbackValue": "changedAt gt 0001-01-01T00:00:00Z" },
        { "FilterMode": "DeletedAt", "Parameter": "$filter", "Value": "deletedAt gt {{lastSyncTime}}", "FallbackValue": "deletedAt gt 0001-01-01T00:00:00Z" }
      ],
      "DataSets": [
        { "Name": "Abwarten", "Query": "queryBKAbwarten" },
        { "Name": "Adresse_Typ", "Query": "queryBKAdresseTypen" },
        { "Name": "Adresse", "Query": "queryBKAdressen" },
        { "Name": "Anlage_AFA", "Query": "queryBKAnlagenAfa" },
        { "Name": "Anlage", "Query": "queryBKAnlagen" },
        { "Name": "Anzahlungsvorgaenge_D", "Query": "queryBKAnzVorgaengeD" },
        { "Name": "Anzahlungsvorgaenge", "Query": "queryBKAnzVorgaenge" },
        { "Name": "Artikel", "Query": "queryBKArtikel" },
        { "Name": "Artikellieferant", "Query": "queryBKArtikellieferanten" },
        { "Name": "BAS", "Query": "queryBKBAS" },
        { "Name": "Bauleiter", "Query": "queryBKBauleiter" },
        { "Name": "Bestellungen", "Query": "queryBKBestellungen" },
        { "Name": "Buchungsmatrix_Einrichtung", "Query": "queryBKBuchungsmatrix" },
        { "Name": "Debitor", "Query": "queryBKDebitoren" },
        { "Name": "Debitorposten", "Query": "queryBKDebitorposten" },
        { "Name": "Dokument_Rechnung_Lieferschein", "Query": "queryBKDokumenteRechnungen" },
        { "Name": "Einkaufslieferzeile", "Query": "queryBKLieferzeilen" },
        { "Name": "EKListenpreis", "Query": "queryBKListenpreise" },
        { "Name": "Ergebniszuordnung", "Query": "queryBKErgebniszuordnungen" },
        { "Name": "Geraet", "Query": "queryBKGeraete" },
        { "Name": "Geschäftsbuchungsgruppe", "Query": "queryBKGGruppen" },
        { "Name": "Gueltige_Kreditoren_Kostenart", "Query": "queryBKKreditorenKar" },
        { "Name": "Kassenbuch", "Query": "queryBKKassenbuecher" },
        { "Name": "Kostenart", "Query": "queryBKKostenarten" },
        { "Name": "Kostenstelle", "Query": "queryBKKostenstellen" },
        { "Name": "Kostenstellentyp", "Query": "queryBKKostenstellentypen" },
        { "Name": "Kostentraeger", "Query": "queryBKKostentraeger" },
        { "Name": "Kreditor", "Query": "queryBKKreditoren" },
        { "Name": "Kreditorbank", "Query": "queryBKKreditorBanken" },
        { "Name": "KSt_BAS", "Query": "queryBKKStBAS" },
        { "Name": "KSt_Kar", "Query": "queryBKKStKar" },
        { "Name": "KSt_KTr", "Query": "queryBKKStKTr" },
        { "Name": "Lagerfach", "Query": "querybkLagerfaecher" },
        { "Name": "Lagerort", "Query": "queryBKLagerorte" },
        { "Name": "Lieferant", "Query": "queryBKLieferanten" },
        { "Name": "Mandant", "Query": "queryBKMandanten" },
        { "Name": "Mengeneinheit", "Query": "queryBKMengeneinheiten" },
        { "Name": "Mitarbeiter_SUB", "Query": "queryBKMitarbeiterSUB" },
        { "Name": "MWST_Buchungsmatrix_Einr", "Query": "queryBKMWSTBuchungsmatrix" },
        { "Name": "MWST_Geschäftsbuchungsgrp", "Query": "queryBKMWSTGGruppen" },
        { "Name": "MWST_Produktbuchungsgrp", "Query": "queryBKMWSTPGruppen" },
        { "Name": "Niederlassung", "Query": "queryBKNiederlassungen" },
        { "Name": "NU_AdrBeschPosVer", "Query": "queryBKNUAdrBeschPosVer" },
        { "Name": "NU_Adresse_BesPos", "Query": "queryBKNUAdresseBesPos" },
        { "Name": "NU_Bes_uebergreifend", "Query": "queryBKNUBesuebergreifend" },
        { "Name": "Nummernserie", "Query": "queryBKNummernserien" },
        { "Name": "NURechnung", "Query": "queryBKNURechnungen" },
        { "Name": "NUSubNu", "Query": "queryBKNUSubNu" },
        { "Name": "NUTeilvertrag", "Query": "queryBKNUTeilvertraege" },
        { "Name": "PersonalstammBLO", "Query": "queryBKPersonalstammBLO" },
        { "Name": "Produktbuchungsgruppe", "Query": "queryBKPGruppen" },
        { "Name": "Projekt", "Query": "queryBKProjekte" },
        { "Name": "ProjektBeteiligte", "Query": "queryBKProjektBeteiligte" },
        { "Name": "Sachkonto", "Query": "queryBKSachkonten" },
        { "Name": "Sparte", "Query": "queryBKSparten" },
        { "Name": "Währung", "Query": "queryBKWaehrungen" },
        { "Name": "Währungswechselkurs", "Query": "queryBKWaehrungswechselkurse" },
        { "Name": "Zahlungsbedingung", "Query": "queryBKZahlungsbedingungen" },
        { "Name": "ZV_Kopf", "Query": "queryBKZahlungen" },
        { "Name": "ZV_Zeile", "Query": "queryBKZahlungszeilen" }
      ],
      "WriteOptions": {
        "OutputStringForNullDate": "0001-01-01T00:00:00Z",
        "FieldMappings": [
          
        ]
      },
      "VariableProviderQuery": "workflowSetup",
      "ApiVersionQuery": "workflowApiVersion",
      "RequiredApiVersion": "1.0"
    }
  ],
  "SqlDatabases": [
  ]
}