3b14155594
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>
286 lines
9.9 KiB
Markdown
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
|