# TRACEABILITY.yml - MAE-014: CRM Clientes
# Matriz completa de trazabilidad: Requerimientos → Especificaciones → Historias → Implementación

epic_code: MAE-014
epic_name: CRM Clientes
phase: 2
phase_name: Comercialización y Ventas
budget_mxn: 85000
story_points: 120
status: planned
sprint: 8-11
period: "Semanas 8-11"
reused_from_gamilit: 40%

# ============================================================================
# DOCUMENTACIÓN
# ============================================================================

documentation:
  requirements:
    - id: RF-CRM-001
      file: requerimientos/RF-CRM-001-gestion-prospectos.md
      title: Gestión de Prospectos
      status: planned
      reused_from: null
      adaptations:
        - "Sistema de captura y calificación de leads"
        - "Scoring de prospectos según criterios de construcción"
        - "Pipeline de ventas específico para proyectos inmobiliarios"
        - "Seguimiento de fuentes de captación"

    - id: RF-CRM-002
      file: requerimientos/RF-CRM-002-seguimiento-comercial.md
      title: Seguimiento Comercial
      status: planned
      reused_from: null
      adaptations:
        - "Agenda de visitas a desarrollos"
        - "Registro de interacciones con prospectos"
        - "Embudo de conversión por proyecto"
        - "Asignación de vendedores por desarrollo"
        - "KPIs comerciales por vendedor y proyecto"

    - id: RF-CRM-003
      file: requerimientos/RF-CRM-003-cotizaciones.md
      title: Sistema de Cotizaciones
      status: planned
      reused_from: null
      adaptations:
        - "Cotizaciones de viviendas con configuraciones personalizadas"
        - "Cálculo de financiamiento y esquemas de pago"
        - "Integración con catálogo de prototipos y acabados"
        - "Generación de propuestas económicas en PDF"
        - "Historial de versiones de cotización"

    - id: RF-CRM-004
      file: requerimientos/RF-CRM-004-portal-cliente.md
      title: Portal del Cliente
      status: planned
      reused_from: null
      adaptations:
        - "Acceso web para compradores"
        - "Visualización de avance de obra de su vivienda"
        - "Consulta de estados de cuenta y pagos"
        - "Solicitud de servicios post-venta"
        - "Integración con MOB-005 (Derechohabiente)"
        - "Notificaciones de hitos de construcción"

  specifications:
    - id: ET-CRM-001
      file: especificaciones/ET-CRM-001-gestion-prospectos.md
      rf: RF-CRM-001
      title: Implementación de Gestión de Prospectos
      status: planned
      reused_from: null
      adaptations:
        - "Schema crm.prospectos con campos específicos"
        - "Sistema de scoring automático"
        - "Estados del lead: nuevo, contactado, calificado, hot, cold, perdido"
        - "Asignación automática según reglas de distribución"

    - id: ET-CRM-002
      file: especificaciones/ET-CRM-002-seguimiento-comercial.md
      rf: RF-CRM-002
      title: Implementación de Seguimiento Comercial
      status: planned
      reused_from: null
      adaptations:
        - "Schema crm.interacciones para registro de contactos"
        - "Calendario de actividades comerciales"
        - "Dashboard de pipeline y conversión"
        - "Reportes de actividad por vendedor"

    - id: ET-CRM-003
      file: especificaciones/ET-CRM-003-cotizaciones.md
      rf: RF-CRM-003
      title: Implementación de Sistema de Cotizaciones
      status: planned
      reused_from: null
      adaptations:
        - "Schema crm.cotizaciones con versionamiento"
        - "Motor de cálculo de financiamiento"
        - "Plantillas de cotización en PDF"
        - "Integración con catálogos de prototipos y acabados"

    - id: ET-CRM-004
      file: especificaciones/ET-CRM-004-portal-cliente.md
      rf: RF-CRM-004
      title: Implementación de Portal del Cliente
      status: planned
      reused_from: null
      adaptations:
        - "Frontend separado para clientes (portal-cliente app)"
        - "Schema crm.clientes_portal para configuración"
        - "Integración con MOB-005 para datos de derechohabiente"
        - "API pública para consulta de avance de obra"
        - "Sistema de notificaciones por email/SMS"

  user_stories:
    # RF-CRM-001: Gestión de Prospectos
    - id: US-CRM-001
      file: historias-usuario/US-CRM-001-captura-prospectos.md
      title: Captura de Prospectos
      rf: RF-CRM-001
      story_points: 8
      status: planned
      reused_from: null
      adaptations: ["Sistema de captura con origen y scoring inicial"]

    - id: US-CRM-002
      file: historias-usuario/US-CRM-002-calificacion-leads.md
      title: Calificación y Scoring de Leads
      rf: RF-CRM-001
      story_points: 8
      status: planned
      reused_from: null
      adaptations: ["Motor de scoring basado en criterios configurables"]

    - id: US-CRM-003
      file: historias-usuario/US-CRM-003-asignacion-prospectos.md
      title: Asignación de Prospectos a Vendedores
      rf: RF-CRM-001
      story_points: 5
      status: planned
      reused_from: null
      adaptations: ["Reglas de asignación por proyecto, zona, carga"]

    # RF-CRM-002: Seguimiento Comercial
    - id: US-CRM-004
      file: historias-usuario/US-CRM-004-agenda-visitas.md
      title: Agenda de Visitas y Seguimiento
      rf: RF-CRM-002
      story_points: 8
      status: planned
      reused_from: null
      adaptations: ["Calendario de citas en sala de ventas y obra"]

    - id: US-CRM-005
      file: historias-usuario/US-CRM-005-registro-interacciones.md
      title: Registro de Interacciones con Clientes
      rf: RF-CRM-002
      story_points: 5
      status: planned
      reused_from: null
      adaptations: ["Log de llamadas, emails, visitas, WhatsApp"]

    - id: US-CRM-006
      file: historias-usuario/US-CRM-006-pipeline-ventas.md
      title: Pipeline de Ventas y Embudo
      rf: RF-CRM-002
      story_points: 8
      status: planned
      reused_from: null
      adaptations: ["Dashboard de embudo por proyecto y vendedor"]

    - id: US-CRM-007
      file: historias-usuario/US-CRM-007-kpis-comerciales.md
      title: KPIs y Métricas Comerciales
      rf: RF-CRM-002
      story_points: 8
      status: planned
      reused_from: null
      adaptations: ["Dashboard de conversión, cierre, tiempo promedio"]

    # RF-CRM-003: Cotizaciones
    - id: US-CRM-008
      file: historias-usuario/US-CRM-008-crear-cotizacion.md
      title: Creación de Cotizaciones
      rf: RF-CRM-003
      story_points: 13
      status: planned
      reused_from: null
      adaptations: ["Wizard de cotización con selección de prototipo y extras"]

    - id: US-CRM-009
      file: historias-usuario/US-CRM-009-calculo-financiamiento.md
      title: Cálculo de Esquemas de Financiamiento
      rf: RF-CRM-003
      story_points: 13
      status: planned
      reused_from: null
      adaptations: ["Motor de cálculo: contado, crédito, mixto"]

    - id: US-CRM-010
      file: historias-usuario/US-CRM-010-generar-propuesta-pdf.md
      title: Generación de Propuesta Económica en PDF
      rf: RF-CRM-003
      story_points: 8
      status: planned
      reused_from: null
      adaptations: ["Template profesional con branding de constructora"]

    - id: US-CRM-011
      file: historias-usuario/US-CRM-011-versiones-cotizacion.md
      title: Versionamiento de Cotizaciones
      rf: RF-CRM-003
      story_points: 5
      status: planned
      reused_from: null
      adaptations: ["Historial de cambios y comparación de versiones"]

    # RF-CRM-004: Portal del Cliente
    - id: US-CRM-012
      file: historias-usuario/US-CRM-012-portal-autenticacion.md
      title: Autenticación en Portal del Cliente
      rf: RF-CRM-004
      story_points: 8
      status: planned
      reused_from: null
      adaptations: ["Login con email/teléfono, recuperación de contraseña"]

    - id: US-CRM-013
      file: historias-usuario/US-CRM-013-dashboard-cliente.md
      title: Dashboard del Cliente
      rf: RF-CRM-004
      story_points: 8
      status: planned
      reused_from: null
      adaptations: ["Vista general de su vivienda y estatus"]

    - id: US-CRM-014
      file: historias-usuario/US-CRM-014-avance-obra-cliente.md
      title: Visualización de Avance de Obra
      rf: RF-CRM-004
      story_points: 13
      status: planned
      reused_from: null
      adaptations: ["Integración con MOB-005, fotos, hitos, % avance"]

    - id: US-CRM-015
      file: historias-usuario/US-CRM-015-estados-cuenta-cliente.md
      title: Consulta de Estados de Cuenta
      rf: RF-CRM-004
      story_points: 8
      status: planned
      reused_from: null
      adaptations: ["Saldos, pagos realizados, próximos vencimientos"]

    - id: US-CRM-016
      file: historias-usuario/US-CRM-016-solicitudes-postventa.md
      title: Solicitudes de Servicio Post-Venta
      rf: RF-CRM-004
      story_points: 8
      status: planned
      reused_from: null
      adaptations: ["Formulario de garantías y mantenimiento"]

