Task #649: complete Public Relations & Protocol module (fix 8 review gaps)
Addresses the 8 spec gaps that blocked prior completion, all additive and scoped to the protocol_* module / /protocol routes. executive-meetings untouched. Backend (api-server/routes/protocol.ts, lib/db schema, seed): - External meetings create as "pending" (status dropped from create schema); added approve + reject endpoints with state-conditional WHERE status='pending' and 409 on contention; patch status enum restricted to completed/cancelled. - Added approvedBy/approvedAt/rejectionReason columns + status index; default status now "pending". - Booking reject and gift-issue reject made state-conditional (409 on 0 rows). - Dashboard: roomsAvailableNow (NOT EXISTS), giftsIssuedThisMonth/Qty; upcomingExternal filtered to future pending|approved. - Reports: added externalMeetings summary counts by status. - Seed: room names corrected (AR + EN). Frontend (tx-os/pages/protocol.tsx, App.tsx, locales): - URL-synced tabs under /protocol/:tab (slug<->tab maps). - Dedicated Rooms tab (moved out of Gifts); RoomDialog isActive toggle. - External approve/reject buttons + rejectionReason display; ExternalDialog create omits status, edit limited to completed/cancelled. - Dashboard cards clickable to navigate; reports external section. - Bookings list/calendar (grouped-by-day) view toggle. - New i18n keys in ar.json + en.json. Verification: tx-os + protocol.ts typecheck clean; drizzle push + re-seed done; both workflows restarted; /api/protocol/me returns 401 unauth; architect re-review approved. Pre-existing typecheck errors in executive-meetings.ts and push.ts are unrelated and were not touched. Note: had to rebuild lib/db declarations (tsc --build --force) so api-server project references picked up the new schema columns.
This commit is contained in:
+15
-3
@@ -878,9 +878,21 @@ async function main() {
|
||||
.limit(1);
|
||||
if (existingRooms.length === 0) {
|
||||
await db.insert(protocolRoomsTable).values([
|
||||
{ nameAr: "القاعة الأولى", nameEn: "Room 1", sortOrder: 1 },
|
||||
{ nameAr: "القاعة الثانية", nameEn: "Room 2", sortOrder: 2 },
|
||||
{ nameAr: "القاعة الثالثة", nameEn: "Room 3", sortOrder: 3 },
|
||||
{
|
||||
nameAr: "قاعة الاجتماعات الرئيسية",
|
||||
nameEn: "Main Meeting Hall",
|
||||
sortOrder: 1,
|
||||
},
|
||||
{
|
||||
nameAr: "قاعة كبار الزوار",
|
||||
nameEn: "VIP Guests Hall",
|
||||
sortOrder: 2,
|
||||
},
|
||||
{
|
||||
nameAr: "قاعة الاجتماعات التنفيذية",
|
||||
nameEn: "Executive Meetings Hall",
|
||||
sortOrder: 3,
|
||||
},
|
||||
]);
|
||||
console.log("Protocol default rooms created");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user