disoccupatomai.it
Overview
DisoccupaTomai is a multi-tenant recruitment and job-portal platform built with Laravel 8, Vue 3, and Inertia.js. It connects employers and candidates through job listings, applications, assessments, interviews, and candidate scoring while providing separate administration, employer, candidate, and public-facing experiences. The platform also supports tenant-specific branding and configuration, membership payments, localized Italian content, PDF reporting, and a Sanctum-protected candidate API.
Objectives
- ▸ Provide a shared recruitment marketplace where employers can publish vacancies and candidates can search, bookmark, refer, and apply for jobs
- ▸ Give employers an end-to-end hiring workflow covering job creation, candidate shortlisting, quizzes, interviews, scoring, and reporting
- ▸ Offer candidates a self-service account for profile management, multi-section resumes, applications, favorites, referrals, assessments, and notifications
- ▸ Support multiple employer tenants through configurable path or subdomain slugs, tenant branding, custom email delivery, and membership-based capabilities
- ▸ Provide platform administrators with centralized management of employers, candidates, packages, memberships, content, advertisements, settings, and permissions
- ▸ Expose a protected candidate API suitable for external SPA or mobile clients
- ▸ Simplify deployment and operations through Docker, environment-based configuration, Redis-backed infrastructure, and an installation workflow
Architecture
Multi-tenant web application. Backend: Laravel 8 on PHP 8.1, Eloquent ORM with MySQL as the primary database, Laravel Sanctum for candidate API authentication, Redis for sessions, cache, and queues, DOMPDF for document generation, HTMLPurifier and request middleware for input sanitization, and runtime SMTP configuration for tenant-specific email delivery. Frontend: Vue 3 with Inertia.js, Tailwind CSS, CKEditor 5, vue-i18n, Vue PDF tooling, and a parallel Blade-rendered interface for administration, employer, candidate, and public pages. The application separates controllers and models by Admin, Employer, Candidate, and Front domains, while route groups and middleware enforce roles and resolve each employer from a path-based or subdomain-based tenant slug. Deployment uses a PHP 8.1 Apache Docker image and Docker Compose with Redis.
Key Features
- ▸ Multi-tenant employer sites resolved through configurable subdomain or path-based slugs
- ▸ Separate role-aware experiences for super administrators, employers, employer team members, candidates, and public visitors
- ▸ Employer registration, authentication, account activation, password recovery, team accounts, roles, permissions, and bulk management actions
- ▸ Job-posting management with departments, custom fields, application questions, traits, filters, status controls, and CSV export
- ▸ Candidate job discovery with title, company, role, and location filters, plus bookmarking, referrals, and online applications
- ▸ Candidate pipeline and Job Board with shortlisting, status management, quiz scores, interview scores, aggregate evaluation, printing, and PDF export
- ▸ Quiz designer with categorized question banks, single-answer and multiple-correct questions, images, ordering, cloning, and candidate attempts
- ▸ Interview designer with reusable questions, per-candidate interview sessions, scoring, result management, and downloadable reports
- ▸ Candidate resume builder covering general information, experience, qualifications, languages, skills, achievements, and references
- ▸ Sanctum-protected candidate REST API for authentication, profile updates, city lookup, resume uploads, applications, bookmarks, and notifications
- ▸ Super-admin control panel for employers, candidates, users, roles, jobs, packages, memberships, FAQs, news, pages, menus, testimonials, advertisements, messages, email templates, and platform settings
- ▸ Tenant-specific branding, custom CSS variables, email templates, and SMTP configuration gated by membership capabilities
- ▸ Membership and payment flows supporting Stripe and PayPal integrations, with package administration and employer renewal workflows
- ▸ Rich-content editing through CKEditor 5, candidate-result PDF generation through DOMPDF, spreadsheet import/export, and in-browser PDF viewing
- ▸ Italian-first localization through Laravel language resources and vue-i18n, with shared currency and label-formatting filters
- ▸ Google social-login support with tenant-aware state handling and an additional LinkedIn integration helper
- ▸ In-application notifications and view tracking for jobs and applications
- ▸ Installation wizard for requirements, database configuration, credentials, and initial account creation
- ▸ Configurable demo-mode restrictions and reserved-route protection for tenant slugs
- ▸ Dockerized PHP/Apache deployment with Redis-backed sessions, cache, and queues
Challenges
- ▸ Coordinating several ordered route groups whose sequence affects tenant resolution, authentication, and role-specific behavior
- ▸ Supporting both subdomain-based and path-based tenant URLs without duplicating routing and URL-generation logic
- ▸ Applying employer-specific branding, email, and configuration while falling back to platform defaults when a membership tier does not permit customization
- ▸ Maintaining role and feature consistency across Blade-rendered interfaces, Vue/Inertia screens, and the candidate REST API
- ▸ Implementing a complete candidate evaluation workflow that combines applications, quizzes, interviews, statuses, aggregate scores, and PDF reports
- ▸ Safely accepting rich user-generated content while preserving supported formatting through layered request sanitization and HTML purification
- ▸ Dynamically reconfiguring outbound SMTP settings per employer while capturing delivery failures without leaking sensitive configuration
- ▸ Managing reusable assessment content with ordering, image attachments, cloned questions, and both single-answer and multiple-correct scoring
- ▸ Keeping Laravel Mix-era build configuration compatible with a modern Vue 3, Inertia.js, Tailwind CSS, and Vite-related dependency stack
- ▸ Supporting a growing migration history and Unicode collation changes without disrupting existing recruitment data
- ▸ Preventing tenant slugs from shadowing core application routes while retaining flexible employer storefront URLs
- ▸ Providing deployable production infrastructure and a guided installer while also enforcing environment-driven demo restrictions
Outcomes
- ▸ Delivered a unified recruitment platform spanning super-admin, employer back-office, Vue/Inertia employer screens, candidate accounts, and public job pages
- ▸ Established a flexible multi-tenant model in which employers can operate branded recruitment sites through either subdomains or shared path prefixes
- ▸ Implemented an end-to-end hiring lifecycle from vacancy publication and candidate application through quizzes, interviews, scoring, and downloadable reports
- ▸ Created a self-service candidate experience with detailed resumes, application history, favorites, referrals, assessments, and notifications
- ▸ Exposed authenticated candidate workflows through a reusable Sanctum API for future SPA or mobile integrations
- ▸ Built an extensible assessment framework with reusable categories, question banks, images, ordering, cloning, multiple answer modes, and PDF results
- ▸ Enabled membership-based tenant customization and integrated payment workflows for employer package renewals
- ▸ Provided operational foundations through Docker Compose, Redis-backed application services, environment-driven configuration, an installation wizard, and demo-mode controls