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

    //@include lib_Class.js
    //@include lib_sol.common.RepoUtils.js
    //@include lib_sol.common.SordUtils.js
    //@include lib_sol.common.WfUtils.js
    //@include lib_sol.common.ix.RfUtils.js
    //@include lib_sol.common.ix.FunctionBase.js

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

    /**
     * Makes a decision on field values by regular expressions and sets the workflow status
     *
     * # Example
     *
     *     {
     *       "checks": [
     *         { "type": "GRP", "key": "PROJECT_NO", "regex": "^AB(\\d+)$", "writeMatches": [{ "type": "GRP", "key": "COMPANY_NAME" }] },
     *         { "type": "GRP", "key": "PROJECT_NAME", "regex": "My(Project)", "writeMatches": [{ "type": "GRP", "key": "VENDOR_NAME" }] }
     *       ],
     *       "trueStatus": "TRUE",
     *       "falseStatus": "FALSE"
     *     }
     *
     * @author MW, ELO Digital Office GmbH
     * @version 1.1
     *
     * @eloix
     * @requires  sol.common.WfUtils
     * @requires  sol.common.ix.RfUtils
     * @requires  sol.common.ix.FunctionBase
     *
     */
    sol.define("sol.common.ix.functions.Decide", {
      extend: "sol.common.ix.FunctionBase",

      requiredConfig: ["wfDiagram", "nodeId", "checks"],

      /**
       * @cfg {de.elo.ix.client.wfDiagram} wfDiagram (required)
       * The workflow which should be checked.
       */

      /**
       * @cfg {String} [trueStatus=TRUE]
       * Status value for ´true´
       */

      /**
       * @cfg {String} [falseStatus=FALSE]
       * Status value for ´false´
       */

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

      /**
       * Perform the checks.
       */
      process: function () {
        var me = this,
            decision, statusValue;

        me.sord = ixConnect.ix().checkoutSord(me.wfDiagram.objId, SordC.mbAllIndex, LockC.NO);
        decision = me.checkAndWrite();

        me.trueStatus = me.trueStatus || "TRUE";
        me.falseStatus = me.falseStatus || "FALSE";

        statusValue = decision ? me.trueStatus : me.falseStatus;

        sol.common.WfUtils.setWorkflowStatus(me.wfDiagram, statusValue);
      },

      checkAndWrite: function () {
        var me = this,
            updates = [],
            result = true,
            i, j, singleCheck, value, regExp, matches, match, mapEntries,
            fieldDefIndex, fieldDefRef, fieldDef;

        for (i = 0; i < me.checks.length; i++) {
          singleCheck = me.checks[i];
          if ((singleCheck.type == "WFMAP") && me.flowId) {
            value = String(sol.common.WfUtils.getWfMapValue(me.flowId, singleCheck.key) || "");
          } else {
            value = String(sol.common.SordUtils.getValue(me.sord, singleCheck) || "");
          }
          if (!value && !(me.checkEmptyValues === true)) {
            me.logger.debug(["Check: Field is emtpy: type={0}, key={1}", singleCheck.type, singleCheck.key]);
            result = false;
            break;
          }

          regExp = new RegExp(singleCheck.regex);
          matches = value.match(regExp);

          if (!matches || (matches.length == 0)) {
            me.logger.debug(["Check: Field value doesn't match: type={0}, key={1}, value={2}, regex={3}", singleCheck.type, singleCheck.key, value, singleCheck.regex]);
            result = false;
            break;
          }

          if (singleCheck.writeMatches) {

            for (j = 1; j < matches.length; j++) {
              match = matches[j];
              fieldDefIndex = j - 1;
              fieldDefRef = singleCheck.writeMatches[fieldDefIndex];
              if (fieldDefRef) {
                fieldDef = sol.common.ObjectUtils.clone(fieldDefRef);
                fieldDef.value = match;
                me.logger.debug(["Write match to field: {0}", JSON.stringify(fieldDef)]);
                updates.push(fieldDef);
              }
            }
          }
        }

        if (updates.length > 0) {
          mapEntries = sol.common.SordUtils.updateSord(me.sord, updates);
          ixConnect.ix().checkinSord(me.sord, SordC.mbAllIndex, LockC.NO);
          if (mapEntries) {
            ixConnect.ix().checkinMap(MapDomainC.DOMAIN_SORD, me.sord.id, me.sord.id, mapEntries, LockC.NO);
          }
        }

        me.logger.debug("Check: All fields match");
        return result;
      }
    });

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

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

      params = sol.common.WfUtils.parseAndCheckParams(wfDiagram, nodeId);
      params.wfDiagram = wfDiagram;
      params.flowId = wfDiagram.id;
      params.nodeId = nodeId;
      module = sol.create("sol.common.ix.functions.Decide", params);

      module.process();

      logger.exit("onExitNode_Decide");
    }