2020-07-17 06:24:41 +02:00
|
|
|
@model InvoicesModel
|
2017-09-13 08:47:34 +02:00
|
|
|
@{
|
2021-04-08 15:32:42 +02:00
|
|
|
ViewData.SetActivePageAndTitle(InvoiceNavPages.Index, "Invoices");
|
2020-08-24 06:57:07 +02:00
|
|
|
var storeIds = string.Join("", Model.StoreIds.Select(storeId => $",storeid:{storeId}"));
|
2018-11-09 09:13:45 +01:00
|
|
|
}
|
2021-05-19 04:39:27 +02:00
|
|
|
|
|
|
|
@section PageHeadContent {
|
|
|
|
<style type="text/css">
|
|
|
|
.invoice-payments {
|
|
|
|
padding-left: 2rem;
|
|
|
|
}
|
|
|
|
|
|
|
|
.invoice-payments h3 {
|
|
|
|
font-size: 15px;
|
|
|
|
font-weight: bold;
|
|
|
|
}
|
|
|
|
|
|
|
|
.wraptext200 {
|
|
|
|
max-width: 200px;
|
|
|
|
text-overflow: ellipsis;
|
|
|
|
overflow: hidden;
|
|
|
|
display: block;
|
|
|
|
white-space: nowrap;
|
|
|
|
}
|
|
|
|
|
|
|
|
.pavpill {
|
|
|
|
display: inline-block;
|
|
|
|
padding: 0.3em 0.5em;
|
|
|
|
font-size: 85%;
|
|
|
|
font-weight: 500;
|
|
|
|
line-height: 1;
|
|
|
|
text-align: center;
|
|
|
|
white-space: nowrap;
|
|
|
|
vertical-align: baseline;
|
2021-06-06 13:44:54 +02:00
|
|
|
border-radius: 4px;
|
2021-05-19 04:39:27 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
.badge .dropdown-toggle {
|
|
|
|
cursor: pointer;
|
|
|
|
padding: 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
.dropdown-item {
|
|
|
|
cursor: pointer;
|
|
|
|
}
|
|
|
|
|
|
|
|
.badge-new {
|
|
|
|
background: #d4edda;
|
|
|
|
color: #000;
|
|
|
|
}
|
|
|
|
|
|
|
|
.badge-expired {
|
|
|
|
background: #eee;
|
|
|
|
color: #000;
|
|
|
|
}
|
|
|
|
|
|
|
|
.badge-invalid {
|
|
|
|
background: #c94a47;
|
|
|
|
color: #fff;
|
|
|
|
}
|
|
|
|
|
|
|
|
.badge-confirmed,
|
|
|
|
.badge-paid {
|
|
|
|
background: #f1c332;
|
|
|
|
color: #000;
|
|
|
|
}
|
|
|
|
|
|
|
|
.badge-complete {
|
|
|
|
background: #329f80;
|
|
|
|
color: #fff;
|
|
|
|
}
|
|
|
|
</style>
|
|
|
|
}
|
|
|
|
|
|
|
|
@section PageFootContent {
|
2020-11-06 12:42:26 +01:00
|
|
|
@*Without async, somehow selenium do not manage to click on links in this page*@
|
|
|
|
<script src="~/modal/btcpay.js" asp-append-version="true" async></script>
|
2021-05-19 04:39:27 +02:00
|
|
|
|
|
|
|
@* Custom Range Modal *@
|
|
|
|
<script>
|
|
|
|
$('#btnCustomRangeDate').on('click', function (sender) {
|
|
|
|
var filterString = "";
|
|
|
|
|
|
|
|
var dtpStartDate = $("#dtpStartDate").val();
|
|
|
|
if (dtpStartDate !== null && dtpStartDate !== "") {
|
|
|
|
filterString = "startDate%3A" + dtpStartDate;
|
|
|
|
}
|
|
|
|
|
|
|
|
var dtpEndDate = $("#dtpEndDate").val();
|
|
|
|
if (dtpEndDate !== null && dtpEndDate !== "") {
|
|
|
|
if (filterString !== "") {
|
|
|
|
filterString += ",";
|
|
|
|
}
|
|
|
|
filterString += "endDate%3A" + dtpEndDate;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (filterString !== "") {
|
|
|
|
var redirectUri = "/invoices?Count=" + $("#Count").val() +
|
|
|
|
"&timezoneoffset=" + $("#TimezoneOffset").val() +
|
|
|
|
"&SearchTerm=" + filterString;
|
|
|
|
|
|
|
|
window.location.href = redirectUri;
|
|
|
|
} else {
|
|
|
|
$("#dtpStartDate").next().trigger("focus");
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
function selectAll(e)
|
|
|
|
{
|
|
|
|
var items = document.getElementsByClassName("selector");
|
|
|
|
for (var i = 0; i < items.length; i++) {
|
|
|
|
items[i].checked = e.checked;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function getDateStringWithOffset(hoursDiff) {
|
|
|
|
var datenow = new Date();
|
|
|
|
var newDate = new Date(datenow.getTime() - (hoursDiff * 60 * 60 * 1000));
|
|
|
|
var str = newDate.toLocaleDateString() + " " + newDate.toLocaleTimeString();
|
|
|
|
return str;
|
|
|
|
}
|
|
|
|
|
|
|
|
function changeInvoiceState(sender, invoiceId, newState) {
|
|
|
|
var pavpill = $("#pavpill_" + invoiceId);
|
|
|
|
var originalHtml = pavpill.html();
|
|
|
|
pavpill.html("<span class='fa fa-bitcoin fa-spin' style='margin-left:16px;'></span>");
|
|
|
|
|
|
|
|
$.post("invoices/" + invoiceId + "/changestate/" + newState)
|
|
|
|
.done(function (data) {
|
|
|
|
var statusHtml = "<span class='badge badge-" + newState + "'>" + data.statusString + " <span class='fa fa-check'></span></span>";
|
|
|
|
pavpill.replaceWith(statusHtml);
|
|
|
|
})
|
|
|
|
.fail(function (data) {
|
|
|
|
pavpill.html(originalHtml.replace("dropdown-menu pull-right show", "dropdown-menu pull-right"));
|
|
|
|
alert("Invoice state update failed");
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
document.addEventListener("DOMContentLoaded", function () {
|
|
|
|
var timezoneOffset = new Date().getTimezoneOffset();
|
|
|
|
$(".export-link, a.dropdown-item").each(function () {
|
|
|
|
this.href = this.href.replace("timezoneoffset=0", "timezoneoffset=" + timezoneOffset);
|
|
|
|
});
|
|
|
|
|
|
|
|
$("#invoices")
|
|
|
|
.on("click", ".invoice-row .invoice-details-toggle", function(e) {
|
|
|
|
e.preventDefault();
|
|
|
|
e.stopPropagation(true);
|
|
|
|
|
|
|
|
const $btnToggle = $(e.currentTarget);
|
|
|
|
const $invoiceRow = $btnToggle.parents(".invoice-row");
|
|
|
|
const $detailsRow = $invoiceRow.next(".invoice-details-row");
|
|
|
|
|
|
|
|
$detailsRow.toggle(0, function () {
|
|
|
|
const $icon = $btnToggle.children().first();
|
|
|
|
if ($(this).is(':visible')) {
|
|
|
|
$icon.removeClass('fa-angle-double-down').addClass('fa-angle-double-up');
|
|
|
|
} else {
|
|
|
|
$icon.removeClass('fa-angle-double-up').addClass('fa-angle-double-down');
|
|
|
|
}
|
|
|
|
});
|
|
|
|
})
|
|
|
|
.on("click", ".invoice-row", function(e) {
|
|
|
|
const $invoiceRow = $(e.currentTarget);
|
|
|
|
if (!$(e.target).is("a,.badge,.selector")) {
|
|
|
|
$invoiceRow.find(".selector").trigger("click");
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
</script>
|
2017-09-13 08:47:34 +02:00
|
|
|
}
|
2021-05-19 04:39:27 +02:00
|
|
|
|
2019-06-06 11:47:31 +02:00
|
|
|
@Html.HiddenFor(a => a.Count)
|
2017-09-13 08:47:34 +02:00
|
|
|
<section>
|
2017-10-27 10:53:04 +02:00
|
|
|
<div class="container">
|
2021-05-19 04:39:27 +02:00
|
|
|
<partial name="_StatusMessage" />
|
2017-09-13 08:47:34 +02:00
|
|
|
|
2021-04-08 15:32:42 +02:00
|
|
|
<div class="d-sm-flex align-items-center justify-content-between mb-4">
|
|
|
|
<h2 class="mb-0">
|
|
|
|
@ViewData["Title"]
|
|
|
|
<small>
|
2021-07-06 10:35:42 +02:00
|
|
|
<a href="https://docs.btcpayserver.org/PaymentRequests/" class="ms-1" target="_blank" rel="noreferrer noopener">
|
2021-04-08 15:32:42 +02:00
|
|
|
<span class="fa fa-question-circle-o text-secondary" title="More information..."></span>
|
|
|
|
</a>
|
|
|
|
</small>
|
|
|
|
</h2>
|
|
|
|
<a id="CreateNewInvoice" asp-action="CreateInvoice" class="btn btn-primary mt-3 mt-sm-0">
|
|
|
|
<span class="fa fa-plus"></span>
|
|
|
|
Create an invoice
|
|
|
|
</a>
|
2018-10-12 03:09:13 +02:00
|
|
|
</div>
|
|
|
|
|
2020-08-24 06:57:07 +02:00
|
|
|
<div class="row">
|
2021-05-19 04:39:27 +02:00
|
|
|
<div class="col-12 col-lg-6 mb-5 mb-lg-2 ms-auto">
|
2020-08-24 06:57:07 +02:00
|
|
|
<form asp-action="ListInvoices" method="get">
|
|
|
|
<input type="hidden" asp-for="Count"/>
|
|
|
|
<input asp-for="TimezoneOffset" type="hidden"/>
|
|
|
|
<div class="input-group">
|
2021-05-19 04:39:27 +02:00
|
|
|
<a href="#help" class="input-group-text text-secondary text-decoration-none" data-bs-toggle="collapse">
|
|
|
|
<span class="fa fa-filter"></span>
|
|
|
|
</a>
|
2020-08-24 06:57:07 +02:00
|
|
|
<input asp-for="SearchTerm" class="form-control"/>
|
2021-05-19 04:39:27 +02:00
|
|
|
<button type="submit" class="btn btn-secondary" title="Search invoice">
|
|
|
|
<span class="fa fa-search"></span> Search
|
|
|
|
</button>
|
|
|
|
<button type="button" id="SearchOptionsToggle" class="btn btn-secondary dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
|
|
|
<span class="visually-hidden">Toggle Dropdown</span>
|
|
|
|
</button>
|
2020-08-24 06:57:07 +02:00
|
|
|
|
2021-05-19 04:39:27 +02:00
|
|
|
<div class="dropdown-menu dropdown-menu-end" aria-labelledby="SearchOptionsToggle">
|
|
|
|
<a class="dropdown-item" asp-action="ListInvoices" asp-route-count="@Model.Count" asp-route-searchTerm="status:invalid@{@storeIds}">Invalid Invoices</a>
|
|
|
|
<a class="dropdown-item" asp-action="ListInvoices" asp-route-count="@Model.Count" asp-route-searchTerm="status:paid,status:confirmed,status:complete@{@storeIds}">Paid Invoices</a>
|
|
|
|
<a class="dropdown-item" asp-action="ListInvoices" asp-route-count="@Model.Count" asp-route-searchTerm="exceptionstatus:paidLate@{@storeIds}">Paid Late Invoices</a>
|
|
|
|
<a class="dropdown-item" asp-action="ListInvoices" asp-route-count="@Model.Count" asp-route-searchTerm="exceptionstatus:paidPartial@{@storeIds}">Paid Partial Invoices</a>
|
|
|
|
<a class="dropdown-item" asp-action="ListInvoices" asp-route-count="@Model.Count" asp-route-searchTerm="exceptionstatus:paidOver@{@storeIds}">Paid Over Invoices</a>
|
|
|
|
<a class="dropdown-item" asp-action="ListInvoices" asp-route-count="@Model.Count" asp-route-searchTerm="unusual:true@{@storeIds}">Unusual Invoices</a>
|
|
|
|
<a class="dropdown-item" asp-action="ListInvoices" asp-route-count="@Model.Count" asp-route-searchTerm="includearchived:true@{@storeIds}">Archived Invoices</a>
|
|
|
|
<div role="separator" class="dropdown-divider"></div>
|
|
|
|
<a class="dropdown-item" asp-action="ListInvoices" asp-route-count="@Model.Count" asp-route-timezoneoffset="0" asp-route-searchTerm="startDate:-24h@{@storeIds}">Last 24 hours</a>
|
|
|
|
<a class="dropdown-item" asp-action="ListInvoices" asp-route-count="@Model.Count" asp-route-timezoneoffset="0" asp-route-searchTerm="startDate:-3d@{@storeIds}">Last 3 days</a>
|
|
|
|
<a class="dropdown-item" asp-action="ListInvoices" asp-route-count="@Model.Count" asp-route-timezoneoffset="0" asp-route-searchTerm="startDate:-7d@{@storeIds}">Last 7 days</a>
|
|
|
|
<button type="button" class="dropdown-item" data-bs-toggle="modal" data-bs-target="#customRangeModal">Custom Range</button>
|
|
|
|
<div role="separator" class="dropdown-divider"></div>
|
|
|
|
<a class="dropdown-item" href="?searchTerm=">Unfiltered</a>
|
|
|
|
</div>
|
2020-08-24 06:57:07 +02:00
|
|
|
</div>
|
|
|
|
<span asp-validation-for="SearchTerm" class="text-danger"></span>
|
|
|
|
</form>
|
|
|
|
|
|
|
|
@* Custom Range Modal *@
|
2021-05-19 04:39:27 +02:00
|
|
|
<div class="modal fade" id="customRangeModal" tabindex="-1" role="dialog" aria-labelledby="customRangeModalTitle" aria-hidden="true" data-bs-backdrop="static">
|
2020-08-24 06:57:07 +02:00
|
|
|
<div class="modal-dialog modal-dialog-centered" role="document" style="max-width: 550px;">
|
|
|
|
<div class="modal-content">
|
|
|
|
<div class="modal-header">
|
2021-05-19 04:39:27 +02:00
|
|
|
<h5 class="modal-title" id="customRangeModalTitle">Filter invoices by Custom Range</h5>
|
|
|
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close">
|
|
|
|
<vc:icon symbol="close" />
|
2020-08-24 06:57:07 +02:00
|
|
|
</button>
|
|
|
|
</div>
|
|
|
|
<div class="modal-body">
|
|
|
|
<div class="form-group row">
|
|
|
|
<label for="dtpStartDate" class="col-sm-3 col-form-label">Start Date</label>
|
|
|
|
<div class="col-sm-9">
|
|
|
|
<div class="input-group">
|
|
|
|
<input id="dtpStartDate" class="form-control flatdtpicker" type="datetime-local"
|
|
|
|
data-fdtp='{ "enableTime": true, "enableSeconds": true, "dateFormat": "Y-m-d H:i:S", "time_24hr": true, "defaultHour": 0 }'
|
|
|
|
placeholder="Start Date" />
|
2021-05-19 04:39:27 +02:00
|
|
|
<button type="button" class="btn btn-primary input-group-clear" title="Clear">
|
|
|
|
<span class="fa fa-times"></span>
|
|
|
|
</button>
|
2020-07-15 04:58:52 +02:00
|
|
|
</div>
|
2019-05-12 01:31:52 +02:00
|
|
|
</div>
|
|
|
|
</div>
|
2020-08-24 06:57:07 +02:00
|
|
|
<div class="form-group row">
|
|
|
|
<label class="col-sm-3 col-form-label">End Date</label>
|
|
|
|
<div class="col-sm-9">
|
|
|
|
<div class="input-group">
|
|
|
|
<input id="dtpEndDate" class="form-control flatdtpicker" type="datetime-local"
|
|
|
|
data-fdtp='{ "enableTime": true, "enableSeconds": true, "dateFormat": "Y-m-d H:i:S", "time_24hr": true, "defaultHour": 0 }'
|
|
|
|
placeholder="End Date" />
|
2021-05-19 04:39:27 +02:00
|
|
|
<button type="button" class="btn btn-primary input-group-clear" title="Clear">
|
|
|
|
<span class="fa fa-times"></span>
|
|
|
|
</button>
|
2020-07-15 04:58:52 +02:00
|
|
|
</div>
|
2019-05-12 01:31:52 +02:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
2020-08-24 06:57:07 +02:00
|
|
|
<div class="modal-footer">
|
|
|
|
<button id="btnCustomRangeDate" type="button" class="btn btn-primary">Filter</button>
|
|
|
|
</div>
|
2020-07-15 04:58:52 +02:00
|
|
|
</div>
|
2019-05-12 01:31:52 +02:00
|
|
|
</div>
|
|
|
|
</div>
|
2020-08-24 06:57:07 +02:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div class="row collapse" id="help">
|
2021-06-30 10:05:34 +02:00
|
|
|
<div class="col @(Model.Total > 0 ? "pt-3 pb-lg-5" : "")">
|
2020-08-24 06:57:07 +02:00
|
|
|
<p>
|
|
|
|
You can search for invoice Id, deposit address, price, order id, store id, any buyer information and any product information.
|
|
|
|
Be sure to split your search parameters with comma, for example:<br />
|
|
|
|
<code>startdate:2019-04-25 13:00:00, status:paid</code>
|
|
|
|
</p>
|
|
|
|
<p class="mb-2">
|
|
|
|
You can also apply filters to your search by searching for <code>filtername:value</code>, supported filters are:
|
|
|
|
</p>
|
|
|
|
<ul>
|
|
|
|
<li><code>storeid:id</code> for filtering a specific store</li>
|
|
|
|
<li><code>orderid:id</code> for filtering a specific order</li>
|
|
|
|
<li><code>itemcode:code</code> for filtering a specific type of item purchased through the pos or crowdfund apps</li>
|
|
|
|
<li><code>status:(expired|invalid|complete|confirmed|paid|new)</code> for filtering a specific status</li>
|
|
|
|
<li><code>exceptionstatus:(paidover|paidlate|paidpartial)</code> for filtering a specific exception state</li>
|
|
|
|
<li><code>unusual:(true|false)</code> for filtering invoices which might requires merchant attention (those invalid or with an exceptionstatus)</li>
|
|
|
|
<li><code>startdate:yyyy-MM-dd HH:mm:ss</code> getting invoices that were created after certain date</li>
|
|
|
|
<li><code>enddate:yyyy-MM-dd HH:mm:ss</code> getting invoices that were created before certain date</li>
|
|
|
|
</ul>
|
|
|
|
<p>
|
|
|
|
If you want all confirmed and complete invoices, you can duplicate a filter <code>status:confirmed, status:complete</code>.
|
|
|
|
</p>
|
|
|
|
</div>
|
|
|
|
</div>
|
2019-05-12 01:31:52 +02:00
|
|
|
|
2020-08-24 06:57:07 +02:00
|
|
|
@if (Model.Total > 0)
|
|
|
|
{
|
2021-04-08 15:32:42 +02:00
|
|
|
<form method="post" id="MassAction" asp-action="MassAction" class="mt-lg-n5">
|
2021-05-19 04:39:27 +02:00
|
|
|
<span class="me-2">
|
|
|
|
<button class="btn btn-secondary dropdown-toggle mb-1" type="button" id="ActionsDropdownToggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
2020-08-24 06:57:07 +02:00
|
|
|
Actions
|
|
|
|
</button>
|
2021-05-19 04:39:27 +02:00
|
|
|
<div class="dropdown-menu" aria-labelledby="ActionsDropdownToggle">
|
2020-08-24 06:57:07 +02:00
|
|
|
<button type="submit" asp-action="MassAction" class="dropdown-item" name="command" value="archive"><i class="fa fa-archive"></i> Archive</button>
|
|
|
|
</div>
|
|
|
|
</span>
|
|
|
|
<span>
|
2021-05-19 04:39:27 +02:00
|
|
|
<a class="btn btn-secondary dropdown-toggle mb-1" href="#" role="button" id="ExportDropdownToggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
2020-08-24 06:57:07 +02:00
|
|
|
Export
|
|
|
|
</a>
|
2021-05-19 04:39:27 +02:00
|
|
|
<div class="dropdown-menu" aria-labelledby="ExportDropdownToggle">
|
2020-08-24 06:57:07 +02:00
|
|
|
<a asp-action="Export" asp-route-timezoneoffset="0" asp-route-format="csv" asp-route-searchTerm="@Model.SearchTerm" class="dropdown-item export-link" target="_blank">CSV</a>
|
|
|
|
<a asp-action="Export" asp-route-timezoneoffset="0" asp-route-format="json" asp-route-searchTerm="@Model.SearchTerm" class="dropdown-item export-link" target="_blank">JSON</a>
|
|
|
|
</div>
|
|
|
|
</span>
|
2019-05-12 01:31:52 +02:00
|
|
|
|
2021-07-06 10:35:42 +02:00
|
|
|
<a href="https://docs.btcpayserver.org/Accounting/" class="ms-1" target="_blank" rel="noreferrer noopener">
|
2020-08-24 06:57:07 +02:00
|
|
|
<span class="fa fa-question-circle-o text-secondary" title="More information..."></span>
|
|
|
|
</a>
|
2019-05-12 01:31:52 +02:00
|
|
|
|
2020-12-21 12:26:43 +01:00
|
|
|
<table id="invoices" class="table table-sm table-responsive-md">
|
2020-08-24 06:57:07 +02:00
|
|
|
<thead>
|
|
|
|
<tr>
|
|
|
|
<th style="width:2rem;" class="only-for-js">
|
2021-06-06 13:44:54 +02:00
|
|
|
<input id="selectAllCheckbox" type="checkbox" class="form-check-input" onclick="selectAll(this);"/>
|
2020-08-24 06:57:07 +02:00
|
|
|
</th>
|
|
|
|
<th style="min-width:90px;" class="col-md-auto">
|
|
|
|
Date
|
|
|
|
<a href="javascript:switchTimeFormat()">
|
|
|
|
<span class="fa fa-clock-o" title="Switch date format"></span>
|
|
|
|
</a>
|
|
|
|
</th>
|
|
|
|
<th style="max-width: 180px;">OrderId</th>
|
|
|
|
<th>InvoiceId</th>
|
|
|
|
<th style="min-width: 150px;">Status</th>
|
|
|
|
<th style="text-align:right">Amount</th>
|
|
|
|
<th style="text-align:right">Actions</th>
|
|
|
|
</tr>
|
|
|
|
</thead>
|
|
|
|
<tbody>
|
|
|
|
@foreach (var invoice in Model.Invoices)
|
|
|
|
{
|
2020-12-21 12:26:43 +01:00
|
|
|
<tr id="invoice_@invoice.InvoiceId" class="invoice-row">
|
2020-08-24 06:57:07 +02:00
|
|
|
<td class="only-for-js">
|
2021-06-06 13:44:54 +02:00
|
|
|
<input name="selectedItems" type="checkbox" class="selector form-check-input" value="@invoice.InvoiceId"/>
|
2020-08-24 06:57:07 +02:00
|
|
|
</td>
|
|
|
|
<td>
|
|
|
|
<span class="switchTimeFormat" data-switch="@invoice.Date.ToTimeAgo()">
|
|
|
|
@invoice.Date.ToBrowserDate()
|
|
|
|
</span>
|
|
|
|
</td>
|
|
|
|
<td style="max-width: 180px;">
|
|
|
|
@if (invoice.RedirectUrl != string.Empty)
|
|
|
|
{
|
2021-07-06 10:35:42 +02:00
|
|
|
<a href="@invoice.RedirectUrl" class="wraptext200" rel="noreferrer noopener">@invoice.OrderId</a>
|
2020-08-24 06:57:07 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-08-12 09:02:13 +02:00
|
|
|
<span>@invoice.OrderId</span>
|
2020-08-24 06:57:07 +02:00
|
|
|
}
|
|
|
|
</td>
|
|
|
|
<td>@invoice.InvoiceId</td>
|
|
|
|
<td>
|
|
|
|
@if (invoice.Details.Archived)
|
|
|
|
{
|
2021-05-19 04:39:27 +02:00
|
|
|
<span class="badge bg-warning">archived</span>
|
2020-08-24 06:57:07 +02:00
|
|
|
}
|
|
|
|
@if (invoice.CanMarkStatus)
|
|
|
|
{
|
|
|
|
<div id="pavpill_@invoice.InvoiceId" class="badge badge-@invoice.Status.ToString().ToLower()">
|
2021-05-19 04:39:27 +02:00
|
|
|
<span class="dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
2020-10-08 08:42:45 +02:00
|
|
|
@invoice.Status.ToString()
|
2020-08-12 09:02:13 +02:00
|
|
|
</span>
|
|
|
|
<div class="dropdown-menu pull-right">
|
|
|
|
@if (invoice.CanMarkInvalid)
|
2020-08-24 06:57:07 +02:00
|
|
|
{
|
|
|
|
<button class="dropdown-item small cursorPointer" onclick="changeInvoiceState(this, '@invoice.InvoiceId', 'invalid')">
|
|
|
|
Mark as invalid <span class="fa fa-times"></span>
|
|
|
|
</button>
|
|
|
|
}
|
2020-08-12 09:02:13 +02:00
|
|
|
@if (invoice.CanMarkComplete)
|
2020-08-24 06:57:07 +02:00
|
|
|
{
|
|
|
|
<button class="dropdown-item small cursorPointer" onclick="changeInvoiceState(this, '@invoice.InvoiceId', 'complete')">
|
|
|
|
Mark as complete <span class="fa fa-check-circle"></span>
|
|
|
|
</button>
|
|
|
|
}
|
2020-08-12 09:02:13 +02:00
|
|
|
</div>
|
|
|
|
</div>
|
2020-08-24 06:57:07 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
<span class="badge badge-@invoice.Status.ToString().ToLower()">
|
|
|
|
@invoice.Status.ToString().ToLower()
|
|
|
|
</span>
|
|
|
|
}
|
2021-01-30 18:53:21 +01:00
|
|
|
@foreach (var paymentType in invoice.Details.Payments.Select(payment => payment.GetPaymentMethodId()?.PaymentType).Distinct().Where(type => type != null && !string.IsNullOrEmpty(type.GetBadge())))
|
2020-08-24 06:57:07 +02:00
|
|
|
{
|
2020-10-08 09:19:50 +02:00
|
|
|
<span class="badge">@paymentType.GetBadge()</span>
|
2020-08-24 06:57:07 +02:00
|
|
|
}
|
|
|
|
</td>
|
|
|
|
<td style="text-align:right">@invoice.AmountCurrency</td>
|
|
|
|
<td style="text-align:right">
|
|
|
|
@if (invoice.ShowCheckout)
|
|
|
|
{
|
2020-08-12 09:02:13 +02:00
|
|
|
<span>
|
|
|
|
<a asp-action="Checkout" class="invoice-checkout-link" id="invoice-checkout-@invoice.InvoiceId" asp-route-invoiceId="@invoice.InvoiceId">Checkout</a>
|
|
|
|
<a href="javascript:btcpay.showInvoice('@invoice.InvoiceId')">[^]</a>
|
|
|
|
@if (!invoice.CanMarkStatus)
|
2020-08-24 06:57:07 +02:00
|
|
|
{
|
|
|
|
<span>-</span>
|
2020-07-15 04:58:52 +02:00
|
|
|
}
|
2020-08-24 06:57:07 +02:00
|
|
|
</span>
|
|
|
|
}
|
|
|
|
|
|
|
|
<a asp-action="Invoice" class="invoice-details-link" asp-route-invoiceId="@invoice.InvoiceId">Details</a>
|
2020-12-21 12:26:43 +01:00
|
|
|
<a class="only-for-js invoice-details-toggle" href="#">
|
2020-08-24 06:57:07 +02:00
|
|
|
<span title="Invoice Details Toggle" class="fa fa-1x fa-angle-double-down"></span>
|
|
|
|
</a>
|
|
|
|
</td>
|
|
|
|
</tr>
|
2020-12-21 12:26:43 +01:00
|
|
|
<tr id="invoice_details_@invoice.InvoiceId" class="invoice-details-row" style="display:none;">
|
2020-08-24 06:57:07 +02:00
|
|
|
<td colspan="99" class="border-top-0">
|
|
|
|
<div style="margin-left: 15px; margin-bottom: 0;">
|
|
|
|
@* Leaving this as partial because it abstracts complexity of Invoice Payments *@
|
|
|
|
<partial name="ListInvoicesPaymentsPartial" model="(invoice.Details, true)"/>
|
|
|
|
</div>
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
}
|
|
|
|
</tbody>
|
|
|
|
</table>
|
|
|
|
|
2020-12-12 07:21:37 +01:00
|
|
|
<vc:pager view-model="Model" />
|
2020-08-24 06:57:07 +02:00
|
|
|
</form>
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
<p class="text-secondary mt-3">
|
|
|
|
There are no invoices matching your criteria.
|
|
|
|
</p>
|
|
|
|
}
|
2017-10-27 10:53:04 +02:00
|
|
|
</div>
|
|
|
|
</section>
|