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);
        }
Exemplo n.º 2
0
 public static bool IsReferenced(this IPackageItem packageItem, InvoiceItem invoiceItem)
 {
     return(packageItem switch
     {
         CarePackageDetail _ => packageItem.Id == invoiceItem.CarePackageDetailId,
         CarePackageReclaim _ => packageItem.Id == invoiceItem.CarePackageReclaimId,
         _ => throw new InvalidOperationException($"Unsupported package item type {packageItem.GetType()}")
     });
Exemplo n.º 3
0
 protected static string GetDetailItemName(CarePackageDetail detail)
 {
     switch (detail.Type)
     {
     case PackageDetailType.CoreCost:
         return(detail.Package.PackageType switch
         {
             PackageType.NursingCare => "Nursing Care Core",
             PackageType.ResidentialCare => "Residential Care Core",
             _ => throw new ArgumentException($"Unsupported {detail.Type}")
         });
Exemplo n.º 4
0
        public EndCarePackageUseCaseTests()
        {
            _package = TestDataHelper
                       .CreateCarePackage()
                       .AddCoreCost(1000.0m, _today.AddDays(-5), _today.AddDays(30));

            _coreCost = _package.GetCoreCostDetail();

            _dbManager = new Mock <IDatabaseManager>();
            var gateway = new Mock <ICarePackageGateway>();

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

            _useCase = new EndCarePackageUseCase(gateway.Object, _dbManager.Object);
        }
        public UpdateProvisionalCareChargeUseCaseTests()
        {
            _coreCost = new CarePackageDetail
            {
                Cost      = 34.12m,
                Type      = PackageDetailType.CoreCost,
                StartDate = _today.AddDays(-10),
                EndDate   = _today.AddDays(300)
            };

            _provisionalCharge = new CarePackageReclaim
            {
                Id        = Guid.NewGuid(),
                Cost      = 12.34m,
                StartDate = _coreCost.StartDate,
                EndDate   = _coreCost.EndDate,
                Type      = ReclaimType.CareCharge,
                SubType   = ReclaimSubType.CareChargeProvisional
            };

            _package = new CarePackage
            {
                Id          = Guid.NewGuid(),
                PackageType = PackageType.ResidentialCare,
                Details     = new List <CarePackageDetail> {
                    _coreCost
                },
                Reclaims = new List <CarePackageReclaim> {
                    _provisionalCharge
                }
            };

            var 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 UpdateProvisionalCareChargeUseCase(carePackageGateway.Object, dbManager.Object, Mapper);
        }
Exemplo n.º 6
0
        private static void AddCoreCost(CarePackage package, CarePackageBrokerageDomain brokerageInfo)
        {
            var coreCostDetail = package.Details.FirstOrDefault(d => d.Type is PackageDetailType.CoreCost);

            string subjective = package.PackageType == PackageType.ResidentialCare ? SubjectiveConstants.ResidentialCarePackageSubjectiveCode : SubjectiveConstants.NursingCarePackageSubjectiveCode;

            if (coreCostDetail is null)
            {
                coreCostDetail = new CarePackageDetail()
                {
                    Subjective = subjective
                };
                package.Details.Add(coreCostDetail);
            }

            coreCostDetail.Type       = PackageDetailType.CoreCost;
            coreCostDetail.Cost       = brokerageInfo.CoreCost;
            coreCostDetail.CostPeriod = PaymentPeriod.Weekly;
            coreCostDetail.StartDate  = brokerageInfo.StartDate;
            coreCostDetail.EndDate    = brokerageInfo.EndDate;
            coreCostDetail.Subjective = subjective;
        }
 public static CarePackageDetailDomain ToDomain(this CarePackageDetail input)
 {
     return(_mapper.Map <CarePackageDetailDomain>(input));
 }
Exemplo n.º 8
0
        public async Task Import(string fileName)
        {
            ExcelPackage.LicenseContext = LicenseContext.NonCommercial;

            var file      = new FileInfo(fileName);
            var excelRows = new List <ExcelRowModel>();

            using (var excelFile = new ExcelPackage(file))
            {
                ExcelWorksheet worksheet = excelFile.Workbook.Worksheets[0];
                for (int i = 2; i <= worksheet.Dimension.End.Row; i++)
                {
                    if (worksheet.Cells[$"A{i}"].Value == null)
                    {
                        continue;
                    }

                    var excelRow = new ExcelRowModel()
                    {
                        RowNumber        = i,
                        HackneyID        = worksheet.Cells[$"A{i}"].Value?.ToString(),
                        ServiceTypeGroup = worksheet.Cells[$"G{i}"].Value?.ToString(),
                        ServiceType      = worksheet.Cells[$"H{i}"].Value?.ToString(),
                        ElementType      = worksheet.Cells[$"I{i}"].Value?.ToString(),
                        CostPer          = worksheet.Cells[$"L{i}"].Value?.ToString(),
                        Quantity         = worksheet.Cells[$"N{i}"].Value?.ToString(),
                        UnitOfMeasure    = worksheet.Cells[$"N{i}"].Value?.ToString(),
                        StartDateOA      = worksheet.Cells[$"W{i}"].Value?.ToString(),
                        EndDateOA        = worksheet.Cells[$"X{i}"].Value?.ToString(),
                        BudgetCode       = worksheet.Cells[$"Y{i}"].Value?.ToString(),
                        SupplierID       = worksheet.Cells[$"AB{i}"].Value?.ToString(),
                        SupplierSite     = worksheet.Cells[$"AC{i}"].Value?.ToString()
                    };

                    excelRows.Add(excelRow);
                }
            }

            var           serviceUserPackages = excelRows.GroupBy(x => x.HackneyID, x => x).ToList();
            List <string> logs = new List <string>();

            foreach (var serviceUserPackage in serviceUserPackages)
            {
                bool hasError      = false;
                Guid serviceUserID = await CreateOrSkipUser(serviceUserPackage.Key);

                if (serviceUserID == Guid.Empty)
                {
                    logs.Add($"{DateTimeOffset.UtcNow}\tRow Number: {serviceUserPackage.FirstOrDefault().RowNumber}\tService user {serviceUserPackage.Key} not found");
                    hasError = true;
                }
                var primarySupportReasonID = GetPrimarySupportReasonID(serviceUserPackage.FirstOrDefault().BudgetCode.Replace("-", "").Substring(0, 5));
                if (primarySupportReasonID == 0)
                {
                    logs.Add($"{DateTimeOffset.UtcNow}\tRow Number: {serviceUserPackage.FirstOrDefault().RowNumber}\tPrimary support reason {serviceUserPackage.FirstOrDefault().BudgetCode.Substring(0, 5)} not found");
                    hasError = true;
                }

                if (!int.TryParse(serviceUserPackage.FirstOrDefault().SupplierID, out int supplierId))
                {
                    logs.Add($"{DateTimeOffset.UtcNow}\tRow Number: {serviceUserPackage.FirstOrDefault().RowNumber}\tSupplierID {serviceUserPackage.FirstOrDefault().SupplierID} must be number.");
                    hasError = true;
                }

                var supplierID = GetSupplierID(supplierId, serviceUserPackage.FirstOrDefault().SupplierSite);
                if (supplierID == 0)
                {
                    logs.Add($"{DateTimeOffset.UtcNow}\tRow Number: {serviceUserPackage.FirstOrDefault().RowNumber}\tService user {serviceUserPackage.Key}\tSupplierID: {supplierId}\tSupplierSite: {serviceUserPackage.FirstOrDefault().SupplierSite} not found.");
                    hasError = true;
                }

                if (hasError)
                {
                    continue;
                }

                var carePackage = new CarePackage()
                {
                    Id                = Guid.NewGuid(),
                    PackageType       = ExcelPackageModel.GetPackageType(serviceUserPackage.FirstOrDefault().ServiceType),
                    Status            = PackageStatus.Approved,
                    PackageScheduling = PackageScheduling.Temporary,
                    DateCreated       = DateTimeOffset.UtcNow,
                    CreatorId         = _applicationID,
                    Settings          = new CarePackageSettings()
                    {
                        Id          = Guid.NewGuid(),
                        CreatorId   = _applicationID,
                        DateCreated = DateTimeOffset.UtcNow,
                    },
                    SupplierId             = supplierID,
                    ServiceUserId          = serviceUserID,
                    PrimarySupportReasonId = primarySupportReasonID,
                };

                foreach (var package in serviceUserPackage)
                {
                    var excelPackageModel = new ExcelPackageModel(package.ElementType);
                    if (excelPackageModel.SubPackageType == ExcelPackageModel.ExcelPackageType.Detail)
                    {
                        var corePackage = new CarePackageDetail()
                        {
                            CarePackageId = carePackage.Id,
                            CreatorId     = _applicationID,
                            Cost          = Math.Abs(package.Cost),
                            DateCreated   = DateTimeOffset.UtcNow,
                            Id            = Guid.NewGuid(),
                            Type          = excelPackageModel.PackageDetailType,
                            UnitOfMeasure = package.UnitOfMeasure,
                            StartDate     = package.StartDate.UtcDateTime,
                            CostPeriod    = excelPackageModel.CostPeriod,
                            EndDate       = package.EndDate?.UtcDateTime,
                            Subjective    = package.Subjective
                        };
                        carePackage.Details.Add(corePackage);
                    }
                    else if (excelPackageModel.SubPackageType == ExcelPackageModel.ExcelPackageType.Reclaim)
                    {
                        var reclaim = new CarePackageReclaim()
                        {
                            CarePackageId  = carePackage.Id,
                            CreatorId      = _applicationID,
                            Cost           = excelPackageModel.ReclaimType == ReclaimType.Fnc ? package.Cost : Math.Abs(package.Cost),
                            Description    = package.ElementType,
                            DateCreated    = DateTimeOffset.UtcNow,
                            Id             = Guid.NewGuid(),
                            StartDate      = package.StartDate.UtcDateTime,
                            EndDate        = package.EndDate?.UtcDateTime,
                            ClaimCollector = excelPackageModel.ClaimCollector,
                            SubType        = excelPackageModel.ReclaimSubType,
                            Type           = excelPackageModel.ReclaimType,
                            Status         = ReclaimStatus.Active,
                            Subjective     = package.Subjective
                        };
                        carePackage.Reclaims.Add(reclaim);
                    }
                    else
                    {
                        logs.Add($"{DateTimeOffset.UtcNow}\tRow Number: {serviceUserPackage.FirstOrDefault().RowNumber}\tService user {serviceUserPackage.Key}\tPackage Type {package.ElementType} is not valid.");
                    }
                }

                SyncFncClaimCollector(carePackage.Reclaims);

                _databaseContext.CarePackages.Add(carePackage);
            }

            File.WriteAllLines($"{fileName}_logs.txt", logs);
            _databaseContext.SaveChanges();
        }
        private static void ValidateProvisionalCareChargeAsync(CarePackageReclaimCreationDomain reclaimCreationDomain, CarePackage carePackage, CarePackageDetail coreCostDetail)
        {
            var validReclaimStatuses = new[] { ReclaimStatus.Active, ReclaimStatus.Pending, ReclaimStatus.Ended };

            if (reclaimCreationDomain.SubType != ReclaimSubType.CareChargeProvisional)
            {
                throw new ApiException($"Cannot create {reclaimCreationDomain.SubType.GetDisplayName()}. Manage other care charges types in the Care Charges menu",
                                       HttpStatusCode.BadRequest);
            }

            if (carePackage.Reclaims.Any(cc => cc.Type == ReclaimType.CareCharge && cc.SubType == ReclaimSubType.CareChargeProvisional && cc.Status.In(validReclaimStatuses)))
            {
                throw new ApiException($"Provisional Care charge assessment for this package already done",
                                       HttpStatusCode.BadRequest);
            }

            if (carePackage.Reclaims.Any(cc => cc.Type == ReclaimType.CareCharge && cc.SubType != ReclaimSubType.CareChargeProvisional))
            {
                throw new ApiException($"Care charge assessment for this package already done. Manage care charges for this package in the Care Charges menu",
                                       HttpStatusCode.BadRequest);
            }

            // Start date of provisional CC cannot be before package start date
            if (!reclaimCreationDomain.StartDate.IsInRange(coreCostDetail.StartDate, coreCostDetail.EndDate ?? DateTimeOffset.UtcNow.AddYears(10)))
            {
                throw new ApiException($"{ReclaimSubType.CareChargeProvisional.GetDisplayName()} start date must be equal or greater than {coreCostDetail.StartDate.Date}", HttpStatusCode.UnprocessableEntity);
            }

            // End date of provisional CC cannot be before package end date
            if (reclaimCreationDomain.EndDate != null)
            {
                var provisionalCareChargeEndDate = (DateTimeOffset)reclaimCreationDomain.EndDate;
                if (coreCostDetail.EndDate != null && !provisionalCareChargeEndDate.IsInRange(coreCostDetail.StartDate, (DateTimeOffset)coreCostDetail.EndDate))
                {
                    throw new ApiException(
                              $"{reclaimCreationDomain.SubType} end date is invalid. Must be in the range {coreCostDetail.StartDate} - {coreCostDetail.EndDate}", HttpStatusCode.UnprocessableEntity);
                }
            }

            // If provisional cc is set to be ongoing, force end date to be the end date of the package
            if (coreCostDetail.EndDate != null && reclaimCreationDomain.EndDate == null)
            {
                reclaimCreationDomain.EndDate = coreCostDetail.EndDate;
            }
        }