template-saas/docs/02-especificaciones/ET-SAAS-018-sales.md
Adrian Flores Cortes 2825b3d5fd
Some checks are pending
CI / Backend CI (push) Waiting to run
CI / Frontend CI (push) Waiting to run
CI / Security Scan (push) Waiting to run
CI / CI Summary (push) Blocked by required conditions
docs: Add ET-SAAS-018 to ET-SAAS-022 technical specifications
- ET-SAAS-018-sales.md: Sales pipeline/CRM module
- ET-SAAS-019-portfolio.md: Product catalog module
- ET-SAAS-020-commissions.md: Commissions system
- ET-SAAS-021-mlm.md: Multi-Level Marketing module
- ET-SAAS-022-goals.md: Goals and objectives system
- Update _MAP.md with all 9 specifications

All specs document:
- Data model (DDL, enums, tables)
- Backend architecture (endpoints, services)
- Security (RLS, RBAC permissions)
- Frontend status and hooks
- Module integrations

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 13:14:48 -06:00

290 lines
8.4 KiB
Markdown

---
id: "ET-SAAS-018"
title: "Especificacion Tecnica Sales Pipeline"
type: "TechnicalSpec"
status: "Implemented"
priority: "P1"
module: "sales"
version: "1.0.0"
created_date: "2026-02-03"
updated_date: "2026-02-03"
story_points: 8
---
# ET-SAAS-018: Especificacion Tecnica - Sistema de Ventas (Sales Pipeline)
## Metadata
- **Codigo:** ET-SAAS-018
- **Modulo:** Sales
- **Version:** 1.0.0
- **Estado:** Implementado
- **Fecha:** 2026-02-03
- **Basado en:** SAAS-018
---
## 1. Resumen Ejecutivo
### 1.1 Estado Actual
Sistema de ventas completamente implementado con CRM basico.
| Capacidad | Estado | Notas |
|-----------|--------|-------|
| Pipeline Stages | SI | Etapas configurables por tenant |
| Leads Management | SI | Prospectos con scoring |
| Opportunities | SI | Oportunidades con probabilidad |
| Activities | SI | Llamadas, reuniones, tareas |
| RLS | SI | Row Level Security por tenant |
### 1.2 Funcionalidades v1.0
Sistema CRM con:
- **4 Entidades**: Pipeline Stages, Leads, Opportunities, Activities
- **Pipeline configurable**: Etapas personalizables por tenant
- **Lead Scoring**: Puntuacion 0-100 automatica
- **Activity Tracking**: Llamadas, reuniones, tareas, emails, notas
- **Conversion Flow**: Lead → Opportunity → Won/Lost
---
## 2. Modelo de Datos
### 2.1 Schema: sales
#### Tabla: pipeline_stages
| Campo | Tipo | Descripcion |
|-------|------|-------------|
| id | UUID | PK |
| tenant_id | UUID | FK tenants |
| name | VARCHAR(100) | Nombre de la etapa |
| position | INT | Orden en el pipeline |
| color | VARCHAR(7) | Color hex |
| is_won | BOOLEAN | Etapa de cierre ganado |
| is_lost | BOOLEAN | Etapa de cierre perdido |
| is_active | BOOLEAN | Estado activo |
#### Tabla: leads
| Campo | Tipo | Descripcion |
|-------|------|-------------|
| id | UUID | PK |
| tenant_id | UUID | FK tenants |
| first_name, last_name | VARCHAR(100) | Nombre completo |
| email, phone | VARCHAR | Contacto |
| company, job_title | VARCHAR | Empresa |
| source | ENUM | website, referral, cold_call, event, advertisement, social_media, other |
| status | ENUM | new, contacted, qualified, unqualified, converted |
| score | INT | 0-100 lead scoring |
| assigned_to | UUID | FK users |
| converted_at | TIMESTAMPTZ | Fecha conversion |
| custom_fields | JSONB | Campos personalizados |
#### Tabla: opportunities
| Campo | Tipo | Descripcion |
|-------|------|-------------|
| id | UUID | PK |
| tenant_id | UUID | FK tenants |
| name | VARCHAR(255) | Nombre de la oportunidad |
| lead_id | UUID | FK leads (opcional) |
| stage | ENUM | prospecting, qualification, proposal, negotiation, closed_won, closed_lost |
| stage_id | UUID | FK pipeline_stages |
| amount | DECIMAL(15,2) | Valor monetario |
| currency | VARCHAR(3) | Moneda (default USD) |
| probability | INT | 0-100 probabilidad de cierre |
| expected_close_date | DATE | Fecha esperada de cierre |
| assigned_to | UUID | FK users |
| won_at, lost_at | TIMESTAMPTZ | Fechas de cierre |
| lost_reason | VARCHAR(500) | Razon de perdida |
#### Tabla: activities
| Campo | Tipo | Descripcion |
|-------|------|-------------|
| id | UUID | PK |
| tenant_id | UUID | FK tenants |
| type | ENUM | call, meeting, task, email, note |
| status | ENUM | pending, completed, cancelled |
| subject | VARCHAR(255) | Titulo |
| lead_id / opportunity_id | UUID | Referencia |
| due_date | TIMESTAMPTZ | Fecha limite |
| completed_at | TIMESTAMPTZ | Fecha completado |
| assigned_to | UUID | FK users |
| reminder_at | TIMESTAMPTZ | Recordatorio |
### 2.2 Enums
```sql
sales.lead_status: new, contacted, qualified, unqualified, converted
sales.lead_source: website, referral, cold_call, event, advertisement, social_media, other
sales.opportunity_stage: prospecting, qualification, proposal, negotiation, closed_won, closed_lost
sales.activity_type: call, meeting, task, email, note
sales.activity_status: pending, completed, cancelled
```
---
## 3. Arquitectura Backend
### 3.1 Estructura de Archivos
```
backend/src/modules/sales/
├── sales.module.ts
├── controllers/
│ ├── leads.controller.ts
│ ├── opportunities.controller.ts
│ ├── activities.controller.ts
│ └── pipeline-stages.controller.ts
├── services/
│ ├── leads.service.ts
│ ├── opportunities.service.ts
│ ├── activities.service.ts
│ └── pipeline-stages.service.ts
├── entities/
│ ├── lead.entity.ts
│ ├── opportunity.entity.ts
│ ├── activity.entity.ts
│ └── pipeline-stage.entity.ts
├── dto/
│ ├── create-lead.dto.ts
│ ├── update-lead.dto.ts
│ ├── create-opportunity.dto.ts
│ └── ...
└── __tests__/
```
### 3.2 Endpoints API
#### Leads
| Metodo | Endpoint | Descripcion |
|--------|----------|-------------|
| GET | /sales/leads | Listar leads |
| GET | /sales/leads/:id | Obtener lead |
| POST | /sales/leads | Crear lead |
| PATCH | /sales/leads/:id | Actualizar lead |
| DELETE | /sales/leads/:id | Eliminar lead |
| POST | /sales/leads/:id/convert | Convertir a oportunidad |
#### Opportunities
| Metodo | Endpoint | Descripcion |
|--------|----------|-------------|
| GET | /sales/opportunities | Listar oportunidades |
| GET | /sales/opportunities/:id | Obtener oportunidad |
| POST | /sales/opportunities | Crear oportunidad |
| PATCH | /sales/opportunities/:id | Actualizar |
| PATCH | /sales/opportunities/:id/stage | Cambiar etapa |
| POST | /sales/opportunities/:id/won | Marcar como ganada |
| POST | /sales/opportunities/:id/lost | Marcar como perdida |
| DELETE | /sales/opportunities/:id | Eliminar |
#### Activities
| Metodo | Endpoint | Descripcion |
|--------|----------|-------------|
| GET | /sales/activities | Listar actividades |
| GET | /sales/activities/:id | Obtener actividad |
| POST | /sales/activities | Crear actividad |
| PATCH | /sales/activities/:id | Actualizar |
| POST | /sales/activities/:id/complete | Marcar completada |
| DELETE | /sales/activities/:id | Eliminar |
#### Pipeline Stages
| Metodo | Endpoint | Descripcion |
|--------|----------|-------------|
| GET | /sales/pipeline-stages | Listar etapas |
| POST | /sales/pipeline-stages | Crear etapa |
| PATCH | /sales/pipeline-stages/:id | Actualizar |
| PATCH | /sales/pipeline-stages/reorder | Reordenar |
| DELETE | /sales/pipeline-stages/:id | Eliminar |
---
## 4. Seguridad
### 4.1 Row Level Security (RLS)
Todas las tablas tienen RLS habilitado con politicas por tenant_id.
```sql
-- Ejemplo para leads
CREATE POLICY leads_tenant_isolation ON sales.leads
USING (tenant_id = current_setting('app.tenant_id')::uuid);
```
### 4.2 Permisos RBAC
| Permiso | Descripcion |
|---------|-------------|
| sales:read | Ver leads, oportunidades, actividades |
| sales:write | Crear/editar |
| sales:delete | Eliminar |
| sales:assign | Asignar a usuarios |
| sales:manage | Configurar pipeline |
---
## 5. Integraciones
### 5.1 Modulos Relacionados
| Modulo | Integracion |
|--------|-------------|
| users | Asignacion de leads/opportunities |
| notifications | Alertas de actividades |
| audit | Log de cambios |
| commissions | Calculo de comisiones en won |
| goals | Tracking de metas de ventas |
### 5.2 Eventos Emitidos
```typescript
// Eventos del modulo sales
LeadCreated, LeadUpdated, LeadConverted
OpportunityCreated, OpportunityStageChanged, OpportunityWon, OpportunityLost
ActivityCreated, ActivityCompleted
```
---
## 6. Frontend
### 6.1 Paginas
| Ruta | Componente | Estado |
|------|------------|--------|
| /dashboard/sales | SalesDashboard | Pendiente |
| /dashboard/sales/leads | LeadsPage | Pendiente |
| /dashboard/sales/opportunities | OpportunitiesPage | Pendiente |
| /dashboard/sales/pipeline | PipelinePage | Pendiente |
| /dashboard/sales/activities | ActivitiesPage | Pendiente |
### 6.2 Hooks
```typescript
// frontend/src/hooks/useSales.ts
useLeads, useLead, useCreateLead, useUpdateLead, useDeleteLead, useConvertLead
useOpportunities, useOpportunity, useCreateOpportunity, useUpdateOpportunityStage
useActivities, useCreateActivity, useCompleteActivity
usePipelineStages
```
---
## 7. Metricas y Dashboard
### 7.1 KPIs Propuestos
- Total Leads por periodo
- Conversion Rate (Lead → Opportunity)
- Win Rate (Opportunity → Won)
- Pipeline Value (suma de amounts)
- Average Deal Size
- Sales Velocity (tiempo promedio de cierre)
---
## 8. Referencias
- DDL: `database/ddl/schemas/sales/`
- Backend: `backend/src/modules/sales/`
- Frontend: `frontend/src/services/sales/`