Ejemplo n.º 1
0
 public static List <KeyValuePair <object, string> > GetAllConditions()
 {
     return(Enum.GetValues(typeof(ConditionType))
            .Cast <ConditionType> ()
            .Select(c => new KeyValuePair <object, string> (c, PriceRuleCondition.TypeToString(c)))
            .ToList());
 }
Ejemplo n.º 2
0
 public static List <KeyValuePair <object, string> > GetAllExceptions()
 {
     return(new []
     {
         ConditionType.Partner,
         ConditionType.PartnerGroup,
         ConditionType.Object,
         ConditionType.ObjectGroup,
         ConditionType.User,
         ConditionType.UserGroup,
         ConditionType.Good,
         ConditionType.GoodGroup,
         ConditionType.PaymentTypeUsed,
         ConditionType.DatabaseUpdated
     }
            .Select(c => new KeyValuePair <object, string> (c, PriceRuleCondition.TypeToString(c)))
            .ToList());
 }
Ejemplo n.º 3
0
        private bool ParseFormula()
        {
            string [] conditionsAndActions = Formula.Split(new [] { " THEN " }, StringSplitOptions.RemoveEmptyEntries);
            if (conditionsAndActions.Length != 2)
            {
                return(false);
            }

            string prerequisitesString = conditionsAndActions [0];
            int    operationsStart     = prerequisitesString.IndexOf("(operation", StringComparison.Ordinal);
            string conditionsString    = prerequisitesString.Substring(0, operationsStart);
            string operationsString    = prerequisitesString.Substring(operationsStart);

            string actionsString = conditionsAndActions [1];

            return(PriceRuleCondition.Parse(conditionsString, conditions) &&
                   ParseOperations(operationsString) &&
                   PriceRuleAction.Parse(actionsString, actions));
        }
        public static bool Parse(string conditionsString, List <PriceRuleCondition> conditions)
        {
            foreach (string condition in conditionsString.Split(new [] { "IF ", PriceRule.AND, "(", ")" }, StringSplitOptions.RemoveEmptyEntries))
            {
                int indexOfEquals = condition.IndexOf('=');
                if (indexOfEquals < 0)
                {
                    return(false);
                }

                string conditionTypeName = condition.Substring(0, indexOfEquals).Trim(' ', '>', '<');
                bool   isException       = false;
                if (conditionTypeName.Contains(NOT))
                {
                    conditionTypeName = conditionTypeName.Substring(NOT.Length);
                    isException       = true;
                }

                PriceRule.ConditionType cType;
                if (!Enum.TryParse(conditionTypeName, true, out cType))
                {
                    return(false);
                }

                int index = conditions.FindIndex(c => c.Type == cType && c.IsException == isException);

                // a duplicate type indicates a 2-sided condition: (a >= x) AND (a <= y)
                if (index > -1)
                {
                    string value = conditions [index].Formula + ")" + PriceRule.AND + "(" + condition;
                    conditions [index] = new PriceRuleCondition(cType, value, conditions [index].IsException);
                }
                else if (isException)
                {
                    conditions.Add(new PriceRuleCondition(cType, condition.Substring(NOT.Length), true));
                }
                else
                {
                    conditions.Add(new PriceRuleCondition(cType, condition));
                }
            }
            return(true);
        }
Ejemplo n.º 5
0
        public PriceRuleCondition AddCondition(ConditionType conditionType, bool isException, params object [] values)
        {
            PriceRuleCondition condition = conditions.Find(c => c.Type == conditionType && c.IsException == isException);

            try {
                if (condition == null)
                {
                    condition = new PriceRuleCondition(conditionType, values, isException);
                    conditions.Add(condition);
                }
                else
                {
                    condition.IsActive = true;
                    condition.SetValues(values);
                }
                return(condition);
            } catch (Exception) {
                return(null);
            }
        }
Ejemplo n.º 6
0
        private void BuildFormula()
        {
            if (conditions.Count == 0)
            {
                throw new InvalidOperationException("A price rule must contain at least one condition.");
            }
            if (actions.Count == 0)
            {
                throw new InvalidOperationException("A price rule must contain at least one action.");
            }
            if (operations.Count == 0)
            {
                throw new InvalidOperationException("A price rule must apply to at least one operation.");
            }

            Formula = string.Format("IF {0} AND (operation = {1}) THEN {2}",
                                    PriceRuleCondition.GetFormula(conditions),
                                    string.Join(",", operations.Cast <int> ()),
                                    PriceRuleAction.GetFormula(actions));
        }