diff --git a/BTCPayServer.Client/BTCPayServerClient.Invoices.cs b/BTCPayServer.Client/BTCPayServerClient.Invoices.cs index 8a34fffec..a7518aafb 100644 --- a/BTCPayServer.Client/BTCPayServerClient.Invoices.cs +++ b/BTCPayServer.Client/BTCPayServerClient.Invoices.cs @@ -59,7 +59,7 @@ namespace BTCPayServer.Client { if (request == null) throw new ArgumentNullException(nameof(request)); - if (request.Status!= InvoiceStatus.Complete && request.Status!= InvoiceStatus.Invalid) + if (request.Status!= InvoiceStatus.Settled && request.Status!= InvoiceStatus.Invalid) throw new ArgumentOutOfRangeException(nameof(request.Status), "Status can only be Invalid or Complete"); var response = await _httpClient.SendAsync( CreateHttpRequest($"api/v1/stores/{storeId}/invoices/{invoiceId}/status", bodyPayload: request, diff --git a/BTCPayServer.Client/Models/InvoiceData.cs b/BTCPayServer.Client/Models/InvoiceData.cs index 63f391182..3fffb15fc 100644 --- a/BTCPayServer.Client/Models/InvoiceData.cs +++ b/BTCPayServer.Client/Models/InvoiceData.cs @@ -18,4 +18,12 @@ namespace BTCPayServer.Client.Models [JsonConverter(typeof(NBitcoin.JsonConverters.DateTimeToUnixTimeConverter))] public DateTimeOffset CreatedTime { get; set; } } + public enum InvoiceStatus + { + New, + Processing, + Expired, + Invalid, + Settled + } } diff --git a/BTCPayServer.Client/Models/InvoicePaymentMethodDataModel.cs b/BTCPayServer.Client/Models/InvoicePaymentMethodDataModel.cs index afd59a652..94a3df6fb 100644 --- a/BTCPayServer.Client/Models/InvoicePaymentMethodDataModel.cs +++ b/BTCPayServer.Client/Models/InvoicePaymentMethodDataModel.cs @@ -53,8 +53,8 @@ namespace BTCPayServer.Client.Models public enum PaymentStatus { Invalid, - AwaitingCompletion, - Complete + Processing, + Settled } } } diff --git a/BTCPayServer.Client/Models/InvoiceStatus.cs b/BTCPayServer.Client/Models/InvoiceStatus.cs deleted file mode 100644 index b30e4e73a..000000000 --- a/BTCPayServer.Client/Models/InvoiceStatus.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace BTCPayServer.Client.Models -{ - public enum InvoiceStatus - { - New, - Paid, - Expired, - Invalid, - Complete, - Confirmed - } -} diff --git a/BTCPayServer.Client/Models/WebhookEventType.cs b/BTCPayServer.Client/Models/WebhookEventType.cs index a0644bf80..e7b622e56 100644 --- a/BTCPayServer.Client/Models/WebhookEventType.cs +++ b/BTCPayServer.Client/Models/WebhookEventType.cs @@ -8,9 +8,9 @@ namespace BTCPayServer.Client.Models { InvoiceCreated, InvoiceReceivedPayment, - InvoicePaidInFull, + InvoiceProcessing, InvoiceExpired, - InvoiceConfirmed, + InvoiceSettled, InvoiceInvalid } } diff --git a/BTCPayServer.Client/Models/WebhookInvoiceEvent.cs b/BTCPayServer.Client/Models/WebhookInvoiceEvent.cs index 027caa056..3f12e2935 100644 --- a/BTCPayServer.Client/Models/WebhookInvoiceEvent.cs +++ b/BTCPayServer.Client/Models/WebhookInvoiceEvent.cs @@ -22,13 +22,13 @@ namespace BTCPayServer.Client.Models public string InvoiceId { get; set; } } - public class WebhookInvoiceConfirmedEvent : WebhookInvoiceEvent + public class WebhookInvoiceSettledEvent : WebhookInvoiceEvent { - public WebhookInvoiceConfirmedEvent() + public WebhookInvoiceSettledEvent() { } - public WebhookInvoiceConfirmedEvent(WebhookEventType evtType) : base(evtType) + public WebhookInvoiceSettledEvent(WebhookEventType evtType) : base(evtType) { } @@ -46,18 +46,17 @@ namespace BTCPayServer.Client.Models public bool ManuallyMarked { get; set; } } - public class WebhookInvoicePaidEvent : WebhookInvoiceEvent + public class WebhookInvoiceProcessingEvent : WebhookInvoiceEvent { - public WebhookInvoicePaidEvent() + public WebhookInvoiceProcessingEvent() { } - public WebhookInvoicePaidEvent(WebhookEventType evtType) : base(evtType) + public WebhookInvoiceProcessingEvent(WebhookEventType evtType) : base(evtType) { } public bool OverPaid { get; set; } - public bool PaidAfterExpiration { get; set; } } public class WebhookInvoiceReceivedPaymentEvent : WebhookInvoiceEvent { diff --git a/BTCPayServer.Tests/GreenfieldAPITests.cs b/BTCPayServer.Tests/GreenfieldAPITests.cs index af437e032..ed59a66c1 100644 --- a/BTCPayServer.Tests/GreenfieldAPITests.cs +++ b/BTCPayServer.Tests/GreenfieldAPITests.cs @@ -949,10 +949,10 @@ namespace BTCPayServer.Tests var invoice = await viewOnly.GetInvoice(user.StoreId, newInvoice.Id); Assert.Equal(newInvoice.Metadata, invoice.Metadata); var paymentMethods = await viewOnly.GetInvoicePaymentMethods(user.StoreId, newInvoice.Id); - Assert.Equal(1, paymentMethods.Length); + Assert.Single(paymentMethods); var paymentMethod = paymentMethods.First(); Assert.Equal("BTC", paymentMethod.PaymentMethod); - Assert.Equal(0, paymentMethod.Payments.Count); + Assert.Empty(paymentMethod.Payments); //update @@ -962,7 +962,7 @@ namespace BTCPayServer.Tests { await client.MarkInvoiceStatus(user.StoreId, invoice.Id, new MarkInvoiceStatusRequest() { - Status = InvoiceStatus.Complete + Status = InvoiceStatus.Settled }); }); @@ -982,7 +982,7 @@ namespace BTCPayServer.Tests Assert.NotNull(await client.GetInvoice(user.StoreId, invoice.Id)); - foreach (var marked in new[] { InvoiceStatus.Complete, InvoiceStatus.Invalid }) + foreach (var marked in new[] { InvoiceStatus.Settled, InvoiceStatus.Invalid }) { var inv = await client.CreateInvoice(user.StoreId, new CreateInvoiceRequest() { Currency = "USD", Amount = 100 }); @@ -992,10 +992,10 @@ namespace BTCPayServer.Tests Status = marked }); var result = await client.GetInvoice(user.StoreId, inv.Id); - if (marked == InvoiceStatus.Complete) + if (marked == InvoiceStatus.Settled) { - Assert.Equal(InvoiceStatus.Complete, result.Status); - user.AssertHasWebhookEvent(WebhookEventType.InvoiceConfirmed, + Assert.Equal(InvoiceStatus.Settled, result.Status); + user.AssertHasWebhookEvent(WebhookEventType.InvoiceSettled, o => { Assert.Equal(inv.Id, o.InvoiceId); diff --git a/BTCPayServer.Tests/PayJoinTests.cs b/BTCPayServer.Tests/PayJoinTests.cs index 97040cdc0..62a3ab3bb 100644 --- a/BTCPayServer.Tests/PayJoinTests.cs +++ b/BTCPayServer.Tests/PayJoinTests.cs @@ -270,7 +270,7 @@ namespace BTCPayServer.Tests await TestUtils.EventuallyAsync(async () => { var invoice = await s.Server.PayTester.GetService().GetInvoice(invoiceId); - Assert.Equal(InvoiceStatus.Paid, invoice.Status); + Assert.Equal(InvoiceStatusLegacy.Paid, invoice.Status); }); s.GoToInvoices(); @@ -330,7 +330,7 @@ namespace BTCPayServer.Tests { var invoice = await s.Server.PayTester.GetService().GetInvoice(invoiceId); var dto = invoice.EntityToDTO(); - Assert.Equal(InvoiceStatus.Paid, invoice.Status); + Assert.Equal(InvoiceStatusLegacy.Paid, invoice.Status); }); s.GoToInvoices(); paymentValueRowColumn = s.Driver.FindElement(By.Id($"invoice_{invoiceId}")) @@ -720,7 +720,7 @@ retry: await TestUtils.EventuallyAsync(async () => { var invoice = await tester.PayTester.GetService().GetInvoice(lastInvoiceId); - Assert.Equal(InvoiceStatus.Paid, invoice.Status); + Assert.Equal(InvoiceStatusLegacy.Paid, invoice.Status); Assert.Equal(InvoiceExceptionStatus.None, invoice.ExceptionStatus); var coins = await btcPayWallet.GetUnspentCoins(receiverUser.DerivationScheme); foreach (var coin in coins) @@ -1047,7 +1047,7 @@ retry: await TestUtils.EventuallyAsync(async () => { var invoiceEntity = await tester.PayTester.GetService().GetInvoice(invoice7.Id); - Assert.Equal(InvoiceStatus.Paid, invoiceEntity.Status); + Assert.Equal(InvoiceStatusLegacy.Paid, invoiceEntity.Status); Assert.Contains(invoiceEntity.GetPayments(), p => p.Accounted && ((BitcoinLikePaymentData)p.GetCryptoPaymentData()).PayjoinInformation is null); }); @@ -1076,7 +1076,7 @@ retry: await TestUtils.EventuallyAsync(async () => { var invoiceEntity = await tester.PayTester.GetService().GetInvoice(invoice7.Id); - Assert.Equal(InvoiceStatus.New, invoiceEntity.Status); + Assert.Equal(InvoiceStatusLegacy.New, invoiceEntity.Status); Assert.True(invoiceEntity.GetPayments().All(p => !p.Accounted)); ourOutpoint = invoiceEntity.GetAllBitcoinPaymentData().First().PayjoinInformation.ContributedOutPoints[0]; }); diff --git a/BTCPayServer.Tests/PaymentRequestTests.cs b/BTCPayServer.Tests/PaymentRequestTests.cs index df844addd..7357ea1e5 100644 --- a/BTCPayServer.Tests/PaymentRequestTests.cs +++ b/BTCPayServer.Tests/PaymentRequestTests.cs @@ -207,12 +207,12 @@ namespace BTCPayServer.Tests pair => pair.Key == "Id" && pair.Value.ToString() == invoiceId); var invoice = user.BitPay.GetInvoice(invoiceId, Facade.Merchant); - Assert.Equal(InvoiceState.ToString(InvoiceStatus.New), invoice.Status); + Assert.Equal(InvoiceState.ToString(InvoiceStatusLegacy.New), invoice.Status); Assert.IsType(await paymentRequestController.CancelUnpaidPendingInvoice(paymentRequestId, false)); invoice = user.BitPay.GetInvoice(invoiceId, Facade.Merchant); - Assert.Equal(InvoiceState.ToString(InvoiceStatus.Invalid), invoice.Status); + Assert.Equal(InvoiceState.ToString(InvoiceStatusLegacy.Invalid), invoice.Status); Assert.IsType(await paymentRequestController.CancelUnpaidPendingInvoice(paymentRequestId, false)); diff --git a/BTCPayServer.Tests/SeleniumTests.cs b/BTCPayServer.Tests/SeleniumTests.cs index 3f22bc605..61a508eef 100644 --- a/BTCPayServer.Tests/SeleniumTests.cs +++ b/BTCPayServer.Tests/SeleniumTests.cs @@ -624,7 +624,7 @@ namespace BTCPayServer.Tests new SelectElement(s.Driver.FindElement(By.Name("Everything"))) .SelectByValue("false"); s.Driver.FindElement(By.Id("InvoiceCreated")).Click(); - s.Driver.FindElement(By.Id("InvoicePaidInFull")).Click(); + s.Driver.FindElement(By.Id("InvoiceProcessing")).Click(); s.Driver.FindElement(By.Name("add")).Click(); } @@ -657,7 +657,7 @@ namespace BTCPayServer.Tests Assert.Contains($"value=\"{value}\"", s.Driver.PageSource); } // This one should be checked - Assert.Contains($"value=\"InvoicePaidInFull\" checked", s.Driver.PageSource); + Assert.Contains($"value=\"InvoiceProcessing\" checked", s.Driver.PageSource); Assert.Contains($"value=\"InvoiceCreated\" checked", s.Driver.PageSource); // This one never been checked Assert.DoesNotContain($"value=\"InvoiceReceivedPayment\" checked", s.Driver.PageSource); diff --git a/BTCPayServer.Tests/UnitTest1.cs b/BTCPayServer.Tests/UnitTest1.cs index 86a8dc964..6225b7981 100644 --- a/BTCPayServer.Tests/UnitTest1.cs +++ b/BTCPayServer.Tests/UnitTest1.cs @@ -785,7 +785,7 @@ namespace BTCPayServer.Tests }, evt => evt.InvoiceId == invoice.Id); var fetchedInvoice = await tester.PayTester.InvoiceRepository.GetInvoice(evt.InvoiceId); - Assert.Contains(fetchedInvoice.Status, new[] { InvoiceStatus.Complete, InvoiceStatus.Confirmed }); + Assert.Contains(fetchedInvoice.Status, new[] { InvoiceStatusLegacy.Complete, InvoiceStatusLegacy.Confirmed }); Assert.Equal(InvoiceExceptionStatus.None, fetchedInvoice.ExceptionStatus); Logs.Tester.LogInformation($"Paying invoice {invoice.Id} original full amount bolt11 invoice "); @@ -1090,7 +1090,7 @@ namespace BTCPayServer.Tests response.EnsureSuccessStatusCode(); AssertConnectionDropped(); - Logs.Tester.LogInformation("Querying an onion address which can't be found should send http 500"); + Logs.Tester.LogInformation("Querying an onin address which can't be found should send http 500"); response = await client.GetAsync("http://dwoduwoi.onion/"); Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); AssertConnectionDropped(); @@ -1460,7 +1460,7 @@ namespace BTCPayServer.Tests await TestUtils.EventuallyAsync(async () => { var i = await tester.PayTester.InvoiceRepository.GetInvoice(invoice2.Id); - Assert.Equal(InvoiceStatus.New, i.Status); + Assert.Equal(InvoiceStatusLegacy.New, i.Status); Assert.Single(i.GetPayments()); Assert.False(i.GetPayments().First().Accounted); }); @@ -2743,12 +2743,12 @@ namespace BTCPayServer.Tests }); // Test on the webhooks - user.AssertHasWebhookEvent(WebhookEventType.InvoiceConfirmed, + user.AssertHasWebhookEvent(WebhookEventType.InvoiceSettled, c => { Assert.False(c.ManuallyMarked); }); - user.AssertHasWebhookEvent(WebhookEventType.InvoicePaidInFull, + user.AssertHasWebhookEvent(WebhookEventType.InvoiceProcessing, c => { Assert.True(c.OverPaid); diff --git a/BTCPayServer/Controllers/GreenField/InvoiceController.cs b/BTCPayServer/Controllers/GreenField/InvoiceController.cs index 52f5bdded..74d923fdf 100644 --- a/BTCPayServer/Controllers/GreenField/InvoiceController.cs +++ b/BTCPayServer/Controllers/GreenField/InvoiceController.cs @@ -268,8 +268,8 @@ namespace BTCPayServer.Controllers.GreenField ? InvoicePaymentMethodDataModel.Payment.PaymentStatus.Invalid : data.PaymentConfirmed(paymentEntity, entity.SpeedPolicy) || data.PaymentCompleted(paymentEntity) - ? InvoicePaymentMethodDataModel.Payment.PaymentStatus.Complete - : InvoicePaymentMethodDataModel.Payment.PaymentStatus.AwaitingCompletion, + ? InvoicePaymentMethodDataModel.Payment.PaymentStatus.Settled + : InvoicePaymentMethodDataModel.Payment.PaymentStatus.Processing, Fee = paymentEntity.NetworkFee, Value = data.GetValue(), ReceivedDate = paymentEntity.ReceivedTime.DateTime @@ -287,7 +287,7 @@ namespace BTCPayServer.Controllers.GreenField CreatedTime = entity.InvoiceTime, Amount = entity.Price, Id = entity.Id, - Status = entity.Status, + Status = entity.Status.ToModernStatus(), AdditionalStatus = entity.ExceptionStatus, Currency = entity.Currency, Metadata = entity.Metadata.ToJObject(), diff --git a/BTCPayServer/Controllers/InvoiceController.UI.cs b/BTCPayServer/Controllers/InvoiceController.UI.cs index e16625b9d..8d06dbb22 100644 --- a/BTCPayServer/Controllers/InvoiceController.UI.cs +++ b/BTCPayServer/Controllers/InvoiceController.UI.cs @@ -150,13 +150,13 @@ namespace BTCPayServer.Controllers bool CanRefund(InvoiceState invoiceState) { - return invoiceState.Status == InvoiceStatus.Confirmed || - invoiceState.Status == InvoiceStatus.Complete || - (invoiceState.Status == InvoiceStatus.Expired && + return invoiceState.Status == InvoiceStatusLegacy.Confirmed || + invoiceState.Status == InvoiceStatusLegacy.Complete || + (invoiceState.Status == InvoiceStatusLegacy.Expired && (invoiceState.ExceptionStatus == InvoiceExceptionStatus.PaidLate || invoiceState.ExceptionStatus == InvoiceExceptionStatus.PaidOver || invoiceState.ExceptionStatus == InvoiceExceptionStatus.PaidPartial)) || - invoiceState.Status == InvoiceStatus.Invalid; + invoiceState.Status == InvoiceStatusLegacy.Invalid; } [HttpGet] @@ -638,7 +638,7 @@ namespace BTCPayServer.Controllers if (!HttpContext.WebSockets.IsWebSocketRequest) return NotFound(); var invoice = await _InvoiceRepository.GetInvoice(invoiceId); - if (invoice == null || invoice.Status == InvoiceStatus.Complete || invoice.Status == InvoiceStatus.Invalid || invoice.Status == InvoiceStatus.Expired) + if (invoice == null || invoice.Status == InvoiceStatusLegacy.Complete || invoice.Status == InvoiceStatusLegacy.Invalid || invoice.Status == InvoiceStatusLegacy.Expired) return NotFound(); var webSocket = await HttpContext.WebSockets.AcceptWebSocketAsync(); CompositeDisposable leases = new CompositeDisposable(); @@ -715,7 +715,7 @@ namespace BTCPayServer.Controllers model.Invoices.Add(new InvoiceModel() { Status = state, - ShowCheckout = invoice.Status == InvoiceStatus.New, + ShowCheckout = invoice.Status == InvoiceStatusLegacy.New, Date = invoice.InvoiceTime, InvoiceId = invoice.Id, OrderId = invoice.Metadata.OrderId ?? string.Empty, @@ -873,7 +873,7 @@ namespace BTCPayServer.Controllers } else if (newState == "complete") { - await _InvoiceRepository.MarkInvoiceStatus(invoiceId, InvoiceStatus.Complete); + await _InvoiceRepository.MarkInvoiceStatus(invoiceId, InvoiceStatus.Settled); model.StatusString = new InvoiceState("complete", "marked").ToString(); } diff --git a/BTCPayServer/Controllers/InvoiceController.cs b/BTCPayServer/Controllers/InvoiceController.cs index f14a4d9f4..55d27d908 100644 --- a/BTCPayServer/Controllers/InvoiceController.cs +++ b/BTCPayServer/Controllers/InvoiceController.cs @@ -200,7 +200,7 @@ namespace BTCPayServer.Controllers throw new BitpayHttpException(400, "Invalid email"); entity.RefundMail = entity.Metadata.BuyerEmail; } - entity.Status = InvoiceStatus.New; + entity.Status = InvoiceStatusLegacy.New; HashSet currencyPairsToFetch = new HashSet(); var rules = storeBlob.GetRateRules(_NetworkProvider); var excludeFilter = storeBlob.GetExcludedPaymentMethods(); // Here we can compose filters from other origin with PaymentFilter.Any() diff --git a/BTCPayServer/Controllers/PaymentRequestController.cs b/BTCPayServer/Controllers/PaymentRequestController.cs index dbf56a4d1..bae0ecd62 100644 --- a/BTCPayServer/Controllers/PaymentRequestController.cs +++ b/BTCPayServer/Controllers/PaymentRequestController.cs @@ -238,8 +238,8 @@ namespace BTCPayServer.Controllers var stateAllowedToDisplay = new HashSet() { - new InvoiceState(InvoiceStatus.New, InvoiceExceptionStatus.None), - new InvoiceState(InvoiceStatus.New, InvoiceExceptionStatus.PaidPartial), + new InvoiceState(InvoiceStatusLegacy.New, InvoiceExceptionStatus.None), + new InvoiceState(InvoiceStatusLegacy.New, InvoiceExceptionStatus.PaidPartial), }; var currentInvoice = result .Invoices @@ -303,7 +303,7 @@ namespace BTCPayServer.Controllers } var invoices = result.Invoices.Where(requestInvoice => - requestInvoice.State.Status == InvoiceStatus.New && !requestInvoice.Payments.Any()); + requestInvoice.State.Status == InvoiceStatusLegacy.New && !requestInvoice.Payments.Any()); if (!invoices.Any()) { diff --git a/BTCPayServer/Controllers/StoresController.Integrations.cs b/BTCPayServer/Controllers/StoresController.Integrations.cs index 503a7f43b..6e342f572 100644 --- a/BTCPayServer/Controllers/StoresController.Integrations.cs +++ b/BTCPayServer/Controllers/StoresController.Integrations.cs @@ -86,7 +86,7 @@ namespace BTCPayServer.Controllers .ToArray(); var firstInvoiceStillPending = - matchedExistingInvoices.FirstOrDefault(entity => entity.GetInvoiceState().Status == InvoiceStatus.New); + matchedExistingInvoices.FirstOrDefault(entity => entity.GetInvoiceState().Status == InvoiceStatusLegacy.New); if (firstInvoiceStillPending != null) { return Ok(new @@ -98,7 +98,7 @@ namespace BTCPayServer.Controllers var firstInvoiceSettled = matchedExistingInvoices.LastOrDefault(entity => - new[] {InvoiceStatus.Paid, InvoiceStatus.Complete, InvoiceStatus.Confirmed}.Contains( + new[] {InvoiceStatusLegacy.Paid, InvoiceStatusLegacy.Complete, InvoiceStatusLegacy.Confirmed}.Contains( entity.GetInvoiceState().Status)); var store = await _Repo.FindStore(storeId); @@ -119,7 +119,7 @@ namespace BTCPayServer.Controllers { //if BTCPay was shut down before the tx managed to get registered on shopify, this will fix it on the next UI load in shopify if (client != null && order?.FinancialStatus == "pending" && - firstInvoiceSettled.Status != InvoiceStatus.Paid) + firstInvoiceSettled.Status != InvoiceStatusLegacy.Paid) { await new OrderTransactionRegisterLogic(client).Process(orderId, firstInvoiceSettled.Id, firstInvoiceSettled.Currency, diff --git a/BTCPayServer/HostedServices/InvoiceNotificationManager.cs b/BTCPayServer/HostedServices/InvoiceNotificationManager.cs index 50f1ca557..3f57e2a6d 100644 --- a/BTCPayServer/HostedServices/InvoiceNotificationManager.cs +++ b/BTCPayServer/HostedServices/InvoiceNotificationManager.cs @@ -99,11 +99,11 @@ namespace BTCPayServer.HostedServices // So here, we just override the status expressed by the notification if (invoiceEvent.Name == InvoiceEvent.Confirmed) { - notification.Data.Status = InvoiceState.ToString(InvoiceStatus.Confirmed); + notification.Data.Status = InvoiceState.ToString(InvoiceStatusLegacy.Confirmed); } if (invoiceEvent.Name == InvoiceEvent.PaidInFull) { - notification.Data.Status = InvoiceState.ToString(InvoiceStatus.Paid); + notification.Data.Status = InvoiceState.ToString(InvoiceStatusLegacy.Paid); } ////////////////// diff --git a/BTCPayServer/HostedServices/InvoiceWatcher.cs b/BTCPayServer/HostedServices/InvoiceWatcher.cs index 98f871960..75168bc18 100644 --- a/BTCPayServer/HostedServices/InvoiceWatcher.cs +++ b/BTCPayServer/HostedServices/InvoiceWatcher.cs @@ -68,11 +68,11 @@ namespace BTCPayServer.HostedServices private void UpdateInvoice(UpdateInvoiceContext context) { var invoice = context.Invoice; - if (invoice.Status == InvoiceStatus.New && invoice.ExpirationTime <= DateTimeOffset.UtcNow) + if (invoice.Status == InvoiceStatusLegacy.New && invoice.ExpirationTime <= DateTimeOffset.UtcNow) { context.MarkDirty(); context.UnaffectAddresses(); - invoice.Status = InvoiceStatus.Expired; + invoice.Status = InvoiceStatusLegacy.Expired; context.Events.Add(new InvoiceEvent(invoice, InvoiceEvent.Expired)); if (invoice.ExceptionStatus == InvoiceExceptionStatus.PaidPartial) context.Events.Add(new InvoiceEvent(invoice, InvoiceEvent.ExpiredPaidPartial)); @@ -81,19 +81,19 @@ namespace BTCPayServer.HostedServices var paymentMethod = GetNearestClearedPayment(allPaymentMethods, out var accounting); if (paymentMethod == null) return; - if (invoice.Status == InvoiceStatus.New || invoice.Status == InvoiceStatus.Expired) + if (invoice.Status == InvoiceStatusLegacy.New || invoice.Status == InvoiceStatusLegacy.Expired) { if (accounting.Paid >= accounting.MinimumTotalDue) { - if (invoice.Status == InvoiceStatus.New) + if (invoice.Status == InvoiceStatusLegacy.New) { context.Events.Add(new InvoiceEvent(invoice, InvoiceEvent.PaidInFull)); - invoice.Status = InvoiceStatus.Paid; + invoice.Status = InvoiceStatusLegacy.Paid; invoice.ExceptionStatus = accounting.Paid > accounting.TotalDue ? InvoiceExceptionStatus.PaidOver : InvoiceExceptionStatus.None; context.UnaffectAddresses(); context.MarkDirty(); } - else if (invoice.Status == InvoiceStatus.Expired && invoice.ExceptionStatus != InvoiceExceptionStatus.PaidLate) + else if (invoice.Status == InvoiceStatusLegacy.Expired && invoice.ExceptionStatus != InvoiceExceptionStatus.PaidLate) { invoice.ExceptionStatus = InvoiceExceptionStatus.PaidLate; context.Events.Add(new InvoiceEvent(invoice, InvoiceEvent.PaidAfterExpiration)); @@ -109,7 +109,7 @@ namespace BTCPayServer.HostedServices } // Just make sure RBF did not cancelled a payment - if (invoice.Status == InvoiceStatus.Paid) + if (invoice.Status == InvoiceStatusLegacy.Paid) { if (accounting.MinimumTotalDue <= accounting.Paid && accounting.Paid <= accounting.TotalDue && invoice.ExceptionStatus == InvoiceExceptionStatus.PaidOver) { @@ -125,13 +125,13 @@ namespace BTCPayServer.HostedServices if (accounting.Paid < accounting.MinimumTotalDue) { - invoice.Status = InvoiceStatus.New; + invoice.Status = InvoiceStatusLegacy.New; invoice.ExceptionStatus = accounting.Paid == Money.Zero ? InvoiceExceptionStatus.None : InvoiceExceptionStatus.PaidPartial; context.MarkDirty(); } } - if (invoice.Status == InvoiceStatus.Paid) + if (invoice.Status == InvoiceStatusLegacy.Paid) { var confirmedAccounting = paymentMethod.Calculate(p => p.GetCryptoPaymentData().PaymentConfirmed(p, invoice.SpeedPolicy)); @@ -143,25 +143,25 @@ namespace BTCPayServer.HostedServices { context.UnaffectAddresses(); context.Events.Add(new InvoiceEvent(invoice, InvoiceEvent.FailedToConfirm)); - invoice.Status = InvoiceStatus.Invalid; + invoice.Status = InvoiceStatusLegacy.Invalid; context.MarkDirty(); } else if (confirmedAccounting.Paid >= accounting.MinimumTotalDue) { context.UnaffectAddresses(); - invoice.Status = InvoiceStatus.Confirmed; + invoice.Status = InvoiceStatusLegacy.Confirmed; context.Events.Add(new InvoiceEvent(invoice, InvoiceEvent.Confirmed)); context.MarkDirty(); } } - if (invoice.Status == InvoiceStatus.Confirmed) + if (invoice.Status == InvoiceStatusLegacy.Confirmed) { var completedAccounting = paymentMethod.Calculate(p => p.GetCryptoPaymentData().PaymentCompleted(p)); if (completedAccounting.Paid >= accounting.MinimumTotalDue) { context.Events.Add(new InvoiceEvent(invoice, InvoiceEvent.Completed)); - invoice.Status = InvoiceStatus.Complete; + invoice.Status = InvoiceStatusLegacy.Complete; context.MarkDirty(); } } @@ -299,8 +299,8 @@ namespace BTCPayServer.HostedServices _EventAggregator.Publish(evt, evt.GetType()); } - if (invoice.Status == InvoiceStatus.Complete || - ((invoice.Status == InvoiceStatus.Invalid || invoice.Status == InvoiceStatus.Expired) && invoice.MonitoringExpiration < DateTimeOffset.UtcNow)) + if (invoice.Status == InvoiceStatusLegacy.Complete || + ((invoice.Status == InvoiceStatusLegacy.Invalid || invoice.Status == InvoiceStatusLegacy.Expired) && invoice.MonitoringExpiration < DateTimeOffset.UtcNow)) { var extendInvoiceMonitoring = await UpdateConfirmationCount(invoice); diff --git a/BTCPayServer/HostedServices/WebhookNotificationManager.cs b/BTCPayServer/HostedServices/WebhookNotificationManager.cs index 319936f08..f027e8961 100644 --- a/BTCPayServer/HostedServices/WebhookNotificationManager.cs +++ b/BTCPayServer/HostedServices/WebhookNotificationManager.cs @@ -17,6 +17,7 @@ using BTCPayServer.Client.Models; using BTCPayServer.Data; using BTCPayServer.Events; using BTCPayServer.Logging; +using BTCPayServer.Services.Invoices; using BTCPayServer.Services.Stores; using Microsoft.CodeAnalysis.Operations; using Microsoft.EntityFrameworkCore; @@ -163,10 +164,11 @@ namespace BTCPayServer.HostedServices switch (eventCode) { case InvoiceEventCode.Completed: + case InvoiceEventCode.PaidAfterExpiration: return null; case InvoiceEventCode.Confirmed: case InvoiceEventCode.MarkedCompleted: - return new WebhookInvoiceConfirmedEvent(WebhookEventType.InvoiceConfirmed) + return new WebhookInvoiceSettledEvent(WebhookEventType.InvoiceSettled) { ManuallyMarked = eventCode == InvoiceEventCode.MarkedCompleted }; @@ -185,16 +187,14 @@ namespace BTCPayServer.HostedServices ManuallyMarked = eventCode == InvoiceEventCode.MarkedInvalid }; case InvoiceEventCode.PaidInFull: - case InvoiceEventCode.PaidAfterExpiration: - return new WebhookInvoicePaidEvent(WebhookEventType.InvoicePaidInFull) + return new WebhookInvoiceProcessingEvent(WebhookEventType.InvoiceProcessing) { OverPaid = invoiceEvent.Invoice.ExceptionStatus == InvoiceExceptionStatus.PaidOver, - PaidAfterExpiration = eventCode == InvoiceEventCode.PaidAfterExpiration }; case InvoiceEventCode.ReceivedPayment: return new WebhookInvoiceReceivedPaymentEvent(WebhookEventType.InvoiceReceivedPayment) { - AfterExpiration = invoiceEvent.Invoice.Status == InvoiceStatus.Expired || invoiceEvent.Invoice.Status == InvoiceStatus.Invalid + AfterExpiration = invoiceEvent.Invoice.Status.ToModernStatus() == InvoiceStatus.Expired || invoiceEvent.Invoice.Status.ToModernStatus() == InvoiceStatus.Invalid }; default: return null; diff --git a/BTCPayServer/Models/PaymentRequestViewModels/ListPaymentRequestsViewModel.cs b/BTCPayServer/Models/PaymentRequestViewModels/ListPaymentRequestsViewModel.cs index 42fb5241d..e8f3c6841 100644 --- a/BTCPayServer/Models/PaymentRequestViewModels/ListPaymentRequestsViewModel.cs +++ b/BTCPayServer/Models/PaymentRequestViewModels/ListPaymentRequestsViewModel.cs @@ -142,7 +142,7 @@ namespace BTCPayServer.Models.PaymentRequestViewModels public decimal Amount { get; set; } public string AmountFormatted { get; set; } public InvoiceState State { get; set; } - public InvoiceStatus Status { get; set; } + public InvoiceStatusLegacy Status { get; set; } public string StateFormatted { get; set; } public List Payments { get; set; } diff --git a/BTCPayServer/PaymentRequest/PaymentRequestService.cs b/BTCPayServer/PaymentRequest/PaymentRequestService.cs index 59ab8819a..6c39a685f 100644 --- a/BTCPayServer/PaymentRequest/PaymentRequestService.cs +++ b/BTCPayServer/PaymentRequest/PaymentRequestService.cs @@ -83,7 +83,7 @@ namespace BTCPayServer.PaymentRequest var paymentStats = _AppService.GetContributionsByPaymentMethodId(blob.Currency, invoices, true); var amountDue = blob.Amount - paymentStats.TotalCurrency; var pendingInvoice = invoices.OrderByDescending(entity => entity.InvoiceTime) - .FirstOrDefault(entity => entity.Status == InvoiceStatus.New); + .FirstOrDefault(entity => entity.Status == InvoiceStatusLegacy.New); return new ViewPaymentRequestViewModel(pr) { diff --git a/BTCPayServer/Payments/Lightning/LightningListener.cs b/BTCPayServer/Payments/Lightning/LightningListener.cs index 12de6e39d..fb2c378d7 100644 --- a/BTCPayServer/Payments/Lightning/LightningListener.cs +++ b/BTCPayServer/Payments/Lightning/LightningListener.cs @@ -144,7 +144,7 @@ namespace BTCPayServer.Payments.Lightning _CheckInvoices.Writer.TryWrite(inv.Invoice.Id); } - if (inv.Name == InvoiceEvent.ReceivedPayment && inv.Invoice.Status == InvoiceStatus.New && inv.Invoice.ExceptionStatus == InvoiceExceptionStatus.PaidPartial) + if (inv.Name == InvoiceEvent.ReceivedPayment && inv.Invoice.Status == InvoiceStatusLegacy.New && inv.Invoice.ExceptionStatus == InvoiceExceptionStatus.PaidPartial) { var pm = inv.Invoice.GetPaymentMethods().First(); if (pm.Calculate().Due.GetValue(pm.Network as BTCPayNetwork) > 0m) @@ -155,7 +155,7 @@ namespace BTCPayServer.Payments.Lightning })); leases.Add(_Aggregator.Subscribe(async inv => { - if (inv.State.Status == InvoiceStatus.New && + if (inv.State.Status == InvoiceStatusLegacy.New && inv.State.ExceptionStatus == InvoiceExceptionStatus.PaidPartial) { diff --git a/BTCPayServer/Services/Apps/AppService.cs b/BTCPayServer/Services/Apps/AppService.cs index b6ef4f21b..78247bf29 100644 --- a/BTCPayServer/Services/Apps/AppService.cs +++ b/BTCPayServer/Services/Apps/AppService.cs @@ -89,9 +89,9 @@ namespace BTCPayServer.Services.Apps } var invoices = await GetInvoicesForApp(appData, lastResetDate); - var completeInvoices = invoices.Where(entity => entity.Status == InvoiceStatus.Complete || entity.Status == InvoiceStatus.Confirmed).ToArray(); - var pendingInvoices = invoices.Where(entity => !(entity.Status == InvoiceStatus.Complete || entity.Status == InvoiceStatus.Confirmed)).ToArray(); - var paidInvoices = invoices.Where(entity => entity.Status == InvoiceStatus.Complete || entity.Status == InvoiceStatus.Confirmed || entity.Status == InvoiceStatus.Paid).ToArray(); + var completeInvoices = invoices.Where(entity => entity.Status == InvoiceStatusLegacy.Complete || entity.Status == InvoiceStatusLegacy.Confirmed).ToArray(); + var pendingInvoices = invoices.Where(entity => !(entity.Status == InvoiceStatusLegacy.Complete || entity.Status == InvoiceStatusLegacy.Confirmed)).ToArray(); + var paidInvoices = invoices.Where(entity => entity.Status == InvoiceStatusLegacy.Complete || entity.Status == InvoiceStatusLegacy.Confirmed || entity.Status == InvoiceStatusLegacy.Paid).ToArray(); var pendingPayments = GetContributionsByPaymentMethodId(settings.TargetCurrency, pendingInvoices, !settings.EnforceTargetAmount); var currentPayments = GetContributionsByPaymentMethodId(settings.TargetCurrency, completeInvoices, !settings.EnforceTargetAmount); @@ -176,10 +176,10 @@ namespace BTCPayServer.Services.Apps StoreId = new[] { appData.StoreData.Id }, OrderId = appData.TagAllInvoices ? null : new[] { GetCrowdfundOrderId(appData.Id) }, Status = new string[]{ - InvoiceState.ToString(InvoiceStatus.New), - InvoiceState.ToString(InvoiceStatus.Paid), - InvoiceState.ToString(InvoiceStatus.Confirmed), - InvoiceState.ToString(InvoiceStatus.Complete)}, + InvoiceState.ToString(InvoiceStatusLegacy.New), + InvoiceState.ToString(InvoiceStatusLegacy.Paid), + InvoiceState.ToString(InvoiceStatusLegacy.Confirmed), + InvoiceState.ToString(InvoiceStatusLegacy.Complete)}, StartDate = startDate }); @@ -340,7 +340,7 @@ namespace BTCPayServer.Services.Apps contribution.Value = contribution.CurrencyValue; // For hardcap, we count newly created invoices as part of the contributions - if (!softcap && p.Status == InvoiceStatus.New) + if (!softcap && p.Status == InvoiceStatusLegacy.New) return new[] { contribution }; // If the user get a donation via other mean, he can register an invoice manually for such amount @@ -348,7 +348,7 @@ namespace BTCPayServer.Services.Apps var payments = p.GetPayments(); if (payments.Count == 0 && p.ExceptionStatus == InvoiceExceptionStatus.Marked && - p.Status == InvoiceStatus.Complete) + p.Status == InvoiceStatusLegacy.Complete) return new[] { contribution }; contribution.CurrencyValue = 0m; @@ -356,7 +356,7 @@ namespace BTCPayServer.Services.Apps // If an invoice has been marked invalid, remove the contribution if (p.ExceptionStatus == InvoiceExceptionStatus.Marked && - p.Status == InvoiceStatus.Invalid) + p.Status == InvoiceStatusLegacy.Invalid) return new[] { contribution }; diff --git a/BTCPayServer/Services/Invoices/InvoiceEntity.cs b/BTCPayServer/Services/Invoices/InvoiceEntity.cs index eebfc89aa..40a870abb 100644 --- a/BTCPayServer/Services/Invoices/InvoiceEntity.cs +++ b/BTCPayServer/Services/Invoices/InvoiceEntity.cs @@ -219,7 +219,7 @@ namespace BTCPayServer.Services.Invoices } [JsonIgnore] - public InvoiceStatus Status { get; set; } + public InvoiceStatusLegacy Status { get; set; } [JsonProperty(PropertyName = "status")] [Obsolete("Use Status instead")] public string StatusString => InvoiceState.ToString(Status); @@ -578,24 +578,54 @@ namespace BTCPayServer.Services.Invoices } } - + public enum InvoiceStatusLegacy + { + New, + Paid, + Expired, + Invalid, + Complete, + Confirmed + } + public static class InvoiceStatusLegacyExtensions + { + public static InvoiceStatus ToModernStatus(this InvoiceStatusLegacy legacy) + { + switch (legacy) + { + case InvoiceStatusLegacy.Complete: + case InvoiceStatusLegacy.Confirmed: + return InvoiceStatus.Settled; + case InvoiceStatusLegacy.Expired: + return InvoiceStatus.Expired; + case InvoiceStatusLegacy.Invalid: + return InvoiceStatus.Invalid; + case InvoiceStatusLegacy.Paid: + return InvoiceStatus.Processing; + case InvoiceStatusLegacy.New: + return InvoiceStatus.New; + default: + throw new NotSupportedException(); + } + } + } public class InvoiceState { - static readonly Dictionary _StringToInvoiceStatus; - static readonly Dictionary _InvoiceStatusToString; + static readonly Dictionary _StringToInvoiceStatus; + static readonly Dictionary _InvoiceStatusToString; static readonly Dictionary _StringToExceptionStatus; static readonly Dictionary _ExceptionStatusToString; static InvoiceState() { - _StringToInvoiceStatus = new Dictionary(); - _StringToInvoiceStatus.Add("paid", InvoiceStatus.Paid); - _StringToInvoiceStatus.Add("expired", InvoiceStatus.Expired); - _StringToInvoiceStatus.Add("invalid", InvoiceStatus.Invalid); - _StringToInvoiceStatus.Add("complete", InvoiceStatus.Complete); - _StringToInvoiceStatus.Add("new", InvoiceStatus.New); - _StringToInvoiceStatus.Add("confirmed", InvoiceStatus.Confirmed); + _StringToInvoiceStatus = new Dictionary(); + _StringToInvoiceStatus.Add("paid", InvoiceStatusLegacy.Paid); + _StringToInvoiceStatus.Add("expired", InvoiceStatusLegacy.Expired); + _StringToInvoiceStatus.Add("invalid", InvoiceStatusLegacy.Invalid); + _StringToInvoiceStatus.Add("complete", InvoiceStatusLegacy.Complete); + _StringToInvoiceStatus.Add("new", InvoiceStatusLegacy.New); + _StringToInvoiceStatus.Add("confirmed", InvoiceStatusLegacy.Confirmed); _InvoiceStatusToString = _StringToInvoiceStatus.ToDictionary(kv => kv.Value, kv => kv.Key); _StringToExceptionStatus = new Dictionary(); @@ -612,16 +642,16 @@ namespace BTCPayServer.Services.Invoices Status = _StringToInvoiceStatus[status]; ExceptionStatus = _StringToExceptionStatus[exceptionStatus ?? string.Empty]; } - public InvoiceState(InvoiceStatus status, InvoiceExceptionStatus exceptionStatus) + public InvoiceState(InvoiceStatusLegacy status, InvoiceExceptionStatus exceptionStatus) { Status = status; ExceptionStatus = exceptionStatus; } - public InvoiceStatus Status { get; } + public InvoiceStatusLegacy Status { get; } public InvoiceExceptionStatus ExceptionStatus { get; } - public static string ToString(InvoiceStatus status) + public static string ToString(InvoiceStatusLegacy status) { return _InvoiceStatusToString[status]; } @@ -633,20 +663,20 @@ namespace BTCPayServer.Services.Invoices public bool CanMarkComplete() { - return (Status == InvoiceStatus.Paid) || - ((Status == InvoiceStatus.New || Status == InvoiceStatus.Expired) && ExceptionStatus == InvoiceExceptionStatus.PaidPartial) || - ((Status == InvoiceStatus.New || Status == InvoiceStatus.Expired) && ExceptionStatus == InvoiceExceptionStatus.PaidLate) || - (Status != InvoiceStatus.Complete && ExceptionStatus == InvoiceExceptionStatus.Marked) || - (Status == InvoiceStatus.Invalid); + return (Status == InvoiceStatusLegacy.Paid) || + ((Status == InvoiceStatusLegacy.New || Status == InvoiceStatusLegacy.Expired) && ExceptionStatus == InvoiceExceptionStatus.PaidPartial) || + ((Status == InvoiceStatusLegacy.New || Status == InvoiceStatusLegacy.Expired) && ExceptionStatus == InvoiceExceptionStatus.PaidLate) || + (Status != InvoiceStatusLegacy.Complete && ExceptionStatus == InvoiceExceptionStatus.Marked) || + (Status == InvoiceStatusLegacy.Invalid); } public bool CanMarkInvalid() { - return (Status == InvoiceStatus.Paid) || - (Status == InvoiceStatus.New) || - ((Status == InvoiceStatus.New || Status == InvoiceStatus.Expired) && ExceptionStatus == InvoiceExceptionStatus.PaidPartial) || - ((Status == InvoiceStatus.New || Status == InvoiceStatus.Expired) && ExceptionStatus == InvoiceExceptionStatus.PaidLate) || - (Status != InvoiceStatus.Invalid && ExceptionStatus == InvoiceExceptionStatus.Marked); + return (Status == InvoiceStatusLegacy.Paid) || + (Status == InvoiceStatusLegacy.New) || + ((Status == InvoiceStatusLegacy.New || Status == InvoiceStatusLegacy.Expired) && ExceptionStatus == InvoiceExceptionStatus.PaidPartial) || + ((Status == InvoiceStatusLegacy.New || Status == InvoiceStatusLegacy.Expired) && ExceptionStatus == InvoiceExceptionStatus.PaidLate) || + (Status != InvoiceStatusLegacy.Invalid && ExceptionStatus == InvoiceExceptionStatus.Marked); } public override int GetHashCode() diff --git a/BTCPayServer/Services/Invoices/InvoiceRepository.cs b/BTCPayServer/Services/Invoices/InvoiceRepository.cs index 35a3db316..4b6d83255 100644 --- a/BTCPayServer/Services/Invoices/InvoiceRepository.cs +++ b/BTCPayServer/Services/Invoices/InvoiceRepository.cs @@ -453,15 +453,17 @@ retry: context.Attach(invoiceData); string eventName; + string legacyStatus; switch (status) { - case InvoiceStatus.Complete: + case InvoiceStatus.Settled: if (!invoiceData.GetInvoiceState().CanMarkComplete()) { return false; } eventName = InvoiceEvent.MarkedCompleted; + legacyStatus = InvoiceStatusLegacy.Complete.ToString(); break; case InvoiceStatus.Invalid: if (!invoiceData.GetInvoiceState().CanMarkInvalid()) @@ -469,12 +471,13 @@ retry: return false; } eventName = InvoiceEvent.MarkedInvalid; + legacyStatus = InvoiceStatusLegacy.Invalid.ToString(); break; default: return false; } - invoiceData.Status = status.ToString().ToLowerInvariant(); + invoiceData.Status = legacyStatus.ToLowerInvariant(); invoiceData.ExceptionStatus = InvoiceExceptionStatus.Marked.ToString().ToLowerInvariant(); _eventAggregator.Publish(new InvoiceEvent(ToEntity(invoiceData), eventName)); await context.SaveChangesAsync(); diff --git a/BTCPayServer/Services/Shopify/ShopifyOrderMarkerHostedService.cs b/BTCPayServer/Services/Shopify/ShopifyOrderMarkerHostedService.cs index 63a2a7c9f..de917f431 100644 --- a/BTCPayServer/Services/Shopify/ShopifyOrderMarkerHostedService.cs +++ b/BTCPayServer/Services/Shopify/ShopifyOrderMarkerHostedService.cs @@ -49,14 +49,14 @@ namespace BTCPayServer.Services.Shopify var shopifyOrderId = invoice.GetInternalTags(SHOPIFY_ORDER_ID_PREFIX).FirstOrDefault(); if (shopifyOrderId != null) { - if (new[] {InvoiceStatus.Invalid, InvoiceStatus.Expired}.Contains(invoice.GetInvoiceState() + if (new[] {InvoiceStatusLegacy.Invalid, InvoiceStatusLegacy.Expired}.Contains(invoice.GetInvoiceState() .Status) && invoice.ExceptionStatus != InvoiceExceptionStatus.None) { //you have failed us, customer await RegisterTransaction(invoice, shopifyOrderId, false); } - else if (new[] {InvoiceStatus.Complete, InvoiceStatus.Confirmed}.Contains( + else if (new[] {InvoiceStatusLegacy.Complete, InvoiceStatusLegacy.Confirmed}.Contains( invoice.Status)) { await RegisterTransaction(invoice, shopifyOrderId, true); diff --git a/BTCPayServer/Views/PaymentRequest/ViewPaymentRequest.cshtml b/BTCPayServer/Views/PaymentRequest/ViewPaymentRequest.cshtml index e52c4c718..0a9fe9bd6 100644 --- a/BTCPayServer/Views/PaymentRequest/ViewPaymentRequest.cshtml +++ b/BTCPayServer/Views/PaymentRequest/ViewPaymentRequest.cshtml @@ -11,11 +11,10 @@ string StatusTextClass(InvoiceState state) { - switch (state.Status) + switch (state.Status.ToModernStatus()) { - case InvoiceStatus.Confirmed: - case InvoiceStatus.Complete: - case InvoiceStatus.Paid: + case InvoiceStatus.Settled: + case InvoiceStatus.Processing: return "text-success"; case InvoiceStatus.Expired: switch (state.ExceptionStatus) diff --git a/BTCPayServer/Views/Stores/ModifyWebhook.cshtml b/BTCPayServer/Views/Stores/ModifyWebhook.cshtml index 8d1df1492..4a3d74654 100644 --- a/BTCPayServer/Views/Stores/ModifyWebhook.cshtml +++ b/BTCPayServer/Views/Stores/ModifyWebhook.cshtml @@ -55,9 +55,9 @@ { ("A new invoice has been created", WebhookEventType.InvoiceCreated), ("A new payment has been received", WebhookEventType.InvoiceReceivedPayment), - ("An invoice is fully paid", WebhookEventType.InvoicePaidInFull), + ("An invoice is processing", WebhookEventType.InvoiceProcessing), ("An invoice has expired", WebhookEventType.InvoiceExpired), - ("An invoice has been confirmed", WebhookEventType.InvoiceConfirmed), + ("An invoice has been settled", WebhookEventType.InvoiceSettled), ("An invoice became invalid", WebhookEventType.InvoiceInvalid) }) { diff --git a/BTCPayServer/wwwroot/swagger/v1/swagger.template.invoices.json b/BTCPayServer/wwwroot/swagger/v1/swagger.template.invoices.json index 5da8a0230..aa7a7d55e 100644 --- a/BTCPayServer/wwwroot/swagger/v1/swagger.template.invoices.json +++ b/BTCPayServer/wwwroot/swagger/v1/swagger.template.invoices.json @@ -521,19 +521,17 @@ "description": "", "x-enumNames": [ "New", - "Paid", + "Processing", "Expired", "Invalid", - "Complete", - "Confirmed" + "Settled" ], "enum": [ "New", - "Paid", + "Processing", "Expired", "Invalid", - "Complete", - "Confirmed" + "Settled" ] }, "InvoiceAdditionalStatus": { @@ -778,13 +776,13 @@ "description": "", "x-enumNames": [ "Invalid", - "AwaitingCompletion", - "Complete" + "Processing", + "Settled" ], "enum": [ "Invalid", - "AwaitingCompletion", - "Complete" + "Processing", + "Settled" ] } } diff --git a/BTCPayServer/wwwroot/swagger/v1/swagger.template.webhooks.json b/BTCPayServer/wwwroot/swagger/v1/swagger.template.webhooks.json index 38991556e..d34bb655c 100644 --- a/BTCPayServer/wwwroot/swagger/v1/swagger.template.webhooks.json +++ b/BTCPayServer/wwwroot/swagger/v1/swagger.template.webhooks.json @@ -579,7 +579,7 @@ }, "specificEvents": { "type": "string", - "description": "If `everything` is false, the specific events that the endpoint is interested in. Current events are: `InvoiceCreated`, `InvoiceReceivedPayment`, `InvoicePaidInFull`, `InvoiceExpired`, `InvoiceConfirmed`, `InvoiceInvalid`.", + "description": "If `everything` is false, the specific events that the endpoint is interested in. Current events are: `InvoiceCreated`, `InvoiceReceivedPayment`, `InvoiceProcessing`, `InvoiceExpired`, `InvoiceSettled`, `InvoiceInvalid`.", "nullable": false } } @@ -644,8 +644,8 @@ } ] }, - "WebhookInvoiceConfirmedEvent": { - "description": "Callback sent if the `type` is `InvoiceConfirmed`", + "WebhookInvoiceSettledEvent": { + "description": "Callback sent if the `type` is `InvoiceSettled`", "allOf": [ { "$ref": "#/components/schemas/WebhookInvoiceEvent" @@ -680,8 +680,8 @@ } ] }, - "WebhookInvoicePaidEvent": { - "description": "Callback sent if the `type` is `InvoicePaidInFull`", + "WebhookInvoiceProcessingEvent": { + "description": "Callback sent if the `type` is `InvoiceProcessing`", "allOf": [ { "$ref": "#/components/schemas/WebhookInvoiceEvent" @@ -693,11 +693,6 @@ "type": "boolean", "description": "Whether this invoice has received more money than expected", "nullable": false - }, - "paidAfterExpiration": { - "type": "boolean", - "description": "Whether this invoice has been paid too late", - "nullable": false } } } @@ -832,9 +827,9 @@ } } }, - "Invoice paid": { + "Invoice processing": { "post": { - "summary": "Invoice paid", + "summary": "Invoice processing", "description": "An invoice has been fully paid", "parameters": [ { @@ -855,7 +850,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/WebhookInvoicePaidEvent" + "$ref": "#/components/schemas/WebhookInvoiceProcessingEvent" } } } @@ -892,10 +887,10 @@ } } }, - "Invoice confirmed": { + "Invoice settled": { "post": { - "summary": "Invoice confirmed", - "description": "An invoice has been confirmed, order considered settled", + "summary": "Invoice settled", + "description": "An invoice has been settled", "parameters": [ { "in": "header", @@ -915,7 +910,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/WebhookInvoiceConfirmedEvent" + "$ref": "#/components/schemas/WebhookInvoiceSettledEvent" } } }