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

    //@include lib_Class.js
    //@include lib_sol.common.ObjectUtils.js
    //@include lib_sol.common.SordUtils.js
    //@include lib_sol.common.UserUtils.js
    //@include lib_sol.common.ix.FunctionBase.js

    var logger = sol.create("sol.Logger", { scope: "sol.common.ix.functions.UserToIndex" });

    /**
     * Writes a username into a index field directly.
     *
     * If used on a workflow user node the name of the user responsible for the node is set. All other cases will set the user name of the current session.
     *
     * # As workflow node
     *
     * ObjId is set based on the element that the workflow is attached to.
     * Following configuration should be applied to the comments field.
     *
     *     {
     *       "fieldName": "INVOICE_USER"
     *     }
     *
     * @author JHR, ELO Digital Office GmbH
     * @version 1.03.000
     *
     * @eloix
     * @requires  sol.Logger
     * @requires  sol.common.ObjectUtils
     * @requires  sol.common.SordUtils
     * @requires  sol.common.JsonUtils
     * @requires  sol.common.WfUtils
     * @requires  sol.common.ix.RfUtils
     * @requires  sol.common.ix.FunctionBase
     *
     */
    sol.define("sol.common.ix.functions.UserToIndex", {
      extend: "sol.common.ix.FunctionBase",

      requiredConfig: ["objId"],

      /**
       * @cfg {string} fieldName (required)
       * Index field for username
       */

      /**
       * @cfg {string} nodeId
       * If specified, the nodeId of the current workflow node
       */

      /**
       * @cfg {Boolean} [clear=false] optional
       * If true the field will be cleared
       */

      /**
       * @cfg {Boolean} [append=false] (optional)
       * If true the username will be appended
       */

      /**
       * @cfg {Boolean} [distinct=true] (optional)
       * If `true` a username will only be appended if it is not already in the field (prevents duplicates). Parameter is only used if `append = true`.
       */

      /**
       * @cfg {Boolean} [sort=true] (optional)
       * If `true` the usernames will be ordered alphabetically. In order to preserve the sequence of entry this has to be set to false. Parameter is only used if `append = true`.
       */

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

      /**
       * Sets the username.
       */
      process: function () {
        var me = this,
            newUserNames = [],
            sord, conn, userNames, i;

        conn = (typeof ixConnectAdmin !== "undefined") ? ixConnectAdmin : ixConnect,

        me.fieldName = me.fieldName || "CURRENT_USER";

        sord = conn.ix().checkoutSord(me.objId, SordC.mbAllIndex, LockC.NO);

        if (!me.userName) {
          me.userName = sol.common.WfUtils.getNodeUser(me.wfDiagram, me.nodeId, { useSessionUserAlternatively: true }) + "";
        }

        if (me.clear) {
          sol.common.SordUtils.setObjKeyValues(sord, me.fieldName, null);
          me.logger.debug(["Clear users from index field '{0}'", me.fieldName]);
        } else if (me.append) {
          userNames = sol.common.SordUtils.getObjKeyValues(sord, me.fieldName) || [];
          for (i = 0; i < userNames.length; i++) {
            newUserNames.push(userNames[i] + "");
          }

          if ((me.distinct === false) || (newUserNames.indexOf(me.userName) < 0)) {
            newUserNames.push(me.userName);
            if (me.sort !== false) {
              newUserNames.sort();
            }
            sol.common.SordUtils.setObjKeyValues(sord, me.fieldName, newUserNames);
            me.logger.debug(["Add user name '{0}' to index field '{1}'", me.userName, me.fieldName]);
          }
        } else {
          sol.common.SordUtils.setObjKeyValue(sord, me.fieldName, me.userName);
          me.logger.debug(["Set index field '{0}' to user name '{1}'", me.fieldName, me.userName]);
        }

        conn.ix().checkinSord(sord, SordC.mbAllIndex, LockC.NO);
      }
    });

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

      logger.enter("onEnterNode_UserToIndex", { flowId: wfDiagram.id, nodeId: nodeId });

      params = sol.common.WfUtils.parseAndCheckParams(wfDiagram, nodeId);
      params.objId = wfDiagram.objId;
      params.wfDiagram = wfDiagram;
      params.nodeId = nodeId;

      sol.common.WfUtils.checkMainAdminWf(wfDiagram);
      module = sol.create("sol.common.ix.functions.UserToIndex", params);
      module.process();

      logger.exit("onEnterNode_UserToIndex");
    }

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

      logger.enter("onExitNode_UserToIndex", { flowId: wfDiagram.id, nodeId: nodeId });

      params = sol.common.WfUtils.parseAndCheckParams(wfDiagram, nodeId);
      params.objId = wfDiagram.objId;
      params.wfDiagram = wfDiagram;
      params.nodeId = nodeId;

      sol.common.WfUtils.checkMainAdminWf(wfDiagram);
      module = sol.create("sol.common.ix.functions.UserToIndex", params);
      module.process();

      logger.exit("onExitNode_UserToIndex");
    }

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

      logger.enter("RF_sol_function_UserToIndex", args);

      params = sol.common.ix.RfUtils.parseAndCheckParams(ec, arguments.callee.name, args, "objId");

      sol.common.ix.RfUtils.checkMainAdminRights(ec.user, params);
      module = sol.create("sol.common.ix.functions.UserToIndex", params);
      module.process();

      logger.exit("RF_sol_function_UserToIndex");
    }