예제 #1
0
        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
            });
        }
예제 #2
0
        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);
        }
예제 #3
0
        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);
        }
예제 #4
0
        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);
        }
예제 #5
0
        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);
        }
예제 #6
0
        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);
        }
예제 #7
0
        //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));
        }
예제 #8
0
        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);
        }
예제 #9
0
        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);
        }
예제 #10
0
 public void IdGenerator_ShouldThrowWithNullObjectName()
 {
     Assert.That(() => IdGenerator.ConstructPolicyId(null, DEFAULT_DATE),
                 Throws.Exception);
 }