Zum Inhalt springen

Stammdaten-Import

Ein Stammdaten-Import ist ein wiederkehrender Hangfire-Job. Er liest die Stammdaten aus einer Quelle (CSV-Datei, ODBC- oder SQL-Abfrage, Schnittstelle eines ERP), wandelt jede Zeile mit einem Mapping-Skript in einen Datensatz um und gleicht das Ergebnis mit den bestehenden Stammdaten ab.

Welche Quellen es gibt, hängt vom ERP-Plugin ab. Die generischen Plugins lesen CSV-Dateien, ODBC-Datenquellen und SQL-Server-Datenbanken. Diese Seite beschreibt vor allem den Import aus CSV-Dateien.

Jeder Import ist ein Eintrag in der Tabelle conf.IrRecurringJobs. Eingerichtet wird er bei der Inbetriebnahme durch die enio AG oder einen Partner.

FeldBedeutung
HangfireIdEindeutige Kennung des Jobs, zum Beispiel ch.invoicer.mstr.suppliers
DescriptionBeschreibung, die unter Administration > Job-Ausführung erscheint
EnabledOb der Job aktiv ist
CronExpressionWann der Job läuft, zum Beispiel 0 6 * * * für täglich um 6 Uhr
TimeZoneIdZeitzone für die Cron-Expression
ClassIdentifierKlasse, die den Import ausführt, zum Beispiel enio.erp.Plugin.FromCsv.Import.Import_Supplier_From_File
MethodNameMethode der Klasse, für Importe in der Regel DoImport
MethodArgumentIdentifierTyp der Konfiguration, zum Beispiel enio.erp.Plugin.FromCsv.Import.ImportFromFileBaseArgument
ConfigurationKonfiguration des Imports als JSON (siehe unten)
ObjectMappingCodeDas Mapping-Skript (siehe unten)
{
"SourceFilePath": "\\\\<server>\\export\\lieferanten.csv",
"SourceFileEncoding": "utf-8",
"Separator": ";",
"HasHeaderRow": true,
"OuColumnIndex": 0,
"Source": "ERP",
"MappingKeys": ["IrOrganizationUnitId", "Number"],
"DeleteNotDeliveredRecords": true,
"TraceLevel": "Default"
}
EinstellungStandardBedeutung
SourceFilePathPfad zur Datei. Möglich sind ein Dateipfad, eine Freigabe im Netzwerk oder eine Adresse mit http.
Host, Port, Username, PasswordFür Dateien auf einem SFTP-Server: Host beginnt mit sftp://.
SourceFileEncodingStandard des ServersZeichensatz, zum Beispiel utf-8, utf-8bom oder windows-1252
Separator;Trennzeichen zwischen den Spalten
HasHeaderRowfalseOb die erste Zeile Spaltenüberschriften enthält. Sie wird dann übersprungen.
CsvHelperModeRFC4180Umgang mit Anführungszeichen: RFC4180, Escape oder NoEscape
IgnoreEmptyFilefalseLeere Datei ohne Fehler überspringen
IgnoreBadDatafalseFehlerhaft formatierte Zeilen tolerieren
OnlyTakeNewestFileOfFolderfalseSourceFilePath ist ein Ordner. Der Import nimmt die neueste Datei darin.
FileNameIncludesTimeStampfalseDer Dateiname enthält ein Datum (Format in FileNameIncludesTimeStampFormat, Standard yyyyMMdd).
OuColumnIndex0Spalte (ab 0 gezählt) mit der externen Kennung des Geschäftsbereichs
UseOUIdFeste externe Kennung des Geschäftsbereichs für alle Zeilen. Ersetzt OuColumnIndex.
SourceExternalQuelle der Datensätze, siehe Stammdaten
MappingKeysFelder, an denen der Import bestehende Datensätze erkennt, siehe Stammdaten
IgnorePropertiesFelder, die der Import bei bestehenden Datensätzen nie überschreibt, zum Beispiel weil sie im invoiceR gepflegt werden
DeleteNotDeliveredRecordstrueNicht mehr gelieferte Datensätze als gelöscht markieren
ReactivateDeletedRecordsfalseGelöschte Datensätze wieder aktivieren, wenn sie erneut geliefert werden
MappingFilePath, MappingFileEncodingMapping-Skript aus einer Datei oder Adresse laden statt aus ObjectMappingCode
BatchSize999999Nach wie vielen Zeilen zwischengespeichert wird
TraceLevelDefaultMit Verbose schreibt der Job jede Zeile ins Protokoll.

Das Mapping-Skript ist C#-Code. Es wird für jede Zeile ausgeführt und füllt den neuen Datensatz. Im Skript stehen zur Verfügung:

VariableInhalt
wordsDie Spalten der aktuellen Zeile als Text-Array, ab 0 gezählt
entityFromImportDer neue Datensatz, den das Skript füllt. Geschäftsbereich und Mandant sind bereits gesetzt.
cultureInfoSchweizer Ländereinstellung, zum Beispiel zum Umwandeln von Zahlen und Daten
importDynamicBei Importen aus Datenbanken die Zeile als Objekt mit den Spaltennamen