# ============================================================================
# IMPLEMENTACIÓN - BASE DE DATOS
# ============================================================================

implementation:
  database:
    schemas:
      - name: crm
        path: apps/database/ddl/schemas/crm/
        description: Schema de CRM (prospectos, clientes, cotizaciones)
        reused_from_gamilit: false
        note: "Nuevo schema específico de CRM para construcción"

      - name: crm_comercial
        path: apps/database/ddl/schemas/crm_comercial/
        description: Schema de seguimiento comercial (interacciones, pipeline)
        reused_from_gamilit: false
        note: "Nuevo schema para actividades comerciales"

      - name: crm_portal
        path: apps/database/ddl/schemas/crm_portal/
        description: Schema de portal del cliente
        reused_from_gamilit: false
        note: "Nuevo schema para portal de clientes"

    enums:
      - name: lead_status
        schema: crm
        file: apps/database/ddl/schemas/crm/00-enums.sql
        lines: "1-10"
        values: [nuevo, contactado, calificado, hot, cold, perdido, convertido]
        rf: RF-CRM-001
        reused_from: null
        note: "Estados del prospecto en el pipeline"

      - name: lead_source
        schema: crm
        file: apps/database/ddl/schemas/crm/00-enums.sql
        lines: "12-22"
        values: [web, facebook, instagram, referido, evento, stand, llamada, walk_in]
        rf: RF-CRM-001
        reused_from: null
        note: "Fuentes de captación de prospectos"

      - name: interaction_type
        schema: crm_comercial
        file: apps/database/ddl/schemas/crm_comercial/00-enums.sql
        lines: "1-10"
        values: [llamada, email, whatsapp, visita_sala, visita_obra, reunion, video_llamada]
        rf: RF-CRM-002
        reused_from: null
        note: "Tipos de interacción con clientes"

      - name: cotizacion_status
        schema: crm
        file: apps/database/ddl/schemas/crm/00-enums.sql
        lines: "24-32"
        values: [borrador, enviada, en_negociacion, aceptada, rechazada, vencida, facturada]
        rf: RF-CRM-003
        reused_from: null
        note: "Estados de la cotización"

      - name: financing_type
        schema: crm
        file: apps/database/ddl/schemas/crm/00-enums.sql
        lines: "34-42"
        values: [contado, credito_infonavit, credito_bancario, credito_cofinavit, credito_constructora, mixto]
        rf: RF-CRM-003
        reused_from: null
        note: "Tipos de financiamiento para cotizaciones"

      - name: portal_user_status
        schema: crm_portal
        file: apps/database/ddl/schemas/crm_portal/00-enums.sql
        lines: "1-8"
        values: [active, suspended, pending_activation, inactive]
        rf: RF-CRM-004
        reused_from: null
        note: "Estados de usuario del portal"

    tables:
      # RF-CRM-001: Gestión de Prospectos
      - name: prospectos
        schema: crm
        file: apps/database/ddl/schemas/crm/tables/01-prospectos.sql
        lines: 180
        description: Catálogo de prospectos (leads)
        rf: RF-CRM-001
        reused_from_gamilit: false
        note: "Tabla principal de leads con scoring"
        columns:
          - id (UUID, PK)
          - constructora_id (UUID, FK)
          - proyecto_id (UUID, FK, nullable)
          - nombre (TEXT)
          - apellidos (TEXT)
          - email (TEXT)
          - telefono (TEXT)
          - telefono_secundario (TEXT)
          - lead_source (lead_source ENUM)
          - lead_status (lead_status ENUM)
          - scoring (INTEGER, 0-100)
          - presupuesto_min (NUMERIC)
          - presupuesto_max (NUMERIC)
          - fecha_contacto_inicial (DATE)
          - fecha_conversion (DATE, nullable)
          - vendedor_asignado_id (UUID, FK, nullable)
          - notas (TEXT)
          - metadata (JSONB)
          - created_at (TIMESTAMPTZ)
          - updated_at (TIMESTAMPTZ)
        indexes:
          - idx_prospectos_constructora_status (constructora_id, lead_status)
          - idx_prospectos_vendedor (vendedor_asignado_id)
          - idx_prospectos_scoring (scoring DESC)

      - name: criterios_scoring
        schema: crm
        file: apps/database/ddl/schemas/crm/tables/02-criterios_scoring.sql
        lines: 90
        description: Configuración de criterios de scoring de prospectos
        rf: RF-CRM-001
        reused_from_gamilit: false
        note: "Criterios personalizables por constructora"
        columns:
          - id (UUID, PK)
          - constructora_id (UUID, FK)
          - criterio (TEXT)
          - peso (INTEGER, 0-100)
          - condiciones (JSONB)
          - active (BOOLEAN)
          - created_at (TIMESTAMPTZ)

      # RF-CRM-002: Seguimiento Comercial
      - name: interacciones
        schema: crm_comercial
        file: apps/database/ddl/schemas/crm_comercial/tables/01-interacciones.sql
        lines: 140
        description: Registro de interacciones con prospectos/clientes
        rf: RF-CRM-002
        reused_from_gamilit: false
        note: "Log de todas las comunicaciones"
        columns:
          - id (UUID, PK)
          - constructora_id (UUID, FK)
          - prospecto_id (UUID, FK, nullable)
          - cliente_id (UUID, FK, nullable)
          - tipo (interaction_type ENUM)
          - fecha (TIMESTAMPTZ)
          - duracion_minutos (INTEGER)
          - vendedor_id (UUID, FK)
          - asunto (TEXT)
          - notas (TEXT)
          - resultado (TEXT)
          - siguiente_accion (TEXT)
          - fecha_siguiente_accion (TIMESTAMPTZ, nullable)
          - archivos_adjuntos (JSONB)
          - created_at (TIMESTAMPTZ)
        indexes:
          - idx_interacciones_prospecto (prospecto_id, fecha DESC)
          - idx_interacciones_cliente (cliente_id, fecha DESC)
          - idx_interacciones_vendedor (vendedor_id, fecha DESC)

      - name: pipeline_configuracion
        schema: crm_comercial
        file: apps/database/ddl/schemas/crm_comercial/tables/02-pipeline_configuracion.sql
        lines: 100
        description: Configuración de etapas del pipeline de ventas
        rf: RF-CRM-002
        reused_from_gamilit: false
        note: "Etapas personalizables del embudo"
        columns:
          - id (UUID, PK)
          - constructora_id (UUID, FK)
          - etapa (TEXT)
          - orden (INTEGER)
          - probabilidad_cierre (INTEGER, 0-100)
          - color (TEXT)
          - active (BOOLEAN)

      - name: metas_comerciales
        schema: crm_comercial
        file: apps/database/ddl/schemas/crm_comercial/tables/03-metas_comerciales.sql
        lines: 110
        description: Metas de ventas por vendedor y período
        rf: RF-CRM-002
        reused_from_gamilit: false
        note: "KPIs y objetivos comerciales"
        columns:
          - id (UUID, PK)
          - constructora_id (UUID, FK)
          - vendedor_id (UUID, FK)
          - proyecto_id (UUID, FK, nullable)
          - periodo_inicio (DATE)
          - periodo_fin (DATE)
          - meta_prospectos (INTEGER)
          - meta_visitas (INTEGER)
          - meta_cotizaciones (INTEGER)
          - meta_cierres (INTEGER)
          - meta_monto (NUMERIC)
          - created_at (TIMESTAMPTZ)

      # RF-CRM-003: Cotizaciones
      - name: cotizaciones
        schema: crm
        file: apps/database/ddl/schemas/crm/tables/10-cotizaciones.sql
        lines: 220
        description: Cotizaciones de viviendas
        rf: RF-CRM-003
        reused_from_gamilit: false
        note: "Cotizaciones con versionamiento"
        columns:
          - id (UUID, PK)
          - constructora_id (UUID, FK)
          - numero_cotizacion (TEXT UNIQUE)
          - version (INTEGER)
          - prospecto_id (UUID, FK)
          - proyecto_id (UUID, FK)
          - prototipo_id (UUID, FK)
          - lote_id (UUID, FK, nullable)
          - vendedor_id (UUID, FK)
          - status (cotizacion_status ENUM)
          - fecha_emision (DATE)
          - fecha_vencimiento (DATE)
          - precio_base (NUMERIC)
          - extras (JSONB)
          - total_extras (NUMERIC)
          - descuentos (JSONB)
          - total_descuentos (NUMERIC)
          - precio_final (NUMERIC)
          - tipo_financiamiento (financing_type ENUM)
          - enganche_porcentaje (NUMERIC)
          - enganche_monto (NUMERIC)
          - financiado_monto (NUMERIC)
          - plazo_meses (INTEGER)
          - tasa_interes (NUMERIC)
          - mensualidad (NUMERIC)
          - esquema_pagos (JSONB)
          - condiciones (TEXT)
          - notas_internas (TEXT)
          - pdf_url (TEXT, nullable)
          - enviada_cliente (BOOLEAN)
          - fecha_envio (TIMESTAMPTZ, nullable)
          - aceptada_fecha (TIMESTAMPTZ, nullable)
          - rechazada_fecha (TIMESTAMPTZ, nullable)
          - razon_rechazo (TEXT, nullable)
          - created_at (TIMESTAMPTZ)
          - updated_at (TIMESTAMPTZ)
        indexes:
          - idx_cotizaciones_numero (numero_cotizacion)
          - idx_cotizaciones_prospecto (prospecto_id)
          - idx_cotizaciones_proyecto_status (proyecto_id, status)
          - idx_cotizaciones_vendedor (vendedor_id, fecha_emision DESC)

      - name: cotizacion_versiones
        schema: crm
        file: apps/database/ddl/schemas/crm/tables/11-cotizacion_versiones.sql
        lines: 90
        description: Historial de versiones de cotizaciones
        rf: RF-CRM-003
        reused_from_gamilit: false
        note: "Auditoría de cambios en cotizaciones"
        columns:
          - id (UUID, PK)
          - cotizacion_id (UUID, FK)
          - version (INTEGER)
          - cambios (JSONB)
          - user_id (UUID, FK)
          - motivo (TEXT)
          - snapshot (JSONB)
          - created_at (TIMESTAMPTZ)

      - name: plantillas_cotizacion
        schema: crm
        file: apps/database/ddl/schemas/crm/tables/12-plantillas_cotizacion.sql
        lines: 80
        description: Plantillas para generación de PDFs de cotización
        rf: RF-CRM-003
        reused_from_gamilit: false
        note: "Templates HTML/PDF personalizables"
        columns:
          - id (UUID, PK)
          - constructora_id (UUID, FK)
          - nombre (TEXT)
          - descripcion (TEXT)
          - template_html (TEXT)
          - estilos_css (TEXT)
          - active (BOOLEAN)
          - default (BOOLEAN)
          - created_at (TIMESTAMPTZ)
          - updated_at (TIMESTAMPTZ)

      # RF-CRM-004: Portal del Cliente
      - name: clientes_portal
        schema: crm_portal
        file: apps/database/ddl/schemas/crm_portal/tables/01-clientes_portal.sql
        lines: 150
        description: Usuarios del portal de clientes
        rf: RF-CRM-004
        reused_from_gamilit: false
        note: "Autenticación separada para clientes"
        columns:
          - id (UUID, PK)
          - constructora_id (UUID, FK)
          - cliente_id (UUID, FK)
          - derechohabiente_id (UUID, FK, nullable)
          - email (TEXT UNIQUE)
          - password_hash (TEXT)
          - telefono (TEXT)
          - status (portal_user_status ENUM)
          - activacion_token (TEXT, nullable)
          - activacion_fecha (TIMESTAMPTZ, nullable)
          - ultimo_acceso (TIMESTAMPTZ, nullable)
          - preferencias (JSONB)
          - created_at (TIMESTAMPTZ)
          - updated_at (TIMESTAMPTZ)
        indexes:
          - idx_portal_email (email)
          - idx_portal_cliente (cliente_id)
          - idx_portal_derechohabiente (derechohabiente_id)

      - name: portal_notificaciones
        schema: crm_portal
        file: apps/database/ddl/schemas/crm_portal/tables/02-portal_notificaciones.sql
        lines: 120
        description: Notificaciones enviadas a clientes del portal
        rf: RF-CRM-004
        reused_from_gamilit: false
        note: "Sistema de notificaciones por email/SMS"
        columns:
          - id (UUID, PK)
          - cliente_portal_id (UUID, FK)
          - tipo (TEXT)
          - titulo (TEXT)
          - mensaje (TEXT)
          - canal (TEXT[])
          - enviado (BOOLEAN)
          - fecha_envio (TIMESTAMPTZ, nullable)
          - leido (BOOLEAN)
          - fecha_lectura (TIMESTAMPTZ, nullable)
          - metadata (JSONB)
          - created_at (TIMESTAMPTZ)
        indexes:
          - idx_portal_notif_cliente (cliente_portal_id, created_at DESC)

      - name: portal_solicitudes_servicio
        schema: crm_portal
        file: apps/database/ddl/schemas/crm_portal/tables/03-portal_solicitudes_servicio.sql
        lines: 140
        description: Solicitudes de servicio post-venta desde el portal
        rf: RF-CRM-004
        reused_from_gamilit: false
        note: "Garantías y mantenimiento solicitados por cliente"
        columns:
          - id (UUID, PK)
          - cliente_portal_id (UUID, FK)
          - vivienda_id (UUID, FK)
          - tipo_solicitud (TEXT)
          - categoria (TEXT)
          - descripcion (TEXT)
          - prioridad (TEXT)
          - status (TEXT)
          - fecha_solicitud (TIMESTAMPTZ)
          - fecha_atencion (TIMESTAMPTZ, nullable)
          - fecha_resolucion (TIMESTAMPTZ, nullable)
          - tecnico_asignado_id (UUID, FK, nullable)
          - notas_tecnico (TEXT)
          - fotos (JSONB)
          - created_at (TIMESTAMPTZ)
          - updated_at (TIMESTAMPTZ)

    functions:
      - name: calcular_scoring_prospecto
        schema: crm
        file: apps/database/ddl/schemas/crm/functions/calcular_scoring_prospecto.sql
        lines: "1-50"
        description: Calcula el scoring de un prospecto según criterios configurados
        rf: RF-CRM-001
        reused_from_gamilit: false
        note: "Motor de scoring automático"
        parameters:
          - prospecto_id UUID
        returns: INTEGER

      - name: asignar_prospecto_vendedor
        schema: crm
        file: apps/database/ddl/schemas/crm/functions/asignar_prospecto_vendedor.sql
        lines: "1-60"
        description: Asigna prospectos a vendedores según reglas de distribución
        rf: RF-CRM-001
        reused_from_gamilit: false
        note: "Asignación automática o manual"
        parameters:
          - prospecto_id UUID
          - vendedor_id UUID (nullable)
        returns: BOOLEAN

      - name: calcular_financiamiento
        schema: crm
        file: apps/database/ddl/schemas/crm/functions/calcular_financiamiento.sql
        lines: "1-100"
        description: Calcula esquema de financiamiento para cotización
        rf: RF-CRM-003
        reused_from_gamilit: false
        note: "Motor de cálculo de mensualidades y amortización"
        parameters:
          - monto NUMERIC
          - enganche NUMERIC
          - plazo INTEGER
          - tasa NUMERIC
        returns: JSONB

      - name: generar_numero_cotizacion
        schema: crm
        file: apps/database/ddl/schemas/crm/functions/generar_numero_cotizacion.sql
        lines: "1-30"
        description: Genera número secuencial único de cotización
        rf: RF-CRM-003
        reused_from_gamilit: false
        note: "Formato: COT-{CONSTRUCTORA}-{YEAR}-{SEQ}"
        parameters:
          - constructora_id UUID
        returns: TEXT

      - name: get_avance_obra_cliente
        schema: crm_portal
        file: apps/database/ddl/schemas/crm_portal/functions/get_avance_obra_cliente.sql
        lines: "1-80"
        description: Obtiene avance de obra para un cliente desde MOB-005
        rf: RF-CRM-004
        reused_from_gamilit: false
        note: "Integración con módulo MOB-005 (Derechohabiente)"
        parameters:
          - cliente_portal_id UUID
        returns: JSONB

      - name: enviar_notificacion_portal
        schema: crm_portal
        file: apps/database/ddl/schemas/crm_portal/functions/enviar_notificacion_portal.sql
        lines: "1-60"
        description: Envía notificación a cliente del portal
        rf: RF-CRM-004
        reused_from_gamilit: false
        note: "Dispara email/SMS según preferencias"
        parameters:
          - cliente_portal_id UUID
          - tipo TEXT
          - titulo TEXT
          - mensaje TEXT
        returns: UUID

    views:
      - name: vw_pipeline_ventas
        schema: crm_comercial
        file: apps/database/ddl/schemas/crm_comercial/views/01-vw_pipeline_ventas.sql
        lines: 60
        description: Vista de pipeline de ventas por etapa
        rf: RF-CRM-002
        reused_from_gamilit: false
        note: "Dashboard de embudo de conversión"

      - name: vw_kpis_vendedor
        schema: crm_comercial
        file: apps/database/ddl/schemas/crm_comercial/views/02-vw_kpis_vendedor.sql
        lines: 80
        description: Vista de KPIs por vendedor
        rf: RF-CRM-002
        reused_from_gamilit: false
        note: "Métricas de desempeño comercial"

      - name: vw_cotizaciones_activas
        schema: crm
        file: apps/database/ddl/schemas/crm/views/01-vw_cotizaciones_activas.sql
        lines: 50
        description: Vista de cotizaciones activas con información completa
        rf: RF-CRM-003
        reused_from_gamilit: false
        note: "Dashboard de cotizaciones pendientes"

    rls_policies:
      - table: crm.prospectos
        policy: prospectos_select_own_constructora
        description: Usuarios solo ven prospectos de su constructora
        rf: RF-CRM-001
        reused_from_gamilit: false
        sql: |
          CREATE POLICY "prospectos_select_own_constructora" ON crm.prospectos
              FOR SELECT
              TO authenticated
              USING (
                  constructora_id = get_current_constructora_id()
              );

      - table: crm.prospectos
        policy: vendedores_see_assigned
        description: Vendedores ven solo sus prospectos asignados
        rf: RF-CRM-001
        reused_from_gamilit: false
        sql: |
          CREATE POLICY "vendedores_see_assigned" ON crm.prospectos
              FOR SELECT
              TO authenticated
              USING (
                  CASE
                      WHEN get_current_user_role() IN ('director', 'post_sales')
                          THEN constructora_id = get_current_constructora_id()
                      ELSE vendedor_asignado_id = get_current_user_id()
                  END
              );

      - table: crm.cotizaciones
        policy: cotizaciones_select_own_constructora
        description: Usuarios solo ven cotizaciones de su constructora
        rf: RF-CRM-003
        reused_from_gamilit: false

      - table: crm_portal.clientes_portal
        policy: portal_users_own_data
        description: Usuarios del portal solo ven sus propios datos
        rf: RF-CRM-004
        reused_from_gamilit: false
        sql: |
          CREATE POLICY "portal_users_own_data" ON crm_portal.clientes_portal
              FOR SELECT
              TO authenticated
              USING (id = get_current_portal_user_id());

