public async Task <ActionResult <CarePackageReclaimResponse> > EndReclaim(
            Guid reclaimId, CarePackageReclaimEndRequest request,
            [FromServices] IEndCareChargeUseCase useCase)
        {
            var reclaim = await useCase.ExecuteAsync(reclaimId, request);

            return(Ok(reclaim.ToResponse()));
        }
Exemplo n.º 2
0
        public async Task <CarePackageReclaimDomain> ExecuteAsync(Guid reclaimId, CarePackageReclaimEndRequest request)
        {
            var reclaim = await _gateway
                          .GetAsync(reclaimId, false)
                          .EnsureExistsAsync($"Care package reclaim {reclaimId} not found");

            // Throw if reclaim is not a care charge
            if (reclaim.Type != ReclaimType.CareCharge)
            {
                throw new ApiException($"Not allowed. Reclaim not a care charge",
                                       HttpStatusCode.BadRequest);
            }

            // Throw if reclaim already ended
            if (reclaim.Status == ReclaimStatus.Ended)
            {
                throw new ApiException($"Care charge with id {reclaim.Id} already cancelled",
                                       HttpStatusCode.BadRequest);
            }

            var carePackage = await _carePackageGateway
                              .GetPackageAsync(reclaim.CarePackageId, PackageFields.Reclaims | PackageFields.Details, true)
                              .EnsureExistsAsync($"Care package with id {reclaim.CarePackageId} not found");

            var corePackage = carePackage.Details.SingleOrDefault(x => x.Type == PackageDetailType.CoreCost);

            // If the package is not ongoing, endDate must be range withinPackage
            if (corePackage.EndDate.HasValue && !request.EndDate.Value.IsInRange(corePackage.StartDate, corePackage.EndDate.Value))
            {
                throw new ApiException($"End date cannot be later core package date {corePackage.EndDate.Value}",
                                       HttpStatusCode.BadRequest);
            }

            if (request.EndDate < corePackage.StartDate)
            {
                throw new ApiException($"End date cannot be beyond core package date {corePackage.StartDate}",
                                       HttpStatusCode.BadRequest);
            }

            var currentReclaim = carePackage.Reclaims.First(r => r.Id == reclaim.Id);

            // If reclaim is active/pending cancel future reclaims
            if (currentReclaim.Status.In(ReclaimStatus.Active, ReclaimStatus.Pending))
            {
                var futureCareCharges = carePackage.Reclaims.Where(r =>
                                                                   r.Type == ReclaimType.CareCharge && r.StartDate.Date > reclaim.StartDate.Date &&
                                                                   r.Status.In(ReclaimStatus.Active, ReclaimStatus.Ended, ReclaimStatus.Pending));

                foreach (var careCharge in futureCareCharges)
                {
                    careCharge.Status = ReclaimStatus.Cancelled;
                    carePackage.Histories.Add(new CarePackageHistory
                    {
                        Status      = HistoryStatus.PackageInformation,
                        Description = $"{careCharge.SubType.GetDisplayName()} Cancelled",
                    });
                }
            }

            // If reclaim starts in the future, cancel it
            if (currentReclaim.StartDate.Date > DateTimeOffset.UtcNow.Date)
            {
                currentReclaim.Status = ReclaimStatus.Cancelled;
                carePackage.Histories.Add(new CarePackageHistory
                {
                    Status      = HistoryStatus.PackageInformation,
                    Description = $"{currentReclaim.SubType.GetDisplayName()} Cancelled",
                });
            }
            else
            {
                currentReclaim.EndDate = request.EndDate;
                currentReclaim.Status  = ReclaimStatus.Ended;
                carePackage.Histories.Add(new CarePackageHistory
                {
                    Status      = HistoryStatus.PackageInformation,
                    Description = $"{currentReclaim.SubType.GetDisplayName()} Ended",
                });
            }


            await _dbManager.SaveAsync();

            return(currentReclaim.ToDomain());
        }