
Zbor
Club Management Platform
About
What's New in Zbor
1.1.1
August 19, 2026
A new ClassSession model — one rehearsal per group per day, PLANNED/COMPLETED/CANCELLED, with a @@unique([groupId, sessionDate]) so tapping "roll call" twice can't create duplicates (schema.prisma). Backend: new class-sessions/ module — open, list, get roster, save, cancel. Attendance got a status: PRESENT | ABSENT | EXCUSED | LATE, defaulting to PRESENT so existing QR rows keep their meaning. Rows now carry sessionId, markedByUserId, note, and a nullable membershipId. Mobile: RollCall.tsx, RollCallGroups.tsx, RollCallSummary.tsx + a staff route and four new hooks. Admin: a /roll-call page and roll-call-panel.tsx. Two details worth knowing, both handled deliberately in the service: Visit accounting follows the transition, not the final status — un-marking someone hands the visit back instead of charging twice. If a member already scanned the QR that day, roll call won't spend a second visit on them (QR rows have sessionId = NULL, so they're invisible to the roll-call lookup without an explicit cross-check). Membership warnings New membership-consumption.service.ts is now shared by both entry points (scanner + roll call), so they behave identically. The roster badges lapsed/low-visit/expiring members inline (warnings.ts). New membership-expiring-cron.service.ts warns before a membership lapses at 7/3/1 days — the old cron only fired after expiry, which told the leader a kid was overdue only once they already were. lastExpiryReminderDays on the membership keeps it idempotent across restarts. Also new: an org-level blockRollCallWithoutMembership flag, off by default.
More
