Exemplo n.º 1
0
        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));
        }
Exemplo n.º 2
0
        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));
        }