Barbers and schedules
Barbers, chairs, weekly hours, shifts, time off, and practitioner credentials at /dashboard/platform/staff.
/dashboard/platform/staff (platformStaff) shows the weekly roster, barbers, projected commission, shop closures, and shifts.
Barbers
/staff/new and /staff/[id]. Fields: displayName, legalName, bio, imagePath, phone, email, chair, status, bookingEnabled ("Takes online bookings"), bufferMinutes, serviceCommissionRateBps (basis points), and specialties (services offered). The profile also holds the weekly hours editor (BarberSchedule per day) and recent visits.
Link a sign-in account with linkBarberAccount. The person must already be an active shop member: "Invite this person to the shop first; only active shop members can be linked."
Chairs
/staff/chairs. BarberChair: chairNumber, stationName, status (in service, maintenance, reserved), locationNote.
Shifts
manageStaffShift with action schedule, clock_in, clock_out, or cancel; barberId, chairId, scheduledStart, scheduledEnd, notes. Cancelling a shift is blocked while booked appointments rely on it: "N booked appointment(s) rely on this shift. Reschedule or reassign them before cancelling it."
Time off and closures
manageScheduleException with action create or cancel and exceptionType:
time_off(needs a barber)shop_closurechair_unavailable(needs a chair)working_override(needs a barber)
Creating one that overlaps booked appointments is refused: "N booked appointment(s) fall in this window. Reschedule or cancel them before blocking this time."
Practitioner credentials
On the barber profile add a credential: credentialType (for example Cosmetology, Master barber, Apprentice), credentialNumber, issuingAuthority, jurisdictionCode, effectiveFrom, expiresAt, supervisionRequired. Change status with setPractitionerCredentialStatus (active, suspended, expired, revoked) with a reason. A terminal status cannot be reversed. Credentials are checked only for services marked credentialRequired.