--- 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