Files
project.linkedcorp.net/backend/database/migrations/010_recurring_tasks.sql
T
Milton Gonzalez 72b616bd02 feat: Tareas recurrentes con recordatorio por correo
Menu propio en la barra lateral, independiente de Proyectos:
- Periodicidad configurable (cada N dias/meses/años), proximo
  vencimiento, responsable, proyecto de origen opcional.
- "Completar ciclo" avanza el proximo vencimiento sumando la
  periodicidad y limpia el recordatorio ya enviado.
- Recordatorio por correo automatico N dias antes del vencimiento
  (default 7), a una hora del dia configurable. Un job en el propio
  proceso del backend (setInterval cada 15 min) revisa y envia, sin
  infraestructura nueva (cron del SO, cola, etc).
- Desde la pestaña Tareas de una actividad, cada tarea tiene un boton
  "Convertir en recurrente" que la promueve (la tarea original no se
  borra).

Probado en dev con curl (crear, completar ciclo avanza next_due_date,
promover desde una tarea real, disparo real del job de recordatorios
verificado forzando fecha/hora, segunda corrida no reenvia) y Playwright
(listado, popup de creacion, popup de promocion anidado sobre el detalle
de actividad) sin errores de consola.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 10:17:02 -05:00

25 lines
1.4 KiB
SQL

-- Tareas recurrentes: recordatorios periodicos (ej. renovacion de licencias) con recordatorio
-- por correo N dias antes, a una hora configurable. Menu propio, independiente de Proyectos, pero
-- puede originarse promoviendo una tarea existente de un proyecto (project_id queda como
-- referencia/contexto, nunca obligatorio).
CREATE TABLE IF NOT EXISTS recurring_tasks (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(160) NOT NULL,
description TEXT NULL,
project_id INT NULL,
responsible_user_id INT NULL,
interval_unit ENUM('days','months','years') NOT NULL DEFAULT 'months',
interval_value INT NOT NULL DEFAULT 1,
next_due_date DATE NOT NULL,
reminder_days_before INT NOT NULL DEFAULT 7,
reminder_hour TINYINT NOT NULL DEFAULT 9,
is_active TINYINT(1) NOT NULL DEFAULT 1,
last_reminder_sent_at DATETIME NULL,
created_by INT NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
CONSTRAINT fk_recurring_tasks_project FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE SET NULL,
CONSTRAINT fk_recurring_tasks_responsible FOREIGN KEY (responsible_user_id) REFERENCES users(id) ON DELETE SET NULL,
CONSTRAINT fk_recurring_tasks_created_by FOREIGN KEY (created_by) REFERENCES users(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;