    importPackage(Packages.de.elo.ix.client);

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

    var logger = sol.create("sol.Logger", { scope: "sol.common.ix.functions.MultiSet" }); // eslint-disable-line one-var

    /**
     * Edits existing objects by changing the mask or setting different values pro object.
     *
     * # As workflow node
     *
     * The configuration is defined in the following way:
     *
     *     {
     *         "objEntries: [
     *           { "objId" : 4711, "entries" : [ ... ]}, // The "entries" are configurated similar as in the "RF_sol_function_Set" RF.
     *           { "objId" : 4713, "entries" : [ ... ]},
     *              .....
     *           { "objId" : 4720, "entries" : [ ... ]}
     *         ]
     *     }
     *
     * Following configuration should be applied to the comments field for a mask and field update:
     *
     * ## Example
     *   {
     *     "objEntries": [{
     *       "objId": 4711
     *       "entries": [{
     *         "type": "MASK",        // changes the mask of the sord, if defined more than once, the first one will be used
     *         "value": "Basic Entry"
     *       }, {
     *         "type": "SORD",
     *         "key": "name",
     *         "value": "Contract {{sord.objKeys.CONTRACT_NAME}} - {{count 'MY_CONTRACT_COUNTER'}}",
     *         "useTemplating": true
     *       }, {
     *         "type": "GRP",
     *         "key": "CONTRACT_STATUS",
     *         "value": "D",
     *         "useDynKwl": true,
     *         "dynKwlCfg": {
     *           "filterColumn": 0,
     *           "returnColumn": 2
     *         },
     *         "onlyIfEmpty": true
     *       }, {
     *         "type": "MAP",
     *         "key": "USER",
     *         "value": "Bill Gates",
     *       }, {
     *         "type": "WFMAP",
     *         "key": "USER",
     *         "value": "Steve Jobs"
     *       }]
     *     }]
     *   }
     *
     * Following configuration should be applied to the comments field and will multiset a value from the fields KWL starting with '3'
     *
     *     {
     *       "entries": [{
     *         "type": "GRP",
     *         "key": "INVOICE_STATUS",
     *         "value": "3",
     *         "useKwl": true
     *        }]
     *     }
     *
     * Following configuration will multiset a field from the fields dynamic KWL staring with 'M' (e.g. M - month) from a localized dynamic KWL
     *
     *     {
     *       "type": "GRP",
     *       "key": "REMINDER_PERIOD_UNIT",
     *       "value": "M",
     *       "useDynKwl": true,
     *       "dynKwlCfg": {
     *         "returnColumn": 2,
     *         "filterColumn": 0
     *       }
     *     }
     *
     * # As IX function call
     *
     * In addition to the workflow node configuration the objId must be passed.
     *
     *     sol.common.IxUtils.execute("RF_sol_function_MultiSet", {
     *      objEntries: [{
     *       objId: "4711",
     *       entries: [{
     *         type: "GRP",
     *         key: "INVOICE_STATUS",
     *         value: "3",
     *         useKwl: true
     *       }]
     *     }]
     *    });
     *
     * @author JHR, ELO Digital Office GmbH
     * @version 1.01.001
     *
     * @eloix
     * @requires sol.Logger
     * @requires sol.common.IxUtils
     * @requires sol.common.ix.RfUtils
     * @requires sol.common.ix.FunctionBase
     *
     */
    sol.define("sol.common.ix.functions.MultiSet", {
      extend: "sol.common.ix.FunctionBase",

      requiredConfig: ["objEntries"],

      /**
       * @cfg {Object[]} objEntries (required)
       * It contains for every objid the entries values to set
       */

      /**
       * @cfg {String} timeZone
       * Time zone
       */

      initialize: function (config) {
        var me = this;
        me.$super("sol.common.ix.FunctionBase", "initialize", [config]);
      },

      /**
       * Sets a field value for every objId
       */
      process: function () {
        var me = this,
            savedTimeZone = null,
            i, objEntry;

        if (!me.objEntries) {
          return;
        }

        try {
          me.logger.debug(["sol.common.ix.functions.MultiSet: objEntries={0}", JSON.stringify(me.objEntries)]);

          if (me.timeZone) {
            savedTimeZone = ixConnect.loginResult.clientInfo.timeZone;
            ixConnect.loginResult.clientInfo.timeZone = me.timeZone;
            me.logger.debug(["user.name={0}, timeZone={1}", ixConnect.loginResult.user.name, ixConnect.loginResult.clientInfo.timeZone]);
          }

          for (i = 0; i < me.objEntries.length; i++) {
            objEntry = me.objEntries[i];
            sol.common.IxUtils.execute("RF_sol_function_Set", {
              objId: objEntry.objId,
              entries: objEntry.entries,
              asAdmin: objEntry.asAdmin || me.asAdmin || false
            });
          }
        } catch (ex) {
          me.logger.debug(["Exception", ex.message]);
        } finally {
          if (savedTimeZone) {
            ixConnect.loginResult.clientInfo.timeZone = savedTimeZone;
          }
        }
      }
    });

    /**
     * @member sol.common.ix.functions.MultiSet
     * @static
     * @inheritdoc sol.common.ix.FunctionBase#onEnterNode
     */
    function onEnterNode(clientInfo, userId, wfDiagram, nodeId) {
      var params, module;

      logger.enter("onEnterNode_MultiSet", { flowId: wfDiagram.id, nodeId: nodeId });
      params = sol.common.WfUtils.parseAndCheckParams(wfDiagram, nodeId, "objEntries");

      module = sol.create("sol.common.ix.functions.MultiSet", params);
      module.process();

      logger.exit("onEnterNode_MultiSet");
    }

    /**
     * @member sol.common.ix.functions.MultiSet
     * @static
     * @inheritdoc sol.common.ix.FunctionBase#onExitNode
     */
    function onExitNode(clientInfo, userId, wfDiagram, nodeId) {
      var params, module;

      logger.enter("onExitNode_MultiSet", { flowId: wfDiagram.id, nodeId: nodeId });
      params = sol.common.WfUtils.parseAndCheckParams(wfDiagram, nodeId, "objEntries");

      module = sol.create("sol.common.ix.functions.MultiSet", params);
      module.process();

      logger.exit("onExitNode_MultiSet");
    }

    /**
     * @member sol.common.ix.functions.MultiSet
     * @method RF_sol_function_MultiSet
     * @static
     * @inheritdoc sol.common.ix.FunctionBase#RF_FunctionName
     */
    function RF_sol_function_MultiSet(ec, args) {
      var params, module;

      logger.enter("RF_sol_function_MultiSet", args);
      params = sol.common.ix.RfUtils.parseAndCheckParams(ec, arguments.callee.name, args, "objEntries");

      module = sol.create("sol.common.ix.functions.MultiSet", params);
      module.process();

      logger.exit("RF_sol_function_MultiSet");
    }