Task #670: revamp public room-booking form (protocol)

Public booking form now captures department, meeting type (internal/
external), meeting purpose, and a repeatable "key attendees" table
(name + position + side). External meetings require the entity name
(reuses requesterOrg). "عدد الحضور" relabeled to "العدد المتوقع للحضور".
Added a static red disclaimer note about possible cancellation.

Each booking now gets an auto-generated searchable reference
(RB-{year}-{pad4}) shown on the success screen; staff can search the
admin bookings list by reference OR phone.

Changes:
- lib/db schema: department, meetingType, purpose, keyAttendees (jsonb),
  bookingReference (unique) + requesterPhone index; new enums/types.
  Applied via drizzle push; backfilled existing 4 rows.
- api-server: extended public booking schema + refine (org required when
  external), makeBookingReference, public/internal POST generate+return
  bookingReference.
- tx-os public form rewritten; admin card shows new fields + client-side
  search with empty state.
- ar/en i18n keys under protocol.bookings.

Notes:
- Pre-existing push.ts typecheck errors are unrelated to this task.
- Architect review: PASS, no blocking issues.
This commit is contained in:
Replit Agent
2026-07-07 12:26:19 +00:00
parent 553df28571
commit 1b93c2cf02
6 changed files with 524 additions and 73 deletions
+17 -1
View File
@@ -1716,8 +1716,24 @@
"requester": "مقدّم الطلب",
"org": "الجهة",
"phone": "الهاتف",
"attendeeCount": "عدد الحضور",
"attendeeCount": "العدد المتوقع للحضور",
"publicRequest": "طلب عام",
"reference": "رقم الحجز",
"department": "الإدارة",
"entity": "اسم الجهة",
"purpose": "الغرض من الاجتماع",
"meetingType": "نوع الاجتماع",
"meetingTypes": {
"internal": "اجتماع داخلي",
"external": "اجتماع مع جهة خارجية"
},
"keyAttendees": "أبرز الحضور",
"attendeeSides": {
"internal": "من الهيئة",
"external": "خارج الهيئة"
},
"searchPlaceholder": "ابحث برقم الحجز أو الهاتف…",
"searchEmpty": "لا توجد حجوزات مطابقة.",
"roomLabel": "القاعة",
"titleLabel": "عنوان الحجز",
"startsAt": "من",