# ============================================================================
# IMPLEMENTACIÓN - BACKEND
# ============================================================================

  backend:
    modules:
      - name: crm
        path: apps/backend/src/modules/crm/
        description: Módulo principal de CRM
        rf: [RF-CRM-001, RF-CRM-002, RF-CRM-003]
        reused_from_gamilit: false
        note: "Nuevo módulo específico de CRM"

      - name: crm-portal
        path: apps/backend/src/modules/crm-portal/
        description: Módulo de portal del cliente
        rf: RF-CRM-004
        reused_from_gamilit: false
        note: "API pública para portal de clientes"

    services:
      - name: ProspectosService
        path: apps/backend/src/modules/crm/services/prospectos.service.ts
        description: Lógica de gestión de prospectos
        rf: RF-CRM-001
        reused_from_gamilit: false
        methods:
          - create()
          - update()
          - delete()
          - findAll()
          - findById()
          - calcularScoring()
          - asignarVendedor()
          - cambiarEstado()

      - name: ScoringService
        path: apps/backend/src/modules/crm/services/scoring.service.ts
        description: Motor de scoring de prospectos
        rf: RF-CRM-001
        reused_from_gamilit: false
        methods:
          - calcularScoringAutomatico()
          - evaluarCriterios()
          - actualizarCriterios()

      - name: InteraccionesService
        path: apps/backend/src/modules/crm/services/interacciones.service.ts
        description: Gestión de interacciones comerciales
        rf: RF-CRM-002
        reused_from_gamilit: false
        methods:
          - registrarInteraccion()
          - findByProspecto()
          - findByVendedor()
          - programarSeguimiento()

      - name: PipelineService
        path: apps/backend/src/modules/crm/services/pipeline.service.ts
        description: Gestión de pipeline de ventas
        rf: RF-CRM-002
        reused_from_gamilit: false
        methods:
          - getEmbudoVentas()
          - getKPIsVendedor()
          - getMetasComerciales()
          - getConversionRates()

      - name: CotizacionesService
        path: apps/backend/src/modules/crm/services/cotizaciones.service.ts
        description: Gestión de cotizaciones
        rf: RF-CRM-003
        reused_from_gamilit: false
        methods:
          - crear()
          - actualizar()
          - calcularPrecio()
          - calcularFinanciamiento()
          - generarPDF()
          - enviarCliente()
          - aceptar()
          - rechazar()
          - duplicar()

      - name: FinanciamientoService
        path: apps/backend/src/modules/crm/services/financiamiento.service.ts
        description: Motor de cálculo de financiamiento
        rf: RF-CRM-003
        reused_from_gamilit: false
        methods:
          - calcularMensualidad()
          - generarTablaAmortizacion()
          - calcularEnganche()
          - validarCreditoInfonavit()

      - name: PDFGeneratorService
        path: apps/backend/src/modules/crm/services/pdf-generator.service.ts
        description: Generación de PDFs de cotización
        rf: RF-CRM-003
        reused_from_gamilit: false
        note: "Usa biblioteca como puppeteer o pdfmake"
        methods:
          - generarCotizacionPDF()
          - generarPropuestaEconomica()

      - name: PortalClienteService
        path: apps/backend/src/modules/crm-portal/services/portal-cliente.service.ts
        description: Lógica del portal del cliente
        rf: RF-CRM-004
        reused_from_gamilit: false
        methods:
          - register()
          - login()
          - activarCuenta()
          - recuperarPassword()
          - getDashboard()
          - getAvanceObra()
          - getEstadoCuenta()
          - solicitarServicio()

      - name: NotificacionesPortalService
        path: apps/backend/src/modules/crm-portal/services/notificaciones-portal.service.ts
        description: Envío de notificaciones a clientes
        rf: RF-CRM-004
        reused_from_gamilit: false
        methods:
          - enviarEmail()
          - enviarSMS()
          - notificarHitoObra()
          - notificarPagoProximo()

      - name: IntegracionMOB005Service
        path: apps/backend/src/modules/crm-portal/services/integracion-mob005.service.ts
        description: Integración con módulo MOB-005 (Derechohabiente)
        rf: RF-CRM-004
        reused_from_gamilit: false
        note: "Consume API de MOB-005 para datos de avance"
        methods:
          - getDerechohabienteInfo()
          - getAvanceObraDerechohabiente()
          - getFotosObra()
          - getHitosCompletados()

    controllers:
      - name: ProspectosController
        path: apps/backend/src/modules/crm/controllers/prospectos.controller.ts
        description: Endpoints de prospectos
        rf: RF-CRM-001
        reused_from_gamilit: false
        endpoints:
          - GET /api/crm/prospectos
          - GET /api/crm/prospectos/:id
          - POST /api/crm/prospectos
          - PUT /api/crm/prospectos/:id
          - DELETE /api/crm/prospectos/:id
          - POST /api/crm/prospectos/:id/asignar-vendedor
          - PUT /api/crm/prospectos/:id/estado

      - name: InteraccionesController
        path: apps/backend/src/modules/crm/controllers/interacciones.controller.ts
        description: Endpoints de interacciones
        rf: RF-CRM-002
        reused_from_gamilit: false
        endpoints:
          - GET /api/crm/interacciones
          - POST /api/crm/interacciones
          - GET /api/crm/interacciones/prospecto/:id
          - GET /api/crm/interacciones/vendedor/:id

      - name: PipelineController
        path: apps/backend/src/modules/crm/controllers/pipeline.controller.ts
        description: Endpoints de pipeline y KPIs
        rf: RF-CRM-002
        reused_from_gamilit: false
        endpoints:
          - GET /api/crm/pipeline
          - GET /api/crm/pipeline/vendedor/:id
          - GET /api/crm/kpis/vendedor/:id
          - GET /api/crm/kpis/proyecto/:id

      - name: CotizacionesController
        path: apps/backend/src/modules/crm/controllers/cotizaciones.controller.ts
        description: Endpoints de cotizaciones
        rf: RF-CRM-003
        reused_from_gamilit: false
        endpoints:
          - GET /api/crm/cotizaciones
          - GET /api/crm/cotizaciones/:id
          - POST /api/crm/cotizaciones
          - PUT /api/crm/cotizaciones/:id
          - POST /api/crm/cotizaciones/:id/generar-pdf
          - POST /api/crm/cotizaciones/:id/enviar-cliente
          - POST /api/crm/cotizaciones/:id/aceptar
          - POST /api/crm/cotizaciones/:id/rechazar
          - POST /api/crm/cotizaciones/:id/duplicar
          - GET /api/crm/cotizaciones/:id/versiones

      - name: PortalClienteController
        path: apps/backend/src/modules/crm-portal/controllers/portal-cliente.controller.ts
        description: Endpoints públicos del portal del cliente
        rf: RF-CRM-004
        reused_from_gamilit: false
        note: "API pública sin autenticación interna"
        endpoints:
          - POST /api/portal/register
          - POST /api/portal/login
          - POST /api/portal/activar
          - POST /api/portal/recuperar-password
          - GET /api/portal/dashboard
          - GET /api/portal/avance-obra
          - GET /api/portal/estado-cuenta
          - POST /api/portal/solicitar-servicio
          - GET /api/portal/notificaciones

    enums:
      - name: LeadStatus
        path: apps/backend/src/modules/crm/enums/lead-status.enum.ts
        description: Enum de estados de prospecto
        rf: RF-CRM-001
        reused_from: null
        values:
          - NUEVO = 'nuevo'
          - CONTACTADO = 'contactado'
          - CALIFICADO = 'calificado'
          - HOT = 'hot'
          - COLD = 'cold'
          - PERDIDO = 'perdido'
          - CONVERTIDO = 'convertido'

      - name: InteractionType
        path: apps/backend/src/modules/crm/enums/interaction-type.enum.ts
        description: Enum de tipos de interacción
        rf: RF-CRM-002
        reused_from: null

      - name: CotizacionStatus
        path: apps/backend/src/modules/crm/enums/cotizacion-status.enum.ts
        description: Enum de estados de cotización
        rf: RF-CRM-003
        reused_from: null

      - name: FinancingType
        path: apps/backend/src/modules/crm/enums/financing-type.enum.ts
        description: Enum de tipos de financiamiento
        rf: RF-CRM-003
        reused_from: null

    dtos:
      - name: CreateProspectoDto
        path: apps/backend/src/modules/crm/dto/create-prospecto.dto.ts
        rf: RF-CRM-001

      - name: UpdateProspectoDto
        path: apps/backend/src/modules/crm/dto/update-prospecto.dto.ts
        rf: RF-CRM-001

      - name: CreateInteraccionDto
        path: apps/backend/src/modules/crm/dto/create-interaccion.dto.ts
        rf: RF-CRM-002

      - name: CreateCotizacionDto
        path: apps/backend/src/modules/crm/dto/create-cotizacion.dto.ts
        rf: RF-CRM-003

      - name: CalcularFinanciamientoDto
        path: apps/backend/src/modules/crm/dto/calcular-financiamiento.dto.ts
        rf: RF-CRM-003

      - name: PortalRegisterDto
        path: apps/backend/src/modules/crm-portal/dto/portal-register.dto.ts
        rf: RF-CRM-004

      - name: PortalLoginDto
        path: apps/backend/src/modules/crm-portal/dto/portal-login.dto.ts
        rf: RF-CRM-004

