From 7485357a07f4e184d9e494ed3931bd8dcb1d6965 Mon Sep 17 00:00:00 2001 From: Paul Bokel Date: Wed, 29 Apr 2026 14:43:41 +0000 Subject: [PATCH] Add comprehensive spec.md with database schema documentation Co-Authored-By: Claude Opus 4.6 --- spec.md | 284 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 284 insertions(+) create mode 100644 spec.md diff --git a/spec.md b/spec.md new file mode 100644 index 0000000..57046f9 --- /dev/null +++ b/spec.md @@ -0,0 +1,284 @@ +# 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) | UNIQUE NOT NULL | +| name | VARCHAR(100) | NOT NULL | +| price | DECIMAL(10,2) | DEFAULT 0.00 | +| created_at | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | + +## 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/` - Attendee registration for event +- `/event/register/` - Event registration with type +- `/event//payment` - Payment processing +- `/staff/` - Staff invitation accept +- `/attendee/request-link` - Request personal page link +- `/attendee/personal/` - Personal attendee page + +### Organizer +- `/organizer/dashboard` - Dashboard +- `/organizer/event/create` - Create event +- `/organizer/event//edit` - Edit event +- `/organizer/event//attendee-types` - Manage attendee types +- `/organizer/event//breakout-sessions` - Manage breakout sessions +- `/organizer/event//staff` - Manage staff +- `/organizer/event//attendees/batch-assign-type` - Batch assign types +- `/organizer/event//checkin/` - Check-in attendee +- `/organizer/event//badges/rectangular/download` - Download badges +- `/organizer/event//attendees/excel/download` - Excel export + +### Staff +- `/staff/dashboard` - Staff dashboard +- `/staff//dashboard` - Event-specific staff view +- `/staff/invite/` - 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