Callbacks
Callbackskript erstellen
Um ein Callbackskript zu erstellen, kann die Vorlage ou.tmpl.IF.settings.callback.example kopiert werden.
- Portalskript
ou.tmpl.IF.settings.callback.exampleöffnen und Inhalt kopieren - Neues Portalskript anlegen mit dem Prefix
ou.cust.IF.settings.callback. - Code aus
ou.tmpl.IF.settings.callback.exampleeinfügen und speichern - Die gewünschte Importregel öffnen und Callbackskript auswählen.
Reihenfolge der Import Callbacks
- Nach dem Import, Datei verschieben
beforeMoveFile- SP Logik (Datei wird verschoben)
onFileMoved
beforeMoveFile boolean?
Callback bevor die Datei verschoben wird.
Die Standard-Logik kann über return false übersprungen werden.
beforeMoveFile: (importFile: importFile, sourceFile: string, targetFile: string, rule: importFileRule) =>
false | undefined;
onFileMoved void
Callback nachdem die Zielmappe erstellt und ein sync() ausgeführt wurde.
onFileMoved: (targetFilePath: string) => void;
onFileMoved: (targetFilePath) => {
util.out(targetFilePath);
};
Reihenfolge der Transform Callbacks
-
Start
startTransformFile- SP Logik (Zurücksetzen der Mappenfelder)
-
Duplikatsprüfung
generateDocKeySid3(nur bei Dateityp 'SID3')beforeDuplicateCheck- SP Logik
onDuplicateChecked
-
Mapping laden
- SP Logik (Statisches Feldmapping aus Regel)
mappingbzw.mappingArchiveImportodermappingSid3
-
Mappentyp erstellen
beforeFileCreate- SP Logik
onFileCreated
-
Mappenfelder belegen
beforeMapping- SP Logik
onFieldsMapped
-
Datei anhängen
overwriteAttachmentsPathSid3(nur bei Dateityp 'SID3')beforeAttachDocumentmappingTargetRegisterArchiveImportbzw.mappingTargetRegisterSid3(nur bei Dateityp 'Easy Archive XML Export' / 'SID3')- SP Logik
onDocumentAttached
-
Workflow starten
determineWorkflowNameSid3(nur bei Dateityp 'SID3')beforeStartWorkflow- SP Logik
onWorkflowStarted
-
Importmappe löschen
-
Dateianhänge löschen (nur bei Dateityp 'EASY Archiv XML Export' und 'SID3')
determineAttachmentsDestinationSubDirectorySid3(nur bei Dateityp 'SID3')- SP Logik
-
Abschluss
Ab Punkt 5, erfolgt im Fehlerfall ein Rollback und die neu erstellte Mappe wird gelöscht.
startTransformFile boolean?
Callback bevor die Transformation gestartet wird.
Die Transformation kann über return false übersprungen werden.
startTransformFile: (importFile: importFile, rule: importFileRule) => boolean;
Transformation für Mappe überspringen
beforeDuplicateCheck: (importFile, rule) => {
if (importFile.fileName === "skip.pdf") {
return false;
}
};
generateDocKeySid3 string?
Callback für den Dateityp 'SID3' zum Generieren eines eindeutigen Dokumentenschlüssels des Ursprungsdokuments (MUSS implementiert werden). Ist dieser Callback nicht implementiert bzw. gibt er keinen Wert zurück, wird ein Fehler geworfen. Der Dokumentenschlüssel wird für den Dublettencheck verwendet.
generateDocKeySid3: (targetFileType: string, mapping: {field: string; value: any}[]) => string | null;
Dokumentenschlüssel zur Verfügung stellen
generateDocKeySid3: (targetFileType, mapping) => {
const docKey = mapping.find((fieldInfo) => fieldInfo.field === "barcode").value;
return docKey;
};
beforeDuplicateCheck boolean?
Callback bevor der Duplikatscheck ausgeführt wird. Wird ein boolischer Wert zurückgegeben, so wird Duplikatsprüfung übersprungen.
beforeDuplicateCheck: (importFile: importFile) => boolean | null;
Duplikatsprüfung überspringen
beforeDuplicateCheck: (importFile) => {
// Kein Duplikat
return false;
};
Duplikat gefunden
beforeDuplicateCheck: (importFile) => {
// Duplikat
return true;
};
onDuplicateChecked boolean?
Callback nach dem der Duplikatscheck ausgeführt wurde. Wird ein boolischer Wert zurückgegeben, so wird Duplikatsprüfung übersprungen.
onDuplicateChecked: (importFile: importFile, duplicateFileIds?: string[]) => boolean;
Duplikatsprüfung überspringen
onDuplicateChecked: (importFile, duplicateFileIds) => {
// Kein Duplikat
return false;
};
Duplikat gefunden
onDuplicateChecked: (importFile, duplicateFileIds) => {
// Duplikat
return true;
};
beforeFileCreate DocFile?
Callback bevor die Zielmappe erstellt wird. Über diesen Callback ist es möglich, eine eigene Mappe zu erstellen und zurückzugeben.
beforeFileCreate: (importFile: importFile, targetFileType: string) => DocFile | null;
Eigene Mappeninstanz erstellen
beforeFileCreate: (importFile, targetFileType) => {
return context.createFile("myCustomFileType");
};
onFileCreated void
Callback nachdem die Zielmappe erstellt und ein sync() ausgeführt wurde.
onFileCreated: (newFile: DocFile) => void;
onFileCreated: (newFile) => {
util.out(newFile.recipient);
};
mapping FieldMapping[]
Callback für Mappenfelder-Mapping für den Dateityp 'Einzeldatei'. Neben dem statischen Mapping der Regel, ist es hier möglich dynamisch Werte zu belegen.
mapping: (options: {
importFile: importFile;
rule: importFileRule;
fileFragements: string[];
}) => FieldMapping[];
Dynamisch Mappenfelder belegen
mapping: (options) => {
const fileName = options.fileFragements[options.fileFragements.length - 1];
const directoryName = options.fileFragements[options.fileFragements.length - 2];
const originalPath = options.importFile.filePath;
/** @type {{field: string, value: string}[]} */
const customMapping = [];
customMapping.push({
field: "recipient",
value: directoryName,
});
return customMapping;
};
mappingArchiveImport FieldMapping[]
Callback für Mappenfelder-Mapping für den Dateityp 'Easy Archive XML Export'. Neben dem statischen Mapping der Regel, ist es hier möglich dynamisch Werte zu belegen. Wird ein Mapping zurückgegeben, so werden die Felder der Zielmappe entsprechend befüllt. Felder, die bereits über das statische Mapping der Regel gesetzt wurden, werden hierbei überschrieben. Wird null zurückgegeben bzw. der Callback nicht implementiert, so wird versucht, die Feldwerte der Ursprungsmappe gleichnamigen Feldern in der Zielmappe zuzuweisen. Existiert kein gleichnamiges Feld, wird ein Fehler geworfen. Bereits über das statische Mapping der Regel gesetzte Werte werden nicht überschrieben.
mapping: (options: {
importFile: importFile;
rule: importFileRule;
fileFragements: string[];
oldDocId: string;
oldFieldMapping: FieldMapping[];
}) => FieldMapping[];
Dynamisch Mappenfelder belegen
mapping: (options) => {
const fileName = options.fileFragements[options.fileFragements.length - 1];
const directoryName = options.fileFragements[options.fileFragements.length - 2];
const originalPath = options.importFile.filePath;
const oldDocId = options.oldDocId;
const mapping = {
oldField1: "newField1",
oldField2: "newField2",
};
/** @type {{field: string, value: any}[]} */
const newFieldMapping = [];
options.oldFieldMapping.forEach((oldMapping) => {
const newField = mapping[oldMapping.field];
if (newField) {
newFieldMapping.push({
field: newField,
value: oldMapping.value
});
}
});
return newFieldMapping;
};
mappingSid3 Object
Callback für Mappenfelder-Mapping für den Dateityp 'SID3' sowie Definition des Zielmappentyps (MUSS implementiert werden). Wird ein Objekt zurückgegeben, in welchem sowohl 'fileType' als auch 'fieldMapping' gesetzt sind, so wird eine neue Mappe des angegebenen Mappentyps erstellt und die Felder entsprechend befüllt. Wird null zurückgegeben, der Callback nicht implementiert oder fehlt im Rückgabeobjekt die Dateitypangabe, so wird ein Fehler geworfen. Wird ein Objekt zurückgegeben, in welchem 'fieldMapping' null ist, so wird versucht, die Feldwerte der Ursprungsmappe gleichnamigen Feldern in der Zielmappe zuzuweisen. Existiert kein gleichnamiges Feld, wird ein Fehler geworfen.
mappingSid3: (options: {
importFile: importFile;
rule: importFileRule;
fileFragements: string[];
oldFieldMapping: FieldMapping[];
}) => {fileType:string; fieldMapping: FieldMapping[] | null};
Zielmappentyp und Feldbelegung festlegen
mappingSid3: (options) => {
const fileName = options.fileFragements[options.fileFragements.length - 1];
const directoryName = options.fileFragements[options.fileFragements.length - 2];
const originalPath = options.importFile.filePath;
const mapping = {
"oldField1": "newField1",
"oldField2": "newField2",
};
const newFieldMapping = [];
options.oldFieldMapping.forEach((oldMapping) => {
const newField = mapping[oldMapping.field];
if (newField) {
newFieldMapping.push({
field: newField,
value: oldMapping.value
});
}
});
return {
fileType: "ptpInvoice",
fieldMapping: newFieldMapping,
};
};
beforeMapping boolean
Callback bevor die Mappenfelder befüllt werden.
Das Mapping kann über return false übersprungen werden.
beforeMapping: (newFile: DocFile, fieldMappings: { field: string; value: string }[]) => boolean;
Mapping überspringen
beforeMapping: (newFile, fieldMappings) => {
return false;
};
onFieldsMapped void
Callback nach dem der Mappenfelder befüllt wurden. Nach diesem Callback wird ein sync() ausgeführt, somit ist ein sync() nicht notwendig
onFieldsMapped: (newFile: DocFile) => void;
Mapping überspringen
onFieldsMapped: (newFile) => {
newFile.ufField = "someValue";
};
overwriteAttachmentsPathSid3 Array
Callback für den Dateityp 'SID3' zum Überschreiben der Anhangspfade. Wird null zurückgegeben bzw. der Callback nicht implementiert, so werden die ursprünglichen Anhangspfade verwendet. Ist ein bestimmter Dokumentenanhang nicht im Rückgabe-Array enthalten, so wird dieser nicht an die erstellte Mappe angehängt.
overwriteAttachmentsPathSid3: (attachments: { fileName: string; filePath: string }[]) => { fileName: string; filePath: string }[] | null;
Anhangspfade überschreiben
overwriteAttachmentsPathSid3: (attachments) => {
const newAttachments = [];
attachments.forEach((attachment) => {
newAttachments.push({
fileName: attachment.fileName,
filePath: "D:\\tmp\\newPath\\" + attachment.fileName,
});
});
return newAttachments;
};
beforeAttachDocument boolean
Callback bevor die Datei an die neue Mappe angefügt wird.
Das Anfügen der Datei kann über return false übersprungen werden.
beforeAttachDocument: (newFile: DocFile, importFile: importFile, rule: importFileRule) => boolean;
Anfügen der Datei überspringen
beforeAttachDocument: (newFile, importFile, rule) => {
return false;
};
mappingTargetRegisterArchiveImport Array
Callback für TargetRegister-Mapping für den Dateityp 'Easy Archive XML Export'. Hier kann für jeden Mappenanhang das über die Importregel festgelegte Zielregister überschrieben werden. Wird null zurückgegeben bzw. der Callback nicht implementiert, so wird das über die Importregel festgelegte Zielregister verwendet. Wird im Rückgabe-Array für einen Anhang das Zielregister auf null gesetzt, so wird dieser Anhang nicht an die erstellte Mappe angehängt.
mappingTargetRegisterArchiveImport: (documentFiles: string[]) => {fileName: string; targetRegister: string}[];
Das Zielregister dynamisch festlegen.
mappingTargetRegisterArchiveImport(documentFiles) {
const mapping = {
fileABC: "documents",
fileXYZ: "attachments",
};
/** @type {{fileName: string, targetRegister: string}[]} */
const targetRegisterMapping = [];
documentFiles.forEach((file) => {
const register = mapping[file];
if (register) {
targetRegisterMapping.push({
fileName: file,
targetRegister: register
});
}
});
return targetRegisterMapping;
};
mappingTargetRegisterSid3 Array
Callback für TargetRegister-Mapping für den Dateityp 'SID3' (MUSS implementiert werden). Hier muss jedem Mappenanhang das Zielregister zugeordnet werden. Wird null zurückgegeben bzw. der Callback nicht implementiert, so wird ein Fehler geworfen. Wird im Rückgabe-Array für einen Anhang das Zielregister auf null gesetzt, so wird dieser Anhang nicht an die erstellte Mappe angehängt.
mappingTargetRegisterSid3: (documentFiles: string[], newFile: DocFile) => {fileName: string; targetRegister: string}[];
Das Zielregister dynamisch festlegen
mappingTargetRegisterSid3: (documentFiles, newFile) => {
const mapping = {
ptpInvoice: {
fileABC: "documents",
fileXYZ: "attachments",
},
...
};
const targetRegisterMapping = [];
documentFiles.forEach((file) => {
const register = mapping[newFile.getAutoText("fileType")][file];
if (register) {
targetRegisterMapping.push({
fileName: file,
targetRegister: register,
});
} else {
targetRegisterMapping.push({
fileName: file,
targetRegister: "documents",
});
}
});
return targetRegisterMapping;
};
onDocumentAttached void
Callback nach dem die Datei an die neue Mappe angefügt wurde. Nach diesem Callback wird ein sync() ausgeführt, somit ist ein sync() nicht notwendig.
onDocumentAttached: (newFile: DocFile) => void;
onDocumentAttached: (newFile) => {};
determineWorkflowNameSid3 string
Callback für den Dateityp 'SID3' zur Angabe des Workflows, der gestartet werden soll. Wird null zurückgegeben oder der Callback nicht implementiert, so wird für die Mappe kein Workflow gestartet.
determineWorkflowNameSid3: (fileType: string) => string | null;
Workflow festlegen
determineWorkflowNameSid3: (fileType) => {
const mapping = {
ptpInvoice: "ptpInvoice_V1-1",
// ...
};
return mapping[fileType] || null;
};
beforeStartWorkflow boolean
Callback bevor der Workflow gestartet wird.
Das Starten des Workflows kann über return false übersprungen werden.
beforeStartWorkflow: (newFile: DocFile, workflowName: string) => boolean;
beforeStartWorkflow: (newFile, workflowName) => {
if (workflowName === "nope") {
return false;
}
};
onWorkflowStarted void
Callback nach dem der Workflow gestartet wurde.
onWorkflowStarted: (newFile: DocFile) => void;
onWorkflowStarted: (newFile) => {};
beforeDeleteImportFile boolean
Callback bevor die Importmappe gelöscht wird.
Das Löschen kann über return false übersprungen werden.
beforeDeleteImportFile: (importFile: importFile) => boolean;
Mappe nicht löschen
beforeDeleteImportFile: (importFile) => {
return false;
};
onImportFileDeleted void
Callback nach dem die Importmappe gelöscht wurde.
onImportFileDeleted: () => void;
onImportFileDeleted: () => {};
determineAttachmentsDestinationSubDirectorySid3 Array
Callback für den Dateityp 'SID3' zur Angabe des Unterverzeichnisses in welches die Dokumentanhänge innerhalb des Zielverzeichnisses verschoben werden sollen. Wird nur aufgerufen, wenn an der Importregelmappe ausgewählt wurde, dass Dateien nach dem Import verschoben werden sollen. Wird null zurückgegeben bzw. der Callback nicht implementiert, so werden die Dokumentanhänge direkt in das angegebene Zielverzeichnis verschoben. Anhänge, die im zurückgegebenen Array nicht enthalten sind, werden nicht verschoben.
determineAttachmentsDestinationSubDirectorySid3: (attachments: { fileName: string; filePath: string }[]) => { filePath: string; destinationSubDirectory: string }[] | null;
Angabe des Unterverzeichnisses pro Mappe
determineAttachmentsDestinationSubDirectorySid3: (attachments) => {
const destinationMapping = [];
attachments.forEach((attachment) => {
destinationMapping.push({
filePath: attachment.filePath,
destinationSubDirectory: "attachments",
});
});
return destinationMapping;
};
onTransformFileFinished void
Callback nach dem die Transformation abgeschlossen wurde. Dieser Callback wird auch im Fehlerfall getriggert.
onTransformFileFinished: () => void;
onTransformFileFinished: () => {};