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.

194 tests passing Laravel 12 Sanctum Auth PostgreSQL / Supabase

Stack Técnico

ComponenteTecnología
FrameworkLaravel 12
PHP8.4+
Base de datosPostgreSQL (Supabase)
AutenticaciónLaravel Sanctum (tokens)
TestsPHPUnit 11 (SQLite :memory:)
Rate Limiting60 requests/minuto
SchedulerLaravel 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
Datos del seeder

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

Todos los endpoints (excepto POST /login) requieren el header Authorization: Bearer {'{token}'}
MétodoEndpointDescripciónAuth
POST /api/login Login con email y password No
POST /api/logout Cerrar sesión (revoca token)
GET /api/me Perfil del usuario autenticado

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étodoEndpointDescripciónRoles
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étodoEndpointDescripciónRoles
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étodoEndpointDescripciónRoles
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

strategic operational follow_up review other

Tareas

MétodoEndpointDescripciónRoles
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=)

oldest due_date priority

Por defecto, las tareas se ordenan por más recientes primero.

Campos computados en respuesta de tareas

CampoTipoDescripción
age_daysintegerDías desde la creación
days_without_updateintegerDías desde el último reporte de avance
is_overduebooleanSi la tarea pasó su fecha límite
comments_countintegerCantidad de comentarios
attachments_countintegerCantidad de adjuntos
updates_countintegerCantidad 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

Asignar a usuario

Enviar assigned_to_user_id. Estado inicial: pending.

Asignar a área

Enviar assigned_to_area_id. Estado inicial: pending_assignment. El encargado luego delega.

Asignar a sí mismo

Superadmin o Area Manager envían su propio id en assigned_to_user_id. Estado: pending.

Asignar a externo

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étodoEndpointDescripciónRoles
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 evidence note
El progress_percent se sincroniza automáticamente con el campo progress_percent de la tarea.

Dashboard

MétodoEndpointDescripciónRoles
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

Conteos

Total activas, completadas, vencidas, próximas a vencer, completadas este mes

Métricas

Tasa de cierre (%), promedio de días para cerrar

Rankings

Tareas por estado, por área, top 10 responsables por carga

