Passes scoped per location
Every pass has a locationIds array that lists the branches it belongs to. On the customer side, passes pass through the isPassAtLocation() helper before they're shown — only passes whose locationIds include the currently selected branch make it through the filter.
This means a pass set up for Branch A simply won't appear when a customer is browsing Branch B, even though it's the same store and the same customer account. To make a pass available everywhere, add every relevant branch to its locationIds.
Classes & calendar filtering
Class lists are filtered inside the class store by locationId, so the same store that powers admin views returns a branch-specific subset to the customer pages.
The calendar has an inline picker in its header for convenience, and the events themselves are filtered against selected()?.locationId. The result is that:
- Switching branches in the header instantly reshapes the calendar grid.
- Classes that exist at other branches at the same time are excluded.
- Booking buttons only act on classes from the active branch.
How a customer with passes at multiple branches sees them
A customer who holds passes at more than one branch keeps every pass on their account, but only the passes that match the active branch are shown when they're browsing or booking. Switching branches via the picker flips the visible set.
When that customer opens the calendar at Branch A, they see Branch A classes and can spend their Branch A passes against them. Switching to Branch B reveals Branch B's calendar and Branch B's passes. Nothing is deleted or hidden permanently — the scope just follows whichever branch is currently active.
