Charge weekly reservations for every claimed occurrence and confirm the whole series
CI / No Debug Code (pull_request) Successful in 2s
CI / Coding Standards (pull_request) Successful in 2m50s
CI / Tests (PHP 8.1) (pull_request) Successful in 42s
CI / Tests (PHP 8.2) (pull_request) Successful in 39s
CI / PHPStan (pull_request) Successful in 2m49s
CI / Tests (PHP 8.3) (pull_request) Successful in 2m38s
CI / Build Plugin Zip (pull_request) Skipped
CI / No Debug Code (pull_request) Successful in 2s
CI / Coding Standards (pull_request) Successful in 2m50s
CI / Tests (PHP 8.1) (pull_request) Successful in 42s
CI / Tests (PHP 8.2) (pull_request) Successful in 39s
CI / PHPStan (pull_request) Successful in 2m49s
CI / Tests (PHP 8.3) (pull_request) Successful in 2m38s
CI / Build Plugin Zip (pull_request) Skipped
A weekly booking on a per-lesson (one_time) priced offering was creating its single upfront payment for one week's price while reserving up to 12 weeks, and settling that payment confirmed only the anchor lesson, leaving the rest of the series pending forever. - BookingEndpoint now charges price x claimed occurrences for one_time billing; a full_term price is still charged once since it covers the term. - PaymentService::confirmRegistration resolves the anchor lesson's series and confirms every non-cancelled row via the new BookingRepository::updateStatusForSeries(). Closes #79 Co-Authored-By: Claude Fable 5 <[email protected]>
This commit is contained in:
@@ -44,8 +44,13 @@ slot_taken` if the freed time was booked by someone else in the meantime.
|
||||
## Weekly Reservations
|
||||
A weekly reservation creates one `series_id` shared across N lesson rows (one per
|
||||
week in the term) and reserves the matching availability windows. It is billed
|
||||
**full-term upfront** as a single payment (`billing_mode = full_term` on the
|
||||
offering).
|
||||
**upfront as a single payment** linked to the series' first (anchor) lesson:
|
||||
- `billing_mode = full_term` — the offering's price already covers the term and is charged once.
|
||||
- `billing_mode = one_time` — the per-lesson price is charged **once per occurrence actually claimed** (price × N).
|
||||
|
||||
Settling that payment (Stripe webhook, e-transfer confirmation, comp) confirms
|
||||
**every non-cancelled lesson in the series**
|
||||
(`BookingRepository::updateStatusForSeries()`), not just the anchor row.
|
||||
|
||||
## REST API
|
||||
| Method | Endpoint | Permission |
|
||||
|
||||
@@ -6,7 +6,9 @@ falls back to **e-transfer** — a pending payment a studio admin marks received
|
||||
so everything works without any credentials. When Stripe **is** configured the
|
||||
default rail becomes the **credit card**. The studio admin can override any
|
||||
student's method (card / e-transfer / comp). Single bookings are charged once;
|
||||
weekly reservations and group classes are charged the full term upfront. A
|
||||
weekly reservations and group classes are charged the full term upfront (a
|
||||
`full_term` price once, or a per-lesson `one_time` price × the occurrences
|
||||
reserved — see `lesson-booking.md`). A
|
||||
numbered receipt is emailed automatically when a payment is marked paid.
|
||||
|
||||
> **Implemented:** the payment ledger, studio settings, method resolution
|
||||
|
||||
Reference in New Issue
Block a user