fix(tickets): amount_tickets is the remaining count, stop subtracting sold
Some checks failed
lint.yml / fix(tickets): amount_tickets is the remaining count, stop subtracting sold (pull_request) Failing after 0s
Some checks failed
lint.yml / fix(tickets): amount_tickets is the remaining count, stop subtracting sold (pull_request) Failing after 0s
`set_ticket_paid` decrements `amount_tickets` on every sale and increments `sold`, so the two describe the same tickets. Subtracting one from the other in `api_ticket_create` removed each sale twice: remaining = amount_tickets - sold That under-reported availability to buyers, and because `remaining + sold` is the original capacity, `sold >= amount_tickets` first becomes true at the halfway point — so every event locked itself as sold out once half its seats had gone, with the rest still unsold. Measured on aio-demo before the fix: 16 of 24 live events affected, 3 of them already refusing sales while stock remained. "Tech Meetup" had 9 tickets left and offered -2. The arithmetic was ours, introduced with the multi-quantity purchase feature; upstream has no equivalent because it sells one ticket per request and reads `amount_tickets` as remaining everywhere. So this deletes the divergence and restores upstream's own guard plus the one line `quantity` needs, which should also make the v1.6.8 rebase (#33) a little easier rather than harder. Tests walk a 50-seat event to capacity one sale at a time and pin the boundary: sold=49 passes even unfixed, sold=50 is where it used to lock. Six of the ten fail without the change. Scoped deliberately to the double-subtraction. The rest of #34 — making capacity a required field, dropping the `0 = unlimited` reading, and the organizer form that prefills remaining as though it were capacity — waits for #33, since ticket waves change the shape of that fix. Refs #34
This commit is contained in:
parent
cac7d16ece
commit
ad8aa2cf00
2 changed files with 124 additions and 11 deletions
23
views_api.py
23
views_api.py
|
|
@ -670,17 +670,18 @@ async def api_ticket_create(
|
|||
if event.canceled:
|
||||
raise HTTPException(status_code=HTTPStatus.GONE, detail="Event is canceled.")
|
||||
quantity = data.quantity
|
||||
if event.amount_tickets > 0:
|
||||
if event.sold >= event.amount_tickets:
|
||||
raise HTTPException(
|
||||
status_code=HTTPStatus.GONE, detail="Event is sold out."
|
||||
)
|
||||
remaining = event.amount_tickets - event.sold
|
||||
if quantity > remaining:
|
||||
raise HTTPException(
|
||||
status_code=HTTPStatus.BAD_REQUEST,
|
||||
detail=f"Only {remaining} ticket(s) remaining for this event.",
|
||||
)
|
||||
# `amount_tickets` IS the remaining count — `set_ticket_paid` decrements
|
||||
# it on every sale, and upstream reads it the same way everywhere. Do
|
||||
# not subtract `sold` from it: `sold` counts the same tickets the
|
||||
# decrement already removed, so doing both takes each sale off twice
|
||||
# (aiolabs/events#34).
|
||||
if event.amount_tickets < 1:
|
||||
raise HTTPException(status_code=HTTPStatus.GONE, detail="Event is sold out.")
|
||||
if quantity > event.amount_tickets:
|
||||
raise HTTPException(
|
||||
status_code=HTTPStatus.BAD_REQUEST,
|
||||
detail=f"Only {event.amount_tickets} ticket(s) remaining for this event.",
|
||||
)
|
||||
|
||||
name = data.name
|
||||
email = data.email
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue