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>
This commit is contained in:
@@ -33,6 +33,7 @@
|
||||
| `activities` | actividades de un proyecto |
|
||||
| `activity_dependencies` | dependencias simples entre actividades ("depende de") |
|
||||
| `tasks` | checklist liviano dentro de una actividad ("Tareas" en la UI; renombrada desde `subtasks` en v1.8.0) |
|
||||
| `recurring_tasks` | recordatorios periódicos (ej. renovación de licencias), menú propio "Tareas recurrentes" |
|
||||
| `comments` | comentarios sobre proyecto o actividad (`entity_type` + `entity_id`) |
|
||||
| `attachments` | archivos adjuntos a proyecto o actividad |
|
||||
| `notifications` | notificaciones in-app por usuario |
|
||||
@@ -70,6 +71,13 @@
|
||||
`pending_approval`** — a diferencia del autorregistro público, aquí quien lo invitó ya lo vetó al
|
||||
agregarlo a su proyecto. La fila de `project_members` se crea en el momento de invitar, no al
|
||||
aceptar, así que en cuanto acepta ya aparece como miembro sin pasos adicionales.
|
||||
- `recurring_tasks`: `project_id`/`responsible_user_id` son **opcionales** (NULL) — se puede crear
|
||||
directo desde "Tareas recurrentes" o promoviendo una tarea puntual de una actividad
|
||||
(`project_id` queda como referencia del proyecto de origen, la tarea puntual original NO se
|
||||
borra). `last_reminder_sent_at` se limpia a NULL cada vez que se completa un ciclo
|
||||
(`POST /:id/complete`, que suma `interval_value`/`interval_unit` a `next_due_date`) — es lo que
|
||||
evita reenviar el correo dos veces en el mismo ciclo. El envío real lo hace un job en el propio
|
||||
proceso del backend (`setInterval` cada 15 min, sin cron del SO ni cola nueva).
|
||||
- `system_settings.value` para `smtp_pass_enc` va **cifrado** (AES-256-GCM, `ENCRYPTION_KEY` del
|
||||
`.env`) — nunca en texto plano, nunca se devuelve por la API (solo `configured: true/false`).
|
||||
- Borrado lógico donde aplique (`users.is_active`); nunca DELETE físico de usuarios **activos** con
|
||||
|
||||
Reference in New Issue
Block a user