Beispiel #1
0
        public async Task <BrokerPackageViewDomain> GetBrokerPackageViewListAsync(
            BrokerPackageViewQueryParameters queryParameters)
        {
            var filteredPackageQuery = _dbContext.CarePackages
                                       .FilterBrokerViewPackages(queryParameters.ServiceUserId, queryParameters.ServiceUserName,
                                                                 queryParameters.Status, queryParameters.BrokerId, queryParameters.FromDate, queryParameters.ToDate);

            var packages = await filteredPackageQuery
                           .AsNoTracking()
                           .Select(cp => new BrokerPackageItemDomain
            {
                PackageId       = cp.Id,
                ServiceUserId   = cp.ServiceUserId,
                ServiceUserName =
                    $"{cp.ServiceUser.FirstName} {cp.ServiceUser.MiddleName ?? string.Empty} {cp.ServiceUser.LastName}",
                DateOfBirth   = cp.ServiceUser.DateOfBirth,
                Address       = cp.ServiceUser.AddressLine1,
                HackneyId     = cp.ServiceUser.HackneyId.ToString(),
                PackageType   = cp.PackageType.GetDisplayName(),
                PackageStatus = cp.Status.GetDisplayName(),
                BrokerName    = cp.Broker.Name,
                DateAssigned  = cp.DateCreated
            })
                           .ToListAsync();

            var preferences = FilterPreferences.BrokerListStatus();

            packages = packages
                       .OrderBy(x => preferences.IndexOf(x.PackageStatus)).ThenBy(x => x.DateAssigned)
                       .ToList();

            packages = packages
                       .Skip((queryParameters.PageNumber - 1) * queryParameters.PageSize)
                       .Take(queryParameters.PageSize).ToList();

            var packageCount = await filteredPackageQuery
                               .CountAsync();

            var pagedPackages = PagedList <BrokerPackageItemDomain> .ToPagedList(packages, packageCount, queryParameters.PageNumber, queryParameters.PageSize);

            var statusCount = await filteredPackageQuery
                              .Select(p => new { p.Id, p.Status })
                              .GroupBy(p => p.Status)
                              .Select(p => new CarePackageByStatusDomain
            {
                StatusName = p.Key.GetDisplayName(),
                Number     = p.Count()
            })
                              .ToListAsync();

            return(new BrokerPackageViewDomain
            {
                Packages = pagedPackages,
                StatusCount = statusCount.ToDictionary(statusGroup => statusGroup.StatusName, statusGroup => statusGroup.Number),
                PagingMetaData = pagedPackages.PagingMetaData
            });
        }
        public async Task <ServiceUserPackagesViewResponse> ExecuteAsync(Guid serviceUserId)
        {
            // Check service user exists
            var serviceUser = await _serviceUserGateway.GetByIdAsync(serviceUserId).EnsureExistsAsync($"Service user with id {serviceUserId} not found");

            const PackageFields fields = PackageFields.Details | PackageFields.Reclaims | PackageFields.Settings | PackageFields.Resources;
            var userPackages           = await _carePackageGateway.GetServiceUserPackagesAsync(serviceUserId, fields);

            var response = new ServiceUserPackagesViewResponse
            {
                ServiceUser = serviceUser.ToBasicDomain().ToResponse(),
                Packages    = new List <ServiceUserPackageViewItemResponse>()
            };

            var packagesResponse = new List <ServiceUserPackageViewItemResponse>();

            foreach (var carePackage in userPackages)
            {
                var coreCost = carePackage.Details
                               .SingleOrDefault(d => d.Type is PackageDetailType.CoreCost);

                var packageResponse = new ServiceUserPackageViewItemResponse
                {
                    PackageId             = carePackage.Id,
                    PackageStatus         = CalculatePackageStatus(carePackage, coreCost),
                    PackageType           = carePackage.PackageType.GetDisplayName(),
                    IsS117Client          = carePackage.Settings?.IsS117Client,
                    IsS117ClientConfirmed = carePackage.Settings?.IsS117ClientConfirmed,
                    DateAssigned          = carePackage.DateAssigned,
                    GrossTotal            = 0,
                    NetTotal = 0,
                    SocialWorkerCarePlanFileId   = carePackage.Resources?.Where(r => r.Type == PackageResourceType.CarePlanFile).OrderByDescending(x => x.DateCreated).FirstOrDefault()?.FileId,
                    SocialWorkerCarePlanFileName = carePackage.Resources?.Where(r => r.Type == PackageResourceType.CarePlanFile).OrderByDescending(x => x.DateCreated).FirstOrDefault()?.Name,
                    Notes        = new List <CarePackageHistoryResponse>(),
                    PackageItems = new List <CarePackageCostItemResponse>()
                };

                var additionalNeeds = carePackage.Details
                                      .Where(d => d.Type == PackageDetailType.AdditionalNeed).ToList();

                packageResponse.PackageItems = CollectPackageItems(carePackage, coreCost, additionalNeeds, carePackage.Reclaims.ToList());

                var preferences = FilterPreferences.PackageItemStatus();

                packageResponse.PackageItems = packageResponse.PackageItems.OrderBy(
                    item => preferences.IndexOf(item.Status)).ThenBy(x => x.StartDate);

                // Get care package history if package request i.e new, in-progress, not-approved
                if (carePackage.Status.In(PackageStatus.New, PackageStatus.InProgress, PackageStatus.NotApproved))
                {
                    var packageHistory = await _carePackageHistoryGateway.ListAsync(carePackage.Id);

                    packageResponse.Notes = packageHistory.OrderByDescending(h => h.Id).ToResponse();
                }

                var(grossTotal, netTotal)  = CalculateTotals(coreCost, additionalNeeds, carePackage.Reclaims.ToList());
                packageResponse.GrossTotal = grossTotal;
                packageResponse.NetTotal   = netTotal;

                packagesResponse.Add(packageResponse);
            }

            response.Packages = packagesResponse;

            return(response);
        }