Durchsuchbare Dokumentation aufrufen

Zurück zur Dokumentationsübersicht

Beispiel eines Aktiven Ordners - unwrap-attachments-folder

Um einen Anhang aus einer E-Mail zu kopieren und erneut mit der E-Mail zu verknüpfen, benötigen Sie einen Aktiven Ordner des Typs Skript ausführen. Ebenso benötigen Sie ein Skript, das der Aktive Ordner aufruft.

Einstellungen der Konfiguration Skript ausführen

Der Ordner im Feld Ordner ist derjenige, in dem sich die E-Mails befinden, die das System verarbeitet. Verwenden Sie als Skript etwa das unten aufgeführte Beispielskript.

Parameter hinterlegen


Hinterlegen Sie zusätzlich folgende Parameter.

attach

Wahlmöglichkeit zwischen relation (Verknüpfung zur E-Mail hergestellt) und Metadatum mit der ID der E-Mail (etwa ~ag_orig_mail).

Dient der Nachvollziehbarkeit, woher der Anhang stammt.

doneFlag

Markiert ein Metadatum mit der Angabe, ob das System das Objekt bereits abgelegt hat.


Beispiel einer Eingabe
doneFlag: ac_mail_already_processed


Wert des Metadatums nach erfolgreichem Ablegen
ac_mail_already_processed: true

mailTarget

Definiert den Ordner, in den das System die E-Mails nach Verarbeitung archiviert.

regex

Definiert einen RegEx-Ausdruck, der beschreibt, wie der Dateiname des Anhanges aussieht, damit das System den Anhang verwendet. Bei Rechnungen sind das in der Regel PDF-Dateien.


Beispiel einer Eingabe
regex: [\.]pdf$

Interne Schreibweise durch das System
/[\.]pdf$/i

target

Definiert den Zielordner, in den das System die Anhänge legt.

unzip

Steuert, ob das System ein angehängtes ZIP-Archiv entpackt.


Beispiel einer Eingabe
unzip: true

Beispielskript


Der Aktive Ordner ruft folgendes Skript auf (Beispiel):

/* global folder, parameters */

let transaction = require('common/transaction');
let objects = require('common/objects');
let beans = require('common/beans');
let metadata = require('common/metadata');

let PackageInputStream = Packages.agorum.roi.common.utils.Packager.PackageInputStream;
let Charset = java.nio.charset.Charset;

/**
// Test, damit kann das Skript ohne den Aktiven Ordner getestet werden kann
// Sie müssen die Parameter auf Ihr System einstellen
let parameters = {
  regex: '[\.](pdf|DOC|docx)$',
  target: '/agorum/roi/Files/Demo/Verwaltung/DocForm/Eingang',
  mailTarget: '/agorum/roi/Files/Demo/Verwaltung/Mailarchive',
  attach: 'relation',
  unzip: 'true',
  doneFlag: 'ac_mail_already_processed'
};
let folder = objects.find('/agorum/roi/Files/Demo/Verwaltung/Rechnungen');
/**/


let target = objects.find(parameters.target);
let mailTarget = objects.find(parameters.mailTarget);
let unzip = (parameters.unzip || '').toLowerCase() === 'true';
let regex = parameters.regex || '.*';
let doneFlag = parameters.doneFlag;

if (!doneFlag) throw new Error('Parameter doneFlag is mandatory');

let forEachEntry = (source, is, callback) => {
  let pis = new PackageInputStream(is, Charset.forName('Cp850'));

  try {
    let entry;
    while (!!(entry = pis.nextEntry)) {      
      if (callback(source, entry.name, entry.isDirectory() ? null : pis) === false) {
        // stop iteration if callback returns false
        return false;
      }
    }
  }
  finally {
    //pis.closePackage();
  }
};

let handle = (source, name, stream, object) => {
  if (!stream && !object) {
    // skip folders
    return;
  }

  name = name.split('/').pop();

  if (unzip && /[\.]zip$/i.test(name)) {
    forEachEntry(source, object ? object.contentStream : stream, handle);
  }
  else if (RegExp(regex, 'i').test(name)) {
    // no regular expression or regular expression matches the name
    let created;

    if (object) {
      // copy attachments directly
      created = objects.copy(object, target);
    }
    else {
      // extract from zip
      created = objects.create('file', {
        name: name,
        target: target,
        content: stream
      });
    }

    // add relation back to the original mail
    if (parameters.attach === 'relation') {
      created.setAttachments([ source ]);
    }
    else if (parameters.attach) {
      beans.set(created, parameters.attach, source.ID);
    }
  }
};

function unwrap(object) {
  (object.mailAttachments || [])
  .forEach(attachment => handle(object, attachment.name, null, attachment));

  // move mail
  objects.remove(object);
  objects.add(object, mailTarget);
  
  // Set marker to ignore on next run, only inpath search is not enough, it is maybe to slow
  let md = {};
  md[doneFlag] = 'true';
  metadata(md).save(object);
}

objects
.query('inpath:' + folder.ID + ' ancestors:mailobject NOT ismailattachment:true NOT ' + doneFlag + ':true')
.forEach(item => transaction(() => unwrap(item)));