Modulo base de ventas para plataformas SaaS. Proporciona gestion de leads, oportunidades, pipeline de ventas, y seguimiento de actividades comerciales. Diseñado para ser extendido por verticales ERP.
Objetivos
Gestionar leads y contactos comerciales
Pipeline de oportunidades con etapas configurables
Seguimiento de actividades (llamadas, emails, reuniones)
Reportes de ventas y conversion
Integracion con billing para cerrar ventas
Alcance
Incluido
CRUD de leads con scoring automatico
Pipeline de oportunidades (kanban)
Etapas configurables por tenant
Actividades y seguimiento
Conversion lead -> cliente
Dashboard de ventas
Reportes basicos (conversion, tiempo ciclo)
Integracion con notifications
Excluido
CRM completo (erp-core)
Cotizaciones/Propuestas (erp-core)
Productos y catalogo (portfolio module)
Facturacion (billing module existente)
Modelo de Datos
Schema: sales
-- Leads
CREATETABLEsales.leads(idUUIDPRIMARYKEYDEFAULTgen_random_uuid(),tenant_idUUIDNOTNULLREFERENCEStenants.tenants(id),-- Contacto
first_nameVARCHAR(100)NOTNULL,last_nameVARCHAR(100),emailVARCHAR(255)NOTNULL,phoneVARCHAR(50),companyVARCHAR(200),job_titleVARCHAR(100),-- Origen y scoring
sourcesales.lead_sourceNOTNULLDEFAULT'manual',scoreINTEGERDEFAULT0,statussales.lead_statusNOTNULLDEFAULT'new',-- Asignacion
assigned_toUUIDREFERENCESusers.users(id),-- Metadata
tagsJSONBDEFAULT'[]',custom_fieldsJSONBDEFAULT'{}',notesTEXT,-- Conversion
converted_atTIMESTAMPTZ,converted_to_opportunity_idUUID,-- Audit
created_atTIMESTAMPTZDEFAULTNOW(),updated_atTIMESTAMPTZDEFAULTNOW(),created_byUUIDREFERENCESusers.users(id));-- Oportunidades
CREATETABLEsales.opportunities(idUUIDPRIMARYKEYDEFAULTgen_random_uuid(),tenant_idUUIDNOTNULLREFERENCEStenants.tenants(id),-- Info basica
nameVARCHAR(200)NOTNULL,descriptionTEXT,-- Pipeline
stage_idUUIDNOTNULLREFERENCESsales.pipeline_stages(id),probabilityINTEGERDEFAULT0CHECK(probability>=0ANDprobability<=100),-- Valores
amountDECIMAL(15,2)DEFAULT0,currencyVARCHAR(3)DEFAULT'USD',expected_close_dateDATE,-- Relaciones
lead_idUUIDREFERENCESsales.leads(id),contact_emailVARCHAR(255),companyVARCHAR(200),-- Asignacion
assigned_toUUIDREFERENCESusers.users(id),-- Estado
statussales.opportunity_statusNOTNULLDEFAULT'open',won_atTIMESTAMPTZ,lost_atTIMESTAMPTZ,lost_reasonVARCHAR(500),-- Metadata
tagsJSONBDEFAULT'[]',custom_fieldsJSONBDEFAULT'{}',-- Audit
created_atTIMESTAMPTZDEFAULTNOW(),updated_atTIMESTAMPTZDEFAULTNOW());-- Etapas del pipeline
CREATETABLEsales.pipeline_stages(idUUIDPRIMARYKEYDEFAULTgen_random_uuid(),tenant_idUUIDNOTNULLREFERENCEStenants.tenants(id),nameVARCHAR(100)NOTNULL,descriptionTEXT,positionINTEGERNOTNULLDEFAULT0,probabilityINTEGERDEFAULT0,colorVARCHAR(7)DEFAULT'#3B82F6',is_wonBOOLEANDEFAULTfalse,is_lostBOOLEANDEFAULTfalse,is_activeBOOLEANDEFAULTtrue,created_atTIMESTAMPTZDEFAULTNOW());-- Actividades
CREATETABLEsales.activities(idUUIDPRIMARYKEYDEFAULTgen_random_uuid(),tenant_idUUIDNOTNULLREFERENCEStenants.tenants(id),-- Tipo y descripcion
typesales.activity_typeNOTNULL,subjectVARCHAR(200)NOTNULL,descriptionTEXT,-- Relacion polimorfica
related_typeVARCHAR(50)NOTNULL,-- 'lead' | 'opportunity'
related_idUUIDNOTNULL,-- Programacion
due_dateTIMESTAMPTZ,completed_atTIMESTAMPTZ,-- Asignacion
assigned_toUUIDREFERENCESusers.users(id),-- Metadata
outcomeTEXT,duration_minutesINTEGER,created_atTIMESTAMPTZDEFAULTNOW(),created_byUUIDREFERENCESusers.users(id));-- Enums
CREATETYPEsales.lead_sourceASENUM('manual','website','referral','campaign','social','trade_show','cold_call','other');CREATETYPEsales.lead_statusASENUM('new','contacted','qualified','unqualified','converted');CREATETYPEsales.opportunity_statusASENUM('open','won','lost');CREATETYPEsales.activity_typeASENUM('call','email','meeting','task','note','demo');
RLS Policies
ALTERTABLEsales.leadsENABLEROWLEVELSECURITY;ALTERTABLEsales.opportunitiesENABLEROWLEVELSECURITY;ALTERTABLEsales.pipeline_stagesENABLEROWLEVELSECURITY;ALTERTABLEsales.activitiesENABLEROWLEVELSECURITY;CREATEPOLICYtenant_isolationONsales.leadsUSING(tenant_id=current_setting('app.current_tenant_id')::UUID);-- (Similar for other tables)
Endpoints API
Leads
Metodo
Endpoint
Descripcion
GET
/sales/leads
Listar leads con filtros
POST
/sales/leads
Crear lead
GET
/sales/leads/:id
Obtener lead
PATCH
/sales/leads/:id
Actualizar lead
DELETE
/sales/leads/:id
Eliminar lead
POST
/sales/leads/:id/convert
Convertir a oportunidad
POST
/sales/leads/import
Importar leads (CSV)
Opportunities
Metodo
Endpoint
Descripcion
GET
/sales/opportunities
Listar oportunidades
POST
/sales/opportunities
Crear oportunidad
GET
/sales/opportunities/:id
Obtener oportunidad
PATCH
/sales/opportunities/:id
Actualizar oportunidad
DELETE
/sales/opportunities/:id
Eliminar oportunidad
PATCH
/sales/opportunities/:id/stage
Mover de etapa
POST
/sales/opportunities/:id/won
Marcar como ganada
POST
/sales/opportunities/:id/lost
Marcar como perdida
Pipeline
Metodo
Endpoint
Descripcion
GET
/sales/pipeline/stages
Listar etapas
POST
/sales/pipeline/stages
Crear etapa
PATCH
/sales/pipeline/stages/:id
Actualizar etapa
DELETE
/sales/pipeline/stages/:id
Eliminar etapa
POST
/sales/pipeline/stages/reorder
Reordenar etapas
Activities
Metodo
Endpoint
Descripcion
GET
/sales/activities
Listar actividades
POST
/sales/activities
Crear actividad
PATCH
/sales/activities/:id
Actualizar actividad
DELETE
/sales/activities/:id
Eliminar actividad
POST
/sales/activities/:id/complete
Marcar completada
Reports
Metodo
Endpoint
Descripcion
GET
/sales/reports/pipeline
Reporte pipeline
GET
/sales/reports/conversion
Tasa de conversion
GET
/sales/reports/forecast
Forecast de ventas
Frontend
Paginas
/sales - Dashboard de ventas
/sales/leads - Lista de leads
/sales/leads/:id - Detalle de lead
/sales/opportunities - Pipeline kanban
/sales/opportunities/:id - Detalle de oportunidad
/sales/activities - Calendario/lista de actividades
/sales/reports - Reportes
Componentes
LeadsList - Tabla de leads con filtros
LeadForm - Formulario crear/editar lead
LeadDetail - Vista detalle con timeline
OpportunityKanban - Pipeline drag & drop
OpportunityCard - Tarjeta en kanban
OpportunityDetail - Vista detalle con actividades
ActivityTimeline - Timeline de actividades
ActivityForm - Formulario de actividad
SalesDashboard - Metricas y graficos
ConversionFunnel - Visualizacion embudo
Hooks
useLeads - CRUD leads
useOpportunities - CRUD oportunidades
usePipeline - Gestion pipeline
useActivities - CRUD actividades
useSalesReports - Reportes
Dependencias
Modulos Requeridos
SAAS-001 Auth (autenticacion)
SAAS-002 Tenants (multi-tenancy)
SAAS-003 Users (usuarios y asignacion)
SAAS-007 Notifications (alertas de actividades)
Modulos Opcionales
SAAS-019 Portfolio (productos en oportunidades)
SAAS-020 Commissions (comisiones por venta)
Criterios de Aceptacion
CRUD completo de leads con validaciones
Pipeline kanban con drag & drop
Conversion lead -> oportunidad funcional
Sistema de actividades con recordatorios
Dashboard con metricas clave
Reportes de conversion y forecast
Tests unitarios (>70% coverage)
Documentacion API (Swagger)
Estimacion
Componente
SP
DDL + Entities
3
Backend Services
5
Controllers + DTOs
3
Frontend Pages
5
Frontend Components
3
Tests
2
Total
21
Ultima actualizacion: 2026-01-24
Autor: Claude Opus 4.5