示例#1
0
        public async Task <PackagePaymentViewResponse> GetAsync(Guid packageId, RequestParameters parameters)
        {
            var package = await _carePackageGateway
                          .GetPackageAsync(packageId, PackageFields.Supplier | PackageFields.ServiceUser, false)
                          .EnsureExistsAsync($"Package with id {packageId} not found");

            var invoiceStatuses = new[] { InvoiceStatus.Accepted };
            var payRunStatuses  = new[] { PayrunStatus.Paid, PayrunStatus.PaidWithHold };

            var packageLatestPayRun =
                await _payRunGateway.GetPackageLatestPayRunAsync(packageId, payRunStatuses, invoiceStatuses);

            var allInvoices = await _payRunInvoiceGateway.GetPackageInvoicesAsync(packageId, payRunStatuses,
                                                                                  invoiceStatuses, PayRunInvoiceFields.Invoice | PayRunInvoiceFields.Payrun, false);

            var payRunInvoices = allInvoices
                                 .Skip((parameters.PageNumber - 1) * parameters.PageSize)
                                 .Take(parameters.PageSize)
                                 .ToList();
            var pagedInvoices = PagedList <PayrunInvoice> .ToPagedList(payRunInvoices, allInvoices.Count, parameters.PageNumber,
                                                                       parameters.PageSize);

            var payments = new PagedResponse <PackagePaymentItemResponse>
            {
                PagingMetaData = pagedInvoices.PagingMetaData,
                Data           = pagedInvoices.Select(i => new PackagePaymentItemResponse
                {
                    PeriodFrom    = i.Payrun.StartDate.Date,
                    PeriodTo      = i.Payrun.EndDate.Date,
                    PayRunId      = i.PayrunId,
                    InvoiceId     = i.InvoiceId,
                    InvoiceNumber = i.Invoice.Number,
                    AmountPaid    = decimal.Round(i.Invoice.GrossTotal, 2)
                })
            };

            var packagePayment = new PackageTotalPaymentResponse
            {
                PackageId = package.Id,
                TotalPaid = decimal.Round(allInvoices.Sum(pi => pi.Invoice.GrossTotal), 2),
                DateTo    = packageLatestPayRun != null ? packageLatestPayRun.EndDate.Date : DateTime.Today
            };

            return(new PackagePaymentViewResponse
            {
                PackageId = package.Id,
                ServiceUserName = $"{package.ServiceUser.FirstName} {package.ServiceUser.MiddleName} {package.ServiceUser.LastName}",
                CedarId = package.Supplier.CedarId ?? 0,
                SupplierName = package.Supplier.SupplierName,
                PackageType = package.PackageType,
                Payments = payments,
                PackagePayment = packagePayment
            });
        }