public void AddRisk(Risk risk, DateTime validFrom) { if (policy.InsuredRisks.Any(r => r.Name.ToLowerInvariant() == risk.Name.ToLowerInvariant())) { throw new ExistingRiskException("Risk with such name is already insured"); } var insurancePeriod = new NewInsurancePeriod(validFrom, policy.ValidTill); var newRiskInsurancePeriod = new RiskInsurancePeriod(insurancePeriod, risk); var addedPremiumForNewRisk = newRiskInsurancePeriod.CalculatePremium(); policy.Premium += addedPremiumForNewRisk; policy.InsuredRisks.Add(risk); }
public void Create(string nameOfInsuredObject, NewInsurancePeriod insurancePeriod, IList <Risk> insuredRisks) { if (string.IsNullOrEmpty(nameOfInsuredObject)) { throw new MissingNameOfInsuredObjectException("Missing Name of Insured Object"); } var initialRiskSet = new InitialRiskSet(insuredRisks, insurancePeriod); policy.NameOfInsuredObject = nameOfInsuredObject; policy.ValidFrom = insurancePeriod.From; policy.ValidTill = insurancePeriod.Till; policy.InsuredRisks = insuredRisks; policy.Premium = initialRiskSet.CalculatePremium(); }
public IPolicy SellPolicy(string nameOfInsuredObject, DateTime validFrom, short validMonths, IList <Risk> selectedRisks) { var insurancePeriod = new NewInsurancePeriod(validFrom, validMonths); var effectivePolicies = GetEffectivePolicies(nameOfInsuredObject, insurancePeriod); if (effectivePolicies.Any()) { throw new ExistingEffectivePolicyException("Effective policy found that conflicts with requested validity period"); } if (selectedRisks.Except(AvailableRisks).Any()) { throw new InitialSelectedRiskUnavailableException("Some of the selected risks are not avaiable for selling"); } var policy = new Policy(); var policyAggregate = new PolicyAggregate(policy); policyAggregate.Create(nameOfInsuredObject, insurancePeriod, selectedRisks); policyRepository.Add(policy); return(policy); }