Das Skript muss den Datensatz mit return zurückgeben. Gibt es null zurück, überspringt der Import die Zeile.

Beispiel für Lieferanten aus einer CSV-Datei im Format unten:

entityFromImport.Number = words[1];
entityFromImport.Name = words[2];
entityFromImport.Address1 = words[3];
entityFromImport.Zip = words[6];
entityFromImport.City = words[7];
entityFromImport.UID = words[8];
entityFromImport.Country = words[11];
entityFromImport.DefaultTermOfPayment = words[12];
entityFromImport.DefaultVatCode = words[13];
if (string.IsNullOrWhiteSpace(entityFromImport.Number))
return null;
return entityFromImport;

Beispiel für Zahlungsmethoden aus einer Datenbank-Abfrage, bei dem das Skript den Typ aus der IBAN ableitet:

using System;
using System.Linq;
using web_manager.Enio;
entityFromImport.Number = importDynamic.LaufNummer.ToString();
entityFromImport.SupplierNumber = importDynamic.KreditorNummer.ToString();
entityFromImport.IBAN = importDynamic.IBAN.ToString().Replace(" ", "");
entityFromImport.Account = entityFromImport.IBAN;
entityFromImport.Country = importDynamic.LandCode.ToString();
entityFromImport.Type = string.IsNullOrWhiteSpace(entityFromImport.IBAN)
? PaymentMethodType.BankAccount
: PaymentMethodType.BankIBAN;
return entityFromImport;

Liefert euer ERP die Stammdaten als CSV-Dateien, empfehlen wir die folgenden Formate. Die Reihenfolge der Spalten ist frei, sie wird im Mapping-Skript zugeordnet. Die erste Spalte enthält jeweils die externe Kennung des Geschäftsbereichs (Mandant im ERP).

SpalteTypBemerkungPflicht
MandantTextExterne Kennung des Geschäftsbereichsja
NumberTextEindeutige Lieferantennummerja
NameTextja
Address1TextAdresszeile 1nein
Address2TextAdresszeile 2nein
Address3TextAdresszeile 3nein
ZipTextPostleitzahlnein
CityTextOrtnein
UIDTextUnternehmens-Identifikationsnummernein
EmailTextnein
PhoneTextTelefonnummernein
CountryTextISO-Länderkennung (CH, DE, LI, …)nein
DefaultTermOfPaymentTextStandard-Zahlungsbedingung (Nummer aus den Zahlungsbedingungen)nein
DefaultVatCodeTextStandard-MwSt-Code (Code aus den MwSt-Codes)nein
SpalteTypBemerkungPflicht
MandantTextExterne Kennung des Geschäftsbereichsja
NumberTextEindeutige Nummer der Zahlungsmethodeja
SupplierNumberTextLieferantennummer aus den Lieferantenja
NameTextName der Zahlungsmethode, zum Beispiel der Bankja
AddressTextAdressenein
ZipTextPostleitzahlnein
CityTextOrtnein
CountryTextISO-Länderkennungnein
AccountTextKontonummer bei Postverbindungbei Postverbindung
IBANTextIBANbei Bankverbindung mit IBAN
BICCodeTextBIC nach ISO 9362nein
SwiftNumberTextSWIFTnein
SpalteTypBemerkungPflicht
MandantTextExterne Kennung des Geschäftsbereichsja
NumberTextEindeutige Kontonummerja
DescriptionTextBeschreibungnein
VATCodeTextStandard-MwSt-Code für das Kontonein
IsBalanceSheetAccountJa/Nein1 = Bilanzkontonein
SpalteTypBemerkungPflicht
MandantTextExterne Kennung des Geschäftsbereichsja
NumberTextEindeutige Kostenstellennummerja
DescriptionTextBeschreibungnein
SpalteTypBemerkungPflicht
MandantTextExterne Kennung des Geschäftsbereichsja
AccountNumberTextKontonummer aus den Kontenja
CostCenterNumberTextKostenstellennummer aus den Kostenstellenja
SpalteTypFormatBemerkungPflicht
MandantTextExterne Kennung des Geschäftsbereichsja
NumberTextEindeutige Nummer der Zahlungsbedingungja
DescriptionTextBeschreibungnein
NetPeriodZahl0Zahlungsfrist netto in Tagenja
DiscountPeriod1Zahl0Frist für Skonto 1 in Tagennein
DiscountPercent1Zahl0.00Skonto 1 in Prozentnein
DiscountPeriod2Zahl0Frist für Skonto 2 in Tagennein
DiscountPercent2Zahl0.00Skonto 2 in Prozentnein
SpalteTypFormatBemerkungPflicht
MandantTextExterne Kennung des Geschäftsbereichsja
CodeTextMwSt-Codeja
RateZahl0.00MwSt-Satzja
DescriptionTextBeschreibungnein
CountryCodeTextISO-Länderkennungnein
SpalteTypBemerkungPflicht
MandantTextExterne Kennung des Geschäftsbereichsja
NumberTextEindeutige Projektnummerja
NameTextBezeichnungja