POS: Allow overpay for articles with minimum price (#5997)

Adjust the LNURL settings so that minimum price items aren't capped and can be overpaid.

Also fixes the missing LNURL response for free items to return a proper LNURL error instead of just 404.

Fixes #5995.
This commit is contained in:
d11n 2024-05-23 13:20:58 +02:00 committed by GitHub
parent faf6b514e6
commit 89fcf86bb4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -303,11 +303,11 @@ namespace BTCPayServer
return NotFound(); return NotFound();
} }
var createInvoice = new CreateInvoiceRequest() var createInvoice = new CreateInvoiceRequest
{ {
Amount = item?.PriceType == ViewPointOfSaleViewModel.ItemPriceType.Topup? null: item?.Price, Amount = item?.PriceType == ViewPointOfSaleViewModel.ItemPriceType.Topup ? null : item?.Price,
Currency = currencyCode, Currency = currencyCode,
Checkout = new InvoiceDataBase.CheckoutOptions() Checkout = new InvoiceDataBase.CheckoutOptions
{ {
RedirectURL = app.AppType switch RedirectURL = app.AppType switch
{ {
@ -319,6 +319,7 @@ namespace BTCPayServer
AdditionalSearchTerms = new[] { AppService.GetAppSearchTerm(app) } AdditionalSearchTerms = new[] { AppService.GetAppSearchTerm(app) }
}; };
var allowOverpay = item?.PriceType is not ViewPointOfSaleViewModel.ItemPriceType.Fixed;
var invoiceMetadata = new InvoiceMetadata { OrderId = AppService.GetRandomOrderId() }; var invoiceMetadata = new InvoiceMetadata { OrderId = AppService.GetRandomOrderId() };
if (item != null) if (item != null)
{ {
@ -333,7 +334,7 @@ namespace BTCPayServer
store.GetStoreBlob(), store.GetStoreBlob(),
createInvoice, createInvoice,
additionalTags: new List<string> { AppService.GetAppInternalTag(appId) }, additionalTags: new List<string> { AppService.GetAppInternalTag(appId) },
allowOverpay: false); allowOverpay: allowOverpay);
} }
public class EditLightningAddressVM public class EditLightningAddressVM
@ -529,7 +530,9 @@ namespace BTCPayServer
return this.CreateAPIError(null, e.Message); return this.CreateAPIError(null, e.Message);
} }
lnurlRequest = await CreateLNUrlRequestFromInvoice(cryptoCode, i, store, blob, lnurlRequest, lnUrlMetadata, allowOverpay); lnurlRequest = await CreateLNUrlRequestFromInvoice(cryptoCode, i, store, blob, lnurlRequest, lnUrlMetadata, allowOverpay);
return lnurlRequest is null ? NotFound() : Ok(lnurlRequest); return lnurlRequest is null
? BadRequest(new LNUrlStatusResponse { Status = "ERROR", Reason = "Unable to create LNURL request." })
: Ok(lnurlRequest);
} }
private async Task<LNURLPayRequest> CreateLNUrlRequestFromInvoice( private async Task<LNURLPayRequest> CreateLNUrlRequestFromInvoice(