Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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
                )
            );
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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))
                )
                );
        }
Ejemplo n.º 5
0
        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
                )
                );
        }
Ejemplo n.º 6
0
        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
                )
            );
        }
Ejemplo n.º 7
0
 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()
         )
         );
 }