Zum Hauptinhalt springen

Stammdaten-Synchronisierung

Das Modul ou.sp.dynamics.DynamicsBcConnectorMasterData stellt das masterDataMapping und das EntityName-Enum bereit, mit denen Stammdaten aus BC in die lokale Datenbank synchronisiert werden können.

Die eigentliche Synchronisierung erfolgt über die Methoden processEntities und processSingleEntity der DynamicsBcConnector-Klasse.

EntityName

Das Enum benennt alle unterstützten Stammdatenkategorien:

WertBeschreibung
EntityName.VendorLieferanten (brz_firminformation)
EntityName.VendorAccountBankverbindungen (brz_firmbankinformation)
EntityName.VatCodeSteuerschlüssel (brz_accounting_vatrate)
EntityName.PaymentTermZahlungsbedingungen (brz_firmpaymentpractise)
EntityName.ImpersonalAccountSachkonten (brz_accounting_glaccount)
EntityName.CostCenterKostenstellen (brz_responsibilityCenter)
EntityName.CostUnitKostenträger / Dimensionswerte (brz_NAVDimensionValues)

processEntities

Synchronisiert alle Datensätze einer Entitätskategorie für einen Empfänger vollständig.

Siehe DynamicsBcConnector#processEntities in der API-Referenz.

Beispiel

context.enableModules();

const { DynamicsBcConnector } = require("ou.sp.dynamics.DynamicsBcConnector");
const { EntityName } = require("ou.sp.dynamics.DynamicsBcConnectorMasterData");
const { getDatabaseConnectionAndProviderOrThrow } = require("ou.sp.library.dbConnections");

const connector = new DynamicsBcConnector({
tenantId: util.getEnvironment("BC_TENANT_ID"),
environment: util.getEnvironment("BC_ENVIRONMENT"),
clientId: util.getEnvironment("BC_CLIENT_ID"),
clientSecret: util.getEnvironment("BC_CLIENT_SECRET"),
});

const dbConfig = getDatabaseConnectionAndProviderOrThrow("ptpData");
const companyId = "987e3574-6a7b-4a97-b0c9-77740fb3f9bb";

// Lieferanten vollständig neu synchronisieren
const count = connector.processEntities({
companyId,
entityName: EntityName.Vendor,
recipient: "R0100",
dbConfig,
clear: true,
});

processSingleEntity

Synchronisiert einen einzelnen Datensatz anhand seiner BC-ID.

Siehe DynamicsBcConnector#processSingleEntity in der API-Referenz.

Beispiel

// Einzelnen Lieferanten aktualisieren
const updated = connector.processSingleEntity({
companyId,
entityName: EntityName.Vendor,
recipient: "R0100",
dbConfig,
id: "V001",
});

Beispiel mit eigenem Mapping

Das Standard-Mapping kann überschrieben werden, um z. B. zusätzliche Felder abzurufen oder die Transformation anzupassen:

const { masterDataMapping } = require("ou.sp.dynamics.DynamicsBcConnectorMasterData");

const customMapping = {
...masterDataMapping,
[EntityName.Vendor]: {
...masterDataMapping[EntityName.Vendor],
fields: [...masterDataMapping[EntityName.Vendor].fields, "Phone_No"],
mappingFunction: (item, recipient) => ({
...masterDataMapping[EntityName.Vendor].mappingFunction(item, recipient),
phoneNumber: item.Phone_No,
}),
},
};

connector.processEntities({
companyId,
entityName: EntityName.Vendor,
recipient: "R0100",
dbConfig,
clear: true,
mapping: customMapping,
});

Mapping-Details

Das masterDataMapping legt für jede Entität fest:

  • odataEntity — BC-OData-Entitätsname
  • idField — Primärschlüsselfeld in BC
  • fields — abzurufende Felder
  • defaultFilter — optionaler OData-Standardfilter (z. B. "VAT_Bus_Posting_Group eq 'INLAND'" für Steuerschlüssel oder "Dimension_Code eq 'ABTEILUNG'" für Kostenträger)
  • mappingFunction — transformiert BC-Felder in die Zieldatenbankstruktur
  • clear / clearPartial — löschen vor dem vollständigen bzw. partiellen Neuladen
  • insert — Bulk-Insert der transformierten Zeilen
Zahlungsbedingungen

BC-Datumsformeln wie "30D" (30 Tage) oder "1M" (1 Monat = 30 Tage) werden automatisch in Tageszahlen umgerechnet. Formeln wie "CM" (Monatsende), die sich nicht als feste Tageszahl ausdrücken lassen, werden als undefined gespeichert.