Improve invoices status filter (#5248)

This commit is contained in:
d11n 2023-08-10 21:23:18 +03:00 committed by GitHub
parent b5d0188f21
commit c0fc31c69a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 40 additions and 41 deletions

View file

@ -662,54 +662,52 @@ namespace BTCPayServer.Services.Invoices
if (queryObject.OrderId is { Length: > 0 })
{
var statusSet = queryObject.OrderId.ToHashSet().ToArray();
query = query.Where(i => statusSet.Contains(i.OrderId));
var orderIdSet = queryObject.OrderId.ToHashSet().ToArray();
query = query.Where(i => orderIdSet.Contains(i.OrderId));
}
if (queryObject.ItemCode is { Length: > 0 })
{
var statusSet = queryObject.ItemCode.ToHashSet().ToArray();
query = query.Where(i => statusSet.Contains(i.ItemCode));
var itemCodeSet = queryObject.ItemCode.ToHashSet().ToArray();
query = query.Where(i => itemCodeSet.Contains(i.ItemCode));
}
if (queryObject.Status is { Length: > 0 })
var statusSet = queryObject.Status is { Length: > 0 }
? queryObject.Status.Select(s => s.ToLowerInvariant()).ToHashSet()
: new HashSet<string>();
var exceptionStatusSet = queryObject.ExceptionStatus is { Length: > 0 }
? queryObject.ExceptionStatus.Select(NormalizeExceptionStatus).ToHashSet()
: new HashSet<string>();
// We make sure here that the old filters still work
if (statusSet.Contains("paid"))
statusSet.Add("processing");
if (statusSet.Contains("processing"))
statusSet.Add("paid");
if (statusSet.Contains("confirmed"))
{
var statusSet = queryObject.Status.Select(s => s.ToLowerInvariant()).ToHashSet();
// We make sure here that the old filters still work
foreach (var status in queryObject.Status)
{
if (status == "paid")
statusSet.Add("processing");
if (status == "processing")
statusSet.Add("paid");
if (status == "confirmed")
{
statusSet.Add("complete");
statusSet.Add("settled");
}
if (status == "settled")
{
statusSet.Add("complete");
statusSet.Add("confirmed");
}
if (status == "complete")
{
statusSet.Add("settled");
statusSet.Add("confirmed");
}
}
query = query.Where(i => statusSet.Contains(i.Status));
statusSet.Add("complete");
statusSet.Add("settled");
}
if (statusSet.Contains("settled"))
{
statusSet.Add("complete");
statusSet.Add("confirmed");
}
if (statusSet.Contains("complete"))
{
statusSet.Add("settled");
statusSet.Add("confirmed");
}
if (statusSet.Any() || exceptionStatusSet.Any())
{
query = query.Where(i => statusSet.Contains(i.Status) || exceptionStatusSet.Contains(i.ExceptionStatus));
}
if (queryObject.Unusual != null)
{
var unused = queryObject.Unusual.Value;
query = query.Where(i => unused == (i.Status == "invalid" || !string.IsNullOrEmpty(i.ExceptionStatus)));
}
if (queryObject.ExceptionStatus is { Length: > 0 })
{
var exceptionStatusSet = queryObject.ExceptionStatus.Select(NormalizeExceptionStatus).ToHashSet().ToArray();
query = query.Where(i => exceptionStatusSet.Contains(i.ExceptionStatus));
var unusual = queryObject.Unusual.Value;
query = query.Where(i => unusual == (i.Status == "invalid" || !string.IsNullOrEmpty(i.ExceptionStatus)));
}
query = query.OrderByDescending(q => q.Created);

View file

@ -251,15 +251,16 @@
}
</button>
<div class="dropdown-menu" aria-labelledby="StatusOptionsToggle">
<a asp-action="ListInvoices" asp-route-storeId="@Model.StoreId" asp-route-count="@Model.Count" asp-route-searchTerm="@Model.Search.Toggle("status", "invalid")" class="dropdown-item @(HasArrayFilter("status", "invalid") ? "custom-active" : "")">Invalid</a>
<a asp-action="ListInvoices" asp-route-storeId="@Model.StoreId" asp-route-count="@Model.Count" asp-route-searchTerm="@Model.Search.Toggle("status", "processing")" class="dropdown-item @(HasArrayFilter("status", "processing") ? "custom-active" : "")">Processing</a>
<a asp-action="ListInvoices" asp-route-storeId="@Model.StoreId" asp-route-count="@Model.Count" asp-route-searchTerm="@Model.Search.Toggle("status", "settled")" class="dropdown-item @(HasArrayFilter("status", "settled") ? "custom-active" : "")">Settled</a>
<a asp-action="ListInvoices" asp-route-storeId="@Model.StoreId" asp-route-count="@Model.Count" asp-route-searchTerm="@Model.Search.Toggle("status", "processing")" class="dropdown-item @(HasArrayFilter("status", "processing") ? "custom-active" : "")">Processing</a>
<a asp-action="ListInvoices" asp-route-storeId="@Model.StoreId" asp-route-count="@Model.Count" asp-route-searchTerm="@Model.Search.Toggle("status", "expired")" class="dropdown-item @(HasArrayFilter("status", "expired") ? "custom-active" : "")">Expired</a>
<a asp-action="ListInvoices" asp-route-storeId="@Model.StoreId" asp-route-count="@Model.Count" asp-route-searchTerm="@Model.Search.Toggle("status", "invalid")" class="dropdown-item @(HasArrayFilter("status", "invalid") ? "custom-active" : "")">Invalid</a>
<hr class="dropdown-divider">
<a asp-action="ListInvoices" asp-route-storeId="@Model.StoreId" asp-route-count="@Model.Count" asp-route-searchTerm="@Model.Search.Toggle("exceptionstatus", "paidLate")" class="dropdown-item @(HasArrayFilter("exceptionstatus", "paidLate") ? "custom-active" : "")">Settled Late</a>
<a asp-action="ListInvoices" asp-route-storeId="@Model.StoreId" asp-route-count="@Model.Count" asp-route-searchTerm="@Model.Search.Toggle("exceptionstatus", "paidPartial")" class="dropdown-item @(HasArrayFilter("exceptionstatus", "paidPartial") ? "custom-active" : "")">Settled Partial</a>
<a asp-action="ListInvoices" asp-route-storeId="@Model.StoreId" asp-route-count="@Model.Count" asp-route-searchTerm="@Model.Search.Toggle("exceptionstatus", "paidOver")" class="dropdown-item @(HasArrayFilter("exceptionstatus", "paidOver") ? "custom-active" : "")">Settled Over</a>
<hr class="dropdown-divider">
<a asp-action="ListInvoices" asp-route-storeId="@Model.StoreId" asp-route-count="@Model.Count" asp-route-searchTerm="@Model.Search.Toggle("unusual", "true")" class="dropdown-item @(HasBooleanFilter("unusual") ? "custom-active" : "")">Unusual</a>
<hr class="dropdown-divider">
<a asp-action="ListInvoices" asp-route-storeId="@Model.StoreId" asp-route-count="@Model.Count" asp-route-searchTerm="@Model.Search.Toggle("includearchived", "true")" class="dropdown-item @(HasBooleanFilter("includearchived") ? "custom-active" : "")" id="StatusOptionsIncludeArchived">Archived</a>
</div>
</div>