Sistema integrado con Control Escolar
Versión: 1.0
Tecnología: Laravel 11 · PHP 8.2+ · MySQL / MariaDB (o SQLite en desarrollo)
Este documento describe el subconjunto funcional y técnico desarrollado para Administración y Finanzas, en particular nómina, conceptos de cobro, planes de pago y promociones, información fiscal (CFDI) y gestión de usuarios del sistema. Complementa la documentación de *Control Escolar* del mismo proyecto.
El módulo de Administración y Finanzas cubre procesos administrativos y financieros alineados con el personal docente y la facturación:
• Nómina: cálculo de horas y percepciones por docente y ciclo, registro de incidencias/descuentos (incidencias_docente_nomina), exportación de recibos (individual y masivo en ZIP según implementación).
• Catálogos de nómina: conceptos de nómina (activos/inactivos, tipos de pago).
• Descuentos de nómina (vista operativa): consulta de incidencias guardadas en BD, con nombre de docente (join a docentes), filtros por periodo/ciclo/docente, exportación imprimir / PDF / Excel y eliminación de registros.
• Conceptos de venta: servicios y productos (conceptos_venta).
• Planes de pago y descuentos/promociones: catálogos para cobranza (planes_pago, descuentos_promociones).
• Información fiscal: registro de datos fiscales y archivos privados para emisión de facturas (datos_fiscales); certificado .cer, llave .key y contraseña opcionales en el alta.
• Registro de usuarios (Mi institución): alta de cuentas en users, listado, activación/desactivación (users.activo) y eliminación; el login rechaza usuarios desactivados cuando la columna existe.
La aplicación sigue siendo un monolito MVC con vistas Blade, consumo JSON/fetch desde el front de varias pantallas y persistencia en base de datos relacional.
• Monolito Laravel 11, patrón MVC.
• Rutas web en routes/web.php (grupo auth para lo protegido).
• Lógica en app/Http/Controllers.
• Modelos Eloquent en app/Models.
• Esquema en database/migrations; scripts SQL manuales opcionales en database/sql/.
• Vistas en resources/views (tema tipo Velzon / layouts.master).
1. El cliente solicita una ruta HTTP.
2. Laravel aplica middleware web (sesión, CSRF en formularios, etc.).
3. El enrutador despacha al controlador.
4. El controlador valida, consulta modelos o DB::, responde Blade o JSON.
• Rutas de este módulo bajo autenticación (middleware auth), salvo login/logout públicos.
• Rate limiting de login (configurable, ver config/security.php y variables de entorno).
• CSRF en peticiones que lo requieran; APIs internas JSON suelen enviar cabecera X-CSRF-TOKEN.
• Información fiscal: archivos y contraseña en disco privado (local); contraseña de llave con cifrado en modelo (encrypted).
• Usuarios: campo activo (si existe en BD) impide sesión tras Auth::attempt en AuthController.
| Capa | Tecnología | Uso |
|---|---|---|
| Backend | PHP 8.2+ | Lenguaje |
| Framework | Laravel 11 | MVC, ORM, rutas, validación |
| ORM | Eloquent | Acceso a datos |
| barryvdh/laravel-dompdf (^3.1) | Exportes PDF (p. ej. descuentos nómina) | |
| Excel | Maatwebsite/Laravel-Excel | El código de exportación (NominaController, exports en app/Exports) asume este paquete; si no está en composer.json, debe instalarse con composer require maatwebsite/excel para que funcionen esas rutas |
| Frontend | Blade, Bootstrap, SweetAlert2 | UI y alertas |
| Build | Vite / npm (proyecto base) | Assets del tema |
proyecto_nominas/
app/
Exports/ # Exportaciones Excel (FromView)
Http/Controllers/
NominaController.php
NominaMasivoController.php
NominaDescuentosController.php
ConceptoNominaController.php
ConceptoVentaController.php
PlanPagoController.php
DescuentoPromocionController.php
InformacionFiscalController.php
ConfigUsuarioController.php
AuthController.php
Models/
User.php, Docente.php, DatoFiscal.php, ConceptoNomina.php, ...
resources/views/
nominas/
conceptos-venta/
planes-de-pago/
config/
exports/ # Plantillas para PDF/Excel de incidencias
database/
migrations/
sql/ # Scripts manuales (p. ej. users.activo, datos fiscales)
routes/
web.php
docs/ # Documentación del proyectoControladores: NominaController, NominaMasivoController
• Pantalla de cálculo de nómina con datos de docentes, ciclos y horarios (consulta a docentes, ciclos, grupos/horarios o disponibilidad_docente según existencia de tablas).
• Exportación de recibo a Excel (endpoint POST).
• Incidencias de docente asociadas a nómina: alta y baja vía API JSON (incidencias_docente_nomina).
• Exportación masiva ZIP de Excel (ruta GET dedicada).
Controlador: ConceptoNominaController
• CRUD de conceptos (conceptos_nomina): listado JSON, alta, edición, baja.
Controlador: NominaDescuentosController
• Vista Descuentos (nominas/descuentos): listado desde incidencias_docente_nomina con nombre de docente (join opcional a docentes).
• Filtros: año, mes, ciclo, docente.
• Exportación: imprimir (vista HTML), PDF (DomPDF), Excel (export FromView).
• Eliminación por fila (DELETE).
Controlador: ConceptoVentaController
• Pantallas de servicios y productos; API de búsqueda y CRUD sobre conceptos_venta.
Controladores: PlanPagoController, DescuentoPromocionController
• CRUD de planes de pago (planes_pago).
• CRUD de descuentos y promociones (descuentos_promociones) bajo ruta planes-de-pago/descuentos.
Controlador: InformacionFiscalController
Modelo: DatoFiscal — tabla datos_fiscales
• Registro de razón social, RFC, domicilio, régimen, diseño de factura, etc.
• Subida opcional de certificado .cer, llave .key, contraseña (cifrada) y escudo PNG.
• Listado, edición, activación por registro, eliminación (y limpieza de archivos en disco).
Controlador: ConfigUsuarioController
• Vista config/usuarios enlazada desde menú Configuración → Mi institución.
• Listado JSON de usuarios; alta con validación; PATCH activo/inactivo; DELETE usuario.
• Compatibilidad si aún no existe columna activo (listado/alta sin romper); script SQL de referencia: database/sql/users_activo_manual.sql.
• nominas/empleados, nominas/registro-empleados: rutas que devuelven vista estática; pueden evolucionar a CRUD real.
Todas las rutas siguientes están bajo **middleware auth**, salvo indicación contraria. Prefijo de aplicación según APP_URL.
| Método | Ruta | Descripción |
|---|---|---|
| GET | /nominas/calculo-nomina | Vista cálculo nómina |
| POST | /nominas/calculo-nomina/export-excel | Export Excel recibo |
| POST | /nominas/calculo-nomina/incidencias-docente | Alta incidencia docente |
| DELETE | /nominas/calculo-nomina/incidencias-docente/{id} | Baja incidencia |
| GET | /nominas/calculo-nomina/export-excel-masivo-zip | Export masivo ZIP |
| GET | /nominas/conceptos-nomina | Vista conceptos |
| GET | /nominas/conceptos-nomina/listado | JSON listado |
| POST | /nominas/conceptos-nomina | Alta |
| PUT | /nominas/conceptos-nomina/{concepto} | Actualización |
| DELETE | /nominas/conceptos-nomina/{concepto} | Baja |
| GET | /nominas/descuentos | Vista descuentos/incidencias |
| GET | /nominas/descuentos/listado | JSON listado |
| GET | /nominas/descuentos/export/print | Imprimir |
| GET | /nominas/descuentos/export/pdf | |
| GET | /nominas/descuentos/export/excel | Excel |
| DELETE | /nominas/descuentos/{id} | Eliminar incidencia |
| Método | Ruta | Descripción |
|---|---|---|
| GET | /conceptos-venta/servicios | Vista servicios |
| GET | /conceptos-venta/productos | Vista productos |
| GET | /conceptos-venta/buscar | Búsqueda |
| POST | /conceptos-venta | Alta |
| GET | /conceptos-venta/{concepto} | Detalle |
| PUT | /conceptos-venta/{concepto} | Actualización |
| DELETE | /conceptos-venta/{concepto} | Baja |
| Método | Ruta | Descripción |
|---|---|---|
| GET | /planes-de-pago/planes | Vista planes |
| GET | /planes-de-pago/planes/buscar | Búsqueda |
| POST | /planes-de-pago/planes | Alta |
| GET | /planes-de-pago/planes/{plan} | Detalle |
| PUT | /planes-de-pago/planes/{plan} | Actualización |
| DELETE | /planes-de-pago/planes/{plan} | Baja |
| GET | /planes-de-pago/descuentos | Vista descuentos/promociones |
| GET | /planes-de-pago/descuentos/buscar | Búsqueda |
| POST | /planes-de-pago/descuentos | Alta |
| GET | /planes-de-pago/descuentos/{descuento} | Detalle |
| PUT | /planes-de-pago/descuentos/{descuento} | Actualización |
| DELETE | /planes-de-pago/descuentos/{descuento} | Baja |
| Método | Ruta | Descripción |
|---|---|---|
| GET | /config/informacion-fiscal | Vista |
| GET | /config/informacion-fiscal/listado | JSON |
| POST | /config/informacion-fiscal | Alta |
| POST | /config/informacion-fiscal/{id}/actualizar | Actualización |
| PATCH | /config/informacion-fiscal/{id}/activo | Activo registro fiscal |
| GET | /config/informacion-fiscal/{id} | Detalle JSON |
| DELETE | /config/informacion-fiscal/{id} | Eliminar |
| GET | /config/usuarios | Vista registro usuarios |
| GET | /config/usuarios/listado | JSON usuarios |
| POST | /config/usuarios | Alta usuario |
| PATCH | /config/usuarios/{user}/activo | Activo/inactivo |
| DELETE | /config/usuarios/{user} | Eliminar usuario |
1. El usuario autenticado abre Cálculo de nómina.
2. El sistema carga docentes y ciclos desde BD (con fallback de configuración de ejemplo si aplica).
3. Se calculan horas según horarios vinculados a grupos (o disponibilidad docente).
4. El usuario registra incidencias (descuentos) que se persisten en incidencias_docente_nomina.
5. Puede exportar recibo en Excel y, en flujo masivo, generar ZIP.
1. Acceso a Nóminas → Descuentos.
2. Aplicación de filtros (año, mes, ciclo, docente).
3. Carga AJAX del listado; columnas alineadas a la tabla de incidencias + nombre docente.
4. Exportación con los mismos filtros en imprimir / PDF / Excel.
5. Eliminación puntual de un registro.
1. Acceso a Configuración → Administración y Finanzas → Información fiscal (según menú).
2. Alta o edición de datos; archivos CFDI opcionales en alta.
3. Archivos almacenados en disco privado por ID de registro.
1. Configuración → Mi institución → Registro de usuarios.
2. Alta de usuario (nombre, email, contraseña); validación de unicidad de email.
3. Activar/desactivar con switch; usuario desactivado no puede mantener sesión (si existe columna activo).
| Tabla | Descripción |
|---|---|
conceptos_nomina | Catálogo de conceptos para nómina |
incidencias_docente_nomina | Descuentos/incidencias por docente, ciclo, fecha, monto, periodo |
nomina | Estructura de nómina (según migraciones del proyecto) |
sueldos | Percepciones/detalles asociados (según migraciones) |
conceptos_venta | Servicios y productos de cobro |
planes_pago | Planes de pago |
descuentos_promociones | Descuentos y promociones comerciales |
datos_fiscales | Datos fiscales y rutas de archivos CFDI |
docentes | Origen del nombre completo en listados de incidencias |
ciclos | Filtros y vínculo académico en incidencias |
users | Usuarios del sistema; columna opcional activo (TINYINT/boolean) |
Laravel base: sessions, cache, etc., compartidas con el resto del sistema.
• incidencias_docente_nomina.docente_id → docentes.id
• incidencias_docente_nomina.ciclo_id → identificador de ciclo (tipo string en migración; coherente con ciclos.id)
• PHP 8.2+
• Composer 2.x
• Node.js 18+ (recomendado) y npm
• MySQL / MariaDB (producción) o SQLite (pruebas)
composer install cp .env.example .env php artisan key:generate php artisan migrate npm install npm run build php artisan serve
En producción, si APP_ENV=production, usar php artisan migrate --force o ejecutar SQL manual en el servidor (p. ej. columna users.activo).
| Variable | Descripción |
|---|---|
APP_URL | URL base |
DB_* | Conexión a base de datos |
LOGIN_MAX_ATTEMPTS / LOGIN_DECAY_SECONDS | Rate limit login (si se usan en config/security.php) |
Disco local | Almacenamiento de archivos fiscales bajo storage/app/private o equivalente |
1. Subir código y sincronizar dependencias (composer install --no-dev en producción si aplica).
2. Configurar .env (BD, APP_URL, APP_DEBUG=false).
3. Ejecutar migraciones o scripts SQL en el mismo servidor donde corre la app y la BD.
4. Limpiar/cachar configuración: php artisan config:cache (opcional).
Nota: Si el despliegue es solo por FTP/subida de archivos, los comandos Artisan deben ejecutarse en el hosting (SSH/panel) o sustituirse por SQL en phpMyAdmin cuando corresponda.
• Gran parte de las pantallas administrativas consumen JSON desde el mismo dominio (fetch + Accept: application/json).
• Las rutas de Administración y Finanzas conviven en routes/web.php con el módulo académico; el mantenimiento a largo plazo puede beneficiarse de archivos de rutas por módulo.
• Exportación Excel de nómina depende de que el paquete maatwebsite/excel esté instalado; el repositorio puede incluir el código de exportación aunque el paquete no figure aún en composer.json — conviene unificar dependencias antes del cierre del proyecto.
• incidencias_docente_nomina no define FK en migración; integridad referencial depende de la aplicación y de convenciones de IDs.
| Riesgo | Detalle |
|---|---|
| Dependencias opcionales | Si falta paquete Excel, fallarán rutas que lo invoquen. |
Columna users.activo | Sin migración/SQL en servidor, activar/desactivar puede no persistir aunque el listado funcione. |
| Rutas monolíticas | Un único web.php grande dificulta revisión y conflictos de merge. |
| Empleados | Rutas de empleados pueden ser solo vista; no sustituyen un módulo completo de RH. |
• Modularizar rutas (routes/nominas.php, routes/finanzas.php e include en bootstrap/app.php o RouteServiceProvider según versión).
• Policies/Gates para restringir “registro de usuarios” e “información fiscal” solo a roles administrativos.
• Pruebas Feature para: login con usuario inactivo, CRUD concepto nómina, alta incidencia, export descuentos.
• Documentación OpenAPI para endpoints JSON internos.
• Foreign keys explícitas en incidencias_docente_nomina hacia docentes y ciclos si el motor y los tipos lo permiten.
| Componente | Ubicación |
|---|---|
| Rutas nómina / finanzas / config | routes/web.php |
| Nómina | app/Http/Controllers/NominaController.php, NominaMasivoController.php |
| Descuentos listado/export | app/Http/Controllers/NominaDescuentosController.php |
| Conceptos nómina | app/Http/Controllers/ConceptoNominaController.php |
| Conceptos venta / planes / promociones | ConceptoVentaController.php, PlanPagoController.php, DescuentoPromocionController.php |
| Información fiscal | app/Http/Controllers/InformacionFiscalController.php, app/Models/DatoFiscal.php |
| Usuarios | app/Http/Controllers/ConfigUsuarioController.php, app/Models/User.php |
| Login / usuario inactivo | app/Http/Controllers/AuthController.php |
| Export Excel incidencias | app/Exports/IncidenciasDocenteNominaExport.php |
SQL manual activo | database/sql/users_activo_manual.sql |
| Diagramas / notas previas nómina | docs/diagrama-proceso-nomina.md, docs/diagrama-proceso-nomina.drawio |
| Término | Significado |
|---|---|
| Incidencia (nómina) | Registro de descuento o ajuste sobre docente en un periodo (incidencias_docente_nomina) |
| Concepto de nómina | Catálogo de percepciones/deducciones o conceptos de pago |
| Dato fiscal | Registro para facturación; puede incluir archivos CFDI |
| Plan de pago | Esquema de cobros asociado a servicios educativos |
| Usuario activo | Puede iniciar sesión (activo = 1) |
1. Abrir Microsoft Word.
2. Archivo → Abrir y elegir Documentacion_Tecnica_Administracion_Finanzas_Nomina.md (Word 2016+ suele importar Markdown) o copiar y pegar el contenido en un documento vacío.
3. Aplicar estilos de título (Título, Título 1, Título 2) a las secciones si Word no los detecta.
4. Guardar como → Documento de Word (.docx).
*Documento elaborado para alinearse con el estilo y profundidad de la “Documentación Técnica Control Escolar” del mismo proyecto, centrado en el alcance de Administración y Finanzas / Nómina.*