Example #1
0
        protected override void ExecuteCrmWorkFlowActivity(CodeActivityContext context, LocalWorkflowContext localContext)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }
            if (localContext == null)
            {
                throw new ArgumentNullException(nameof(localContext));
            }

            var dateToRound = DateToRound.Get(context);
            var roundDown   = RoundDown.Get(context);

            dateToRound = dateToRound.AddSeconds(-dateToRound.Second);
            var roundedDate = dateToRound;
            var minute      = dateToRound.Minute;

            if (minute > 0 && minute < 30)
            {
                roundedDate = roundDown
                    ? dateToRound.AddMinutes(-minute)      // 0
                    : dateToRound.AddMinutes(30 - minute); // 30
            }
            else if (minute > 30 && minute < 60)
            {
                roundedDate = roundDown
                    ? dateToRound.AddMinutes(-(minute - 30)) // 60
                    : dateToRound.AddMinutes(60 - minute);   // Next hour
            }

            RoundedDate.Set(context, roundedDate);
        }
Example #2
0
        public SuperHappyScript(string script)
        {
            ValueNode currentNode = null;

            string currentParseValue = "";
            int    predenceLevel     = 0;

            _variables = new List <string>();
            int  index        = 0;
            char currentToken = ' ';
            char nextToken    = ' ';

            _script = script;

            try {
                foreach (char token in script)
                {
                    index++;

                    if (script.Length > index)
                    {
                        nextToken = script[index];
                    }

                    currentToken = token;

                    if (currentParseValue.StartsWith("[") && !currentParseValue.EndsWith("]") && !(currentParseValue + token).EndsWith(">=") && !(currentParseValue + token).EndsWith("<=") && !(currentParseValue + token).EndsWith("<>"))
                    {
                        currentParseValue += token;
                        continue;
                    }

                    if (IgnoreSet.Contains(token))
                    {
                        if (currentParseValue != "")
                        {
                            currentNode = AddValue(currentNode, currentParseValue);
                        }
                    }
                    else if (token == ']')
                    {
                        currentParseValue += token;
                        currentNode        = AddValue(currentNode, currentParseValue);
                    }
                    else if (token == ',')
                    {
                        if (predenceLevel == 0)
                        {
                            throw new Exception("Parsing error");
                        }

                        if (currentParseValue != "")
                        {
                            currentNode = AddValue(currentNode, currentParseValue);
                        }

                        currentNode = WrapFunction(currentNode, predenceLevel, false);
                    }
                    else if ((currentParseValue + token).ToUpper() == "ABS(")
                    {
                        currentNode = new Absolute(predenceLevel).AttachNode(currentNode);

                        predenceLevel += MAX_PREDENCE + 1;
                    }
                    else if ((currentParseValue + token).ToUpper() == "ROUND(")
                    {
                        currentNode = new Round(predenceLevel).AttachNode(currentNode);

                        predenceLevel += MAX_PREDENCE + 1;
                    }
                    else if ((currentParseValue + token).ToUpper() == "INT(")
                    {
                        currentNode = new RoundDown(predenceLevel).AttachNode(currentNode);

                        predenceLevel += MAX_PREDENCE + 1;
                    }
                    else if ((currentParseValue + token).ToUpper() == "IIF(")
                    {
                        currentNode = new IfStatement(predenceLevel).AttachNode(currentNode);

                        predenceLevel += MAX_PREDENCE + 1;
                    }
                    else if ((currentParseValue + token).ToUpper() == "MAX(")
                    {
                        currentNode = new Max(predenceLevel).AttachNode(currentNode);

                        predenceLevel += MAX_PREDENCE + 1;
                    }
                    else if ((currentParseValue + token).ToUpper() == "ISNAN(")
                    {
                        currentNode = new IsNaN(predenceLevel).AttachNode(currentNode);

                        predenceLevel += MAX_PREDENCE + 1;
                    }
                    else if ((currentParseValue + token).ToUpper() == "MIN(")
                    {
                        currentNode = new Min(predenceLevel).AttachNode(currentNode);

                        predenceLevel += MAX_PREDENCE + 1;
                    }
                    else if ((currentParseValue + token).ToUpper() == "AND")
                    {
                        if (currentParseValue.Length > 2)
                        {
                            currentNode = AddValue(currentNode, currentParseValue.Substring(0, currentParseValue.Length - 2));
                        }

                        currentNode = new And(predenceLevel).AttachNode(currentNode);
                    }
                    else if ((currentParseValue + token).ToUpper() == "OR")
                    {
                        if (currentParseValue.Length > 2)
                        {
                            currentNode = AddValue(currentNode, currentParseValue.Substring(0, currentParseValue.Length - 2));
                        }

                        currentNode = new Or(predenceLevel).AttachNode(currentNode);
                    }
                    else if ((currentParseValue + token).ToUpper() == "NOT")
                    {
                        if (currentParseValue.Length > 2)
                        {
                            currentNode = AddValue(currentNode, currentParseValue.Substring(0, currentParseValue.Length - 2));
                        }

                        currentNode = new Not(predenceLevel).AttachNode(currentNode);
                    }
                    else if (token == '(')
                    {
                        if (currentParseValue != "")
                        {
                            throw new Exception("Parsing error");
                        }

                        predenceLevel += MAX_PREDENCE + 1;
                    }
                    else if (token == ')')
                    {
                        if (predenceLevel == 0)
                        {
                            throw new Exception("Parsing error");
                        }

                        if (currentParseValue != "")
                        {
                            currentNode = AddValue(currentNode, currentParseValue);
                        }

                        currentNode = WrapFunction(currentNode, predenceLevel, true);

                        predenceLevel -= MAX_PREDENCE + 1;
                    }
                    else if ((currentParseValue + token).EndsWith("="))
                    {
                        if (currentParseValue.Length > 1)
                        {
                            currentNode = AddValue(currentNode, currentParseValue.Substring(0, currentParseValue.Length));
                        }

                        currentNode = new Equal(predenceLevel).AttachNode(currentNode);
                    }
                    else if ((currentParseValue + token).EndsWith(">="))
                    {
                        if (currentParseValue.Length > 2)
                        {
                            currentNode = AddValue(currentNode, currentParseValue.Substring(0, currentParseValue.Length - 1));
                        }

                        currentNode = new EqualOrGreaterThan(predenceLevel).AttachNode(currentNode);
                    }
                    else if ((currentParseValue + token).EndsWith("<="))
                    {
                        if (currentParseValue.Length > 2)
                        {
                            currentNode = AddValue(currentNode, currentParseValue.Substring(0, currentParseValue.Length - 1));
                        }

                        currentNode = new EqualOrLessThan(predenceLevel).AttachNode(currentNode);
                    }
                    else if ((currentParseValue + token).EndsWith("<>"))
                    {
                        if (currentParseValue.Length > 2)
                        {
                            currentNode = AddValue(currentNode, currentParseValue.Substring(0, currentParseValue.Length - 1));
                        }

                        currentNode = new NotEqual(predenceLevel).AttachNode(currentNode);
                    }
                    else if (token == '>' && nextToken != '=')
                    {
                        if (currentParseValue != "")
                        {
                            currentNode = AddValue(currentNode, currentParseValue);
                        }

                        currentNode = new GreaterThan(predenceLevel).AttachNode(currentNode);
                    }
                    else if (token == '<' && nextToken != '>' && nextToken != '=')
                    {
                        if (currentParseValue != "")
                        {
                            currentNode = AddValue(currentNode, currentParseValue);
                        }

                        currentNode = new LessThan(predenceLevel).AttachNode(currentNode);
                    }
                    else if (token == '+')
                    {
                        if (currentParseValue != "")
                        {
                            currentNode = AddValue(currentNode, currentParseValue);
                        }

                        currentNode = new Add(predenceLevel).AttachNode(currentNode);
                    }
                    else if (token == '-')
                    {
                        if (currentParseValue != "")
                        {
                            currentNode = AddValue(currentNode, currentParseValue);
                        }

                        if (currentNode == null || currentNode is Operand || currentNode is Function)
                        {
                            currentNode = new Negate(predenceLevel).AttachNode(currentNode);
                        }
                        else
                        {
                            currentNode = new Subtract(predenceLevel).AttachNode(currentNode);
                        }
                    }
                    else if (token == '*')
                    {
                        if (currentParseValue != "")
                        {
                            currentNode = AddValue(currentNode, currentParseValue);
                        }

                        currentNode = new Multiply(predenceLevel).AttachNode(currentNode);
                    }
                    else if (token == '/')
                    {
                        if (currentParseValue != "")
                        {
                            currentNode = AddValue(currentNode, currentParseValue);
                        }

                        currentNode = new Divide(predenceLevel).AttachNode(currentNode);
                    }
                    else if (token == '^')
                    {
                        if (currentParseValue != "")
                        {
                            currentNode = AddValue(currentNode, currentParseValue);
                        }

                        currentNode = new PowerOf(predenceLevel).AttachNode(currentNode);
                    }
                    else
                    {
                        if (currentParseValue.StartsWith("[") && currentParseValue.EndsWith("]") && token == '[')
                        {
                            throw new Exception("Two variables declared in a row");
                        }

                        currentParseValue += token;
                        continue;
                    }

                    currentParseValue = "";
                }
            } catch (Exception exc) {
                throw new Exception(exc.Message + " at token: " + currentToken + " in row: " + index);
            }

            if (currentParseValue != "")
            {
                currentNode = AddValue(currentNode, currentParseValue);
            }

            if (predenceLevel != 0)
            {
                throw new Exception("Parsing error");
            }

            while (currentNode.Parent != null)
            {
                currentNode = currentNode.Parent;
            }

            _startNode = currentNode;
            _variables = new List <string>(_variables.Distinct());

            Test();
        }