public override decimal Calculate(UserResultVM user, UserResult initialUserResult, DateTime startDate, DateTime endDate) { var baseRate = 0M; var userRuleIds = initialUserResult.UserRules.Where(ur => ur.UserId == user.Id).Select(ur => ur.RuleId); var rules = initialUserResult.Rules.Where(r => userRuleIds.Contains(r.Id)); foreach (var rule in rules) { var dateFrom = rule.StartDate > startDate ? rule.StartDate : startDate; var dateTo = rule.EndDate.HasValue && rule.EndDate < endDate ? rule.EndDate.Value : endDate; var calculator = CalculatorFactory.GetRuleCalculator(user, initialUserResult, rule.RuleTypeId); baseRate += calculator.Calculate(rule.Bonus, dateFrom, dateTo); } return(baseRate + Proceed(user, initialUserResult, startDate, endDate)); }
public override decimal Calculate(UserResultVM user, UserResult initialUserResult, DateTime startDate, DateTime endDate) { var bonus = 0M; foreach (var userPosition in user.Positions) { var positionDateFrom = userPosition.StartDate > startDate ? userPosition.StartDate : startDate; var positionDateTo = userPosition.EndDate.HasValue && userPosition.EndDate < endDate ? userPosition.EndDate.Value : endDate; foreach (var rule in GetRules(initialUserResult, userPosition.PositionId)) { var ruleDateFrom = rule.StartDate > positionDateFrom ? rule.StartDate : positionDateFrom; var ruleDateTo = rule.EndDate.HasValue && rule.EndDate < positionDateTo ? rule.EndDate.Value : positionDateTo; var calculator = CalculatorFactory.GetRuleCalculator(user, initialUserResult, rule.RuleTypeId); bonus += calculator.Calculate(rule.Bonus, ruleDateFrom, ruleDateTo); } } return(bonus + Proceed(user, initialUserResult, startDate, endDate)); }