mirror of
https://github.com/aljazceru/btcpayserver.git
synced 2025-12-18 06:24:24 +01:00
Improve invoice.cshtml display if offchain payment is present
This commit is contained in:
@@ -40,7 +40,7 @@ services:
|
|||||||
- lightning-charged
|
- lightning-charged
|
||||||
|
|
||||||
nbxplorer:
|
nbxplorer:
|
||||||
image: nicolasdorier/nbxplorer:1.0.1.18
|
image: nicolasdorier/nbxplorer:1.0.1.19
|
||||||
ports:
|
ports:
|
||||||
- "32838:32838"
|
- "32838:32838"
|
||||||
expose:
|
expose:
|
||||||
|
|||||||
@@ -31,7 +31,7 @@
|
|||||||
<PackageReference Include="Meziantou.AspNetCore.BundleTagHelpers" Version="1.0.1" />
|
<PackageReference Include="Meziantou.AspNetCore.BundleTagHelpers" Version="1.0.1" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Logging.Filter" Version="1.1.2" />
|
<PackageReference Include="Microsoft.Extensions.Logging.Filter" Version="1.1.2" />
|
||||||
<PackageReference Include="Microsoft.NetCore.Analyzers" Version="2.6.0" />
|
<PackageReference Include="Microsoft.NetCore.Analyzers" Version="2.6.0" />
|
||||||
<PackageReference Include="NBitcoin" Version="4.0.0.59" />
|
<PackageReference Include="NBitcoin" Version="4.0.0.60" />
|
||||||
<PackageReference Include="NBitpayClient" Version="1.0.0.18" />
|
<PackageReference Include="NBitpayClient" Version="1.0.0.18" />
|
||||||
<PackageReference Include="DBreeze" Version="1.87.0" />
|
<PackageReference Include="DBreeze" Version="1.87.0" />
|
||||||
<PackageReference Include="NBXplorer.Client" Version="1.0.1.14" />
|
<PackageReference Include="NBXplorer.Client" Version="1.0.1.14" />
|
||||||
|
|||||||
@@ -68,11 +68,11 @@ namespace BTCPayServer.Controllers
|
|||||||
{
|
{
|
||||||
var cryptoInfo = dto.CryptoInfo.First(o => o.GetpaymentMethodId() == data.GetId());
|
var cryptoInfo = dto.CryptoInfo.First(o => o.GetpaymentMethodId() == data.GetId());
|
||||||
var accounting = data.Calculate();
|
var accounting = data.Calculate();
|
||||||
var paymentNetwork = _NetworkProvider.GetNetwork(data.GetId().CryptoCode);
|
var paymentMethodId = data.GetId();
|
||||||
var cryptoPayment = new InvoiceDetailsModel.CryptoPayment();
|
var cryptoPayment = new InvoiceDetailsModel.CryptoPayment();
|
||||||
cryptoPayment.CryptoCode = paymentNetwork.CryptoCode;
|
cryptoPayment.PaymentMethod = ToString(paymentMethodId);
|
||||||
cryptoPayment.Due = accounting.Due.ToString() + $" {paymentNetwork.CryptoCode}";
|
cryptoPayment.Due = accounting.Due.ToString() + $" {paymentMethodId.CryptoCode}";
|
||||||
cryptoPayment.Paid = accounting.CryptoPaid.ToString() + $" {paymentNetwork.CryptoCode}";
|
cryptoPayment.Paid = accounting.CryptoPaid.ToString() + $" {paymentMethodId.CryptoCode}";
|
||||||
|
|
||||||
var onchainMethod = data.GetPaymentMethodDetails() as Payments.Bitcoin.BitcoinLikeOnChainPaymentMethod;
|
var onchainMethod = data.GetPaymentMethodDetails() as Payments.Bitcoin.BitcoinLikeOnChainPaymentMethod;
|
||||||
if(onchainMethod != null)
|
if(onchainMethod != null)
|
||||||
@@ -86,13 +86,13 @@ namespace BTCPayServer.Controllers
|
|||||||
|
|
||||||
var payments = invoice
|
var payments = invoice
|
||||||
.GetPayments()
|
.GetPayments()
|
||||||
.Where(p => p.GetpaymentMethodId().PaymentType == PaymentTypes.BTCLike)
|
.Where(p => p.GetPaymentMethodId().PaymentType == PaymentTypes.BTCLike)
|
||||||
.Select(async payment =>
|
.Select(async payment =>
|
||||||
{
|
{
|
||||||
var paymentData = (Payments.Bitcoin.BitcoinLikePaymentData)payment.GetCryptoPaymentData();
|
var paymentData = (Payments.Bitcoin.BitcoinLikePaymentData)payment.GetCryptoPaymentData();
|
||||||
var m = new InvoiceDetailsModel.Payment();
|
var m = new InvoiceDetailsModel.Payment();
|
||||||
var paymentNetwork = _NetworkProvider.GetNetwork(payment.GetCryptoCode());
|
var paymentNetwork = _NetworkProvider.GetNetwork(payment.GetCryptoCode());
|
||||||
m.CryptoCode = payment.GetCryptoCode();
|
m.PaymentMethod = ToString(payment.GetPaymentMethodId());
|
||||||
m.DepositAddress = paymentData.Output.ScriptPubKey.GetDestinationAddress(paymentNetwork.NBitcoinNetwork);
|
m.DepositAddress = paymentData.Output.ScriptPubKey.GetDestinationAddress(paymentNetwork.NBitcoinNetwork);
|
||||||
|
|
||||||
int confirmationCount = 0;
|
int confirmationCount = 0;
|
||||||
@@ -121,12 +121,32 @@ namespace BTCPayServer.Controllers
|
|||||||
})
|
})
|
||||||
.ToArray();
|
.ToArray();
|
||||||
await Task.WhenAll(payments);
|
await Task.WhenAll(payments);
|
||||||
model.Addresses = invoice.HistoricalAddresses;
|
model.Addresses = invoice.HistoricalAddresses.Select(h=> new InvoiceDetailsModel.AddressModel
|
||||||
|
{
|
||||||
|
Destination = h.GetAddress(),
|
||||||
|
PaymentMethod = ToString(h.GetPaymentMethodId()),
|
||||||
|
Current = !h.UnAssigned.HasValue
|
||||||
|
}).ToArray();
|
||||||
model.Payments = payments.Select(p => p.GetAwaiter().GetResult()).ToList();
|
model.Payments = payments.Select(p => p.GetAwaiter().GetResult()).ToList();
|
||||||
model.StatusMessage = StatusMessage;
|
model.StatusMessage = StatusMessage;
|
||||||
return View(model);
|
return View(model);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private string ToString(PaymentMethodId paymentMethodId)
|
||||||
|
{
|
||||||
|
var type = paymentMethodId.PaymentType.ToString();
|
||||||
|
switch (paymentMethodId.PaymentType)
|
||||||
|
{
|
||||||
|
case PaymentTypes.BTCLike:
|
||||||
|
type = "On-Chain";
|
||||||
|
break;
|
||||||
|
case PaymentTypes.LightningLike:
|
||||||
|
type = "Off-Chain";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return $"{paymentMethodId.CryptoCode} ({type})";
|
||||||
|
}
|
||||||
|
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
[Route("i/{invoiceId}")]
|
[Route("i/{invoiceId}")]
|
||||||
[Route("i/{invoiceId}/{paymentMethodId}")]
|
[Route("i/{invoiceId}/{paymentMethodId}")]
|
||||||
@@ -220,7 +240,7 @@ namespace BTCPayServer.Controllers
|
|||||||
.ToList()
|
.ToList()
|
||||||
};
|
};
|
||||||
|
|
||||||
var isMultiCurrency = invoice.GetPayments().Select(p=>p.GetpaymentMethodId()).Concat(new[] { paymentMethod.GetId() }).Distinct().Count() > 1;
|
var isMultiCurrency = invoice.GetPayments().Select(p=>p.GetPaymentMethodId()).Concat(new[] { paymentMethod.GetId() }).Distinct().Count() > 1;
|
||||||
if (isMultiCurrency)
|
if (isMultiCurrency)
|
||||||
model.NetworkFeeDescription = $"{accounting.NetworkFee} {network.CryptoCode}";
|
model.NetworkFeeDescription = $"{accounting.NetworkFee} {network.CryptoCode}";
|
||||||
|
|
||||||
|
|||||||
@@ -27,9 +27,10 @@ namespace BTCPayServer.Data
|
|||||||
public string CryptoCode { get; set; }
|
public string CryptoCode { get; set; }
|
||||||
|
|
||||||
#pragma warning disable CS0618
|
#pragma warning disable CS0618
|
||||||
public string GetCryptoCode()
|
public Payments.PaymentMethodId GetPaymentMethodId()
|
||||||
{
|
{
|
||||||
return string.IsNullOrEmpty(CryptoCode) ? "BTC" : CryptoCode;
|
return string.IsNullOrEmpty(CryptoCode) ? new Payments.PaymentMethodId("BTC", Payments.PaymentTypes.BTCLike)
|
||||||
|
: Payments.PaymentMethodId.Parse(CryptoCode);
|
||||||
}
|
}
|
||||||
public string GetAddress()
|
public string GetAddress()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -12,16 +12,22 @@ namespace BTCPayServer.Models.InvoicingModels
|
|||||||
{
|
{
|
||||||
public class CryptoPayment
|
public class CryptoPayment
|
||||||
{
|
{
|
||||||
public string CryptoCode { get; set; }
|
public string PaymentMethod { get; set; }
|
||||||
public string Due { get; set; }
|
public string Due { get; set; }
|
||||||
public string Paid { get; set; }
|
public string Paid { get; set; }
|
||||||
public string Address { get; internal set; }
|
public string Address { get; internal set; }
|
||||||
public string Rate { get; internal set; }
|
public string Rate { get; internal set; }
|
||||||
public string PaymentUrl { get; internal set; }
|
public string PaymentUrl { get; internal set; }
|
||||||
}
|
}
|
||||||
|
public class AddressModel
|
||||||
|
{
|
||||||
|
public string PaymentMethod { get; set; }
|
||||||
|
public string Destination { get; set; }
|
||||||
|
public bool Current { get; set; }
|
||||||
|
}
|
||||||
public class Payment
|
public class Payment
|
||||||
{
|
{
|
||||||
public string CryptoCode { get; set; }
|
public string PaymentMethod { get; set; }
|
||||||
public string Confirmations
|
public string Confirmations
|
||||||
{
|
{
|
||||||
get; set;
|
get; set;
|
||||||
@@ -126,7 +132,7 @@ namespace BTCPayServer.Models.InvoicingModels
|
|||||||
get;
|
get;
|
||||||
internal set;
|
internal set;
|
||||||
}
|
}
|
||||||
public HistoricalAddressInvoiceData[] Addresses { get; set; }
|
public AddressModel[] Addresses { get; set; }
|
||||||
public DateTimeOffset MonitoringDate { get; internal set; }
|
public DateTimeOffset MonitoringDate { get; internal set; }
|
||||||
public List<Data.InvoiceEventData> Events { get; internal set; }
|
public List<Data.InvoiceEventData> Events { get; internal set; }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -213,7 +213,7 @@ namespace BTCPayServer.Payments.Bitcoin
|
|||||||
IEnumerable<BitcoinLikePaymentData> GetAllBitcoinPaymentData(InvoiceEntity invoice)
|
IEnumerable<BitcoinLikePaymentData> GetAllBitcoinPaymentData(InvoiceEntity invoice)
|
||||||
{
|
{
|
||||||
return invoice.GetPayments()
|
return invoice.GetPayments()
|
||||||
.Where(p => p.GetpaymentMethodId().PaymentType == PaymentTypes.BTCLike)
|
.Where(p => p.GetPaymentMethodId().PaymentType == PaymentTypes.BTCLike)
|
||||||
.Select(p => (BitcoinLikePaymentData)p.GetCryptoPaymentData());
|
.Select(p => (BitcoinLikePaymentData)p.GetCryptoPaymentData());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -227,7 +227,7 @@ namespace BTCPayServer.Payments.Bitcoin
|
|||||||
var conflicts = GetConflicts(transactions.Select(t => t.Value));
|
var conflicts = GetConflicts(transactions.Select(t => t.Value));
|
||||||
foreach (var payment in invoice.GetPayments(wallet.Network))
|
foreach (var payment in invoice.GetPayments(wallet.Network))
|
||||||
{
|
{
|
||||||
if (payment.GetpaymentMethodId().PaymentType != PaymentTypes.BTCLike)
|
if (payment.GetPaymentMethodId().PaymentType != PaymentTypes.BTCLike)
|
||||||
continue;
|
continue;
|
||||||
var paymentData = (BitcoinLikePaymentData)payment.GetCryptoPaymentData();
|
var paymentData = (BitcoinLikePaymentData)payment.GetCryptoPaymentData();
|
||||||
if (!transactions.TryGetValue(paymentData.Outpoint.Hash, out TransactionResult tx))
|
if (!transactions.TryGetValue(paymentData.Outpoint.Hash, out TransactionResult tx))
|
||||||
|
|||||||
@@ -655,7 +655,7 @@ namespace BTCPayServer.Services.Invoices
|
|||||||
.OrderBy(p => p.ReceivedTime)
|
.OrderBy(p => p.ReceivedTime)
|
||||||
.Select(_ =>
|
.Select(_ =>
|
||||||
{
|
{
|
||||||
var txFee = _.GetValue(paymentMethods, GetId(), paymentMethods[_.GetpaymentMethodId()].GetTxFee());
|
var txFee = _.GetValue(paymentMethods, GetId(), paymentMethods[_.GetPaymentMethodId()].GetTxFee());
|
||||||
paid += _.GetValue(paymentMethods, GetId());
|
paid += _.GetValue(paymentMethods, GetId());
|
||||||
if (!paidEnough)
|
if (!paidEnough)
|
||||||
{
|
{
|
||||||
@@ -663,7 +663,7 @@ namespace BTCPayServer.Services.Invoices
|
|||||||
paidTxFee += txFee;
|
paidTxFee += txFee;
|
||||||
}
|
}
|
||||||
paidEnough |= paid >= RoundUp(totalDue, 8);
|
paidEnough |= paid >= RoundUp(totalDue, 8);
|
||||||
if (GetId() == _.GetpaymentMethodId())
|
if (GetId() == _.GetPaymentMethodId())
|
||||||
{
|
{
|
||||||
cryptoPaid += _.GetCryptoPaymentData().GetValue();
|
cryptoPaid += _.GetCryptoPaymentData().GetValue();
|
||||||
txRequired++;
|
txRequired++;
|
||||||
@@ -766,7 +766,7 @@ namespace BTCPayServer.Services.Invoices
|
|||||||
paymentData.Legacy = true;
|
paymentData.Legacy = true;
|
||||||
return paymentData;
|
return paymentData;
|
||||||
}
|
}
|
||||||
if (GetpaymentMethodId().PaymentType == PaymentTypes.BTCLike)
|
if (GetPaymentMethodId().PaymentType == PaymentTypes.BTCLike)
|
||||||
{
|
{
|
||||||
var paymentData = JsonConvert.DeserializeObject<Payments.Bitcoin.BitcoinLikePaymentData>(CryptoPaymentData);
|
var paymentData = JsonConvert.DeserializeObject<Payments.Bitcoin.BitcoinLikePaymentData>(CryptoPaymentData);
|
||||||
// legacy
|
// legacy
|
||||||
@@ -774,7 +774,7 @@ namespace BTCPayServer.Services.Invoices
|
|||||||
paymentData.Outpoint = Outpoint;
|
paymentData.Outpoint = Outpoint;
|
||||||
return paymentData;
|
return paymentData;
|
||||||
}
|
}
|
||||||
if(GetpaymentMethodId().PaymentType== PaymentTypes.LightningLike)
|
if(GetPaymentMethodId().PaymentType== PaymentTypes.LightningLike)
|
||||||
{
|
{
|
||||||
return JsonConvert.DeserializeObject<Payments.Lightning.LightningLikePaymentData>(CryptoPaymentData);
|
return JsonConvert.DeserializeObject<Payments.Lightning.LightningLikePaymentData>(CryptoPaymentData);
|
||||||
}
|
}
|
||||||
@@ -802,7 +802,7 @@ namespace BTCPayServer.Services.Invoices
|
|||||||
{
|
{
|
||||||
value = value ?? this.GetCryptoPaymentData().GetValue();
|
value = value ?? this.GetCryptoPaymentData().GetValue();
|
||||||
var to = paymentMethodId;
|
var to = paymentMethodId;
|
||||||
var from = this.GetpaymentMethodId();
|
var from = this.GetPaymentMethodId();
|
||||||
if (to == from)
|
if (to == from)
|
||||||
return decimal.Round(value.Value, 8);
|
return decimal.Round(value.Value, 8);
|
||||||
var fromRate = paymentMethods[from].Rate;
|
var fromRate = paymentMethods[from].Rate;
|
||||||
@@ -813,7 +813,7 @@ namespace BTCPayServer.Services.Invoices
|
|||||||
return otherCurrencyValue;
|
return otherCurrencyValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
public PaymentMethodId GetpaymentMethodId()
|
public PaymentMethodId GetPaymentMethodId()
|
||||||
{
|
{
|
||||||
#pragma warning disable CS0618 // Type or member is obsolete
|
#pragma warning disable CS0618 // Type or member is obsolete
|
||||||
return new PaymentMethodId(CryptoCode ?? "BTC", string.IsNullOrEmpty(CryptoPaymentDataType) ? PaymentTypes.BTCLike : Enum.Parse<PaymentTypes>(CryptoPaymentDataType));
|
return new PaymentMethodId(CryptoCode ?? "BTC", string.IsNullOrEmpty(CryptoPaymentDataType) ? PaymentTypes.BTCLike : Enum.Parse<PaymentTypes>(CryptoPaymentDataType));
|
||||||
|
|||||||
@@ -153,7 +153,7 @@
|
|||||||
<table class="table">
|
<table class="table">
|
||||||
<thead class="thead-inverse">
|
<thead class="thead-inverse">
|
||||||
<tr>
|
<tr>
|
||||||
<th>Crypto</th>
|
<th style="white-space:nowrap;">Payment method</th>
|
||||||
<th>Rate</th>
|
<th>Rate</th>
|
||||||
<th>Paid</th>
|
<th>Paid</th>
|
||||||
<th>Due</th>
|
<th>Due</th>
|
||||||
@@ -164,7 +164,7 @@
|
|||||||
@foreach(var payment in Model.CryptoPayments)
|
@foreach(var payment in Model.CryptoPayments)
|
||||||
{
|
{
|
||||||
<tr>
|
<tr>
|
||||||
<td>@payment.CryptoCode</td>
|
<td>@payment.PaymentMethod</td>
|
||||||
<td>@payment.Rate</td>
|
<td>@payment.Rate</td>
|
||||||
<td>@payment.Paid</td>
|
<td>@payment.Paid</td>
|
||||||
<td>@payment.Due</td>
|
<td>@payment.Due</td>
|
||||||
@@ -181,8 +181,7 @@
|
|||||||
<table class="table">
|
<table class="table">
|
||||||
<thead class="thead-inverse">
|
<thead class="thead-inverse">
|
||||||
<tr>
|
<tr>
|
||||||
<th>Crypto</th>
|
<th style="white-space:nowrap;">Payment method</th>
|
||||||
<th>Date</th>
|
|
||||||
<th>Deposit address</th>
|
<th>Deposit address</th>
|
||||||
<th>Transaction Id</th>
|
<th>Transaction Id</th>
|
||||||
<th>Confirmations</th>
|
<th>Confirmations</th>
|
||||||
@@ -193,8 +192,7 @@
|
|||||||
@foreach(var payment in Model.Payments)
|
@foreach(var payment in Model.Payments)
|
||||||
{
|
{
|
||||||
<tr>
|
<tr>
|
||||||
<td>@payment.CryptoCode</td>
|
<td>@payment.PaymentMethod</td>
|
||||||
<td>@payment.ReceivedTime</td>
|
|
||||||
<td>@payment.DepositAddress</td>
|
<td>@payment.DepositAddress</td>
|
||||||
<td><a href="@payment.TransactionLink" target="_blank">@payment.TransactionId</a></td>
|
<td><a href="@payment.TransactionLink" target="_blank">@payment.TransactionId</a></td>
|
||||||
<td>@payment.Confirmations</td>
|
<td>@payment.Confirmations</td>
|
||||||
@@ -211,7 +209,7 @@
|
|||||||
<table class="table">
|
<table class="table">
|
||||||
<thead class="thead-inverse">
|
<thead class="thead-inverse">
|
||||||
<tr>
|
<tr>
|
||||||
<th>Crypto</th>
|
<th style="white-space:nowrap;">Payment method</th>
|
||||||
<th>Address</th>
|
<th>Address</th>
|
||||||
<th>Current</th>
|
<th>Current</th>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -220,9 +218,9 @@
|
|||||||
@foreach(var address in Model.Addresses)
|
@foreach(var address in Model.Addresses)
|
||||||
{
|
{
|
||||||
<tr>
|
<tr>
|
||||||
<td>@address.GetCryptoCode()</td>
|
<td style="width:100px;">@address.PaymentMethod</td>
|
||||||
<td>@address.GetAddress()</td>
|
<td style="max-width:100px;overflow:hidden;">@address.Destination</td>
|
||||||
<td>@(!address.UnAssigned.HasValue)</td>
|
<td>@address.Current.ToString()</td>
|
||||||
</tr>
|
</tr>
|
||||||
}
|
}
|
||||||
</tbody>
|
</tbody>
|
||||||
|
|||||||
Reference in New Issue
Block a user