# ============================================================================
# IMPLEMENTACIÓN - FRONTEND
# ============================================================================

  frontend:
    features:
      - name: crm
        path: apps/frontend/src/features/crm/
        description: Feature de CRM (prospectos, cotizaciones)
        rf: [RF-CRM-001, RF-CRM-002, RF-CRM-003]
        reused_from_gamilit: false

      - name: portal-cliente
        path: apps/portal-cliente/src/
        description: Aplicación separada para portal del cliente
        rf: RF-CRM-004
        reused_from_gamilit: false
        note: "App independiente Next.js para clientes"

    components:
      # RF-CRM-001: Gestión de Prospectos
      - name: ProspectosList
        path: apps/frontend/src/features/crm/components/ProspectosList.tsx
        description: Lista de prospectos con filtros
        rf: RF-CRM-001
        reused_from_gamilit: false

      - name: ProspectoForm
        path: apps/frontend/src/features/crm/components/ProspectoForm.tsx
        description: Formulario de captura/edición de prospecto
        rf: RF-CRM-001
        reused_from_gamilit: false

      - name: ProspectoDetailPanel
        path: apps/frontend/src/features/crm/components/ProspectoDetailPanel.tsx
        description: Panel lateral con detalle de prospecto
        rf: RF-CRM-001
        reused_from_gamilit: false

      - name: ScoringIndicator
        path: apps/frontend/src/features/crm/components/ScoringIndicator.tsx
        description: Indicador visual de scoring
        rf: RF-CRM-001
        reused_from_gamilit: false

      # RF-CRM-002: Seguimiento Comercial
      - name: InteraccionesList
        path: apps/frontend/src/features/crm/components/InteraccionesList.tsx
        description: Timeline de interacciones
        rf: RF-CRM-002
        reused_from_gamilit: false

      - name: InteraccionForm
        path: apps/frontend/src/features/crm/components/InteraccionForm.tsx
        description: Formulario de registro de interacción
        rf: RF-CRM-002
        reused_from_gamilit: false

      - name: PipelineBoard
        path: apps/frontend/src/features/crm/components/PipelineBoard.tsx
        description: Tablero Kanban de pipeline
        rf: RF-CRM-002
        reused_from_gamilit: false
        note: "Drag & drop de prospectos entre etapas"

      - name: KPIDashboard
        path: apps/frontend/src/features/crm/components/KPIDashboard.tsx
        description: Dashboard de KPIs comerciales
        rf: RF-CRM-002
        reused_from_gamilit: false
        note: "Gráficas de conversión, embudo, metas"

      - name: CalendarioActividades
        path: apps/frontend/src/features/crm/components/CalendarioActividades.tsx
        description: Calendario de visitas y seguimientos
        rf: RF-CRM-002
        reused_from_gamilit: false

      # RF-CRM-003: Cotizaciones
      - name: CotizacionesList
        path: apps/frontend/src/features/crm/components/CotizacionesList.tsx
        description: Lista de cotizaciones
        rf: RF-CRM-003
        reused_from_gamilit: false

      - name: CotizacionWizard
        path: apps/frontend/src/features/crm/components/CotizacionWizard.tsx
        description: Wizard de creación de cotización
        rf: RF-CRM-003
        reused_from_gamilit: false
        note: "5 pasos: Prospecto, Prototipo, Extras, Financiamiento, Resumen"

      - name: FinanciamientoCalculator
        path: apps/frontend/src/features/crm/components/FinanciamientoCalculator.tsx
        description: Calculadora de financiamiento
        rf: RF-CRM-003
        reused_from_gamilit: false

      - name: CotizacionPDFViewer
        path: apps/frontend/src/features/crm/components/CotizacionPDFViewer.tsx
        description: Visor de PDF de cotización
        rf: RF-CRM-003
        reused_from_gamilit: false

      - name: CotizacionVersiones
        path: apps/frontend/src/features/crm/components/CotizacionVersiones.tsx
        description: Historial de versiones de cotización
        rf: RF-CRM-003
        reused_from_gamilit: false

      # RF-CRM-004: Portal del Cliente
      - name: PortalLoginPage
        path: apps/portal-cliente/src/components/PortalLoginPage.tsx
        description: Página de login del portal
        rf: RF-CRM-004
        reused_from_gamilit: false

      - name: PortalDashboard
        path: apps/portal-cliente/src/components/PortalDashboard.tsx
        description: Dashboard principal del cliente
        rf: RF-CRM-004
        reused_from_gamilit: false

      - name: AvanceObraViewer
        path: apps/portal-cliente/src/components/AvanceObraViewer.tsx
        description: Visualización de avance de obra
        rf: RF-CRM-004
        reused_from_gamilit: false
        note: "Fotos, hitos, % avance desde MOB-005"

      - name: EstadoCuentaCliente
        path: apps/portal-cliente/src/components/EstadoCuentaCliente.tsx
        description: Estado de cuenta del cliente
        rf: RF-CRM-004
        reused_from_gamilit: false

      - name: SolicitudServicioForm
        path: apps/portal-cliente/src/components/SolicitudServicioForm.tsx
        description: Formulario de solicitud de servicio
        rf: RF-CRM-004
        reused_from_gamilit: false

      - name: NotificacionesPortal
        path: apps/portal-cliente/src/components/NotificacionesPortal.tsx
        description: Centro de notificaciones del portal
        rf: RF-CRM-004
        reused_from_gamilit: false

    stores:
      - name: prospectosStore
        path: apps/frontend/src/stores/prospectosStore.ts
        description: Store de prospectos
        rf: RF-CRM-001
        reused_from_gamilit: false

      - name: interaccionesStore
        path: apps/frontend/src/stores/interaccionesStore.ts
        description: Store de interacciones
        rf: RF-CRM-002
        reused_from_gamilit: false

      - name: cotizacionesStore
        path: apps/frontend/src/stores/cotizacionesStore.ts
        description: Store de cotizaciones
        rf: RF-CRM-003
        reused_from_gamilit: false

      - name: portalClienteStore
        path: apps/portal-cliente/src/stores/portalClienteStore.ts
        description: Store del portal del cliente
        rf: RF-CRM-004
        reused_from_gamilit: false

    pages:
      - name: ProspectosPage
        path: apps/frontend/src/pages/crm/prospectos/index.tsx
        rf: RF-CRM-001

      - name: PipelinePage
        path: apps/frontend/src/pages/crm/pipeline/index.tsx
        rf: RF-CRM-002

      - name: KPIsPage
        path: apps/frontend/src/pages/crm/kpis/index.tsx
        rf: RF-CRM-002

      - name: CotizacionesPage
        path: apps/frontend/src/pages/crm/cotizaciones/index.tsx
        rf: RF-CRM-003

      - name: NuevaCotizacionPage
        path: apps/frontend/src/pages/crm/cotizaciones/nueva.tsx
        rf: RF-CRM-003

      - name: PortalHomePage
        path: apps/portal-cliente/src/pages/index.tsx
        rf: RF-CRM-004

      - name: PortalAvanceObraPage
        path: apps/portal-cliente/src/pages/avance-obra.tsx
        rf: RF-CRM-004

