From 324112b73b65181c3e66633102389701e35e5668 Mon Sep 17 00:00:00 2001 From: d11n Date: Wed, 16 Nov 2022 03:35:49 +0100 Subject: [PATCH] Receipts: Fix amount paid discrepancy (#4287) Displays the actual amount paid instead of the total invoice price. Fixes #4242. --- .../Controllers/UIInvoiceController.UI.cs | 69 ++++++++++--------- 1 file changed, 36 insertions(+), 33 deletions(-) diff --git a/BTCPayServer/Controllers/UIInvoiceController.UI.cs b/BTCPayServer/Controllers/UIInvoiceController.UI.cs index b6e234352..6d07bc49c 100644 --- a/BTCPayServer/Controllers/UIInvoiceController.UI.cs +++ b/BTCPayServer/Controllers/UIInvoiceController.UI.cs @@ -179,48 +179,51 @@ namespace BTCPayServer.Controllers } JToken? receiptData = null; i.Metadata?.AdditionalData?.TryGetValue("receiptData", out receiptData); - + + var payments = i.GetPayments(true) + .Select(paymentEntity => + { + var paymentData = paymentEntity.GetCryptoPaymentData(); + var paymentMethodId = paymentEntity.GetPaymentMethodId(); + if (paymentData is null || paymentMethodId is null) + { + return null; + } + + string txId = paymentData.GetPaymentId(); + string? link = GetTransactionLink(paymentMethodId, txId); + var paymentMethod = i.GetPaymentMethod(paymentMethodId); + var amount = paymentData.GetValue(); + var rate = paymentMethod.Rate; + var paid = (amount - paymentEntity.NetworkFee) * rate; + + return new ViewPaymentRequestViewModel.PaymentRequestInvoicePayment + { + Amount = amount, + Paid = paid, + ReceivedDate = paymentEntity.ReceivedTime.DateTime, + PaidFormatted = _CurrencyNameTable.FormatCurrency(paid, i.Currency), + RateFormatted = _CurrencyNameTable.FormatCurrency(rate, i.Currency), + PaymentMethod = paymentMethodId.ToPrettyString(), + Link = link, + Id = txId, + Destination = paymentData.GetDestination() + }; + }) + .Where(payment => payment != null) + .ToList(); + return View(new InvoiceReceiptViewModel { StoreName = store.StoreName, Status = i.Status.ToModernStatus(), - Amount = i.Price, + Amount = payments.Sum(p => p!.Paid), Currency = i.Currency, Timestamp = i.InvoiceTime, InvoiceId = i.Id, OrderId = i.Metadata?.OrderId, OrderUrl = i.Metadata?.OrderUrl, - Payments = receipt.ShowPayments is false ? null : i.GetPayments(true).Select(paymentEntity => - { - var paymentData = paymentEntity.GetCryptoPaymentData(); - var paymentMethodId = paymentEntity.GetPaymentMethodId(); - if (paymentData is null || paymentMethodId is null) - { - return null; - } - - string txId = paymentData.GetPaymentId(); - string? link = GetTransactionLink(paymentMethodId, txId); - var paymentMethod = i.GetPaymentMethod(paymentMethodId); - var amount = paymentData.GetValue(); - var rate = paymentMethod.Rate; - var paid = (amount - paymentEntity.NetworkFee) * rate; - - return new ViewPaymentRequestViewModel.PaymentRequestInvoicePayment - { - Amount = amount, - Paid = paid, - ReceivedDate = paymentEntity.ReceivedTime.DateTime, - PaidFormatted = _CurrencyNameTable.FormatCurrency(paid, i.Currency), - RateFormatted = _CurrencyNameTable.FormatCurrency(rate, i.Currency), - PaymentMethod = paymentMethodId.ToPrettyString(), - Link = link, - Id = txId, - Destination = paymentData.GetDestination() - }; - }) - .Where(payment => payment != null) - .ToList(), + Payments = receipt.ShowPayments is false ? null : payments, ReceiptOptions = receipt, AdditionalData = receiptData is null ? new Dictionary()