    //@include lib_Class.js
    //@include lib_sol.common.ObjectFormatter.js
    //@include lib_sol.common.ix.FunctionBase.js
    //@include lib_sol.common.StringUtils.js

    /**
     * Base class to generate filing structures by templates
     *
     * A sub class must implement the methods getTemplateId
     *
     * @author JHR, ELO Digital Office GmbH
     * @version 1.01.001
     *
     * @eloix
     * @requires  sol.common.JsonUtils
     * @requires  sol.common.ix.RfUtils
     * @requires  sol.common.WfUtils
     * @requires  sol.common.ix.FunctionBase
     *
     */

    sol.define("sol.contact.ix.functions.GenerateFilingStruct", {
      extend: "sol.common.ix.FunctionBase",

      /**
       * @cfg {String} objId
       * Object ID of destination object
       */

      process: function () {
        var me = this,
            filingstructureTemplate, filingstructureTemplateId,
            filingstructure, date;

        me.readObject();

        filingstructureTemplateId = me.getTemplateId();

        if (filingstructureTemplateId) {
          date = new Date();

          filingstructureTemplate = sol.create("sol.common.Template", {});
          filingstructureTemplate.load(filingstructureTemplateId);
          filingstructure = filingstructureTemplate.apply({
            sord: me.templateSord,
            date: {
              date: date.getDate(),
              day: date.getDay(),
              fullYear: date.getFullYear(),
              hours: date.getHours(),
              milliseconds: date.getMilliseconds(),
              minutes: date.getMinutes(),
              month: date.getMonth(),
              seconds: date.getSeconds(),
              UTCdate: date.getUTCDate(),
              UTCday: date.getUTCDay(),
              UTCfullYear: date.getUTCFullYear(),
              UTChours: date.getUTCHours(),
              UTCmilliseconds: date.getUTCMilliseconds(),
              UTCminutes: date.getUTCMinutes(),
              UTCmonth: date.getUTCMonth(),
              UTCseconds: date.getUTCSeconds()
            }
          });
          if (filingstructure) {
            me.moveToPath(filingstructure);
          }
          return JSON.stringify({ filingstructure: filingstructure });
        }
        return JSON.stringify({ filingstructure: "" });
      },

      /**
       * @private
       */
      readObject: function () {
        var me = this,
            templateSordFormatter;

        if (!me.objId) {
          throw "Object ID is empty";
        }
        me.sord = ixConnect.ix().checkoutSord(me.objId, SordC.mbAll, LockC.NO);
        templateSordFormatter = sol.create("sol.common.ObjectFormatter.TemplateSord", { data: me.sord, config: { sordKeys: ["name"], objKeys: [], mapKeys: [] } });
        me.templateSord = templateSordFormatter.build();
      },

      /**
       * @abstract
       * Must return the Object ID of the template.
       */
      getTemplateId: function () {
        throw "Can't call abstract method 'getTemplateId()'";
      },

      /**
       * @private
       * Reads the template name from generator field and determinates the object ID of the template.
       * @param {de.elo.ix.client.Sord} sord
       * @param {String} templateNameField
       * @param {String} templateFolderId
       * @return {String}
       */
      getFilingStructTemplateId: function (sord, templateNameField, templateFolderId) {
        var templateName;
        if (!templateNameField) {
          return null;
        }
        templateName = sol.common.SordUtils.getObjKeyValue(sord, templateNameField);
        if (!templateName) {
          return null;
        }
        if (!templateFolderId) {
          return null;
        }
        return sol.common.RepoUtils.getObjIdFromRelativePath(templateFolderId, "/" + templateName);
      },

      /**
       * @private
       * Moves the element to a new path location.
       * @param {String} filingstructure
       */
      moveToPath: function (filingstructure) {
        var me = this,
            objId = me.objId,
            sord = ixConnect.ix().checkoutSord(objId, EditInfoC.mbSord, LockC.NO).sord,
            regId, oldParentId, sordType, pathSord, pathSordParent, pathReg, lastPos;

        sordType = 3;
        pathSord = sol.common.RepoUtils.getPathFromObjId(sord.id, { separator: "¶" });
        lastPos = pathSord.lastIndexOf("¶");
        pathSordParent = pathSord.slice(0, lastPos);
        if (!sol.common.StringUtils.isBlank(filingstructure)) {
          pathSord = pathSordParent + "¶" + filingstructure + "¶" + sord.name;
          pathReg = pathSordParent + "¶" + filingstructure;
        } else {
          pathSord = pathSordParent + "¶" + sord.name;
          pathReg = pathSordParent;
        }
        regId = sol.common.RepoUtils.preparePath(pathReg, { sordType: sordType });

        if (!regId) {
          me.logger.error(["could not resolve pathReg: {0}", pathReg]);
          throw "could not resolve pathReg: " + pathReg;
        }
        oldParentId = ixConnect.ix().checkoutSord(objId, EditInfoC.mbOnlyId, LockC.NO).sord.parentId;
        me.logger.info(["move sord: ({0}) from -> ({1}) to ({2})", objId, oldParentId, regId]);
        ixConnectAdmin.ix().refSord(oldParentId, regId, objId, -1);
      }
    });