CampgroundTickets/backend
Hank a987e046da Webhook: customer_name purchaser + allow ticketless orders
Two fixes for the updated Tickets 2026 form:

1. Purchaser name now comes from the new customer_name (billing) field,
   falling back to the first attendee then a plain `name`. Donor-only
   and buy-for-others orders (where the Adult #1 `names` group is empty)
   no longer 400 with "purchaser name is required". The ticket title is
   the first attendee if present, else the customer; the QR email is
   addressed to the customer.

2. Tickets are now optional. A customer can buy ice / ATV-UTV / parking
   with no admission ticket. A record + QR is created whenever there's
   anything to redeem or verify at the gate (ticket, ice, or add-on);
   only a truly empty order is rejected (no_items, replacing no_tickets).

The ticket email adapts its copy for ticketless (add-on-only) orders —
it reads as a gate pass for ice/parking/UTV instead of "0 tickets", and
names the ice bag count when present. Idempotency hash now includes
ice/extras so distinct add-on-only orders don't collide. Doc updated.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-17 17:59:56 +00:00
..
src Webhook: customer_name purchaser + allow ticketless orders 2026-07-17 17:59:56 +00:00
package-lock.json Initial Camp Scan ticketing system 2026-07-08 03:47:59 +00:00
package.json Initial Camp Scan ticketing system 2026-07-08 03:47:59 +00:00
tsconfig.json Initial Camp Scan ticketing system 2026-07-08 03:47:59 +00:00