Compare commits
6 commits
v1.6.8-aio
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| cadf30b704 | |||
| 0e9cc76fef | |||
| b4ca9fe65d | |||
| 69c9a4f757 | |||
| 33501dfc90 | |||
| b55d6866d6 |
6 changed files with 110 additions and 18 deletions
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"id": "events",
|
||||
"version": "1.6.8-aio.2",
|
||||
"version": "1.6.8-aio.4",
|
||||
"name": "Events",
|
||||
"repo": "https://git.atitlan.io/aiolabs/events",
|
||||
"short_description": "Sell and register event tickets",
|
||||
|
|
|
|||
|
|
@ -224,6 +224,14 @@ def effective_payment_methods(
|
|||
"""
|
||||
explicit = list(getattr(event.extra, "payment_methods", []) or [])
|
||||
if explicit:
|
||||
# The organiser's rail list is event-level, but fiat is a per-wave
|
||||
# opt-in. Asking about a specific wave means asking what a buyer can
|
||||
# actually use for it, so drop a rail that wave cannot honour —
|
||||
# otherwise the NIP-52 tag advertises fiat and the checkout offers a
|
||||
# card button that `api_ticket_create` then refuses with "Fiat
|
||||
# payments are not enabled for this ticket wave."
|
||||
if wave is not None and not wave.allow_fiat:
|
||||
return [method for method in explicit if method != "fiat"]
|
||||
return explicit
|
||||
methods = ["lightning"]
|
||||
if wave.allow_fiat if wave is not None else event.allow_fiat:
|
||||
|
|
|
|||
|
|
@ -414,6 +414,26 @@ window.PageEvents = {
|
|||
this.ticketImageUploadTarget = null
|
||||
}
|
||||
},
|
||||
waveSummary(eventId, wave) {
|
||||
// Built here, not in the template. Vue resolves template expressions
|
||||
// against the component instance, where the `LNbits` global is NOT
|
||||
// in scope — upstream's v1.6.8 chip called `LNbits.utils` inline and
|
||||
// threw "Cannot read properties of undefined (reading 'utils')",
|
||||
// which killed the whole v-for and left the wave list looking empty.
|
||||
// No other template in this extension touches `LNbits` directly.
|
||||
const price = this.isFiatCurrency(wave.currency)
|
||||
? LNbits.utils.formatCurrency(
|
||||
Number(wave.price_per_ticket || 0).toFixed(2),
|
||||
wave.currency
|
||||
)
|
||||
: `${wave.price_per_ticket} sats`
|
||||
// Wave dates can carry a time (closing_date defaults from
|
||||
// event_end_date); show the day only.
|
||||
const opens = String(wave.opening_date || '').slice(0, 10)
|
||||
const closes = String(wave.closing_date || '').slice(0, 10)
|
||||
const sold = this.soldTicketsForWave(eventId, wave.id)
|
||||
return `${wave.title} - ${opens} to ${closes} - ${price} - ${wave.amount_tickets} tickets - ${sold} sold`
|
||||
},
|
||||
soldTicketsForWave(eventId, waveId) {
|
||||
return this.allPaidTickets.filter(
|
||||
ticket =>
|
||||
|
|
|
|||
|
|
@ -271,23 +271,7 @@
|
|||
>
|
||||
<span
|
||||
style="white-space: normal; line-height: 1.3"
|
||||
v-text="
|
||||
`${wave.title} - ${wave.opening_date} to ${
|
||||
wave.closing_date
|
||||
} - ${
|
||||
isFiatCurrency(wave.currency)
|
||||
? LNbits.utils.formatCurrency(
|
||||
Number(
|
||||
wave.price_per_ticket || 0
|
||||
).toFixed(2),
|
||||
wave.currency
|
||||
)
|
||||
: `${wave.price_per_ticket} sats`
|
||||
} - ${wave.amount_tickets} tickets - ${soldTicketsForWave(
|
||||
props.row.id,
|
||||
wave.id
|
||||
)} sold`
|
||||
"
|
||||
v-text="waveSummary(props.row.id, wave)"
|
||||
></span>
|
||||
</q-chip>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -158,3 +158,38 @@ def test_advertised_wave_key_tracks_the_published_wave():
|
|||
# Published while nothing is on sale — a real state, distinct from the
|
||||
# NULL that means "never published".
|
||||
assert advertised_wave_key(_event([CLOSED_EARLY_BIRD])) == ""
|
||||
|
||||
|
||||
def test_published_rails_drop_fiat_when_the_advertised_wave_cannot_take_it():
|
||||
"""The webapp always sets `extra.payment_methods`, so the explicit-list
|
||||
path is the normal one — and it used to ignore the wave entirely.
|
||||
|
||||
That published `tickets_payment_methods: lightning,fiat` beside an
|
||||
absent `tickets_allow_fiat`, and a card button the purchase endpoint
|
||||
then refused ("Fiat payments are not enabled for this ticket wave").
|
||||
"""
|
||||
event = _event(
|
||||
[
|
||||
_wave("a", 10.0, 0, -10, -1, allow_fiat=True),
|
||||
_wave("b", 25.0, 9, 0, 20, allow_fiat=False),
|
||||
]
|
||||
)
|
||||
event.extra.payment_methods = ["lightning", "fiat"]
|
||||
tags = _tags(event)
|
||||
|
||||
assert "tickets_allow_fiat" not in tags
|
||||
assert tags["tickets_payment_methods"] == "lightning"
|
||||
|
||||
|
||||
def test_published_rails_keep_fiat_when_the_advertised_wave_takes_it():
|
||||
event = _event(
|
||||
[
|
||||
_wave("a", 10.0, 0, -10, -1, allow_fiat=False),
|
||||
_wave("b", 25.0, 9, 0, 20, allow_fiat=True),
|
||||
]
|
||||
)
|
||||
event.extra.payment_methods = ["lightning", "fiat"]
|
||||
tags = _tags(event)
|
||||
|
||||
assert tags["tickets_allow_fiat"] == "true"
|
||||
assert tags["tickets_payment_methods"] == "lightning,fiat"
|
||||
|
|
|
|||
|
|
@ -172,3 +172,48 @@ def test_public_event_response_carries_waves():
|
|||
|
||||
assert [w["id"] for w in body["extra"]["ticket_waves"]] == ["regular"]
|
||||
assert "promo_codes" not in body["extra"]
|
||||
|
||||
|
||||
# --- rails vs per-wave fiat --------------------------------------------------
|
||||
|
||||
|
||||
def _fiat_wave(allow_fiat: bool):
|
||||
from ..models import TicketWave
|
||||
|
||||
return TicketWave(
|
||||
id="w",
|
||||
title="w",
|
||||
opening_date="2030-01-01",
|
||||
closing_date="2030-02-01",
|
||||
currency="EUR",
|
||||
price_per_ticket=10,
|
||||
amount_tickets=5,
|
||||
allow_fiat=allow_fiat,
|
||||
)
|
||||
|
||||
|
||||
def test_explicit_rails_drop_fiat_for_a_wave_that_cannot_take_it():
|
||||
"""The organiser's rail list is event-level; fiat is per-wave.
|
||||
|
||||
Without this the NIP-52 tag advertises fiat and the checkout renders a
|
||||
card button that `api_ticket_create` refuses with "Fiat payments are
|
||||
not enabled for this ticket wave" (reported on aio-demo).
|
||||
"""
|
||||
event = _event()
|
||||
event.extra.payment_methods = ["lightning", "fiat"]
|
||||
|
||||
assert effective_payment_methods(event, _fiat_wave(True)) == ["lightning", "fiat"]
|
||||
assert effective_payment_methods(event, _fiat_wave(False)) == ["lightning"]
|
||||
|
||||
|
||||
def test_event_level_question_still_reports_every_rail():
|
||||
"""No wave means "what did the organiser enable at all" — unfiltered."""
|
||||
event = _event()
|
||||
event.extra.payment_methods = ["lightning", "fiat"]
|
||||
assert effective_payment_methods(event) == ["lightning", "fiat"]
|
||||
|
||||
|
||||
def test_fiat_only_rails_on_a_non_fiat_wave_leave_nothing_purchasable():
|
||||
event = _event()
|
||||
event.extra.payment_methods = ["fiat"]
|
||||
assert effective_payment_methods(event, _fiat_wave(False)) == []
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue