private bool CanExecuteRule(AppRule appRule, object dataObject) { if (string.IsNullOrEmpty(appRule.CustomConstraint)) return true; var expression = _settingService.ReplaceSettingValues(appRule.CustomConstraint); expression = ReplaceParameterValues(expression, dataObject); return _expressionService.Eval("result = " + expression, dataObject, true); }
public override void Up() { var dc = ApplicationContext as DbContext; if (dc != null) { var updateTicketStatusAction = dc.Set<AppAction>().SingleOrDefault(x => x.Name == Resources.UpdateTicketStatus); var updateMergedTicket = dc.Set<AppRule>().SingleOrDefault(x => x.Name == Resources.UpdateMergedTicketsState); if (updateTicketStatusAction != null) { if (updateMergedTicket != null) { updateMergedTicket.Actions.Add(new ActionContainer(updateTicketStatusAction) { ParameterValues = string.Format("Status={0}", Resources.NewOrders) }); } var ticketMovedRule = new AppRule { Name = Resources.TicketMovedRule, EventName = "TicketMoved" }; ticketMovedRule.Actions.Add(new ActionContainer(updateTicketStatusAction) { ParameterValues = string.Format("Status={0}", Resources.NewOrders) }); ticketMovedRule.AddRuleMap(); dc.Set<AppRule>().Add(ticketMovedRule); } dc.SaveChanges(); } Create.Column("UsePlainSum").OnTable("Calculations").AsBoolean().WithDefaultValue(false); Create.Column("UsePlainSum").OnTable("CalculationTypes").AsBoolean().WithDefaultValue(false); }
public bool Satisfies(AppRule appRule, object dataParameter) { _dataObject = dataParameter.ToDynamic(); if (!SatisfiesCustomConstraints(appRule, _dataObject)) return false; if (!string.IsNullOrEmpty(appRule.EventConstraints) && GetConditions(appRule).Any(DoesNotSatisfy)) { return false; } return SatisfiesCustomConstraint(appRule.CustomConstraint, dataParameter); }
private bool SatisfiesCustomConstraints(AppRule appRule, object dataObject) { var cv = appRule.RuleConstraints; if (string.IsNullOrEmpty(cv)) return true; cv = _preprocessor.Process(cv, dataObject); var cvs = JsonHelper.Deserialize<List<RuleConstraintValue>>(cv); if (!cvs.Any()) return true; switch ((RuleConstraintMatch)appRule.ConstraintMatch) { case RuleConstraintMatch.MatchesAny: return cvs.Any(x => x.Satisfies(dataObject)); case RuleConstraintMatch.MatchesAll: return cvs.All(x => x.Satisfies(dataObject)); case RuleConstraintMatch.NotMatchesAny: return cvs.Any(x => !x.Satisfies(dataObject)); case RuleConstraintMatch.NotMatchesAll: return cvs.All(x => !x.Satisfies(dataObject)); default: return cvs.GroupBy(x => x.Left).All(x => x.Any(y => y.Satisfies(dataObject))); } }
public override void Up() { var dc = ApplicationContext as DbContext; var closeTicketAutomation = new AutomationCommand { Name = Resources.CloseTicket, ButtonHeader = Resources.Close, SortOrder = -1, Color = "#FFFF0000",FontSize = 40}; closeTicketAutomation.AutomationCommandMaps.Add(new AutomationCommandMap { EnabledStates = string.Format("{0},{1},{2},{3},IsClosed", Resources.New, Resources.NewOrders, Resources.Unpaid, Resources.Locked), VisibleStates = "*", DisplayUnderTicket = true }); dc.Set<AutomationCommand>().Add(closeTicketAutomation); var settleAutomation = new AutomationCommand { Name = Resources.Settle, ButtonHeader = Resources.Settle, SortOrder = -2 ,FontSize = 40}; settleAutomation.AutomationCommandMaps.Add(new AutomationCommandMap { EnabledStates = "*", VisibleStates = "*", DisplayUnderTicket = true }); dc.Set<AutomationCommand>().Add(settleAutomation); dc.SaveChanges(); var displayPaymentScreenAction = new AppAction { ActionType = ActionNames.DisplayPaymentScreen, Name = Resources.DisplayPaymentScreen, Parameter = "", SortOrder = -1 }; dc.Set<AppAction>().Add(displayPaymentScreenAction); var closeTicketAction = dc.Set<AppAction>().FirstOrDefault(x => x.ActionType == ActionNames.CloseActiveTicket); if (closeTicketAction == null) { closeTicketAction = new AppAction { ActionType = ActionNames.CloseActiveTicket, Name = Resources.CloseTicket, Parameter = "", SortOrder = -1 }; dc.Set<AppAction>().Add(closeTicketAction); } dc.SaveChanges(); var closeTicketRule = new AppRule { Name = string.Format(Resources.Rule_f, Resources.CloseTicket), EventName = "AutomationCommandExecuted", EventConstraints = "AutomationCommandName;=;" + Resources.CloseTicket, SortOrder = -1 }; closeTicketRule.Actions.Add(new ActionContainer(closeTicketAction)); closeTicketRule.AddRuleMap(); dc.Set<AppRule>().Add(closeTicketRule); var settleTicketRule = new AppRule { Name = string.Format(Resources.Rule_f, Resources.Settle), EventName = "AutomationCommandExecuted", EventConstraints = "AutomationCommandName;=;" + Resources.Settle, SortOrder = -1 }; settleTicketRule.Actions.Add(new ActionContainer(displayPaymentScreenAction)); settleTicketRule.AddRuleMap(); dc.Set<AppRule>().Add(settleTicketRule); dc.SaveChanges(); }
private bool SatisfiesConditions(AppRule appRule, object dataObject) { var conditions = appRule.EventConstraints.Split('#').Select(x => new RuleConstraint(x)); var parameterNames = dataObject.GetType().GetProperties().Select(x => x.Name).ToList(); foreach (var condition in conditions) { var parameterName = parameterNames.FirstOrDefault(condition.Name.Equals); if (!string.IsNullOrEmpty(parameterName)) { var property = dataObject.GetType().GetProperty(parameterName); var parameterValue = property.GetValue(dataObject, null) ?? ""; if (!condition.ValueEquals(parameterValue)) return false; } } return true; }
private bool SatisfiesConditions(AppRule appRule, object dataObject) { var conditions = appRule.EventConstraints.Split('#').Select(x => new RuleConstraint(x)); var parameterNames = ((IDictionary<string, object>)dataObject).Keys; foreach (var condition in conditions) { var parameterName = parameterNames.FirstOrDefault(condition.Name.Equals); if (!string.IsNullOrEmpty(parameterName)) { var parameterValue = ((IDictionary<string, object>)dataObject)[parameterName]; if (condition.IsValueDifferent(parameterValue)) return false; } } return true; }
private static IEnumerable<RuleConstraint> GetConditions(AppRule appRule) { return appRule.EventConstraints.Split('#').Select(x => new RuleConstraint(x)); }