Files
conference/spec.md
T
paul 3b14155594 Fix attendee_types.code uniqueness: per-event not global
Also update generate_type_code() to accept event_id parameter
for proper per-event uniqueness checking.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-29 14:45:27 +00:00

286 lines
9.9 KiB
Markdown

# NetEvent Conference Platform - Specification
## 1. Project Overview
**Project Name:** NetEvent
**Type:** Web-based conference/networking event management platform
**Core Functionality:** A multi-language platform for organizing events, managing attendees, handling breakout sessions, staff coordination, check-in/badge generation, and professional networking/connections.
## 2. Tech Stack
- **Backend:** Python Flask
- **Database:** MySQL (mysql.connector)
- **Internationalization:** Flask-Babel with 7 languages (en, nl, de, fr, es, it, pl)
- **PDF Generation:** ReportLab
- **Excel Export:** openpyxl
- **QR Codes:** qrcode library
- **Email:** SMTP (Brevo/Sendinblue)
- **Frontend:** HTML/CSS (Jinja2 templates)
## 3. Database Schema
### organizers
| Column | Type | Constraints |
|--------|------|-------------|
| id | INT | PRIMARY KEY AUTO_INCREMENT |
| email | VARCHAR(255) | UNIQUE NOT NULL |
| password_hash | VARCHAR(255) | NOT NULL |
| name | VARCHAR(255) | NOT NULL |
| staff_code | VARCHAR(10) | UNIQUE DEFAULT NULL |
| preferred_language | VARCHAR(5) | DEFAULT 'en' |
| created_at | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP |
### events
| Column | Type | Constraints |
|--------|------|-------------|
| id | INT | PRIMARY KEY AUTO_INCREMENT |
| organizer_id | INT | NOT NULL, FOREIGN KEY → organizers(id) |
| code | VARCHAR(10) | UNIQUE NOT NULL |
| name | VARCHAR(255) | NOT NULL |
| description | TEXT | |
| start_time | DATETIME | NOT NULL |
| end_time | DATETIME | |
| location | VARCHAR(255) | |
| max_attendees | INT | DEFAULT NULL |
| created_at | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP |
### attendees
| Column | Type | Constraints |
|--------|------|-------------|
| id | INT | PRIMARY KEY AUTO_INCREMENT |
| event_id | INT | NOT NULL, FOREIGN KEY → events(id) |
| email | VARCHAR(255) | NOT NULL |
| password_hash | VARCHAR(255) | NOT NULL |
| first_name | VARCHAR(100) | NOT NULL |
| last_name | VARCHAR(100) | NOT NULL |
| organisation | VARCHAR(255) | |
| role | VARCHAR(255) | |
| introduction | TEXT | |
| phone | VARCHAR(50) | DEFAULT '' |
| linkedin | VARCHAR(255) | DEFAULT '' |
| profile_picture | VARCHAR(255) | DEFAULT NULL |
| checked_in | BOOLEAN | DEFAULT FALSE |
| attendance_status | ENUM('attending', 'not_attending') | DEFAULT 'attending' |
| confirmation_token | VARCHAR(64) | DEFAULT NULL |
| attendee_code | VARCHAR(10) | UNIQUE |
| attendee_type_id | INT | DEFAULT NULL, FOREIGN KEY → attendee_types(id) |
| preferred_language | VARCHAR(5) | DEFAULT 'en' |
| created_at | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP |
| | | UNIQUE KEY (event_id, email) |
### connections
| Column | Type | Constraints |
|--------|------|-------------|
| id | INT | PRIMARY KEY AUTO_INCREMENT |
| attendee_id | INT | NOT NULL, FOREIGN KEY → attendees(id) |
| connected_attendee_id | INT | NOT NULL, FOREIGN KEY → attendees(id) |
| status | ENUM('pending', 'accepted', 'rejected') | DEFAULT 'pending' |
| created_at | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP |
| | | UNIQUE KEY (attendee_id, connected_attendee_id) |
### appointments
| Column | Type | Constraints |
|--------|------|-------------|
| id | INT | PRIMARY KEY AUTO_INCREMENT |
| event_id | INT | NOT NULL, FOREIGN KEY → events(id) |
| requester_id | INT | NOT NULL, FOREIGN KEY → attendees(id) |
| target_id | INT | NOT NULL, FOREIGN KEY → attendees(id) |
| appointment_time | DATETIME | NOT NULL |
| location | VARCHAR(255) | |
| notes | TEXT | |
| status | ENUM('pending', 'accepted', 'rejected') | DEFAULT 'pending' |
| created_at | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP |
### breakout_sessions
| Column | Type | Constraints |
|--------|------|-------------|
| id | INT | PRIMARY KEY AUTO_INCREMENT |
| code | VARCHAR(10) | UNIQUE NOT NULL |
| event_id | INT | NOT NULL, FOREIGN KEY → events(id) |
| name | VARCHAR(255) | NOT NULL |
| description | TEXT | |
| start_time | DATETIME | NOT NULL |
| end_time | DATETIME | NOT NULL |
| location | VARCHAR(255) | |
| max_attendees | INT | DEFAULT NULL |
| created_at | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP |
### breakout_session_organizers
| Column | Type | Constraints |
|--------|------|-------------|
| id | INT | PRIMARY KEY AUTO_INCREMENT |
| breakout_session_id | INT | NOT NULL, FOREIGN KEY → breakout_sessions(id) |
| organizer_id | INT | NOT NULL, FOREIGN KEY → organizers(id) |
| created_at | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP |
| | | UNIQUE KEY (breakout_session_id, organizer_id) |
### breakout_session_rsvps
| Column | Type | Constraints |
|--------|------|-------------|
| id | INT | PRIMARY KEY AUTO_INCREMENT |
| breakout_session_id | INT | NOT NULL, FOREIGN KEY → breakout_sessions(id) |
| attendee_id | INT | NOT NULL, FOREIGN KEY → attendees(id) |
| status | ENUM('registered', 'cancelled') | DEFAULT 'registered' |
| created_at | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP |
| | | UNIQUE KEY (breakout_session_id, attendee_id) |
### staff
| Column | Type | Constraints |
|--------|------|-------------|
| id | INT | PRIMARY KEY AUTO_INCREMENT |
| event_id | INT | NOT NULL, FOREIGN KEY → events(id) |
| email | VARCHAR(255) | NOT NULL |
| password_hash | VARCHAR(255) | DEFAULT NULL |
| first_name | VARCHAR(100) | NOT NULL |
| last_name | VARCHAR(100) | NOT NULL |
| staff_code | VARCHAR(10) | UNIQUE DEFAULT NULL |
| invite_token | VARCHAR(64) | DEFAULT NULL |
| invite_used | BOOLEAN | DEFAULT FALSE |
| preferred_language | VARCHAR(5) | DEFAULT 'en' |
| created_at | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP |
| | | UNIQUE KEY (event_id, email) |
### languages
| Column | Type | Constraints |
|--------|------|-------------|
| code | VARCHAR(5) | PRIMARY KEY |
| name | VARCHAR(50) | NOT NULL |
| native_name | VARCHAR(50) | NOT NULL |
| is_active | BOOLEAN | DEFAULT TRUE |
| is_default | BOOLEAN | DEFAULT FALSE |
| date_format | VARCHAR(30) | DEFAULT '%B %d, %Y at %H:%M' |
| sort_order | INT | DEFAULT 0 |
### attendee_types
| Column | Type | Constraints |
|--------|------|-------------|
| id | INT | PRIMARY KEY AUTO_INCREMENT |
| event_id | INT | NOT NULL, FOREIGN KEY → events(id) |
| code | VARCHAR(10) | NOT NULL |
| name | VARCHAR(100) | NOT NULL |
| price | DECIMAL(10,2) | DEFAULT 0.00 |
| created_at | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP |
| | | UNIQUE KEY (event_id, code) per event |
## 4. User Types & Roles
### Organizer
- Creates/manages events
- Manages attendee types (with pricing)
- Creates/manages breakout sessions
- Adds/removes staff members
- Checks in attendees
- Generates badge PDFs (rectangular format)
- Downloads attendee Excel sheets
- Sends notifications
- Manages all event aspects
### Staff
- Invited via email with token link
- Access staff dashboard for assigned events
- Check-in attendees at events
- Limited to event-specific operations
### Attendee
- Registers for events (with optional payment)
- Manages personal profile
- RSVP's for breakout sessions
- Connects with other attendees (request/accept/reject)
- Requests appointments
- Downloads personal badge
- Scans QR codes to connect with others
### Presenter (via presenter dashboard)
- Access to presenter-specific dashboard
## 5. Core Features
### Event Management
- Create/edit/delete events
- Set event date, time, location, max attendees
- Generate unique event codes
- Event registration with type-based pricing
- Payment processing
- Email notifications
### Attendee Management
- Registration (email/password)
- Profile management (name, organization, role, bio, phone, LinkedIn)
- Profile photo upload with crop/zoom
- Personal attendee page (token-based access)
- Attendee type assignment (VIP, General, etc.)
- Check-in tracking
- Badge generation
### Breakout Sessions
- Create sessions within events
- RSVP system (register/cancel)
- Capacity management
- Multiple organizer assignment
### Staff Management
- Invite staff via email
- Token-based invitation flow
- Staff code generation
- Edit/remove staff
### Networking
- Connect with other attendees (QR scan or search)
- Connection request system (pending/accepted/rejected)
- Appointment scheduling
- Connection requests management
### Internationalization
- 7 languages: English, Dutch, German, French, Spanish, Italian, Polish
- Language preference per user
- Locale detection (URL, session, cookie, browser, user preference)
### Export/Reporting
- Excel export of attendees
- Badge PDF generation (rectangular)
- QR code integration for badges
## 6. Key Routes
### Public
- `/` - Landing page
- `/login` - Login page
- `/register/organizer` - Organizer registration
- `/register/attendee/<code>` - Attendee registration for event
- `/event/register/<code>` - Event registration with type
- `/event/<code>/payment` - Payment processing
- `/staff/<staff_code>` - Staff invitation accept
- `/attendee/request-link` - Request personal page link
- `/attendee/personal/<token>` - Personal attendee page
### Organizer
- `/organizer/dashboard` - Dashboard
- `/organizer/event/create` - Create event
- `/organizer/event/<id>/edit` - Edit event
- `/organizer/event/<id>/attendee-types` - Manage attendee types
- `/organizer/event/<id>/breakout-sessions` - Manage breakout sessions
- `/organizer/event/<id>/staff` - Manage staff
- `/organizer/event/<id>/attendees/batch-assign-type` - Batch assign types
- `/organizer/event/<id>/checkin/<attendee_id>` - Check-in attendee
- `/organizer/event/<id>/badges/rectangular/download` - Download badges
- `/organizer/event/<id>/attendees/excel/download` - Excel export
### Staff
- `/staff/dashboard` - Staff dashboard
- `/staff/<event_id>/dashboard` - Event-specific staff view
- `/staff/invite/<token>` - Accept invitation
### Attendee
- `/attendee/dashboard` - Attendee dashboard
- `/attendee/profile` - Edit profile
- `/attendee/photo` - Upload photo
- `/attendee/breakout-sessions` - View/RSVP sessions
- `/attendee/event/attendance` - Update attendance status
- `/attendee/badge/download` - Download badge
- `/attendee/scan` - QR scan interface
- `/attendee/connection-requests` - Manage connection requests
- `/appointments` - Manage appointments
### Presenter
- `/presenter/dashboard` - Presenter dashboard