π 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
π€ AI Assistant Chatbot
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:pass@127.0.0.1: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)
Back Office β Dark Theme
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