🚀 Talentos — Intelligent HR & Talent Management Platform
A full-stack Symfony 6.4 web application for recruitment, training, event management, and HR operations — powered by AI.
Talentos is a comprehensive talent management platform connecting candidates , recruiters (HR) , and administrators in a unified ecosystem. It covers the full employee lifecycle:
🔐 Register → 📝 Complete Profile → 💼 Apply to Jobs → 🎥 Interview → 📊 Get Scored by AI
📅 Join Events → 🎓 Take Courses → 🏆 Earn Points
Feature
Description
🤖 AI-Powered Scoring
Groq LPU + OpenRouter race architecture for sub-2s candidate compatibility analysis
🎥 Live Video Interviews
WebRTC-based meeting rooms with real-time code execution
🎓 Course & Quiz System
Formations with séances, AI-generated quizzes, anti-cheat tab-switch detection
💳 Stripe Payments
Points-based economy for premium courses
🌍 i18n
Full French/English internationalization
📱 Responsive Design
Modern glassmorphism UI with dark admin panel
🔔 Real-time Notifications
Push notifications for both candidate and admin dashboards
💬 Messaging System
Messenger-style chat widget with real-time sync
┌─────────────────────────────────────────────────────────────────┐
│ TALENTOS PLATFORM │
├──────────────────────┬──────────────────────────────────────────┤
│ FRONT OFFICE (FO) │ BACK OFFICE (BO) │
│ Light Theme │ Dark Admin Panel │
│ │ │
│ • Home / Landing │ • Dashboard (stats & charts) │
│ • Job Offers List │ • Offer Management (CRUD) │
│ • Event Listing │ • Application Pipeline │
│ • Course Catalog │ • Interview Scheduling │
│ • Profile Editor │ • Event CRUD + Presence + Feedback │
│ • Interview Room │ • Course/Quiz Management │
│ • AI Chatbot │ • Project Kanban Board │
│ • Support Tickets │ • Activity Leaderboard │
│ • Notifications │ • User Administration │
│ • Messaging │ • Support Ticket Resolution │
│ • Calendar View │ • Unified Calendar │
└──────────────────────┴──────────────────────────────────────────┘
│
┌───────────────┼───────────────┐
│ │ │
┌────▼────┐ ┌─────▼─────┐ ┌─────▼─────┐
│ MySQL │ │ Groq API │ │ Stripe │
│ Database│ │ OpenRouter│ │ Payments │
└─────────┘ └───────────┘ └───────────┘
Role
Access
Capabilities
CANDIDATE
Front Office
Apply to jobs, join events, take courses, earn points, chat
RECRUITER / HR
Front + Back Office
Manage offers, schedule interviews, AI-analyze candidates
ADMIN
Full Access
User management, support tickets, all BO features
1. 👤 User & Profile (User, Profile, ProfileView)
Controllers: SecurityController, RegistrationController, ProfileController, GoogleController, ForgotPasswordController, EmailVerificationController
Subscriber: LoginSubscriber (login failure/success event handling)
🔐 Authentication & Security
Feature
Details
Registration
Email/password with email verification token (OTP-style confirmation link)
Google OAuth 2.0
One-click sign-in via Google — auto-creates account + profile on first login
Account Lockout
After 5 failed login attempts , account is automatically deactivated. User must use "Forgot Password" to unlock
Failed Attempts Tracking
LoginSubscriber increments failedAttempts on each failure, shows remaining attempts warning
Auto-Reset on Success
failedAttempts resets to 0 on successful login
Password Reset
Token-based reset flow with expiry — also re-activates locked accounts
Email Verification
Token sent at registration, account flagged isVerified once confirmed
Role-Based Access
CANDIDATE, RECRUITER/HR, ADMIN — controls FO/BO access
Feature
Details
Complete Profile
First/last name, phone, location, birth date, professional title, years of experience, bio/summary
CV Upload
PDF upload stored in public/uploads/cvs/ with file validation
Profile Picture + AI Face Check
Upload with Cropper.js for crop/zoom, then face-api.js (TensorFlow.js) runs client-side face detection — validates: face present, single face, confidence score, expression analysis. Rejects photos without a clear face
Skills Autocomplete
JSON array with live search from internal API (/api/skills/search) — 100+ tech & soft skills with tag-style UI
Profile Completeness
Percentage-based completeness indicator encouraging users to fill all fields
Profile Views
Track who viewed your profile (LinkedIn-style ProfileView entity)
Public Profiles
View other users' profiles in the Connect network
Profile Reset
Clear all profile data and uploaded files
Points Balance
Gamification currency (earned/purchased) used for premium courses
🤖 AI Profile Photo Validation (face-api.js)
Upload Photo ──► Cropper.js (crop/zoom) ──► face-api.js (TensorFlow.js)
│
┌───────┴───────┐
│ TinyFaceDetector│
│ FaceExpression │
└───────┬───────┘
│
✅ Face detected (confidence > threshold)
❌ No face / multiple faces → rejected
📊 Expression analysis (smile, neutral, etc.)
100% client-side — no API keys needed, runs in browser via TensorFlow.js
Models loaded from /models/face-api/ (TinyFaceDetector + FaceExpressionNet)
Real-time feedback with visual overlay on detected face region
🌐 Connect / Sync — Social Network (Sync, SyncMessage)
Feature
Details
People Discovery
Browse all users with completed profiles — LinkedIn-style network
Connection Requests
Send/accept/decline connection requests (like LinkedIn invitations)
My Circle
View your accepted connections
Real-time Chat
Messenger-style floating widget on every page — chat with connections
Message Bubbles
Styled sent/received messages with timestamps
Unread Badges
Badge counter on chat FAB button + per-contact unread indicators
Full-screen Mode
Expand chat widget to dedicated messaging page
HR Messaging
Admin/HR can message candidates directly from back office
Contact List
Auto-populated from accepted connections with last message preview
🔔 Real-time Notifications (JS Polling)
Feature
Details
Notification Bell
Animated bell icon with pulsing unread count badge
Dropdown Panel
LinkedIn-style sliding panel with notification list
JS Polling
setInterval fetches /api/notifications every 30s for real-time updates without WebSocket
Mark as Read
Click individual notification or "Mark all as read" bulk action
Auto-trigger
Notifications created for: new applications, interview scheduled, enrollment approved, connection request, etc.
Dual Streams
Separate notification feeds for candidates (FO) and admins (BO)
🎫 Support Tickets (SupportTicket, TicketReply)
Feature
Details
Ticket Creation
Category, priority (LOW/MEDIUM/HIGH/URGENT), description
Status Lifecycle
OPEN → IN_PROGRESS → RESOLVED / CLOSED
Reply Thread
Back-and-forth conversation between user and admin
Admin Dashboard
View/filter all tickets by status and priority
Feature
Details
Front Office
Modern light theme — glassmorphism navbar (backdrop-filter: blur), gradient accents, card hover animations
Back Office
Dark admin panel — slate background, sidebar navigation, glowing borders
Responsive
Mobile-first breakpoints at 768px / 480px, collapsible navigation
Micro-animations
Smooth transitions on all interactive elements, notification pulse, card lift on hover
Driver.js Guided Tours
Interactive onboarding walkthrough on first visit — separate tours for FO and BO
Google Fonts
Inter font family throughout
Bootstrap Icons
Consistent icon system across all pages
🌍 Internationalization (FR/EN)
Feature
Details
Translation Files
translations/messages.fr.yaml + messages.en.yaml (~750+ keys each)
Locale Switching
FR/EN flag toggle in navbar and sidebar, stored in session
LocaleSubscriber
Reads _locale from session on every request (priority 20)
Template Usage
All UI text uses `{{ 'key'
Flash Messages
Translated success/error/warning messages
Feature
Details
Floating Widget
AI avatar bubble on bottom-left of all FO pages with green "online" pulse
Context-Aware
Answers questions about the platform, offers career advice, profile tips
Groq LPU
Powered by Groq API for fast inference (~1-2s responses)
Chat UI
Gradient message bubbles, typing animation (bouncing dots), smooth open/close
Rate Limiting
Configurable daily message limit per user
Tooltip
Auto-appearing tooltip "Besoin d'aide?" on first visit
2. 💼 Offers & Applications (Offer, Application, Bookmark)
Controllers: OfferController, OfferAiController
Feature
Details
Job Listing
Paginated, searchable by title/location/contract type, with cover images
Apply
Upload CV + motivation letter, auto-track application date
Bookmarks
Save/unsave offers for later
Status Workflow
Nouvelle → En attente → Entretien → Acceptée / Refusée
AI Compatibility
Groq + OpenRouter race to score candidates 0-100 based on CV + job requirements
Bulk Analysis
Recruiter can AI-analyze all applicants at once with progress bar
Recruiter Response
Accept/reject with feedback message
🤖 AI Scoring Architecture
Candidate CV (PDF) ──► smalot/pdfparser ──► Extract text (max 800 chars)
│
Job Offer Data ──────────────────────────────────────┤
▼
┌──── Groq LPU (Primary) ────┐
│ │
│ RACE: First to respond │
│ │
└──── OpenRouter (Fallback) ─┘
│
▼
Score: 0-100
Strengths / Weaknesses
Stored in Application.score
3. 🎥 Interviews & Meets (Interview, Meet)
Controllers: InterviewController, AdminInterviewController
Feature
Details
Scheduling
Set date, location (in-person) or meeting link (online)
Status Tracking
SCHEDULED → IN_PROGRESS → COMPLETED / CANCELLED
Meeting Rooms
WebRTC-based video rooms with unique room IDs
Meet Types
GENERAL, TECHNICAL, HR — each with separate grading
Grading
0-10 scale per meet session
Notes
Interviewer can save detailed notes per session
Code Execution
Live code editor in interview room for technical assessments
Calendar Integration
All interviews visible in candidate & admin calendars
4. 🎓 Courses & Quiz (Formation, Seance, Quiz, Question, Choix, QuizAttempt, FormationEnrollment)
Controllers: CourseController, CertificateController
Feature
Details
Formation CRUD
Title, description, level (Débutant/Intermédiaire/Avancé), duration, dates, cover image
Séances
Individual lessons — PRESENTIEL or EN_LIGNE, with geolocation, video path, duration
Enrollment
PENDING → APPROVED / REJECTED — free or points-based
Paid Courses
Stripe Checkout integration — buy points packages (100/250/500 pts)
Quiz System
Timed quizzes with multiple-choice questions
Anti-Cheat
Tab-switch counter — 3+ switches flags as cheated = true
Scoring
Automatic percentage calculation, stored in QuizAttempt
Certificates
PDF certificate generation upon course completion
Buy Points ──► Stripe Checkout ──► Success Webhook ──► Add points to User.pointsBalance
│
Enroll in Paid Course ──► Check pointsBalance >= pricePoints ─┤
▼
Deduct points, create enrollment
5. 📅 Events & Participation (Event, EventParticipation, EventLike, EventComment, EventFeedback)
Controllers: EventController
Feature
Details
Event Types
MEETUP, CONFERENCE, WORKSHOP, HACKATHON, WEBINAR
Online/Offline
In-person (with geolocation map) or online (with meeting link)
Capacity
Max capacity enforcement (0 = unlimited)
Registration
QR code generated per participant for check-in
QR Verification
Scan QR at event entrance to confirm attendance
Status
UPCOMING → ONGOING → COMPLETED / CANCELLED
Likes
Toggle like/unlike per event
Comments
Threaded comments on event pages
Feedback
Post-event rating (1-5) + recommendation + comment
Presence Tracking
Admin marks attendance from QR scans
Statistics
Charts: participation rates, feedback averages, attendance trends
6. 📊 Activities & Projects (Activity, Project)
Controllers: ActivityController, DashboardController
Feature
Details
Activity Tracking
Employee logs daily work: description, hours worked, date
Timer
Built-in stopwatch to track work duration
Report Submission
Write activity reports with status: PENDING → SUBMITTED → APPROVED / REJECTED
Late Detection
Auto-flag late submissions with delay calculation in hours
Revision Count
Track how many times a report was revised after rejection
Admin Feedback
Managers can approve/reject with written feedback
Project Management
CRUD with status: PLANNED → IN_PROGRESS → COMPLETED
Kanban Board
Drag-and-drop project board (visual task management)
Leaderboard
Gamified ranking of most active employees
7. 💬 Messaging & Social (Sync, SyncMessage)
Controllers: SyncController
Feature
Details
Real-time Chat
Messenger-style floating widget on all pages
Contact List
Auto-populated from network circle
Message Bubbles
Styled sent/received messages with timestamps
Unread Badges
Badge counter on chat FAB button
Full-screen Mode
Expand chat to dedicated page
HR Messaging
Admin can message candidates directly
8. 🔔 Notifications (Notification)
Controllers: NotificationController
Feature
Details
Real-time Bell
Animated notification bell with unread count
Panel Dropdown
LinkedIn-style sliding notification panel
Mark as Read
Individual or bulk mark-all-as-read
Auto-trigger
Notifications for: new applications, interview scheduled, enrollment approved, etc.
Dual Dashboard
Separate notification streams for candidates and admins
9. 🎫 Support (SupportTicket, TicketReply)
Controllers: SupportController
Feature
Details
Ticket Creation
Category, priority (LOW/MEDIUM/HIGH/URGENT), description
Status Tracking
OPEN → IN_PROGRESS → RESOLVED / CLOSED
Reply Thread
Back-and-forth conversation between user and admin
Admin Dashboard
View all tickets, filter by status/priority
Controllers: ChatbotController
Feature
Details
Floating Widget
AI assistant bubble on bottom-left of all pages
Context-Aware
Answers questions about the platform, job offers, profile tips
Groq-Powered
Uses Groq LPU for fast inference
Rate Limited
Configurable daily message limit
User ──────┬──── Profile (1:1)
│ └──── ProfileView (1:N)
│
├──── Application (1:N) ──── Offer (N:1)
│ └──── Interview (1:1)
│ └──── Meet (1:N)
│
├──── Bookmark (1:N) ──── Offer (N:1)
│
├──── EventParticipation (1:N) ──── Event (N:1)
│ └──── EventFeedback (1:1)
│
├──── EventLike (1:N) ──── Event (N:1)
├──── EventComment (1:N) ──── Event (N:1)
│
├──── FormationEnrollment (1:N) ──── Formation (N:1)
│ ├──── Seance (1:N)
│ │ └──── Quiz (1:1)
│ └──── Quiz (1:N)
│ ├──── Question (1:N)
│ │ └──── Choix (1:N)
│ └──── QuizAttempt (1:N)
│
├──── Activity (1:N) ──── Project (N:1)
│
├──── SupportTicket (1:N)
│ └──── TicketReply (1:N)
│
├──── Notification (1:N)
│
└──── Sync (1:N)
└──── SyncMessage (1:N)
Total: 27 mapped entities
Layer
Technology
Framework
Symfony 6.4 (PHP 8.1)
Database
MySQL 8.0 + Doctrine ORM
Frontend
Twig + Bootstrap 5.3 + Bootstrap Icons
Styling
Custom CSS (glassmorphism, gradients, dark mode)
AI
Groq LPU API + OpenRouter (race pattern)
Payments
Stripe Checkout API
PDF
smalot/pdfparser (CV extraction)
Auth
Symfony Security + Google OAuth 2.0
i18n
Symfony Translation (FR/EN)
Video
WebRTC (interview rooms)
Testing
PHPUnit 9.6 (391 tests / 617 assertions)
Static Analysis
PHPStan Level 2 (0 errors)
DB Diagnostics
Doctrine Doctor (ahmed-bhs/doctrine-doctor)
Onboarding
Driver.js guided tours
Calendar
FullCalendar.js
Charts
Chart.js
Provider
Use Case
Model
Speed
Groq
Primary AI engine
llama3-70b
~1-2s
OpenRouter
Fallback (race pattern)
google/gemini-flash
~2-4s
GROQ_API_KEY = gsk_xxxxx
GEMINI_API_KEY = xxxxx # Used for OpenRouter
Both providers are called simultaneously. The first response wins — ensuring sub-2 second latency for the user regardless of individual provider performance.
PHP 8.1+
Composer
MySQL 8.0
Node.js (for asset building, optional)
Symfony CLI (recommended)
# 1. Clone
git clone https://github.com/PI-DEV-JAVA/pi-dev-web.git
cd pi-dev-web
# 2. Install dependencies
composer install
# 3. Configure environment
cp .env .env.local
# Edit .env.local with your DATABASE_URL, API keys, etc.
# 4. Create database & run migrations
php bin/console doctrine:database:create
php bin/console doctrine:schema:update --force
# 5. Clear cache
php bin/console cache:clear
# 6. Start server
symfony server:start
# OR
php -S 127.0.0.1:8000 -t public
DATABASE_URL = " mysql://user:[email protected] :3306/talentos?charset=utf8mb4"
GROQ_API_KEY = " gsk_xxxxx"
GEMINI_API_KEY = " xxxxx"
STRIPE_SECRET_KEY = " sk_test_xxxxx"
STRIPE_PUBLIC_KEY = " pk_test_xxxxx"
GOOGLE_CLIENT_ID = " xxxxx.apps.googleusercontent.com"
GOOGLE_CLIENT_SECRET = " xxxxx"
MAILER_DSN = " smtp://localhost"
Unit Tests (391 tests / 617 assertions)
php vendor/bin/phpunit tests/
Test File
Module
Tests
Scenarios
UserProfileTest
User & Profile
30
Auth, roles, reset tokens, profile completeness, skills
OfferApplicationTest
Offers & Applications
37
Apply flow, status workflow, AI scoring, bookmarks, search
ActivityProjectTest
Activities & Projects
22
Timer, reports, late detection, revisions, lifecycle
InterviewMeetTest
Interviews & Meets
27
Scheduling, rooms, grading, code execution, calendar
CourseQuizTest
Courses & Quiz
37
Enrollment, scoring, anti-cheat, paid/free courses
EventParticipationTest
Events & Participation
39
Capacity, QR verification, likes, comments, feedback
Entity/*Test
Individual entities
163
All getters/setters, defaults, relations
Static Analysis (PHPStan)
php -d memory_limit=512M vendor/bin/phpstan analyse --memory-limit=512M
# → [OK] No errors
php bin/console doctrine:mapping:info
# → [OK] 27 entities mapped
php bin/console doctrine:schema:validate
# → Mapping: [OK] The mapping files are correct
symfony server:start
# Open any page → Symfony Profiler Toolbar → "Doctrine Doctor" panel
# Shows: integrity issues, security warnings, configuration problems, slowest queries
Method
Route
Description
GET
/
Landing page
GET
/offers
Job listing with search & filters
GET
/offers/{id}
Job detail
POST
/offers/{id}/apply
Submit application
POST
/offers/{id}/bookmark
Toggle bookmark
GET
/events
Event listing
GET
/events/{id}
Event detail
POST
/events/{id}/participate
Register for event
POST
/events/{id}/like
Toggle like
POST
/events/{id}/comment
Post comment
POST
/events/{id}/feedback
Submit feedback
GET
/courses
Course catalog
GET
/courses/{id}
Course detail
POST
/courses/{id}/apply
Enroll in course
GET
/courses/quiz/{id}
Take quiz
POST
/courses/quiz/{id}/submit
Submit quiz answers
GET
/interviews
My interviews
GET
/interviews/room/{roomId}
Video meeting room
GET
/activities
My activities
POST
/activities/{id}/report
Submit report
GET
/api/skills/search?q=
Skills autocomplete
Method
Route
Description
GET
/admin/dashboard
Admin stats dashboard
GET/POST
/admin/offers/*
Offer CRUD
POST
/admin/offers/ai/analyze
AI applicant analysis
GET/POST
/admin/interviews/*
Interview management
GET/POST
/admin/events/*
Event CRUD
GET
/admin/events/presence
Attendance tracking
GET
/admin/events/feedback
Feedback management
GET
/admin/events/stats
Event statistics
GET/POST
/admin/courses/*
Formation CRUD
GET/POST
/admin/projects/*
Project management
GET
/admin/projects/kanban
Kanban board
GET
/admin/activities
Activity monitoring
GET
/admin/leaderboard
Employee ranking
GET
/admin/users
User administration
GET
/admin/support
Support tickets
GET
/admin/calendar
Unified calendar
talentosWeb/
├── config/ # Symfony configuration
│ ├── bundles.php # Registered bundles (inc. DoctrineDoctor)
│ ├── packages/ # Package-specific config
│ └── routes/ # Route definitions
│
├── src/
│ ├── Controller/ # 22 controllers
│ │ ├── Admin/ # Back office controllers
│ │ ├── OfferController # Job offers (FO)
│ │ ├── OfferAiController # AI compatibility scoring
│ │ ├── EventController # Events + participation
│ │ ├── CourseController # Courses + quiz + Stripe
│ │ ├── InterviewController# Interviews + meeting rooms
│ │ ├── ActivityController # Activities + reports
│ │ ├── ProfileController # Profile + skills API
│ │ ├── SyncController # Messaging system
│ │ ├── ChatbotController # AI chatbot
│ │ └── ...
│ │
│ ├── Entity/ # 27 Doctrine entities
│ ├── Repository/ # Custom query repositories
│ ├── Service/ # Business logic services
│ │ ├── StripeService # Payment processing
│ │ ├── WorkflowEngine # Application state machine
│ │ ├── NotificationService# Push notification dispatch
│ │ └── CourseMailer # Email notifications
│ │
│ └── EventSubscriber/ # Symfony event listeners
│ ├── LoginSubscriber # Post-login logic
│ └── LocaleSubscriber # i18n locale switching
│
├── templates/
│ ├── base.html.twig # Root layout (fonts, vars)
│ ├── front/ # Front office templates
│ │ ├── _base.html.twig # FO layout (navbar, footer, chat, AI bot)
│ │ ├── offers/ # Job listing & detail
│ │ ├── events/ # Event pages
│ │ ├── courses/ # Course catalog, quiz, payments
│ │ ├── account/ # Dashboard, profile, calendar
│ │ ├── meet/ # Video interview room
│ │ └── security/ # Login, register, password reset
│ │
│ └── back/ # Back office templates
│ ├── _base.html.twig # BO layout (sidebar, topbar)
│ ├── dashboard.html.twig
│ ├── offers/ # Offer management + AI analysis
│ ├── events/ # Event CRUD + stats
│ ├── courses/ # Formation management
│ └── ...
│
├── tests/
│ ├── Entity/ # 10 entity unit test files
│ └── Module/ # 6 module integration test files
│
├── translations/ # FR/EN translation files
├── public/ # Web root
│ ├── uploads/ # User uploads (CVs, images)
│ └── images/ # Static assets
│
├── phpstan.neon # Static analysis config
├── phpstan-baseline.neon # Known issue baseline
└── phpunit.xml.dist # Test runner config
Front Office — Light Theme
Background: #ffffff / #f8fafc
Primary: #4f46e5 (Indigo) with gradient to #06b6d4 (Cyan)
Cards: 16px radius, subtle shadows, hover lift animation
Navbar: Glassmorphism with backdrop-filter: blur(20px)
Background: #0f172a (Slate 900)
Cards: #1e293b (Slate 800) with border glow on hover
Sidebar: Fixed 260px with icon navigation
Tables: Zebra-stripe with hover highlight
Bootstrap Icons throughout
Google Fonts (Inter)
Smooth transitions on all interactive elements
Driver.js guided onboarding tours
Responsive breakpoints at 768px / 480px
Project: PI-DEV Web — Esprit School of Engineering
Academic Year: 2025-2026
Branch: integrationFinale
Repository: github.com/PI-DEV-JAVA/pi-dev-web
Built with ❤️ using Symfony 6.4 — Talentos Platform © 2026