packageMemberMaps(rows: readonly GroupListing[]): { prices: Map<number, number>; quantities: Map<number, number>; }
A package group's member rows projected into the two maps every consumer
needs (the booking flow, the webhook revalidation, the bookability gate, and
the test harness): prices keeps only members with a real override — a
positive price OR an explicit free 0, dropping a null "no override" — while
quantities covers every member (default 1). Owning both here keeps the "what
counts as an override" rule in one place; callers destructure what they use.