private void ReplaceUpdatedCareCharges(CareChargesCreateDomain request, CarePackage package)
        {
            foreach (var requestedCharge in request.CareCharges)
            {
                // if existing charge date / cost / collector is changed, cancel it and create a new one instead.
                if (!requestedCharge.Id.IsEmpty())
                {
                    var existingCharge = package.Reclaims.Single(cc => cc.Id == requestedCharge.Id);

                    if (CareChargeHasChanged(existingCharge, requestedCharge) && requestedCharge.Status != ReclaimStatus.Cancelled)
                    {
                        existingCharge.Status = ReclaimStatus.Cancelled;
                        requestedCharge.Id    = null;

                        package.Reclaims.Add(requestedCharge.ToEntity());
                    }
                    else
                    {
                        _mapper.Map(requestedCharge, existingCharge);
                    }
                }
                else
                {
                    package.Reclaims.Add(requestedCharge.ToEntity());
                }
            }
        }
        private static void PrepareCareChargesModel(CareChargesCreateDomain request, CarePackage package)
        {
            foreach (var careCharge in request.CareCharges)
            {
                careCharge.CarePackageId = package.Id;
            }

            var coreCost = package.GetCoreCostDetail();

            // Limit ongoing charges if package interval is finite
            request.CareCharges = request.CareCharges.OrderBy(cc => cc.SubType).ToList();

            if (request.CareCharges.Last().EndDate is null && coreCost.EndDate != null)
            {
                request.CareCharges.Last().EndDate = coreCost.EndDate;
            }

            // if requested 1-12 charge covers period of provisional charge, 1-12 will replace provisional
            var provisionalCharge  = request.CareCharges.SingleOrDefault(cc => cc.SubType is ReclaimSubType.CareChargeProvisional);
            var first12WeeksCharge = request.CareCharges.SingleOrDefault(cc => cc.SubType is ReclaimSubType.CareCharge1To12Weeks);

            if (first12WeeksCharge != null && first12WeeksCharge.StartDate.Date <= provisionalCharge?.StartDate.Date)
            {
                provisionalCharge.Status = ReclaimStatus.Cancelled;
            }
        }
        public override IEnumerable <InvoiceItem> CreateRefundItems(CarePackage package, IList <InvoiceDomain> packageInvoices)
        {
            var oneOffs = package.Details.Where(d => d.CostPeriod == PaymentPeriod.OneOff);

            foreach (var detail in oneOffs)
            {
                var refunds = RefundCalculator.Calculate(
                    detail, packageInvoices,
                    (paymentRange, quantity) => CalculateCostForPeriod(detail, paymentRange));

                foreach (var refund in refunds)
                {
                    yield return(new InvoiceItem
                    {
                        Name = $"{GetDetailItemName(detail)} (adjustment)",
                        Quantity = 1,
                        WeeklyCost = 0.0m,
                        TotalCost = refund.Amount,
                        FromDate = refund.StartDate,
                        ToDate = (detail.EndDate is null)
                            ? refund.StartDate // ongoing one-offs are infinite, so voluntarily limit end date to same day as start
                            : refund.EndDate,
                        CarePackageDetailId = detail.Id,
                        SourceVersion = detail.Version,
                        PriceEffect = refund.Amount > 0
                            ? PriceEffect.Add
                            : PriceEffect.Subtract
                    });
        public override IEnumerable <InvoiceItem> CreateRefundItems(CarePackage package, IList <InvoiceDomain> packageInvoices)
        {
            var weeklyDetails = package.Details.Where(d => d.CostPeriod == PaymentPeriod.Weekly);

            foreach (var detail in weeklyDetails)
            {
                var refunds = RefundCalculator.Calculate(
                    detail, packageInvoices,
                    (paymentRange, quantity) => detail.Cost * quantity);

                foreach (var refund in refunds)
                {
                    yield return(new InvoiceItem
                    {
                        Name = $"{GetDetailItemName(detail)} (adjustment)",
                        Quantity = refund.Quantity,
                        WeeklyCost = detail.Cost,
                        TotalCost = refund.Amount,
                        FromDate = refund.StartDate,
                        ToDate = refund.EndDate,
                        CarePackageDetailId = detail.Id,
                        SourceVersion = detail.Version,
                        PriceEffect = refund.Amount > 0
                            ? PriceEffect.Add
                            : PriceEffect.Subtract
                    });
                }
            }
        }
        public override IEnumerable <InvoiceItem> CreateRefundItems(CarePackage package, IList <InvoiceDomain> packageInvoices)
        {
            var fundedNursingCare = package.Reclaims
                                    .Where(r => r.Type is ReclaimType.Fnc)
                                    .ToList();

            foreach (var reclaim in fundedNursingCare)
            {
                var refunds = RefundCalculator.Calculate(
                    reclaim, packageInvoices,
                    (paymentRange, quantity) => CalculateFncPriceForPeriod(paymentRange, reclaim));

                foreach (var refund in refunds)
                {
                    yield return(new InvoiceItem
                    {
                        Name = $"Funded Nursing Care (adjustment) {FormatDescription(reclaim.Description)}",
                        Quantity = refund.Quantity,
                        WeeklyCost = GetPriceForDate(refund.StartDate),
                        TotalCost = refund.Amount,
                        FromDate = refund.StartDate,
                        ToDate = refund.EndDate,
                        CarePackageReclaimId = reclaim.Id,
                        SourceVersion = reclaim.Version,
                        PriceEffect = refund.Amount > 0
                            ? PriceEffect.Add
                            : PriceEffect.Subtract
                    });
                }
            }
        }
        public CarePackage CreateCarePackage(CarePackage package)
        {
            _context.CarePackages.Add(package);
            _context.SaveChanges();

            return(package);
        }
Exemple #7
0
    private void SpawnBulletPackage()
    {
        Transform CarePackageTransform = gameObject.transform;

        CarePackageTransform.transform.Translate(0, 1f, 0);
        CarePackage.SpawnCarePackage(ref m_BulletCarePackage, CarePackageTransform, CarePackage.PackageType.Bullet, fromManager: false);
    }
        public UpsertCareChargesUseCaseTests()
        {
            _coreCost = new CarePackageDetail
            {
                Cost      = 34.12m,
                Type      = PackageDetailType.CoreCost,
                StartDate = _today.AddDays(-30),
                EndDate   = _today.AddDays(30)
            };

            _package = new CarePackage
            {
                Id          = Guid.NewGuid(),
                PackageType = PackageType.ResidentialCare,
                Details     = { _coreCost },
                Settings    = new CarePackageSettings()
            };

            _dbManager = new Mock <IDatabaseManager>();

            var carePackageGateway = new Mock <ICarePackageGateway>();

            carePackageGateway
            .Setup(g => g.GetPackageAsync(_package.Id, It.IsAny <PackageFields>(), It.IsAny <bool>()))
            .ReturnsAsync(_package);

            _useCase = new UpsertCareChargesUseCase(carePackageGateway.Object, _dbManager.Object, Mapper);
        }
        public static void Validate(CarePackage package)
        {
            // ensure that reclaim cost doesn't exceed weekly cost at any date
            // [Core 1000...............]
            // [ANP 500]        [ANP 600]
            // [CC 300.....][CC 1800....] <- last one exceeds weekly cost, invalid

            // reclaim cost may also exceed weekly cost after ANP is ended
            // [Core 1000......]
            // [ANP 500] <- starting from here reclaim cost exceeds weekly cost, so validate day after ANP end
            // [CC 1300........]

            var datesToValidate = package.Reclaims
                                  .Where(reclaim => reclaim.Status != ReclaimStatus.Cancelled)
                                  .Select(reclaim => reclaim.StartDate)
                                  .Concat(package.Details
                                          .Where(detail =>
                                                 detail.Type is PackageDetailType.AdditionalNeed &&
                                                 detail.CostPeriod is PaymentPeriod.Weekly &&
                                                 detail.EndDate.HasValue)
                                          .Select(detail => detail.EndDate.Value.AddDays(1)))
                                  .Distinct();

            foreach (var date in datesToValidate)
            {
                ValidateReclaimCostsAtDate(package, date);
            }
        }
        public override IEnumerable <InvoiceItem> CreateNormalItems(CarePackage package, IList <InvoiceDomain> packageInvoices, DateTimeOffset invoiceEndDate)
        {
            var weeklyDetails = package.Details.Where(d => d.CostPeriod == PaymentPeriod.Weekly);

            foreach (var detail in weeklyDetails)
            {
                var itemRange = GetInvoiceItemDateRange(detail, packageInvoices, invoiceEndDate);
                if (itemRange.WeeksInclusive <= 0)
                {
                    continue;
                }

                yield return(new InvoiceItem
                {
                    Name = GetDetailItemName(detail),
                    Quantity = itemRange.WeeksInclusive,
                    WeeklyCost = detail.Cost,
                    TotalCost = (detail.Cost * itemRange.WeeksInclusive).Round(2),
                    FromDate = itemRange.StartDate,
                    ToDate = itemRange.EndDate,
                    CarePackageDetailId = detail.Id,
                    SourceVersion = detail.Version,
                    PriceEffect = PriceEffect.Add
                });
            }
        }
        public CareChargeGeneratorTests()
        {
            _package = new CarePackage
            {
                Id          = Guid.NewGuid(),
                SupplierId  = 1,
                PackageType = PackageType.NursingCare
            };

            _package.Reclaims.Add(new CarePackageReclaim
            {
                Id                  = Guid.NewGuid(),
                Cost                = 700.0m,
                Status              = ReclaimStatus.Active,
                Type                = ReclaimType.CareCharge,
                ClaimCollector      = ClaimCollector.Supplier,
                StartDate           = "01-12-2022".ToUtcDate(),
                EndDate             = "31-12-2022".ToUtcDate(),
                Package             = _package,
                CurrentDateProvider = new MockCurrentDateProvider {
                    Now = "15-12-2022".ToUtcDate()
                }
            });

            _generator = new CareChargeGenerator();
        }
Exemple #12
0
        public async void ShouldCreateNewPackage()
        {
            var newPackage = new CarePackage();

            _carePackageGatewayMock
            .Setup(g => g.GetServiceUserActivePackagesCount(UserConstants.DefaultApiUserGuid, PackageType.NursingCare, null))
            .ReturnsAsync(0);
            _carePackageGatewayMock
            .Setup(g => g.Create(It.IsAny <CarePackage>()))
            .Callback <CarePackage>(package => newPackage = package);

            var assignment = new CarePlanAssignmentDomain
            {
                HackneyUserId  = 1,
                BrokerId       = Guid.NewGuid(),
                PackageType    = PackageType.NursingCare,
                Notes          = "Hello world",
                CarePlanFile   = null,
                CarePlanFileId = Guid.NewGuid(),
            };

            await _useCase.ExecuteAsync(assignment);

            newPackage.BrokerId.Should().Be(assignment.BrokerId);
            newPackage.PackageType.Should().Be(assignment.PackageType);
            newPackage.ServiceUserId.Should().Be(UserConstants.DefaultApiUserGuid);
            newPackage.Status.Should().Be(PackageStatus.New);

            newPackage.Histories.Count.Should().Be(1);
            newPackage.Histories.First().Status.Should().Be(HistoryStatus.NewPackage);
            newPackage.Histories.First().Description.Should().Be(HistoryStatus.NewPackage.GetDisplayName());
            newPackage.Histories.First().RequestMoreInformation.Should().Be(assignment.Notes);

            _dbManagerMock.Verify(mock => mock.SaveAsync(It.IsAny <string>()), Times.Once);
        }
Exemple #13
0
        public CreateCarePackageReclaimUseCaseTests()
        {
            _defaultPackage = new CarePackage
            {
                Id          = Guid.NewGuid(),
                PackageType = PackageType.ResidentialCare,
                Details     =
                {
                    new CarePackageDetail
                    {
                        Cost      = 34.12m,
                        Type      = PackageDetailType.CoreCost,
                        StartDate = _today.AddDays(-30),
                        EndDate   = _today.AddDays(30)
                    }
                }
            };

            _dbManager = new Mock <IDatabaseManager>();
            _createPackageResourceUseCase = new Mock <ICreatePackageResourceUseCase>();

            _carePackageGateway = new Mock <ICarePackageGateway>();
            _carePackageGateway
            .Setup(g => g.GetPackageAsync(_defaultPackage.Id, It.IsAny <PackageFields>(), It.IsAny <bool>()))
            .ReturnsAsync(_defaultPackage);
            _useCase = new CreateProvisionalCareChargeUseCase(_carePackageGateway.Object, _dbManager.Object);
        }
Exemple #14
0
        public async Task ShouldNotAllowAddingProvisionalIfReclaimExist()
        {
            var package = new CarePackage
            {
                Id          = Guid.NewGuid(),
                PackageType = PackageType.ResidentialCare,
                Details     =
                {
                    new CarePackageDetail
                    {
                        Cost      = 34.12m,
                        Type      = PackageDetailType.CoreCost,
                        StartDate = _today.AddDays(-30),
                        EndDate   = _today.AddDays(30)
                    }
                },
                Reclaims =
                {
                    new CarePackageReclaim
                    {
                        Cost      = 1m,
                        Type      = ReclaimType.CareCharge,
                        SubType   = ReclaimSubType.CareChargeProvisional,
                        Status    = ReclaimStatus.Cancelled,
                        StartDate = _today.AddDays(-30),
                        EndDate   = _today.AddDays(-20)
                    },
                    new CarePackageReclaim
                    {
                        Cost      = 1m,
                        Type      = ReclaimType.CareCharge,
                        SubType   = ReclaimSubType.CareCharge1To12Weeks,
                        Status    = ReclaimStatus.Active,
                        StartDate = _today.AddDays(-30),
                        EndDate   = _today.AddDays(30)
                    },
                }
            };

            _carePackageGateway
            .Setup(g => g.GetPackageAsync(package.Id, It.IsAny <PackageFields>(), It.IsAny <bool>()))
            .ReturnsAsync(package);

            var exception = await Assert.ThrowsAsync <ApiException>(async() =>
            {
                await _useCase.CreateProvisionalCareCharge(new CarePackageReclaimCreationDomain
                {
                    CarePackageId = package.Id,
                    Cost          = 2m,
                    SubType       = ReclaimSubType.CareChargeProvisional,
                    StartDate     = _today.AddDays(-30),
                    EndDate       = _today.AddDays(10)
                }, ReclaimType.CareCharge);
            });

            //TODO: Fix with correct value
            exception.StatusCode.Should().Be(400);

            _dbManager.Verify(db => db.SaveAsync(It.IsAny <string>()), Times.Never);
        }
Exemple #15
0
        public static CarePackageUpdateRequest CarePackageUpdateRequest(CarePackage carePackage,
                                                                        CarePackageSettings carePackageSettings)
        {
            if (carePackage == null)
            {
                throw new ArgumentNullException(nameof(carePackage));
            }
            if (carePackageSettings == null)
            {
                throw new ArgumentNullException(nameof(carePackageSettings));
            }

            return(new CarePackageUpdateRequest()
            {
                PrimarySupportReasonId = carePackage.PrimarySupportReasonId,
                PackageScheduling = carePackage.PackageScheduling,
                HasRespiteCare = carePackageSettings.HasRespiteCare,
                HasDischargePackage = carePackageSettings.HasDischargePackage,
                HospitalAvoidance = carePackageSettings.HospitalAvoidance,
                IsReEnablement = carePackageSettings.IsReEnablement,
                IsS117Client = carePackageSettings.IsS117Client,
                PackageType = carePackage.PackageType,
                SocialWorkerCarePlanFileId = Guid.NewGuid()
            });
        }
Exemple #16
0
        public static CarePackage Save(this CarePackage package, DatabaseContext databaseContext)
        {
            databaseContext.CarePackages.Add(package);
            databaseContext.SaveChanges();

            return(package);
        }
        public async void ShouldNotAllowEndCarePackageReclaimIfEndDateIsLaterThanCorePackageEndDate()
        {
            var packageId = Guid.NewGuid();
            var reclaimId = Guid.NewGuid();

            var reclaim = new CarePackageReclaim
            {
                Id            = reclaimId,
                Cost          = 12.34m,
                CarePackageId = packageId,
                StartDate     = DateTimeOffset.UtcNow,
                Type          = ReclaimType.CareCharge,
                SubType       = ReclaimSubType.CareCharge13PlusWeeks
            };

            var package = new CarePackage
            {
                Id      = packageId,
                Details = new List <CarePackageDetail>
                {
                    new CarePackageDetail
                    {
                        Cost      = 34.12m,
                        Type      = PackageDetailType.CoreCost,
                        StartDate = DateTimeOffset.UtcNow.AddDays(-10),
                        EndDate   = DateTimeOffset.UtcNow.AddDays(10)
                    }
                },
                Reclaims =
                {
                    reclaim
                }
            };

            _carePackageReclaimGatewayMock
            .Setup(g => g.GetAsync(reclaimId, It.IsAny <bool>()))
            .ReturnsAsync(reclaim);

            _carePackageGatewayMock
            .Setup(g => g.GetPackageAsync(package.Id, It.IsAny <PackageFields>(), true))
            .ReturnsAsync(package);

            package.Reclaims.First().Status = ReclaimStatus.Active;

            var exception = await Assert.ThrowsAsync <ApiException>(async() =>
            {
                var response = await _useCase.ExecuteAsync(reclaimId, new CarePackageReclaimEndRequest()
                {
                    EndDate = DateTimeOffset.UtcNow.AddDays(30)
                });
            });

            //TODO: Fix with correct value
            exception.StatusCode.Should().Be(400);

            _dbManagerMock.Verify(db => db.SaveAsync(It.IsAny <string>()), Times.Never);
        }
 public static decimal GetAdditionalOneOffCost(this CarePackage package, DateTimeOffset?targetDate = null)
 {
     return(package.Details
            .Where(detail =>
                   detail.Type is PackageDetailType.AdditionalNeed &&
                   detail.CostPeriod is PaymentPeriod.OneOff &&
                   (targetDate is null || targetDate.Value.IsInRange(detail.StartDate, detail.EndDate ?? DateTimeOffset.MaxValue)))
            .Sum(detail => detail.Cost));
 }
 public static decimal GetCareChargesCost(this CarePackage package, ClaimCollector?collector = null, DateTimeOffset?targetDate = null)
 {
     return(package.Reclaims
            .Where(reclaim =>
                   reclaim.Type is ReclaimType.CareCharge &&
                   reclaim.Status != ReclaimStatus.Cancelled &&
                   (collector is null || reclaim.ClaimCollector == collector) &&
                   (targetDate is null || targetDate.Value.IsInRange(reclaim.StartDate, reclaim.EndDate ?? DateTimeOffset.MaxValue)))
            .Sum(reclaim => reclaim.Cost));
 }
 public static decimal GetFncPaymentCost(this CarePackage package, DateTimeOffset?targetDate = null)
 {
     return(package.Reclaims
            .FirstOrDefault(reclaim =>
                            reclaim.Type is ReclaimType.Fnc &&
                            reclaim.SubType is ReclaimSubType.FncPayment &&
                            reclaim.Status != ReclaimStatus.Cancelled &&
                            (targetDate is null || targetDate.Value.IsInRange(reclaim.StartDate, reclaim.EndDate ?? DateTimeOffset.MaxValue)))?
            .Cost ?? 0.0m);
 }
Exemple #21
0
        public static CarePackage SetCurrentDate(this CarePackage package, string date)
        {
            foreach (var reclaim in package.Reclaims)
            {
                reclaim.CurrentDateProvider = new MockCurrentDateProvider {
                    UtcNow = date.ToUtcDate()
                };
            }

            return(package);
        }
Exemple #22
0
    private void SpawnRandomCarePackage()
    {
        var       randomSpawn       = Random.Range(0, m_SpawnPoints.Count);
        var       randomCarePackage = Random.Range(0, m_CarePackages.Count);
        Transform spawnTransform    = m_SpawnPoints[randomSpawn].transform;
        Rigidbody carePackage       = m_CarePackages[randomCarePackage];

        CarePackage.PackageType CPType = GetCarePackageTypeByID(randomCarePackage);
        CarePackage.SpawnCarePackage(ref carePackage, spawnTransform, CPType, fromManager: true);
        ++m_ActiveCarePackages;
    }
        public CarePackageReclaim CreateCarePackageReclaim(
            CarePackage package, ClaimCollector collector,
            ReclaimType type, ReclaimSubType subType = ReclaimSubType.CareCharge13PlusWeeks)
        {
            var reclaim = TestDataHelper.CreateCarePackageReclaim(package.Id, collector, type, subType);

            _context.CarePackageReclaims.Add(reclaim);
            _context.SaveChanges();

            return(reclaim);
        }
 public static void AddHistoryEntry(
     this CarePackage package, string description,
     HistoryStatus status = HistoryStatus.PackageInformation, string moreInformation = null)
 {
     package.Histories.Add(new CarePackageHistory
     {
         Status                 = status,
         Description            = description,
         RequestMoreInformation = moreInformation
     });
 }
Exemple #25
0
        public async Task Part1_Example1()
        {
            // Arrange
            var data    = new long[] { 1, 2, 3, 6, 5, 4, 7, 8, 2 };
            var subject = new CarePackage(new IntcodeProgram(NullLogger <IntcodeProgram> .Instance), NullLogger <CarePackage> .Instance);

            // Act
            var result = await subject.GetBlockTileCountAsync(await data.ToChannelAsync());

            // Assert
            Assert.Equal(1, result);
        }
Exemple #26
0
        public async Task Part1_ConcreteExcercise()
        {
            // Arrange
            var input   = "1,380,379,385,1008,2267,610415,381,1005,381,12,99,109,2268,1101,0,0,383,1101,0,0,382,20102,1,382,1,20101,0,383,2,21101,37,0,0,1106,0,578,4,382,4,383,204,1,1001,382,1,382,1007,382,37,381,1005,381,22,1001,383,1,383,1007,383,22,381,1005,381,18,1006,385,69,99,104,-1,104,0,4,386,3,384,1007,384,0,381,1005,381,94,107,0,384,381,1005,381,108,1105,1,161,107,1,392,381,1006,381,161,1101,-1,0,384,1106,0,119,1007,392,35,381,1006,381,161,1101,0,1,384,21001,392,0,1,21102,1,20,2,21101,0,0,3,21102,138,1,0,1105,1,549,1,392,384,392,21002,392,1,1,21101,0,20,2,21101,3,0,3,21101,161,0,0,1106,0,549,1101,0,0,384,20001,388,390,1,20101,0,389,2,21102,1,180,0,1105,1,578,1206,1,213,1208,1,2,381,1006,381,205,20001,388,390,1,21002,389,1,2,21101,205,0,0,1106,0,393,1002,390,-1,390,1102,1,1,384,21002,388,1,1,20001,389,391,2,21102,228,1,0,1106,0,578,1206,1,261,1208,1,2,381,1006,381,253,20101,0,388,1,20001,389,391,2,21101,253,0,0,1105,1,393,1002,391,-1,391,1101,1,0,384,1005,384,161,20001,388,390,1,20001,389,391,2,21102,1,279,0,1105,1,578,1206,1,316,1208,1,2,381,1006,381,304,20001,388,390,1,20001,389,391,2,21101,304,0,0,1105,1,393,1002,390,-1,390,1002,391,-1,391,1101,1,0,384,1005,384,161,20102,1,388,1,20101,0,389,2,21101,0,0,3,21102,338,1,0,1105,1,549,1,388,390,388,1,389,391,389,20102,1,388,1,20101,0,389,2,21101,0,4,3,21102,1,365,0,1106,0,549,1007,389,21,381,1005,381,75,104,-1,104,0,104,0,99,0,1,0,0,0,0,0,0,265,16,17,1,1,18,109,3,21202,-2,1,1,21201,-1,0,2,21102,1,0,3,21102,414,1,0,1105,1,549,22101,0,-2,1,21202,-1,1,2,21101,429,0,0,1105,1,601,2102,1,1,435,1,386,0,386,104,-1,104,0,4,386,1001,387,-1,387,1005,387,451,99,109,-3,2106,0,0,109,8,22202,-7,-6,-3,22201,-3,-5,-3,21202,-4,64,-2,2207,-3,-2,381,1005,381,492,21202,-2,-1,-1,22201,-3,-1,-3,2207,-3,-2,381,1006,381,481,21202,-4,8,-2,2207,-3,-2,381,1005,381,518,21202,-2,-1,-1,22201,-3,-1,-3,2207,-3,-2,381,1006,381,507,2207,-3,-4,381,1005,381,540,21202,-4,-1,-1,22201,-3,-1,-3,2207,-3,-4,381,1006,381,529,22101,0,-3,-7,109,-8,2106,0,0,109,4,1202,-2,37,566,201,-3,566,566,101,639,566,566,2102,1,-1,0,204,-3,204,-2,204,-1,109,-4,2105,1,0,109,3,1202,-1,37,593,201,-2,593,593,101,639,593,593,21001,0,0,-2,109,-3,2105,1,0,109,3,22102,22,-2,1,22201,1,-1,1,21102,1,409,2,21102,1,463,3,21102,1,814,4,21102,1,630,0,1106,0,456,21201,1,1453,-2,109,-3,2105,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,2,2,0,2,2,0,2,2,2,0,0,0,2,2,2,2,0,2,2,2,2,2,0,2,2,2,2,0,2,0,0,0,0,1,1,0,0,2,0,0,2,2,0,0,0,2,2,0,2,2,0,0,0,2,2,0,2,2,2,2,0,0,2,2,0,0,2,0,2,0,1,1,0,0,2,2,2,0,0,0,2,2,2,2,0,0,2,2,0,2,0,2,0,2,2,0,2,2,2,0,2,2,0,2,2,2,0,1,1,0,2,0,0,2,2,2,0,2,2,0,2,0,2,2,2,2,0,0,2,2,2,0,2,2,0,0,0,0,2,2,0,0,2,0,1,1,0,2,2,2,0,0,0,2,2,2,0,2,2,2,2,2,0,0,0,2,2,0,2,2,2,0,2,0,0,0,0,0,2,2,0,1,1,0,2,2,2,2,2,2,0,0,2,2,2,0,0,0,0,2,0,0,2,0,2,2,2,2,0,0,2,2,2,2,2,2,2,0,1,1,0,0,0,2,0,0,2,2,2,0,2,0,0,0,0,2,0,0,0,0,2,0,2,0,0,0,2,0,0,2,0,2,2,2,0,1,1,0,2,0,0,2,2,0,0,0,2,0,0,0,2,2,2,2,0,2,2,0,2,2,0,2,2,2,2,2,2,2,2,0,0,0,1,1,0,2,0,0,0,2,0,2,2,2,2,2,0,0,2,0,2,2,0,0,2,2,0,2,2,0,2,2,0,2,0,0,2,2,0,1,1,0,2,0,2,2,0,2,2,0,0,0,0,0,2,2,0,2,0,0,0,2,2,0,2,2,2,2,2,2,2,2,2,2,2,0,1,1,0,0,0,0,2,0,2,2,2,2,0,2,2,0,2,2,2,0,2,2,0,2,2,2,0,2,0,0,2,2,0,2,0,0,0,1,1,0,0,2,2,2,0,2,0,2,0,2,2,2,0,0,2,2,0,2,2,2,0,0,0,0,2,0,2,2,0,2,0,2,2,0,1,1,0,0,2,2,2,2,0,2,2,0,0,0,0,0,0,0,0,0,2,2,2,2,0,0,0,0,2,0,2,2,2,0,2,0,0,1,1,0,2,0,2,2,2,2,2,2,0,0,0,0,0,0,2,2,0,2,2,2,2,0,0,2,2,2,2,2,0,0,0,2,2,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,72,10,67,45,58,25,55,73,97,49,19,51,58,95,30,82,74,9,98,96,38,64,30,45,14,73,42,5,3,61,68,23,18,14,9,16,21,7,77,39,38,16,82,17,58,87,90,64,52,1,96,67,66,16,65,15,22,41,69,90,93,92,96,45,68,17,63,51,15,61,51,93,65,55,42,76,48,52,31,98,6,88,69,65,65,30,51,88,4,13,36,90,80,23,31,42,63,86,52,15,79,78,59,77,57,71,84,81,73,56,1,5,7,86,75,31,63,76,21,73,16,41,86,15,78,85,2,79,63,54,79,65,87,13,86,96,81,69,27,76,8,48,5,79,10,74,76,86,95,55,72,52,23,41,50,46,68,29,86,61,96,29,34,40,86,86,1,20,90,35,69,64,50,51,75,65,93,19,5,15,96,3,88,8,43,66,88,72,84,69,42,4,95,51,80,81,27,75,92,22,45,54,63,51,82,91,13,25,54,41,84,84,29,98,50,91,11,40,69,13,47,42,72,46,87,31,27,98,65,94,26,51,79,39,29,38,42,46,25,36,26,66,12,93,58,1,61,41,37,57,60,60,9,70,63,26,56,1,27,5,11,93,17,48,95,19,79,16,14,16,29,79,56,16,26,37,50,10,38,53,4,10,3,57,20,59,16,51,88,66,74,91,56,42,84,30,36,31,36,58,68,66,91,36,71,30,39,96,50,84,76,95,14,89,75,59,77,66,36,88,62,60,3,45,13,39,48,33,59,21,19,35,90,81,66,52,75,34,70,55,56,47,22,20,87,73,73,76,73,8,96,55,46,5,1,64,27,8,37,87,50,8,79,74,63,26,43,44,2,85,91,28,13,16,15,55,87,94,28,86,66,29,34,46,18,41,37,94,63,31,78,48,17,4,25,62,15,10,18,19,97,50,78,5,79,5,70,64,86,61,58,59,61,5,71,68,14,24,17,56,85,52,64,92,45,90,94,55,47,5,56,59,20,15,41,36,58,55,25,47,45,69,58,36,44,80,94,52,84,17,27,20,44,51,93,10,56,77,45,29,93,63,96,95,47,31,63,69,64,74,53,34,36,20,14,40,30,61,86,15,3,94,61,43,75,59,64,41,34,98,32,65,73,18,30,46,66,38,68,25,96,16,37,54,38,44,26,52,1,2,21,93,37,26,4,45,69,82,59,34,55,34,77,88,46,70,32,56,82,10,20,31,40,20,55,3,3,93,95,65,56,61,68,41,35,62,20,58,55,42,41,40,33,51,6,52,84,27,62,81,32,35,87,97,79,7,97,77,40,48,74,4,6,36,58,59,25,6,5,84,7,44,51,88,37,9,30,29,26,91,41,72,39,24,68,58,49,80,49,43,98,43,92,9,49,64,10,96,50,86,56,2,72,58,80,57,77,61,74,14,42,50,55,40,21,77,20,19,16,80,84,92,27,32,37,80,59,69,13,11,19,6,94,54,88,51,69,41,54,68,36,82,68,19,77,85,37,5,58,61,72,5,67,17,35,29,18,71,46,5,29,8,93,97,36,37,25,93,27,33,93,79,10,84,75,6,91,98,34,32,37,70,18,84,52,32,11,88,44,69,58,92,52,68,77,39,90,9,58,74,1,53,56,64,75,46,59,39,52,32,41,62,81,75,7,93,29,89,51,34,31,93,70,94,30,98,68,3,60,2,2,49,31,15,65,11,78,70,2,50,29,9,9,85,65,52,28,95,55,77,98,29,65,56,51,32,44,42,82,14,29,22,5,29,65,86,84,88,58,63,10,13,13,51,97,17,57,19,39,83,72,93,15,54,31,83,3,43,21,83,74,2,86,47,25,89,20,11,68,80,29,21,58,69,610415";
            var subject = new CarePackage(new IntcodeProgram(NullLogger <IntcodeProgram> .Instance), NullLogger <CarePackage> .Instance);

            // Act
            var result = await subject.SolvePart1Async(input.ToMemoryStream());

            // Assert
            Assert.Equal("265", result);
        }
        public async void ShouldEndCarePackageReclaim()
        {
            var packageId = Guid.NewGuid();
            var reclaimId = Guid.NewGuid();

            var reclaim = new CarePackageReclaim
            {
                Id            = reclaimId,
                Cost          = 12.34m,
                CarePackageId = packageId,
                StartDate     = DateTimeOffset.UtcNow,
                Type          = ReclaimType.CareCharge,
                SubType       = ReclaimSubType.CareCharge13PlusWeeks
            };

            var package = new CarePackage
            {
                Id      = packageId,
                Details = new List <CarePackageDetail>
                {
                    new CarePackageDetail
                    {
                        Cost      = 34.12m,
                        Type      = PackageDetailType.CoreCost,
                        StartDate = DateTimeOffset.UtcNow.AddDays(-10),
                        EndDate   = DateTimeOffset.UtcNow.AddDays(10)
                    }
                },
                Reclaims =
                {
                    reclaim
                }
            };

            _carePackageReclaimGatewayMock
            .Setup(g => g.GetAsync(reclaimId, It.IsAny <bool>()))
            .ReturnsAsync(reclaim);

            _carePackageGatewayMock
            .Setup(g => g.GetPackageAsync(package.Id, It.IsAny <PackageFields>(), true))
            .ReturnsAsync(package);

            package.Reclaims.First().Status = ReclaimStatus.Active;

            var response = await _useCase.ExecuteAsync(reclaimId, new CarePackageReclaimEndRequest()
            {
                EndDate = package.Details.First().EndDate.Value.AddDays(-2)
            });

            _dbManagerMock.Verify(db => db.SaveAsync(It.IsAny <string>()), Times.Once);
            response.Status.Should().Be(ReclaimStatus.Ended);
            response.EndDate.Should().Be(package.Details.First().EndDate.Value.AddDays(-2));
        }
        private static string CalculatePackageStatus(CarePackage package, IPackageItem coreCost)
        {
            var today = DateTimeOffset.UtcNow.Date;

            return(package.Status switch
            {
                PackageStatus.Approved when coreCost.EndDate != null &&
                coreCost.EndDate.GetValueOrDefault().Date < today => "Ended",
                PackageStatus.Approved when IsValidDateRange(coreCost.StartDate, coreCost.EndDate) => "Active",
                PackageStatus.Approved => "Future",
                _ => package.Status.GetDisplayName()
            });
Exemple #29
0
        public FundedNursingCareGeneratorTests()
        {
            _package = new CarePackage
            {
                Id          = Guid.NewGuid(),
                SupplierId  = 1,
                PackageType = PackageType.NursingCare
            };

            var fncPayment = new CarePackageReclaim
            {
                Id                  = Guid.NewGuid(),
                Cost                = 700.0m,
                Status              = ReclaimStatus.Active,
                Type                = ReclaimType.Fnc,
                SubType             = ReclaimSubType.FncPayment,
                ClaimCollector      = ClaimCollector.Supplier,
                StartDate           = "01-12-2022".ToUtcDate(),
                EndDate             = "31-12-2022".ToUtcDate(),
                Package             = _package,
                CurrentDateProvider = new MockCurrentDateProvider {
                    Now = "15-12-2022".ToUtcDate()
                }
            };

            var fncReclaim = fncPayment.DeepCopy();

            fncReclaim.Id      = Guid.NewGuid();
            fncReclaim.SubType = ReclaimSubType.FncReclaim;
            fncReclaim.Cost    = Decimal.Negate(fncReclaim.Cost);

            _package.Reclaims.Add(fncPayment);
            _package.Reclaims.Add(fncReclaim);

            _fncPrices = new List <FundedNursingCarePrice>
            {
                new FundedNursingCarePrice
                {
                    ActiveFrom   = "01-01-2000".ToUtcDate(),
                    ActiveTo     = "01-01-2200".ToUtcDate(),
                    PricePerWeek = 700.0m
                }
            };

            var fundedNursingCareGateway = new Mock <IFundedNursingCareGateway>();

            fundedNursingCareGateway
            .Setup(g => g.GetFundedNursingCarePricesAsync())
            .ReturnsAsync(_fncPrices);

            _generator = new FundedNursingCareGenerator(_fncPrices);
        }
        private static void ValidateReclaimCostsAtDate(CarePackage package, DateTimeOffset targetDate)
        {
            var totalWeeklyCost = package.GetCoreCost() + package.GetAdditionalWeeklyCost(targetDate);
            var careChargesCost = package.GetCareChargesCost(null, targetDate);
            var fncCost         = package.GetFncPaymentCost(targetDate);

            if (careChargesCost + fncCost > totalWeeklyCost)
            {
                throw new ApiException(
                          $"Reclaim total {decimal.Round(careChargesCost, 2)} at date {targetDate: yyyy-MM-dd} is greater that package cost of {decimal.Round(totalWeeklyCost, 2)}",
                          HttpStatusCode.BadRequest);
            }
        }