# ============================================================================
# TESTING
# ============================================================================

  testing:
    unit_tests:
      - module: ProspectosService
        file: apps/backend/src/modules/crm/services/prospectos.service.spec.ts
        coverage_target: 85%
        reused_from_gamilit: false

      - module: ScoringService
        file: apps/backend/src/modules/crm/services/scoring.service.spec.ts
        coverage_target: 90%
        reused_from_gamilit: false

      - module: CotizacionesService
        file: apps/backend/src/modules/crm/services/cotizaciones.service.spec.ts
        coverage_target: 85%
        reused_from_gamilit: false

      - module: FinanciamientoService
        file: apps/backend/src/modules/crm/services/financiamiento.service.spec.ts
        coverage_target: 95%
        reused_from_gamilit: false
        note: "Crítico - Cálculos financieros"

      - module: PortalClienteService
        file: apps/backend/src/modules/crm-portal/services/portal-cliente.service.spec.ts
        coverage_target: 85%
        reused_from_gamilit: false

      - module: IntegracionMOB005Service
        file: apps/backend/src/modules/crm-portal/services/integracion-mob005.service.spec.ts
        coverage_target: 80%
        reused_from_gamilit: false

    e2e_tests:
      - name: CRM Prospectos E2E
        file: apps/backend/test/crm/prospectos.e2e-spec.ts
        scenarios:
          - Crear prospecto y calcular scoring
          - Asignar prospecto a vendedor
          - Cambiar estado de prospecto
          - Buscar prospectos con filtros
        reused_from_gamilit: false

      - name: CRM Cotizaciones E2E
        file: apps/backend/test/crm/cotizaciones.e2e-spec.ts
        scenarios:
          - Crear cotización completa
          - Calcular financiamiento
          - Generar PDF
          - Enviar cotización a cliente
          - Aceptar/rechazar cotización
          - Crear nueva versión
        reused_from_gamilit: false

      - name: Portal Cliente E2E
        file: apps/backend/test/portal/portal-cliente.e2e-spec.ts
        scenarios:
          - Registro de cliente
          - Activación de cuenta
          - Login al portal
          - Consultar avance de obra
          - Solicitar servicio post-venta
        reused_from_gamilit: false

    integration_tests:
      - name: Integración MOB-005
        file: apps/backend/test/integration/mob005-integration.spec.ts
        scenarios:
          - Obtener datos de derechohabiente
          - Consultar avance de obra desde MOB-005
          - Sincronizar hitos de construcción
        reused_from_gamilit: false
        note: "Requiere MOB-005 implementado o mock"

      - name: PDF Generation Integration
        file: apps/backend/test/integration/pdf-generation.spec.ts
        scenarios:
          - Generar PDF de cotización
          - Validar formato y contenido
          - Enviar PDF por email
        reused_from_gamilit: false

