- Update vision, architecture and technical documentation - Update module definitions (PMC-001 to PMC-008) - Update requirements documentation - Add CONTEXT-MAP.yml and ENVIRONMENT-INVENTORY.yml - Add orchestration guidelines and references 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
393 lines
10 KiB
Markdown
393 lines
10 KiB
Markdown
---
|
|
id: "PMC-003-PROJECTS"
|
|
title: "PMC-003: Módulo de Projects"
|
|
type: "Module Definition"
|
|
epic: "PMC-003"
|
|
status: "Draft"
|
|
project: "platform_marketing_content"
|
|
version: "1.0.0"
|
|
created_date: "2026-01-04"
|
|
updated_date: "2026-01-04"
|
|
---
|
|
# PMC-003: Módulo de Projects
|
|
|
|
**Versión:** 1.0.0
|
|
**Fecha:** 2025-12-08
|
|
**Estado:** Definición
|
|
**Prioridad:** Alta
|
|
|
|
---
|
|
|
|
## Descripción General
|
|
|
|
El módulo de Projects gestiona proyectos y campañas de marketing. Cada proyecto agrupa múltiples campañas, y cada campaña contiene un brief estructurado que guía la generación de contenido.
|
|
|
|
---
|
|
|
|
## Objetivos
|
|
|
|
1. Organizar el trabajo por proyectos y campañas
|
|
2. Estructurar briefs creativos para generación de contenido
|
|
3. Gestionar estados y flujos de aprobación
|
|
4. Vincular proyectos con clientes y marcas del CRM
|
|
5. Coordinar entregas de assets generados
|
|
|
|
---
|
|
|
|
## Entidades del Dominio
|
|
|
|
### Project
|
|
|
|
```yaml
|
|
Entidad: Project
|
|
Descripción: Contenedor de campañas para un cliente/iniciativa
|
|
Atributos:
|
|
- id: UUID (PK)
|
|
- tenant_id: UUID (FK)
|
|
- client_id: UUID (FK)
|
|
- name: string
|
|
- description: text
|
|
- code: string (identificador corto, ej: "PRJ-2025-001")
|
|
- status: enum [draft, active, on_hold, completed, cancelled]
|
|
- start_date: date
|
|
- end_date: date
|
|
- budget: decimal
|
|
- currency: string
|
|
- owner_id: UUID (FK a User, responsable)
|
|
- team_members: array[UUID] (usuarios asignados)
|
|
- settings: JSONB
|
|
- created_at: timestamp
|
|
- updated_at: timestamp
|
|
|
|
Relaciones:
|
|
- N:1 con Tenant
|
|
- N:1 con Client
|
|
- N:1 con User (owner)
|
|
- 1:N con Campaign
|
|
- 1:N con Asset (assets del proyecto)
|
|
```
|
|
|
|
### Campaign
|
|
|
|
```yaml
|
|
Entidad: Campaign
|
|
Descripción: Campaña de marketing con brief y assets
|
|
Atributos:
|
|
- id: UUID (PK)
|
|
- tenant_id: UUID (FK)
|
|
- project_id: UUID (FK)
|
|
- brand_id: UUID (FK)
|
|
- name: string
|
|
- description: text
|
|
- type: enum [social_media, performance_ads, catalog, landing, email, other]
|
|
- status: enum [draft, briefing, in_production, review, approved, published, archived]
|
|
- brief: JSONB (ver estructura abajo)
|
|
- channels: array[string] (instagram, facebook, tiktok, google_ads, etc.)
|
|
- start_date: date
|
|
- end_date: date
|
|
- created_at: timestamp
|
|
- updated_at: timestamp
|
|
|
|
Relaciones:
|
|
- N:1 con Project
|
|
- N:1 con Brand
|
|
- N:1 con Tenant
|
|
- 1:N con GenerationJob
|
|
- 1:N con Asset
|
|
```
|
|
|
|
### Brief (JSONB Structure)
|
|
|
|
```yaml
|
|
Estructura: Campaign.brief
|
|
Campos:
|
|
objective:
|
|
description: string (objetivo de la campaña)
|
|
kpis: array[string] (métricas de éxito)
|
|
|
|
audience:
|
|
demographics: string
|
|
psychographics: string
|
|
pain_points: array[string]
|
|
desires: array[string]
|
|
|
|
messaging:
|
|
main_message: string
|
|
tone_of_voice: string (override del brand)
|
|
call_to_action: string
|
|
hashtags: array[string]
|
|
|
|
visual:
|
|
style: string (fotográfico, ilustrado, minimalista, etc.)
|
|
mood: string (energético, sereno, profesional, etc.)
|
|
color_palette: array[string] (override o adicionales)
|
|
references: array[string] (URLs de referencias visuales)
|
|
|
|
constraints:
|
|
forbidden_words: array[string]
|
|
forbidden_elements: array[string]
|
|
legal_disclaimers: array[string]
|
|
brand_guidelines_url: string
|
|
|
|
deliverables:
|
|
formats: array[object]
|
|
- type: string (post, story, banner, etc.)
|
|
dimensions: string (1080x1080, 1080x1920, etc.)
|
|
quantity: number
|
|
total_images: number
|
|
total_copies: number
|
|
variations_per_piece: number
|
|
```
|
|
|
|
### CampaignAsset
|
|
|
|
```yaml
|
|
Entidad: CampaignAsset (tabla pivote)
|
|
Descripción: Relación entre campaña y assets generados
|
|
Atributos:
|
|
- id: UUID (PK)
|
|
- campaign_id: UUID (FK)
|
|
- asset_id: UUID (FK)
|
|
- status: enum [pending, approved, rejected, revision_requested]
|
|
- feedback: text
|
|
- approved_by: UUID (FK a User)
|
|
- approved_at: timestamp
|
|
- created_at: timestamp
|
|
```
|
|
|
|
---
|
|
|
|
## Funcionalidades
|
|
|
|
### F-003.1: Gestión de Proyectos
|
|
|
|
| ID | Funcionalidad | Descripción | Prioridad |
|
|
|----|---------------|-------------|-----------|
|
|
| F-003.1.1 | CRUD Proyectos | Alta, edición, listado, archivado | Alta |
|
|
| F-003.1.2 | Dashboard proyecto | Vista general con campañas y progreso | Alta |
|
|
| F-003.1.3 | Asignar equipo | Agregar/quitar miembros al proyecto | Media |
|
|
| F-003.1.4 | Timeline | Visualización de fechas y milestones | Media |
|
|
|
|
### F-003.2: Gestión de Campañas
|
|
|
|
| ID | Funcionalidad | Descripción | Prioridad |
|
|
|----|---------------|-------------|-----------|
|
|
| F-003.2.1 | CRUD Campañas | Alta, edición, listado | Alta |
|
|
| F-003.2.2 | Editor de brief | Formulario estructurado | Alta |
|
|
| F-003.2.3 | Plantillas de brief | Briefs predefinidos por tipo | Media |
|
|
| F-003.2.4 | Duplicar campaña | Clonar con modificaciones | Media |
|
|
|
|
### F-003.3: Flujo de Trabajo
|
|
|
|
| ID | Funcionalidad | Descripción | Prioridad |
|
|
|----|---------------|-------------|-----------|
|
|
| F-003.3.1 | Cambio de estado | Transiciones controladas | Alta |
|
|
| F-003.3.2 | Notificaciones | Alertar cambios de estado | Media |
|
|
| F-003.3.3 | Aprobación de assets | Aprobar/rechazar contenido | Alta |
|
|
| F-003.3.4 | Solicitar revisión | Pedir cambios con feedback | Alta |
|
|
|
|
### F-003.4: Generación de Contenido
|
|
|
|
| ID | Funcionalidad | Descripción | Prioridad |
|
|
|----|---------------|-------------|-----------|
|
|
| F-003.4.1 | Lanzar generación | Desde brief, iniciar jobs | Alta |
|
|
| F-003.4.2 | Seleccionar plantillas | Elegir workflows de generación | Alta |
|
|
| F-003.4.3 | Monitor de progreso | Ver estado de generaciones | Alta |
|
|
| F-003.4.4 | Regenerar | Volver a generar con ajustes | Media |
|
|
|
|
---
|
|
|
|
## Máquina de Estados
|
|
|
|
### Project Status
|
|
|
|
```
|
|
draft ─────────────────────► active
|
|
│ │
|
|
│ ├───► on_hold ───► active
|
|
│ │
|
|
│ └───► completed
|
|
│
|
|
└────────────────────────────────► cancelled
|
|
```
|
|
|
|
### Campaign Status
|
|
|
|
```
|
|
draft ───► briefing ───► in_production ───► review ───► approved ───► published
|
|
│ │ │ │ │
|
|
│ │ └────────────────┘ │
|
|
│ │ (revision_requested) │
|
|
│ │ │
|
|
└───────────┴────────────────────────────────────────────┴───► archived
|
|
```
|
|
|
|
---
|
|
|
|
## Reglas de Negocio
|
|
|
|
```yaml
|
|
RN-003.1:
|
|
Descripción: Proyecto requiere cliente asignado
|
|
Validación: client_id NOT NULL
|
|
|
|
RN-003.2:
|
|
Descripción: Campaña requiere brief mínimo para pasar a producción
|
|
Validación: brief.objective y brief.deliverables definidos
|
|
|
|
RN-003.3:
|
|
Descripción: Solo owner o admin puede cambiar estado del proyecto
|
|
Autorización: Verificar rol del usuario
|
|
|
|
RN-003.4:
|
|
Descripción: Assets aprobados no pueden eliminarse
|
|
Validación: Bloquear DELETE si status=approved
|
|
|
|
RN-003.5:
|
|
Descripción: Brief hereda identidad de la marca
|
|
Comportamiento: Cargar colores, tono, etc. de Brand al crear campaña
|
|
|
|
RN-003.6:
|
|
Descripción: Campaña solo puede publicarse si tiene assets aprobados
|
|
Validación: Al menos 1 asset con status=approved
|
|
```
|
|
|
|
---
|
|
|
|
## API Endpoints
|
|
|
|
```yaml
|
|
Base: /api/v1/projects
|
|
|
|
# Projects
|
|
POST /projects
|
|
GET /projects
|
|
GET /projects/:id
|
|
PUT /projects/:id
|
|
DELETE /projects/:id
|
|
PATCH /projects/:id/status
|
|
GET /projects/:id/campaigns
|
|
GET /projects/:id/assets
|
|
POST /projects/:id/team # Agregar miembro
|
|
DELETE /projects/:id/team/:userId
|
|
|
|
# Campaigns
|
|
POST /campaigns
|
|
GET /campaigns
|
|
GET /campaigns/:id
|
|
PUT /campaigns/:id
|
|
DELETE /campaigns/:id
|
|
PATCH /campaigns/:id/status
|
|
PUT /campaigns/:id/brief
|
|
GET /campaigns/:id/assets
|
|
POST /campaigns/:id/generate # Lanzar generación
|
|
|
|
# Campaign Assets
|
|
POST /campaigns/:id/assets/:assetId/approve
|
|
POST /campaigns/:id/assets/:assetId/reject
|
|
POST /campaigns/:id/assets/:assetId/request-revision
|
|
|
|
# Brief Templates
|
|
GET /brief-templates
|
|
GET /brief-templates/:id
|
|
POST /brief-templates # Admin only
|
|
PUT /brief-templates/:id
|
|
DELETE /brief-templates/:id
|
|
```
|
|
|
|
---
|
|
|
|
## Integraciones
|
|
|
|
### Con CRM (PMC-002)
|
|
|
|
```yaml
|
|
Relación: Proyecto vinculado a Cliente y Marca
|
|
Datos heredados:
|
|
- Identidad visual de Brand
|
|
- Información de productos
|
|
- Contactos para notificaciones
|
|
```
|
|
|
|
### Con Motor de Generación (PMC-004)
|
|
|
|
```yaml
|
|
Trigger: POST /campaigns/:id/generate
|
|
Payload:
|
|
campaign_id: UUID
|
|
workflow_templates: array[string]
|
|
options:
|
|
use_brand_lora: boolean
|
|
quality: string
|
|
|
|
Respuesta:
|
|
job_ids: array[UUID]
|
|
estimated_time: number
|
|
```
|
|
|
|
### Con DAM (PMC-006)
|
|
|
|
```yaml
|
|
Assets generados se almacenan en DAM
|
|
Vinculación automática campaign_id → asset
|
|
Metadatos del brief copiados al asset
|
|
```
|
|
|
|
### Con Automatización (PMC-005)
|
|
|
|
```yaml
|
|
Eventos disparados:
|
|
- campaign.status_changed → Notificaciones
|
|
- campaign.approved → Preparar entrega
|
|
- assets.all_approved → Trigger siguiente paso
|
|
```
|
|
|
|
---
|
|
|
|
## UI/UX Consideraciones
|
|
|
|
```yaml
|
|
Vistas principales:
|
|
- Lista de proyectos con filtros (cliente, estado, fecha)
|
|
- Board kanban de campañas por estado
|
|
- Editor de brief con preview
|
|
- Galería de assets de campaña con acciones
|
|
|
|
Acciones rápidas:
|
|
- "Nueva campaña" desde proyecto
|
|
- "Generar contenido" desde campaña
|
|
- "Aprobar todo" en vista de revisión
|
|
- "Descargar pack" de assets aprobados
|
|
|
|
Componentes:
|
|
- BriefEditor: Formulario estructurado con secciones colapsables
|
|
- AssetReviewer: Galería con zoom, comparación, acciones
|
|
- ProgressTracker: Timeline visual de estado de campaña
|
|
```
|
|
|
|
---
|
|
|
|
## Criterios de Aceptación
|
|
|
|
- [ ] CRUD completo para Projects y Campaigns
|
|
- [ ] Editor de brief funcional con todas las secciones
|
|
- [ ] Transiciones de estado respetan reglas
|
|
- [ ] Generación se lanza correctamente desde campaña
|
|
- [ ] Flujo de aprobación de assets funciona
|
|
- [ ] Assets rechazados permiten regeneración
|
|
- [ ] Notificaciones se disparan en cambios de estado
|
|
- [ ] Plantillas de brief funcionan correctamente
|
|
|
|
---
|
|
|
|
## Referencias
|
|
|
|
- [VISION-GENERAL.md](../00-vision-general/VISION-GENERAL.md)
|
|
- [PMC-002-CRM.md](./PMC-002-CRM.md)
|
|
- [PMC-004-GENERATION.md](./PMC-004-GENERATION.md)
|
|
|
|
---
|
|
|
|
**Documento generado por:** Requirements-Analyst
|
|
**Fecha:** 2025-12-08
|