mirror of
https://github.com/aljazceru/btcpayserver.git
synced 2025-12-18 14:34:23 +01:00
Add Paging to Pull Payments (#2997)
This commit is contained in:
@@ -131,31 +131,48 @@ namespace BTCPayServer.Controllers
|
||||
}
|
||||
|
||||
[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 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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Mvc.Rendering;
|
||||
|
||||
namespace BTCPayServer.Models.WalletViewModels
|
||||
{
|
||||
public class PullPaymentsModel
|
||||
public class PullPaymentsModel: BasePagingViewModel
|
||||
{
|
||||
public class PullPaymentModel
|
||||
{
|
||||
|
||||
@@ -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 @@
|
||||
<table class="table table-hover table-responsive-lg">
|
||||
<thead class="thead-inverse">
|
||||
<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">Refunded</th>
|
||||
<th scope="col" class="text-end">Actions</th>
|
||||
@@ -81,28 +110,36 @@
|
||||
<td class="text-end">
|
||||
<a asp-action="ViewPullPayment"
|
||||
asp-controller="PullPayment"
|
||||
asp-route-pullPaymentId="@pp.Id">View</a> -
|
||||
asp-route-pullPaymentId="@pp.Id">
|
||||
View
|
||||
</a> -
|
||||
<a class="pp-payout" asp-action="Payouts"
|
||||
asp-route-storeId="@Context.GetRouteValue("storeId")"
|
||||
asp-route-pullPaymentId="@pp.Id">Payouts</a> -
|
||||
asp-route-pullPaymentId="@pp.Id">
|
||||
Payouts
|
||||
</a> -
|
||||
<a asp-action="ArchivePullPayment"
|
||||
asp-route-storeId="@Context.GetRouteValue("storeId")"
|
||||
asp-route-pullPaymentId="@pp.Id"
|
||||
data-bs-toggle="modal"
|
||||
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>
|
||||
</tr>
|
||||
}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
<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"))" />
|
||||
<partial name="_Confirm" model="@(new ConfirmModel("Archive pull payment", "Do you really want to archive the pull payment?", "Archive"))"/>
|
||||
|
||||
@section PageFootContent {
|
||||
<script>
|
||||
@section PageFootContent {
|
||||
<script>
|
||||
var ppProgresses = document.getElementsByClassName("ppProgress");
|
||||
for (var i = 0; i < ppProgresses.length; i++) {
|
||||
var pp = ppProgresses[i];
|
||||
@@ -111,7 +148,7 @@
|
||||
pp.setAttribute("title", template.innerHTML);
|
||||
}
|
||||
</script>
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user