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 }); }