public void ExtendCoverage(DateTime effectiveDateOfChange, CoverPrice newCover) { if (Terminated()) { throw new ApplicationException("Cannot annex terminated policy"); } var versionAtDate = versions.EffectiveAt(effectiveDateOfChange); if (versionAtDate == null || !versionAtDate.CoversDate(effectiveDateOfChange)) { throw new ApplicationException("Policy does not cover annex date"); } if (versionAtDate.ContainsCover(newCover.CoverCode)) { throw new ApplicationException("This cover is already present"); } var newVersionNumber = versions.Count + 1; var versionPeriod = ValidityPeriod.Between(effectiveDateOfChange, versionAtDate.CoverPeriod.ValidTo); var newCoverage = PolicyCover.ForPrice(newCover, versionPeriod); ApplyChange ( new CoverageExtendedPolicyVersionCreated ( newVersionNumber, versionAtDate.VersionNumber, versionPeriod, newCoverage ) ); }
private Policy(Guid policyId, Offer.Offer offer, DateTime purchaseDate, DateTime policyStartDate) { if (offer.Converted()) { throw new ApplicationException("Offer already converted"); } if (offer.Rejected()) { throw new ApplicationException("Offer already rejected"); } if (offer.Expired(purchaseDate)) { throw new ApplicationException("Offer expired"); } if (offer.Expired(policyStartDate)) { throw new ApplicationException("Offer not valid at policy start date"); } var policyNumber = Guid.NewGuid().ToString(); var coverPeriod = ValidityPeriod.Between ( policyStartDate, policyStartDate.Add(offer.CoverPeriod) ); var covers = offer.Covers .Select(c => PolicyCover.ForPrice(c, coverPeriod)) .ToList(); Id = policyId; ApplyChange( new InitialPolicyVersionCreated ( policyNumber, offer.ProductCode, coverPeriod, purchaseDate, offer.Customer, offer.Car, covers ) ); }