Documentation Index
Fetch the complete documentation index at: https://mintlify.com/ariellukezz/admision-web/llms.txt
Use this file to discover all available pages before exploring further.
Sistema de Admisión Web is built as a monolithic full-stack application that uses Laravel 11 as the backend and Vue 3 as the frontend, stitched together by Inertia.js. There is no separate API consumed by the frontend — Inertia acts as the bridge, letting Laravel controllers return Vue page components directly instead of JSON responses. The browser only ever loads a single root Blade template (resources/views/app.blade.php), and every subsequent navigation is an Inertia visit that swaps the active Vue component without a full page reload, giving applicants and administrators an SPA experience with none of the complexity of a decoupled frontend.
Backend Stack
The server-side is a standard Laravel 11 application requiring PHP 8.2 or higher.
| Layer | Technology | Purpose |
|---|
| Framework | Laravel 11 | HTTP routing, middleware, Eloquent ORM, queues, events |
| Language | PHP 8.2+ | Application runtime |
| Database | MySQL | Primary relational data store (users, preinscripciones, procesos, documentos, etc.) |
| Cache / Queue | Redis (predis/predis ^3.4) | Session cache, queue backend for background jobs |
| Auth | Laravel Breeze + Sanctum + Socialite | Email/password auth, API tokens, Google OAuth |
| Permissions | Spatie Laravel Permission ^6.0 + custom id_rol middleware | Dual-layer role and permission control |
PDF Generation
The platform uses three different PDF libraries depending on the document type:
// dompdf (barryvdh/laravel-dompdf ^2.0)
// → Used for simpler HTML-to-PDF conversions (solicitud forms, biometric reports)
// mPDF (mpdf/mpdf ^8.2 via carlos-meneses/laravel-mpdf ^2.1)
// → Used for documents requiring advanced Unicode/RTL or complex layouts
// TCPDF (tecnickcom/tcpdf ^6.6)
// → Used for certificates and documents requiring barcode/QR embedding
Additionally, setasign/fpdi and setasign/fpdf are available for overlaying data on existing PDF templates, and milon/barcode ^11.0 handles barcode generation within PDF documents.
Excel Export
Excel exports across the admin panel (applicant lists, inscriptions, reports) use maatwebsite/excel ^3.1, which wraps PhpSpreadsheet and integrates cleanly with Laravel’s collection pipeline.
Push Notifications
Real-time notifications (applicant document status changes, reviewer alerts) are delivered via Firebase Cloud Messaging (FCM) using the kreait/firebase-php ^7.24 SDK on the server side and the firebase ^12.14.0 JavaScript SDK on the client. FCM tokens are stored in the fcm_tokens table and associated with each User record through the fcmTokens() relationship.
Frontend Stack
The frontend lives entirely inside resources/js/ and is bundled by Vite.
| Layer | Technology | Version |
|---|
| Framework | Vue 3 (Composition API) | ^3.2.41 |
| SPA bridge | Inertia.js (@inertiajs/vue3) | ^1.0.0 |
| UI components | Ant Design Vue | ^4.2.6 |
| Utility CSS | Tailwind CSS | (via tailwind.config.js) |
| Bundler | Vite | (via vite.config.js) |
| Charts | vue-chartjs + Chart.js | ^5.2.0 / ^4.3.0 |
| Date helpers | day.js, date-fns | ^1.11.7 / ^2.30.0 |
| PDF viewer | pdfjs-dist | ^5.4.530 |
| Utilities | @vueuse/core, Ziggy | ^10.5.0 / ^1.8.2 |
Ziggy (tightenco/ziggy) exposes all named Laravel routes to the Vue layer so components can call route('revisor') or route('admin-dashboard') without hardcoding URLs.
Route Structure
Rather than one monolithic web.php, routes are split across multiple files, each loaded at the bottom of routes/web.php:
require __DIR__.'/auth.php'; // Login, register, password reset (Laravel Breeze)
require __DIR__.'/revisor.php'; // /revisor/* — document review module
require __DIR__.'/segundas.php'; // /segundas/* — segundas admissions module
require __DIR__.'/adminv2.php'; // /admin/v2/* — next-gen admin pages
// web.php itself also defines inline route groups:
// Route::prefix('admin')->middleware('auth','admin')->group(...) → /admin/*
// Route::prefix('postulante')->middleware('auth')->group(...) → /postulante/*
// Route::prefix('simulacro')->middleware('auth','simulacro')->group(…) → /simulacro/*
// Route::prefix('calificacion')->middleware('auth','calificador') → /calificacion/*
Each route group is protected by its corresponding role middleware (see Roles & Permissions).
Shared Props: HandleInertiaRequests
Every Inertia page response automatically receives a set of shared props injected by App\Http\Middleware\HandleInertiaRequests. These props are available in every Vue component via usePage().props:
// Available globally via Inertia's usePage()
{
auth: {
user: { ...userAttributes }, // null when unauthenticated
permissions: ['view.read', 'documento.upload', ...] // RBAC permission codes
},
proceso_actual: {
id: 12,
nombre: "Admisión Ordinaria 2025-I",
anio: 2025
},
flash: {
success: "Operación completada" // session flash message
},
notificacionesNoLeidas: 3 // only non-zero for Revisores (id_rol == 2)
}
Request Lifecycle
The following table traces what happens when a user navigates to an admin page:
| Step | Actor | What happens |
|---|
| 1 | Browser | Sends GET /admin/dashboard with Inertia headers (X-Inertia: true) |
| 2 | Laravel Router | Matches the admin prefix group; runs auth then Admin middleware |
| 3 | Admin middleware | Checks auth()->user()->id_rol == 1; aborts 403 if false |
| 4 | HandleInertiaRequests | Merges shared props (user, permissions, proceso_actual, flash) into the response |
| 5 | Controller | Returns Inertia::render('Admin/Dashboard/Index', [...]) |
| 6 | Inertia (server) | Serialises the component name + props as JSON; wraps in app.blade.php on first visit |
| 7 | Vue 3 (client) | Resolves the component via dynamic import(), hydrates props, renders the page |
| 8 | Subsequent nav | Inertia intercepts link clicks, replaces only the active component — no full reload |
Third-Party Service Integrations
| Service | Integration point | Purpose |
|---|
| Google OAuth | laravel/socialite + GoogleController | Applicants sign in with Google; new users are assigned id_rol = 8 |
| RENIEC | ReniecController (internal HTTP call) | Identity validation against the national ID registry |
| Banco de la Nación | PagoBancoController | Payment verification for admission fees |
| Firebase FCM | kreait/firebase-php + firebase JS SDK | Push notifications to reviewers and applicants |
| SMTP (multi-account) | SmtpAccountController | Configurable outbound email accounts per process |