private PolicyBonus[] CalculatePolicyBonus(Policy[] policies, FacebookBonusSettings settings) { var resultPolicyBonus = new PolicyBonus[policies.Length]; int count = 0; int total = 0; int temp = 0; foreach (Policy policy in SortPoliciesWithConditionSpecifiedInSettings(policies, settings)) { temp = CalculateBonusIntensivePoints(policy.Premium, settings.BonusPercentage); var elementPolicyBonus = new PolicyBonus() { PolicyNumber = policy.PolicyNumber, BonusInPoints = temp }; if (IsTotalBiggerThanMaxiumPointAndIsMaxiumBiggerThan0(total + temp, settings.MaximumBonus)) { temp = Convert.ToInt32(settings.MaximumBonus) - total; total = Convert.ToInt32(settings.MaximumBonus); elementPolicyBonus.BonusInPoints = temp; } else { total += temp; } resultPolicyBonus[count] = elementPolicyBonus; count++; } return(resultPolicyBonus); }
private static void Main(string[] args) { var secondPolicy = new Policy() { PolicyNumber = "P001", Premium = 200, StartDate = new DateTime(2016, 05, 06) }; var firstPolicy = new Policy() { PolicyNumber = "P002", Premium = 100, StartDate = new DateTime(2017, 08, 11) }; var thirdPolicy = new Policy() { PolicyNumber = "P003", Premium = 100, StartDate = new DateTime(2017, 09, 12) }; var settings = new FacebookBonusSettings() { BonusPercentage = 3, MaximumBonus = 10, PolicySorter = new AscendingOrderOfPoliciesStartDate() }; var calculationInput = new FacebookBonusCalculationInput() { PoliciesOfCustomer = new Policy[] { firstPolicy, secondPolicy, thirdPolicy }, Settings = settings }; var facebookBonusCalculator = new FacebookBonusCalculator(); FacebookBonus facebookBonus = facebookBonusCalculator.Calculate(calculationInput); PolicyBonus policyBonus = facebookBonus.PolicyBonuses[0]; Console.WriteLine(policyBonus.PolicyNumber + " " + policyBonus.BonusInPoints); var expectedPolicyBonus = new PolicyBonus() { PolicyNumber = "P001", BonusInPoints = 6 }; Console.WriteLine("\n" + facebookBonus.PolicyBonuses.Contains(expectedPolicyBonus)); Console.ReadLine(); }
/// <summary> /// Calculates the bonus. /// </summary> /// <param name="input">A parameter object representing inputs to the calculation.</param> /// <returns>A <see cref="FacebookBonus"/> object.</returns> public virtual FacebookBonus Calculate(FacebookBonusCalculationInput input) { // TODO: Implement bonus calculation. //throw new NotImplementedException(); var facebookBonusSetting = input.Settings; int sumBonusInPoints = 0; var lstPolicies = input.PoliciesOfCustomer.OrderBy(n => n.StartDate); List <PolicyBonus> lstPolicyBonuses = new List <PolicyBonus>(); foreach (var item in lstPolicies) { float bonusInPoints = (float)item.Premium * facebookBonusSetting.BonusPercentage; int bonusInPointsAfterFloor = (int)Math.Floor(bonusInPoints); sumBonusInPoints += bonusInPointsAfterFloor; PolicyBonus policyBonus = new PolicyBonus { PolicyNumber = item.PolicyNumber, BonusInPoints = bonusInPointsAfterFloor }; lstPolicyBonuses.Add(policyBonus); if (sumBonusInPoints > facebookBonusSetting.MaximumBonus) { var temp = lstPolicyBonuses.ToList(); temp.RemoveAt(temp.Count - 1); lstPolicyBonuses.Last().BonusInPoints = (int)facebookBonusSetting.MaximumBonus - temp.Sum(n => n.BonusInPoints); return(new FacebookBonus { PolicyBonuses = lstPolicyBonuses.ToArray() }); } } return(new FacebookBonus { PolicyBonuses = lstPolicyBonuses.ToArray() }); }