public IPolicy GetPolicy(string nameOfInsuredObject, DateTime effectiveDate) { var policyId = IdGenerator.ConstructPolicyId(nameOfInsuredObject, effectiveDate); var policyModel = _policyRepository.Get(policyId); if (policyModel == null) { throw new NoSuchPolicyException(nameOfInsuredObject, effectiveDate); } var policyRisks = _riskRepository .GetAll() .Where(riskModel => riskModel.PolicyId == policyId) .Select(riskModel => new Risk { Name = riskModel.Name, YearlyPrice = riskModel.YearlyPrice }) .ToList(); decimal premium = _premiumCalculator.CalculatePremiumOfSoldPolicy(nameOfInsuredObject, effectiveDate); return(new Policy() { NameOfInsuredObject = policyModel.NameOfInsuredObject, ValidFrom = policyModel.ValidFrom, ValidTill = policyModel.ValidTill, InsuredRisks = policyRisks, Premium = premium }); }
public void AddRisk(string nameOfInsuredObject, Risk risk, DateTime validFrom, DateTime effectiveDate) { if (validFrom < effectiveDate) { throw new RiskValidityPeriodException(); } var policyId = IdGenerator.ConstructPolicyId(nameOfInsuredObject, effectiveDate); var policyModel = _policyRepository.Get(policyId); if (validFrom > policyModel.ValidTill) { throw new RiskValidityPeriodException(); } if (policyModel.InsuredRisks.Contains(risk)) { throw new DuplicateRiskException(risk.Name); } var riskId = IdGenerator.ConstructRiskId(risk.Name, policyModel.NameOfInsuredObject, effectiveDate); var riskModel = new RiskModel { Name = risk.Name, ValidFrom = validFrom, PolicyEffectiveDate = effectiveDate, PolicyId = policyId, Id = riskId, ValidTill = policyModel.ValidTill, YearlyPrice = risk.YearlyPrice }; _riskRepository.Add(riskModel); }
public void RemoveRisk(string nameOfInsuredObject, Risk risk, DateTime validTill, DateTime effectiveDate) { var policyId = IdGenerator.ConstructPolicyId(nameOfInsuredObject, effectiveDate); var policyModel = _policyRepository.Get(policyId); if (validTill.Date > policyModel.ValidTill.Date) { throw new RiskRemovalDateException(); } var riskId = IdGenerator.ConstructRiskId(risk.Name, nameOfInsuredObject, effectiveDate); var riskModel = _riskRepository.Get(riskId); var updatedRiskModel = new RiskModel { Name = riskModel.Name, ValidFrom = riskModel.ValidFrom, PolicyEffectiveDate = riskModel.PolicyEffectiveDate, PolicyId = riskModel.PolicyId, Id = riskModel.Id, ValidTill = validTill, YearlyPrice = riskModel.YearlyPrice }; _riskRepository.Edit(updatedRiskModel); }
public void IdGenerator_ShouldCorrectlyGeneratePolicyId() { var expectedPolicyId = $"{DEFAULT_OBJECT_NAME}{DEFAULT_DATE.ToString()}"; var policyId = IdGenerator.ConstructPolicyId(DEFAULT_OBJECT_NAME, DEFAULT_DATE); Assert.AreEqual(expectedPolicyId, policyId); }
public void IdGenerator_ShouldNotAllowGeneratePolicyIdWithNullObjectName() { Exception ex = Assert.Throws <CannotBeNullException>(() => IdGenerator.ConstructPolicyId(null, new DateTime(2020, 5, 5))); Assert.AreEqual("Argument 'name' can not be null.", ex.Message); }
public void PremiumCalculator_ShouldCalculatePremiumForSoldPolicyWithOnlyInitialRisks() { List <Risk> riskList = new List <Risk>(); riskList.Add(Risk1); riskList.Add(Risk2); var effectiveDate = DateTime.Now; var soldPolicy = Company.SellPolicy(DEFAULT_OBJECT_NAME, effectiveDate, 6, riskList); var policyID = IdGenerator.ConstructPolicyId(DEFAULT_OBJECT_NAME, effectiveDate); var premium = PremiumCalculator.CalculatePremiumOfSoldPolicy(DEFAULT_OBJECT_NAME, effectiveDate); Assert.AreEqual(651.48m, premium); }
//Used to calculate premium for Risk already in storage public decimal CalculatePremiumOfSoldPolicy(string nameOfInsuredObject, DateTime effectiveDate) { var policyId = IdGenerator.ConstructPolicyId(nameOfInsuredObject, effectiveDate); decimal premium = 0.0m; var insuredRisks = _riskRepository .GetAll() .Where(riskModel => riskModel.PolicyId == policyId) .ToList(); foreach (var insuredRisk in insuredRisks) { premium += Math.Round(insuredRisk.YearlyPrice / 365.0m, 2) * (int)(insuredRisk.ValidTill - insuredRisk.ValidFrom).TotalDays; } return(Math.Round(premium, 2)); }
public void PremiumCalculator_ShouldCalculatePremiumForSoldPolicyWithRiskAdded() { List <Risk> riskList = new List <Risk>(); riskList.Add(Risk1); riskList.Add(Risk2); var effectiveDate = DateTime.Now; var soldPolicy = Company.SellPolicy(DEFAULT_OBJECT_NAME, effectiveDate, 6, riskList); var policyID = IdGenerator.ConstructPolicyId(DEFAULT_OBJECT_NAME, effectiveDate); Company.AddRisk(DEFAULT_OBJECT_NAME, Risk3, effectiveDate.AddDays(1), effectiveDate); var premium = PremiumCalculator.CalculatePremiumOfSoldPolicy(DEFAULT_OBJECT_NAME, effectiveDate); Assert.AreEqual(851.68m, premium); }
public IPolicy SellPolicy(IPolicy policy) { var policyId = IdGenerator.ConstructPolicyId(policy.NameOfInsuredObject, policy.ValidFrom); if (_policyRepository.Get(policyId) != null) { throw new DuplicatePolicyException(policy.NameOfInsuredObject, policy.ValidFrom); } var policyModel = new PolicyModel { Id = policyId, NameOfInsuredObject = policy.NameOfInsuredObject, ValidFrom = policy.ValidFrom, ValidTill = policy.ValidTill, InsuredRisks = policy.InsuredRisks, Premium = policy.Premium }; foreach (var risk in policy.InsuredRisks) { var riskId = IdGenerator.ConstructRiskId(risk.Name, policy.NameOfInsuredObject, policy.ValidFrom); var riskModel = new RiskModel { Name = risk.Name, ValidFrom = policy.ValidFrom, ValidTill = policy.ValidTill, PolicyEffectiveDate = policy.ValidFrom, PolicyId = policyId, Id = riskId, YearlyPrice = risk.YearlyPrice }; _riskRepository.Add(riskModel); } _policyRepository.Add(policyModel); return(policy); }
public void IdGenerator_ShouldThrowWithNullObjectName() { Assert.That(() => IdGenerator.ConstructPolicyId(null, DEFAULT_DATE), Throws.Exception); }