diff --git a/BTCPayServer/Controllers/StorePullPaymentsController.PullPayments.cs b/BTCPayServer/Controllers/StorePullPaymentsController.PullPayments.cs index 4d18567bc..61210397e 100644 --- a/BTCPayServer/Controllers/StorePullPaymentsController.PullPayments.cs +++ b/BTCPayServer/Controllers/StorePullPaymentsController.PullPayments.cs @@ -131,31 +131,48 @@ namespace BTCPayServer.Controllers } [HttpGet("")] - public async Task PullPayments(string storeId) + public async Task PullPayments(string storeId, int skip = 0, int count = 50, + string sortOrder = "desc") { - using var ctx = this._dbContextFactory.CreateContext(); + await using var ctx = _dbContextFactory.CreateContext(); var now = DateTimeOffset.UtcNow; - var pps = await ctx.PullPayments.Where(p => p.StoreId == storeId && !p.Archived) - .OrderByDescending(p => p.StartDate) - .Select(o => new - { - PullPayment = o, - Awaiting = o.Payouts - .Where(p => p.State == PayoutState.AwaitingPayment || p.State == PayoutState.AwaitingApproval), - Completed = o.Payouts - .Where(p => p.State == PayoutState.Completed || p.State == PayoutState.InProgress) - }) - .ToListAsync(); + var ppsQuery = ctx.PullPayments + .Include(data => data.Payouts) + .Where(p => p.StoreId == storeId && !p.Archived); - var vm = new PullPaymentsModel(); - foreach (var o in pps) + if (sortOrder != null) { - var pp = o.PullPayment; - var totalCompleted = o.Completed.Where(o => o.IsInPeriod(pp, now)) + switch (sortOrder) + { + case "desc": + ViewData["NextStartSortOrder"] = "asc"; + ppsQuery = ppsQuery.OrderByDescending(p => p.StartDate); + break; + case "asc": + ppsQuery = ppsQuery.OrderBy(p => p.StartDate); + ViewData["NextStartSortOrder"] = "desc"; + break; + } + } + + var vm = this.ParseListQuery(new PullPaymentsModel() + { + Skip = skip, Count = count, Total = await ppsQuery.CountAsync() + }); + var pps = (await ppsQuery + .Skip(vm.Skip) + .Take(vm.Count) + .ToListAsync() + ); + foreach (var pp in pps) + { + var totalCompleted = pp.Payouts.Where(p => (p.State == PayoutState.Completed || + p.State == PayoutState.InProgress) && p.IsInPeriod(pp, now)) .Select(o => o.GetBlob(_jsonSerializerSettings).Amount).Sum(); - var totalAwaiting = o.Awaiting.Where(o => o.IsInPeriod(pp, now)) - .Select(o => o.GetBlob(_jsonSerializerSettings).Amount).Sum(); + var totalAwaiting = pp.Payouts.Where(p => (p.State == PayoutState.AwaitingPayment || + p.State == PayoutState.AwaitingApproval) && + p.IsInPeriod(pp, now)).Select(o => o.GetBlob(_jsonSerializerSettings).Amount).Sum();; var ppBlob = pp.GetBlob(); var ni = _currencyNameTable.GetCurrencyData(ppBlob.Currency, true); var nfi = _currencyNameTable.GetNumberFormatInfo(ppBlob.Currency, true); diff --git a/BTCPayServer/Extensions/ControllerBaseExtensions.cs b/BTCPayServer/Extensions/ControllerBaseExtensions.cs index 6d810a00f..cc03fe36d 100644 --- a/BTCPayServer/Extensions/ControllerBaseExtensions.cs +++ b/BTCPayServer/Extensions/ControllerBaseExtensions.cs @@ -23,7 +23,9 @@ namespace BTCPayServer else if (model is UsersViewModel) prop = typeof(UserPrefsCookie).GetProperty(nameof(UserPrefsCookie.UsersQuery)); else if (model is PayoutsModel) - prop = typeof(UserPrefsCookie).GetProperty(nameof(UserPrefsCookie.UsersQuery)); + prop = typeof(UserPrefsCookie).GetProperty(nameof(UserPrefsCookie.PayoutsQuery)); + else if (model is PullPaymentsModel) + prop = typeof(UserPrefsCookie).GetProperty(nameof(UserPrefsCookie.PullPaymentsQuery)); else throw new Exception("Unsupported BasePagingViewModel for cookie user preferences saving"); @@ -82,6 +84,7 @@ namespace BTCPayServer public ListQueryDataHolder PaymentRequestsQuery { get; set; } public ListQueryDataHolder UsersQuery { get; set; } public ListQueryDataHolder PayoutsQuery { get; set; } + public ListQueryDataHolder PullPaymentsQuery { get; set; } } class ListQueryDataHolder diff --git a/BTCPayServer/Models/WalletViewModels/PullPaymentsModel.cs b/BTCPayServer/Models/WalletViewModels/PullPaymentsModel.cs index 2ebaf59e8..2f83cd2c3 100644 --- a/BTCPayServer/Models/WalletViewModels/PullPaymentsModel.cs +++ b/BTCPayServer/Models/WalletViewModels/PullPaymentsModel.cs @@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Mvc.Rendering; namespace BTCPayServer.Models.WalletViewModels { - public class PullPaymentsModel + public class PullPaymentsModel: BasePagingViewModel { public class PullPaymentModel { diff --git a/BTCPayServer/Views/StorePullPayments/PullPayments.cshtml b/BTCPayServer/Views/StorePullPayments/PullPayments.cshtml index 1b5e1608e..ff4ae4ab8 100644 --- a/BTCPayServer/Views/StorePullPayments/PullPayments.cshtml +++ b/BTCPayServer/Views/StorePullPayments/PullPayments.cshtml @@ -5,6 +5,26 @@ Layout = "../Shared/_NavLayout.cshtml"; ViewData["NavPartialName"] = "../Stores/_Nav"; ViewData.SetActivePageAndTitle(StoreNavPages.PullPayments, "Pull payments", Context.GetStoreData().StoreName); + var nextStartDateSortOrder = (string)ViewData["NextStartSortOrder"]; + String startDateSortOrder = null; + switch (nextStartDateSortOrder) + { + case "asc": + startDateSortOrder = "desc"; + break; + case "desc": + startDateSortOrder = "asc"; + break; + } + + var sortIconClass = "fa-sort"; + if (startDateSortOrder != null) + { + sortIconClass = $"fa-sort-alpha-{startDateSortOrder}"; + } + + var sortByDesc = "Sort by descending..."; + var sortByAsc = "Sort by ascending..."; } @section PageHeadContent { @@ -56,7 +76,16 @@ - + @@ -81,28 +110,36 @@ }
Start + + Start + + + Name Refunded Actions View - + asp-route-pullPaymentId="@pp.Id"> + View + - Payouts - + asp-route-pullPaymentId="@pp.Id"> + Payouts + - Archive + data-description="Do you really want to archive the pull payment @pp.Name?"> + Archive +
- - - - - @section PageFootContent { - - } +} } else {