# ============================================================================
# INTEGRATIONS
# ============================================================================

integrations:
  internal_modules:
    - module: MOB-005
      name: Derechohabiente
      description: Módulo móvil de seguimiento de derechohabiente
      integration_type: REST API
      direction: consume
      rf: RF-CRM-004
      endpoints:
        - GET /api/mob/derechohabiente/:id
        - GET /api/mob/derechohabiente/:id/avance-obra
        - GET /api/mob/derechohabiente/:id/fotos-obra
        - GET /api/mob/derechohabiente/:id/hitos
      note: "Portal del cliente consume datos de avance de obra desde MOB-005"

    - module: MAI-002
      name: Proyectos y Estructura
      description: Información de proyectos y prototipos
      integration_type: Database FK
      direction: consume
      rf: [RF-CRM-001, RF-CRM-003]
      tables:
        - proyectos.proyectos
        - proyectos.prototipos
        - proyectos.lotes

    - module: MAI-003
      name: Contratos y Ventas
      description: Conversión de cotización a contrato
      integration_type: REST API + Event
      direction: provide
      rf: RF-CRM-003
      events:
        - cotizacion.aceptada
        - prospecto.convertido
      note: "MAI-003 consume cotizaciones aceptadas para generar contratos"

  external_services:
    - name: Email Service (SendGrid/AWS SES)
      description: Envío de emails a clientes
      rf: RF-CRM-004
      note: "Notificaciones del portal"

    - name: SMS Service (Twilio)
      description: Envío de SMS
      rf: RF-CRM-004
      note: "Notificaciones urgentes a clientes"

    - name: PDF Generator (Puppeteer)
      description: Generación de PDFs
      rf: RF-CRM-003
      note: "Cotizaciones en PDF"

    - name: WhatsApp Business API
      description: Integración con WhatsApp
      rf: RF-CRM-002
      note: "Opcional: Registro de interacciones por WhatsApp"