Mis tareas (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

  • belongsTo Role
  • belongsToMany Area (via area_members)
  • hasMany createdTasks, assignedTasks, responsibleTasks
  • Helpers: isSuperAdmin(), isAreaManager(), isWorker(), belongsToArea($id), isManagerOfArea($id)

Area

  • belongsTo manager (User)
  • belongsToMany users (via area_members)
  • hasMany Tasks
  • Campos: name, description, process_identifier, manager_user_id, active

Task (SoftDeletes)

  • belongsTo creator, assignedUser, assignedArea, delegatedBy, currentResponsible, area, closedBy, cancelledBy, meeting
  • hasMany comments, 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

  • belongsTo Area, creator (User)
  • hasMany Tasks
  • Campos: title, meeting_date, area_id, classification, notes, created_by

TaskUpdate

  • belongsTo Task, 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

draft pending_assignment pending in_progress in_review completed rejected overdue cancelled

TaskPriorityEnum

low medium high urgent

RoleEnum

superadmin area_manager worker

CommentTypeEnum

comment progress completion_note rejection_note system

AttachmentTypeEnum

evidence support final_delivery

UpdateTypeEnum

progress evidence note

MeetingClassificationEnum

strategic operational follow_up review other

NotificationChannelEnum

database mail

Flujo de Estados

Flujo principal

draft pending_assignment pending in_progress in_review completed

Transiciones alternativas

in_review rejected in_progress (retry)
in_progress overdue in_progress (reiniciar)
cualquier estado activo cancelled
completed in_progress (reopen)
cancelled pending (reopen)

Tabla de transiciones

DesdeHacia
draftpending_assignment, pending, cancelled
pending_assignmentpending, cancelled
pendingin_progress, cancelled
in_progressin_review, completed, cancelled, overdue
in_reviewcompleted, rejected, cancelled
rejectedin_progress, cancelled
overduein_progress, cancelled
completedin_progress (reopen)
cancelledpending (reopen)

Reglas de Negocio

Creación de tareas

Asignar a usuario

assigned_to_user_id = usuario
current_responsible_user_id = usuario
Estado: pending

Asignar a área

assigned_to_area_id = área
current_responsible_user_id = null
Estado: pending_assignment

Auto-asignación (cualquier rol)

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_delegations y activity_logs

Validaciones de cierre

  • Si requires_attachment = true → debe tener al menos un adjunto
  • Si requires_completion_comment = true → debe enviar completion_comment

Aprobación / Rechazo

  • Si requires_manager_approval = true → pasa a in_review antes de completed
  • Si no requiere aprobación → pasa directamente a completed
  • Al rechazar → requiere rejection_note, estado vuelve a in_progress

Reabrir tareas

  • Tareas completed vuelven a in_progress
  • Tareas cancelled vuelven a pending
  • 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 superadmin y area_manager pueden 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_id o assigned_to_area_id
  • Se envía correo automático al destinatario externo con los detalles de la tarea

Reclamar trabajador

  • Solo area_manager puede reclamar
  • El usuario debe tener rol worker
  • El trabajador no debe tener ya un área activa

Reuniones como origen

  • Las tareas pueden tener meeting_id vinculá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_percent se sincroniza automáticamente con la tarea
  • Si requires_progress_report = true, la tarea exige reportes de avance

Notificaciones Automáticas

notify_on_due

Alerta cuando la fecha de entrega está próxima (días configurables vía alert_days_before_due)

notify_on_overdue

Alerta cuando la tarea ya pasó su fecha de vencimiento

notify_on_completion

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.

ComandoDescripciónConfiguració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

ClaveTipoGrupoDefaultDescripción
emails_enabledbooleannotificationstrueActivar/desactivar correos automáticos
daily_summary_enabledbooleannotificationstrueActivar resumen diario
alert_days_before_dueintegernotifications3Días antes del vencimiento para alertas
alert_on_due_datebooleannotificationstrueAlerta el día de vencimiento
alert_overduebooleannotificationstrueAlerta cuando tarea está vencida
copy_to_managerbooleannotificationstrueCopia notificaciones al encargado
copy_to_superadminbooleannotificationsfalseCopia notificaciones al superadmin
detect_overdue_enabledbooleanautomationtrueActivar detección automática
detect_overdue_timestringautomation06:00Hora de detección de vencidas
daily_summary_timestringautomation07:00Hora del resumen diario
send_reminders_enabledbooleanautomationtrueActivar recordatorios automáticos
send_reminders_timestringautomation08:00Hora de recordatorios
inactivity_alert_enabledbooleanautomationtrueActivar alertas por inactividad
inactivity_alert_daysintegerautomation7Días sin avance para alertar
inactivity_alert_timestringautomation09:00Hora 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

SlugNombreVariables
new_assignmentNueva asignación{task_title}, {user_name}, {priority}, {due_date}
task_reminderRecordatorio{task_title}, {user_name}, {days_remaining}, {due_date}
task_overdueTarea vencida{task_title}, {user_name}, {days_overdue}, {due_date}
task_delegatedTarea delegada{task_title}, {user_name}, {delegated_by}, {priority}, {due_date}
task_approvedTarea aprobada{task_title}, {user_name}
task_rejectedTarea rechazada{task_title}, {user_name}, {rejection_reason}
daily_summaryResumen diario{user_name}, {date}, {summary_content}
inactivity_alertAlerta 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:

ColumnaRequeridaDescripción
tituloTítulo de la tarea
descripcionNoDescripción de la tarea
responsable_emailEmail del usuario responsable (debe existir)
areaNoNombre del área — se crea si no existe
prioridadNoalta, media, baja (default: media)
estadoNopendiente, en_progreso, completada, cancelada (default: pendiente)
fecha_inicioNoFormatos: YYYY-MM-DD, DD/MM/YYYY, DD-MM-YYYY
fecha_limiteNoFormatos: 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

Autenticación

Tokens Sanctum con expiración configurable. Usuarios inactivos no pueden hacer login. Rate limiting: 60 req/min.

Autorización

Policies verifican permisos por modelo. Form Requests validan y autorizan. Un superadmin no puede auto-degradarse.

Validación

Todos los endpoints usan Form Requests. Passwords: min 8 chars, mayúsculas, minúsculas, números, símbolos.

Protección de datos

Contraseñas hasheadas con bcrypt. Soft deletes en tareas. Transacciones DB en toda escritura.

Auditoría

Cada acción relevante en activity_logs. Historial de estados en task_status_history. Delegaciones rastreadas.

Middleware

auth:sanctum en rutas protegidas. Throttle API global. Frontend stateful middleware.

Migraciones

#TablaDescripción
1rolesRoles del sistema
2users (mod)Agrega role_id, active
3areasÁreas de trabajo
4area_membersMembresías área-usuario
5tasksTabla central de tareas
6task_delegationsHistorial de delegaciones
7task_commentsComentarios en tareas
8task_attachmentsArchivos adjuntos
9task_notificationsNotificaciones de cumplimiento
10task_status_historyHistorial de cambios de estado
11activity_logsLog de auditoría general
12meetingsReuniones / origen de compromisos
13tasks (mod)Agrega meeting_id, flags de notificación, progress_percent
14task_updatesReportes de avance/seguimiento
15system_settingsConfiguración clave-valor del sistema
16message_templatesPlantillas de mensajes editables
17areas (mod)Agrega process_identifier para mapeo con Excel
18ÍndicesÍndices de rendimiento en tablas principales
19tasks (mod)Agrega external_email, external_name para asignaciones externas

Tests

194 tests organizados por feature — todos pasando con SQLite in-memory.

SuiteTestsCobertura
AuthTest7Login, logout, perfil, credenciales inválidas, usuario inactivo, campos requeridos, rutas protegidas
UserTest11CRUD, cambio de rol, activar/desactivar, validación de password, email único, filtro exclude_area
AreaTest16CRUD, asignar encargado, reclamar trabajador, workers disponibles, búsqueda, miembros del área, manager ve todas las áreas
MeetingTest17CRUD, permisos, vinculación con tareas, filtrado por área y clasificación, creación batch de tareas desde reunión
TaskTest52CRUD, 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
TaskUpdateTest6Avances, validaciones, permisos, sincronización de progreso
DashboardTest13Dashboard general, por área, personal, permisos, métricas, exclusión de tareas personales, tareas propias del superadmin, awaiting_claim
ScheduledCommandsTest6Detección overdue, resumen diario, recordatorios, flags
SystemSettingTest10CRUD, agrupación, filtrado, casteo de tipos, permisos
MessageTemplateTest9CRUD, activar/desactivar, validaciones, permisos
AutomationTest17Triggers manuales, permisos, configuración enabled/disabled, validaciones
InactivityDetectionTest10Detección de inactividad, consolidación, configuración, trigger API
ConsolidatedDashboardTest8Dashboard consolidado, proceso/área, permisos, múltiples áreas, exclusión de tareas personales
ImportTest11Importación CSV, áreas automáticas, mapeo estados/fechas, permisos

Ejecutar tests

php artisan test
php vendor/bin/phpunit --testdox
S!NTyC API v1.2 · Laravel 12.56.0 · PHP 8.4.4