| id |
title |
type |
epic |
status |
project |
version |
created_date |
updated_date |
| PMC-002-CRM |
PMC-002: Módulo CRM |
Module Definition |
PMC-002 |
Draft |
platform_marketing_content |
1.0.0 |
2026-01-04 |
2026-01-04 |
PMC-002: Módulo CRM
Versión: 1.0.0
Fecha: 2025-12-08
Estado: Definición
Prioridad: Alta
Descripción General
El módulo CRM (Customer Relationship Management) gestiona clientes, marcas, productos y la relación entre estos elementos. Está diseñado para integrarse directamente con el motor de generación de contenido IA.
Objetivos
- Gestionar clientes y contactos de la agencia
- Organizar marcas y productos por cliente
- Almacenar identidad visual y lineamientos de marca
- Registrar oportunidades comerciales
- Conectar datos de CRM con generación de contenido
Entidades del Dominio
Client
Entidad: Client
Descripción: Empresa/organización cliente de la agencia
Atributos:
- id: UUID (PK)
- tenant_id: UUID (FK)
- name: string
- legal_name: string
- tax_id: string (RFC/NIF)
- industry: string
- size: enum [micro, small, medium, large, enterprise]
- website: string
- status: enum [prospect, active, inactive, churned]
- notes: text
- metadata: JSONB
- created_at: timestamp
- updated_at: timestamp
Relaciones:
- N:1 con Tenant
- 1:N con Contact
- 1:N con Brand
- 1:N con Opportunity
- 1:N con Project
Contact
Entidad: Contact
Descripción: Persona de contacto en un cliente
Atributos:
- id: UUID (PK)
- tenant_id: UUID (FK)
- client_id: UUID (FK)
- first_name: string
- last_name: string
- email: string
- phone: string
- position: string
- department: string
- is_primary: boolean
- status: enum [active, inactive]
- metadata: JSONB
- created_at: timestamp
- updated_at: timestamp
Relaciones:
- N:1 con Client
- N:1 con Tenant
Brand
Entidad: Brand
Descripción: Marca de un cliente con su identidad visual
Atributos:
- id: UUID (PK)
- tenant_id: UUID (FK)
- client_id: UUID (FK)
- name: string
- description: text
- status: enum [active, inactive]
- identity: JSONB
- logo_url: string
- logo_variations: array
- primary_color: string
- secondary_colors: array
- typography: object
- tone_of_voice: string (formal, casual, playful, etc.)
- keywords: array
- forbidden_words: array
- visual_style: string
- lora_models: array[UUID] (referencias a modelos entrenados)
- created_at: timestamp
- updated_at: timestamp
Relaciones:
- N:1 con Client
- N:1 con Tenant
- 1:N con Product
- 1:N con Campaign
- N:N con CustomModel (LoRAs)
Product
Entidad: Product
Descripción: Producto o servicio de una marca
Atributos:
- id: UUID (PK)
- tenant_id: UUID (FK)
- brand_id: UUID (FK)
- name: string
- sku: string
- description: text
- category: string
- status: enum [active, discontinued, coming_soon]
- attributes: JSONB
- price: decimal
- features: array
- target_audience: string
- use_cases: array
- reference_images: array[string] (URLs)
- lora_model_id: UUID (modelo específico del producto)
- created_at: timestamp
- updated_at: timestamp
Relaciones:
- N:1 con Brand
- N:1 con Tenant
- 1:N con Asset (imágenes generadas)
Opportunity
Entidad: Opportunity
Descripción: Oportunidad de negocio/deal
Atributos:
- id: UUID (PK)
- tenant_id: UUID (FK)
- client_id: UUID (FK)
- contact_id: UUID (FK, opcional)
- name: string
- description: text
- value: decimal
- currency: string
- stage: enum [lead, qualified, proposal, negotiation, won, lost]
- probability: integer (0-100)
- expected_close_date: date
- actual_close_date: date
- lost_reason: string
- notes: text
- created_at: timestamp
- updated_at: timestamp
Relaciones:
- N:1 con Client
- N:1 con Contact
- N:1 con Tenant
- 1:N con Project (al convertirse)
Funcionalidades
F-002.1: Gestión de Clientes
| ID |
Funcionalidad |
Descripción |
Prioridad |
| F-002.1.1 |
CRUD Clientes |
Alta, edición, listado, eliminación |
Alta |
| F-002.1.2 |
Búsqueda y filtros |
Por nombre, industria, estado |
Alta |
| F-002.1.3 |
Vista de cliente |
Dashboard con marcas, contactos, proyectos |
Alta |
| F-002.1.4 |
Historial |
Timeline de actividades y cambios |
Media |
F-002.2: Gestión de Contactos
| ID |
Funcionalidad |
Descripción |
Prioridad |
| F-002.2.1 |
CRUD Contactos |
Gestión de personas de contacto |
Alta |
| F-002.2.2 |
Contacto primario |
Marcar contacto principal por cliente |
Media |
| F-002.2.3 |
Directorio |
Vista consolidada de todos los contactos |
Media |
F-002.3: Gestión de Marcas
| ID |
Funcionalidad |
Descripción |
Prioridad |
| F-002.3.1 |
CRUD Marcas |
Alta y gestión de marcas |
Alta |
| F-002.3.2 |
Identidad visual |
Definir colores, tipografía, tono |
Alta |
| F-002.3.3 |
Brand guidelines |
Subir y almacenar guías de marca |
Media |
| F-002.3.4 |
Asociar LoRAs |
Vincular modelos entrenados a marca |
Alta |
F-002.4: Gestión de Productos
| ID |
Funcionalidad |
Descripción |
Prioridad |
| F-002.4.1 |
CRUD Productos |
Alta y gestión de productos |
Alta |
| F-002.4.2 |
Imágenes referencia |
Subir fotos del producto real |
Alta |
| F-002.4.3 |
Catálogo |
Vista de productos por marca |
Media |
| F-002.4.4 |
Trigger generación |
Botón "Generar pack de imágenes" |
Alta |
F-002.5: Pipeline de Ventas
| ID |
Funcionalidad |
Descripción |
Prioridad |
| F-002.5.1 |
CRUD Oportunidades |
Gestión de deals |
Media |
| F-002.5.2 |
Kanban pipeline |
Vista drag & drop por etapas |
Media |
| F-002.5.3 |
Convertir a proyecto |
Crear proyecto desde oportunidad ganada |
Media |
Reglas de Negocio
RN-002.1:
Descripción: Cliente debe tener al menos un contacto
Validación: Warning si no hay contactos, no bloquea
RN-002.2:
Descripción: Marca requiere identidad visual mínima
Validación: Al menos logo_url o primary_color definido
RN-002.3:
Descripción: Producto hereda identidad de su marca
Comportamiento: Si no tiene LoRA propio, usa el de la marca
RN-002.4:
Descripción: Oportunidad ganada puede generar proyecto
Acción: Botón "Crear proyecto" disponible en stage=won
RN-002.5:
Descripción: Datos de marca se inyectan en generación
Comportamiento: Al generar contenido, se cargan automáticamente colores, tono, keywords
API Endpoints
Base: /api/v1/crm
# Clients
POST /clients
GET /clients
GET /clients/:id
PUT /clients/:id
DELETE /clients/:id
GET /clients/:id/brands
GET /clients/:id/contacts
GET /clients/:id/projects
# Contacts
POST /contacts
GET /contacts
GET /contacts/:id
PUT /contacts/:id
DELETE /contacts/:id
# Brands
POST /brands
GET /brands
GET /brands/:id
PUT /brands/:id
DELETE /brands/:id
GET /brands/:id/products
POST /brands/:id/loras # Asociar LoRA
DELETE /brands/:id/loras/:loraId # Desasociar LoRA
# Products
POST /products
GET /products
GET /products/:id
PUT /products/:id
DELETE /products/:id
POST /products/:id/generate # Trigger generación
# Opportunities
POST /opportunities
GET /opportunities
GET /opportunities/:id
PUT /opportunities/:id
DELETE /opportunities/:id
POST /opportunities/:id/convert # Convertir a proyecto
Integraciones
Con Motor de Generación (PMC-004)
Trigger: POST /products/:id/generate
Payload:
product_id: UUID
brand_id: UUID
workflow_template: string
options:
quantity: number
formats: array
Comportamiento:
1. Cargar datos de producto (nombre, descripción, referencias)
2. Cargar identidad de marca (colores, tono, LoRAs)
3. Encolar job de generación con parámetros combinados
Con Proyectos (PMC-003)
Trigger: POST /opportunities/:id/convert
Crea:
- Proyecto vinculado al cliente
- Campaña inicial (opcional)
- Copia brief de la oportunidad
Dependencias
Dependencias de Módulos:
- PMC-001 Tenants: Aislamiento de datos
- PMC-003 Projects: Conversión de oportunidades
- PMC-004 Generation: Trigger de generación
- PMC-006 Assets: Almacenamiento de logos y referencias
Servicios Externos:
- Storage (S3/MinIO): Logos, imágenes de referencia
UI/UX Consideraciones
Vistas principales:
- Lista de clientes con filtros y búsqueda
- Ficha de cliente con tabs (info, contactos, marcas, proyectos)
- Lista de marcas con preview de identidad
- Ficha de producto con galería de referencias
- Pipeline kanban de oportunidades
Acciones rápidas:
- Desde producto: "Generar contenido"
- Desde cliente: "Nueva marca", "Nuevo proyecto"
- Desde oportunidad: "Convertir a proyecto"
Criterios de Aceptación
Referencias
Documento generado por: Requirements-Analyst
Fecha: 2025-12-08