Issue #3616595: Never let the orphan rule cost a booking

The orphan rule could refuse a booking outright. Where no arrangement of the party avoided stranding a place, the bottom rung of the ladder assigned nothing and nobody was seated, which keeps the place the rule protects and turns the party away as well: two places lost to save one.

The last rung now seats the party and marks the proposal lastResort. VenuePlacementProvider stamps that on the lines it builds as place_last_resort, a new base field beside place_chosen, and OrphanedPlaces lets those lines through under a new allow_last_resort setting that defaults to on. A venue that would rather keep the place switches it off and the booking is refused again.

The mark is only ever put on a proposal made when nothing legal existed, so the setting cannot excuse an arrangement the seating chose badly: a proposal that strands a place while a legal one existed carries no mark and is still refused. overTheWholeParty() carries the flag through, which a party holding a chosen place needs, since it reaches the bottom rung as readily as one holding nothing.

Two existing tests asserted the old dead end and now assert the new answer; three cases are new, including the end-of-session one the issue is about, a single booker on the pair that is all the house has left. Seen to fail against the unfixed code: four of the five, the fifth being the opt-out, which refuses in both. Green on SQLite and on MySQL.

Documented in docs/constraint-policies.md and docs/seating.md, with the French catalog updated for the new settings and the reworded one.

Merge request reports

Loading
Loading