Add Paging to Pull Payments (#2997)

This commit is contained in:
Andrew Camilleri
2021-10-22 08:10:59 +02:00
committed by GitHub
parent 9b0d1a23dc
commit c46a69e1bd
4 changed files with 89 additions and 32 deletions

View File

@@ -131,31 +131,48 @@ namespace BTCPayServer.Controllers
} }
[HttpGet("")] [HttpGet("")]
public async Task<IActionResult> PullPayments(string storeId) public async Task<IActionResult> 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 now = DateTimeOffset.UtcNow;
var pps = await ctx.PullPayments.Where(p => p.StoreId == storeId && !p.Archived) var ppsQuery = ctx.PullPayments
.OrderByDescending(p => p.StartDate) .Include(data => data.Payouts)
.Select(o => new .Where(p => p.StoreId == storeId && !p.Archived);
{
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 vm = new PullPaymentsModel();
foreach (var o in pps) if (sortOrder != null)
{ {
var pp = o.PullPayment; switch (sortOrder)
var totalCompleted = o.Completed.Where(o => o.IsInPeriod(pp, now)) {
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(); .Select(o => o.GetBlob(_jsonSerializerSettings).Amount).Sum();
var totalAwaiting = o.Awaiting.Where(o => o.IsInPeriod(pp, now)) var totalAwaiting = pp.Payouts.Where(p => (p.State == PayoutState.AwaitingPayment ||
.Select(o => o.GetBlob(_jsonSerializerSettings).Amount).Sum(); p.State == PayoutState.AwaitingApproval) &&
p.IsInPeriod(pp, now)).Select(o => o.GetBlob(_jsonSerializerSettings).Amount).Sum();;
var ppBlob = pp.GetBlob(); var ppBlob = pp.GetBlob();
var ni = _currencyNameTable.GetCurrencyData(ppBlob.Currency, true); var ni = _currencyNameTable.GetCurrencyData(ppBlob.Currency, true);
var nfi = _currencyNameTable.GetNumberFormatInfo(ppBlob.Currency, true); var nfi = _currencyNameTable.GetNumberFormatInfo(ppBlob.Currency, true);

View File

@@ -23,7 +23,9 @@ namespace BTCPayServer
else if (model is UsersViewModel) else if (model is UsersViewModel)
prop = typeof(UserPrefsCookie).GetProperty(nameof(UserPrefsCookie.UsersQuery)); prop = typeof(UserPrefsCookie).GetProperty(nameof(UserPrefsCookie.UsersQuery));
else if (model is PayoutsModel) 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 else
throw new Exception("Unsupported BasePagingViewModel for cookie user preferences saving"); throw new Exception("Unsupported BasePagingViewModel for cookie user preferences saving");
@@ -82,6 +84,7 @@ namespace BTCPayServer
public ListQueryDataHolder PaymentRequestsQuery { get; set; } public ListQueryDataHolder PaymentRequestsQuery { get; set; }
public ListQueryDataHolder UsersQuery { get; set; } public ListQueryDataHolder UsersQuery { get; set; }
public ListQueryDataHolder PayoutsQuery { get; set; } public ListQueryDataHolder PayoutsQuery { get; set; }
public ListQueryDataHolder PullPaymentsQuery { get; set; }
} }
class ListQueryDataHolder class ListQueryDataHolder

View File

@@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Mvc.Rendering;
namespace BTCPayServer.Models.WalletViewModels namespace BTCPayServer.Models.WalletViewModels
{ {
public class PullPaymentsModel public class PullPaymentsModel: BasePagingViewModel
{ {
public class PullPaymentModel public class PullPaymentModel
{ {

View File

@@ -5,6 +5,26 @@
Layout = "../Shared/_NavLayout.cshtml"; Layout = "../Shared/_NavLayout.cshtml";
ViewData["NavPartialName"] = "../Stores/_Nav"; ViewData["NavPartialName"] = "../Stores/_Nav";
ViewData.SetActivePageAndTitle(StoreNavPages.PullPayments, "Pull payments", Context.GetStoreData().StoreName); 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 { @section PageHeadContent {
@@ -56,7 +76,16 @@
<table class="table table-hover table-responsive-lg"> <table class="table table-hover table-responsive-lg">
<thead class="thead-inverse"> <thead class="thead-inverse">
<tr> <tr>
<th scope="col">Start</th> <th scope="col">
<a
asp-action="PullPayments"
asp-route-sortOrder="@(nextStartDateSortOrder ?? "asc")"
class="text-nowrap"
title="@(nextStartDateSortOrder == "desc" ? sortByAsc : sortByDesc)">
Start
<span class="fa @(sortIconClass)"></span>
</a>
</th>
<th scope="col">Name</th> <th scope="col">Name</th>
<th scope="col">Refunded</th> <th scope="col">Refunded</th>
<th scope="col" class="text-end">Actions</th> <th scope="col" class="text-end">Actions</th>
@@ -81,28 +110,36 @@
<td class="text-end"> <td class="text-end">
<a asp-action="ViewPullPayment" <a asp-action="ViewPullPayment"
asp-controller="PullPayment" asp-controller="PullPayment"
asp-route-pullPaymentId="@pp.Id">View</a> - asp-route-pullPaymentId="@pp.Id">
View
</a> -
<a class="pp-payout" asp-action="Payouts" <a class="pp-payout" asp-action="Payouts"
asp-route-storeId="@Context.GetRouteValue("storeId")" asp-route-storeId="@Context.GetRouteValue("storeId")"
asp-route-pullPaymentId="@pp.Id">Payouts</a> - asp-route-pullPaymentId="@pp.Id">
Payouts
</a> -
<a asp-action="ArchivePullPayment" <a asp-action="ArchivePullPayment"
asp-route-storeId="@Context.GetRouteValue("storeId")" asp-route-storeId="@Context.GetRouteValue("storeId")"
asp-route-pullPaymentId="@pp.Id" asp-route-pullPaymentId="@pp.Id"
data-bs-toggle="modal" data-bs-toggle="modal"
data-bs-target="#ConfirmModal" data-bs-target="#ConfirmModal"
data-description="Do you really want to archive the pull payment <strong>@pp.Name</strong>?">Archive</a> data-description="Do you really want to archive the pull payment <strong>@pp.Name</strong>?">
Archive
</a>
</td> </td>
</tr> </tr>
} }
</tbody> </tbody>
</table> </table>
</div>
</div>
<partial name="_Confirm" model="@(new ConfirmModel("Archive pull payment", "Do you really want to archive the pull payment?", "Archive"))" />
@section PageFootContent { </div>
<script> <vc:pager view-model="Model"/>
</div>
<partial name="_Confirm" model="@(new ConfirmModel("Archive pull payment", "Do you really want to archive the pull payment?", "Archive"))"/>
@section PageFootContent {
<script>
var ppProgresses = document.getElementsByClassName("ppProgress"); var ppProgresses = document.getElementsByClassName("ppProgress");
for (var i = 0; i < ppProgresses.length; i++) { for (var i = 0; i < ppProgresses.length; i++) {
var pp = ppProgresses[i]; var pp = ppProgresses[i];
@@ -111,7 +148,7 @@
pp.setAttribute("title", template.innerHTML); pp.setAttribute("title", template.innerHTML);
} }
</script> </script>
} }
} }
else else
{ {