private void Apply(TerminalPolicyVersionCreated @event) { var versionPeriod = ValidityPeriod.Between(@event.VersionFrom, @event.VersionTo); var draft = new PolicyVersion ( @event.VersionNumber, PolicyStatus.Terminated, PolicyVersionStatus.Draft, ValidityPeriod.Between(@event.CoverFrom, @event.CoverTo), versionPeriod, @event.Covers .Select(c => new PolicyCover ( c.Code, ValidityPeriod.Between(c.CoverFrom, c.CoverTo), new UnitPrice(c.Price, c.PriceUnit) ) ) .ToList() ); versions.Add(draft); }
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 void Apply(CoverageExtendedPolicyVersionCreated @event) { var versionPeriod = ValidityPeriod.Between(@event.VersionFrom, @event.VersionTo); var draft = versions.WithNumber(@event.BaseVersionNumber) .CreateDraftCopy(@event.VersionNumber, versionPeriod); draft.AddCover ( @event.NewCover.Code, new UnitPrice(@event.NewCover.Price, @event.NewCover.PriceUnit), ValidityPeriod.Between(@event.NewCover.CoverFrom, @event.NewCover.CoverTo) ); versions.Add(draft); }
public void CanExtendCoverageWithMiddleDayOfPolicy() { var product = ProductsTestData.StandardCarInsurance(); var policy = PolicyTestData.StandardOneYearPolicy(new DateTime(2019, 1, 1)); var newCover = product.CoverWithCode("AC"); policy.ExtendCoverage ( new DateTime(2019, 7, 1), new CoverPrice(Guid.NewGuid(), newCover, Money.Euro(100), TimeSpan.FromDays(365)) ); var resultingEvents = policy.GetUncommittedChanges(); //assert state policy .Should() .HaveVersions(2); policy.Versions.WithNumber(1).Should() .BeActive() .HaveActivePolicyStatus() .HaveTotalPremiumEqualTo(Money.Euro(500)); policy.Versions.WithNumber(2) .Should() .BeDraft() .HaveActivePolicyStatus() .CoverPeriod(new DateTime(2019, 1, 1), new DateTime(2020, 1, 1)) .HaveTotalPremiumEqualTo(Money.Euro(550.41)); //assert events resultingEvents .Should() .BeSingle() .ContainEvent( new CoverageExtendedPolicyVersionCreated ( 2, 1, ValidityPeriod.Between(new DateTime(2019, 7, 1), new DateTime(2020, 1, 1)), new PolicyCoverData("AC", new DateTime(2019, 7, 1), new DateTime(2020, 1, 1), Money.Euro(50.41), Money.Euro(100), TimeSpan.FromDays(365)) ) ); }
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 ) ); }
public void TerminatePolicy(DateTime effectiveDateOfChange) { if (Terminated()) { throw new ApplicationException("Policy already terminated"); } var versionAtDate = versions.EffectiveAt(effectiveDateOfChange); if (versionAtDate == null) { throw new ApplicationException("No active version at given date"); } if (!versionAtDate.CoversDate(effectiveDateOfChange)) { throw new ApplicationException("Cannot terminate policy at given date as it is not withing cover period"); } var newVersionNumber = versions.Count + 1; var versionPeriod = ValidityPeriod.Between(effectiveDateOfChange, versionAtDate.CoverPeriod.ValidTo); var coverPeriod = versionAtDate.CoverPeriod.EndOn(effectiveDateOfChange.AddDays(-1)); var terminatedCovers = versionAtDate.Covers .Select(c => c.EndOn(effectiveDateOfChange.AddDays(-1))) .ToList(); ApplyChange ( new TerminalPolicyVersionCreated ( newVersionNumber, versionAtDate.VersionNumber, versionPeriod.ValidFrom, versionPeriod.ValidTo, coverPeriod.ValidFrom, coverPeriod.ValidTo, terminatedCovers ) ); }
private void Apply(InitialPolicyVersionCreated @event) { PolicyNumber = @event.PolicyNumber; versions.Add( new PolicyVersion ( 1, PolicyStatus.Active, PolicyVersionStatus.Active, ValidityPeriod.Between(@event.CoverFrom, @event.CoverTo), ValidityPeriod.Between(@event.CoverFrom, @event.CoverTo), @event.Covers .Select(c => new PolicyCover ( c.Code, ValidityPeriod.Between(c.CoverFrom, c.CoverTo), new UnitPrice(c.Price, c.PriceUnit) ) ) .ToList() ) ); }