S!NTyC API
API REST para el sistema de gestión de compromisos y tareas, construida con Laravel 12 y Supabase. Reemplaza el proceso manual basado en Excel, proporcionando registro individual de compromisos, seguimiento de avances, notificaciones automáticas consolidadas y dashboards analíticos.
Stack Técnico
| Componente | Tecnología |
|---|---|
| Framework | Laravel 12 |
| PHP | 8.4+ |
| Base de datos | PostgreSQL (Supabase) |
| Autenticación | Laravel Sanctum (tokens) |
| Tests | PHPUnit 11 (SQLite :memory:) |
| Rate Limiting | 60 requests/minuto |
| Scheduler | Laravel Scheduler (cron) |
Configuración Inicial
1. Variables de entorno
Copiar .env.example a .env y completar los datos de Supabase:
DB_CONNECTION=pgsql
DB_HOST=db.XXXXX.supabase.co
DB_PORT=5432
DB_DATABASE=postgres
DB_USERNAME=postgres
DB_PASSWORD=tu_password
2. Instalación
composer install
php artisan key:generate
php artisan migrate --seed
3 roles: superadmin, area_manager, worker
Superadmin: admin@sintyc.test / Password1
Manager: manager@sintyc.test / Password1
Extras: 2 trabajadores, 1 área con membresías, 1 reunión de ejemplo
3. Ejecutar tests
php artisan test
# o
php vendor/bin/phpunit --testdox
4. Scheduler (producción)
* * * * * cd /path-to-project && php artisan schedule:run >> /dev/null 2>&1
Autenticación
POST /login) requieren el header Authorization: Bearer {'{token}'}
| Método | Endpoint | Descripción | Auth |
|---|---|---|---|
| POST | /api/login | Login con email y password | No |
| POST | /api/logout | Cerrar sesión (revoca token) | Sí |
| GET | /api/me | Perfil del usuario autenticado | Sí |
Request — Login
POST /api/login
Content-Type: application/json
{
"email": "admin@sintyc.test",
"password": "Password1"
}
Response — Login exitoso
{
"token": "1|abc123...",
"user": {
"id": 1,
"name": "Admin",
"email": "admin@sintyc.test",
"role": {
"id": 1,
"name": "Super Administrador",
"slug": "superadmin"
},
"active": true
}
}
Usuarios
| Método | Endpoint | Descripción | Roles |
|---|---|---|---|
| GET | /api/users | Listar usuarios | superadmin area_manager |
| POST | /api/users | Crear usuario | superadmin |
| GET | /api/users/{'{id}'} | Ver usuario | superadmin area_manager |
| PUT | /api/users/{'{id}'} | Actualizar usuario | superadmin |
| PATCH | /api/users/{'{id}'}/role | Cambiar rol | superadmin |
| PATCH | /api/users/{'{id}'}/toggle-active | Activar / desactivar | superadmin |
Body — Crear usuario
{
"name": "Juan Pérez",
"email": "juan@empresa.com",
"password": "Segur@123",
"password_confirmation": "Segur@123",
"role_id": 3
}
Password requiere: mínimo 8 caracteres, mayúsculas, minúsculas, números y símbolos.
Áreas
| Método | Endpoint | Descripción | Roles |
|---|---|---|---|
| GET | /api/areas | Listar áreas | superadmin area_manager |
| POST | /api/areas | Crear área | superadmin |
| GET | /api/areas/{'{id}'} | Ver área | superadmin area_manager |
| PUT | /api/areas/{'{id}'} | Actualizar área | superadmin |
| PATCH | /api/areas/{'{id}'}/manager | Asignar encargado | superadmin |
| POST | /api/areas/claim-worker | Reclamar trabajador al área | area_manager |
| GET | /api/areas/{'{id}'}/available-workers | Trabajadores disponibles (sin área activa) | area_manager |
| GET | /api/areas/{'{id}'}/members | Miembros activos del área | superadmin area_manager |
Body — Crear área
{
"name": "Gerencia Comercial",
"description": "Área de ventas y relaciones comerciales"
}
Body — Reclamar trabajador
{
"user_id": 5
}
El trabajador debe tener rol worker y no pertenecer a otra área activa.
Body — Asignar encargado
{
"manager_user_id": 2
}
El usuario será asignado como encargado del área.
Query params — Trabajadores disponibles
GET /api/areas/{'{id}'}/available-workers?search=juan
Retorna workers activos sin área activa asignada, paginados (20 por página). El parámetro search filtra por nombre o email.
Query params — Miembros del área
GET /api/areas/{'{id}'}/members?search=juan
Retorna los miembros activos del área, paginados (20 por página). El parámetro search filtra por nombre o email.
Reuniones
Las reuniones son el origen de los compromisos. Las tareas pueden vincularse a una reunión mediante meeting_id.
| Método | Endpoint | Descripción | Roles |
|---|---|---|---|
| GET | /api/meetings | Listar reuniones (filtrable por área y clasificación) | superadmin area_manager |
| POST | /api/meetings | Crear reunión | superadmin area_manager |
| GET | /api/meetings/{'{id}'} | Ver reunión con tareas asociadas | Según visibilidad |
| PUT | /api/meetings/{'{id}'} | Actualizar reunión | Creador o superadmin |
| DELETE | /api/meetings/{'{id}'} | Eliminar reunión | superadmin |
Query params — Filtrar reuniones
GET /api/meetings?area_id=1&classification=operational
Body — Crear reunión
{
"title": "Revisión mensual de avances",
"meeting_date": "2026-03-20",
"area_id": 1,
"classification": "follow_up",
"notes": "Revisar compromisos pendientes del mes anterior"
}
Clasificaciones disponibles
Tareas
| Método | Endpoint | Descripción | Roles |
|---|---|---|---|
| GET | /api/tasks | Listar tareas (filtrado por rol) | Todos |
| POST | /api/tasks | Crear tarea | superadmin area_manager |
| GET | /api/tasks/{'{id}'} | Ver tarea con detalles completos | Según visibilidad |
| PUT | /api/tasks/{'{id}'} | Actualizar tarea | superadmin area_manager |
| DELETE | /api/tasks/{'{id}'} | Eliminar tarea | superadmin area_manager |
| POST | /api/tasks/{'{id}'}/claim | Reclamar tarea (tomar responsabilidad) | superadmin area_manager |
| POST | /api/tasks/{'{id}'}/delegate | Delegar tarea a otro trabajador | area_manager |
| POST | /api/tasks/{'{id}'}/start | Iniciar tarea | Worker asignado |
| POST | /api/tasks/{'{id}'}/submit-review | Enviar a revisión | Worker asignado |
| POST | /api/tasks/{'{id}'}/approve | Aprobar tarea | area_manager |
| POST | /api/tasks/{'{id}'}/reject | Rechazar tarea | area_manager |
| POST | /api/tasks/{'{id}'}/cancel | Cancelar tarea | superadmin |
| POST | /api/tasks/{'{id}'}/reopen | Reabrir tarea completada o cancelada | superadmin area_manager Worker propio |
| POST | /api/tasks/{'{id}'}/comment | Agregar comentario | Según visibilidad |
| POST | /api/tasks/{'{id}'}/attachments | Subir adjunto | Según visibilidad |
Query params — Filtrar tareas
GET /api/tasks?status=pending&priority=high&area_id=1&sort=oldest
Opciones de ordenamiento (?sort=)
Por defecto, las tareas se ordenan por más recientes primero.
Campos computados en respuesta de tareas
| Campo | Tipo | Descripción |
|---|---|---|
age_days | integer | Días desde la creación |
days_without_update | integer | Días desde el último reporte de avance |
is_overdue | boolean | Si la tarea pasó su fecha límite |
comments_count | integer | Cantidad de comentarios |
attachments_count | integer | Cantidad de adjuntos |
updates_count | integer | Cantidad de reportes de avance |
Body — Crear tarea
{
"title": "Preparar informe trimestral",
"description": "Consolidar datos de ventas Q1 2026",
"priority": "high",
"due_date": "2026-04-01",
"assigned_to_user_id": 4,
"meeting_id": 1,
"requires_attachment": true,
"requires_completion_comment": true,
"requires_manager_approval": true,
"requires_progress_report": true,
"notify_on_due": true,
"notify_on_overdue": true,
"notify_on_completion": false,
"external_email": null,
"external_name": null
}
Casos de asignación
Enviar assigned_to_user_id. Estado inicial: pending.
Enviar assigned_to_area_id. Estado inicial: pending_assignment. El encargado luego delega.
Superadmin o Area Manager envían su propio id en assigned_to_user_id. Estado: pending.
Enviar external_email y external_name. Estado: pending. Se envía correo al destinatario.
Body — Delegar
{
"to_user_id": 5,
"note": "Necesito que te encargues de esta tarea"
}
Body — Enviar a revisión
{
"completion_comment": "Trabajo completado, adjunté el informe final"
}
Si requires_attachment = true, la tarea debe tener al menos un adjunto antes de enviar a revisión.
Body — Rechazar
{
"rejection_note": "Falta el desglose por región, favor completar"
}
Body — Reabrir tarea
{
"note": "Se requiere ajustar el informe con datos actualizados"
}
El campo note es opcional. Si la tarea estaba completed vuelve a in_progress. Si estaba cancelled vuelve a pending.
Body — Asignar a externo
{
"title": "Enviar reporte a auditor",
"external_email": "auditor@externo.com",
"external_name": "Carlos López",
"priority": "high",
"due_date": "2026-04-15"
}
No se puede combinar external_email con assigned_to_user_id o assigned_to_area_id. Se envía correo automático al destinatario externo.
Body — Subir adjunto
POST /api/tasks/{'{id}'}/attachments
Content-Type: multipart/form-data
file: [archivo]
attachment_type: evidence | support | final_delivery
Avances de Tareas
Permite al responsable o manager reportar avances con porcentaje de progreso.
| Método | Endpoint | Descripción | Roles |
|---|---|---|---|
| POST | /api/tasks/{'{id}'}/updates | Reportar avance/progreso | Responsable, area_manager, superadmin |
Body — Reportar avance
{
"comment": "Se completó la fase de recolección de datos",
"update_type": "progress",
"progress_percent": 65
}
Tipos de actualización
progress_percent se sincroniza automáticamente con el campo progress_percent de la tarea.
Dashboard
| Método | Endpoint | Descripción | Roles |
|---|---|---|---|
| GET | /api/dashboard/general | Dashboard gerencial general | superadmin |
| GET | /api/dashboard/area/{'{id}'} | Dashboard por área | superadmin area_manager del área |
| GET | /api/dashboard/consolidated | Consolidado operativo por proceso/área | superadmin |
| GET | /api/dashboard/me | Dashboard personal | Todos |
Dashboard General
Total activas, completadas, vencidas, próximas a vencer, completadas este mes
Tasa de cierre (%), promedio de días para cerrar
Tareas por estado, por área, top 10 responsables por carga
my_tasks)Hasta 10 tareas activas donde el superadmin es responsable (personales + de área), ordenadas por fecha límite. Incluye area_id, is_overdue y progress_percent.
Dashboard por Área
Tareas por estado del área, vencidas, distribución por responsable, tasa de cierre, tareas sin reportes de avance.
Dashboard Consolidado
Reporte tipo Excel por proceso/área con métricas completas. Cada área incluye: process_identifier, total, conteo por estado, tasa de cierre, vencidas, sin avance, antigüedad máxima del pendiente más viejo, promedio de días sin reportar. Incluye resumen global.
Dashboard Personal
Tareas activas, vencidas, próximas a vencer, completadas, distribución por estado, lista de tareas próximas ordenadas por fecha.
Modelos y Relaciones
User
belongsToRolebelongsToManyArea (viaarea_members)hasManycreatedTasks, assignedTasks, responsibleTasks- Helpers:
isSuperAdmin(),isAreaManager(),isWorker(),belongsToArea($id),isManagerOfArea($id)
Area
belongsTomanager (User)belongsToManyusers (viaarea_members)hasManyTasks- Campos:
name,description,process_identifier,manager_user_id,active
Task (SoftDeletes)
belongsTocreator, assignedUser, assignedArea, delegatedBy, currentResponsible, area, closedBy, cancelledBy, meetinghasManycomments, attachments, statusHistory, delegations, updates- Config:
requires_attachment,requires_completion_comment,requires_manager_approval,requires_progress_report - Notificación:
notify_on_due,notify_on_overdue,notify_on_completion - Seguimiento:
progress_percent,meeting_id - Externo:
external_email,external_name(para asignaciones a usuarios fuera del sistema)
Meeting
belongsToArea, creator (User)hasManyTasks- Campos:
title,meeting_date,area_id,classification,notes,created_by
TaskUpdate
belongsToTask, User- Campos:
task_id,user_id,update_type,comment,progress_percent
Otros modelos
- TaskDelegation — Historial de delegaciones (
task_id,from_user,to_user) - TaskComment — Comentarios (
task_id,user_id,comment,type) - TaskAttachment — Archivos adjuntos (
file_name,file_path,mime_type,file_size) - TaskStatusHistory — Cambios de estado (
from_status,to_status,note) - ActivityLog — Auditoría (
module,action,subject_type,description)
Enums
TaskStatusEnum
TaskPriorityEnum
RoleEnum
CommentTypeEnum
AttachmentTypeEnum
UpdateTypeEnum
MeetingClassificationEnum
NotificationChannelEnum
Flujo de Estados
Flujo principal
Transiciones alternativas
Tabla de transiciones
| Desde | Hacia |
|---|---|
draft | pending_assignment, pending, cancelled |
pending_assignment | pending, cancelled |
pending | in_progress, cancelled |
in_progress | in_review, completed, cancelled, overdue |
in_review | completed, rejected, cancelled |
rejected | in_progress, cancelled |
overdue | in_progress, cancelled |
completed | in_progress (reopen) |
cancelled | pending (reopen) |
Reglas de Negocio
Creación de tareas
assigned_to_user_id = usuario
current_responsible_user_id = usuario
Estado: pending
assigned_to_area_id = área
current_responsible_user_id = null
Estado: pending_assignment
Cualquier rol puede usar su propio id en assigned_to_user_id.
Estado: pending
area_id: null — tarea personal.
No aparece en ningún dashboard, pero sí en GET /api/tasks.
Delegación
- Solo el encargado del área puede delegar tareas de su área
- El trabajador destino debe pertenecer al área
- La tarea no puede estar completada ni cancelada
- Se registra en
task_delegationsyactivity_logs
Validaciones de cierre
- Si
requires_attachment = true→ debe tener al menos un adjunto - Si
requires_completion_comment = true→ debe enviarcompletion_comment
Aprobación / Rechazo
- Si
requires_manager_approval = true→ pasa ain_reviewantes decompleted - Si no requiere aprobación → pasa directamente a
completed - Al rechazar → requiere
rejection_note, estado vuelve ain_progress
Reabrir tareas
- Tareas
completedvuelven ain_progress - Tareas
cancelledvuelven apending - Se limpia
completed_at,closed_by,cancelled_by - Superadmin puede reabrir cualquier tarea, manager las de su área, worker solo las propias
Eliminación de tareas
- Solo
superadminyarea_managerpueden eliminar tareas - Se eliminan en cascada comentarios, adjuntos y registros relacionados
Tareas externas
- Se asignan vía
external_email+external_name - No se pueden combinar con
assigned_to_user_idoassigned_to_area_id - Se envía correo automático al destinatario externo con los detalles de la tarea
Reclamar trabajador
- Solo
area_managerpuede reclamar - El usuario debe tener rol
worker - El trabajador no debe tener ya un área activa
Reuniones como origen
- Las tareas pueden tener
meeting_idvinculándolas a la reunión origen - Al ver una reunión se listan todas sus tareas asociadas
Seguimiento y avances
- El responsable puede reportar avances con comentario, porcentaje y tipo
- El
progress_percentse sincroniza automáticamente con la tarea - Si
requires_progress_report = true, la tarea exige reportes de avance
Notificaciones Automáticas
Alerta cuando la fecha de entrega está próxima (días configurables vía alert_days_before_due)
Alerta cuando la tarea ya pasó su fecha de vencimiento
Notificación automática al completar la tarea
Los comandos programados generan registros en la tabla task_notifications. Toda la configuración de notificaciones es gestionable desde la API (ver Ajustes del sistema).
Comandos Programados
Los comandos se ejecutan automáticamente según el scheduler, pero sus horarios y estado (activado/desactivado) son configurables desde la API. También pueden ejecutarse manualmente desde los endpoints de automatización.
| Comando | Descripción | Configuración |
|---|---|---|
tasks:detect-overdue |
Marca como vencidas las tareas pasadas de fecha. Cambia el estado a overdue y registra en task_status_history y activity_logs. |
detect_overdue_enabled, detect_overdue_time (default: 06:00) |
tasks:send-daily-summary |
Genera resúmenes consolidados por responsable. Tareas ordenadas por antigüedad (más viejas primero). Incluye días de antigüedad, días sin avance, y flag de inactividad (⚠ si ≥7 días sin avance). Usa alert_days_before_due para determinar tareas próximas a vencer. |
daily_summary_enabled, daily_summary_time (default: 07:00) |
tasks:send-due-reminders |
Envía recordatorios individuales para tareas con notify_on_due y alertas para tareas con notify_on_overdue. Usa alert_days_before_due configurable. |
emails_enabled, send_reminders_time (default: 08:00) |
tasks:detect-inactive |
Detecta tareas en progreso o pendientes que no tienen reportes de avance en X días. Agrupa por responsable y envía UNA notificación consolidada por persona con listado de tareas inactivas y días sin avance. | inactivity_alert_enabled, inactivity_alert_days (default: 7), inactivity_alert_time (default: 09:00) |
Ajustes del Sistema
Tabla system_settings — Configuración clave-valor administrable vía API. Solo accesible por superadmin.
GET /api/settings
Lista todos los ajustes agrupados. Filtrar con ?group=notifications o ?group=automation.
// Respuesta
{
"data": {
"notifications": [
{ "key": "emails_enabled", "value": true, "type": "boolean", "group": "notifications", "description": "..." },
{ "key": "alert_days_before_due", "value": 3, "type": "integer", "group": "notifications", "description": "..." }
],
"automation": [
{ "key": "detect_overdue_time", "value": "06:00", "type": "string", "group": "automation", "description": "..." }
]
}
}
PUT /api/settings
Actualización masiva de ajustes.
// Request body
{
"settings": [
{ "key": "emails_enabled", "value": "0" },
{ "key": "alert_days_before_due", "value": "5" },
{ "key": "daily_summary_time", "value": "09:00" }
]
}
Ajustes disponibles
| Clave | Tipo | Grupo | Default | Descripción |
|---|---|---|---|---|
emails_enabled | boolean | notifications | true | Activar/desactivar correos automáticos |
daily_summary_enabled | boolean | notifications | true | Activar resumen diario |
alert_days_before_due | integer | notifications | 3 | Días antes del vencimiento para alertas |
alert_on_due_date | boolean | notifications | true | Alerta el día de vencimiento |
alert_overdue | boolean | notifications | true | Alerta cuando tarea está vencida |
copy_to_manager | boolean | notifications | true | Copia notificaciones al encargado |
copy_to_superadmin | boolean | notifications | false | Copia notificaciones al superadmin |
detect_overdue_enabled | boolean | automation | true | Activar detección automática |
detect_overdue_time | string | automation | 06:00 | Hora de detección de vencidas |
daily_summary_time | string | automation | 07:00 | Hora del resumen diario |
send_reminders_enabled | boolean | automation | true | Activar recordatorios automáticos |
send_reminders_time | string | automation | 08:00 | Hora de recordatorios |
inactivity_alert_enabled | boolean | automation | true | Activar alertas por inactividad |
inactivity_alert_days | integer | automation | 7 | Días sin avance para alertar |
inactivity_alert_time | string | automation | 09:00 | Hora de detección de inactividad |
Plantillas de Mensajes
Tabla message_templates — Plantillas editables para notificaciones. Solo accesible por superadmin. Las plantillas son precargadas (seeder), no se crean ni eliminan desde la API.
GET /api/message-templates
Lista todas las plantillas.
GET /api/message-templates/{id}
Detalle de una plantilla.
PUT /api/message-templates/{id}
Editar asunto, cuerpo o estado activo.
// Request body (todos los campos son opcionales)
{
"subject": "Nuevo asunto: {task_title}",
"body": "Hola {user_name}, nueva tarea asignada...",
"active": false
}
Plantillas disponibles
| Slug | Nombre | Variables |
|---|---|---|
new_assignment | Nueva asignación | {task_title}, {user_name}, {priority}, {due_date} |
task_reminder | Recordatorio | {task_title}, {user_name}, {days_remaining}, {due_date} |
task_overdue | Tarea vencida | {task_title}, {user_name}, {days_overdue}, {due_date} |
task_delegated | Tarea delegada | {task_title}, {user_name}, {delegated_by}, {priority}, {due_date} |
task_approved | Tarea aprobada | {task_title}, {user_name} |
task_rejected | Tarea rechazada | {task_title}, {user_name}, {rejection_reason} |
daily_summary | Resumen diario | {user_name}, {date}, {summary_content} |
inactivity_alert | Alerta de inactividad | {user_name}, {inactivity_days}, {task_list} |
Importación CSV
Importa tareas masivamente desde un archivo CSV. Solo accesible por superadmin. Crea áreas automáticamente si no existen.
POST /api/import/tasks
Acepta un archivo CSV (multipart/form-data, campo: file) con las siguientes columnas:
| Columna | Requerida | Descripción |
|---|---|---|
titulo | Sí | Título de la tarea |
descripcion | No | Descripción de la tarea |
responsable_email | Sí | Email del usuario responsable (debe existir) |
area | No | Nombre del área — se crea si no existe |
prioridad | No | alta, media, baja (default: media) |
estado | No | pendiente, en_progreso, completada, cancelada (default: pendiente) |
fecha_inicio | No | Formatos: YYYY-MM-DD, DD/MM/YYYY, DD-MM-YYYY |
fecha_limite | No | Formatos: YYYY-MM-DD, DD/MM/YYYY, DD-MM-YYYY |
Respuesta exitosa
{
"message": "Importación completada",
"imported": 15,
"errors": []
}
Respuesta con errores parciales
{
"message": "Importación completada con errores",
"imported": 12,
"errors": [
{"row": 3, "error": "responsable_email es requerido"},
{"row": 7, "error": "Usuario no encontrado: unknown@mail.com"}
]
}
Automatización (Triggers Manuales)
Endpoints para ejecutar manualmente las tareas automatizadas. Solo accesible por superadmin. Cada ejecución se registra en activity_logs.
POST /api/automation/detect-overdue
Ejecuta la detección de tareas vencidas. Equivalente a tasks:detect-overdue.
POST /api/automation/send-summary
Envía el resumen diario de tareas. Falla con 422 si daily_summary_enabled está desactivado.
POST /api/automation/send-reminders
Envía recordatorios de vencimiento. Falla con 422 si emails_enabled está desactivado.
POST /api/automation/detect-inactivity
Ejecuta la detección de tareas inactivas. Falla con 422 si inactivity_alert_enabled está desactivado.
// Respuesta exitosa (200)
{
"message": "Detección de tareas vencidas ejecutada correctamente",
"output": "Se marcaron 3 tareas como vencidas."
}
// Respuesta cuando está desactivado (422)
{
"message": "El resumen diario está desactivado. Actívelo en configuración antes de enviarlo."
}
Formato de Respuestas
Éxito con datos (200)
{
"data": {
"id": 1,
"title": "Tarea ejemplo",
"status": "pending",
"priority": "high",
"progress_percent": 0,
"is_overdue": false,
"created_at": "2026-03-16T10:00:00.000000Z"
}
}
Éxito con mensaje (200)
{
"message": "Tarea delegada exitosamente"
}
Error de validación (422)
{
"message": "The title field is required.",
"errors": {
"title": ["The title field is required."]
}
}
Error de autenticación (401)
{
"message": "Unauthenticated."
}
Error de autorización (403)
{
"message": "This action is unauthorized."
}
Seguridad
Tokens Sanctum con expiración configurable. Usuarios inactivos no pueden hacer login. Rate limiting: 60 req/min.
Policies verifican permisos por modelo. Form Requests validan y autorizan. Un superadmin no puede auto-degradarse.
Todos los endpoints usan Form Requests. Passwords: min 8 chars, mayúsculas, minúsculas, números, símbolos.
Contraseñas hasheadas con bcrypt. Soft deletes en tareas. Transacciones DB en toda escritura.
Cada acción relevante en activity_logs. Historial de estados en task_status_history. Delegaciones rastreadas.
auth:sanctum en rutas protegidas. Throttle API global. Frontend stateful middleware.
Migraciones
| # | Tabla | Descripción |
|---|---|---|
| 1 | roles | Roles del sistema |
| 2 | users (mod) | Agrega role_id, active |
| 3 | areas | Áreas de trabajo |
| 4 | area_members | Membresías área-usuario |
| 5 | tasks | Tabla central de tareas |
| 6 | task_delegations | Historial de delegaciones |
| 7 | task_comments | Comentarios en tareas |
| 8 | task_attachments | Archivos adjuntos |
| 9 | task_notifications | Notificaciones de cumplimiento |
| 10 | task_status_history | Historial de cambios de estado |
| 11 | activity_logs | Log de auditoría general |
| 12 | meetings | Reuniones / origen de compromisos |
| 13 | tasks (mod) | Agrega meeting_id, flags de notificación, progress_percent |
| 14 | task_updates | Reportes de avance/seguimiento |
| 15 | system_settings | Configuración clave-valor del sistema |
| 16 | message_templates | Plantillas de mensajes editables |
| 17 | areas (mod) | Agrega process_identifier para mapeo con Excel |
| 18 | Índices | Índices de rendimiento en tablas principales |
| 19 | tasks (mod) | Agrega external_email, external_name para asignaciones externas |
Tests
194 tests organizados por feature — todos pasando con SQLite in-memory.
| Suite | Tests | Cobertura |
|---|---|---|
AuthTest | 7 | Login, logout, perfil, credenciales inválidas, usuario inactivo, campos requeridos, rutas protegidas |
UserTest | 11 | CRUD, cambio de rol, activar/desactivar, validación de password, email único, filtro exclude_area |
AreaTest | 16 | CRUD, asignar encargado, reclamar trabajador, workers disponibles, búsqueda, miembros del área, manager ve todas las áreas |
MeetingTest | 17 | CRUD, permisos, vinculación con tareas, filtrado por área y clasificación, creación batch de tareas desde reunión |
TaskTest | 52 | CRUD, delegación, reclamar, flujo completo de estados, adjuntos, comentarios, reabrir, eliminar, tareas externas, auto-asignación, tareas personales, asignación a encargado, asignación cross-área, user_id en historial |
TaskUpdateTest | 6 | Avances, validaciones, permisos, sincronización de progreso |
DashboardTest | 13 | Dashboard general, por área, personal, permisos, métricas, exclusión de tareas personales, tareas propias del superadmin, awaiting_claim |
ScheduledCommandsTest | 6 | Detección overdue, resumen diario, recordatorios, flags |
SystemSettingTest | 10 | CRUD, agrupación, filtrado, casteo de tipos, permisos |
MessageTemplateTest | 9 | CRUD, activar/desactivar, validaciones, permisos |
AutomationTest | 17 | Triggers manuales, permisos, configuración enabled/disabled, validaciones |
InactivityDetectionTest | 10 | Detección de inactividad, consolidación, configuración, trigger API |
ConsolidatedDashboardTest | 8 | Dashboard consolidado, proceso/área, permisos, múltiples áreas, exclusión de tareas personales |
ImportTest | 11 | Importación CSV, áreas automáticas, mapeo estados/fechas, permisos |
Ejecutar tests
php artisan test
php vendor/bin/phpunit --testdox