R2 Booking management F3
Create booking
Book a room, time, and attendees. Block conflicts and track notification delivery separately.
Acceptance criteria
- Only one overlapping booking for the same room is confirmed.
- Missing fields, excess capacity, or unavailable hours prevent confirmation.
- Notification failure neither duplicates nor cancels an already confirmed booking.
Detailed scope
F3:0 Pick a room and time slot
An employee picks an operational room and start/end times in the company time zone. Availability uses [start, end) intervals so adjacent bookings are allowed; conflicts are checked again at confirmation.
- An existing 09:00–10:00 booking blocks 09:30–10:30 but allows 10:00–11:00.
- Past times, end≤start, closed hours, or a maintenance window cannot be confirmed.
- Two simultaneous confirmations for the same slot persist only one booking; the other retains its input and receives alternative availability.
F3:1 Attendees and capacity
The booker selects attendees from the active staff directory. Unique attendees including the booker are compared with room capacity; external guests are outside the initial scope.
- Selecting the same employee twice counts that person only once.
- Exceeding room capacity including the booker blocks confirmation in both the UI and server.
- Inactive employees or external email addresses are rejected with an explanation and are not saved as attendees.
F3:2 Confirm booking and track notifications
The server rechecks permissions, conflicts, and the input revision, then confirms once using booking_id and request_id. Attendee delivery is queued only after commit, with its status separate from booking status.
- Retrying one request_id returns the existing booking_id rather than creating a second booking.
- A simultaneous conflict preserves the form and returns to time selection without a confirmation notification.
- After persistence succeeds, a delivery outage shows confirmed booking plus failed/retryable notification status.
- The first successful confirmation records E1 once per booking_id; failures, edits, and retried responses do not count as new confirmations.