# ============================================================================
# MÉTRICAS
# ============================================================================

metrics:
  story_points:
    planned: 120
    completed: 0
    variance: 0%

  budget:
    planned: 85000
    actual: 0
    variance: 0%

  reuse_from_gamilit:
    infrastructure: 20%
    database: 0%
    backend: 30%
    frontend: 25%
    overall: 19%

  complexity:
    database: high
    backend: high
    frontend: medium
    integrations: high

  time_saved_weeks: 0.5
  note: "Baja reutilización - Módulo específico de CRM"

# ============================================================================
# ROADMAP
# ============================================================================

roadmap:
  sprint_8:
    weeks: [8]
    goal: "RF-CRM-001 - Gestión de Prospectos"
    tasks:
      - Diseñar schema crm.prospectos
      - Implementar ProspectosService y API
      - Desarrollar motor de scoring
      - UI de captura y lista de prospectos
      - Tests unitarios
    story_points: 26
    deliverables:
      - "Sistema de captura de prospectos funcional"
      - "Motor de scoring automático"
      - "Asignación de prospectos a vendedores"

  sprint_9:
    weeks: [9]
    goal: "RF-CRM-002 - Seguimiento Comercial"
    tasks:
      - Diseñar schema crm_comercial
      - Implementar InteraccionesService y PipelineService
      - Desarrollar tablero de pipeline
      - Dashboard de KPIs comerciales
      - Calendario de actividades
      - Tests E2E
    story_points: 29
    deliverables:
      - "Pipeline de ventas con Kanban"
      - "Dashboard de KPIs por vendedor"
      - "Sistema de registro de interacciones"

  sprint_10:
    weeks: [10]
    goal: "RF-CRM-003 - Sistema de Cotizaciones"
    tasks:
      - Diseñar schema cotizaciones
      - Implementar motor de financiamiento
      - Desarrollar wizard de cotización
      - Integrar generación de PDF
      - Versionamiento de cotizaciones
      - Tests de cálculos financieros
    story_points: 39
    deliverables:
      - "Wizard completo de cotización"
      - "Motor de cálculo de financiamiento certificado"
      - "Generación de PDF profesional"
      - "Sistema de versiones"

  sprint_11:
    weeks: [11]
    goal: "RF-CRM-004 - Portal del Cliente"
    tasks:
      - Diseñar schema crm_portal
      - Implementar autenticación de portal
      - Desarrollar frontend de portal-cliente app
      - Integrar con MOB-005
      - Sistema de notificaciones
      - Solicitudes de servicio post-venta
      - Tests E2E del portal
    story_points: 26
    deliverables:
      - "Portal del cliente funcional"
      - "Integración con MOB-005 para avance de obra"
      - "Sistema de notificaciones email/SMS"
      - "Módulo de solicitudes post-venta"

