Traducción. Autoritativo: fs-crm-0002-activities.md.
Contexto
Una actividad es la unidad más pequeña útil de seguimiento: algo que hacer, sobre un cliente, para una fecha, por alguien.crm.activity_types es uno de solo dos catálogos extensibles por tenant en la plataforma (DEC-B4),
y la razón es exactamente la regla del estándar de datos: los valores son el vocabulario de negocio del
tenant. Un gimnasio registra “inasistencia a clase”, una clínica “recordatorio de hora”, un distribuidor
“visita trimestral”. Eso no nos toca enumerarlo. Lo que sigue siendo nuestro es la máquina de estados —
una actividad está pendiente, completada o cancelada, y un tenant no puede agregar un cuarto estado,
porque el estado gobierna lógica.
Alcance (normativo)
crm.activitiessobre un contacto: tipo, descripción, vencimiento, asignado, estado.crm.activity_types, paramétrico y extensible por tenant, con semillasis_system.- Asignación a un usuario de la misma organización.
- Completado con una nota de resultado.
- Detección y listado de vencidas.
Fuera de alcance (normativo)
- Recordatorios y notificaciones — F1b, por
messagingy el eventoactivity.created. - Actividades recurrentes. Un motor de recurrencia es un scheduler, y reusar el de campañas necesita su propio diseño.
- SLAs, colas y escalamiento. Eso es ticketing, y es un no-objetivo del módulo.
- Sincronización con calendarios — no planificado.
Comportamiento (normativo)
- Una actividad pertenece a un contacto, tiene un tipo, y está
pending,completedocancelled. El conjunto de estados no es extensible por tenant: gobierna la lógica de vencidos y la reportería. activity_typessí es extensible por tenant. Las filas del tenant sonis_system = false, acotadas a él, y un tenant nunca puede modificar ni desactivar una fila de sistema.- El asignado debe ser un miembro activo de la misma organización. Asignar a alguien que se fue se rechaza, lo que además empuja a mantener las membresías al día.
- La fecha de vencimiento es opcional. Una actividad sin ella es un recordatorio sin urgencia, que es algo que la gente efectivamente anota.
- El completado registra quién y cuándo, más un resultado opcional. Reabrir una actividad completada no se permite — lo correcto es una nueva, para que la historia siga siendo honesta.
- “Vencida” se deriva, nunca se guarda. Un flag guardado necesita un job que lo mantenga y estará equivocado entre corridas.
- Desactivar una membresía deja las actividades asignadas a esa persona y las expone para reasignación, en vez de reasignarlas en silencio o dejarlas huérfanas.
- Toda mutación escribe en
core.audit_log.
Datos (normativo)
API (normativo)
Eventos (normativo)
crm.activity.created y crm.activity.completed. El primero es lo que consumirá la feature de
recordatorios de F1b — el evento existe ahora para que agregarla no requiera cambios acá.
Criterios de aceptación (normativo)
- Un tipo de actividad creado por un tenant es visible solo para ese tenant.
- Un tenant no puede modificar ni desactivar un tipo
is_system. - Asignar a un usuario fuera de la organización, o a una membresía desactivada, se rechaza.
- “Vencida” se deriva en lectura y es correcta entre zonas horarias.
- Una actividad completada no se puede reabrir; la API lo dice con error tipado.
- Desactivar una membresía expone sus actividades abiertas para reasignación.
- El completado registra quién, cuándo y el resultado.
- Negativo: ningún endpoint agrega un cuarto estado de actividad.