Packages
A person's session packages — sessions bought, taken, left, and the expiry (doc 91 §4.8). The ledger is ours: neither the schema before nor the CRM port held a balance (doc 88 §5). Granting is packages.manage; taking a session from a visit is the booking power.
A person's session packages, active first, with the sessions taken
A person's session packages, active first, with the sessions taken
Grant a package (sessions, spacing and expiry default from the item)
Requires `packages.manage`. A confirmed sale of a package item grants on its own.
The packages a visit could be spent from — offered, never applied
The packages a visit could be spent from — offered, never applied
Correct a package — total, expiry, spacing, notes — or cancel / revive it
Correct a package — total, expiry, spacing, notes — or cancel / revive it
Take a session — from a visit (a booking or one of its lines) or by hand
A booking line can be taken once, from one package. Refusals are 422 with a stable `message`: `no_sessions_left`, `not_active`, `already_consumed`, `other_person`, `booking_not_active`, `line_not_in_booking`.
Give a session back (the row stays, stamped `reverted_at`)
Give a session back (the row stays, stamped `reverted_at`)
What a package item promises — sessions, spacing, validity, its services
What a package item promises — sessions, spacing, validity, its services
Set what a package item promises (`catalog.manage`)
Set what a package item promises (`catalog.manage`)