- Added public /badges/:id route with BadgePage component - Updated VisitorKiosk to display QR code upon check-in - Backend now returns visitId in check-in response - Added qrcode.react dependency
2.9 KiB
2.9 KiB
Phase 8: Visitor Management & Access Control
1. Overview
A comprehensive system to track visitors, contractors, and inspectors. Replaces paper logs with a digital kiosk, digital badges, and an admin "Panopticon" for real-time facility oversight.
2. Core Features (Sprint 1)
2.1 Digital Kiosk
- Self-Service Check-in: Tablet-friendly UI for visitors to input details.
- Data Capture: Name, Company, Purpose, Host (Employee), Photo (Webcam), NDA Signature.
- Badge Generation: Instant creation of a visit record.
2.2 Digital Badge (No Printer Required)
- Workflow:
- Visitor completes check-in.
- Kiosk displays a unique QR code.
- Visitor scans QR code with their own phone.
- Phone opens
https://app.domain/badge/:visitId(Public/Tokenized URL).
- Badge UI:
- Visitor Photo & Name (Large)
- "Valid" Status (Pulsing Green Animation)
- Host Name
- Zone Access Level
- Expiry Time (Countdown)
- Dynamic State: If admin revokes access, the phone screen updates to "INVALID" (Red) via polling/socket.
2.3 Host Notification
- Employee receives an alert (In-app/Email) when their visitor checks in.
3. "Panopticon" Admin View (Sprint 2)
3.1 Real-Time Dashboard
- Active Visitors: List of all currently checked-in guests.
- Visual Status: Time on site, host, assigned zone.
- Actions:
- Force Checkout: Clock them out remotely.
- Revoke Badge: Instantly turn their digital badge RED.
3.2 Badge Confirmation Suite
- Verification Scan: Security guards can scan the Visitor's phone screen to verify authenticity (prevents screenshots).
- Audit Log: Track every check-in, check-out, and access revocation.
4. Data Model
model Visitor {
id String @id @default(uuid())
name String
company String?
email String?
phone String?
type VisitorType @default(VISITOR)
ndaSigned Boolean @default(false)
visits Visit[]
createdAt DateTime @default(now())
}
model Visit {
id String @id @default(uuid())
visitorId String
visitor Visitor @relation(fields: [visitorId], references: [id])
hostId String?
host User? @relation(fields: [hostId], references: [id])
photoUrl String? // Check-in photo
purpose String?
status VisitStatus @default(ACTIVE) // ACTIVE, COMPLETED, REVOKED
checkIn DateTime @default(now())
checkOut DateTime?
token String @unique // For public badge URL
zones String[] // Allowed zones
}
enum VisitStatus {
ACTIVE
COMPLETED
REVOKED
}
5. API Routes
POST /api/visitors/check-in: Create visitor/visit, upload photo, return badge token.GET /api/public/badge/:token: Public endpoint to view badge status.POST /api/visits/:id/check-out: End the visit.POST /api/visits/:id/revoke: Invalidate the badge immediately.