Issue #3612148: Seating configurations: open or close venue sections (and half-sections) per resource
Adds seating configurations: a venue can be opened in several ways (full house, reduced capacity, choir on stage) and a resource runs under one, with no seats duplicated.
Model
- New content entity
yoyaku_seat_configuration(venue-scoped) storing only what it closes:closed_sections(multi-ref) andclosed_subsections(int multi). A configuration that closes nothing is the full venue. - Seats gain an optional integer
subsection(a numeric slice of a section), so a configuration can shut half a section, not just whole sections. - A seat is open when its section is not closed and its subsection, if any, is not closed.
- The venue gains an optional
default_configuration; a resource keeps itsvenuefield and gains an optionalconfigurationoverride. Active config = resource's, else the venue default, else none (whole venue, unchanged).
Behaviour
SeatAvailabilityresolves the active configuration and drops closed seats;SeatMapBuilderomits them from the map (emittingsubsection).SeatBookablerefuses a hold on a closed seat under the slot lock, so no booking path can take one (the authoritative guard behind the map hiding it).- Admin: a venue Configurations tab (list/add) plus a bespoke form presenting the venue's sections and subsections as enable checkboxes (checked = open); only the unchecked are stored as closed.
Additive: no data migration, existing venues/resources unchanged. Price grade stays on the seat for now.
Includes a kernel test (accessors, availability filtering, venue-default fallback, closed-seat booking refusal), French translations and docs.
Follow-ups: io round-trip of subsection/configurations, a graphical configuration editor, per-configuration grade overrides.