# 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/` - 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