diff --git a/BTCPayServer.Tests/GreenfieldAPITests.cs b/BTCPayServer.Tests/GreenfieldAPITests.cs index f6a379bd8..229709d4d 100644 --- a/BTCPayServer.Tests/GreenfieldAPITests.cs +++ b/BTCPayServer.Tests/GreenfieldAPITests.cs @@ -968,25 +968,28 @@ namespace BTCPayServer.Tests //update - invoice = await viewOnly.GetInvoice(user.StoreId, newInvoice.Id); - - await AssertValidationError(new[] { nameof(MarkInvoiceStatusRequest.Status) }, async () => + newInvoice = await client.CreateInvoice(user.StoreId, + new CreateInvoiceRequest() { Currency = "USD", Amount = 1 }); + await client.MarkInvoiceStatus(user.StoreId, newInvoice.Id, new MarkInvoiceStatusRequest() { - await client.MarkInvoiceStatus(user.StoreId, invoice.Id, new MarkInvoiceStatusRequest() - { - Status = InvoiceStatus.Settled - }); + Status = InvoiceStatus.Settled }); - + newInvoice = await client.CreateInvoice(user.StoreId, + new CreateInvoiceRequest() { Currency = "USD", Amount = 1 }); + await client.MarkInvoiceStatus(user.StoreId, newInvoice.Id, new MarkInvoiceStatusRequest() + { + Status = InvoiceStatus.Invalid + }); + await AssertHttpError(403, async () => { - await viewOnly.UpdateInvoice(user.StoreId, newInvoice.Id, + await viewOnly.UpdateInvoice(user.StoreId, invoice.Id, new UpdateInvoiceRequest() { Metadata = JObject.Parse("{\"itemCode\": \"updated\", newstuff: [1,2,3,4,5]}") }); }); - invoice = await client.UpdateInvoice(user.StoreId, newInvoice.Id, + invoice = await client.UpdateInvoice(user.StoreId, invoice.Id, new UpdateInvoiceRequest() { Metadata = JObject.Parse("{\"itemCode\": \"updated\", newstuff: [1,2,3,4,5]}") @@ -996,7 +999,7 @@ namespace BTCPayServer.Tests Assert.Equal(15,((JArray) invoice.Metadata["newstuff"]).Values().Sum()); //also test the the metadata actually got saved - invoice = await client.GetInvoice(user.StoreId, newInvoice.Id); + invoice = await client.GetInvoice(user.StoreId, invoice.Id); Assert.Equal("updated",invoice.Metadata["itemCode"].Value()); Assert.Equal(15,((JArray) invoice.Metadata["newstuff"]).Values().Sum()); diff --git a/BTCPayServer/Controllers/GreenField/InvoiceController.cs b/BTCPayServer/Controllers/GreenField/InvoiceController.cs index 3828c185d..cd2931a07 100644 --- a/BTCPayServer/Controllers/GreenField/InvoiceController.cs +++ b/BTCPayServer/Controllers/GreenField/InvoiceController.cs @@ -212,7 +212,7 @@ namespace BTCPayServer.Controllers.GreenField if (!await _invoiceRepository.MarkInvoiceStatus(invoice.Id, request.Status)) { ModelState.AddModelError(nameof(request.Status), - "Status can only be marked to invalid or complete within certain conditions."); + "Status can only be marked to invalid or settled within certain conditions."); } if (!ModelState.IsValid) diff --git a/BTCPayServer/Services/Invoices/InvoiceEntity.cs b/BTCPayServer/Services/Invoices/InvoiceEntity.cs index e3b41b95c..350c73a09 100644 --- a/BTCPayServer/Services/Invoices/InvoiceEntity.cs +++ b/BTCPayServer/Services/Invoices/InvoiceEntity.cs @@ -665,6 +665,7 @@ namespace BTCPayServer.Services.Invoices public bool CanMarkComplete() { 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.Complete && ExceptionStatus == InvoiceExceptionStatus.Marked) || diff --git a/BTCPayServer/wwwroot/swagger/v1/swagger.template.invoices.json b/BTCPayServer/wwwroot/swagger/v1/swagger.template.invoices.json index ade84ea05..006d0c7a4 100644 --- a/BTCPayServer/wwwroot/swagger/v1/swagger.template.invoices.json +++ b/BTCPayServer/wwwroot/swagger/v1/swagger.template.invoices.json @@ -433,7 +433,7 @@ } } ], - "description": "Mark an invoice as invalid or completed.", + "description": "Mark an invoice as invalid or settled.", "operationId": "Invoices_MarkInvoiceStatus", "responses": { "200": {