# ============================================================================
# RISKS & CHALLENGES
# ============================================================================

risks:
  - risk: "Complejidad del motor de financiamiento"
    impact: high
    probability: medium
    mitigation: "Validar fórmulas con experto financiero, tests exhaustivos"

  - risk: "Integración con MOB-005 requiere que esté implementado"
    impact: high
    probability: medium
    mitigation: "Crear mock de API de MOB-005 para desarrollo en paralelo"

  - risk: "Generación de PDF puede ser lenta"
    impact: medium
    probability: high
    mitigation: "Usar cola de jobs (Bull/BullMQ) para generación asíncrona"

  - risk: "Seguridad del portal del cliente"
    impact: high
    probability: low
    mitigation: "Autenticación separada, rate limiting, auditoría de accesos"

  - risk: "Cálculos de financiamiento incorrectos"
    impact: critical
    probability: low
    mitigation: "Coverage 95%+ en tests de FinanciamientoService, validación manual"

# ============================================================================
# DEPENDENCIES
# ============================================================================

dependencies:
  prerequisites:
    - MAI-001: "Fundamentos (autenticación, multi-tenancy)"
    - MAI-002: "Proyectos y Estructura (catálogo de prototipos)"

  parallel:
    - MAI-003: "Contratos y Ventas (integración bidireccional)"
    - MOB-005: "Derechohabiente (para portal del cliente)"

  blocking:
    - "MOB-005 debe exponerse API de avance de obra para RF-CRM-004"

# ============================================================================
# NOTAS
# ============================================================================

notes:
  - "Módulo 100% nuevo - Sin reutilización de GAMILIT"
  - "Motor de financiamiento crítico - Requiere validación contable"
  - "Portal del cliente es app separada (Next.js standalone)"
  - "Integración con MOB-005 es feature diferenciadora clave"
  - "Considerar WhatsApp Business API para seguimiento comercial"
  - "PDF templates deben ser configurables por constructora"
  - "Scoring de prospectos debe ser ajustable por reglas de negocio"
  - "Pipeline debe soportar múltiples embudos por tipo de proyecto"
  - "Sistema de notificaciones debe ser escalable (miles de clientes)"
  - "Considerar integración futura con Facebook Leads Ads"
