# Modelo Híbrido de Comisiones - Aprovechando Arquitectura Existente

## 🏗️ ARQUITECTURA ACTUAL APROVECHABLE

Tu modelo `empresas` ya tiene:
- ✅ `parent_id` - Jerarquía padre-hijo
- ✅ `type` - Tipo de empresa
- ✅ Relación self-referencial

## 📊 MODELO HÍBRIDO PROPUESTO

### Escenarios de Venta:

#### 1. **VENTA DIRECTA** (Holding → Subsidiario)
```sql
-- Subsidiario compra directamente al holding
INSERT INTO empresas (type, parent_id, canal_venta) 
VALUES ('subsidiario', 'holding_id', 'directo');

-- Suscripción sin comisiones intermedias
INSERT INTO suscripciones (empresa_id, vendida_por_empresa_id, comision_aplicada)
VALUES ('subsidiario_id', 'holding_id', 0);
```

#### 2. **VENTA POR RESELLER** (Holding → Reseller → Subsidiario)
```sql
-- Reseller es hijo del holding
INSERT INTO empresas (type, parent_id, comision_porcentaje) 
VALUES ('reseller', 'holding_id', 20.00);

-- Subsidiario es hijo del reseller
INSERT INTO empresas (type, parent_id, canal_venta, holding_empresa_id) 
VALUES ('subsidiario', 'reseller_id', 'reseller', 'holding_id');

-- Suscripción con comisión para reseller
INSERT INTO suscripciones (empresa_id, vendida_por_empresa_id, comision_aplicada)
VALUES ('subsidiario_id', 'reseller_id', 20.00);
```

## 💰 SISTEMA DE COMISIONES INTELIGENTE

### Cálculo Automático de Comisiones:

```typescript
// Función para calcular comisiones basada en jerarquía
async function calcularComisiones(suscripcionId: string) {
  const suscripcion = await prisma.suscripciones.findUnique({
    where: { id: suscripcionId },
    include: {
      empresas: {
        include: {
          empresas: true, // parent empresa
        }
      }
    }
  });

  const empresa = suscripcion.empresas;
  const parent = empresa.empresas; // empresa padre

  // Si tiene padre y el padre no es holding, hay comisión
  if (parent && parent.type !== 'holding') {
    const comisionPorcentaje = parent.comision_porcentaje || 0;
    const montoComision = suscripcion.costo_mensual * (comisionPorcentaje / 100);
    
    // Crear registro de comisión
    await prisma.comisiones.create({
      data: {
        suscripcion_id: suscripcionId,
        empresa_beneficiaria_id: parent.id,
        empresa_pagadora_id: empresa.id,
        porcentaje: comisionPorcentaje,
        monto_base: suscripcion.costo_mensual,
        monto_comision: montoComision,
        tipo_comision: 'mensual',
        estado: 'pendiente'
      }
    });
  }
}
```

## 🎯 VENTAJAS DEL MODELO HÍBRIDO

### Para el **HOLDING**:
- **Flexibilidad Total**: Puede vender directo o por resellers
- **Máximo Margen**: Ventas directas = 100% del precio
- **Escalabilidad**: Resellers expanden el mercado
- **Control**: Mantiene relación directa con algunos clientes clave

### Para **RESELLERS**:
- **Territorio Protegido**: Sus subsidiarios no pueden ser contactados directamente
- **Margen Libre**: Pueden definir sus precios de venta
- **Comisiones Recurrentes**: Ingresos mensuales predecibles
- **Crecimiento**: Incentivo para conseguir más subsidiarios

### Para **SUBSIDIARIOS**:
- **Opciones**: Pueden elegir comprar directo o por reseller
- **Soporte Local**: Resellers ofrecen soporte cercano
- **Precios Competitivos**: Competencia entre canales

## 📈 PROYECCIÓN DE INGRESOS

### Ejemplo con 100 Subsidiarios:
```
Escenario A: 100% Venta Directa
- 100 subsidiarios × $100/mes = $10,000/mes
- Comisiones: $0
- Ingreso neto: $10,000/mes

Escenario B: 50% Directo + 50% Reseller
- 50 directos × $100/mes = $5,000/mes
- 50 por reseller × $100/mes = $5,000/mes
- Comisiones resellers: $5,000 × 20% = $1,000/mes
- Ingreso neto: $9,000/mes
- PERO: Potencial de crecimiento exponencial por resellers

Escenario C: Crecimiento por Resellers
- Año 1: 100 subsidiarios (50 directos + 50 reseller)
- Año 2: 300 subsidiarios (50 directos + 250 reseller)
- Año 3: 800 subsidiarios (50 directos + 750 reseller)
- Ingreso Año 3: $50,000 + $60,000 - $15,000 = $95,000/mes
```

## 🔧 IMPLEMENTACIÓN TÉCNICA

### 1. Migraciones SQL:
```sql
-- Agregar campos necesarios
ALTER TABLE empresas ADD COLUMN comision_porcentaje DECIMAL(5,2) DEFAULT 0;
ALTER TABLE empresas ADD COLUMN activo_para_ventas BOOLEAN DEFAULT true;
ALTER TABLE empresas ADD COLUMN limite_subsidiarios INTEGER DEFAULT NULL;
ALTER TABLE empresas ADD COLUMN canal_venta VARCHAR(20) DEFAULT 'directo';
ALTER TABLE empresas ADD COLUMN holding_empresa_id UUID REFERENCES empresas(id);

-- Actualizar type para empresas existentes
UPDATE empresas SET type = 'holding' WHERE parent_id IS NULL;
UPDATE empresas SET type = 'subsidiario' WHERE parent_id IS NOT NULL;

-- Agregar campos a suscripciones
ALTER TABLE suscripciones ADD COLUMN vendida_por_empresa_id UUID REFERENCES empresas(id);
ALTER TABLE suscripciones ADD COLUMN comision_aplicada DECIMAL(5,2) DEFAULT 0;
ALTER TABLE suscripciones ADD COLUMN precio_venta DECIMAL(10,2);
ALTER TABLE suscripciones ADD COLUMN precio_costo DECIMAL(10,2);
```

### 2. Servicios TypeScript:
```typescript
@Injectable()
export class JerarquiaEmpresasService {
  
  // Obtener todos los hijos de una empresa
  async getHijos(empresaId: string, incluirNietos = false) {
    if (incluirNietos) {
      return this.getJerarquiaCompleta(empresaId);
    }
    
    return this.prisma.empresas.findMany({
      where: { parent_id: empresaId },
      include: { suscripciones: true }
    });
  }

  // Validar si puede agregar más subsidiarios
  async validarLimites(resellerEmpresaId: string) {
    const reseller = await this.prisma.empresas.findUnique({
      where: { id: resellerEmpresaId },
      include: { other_empresas: true }
    });

    if (reseller.limite_subsidiarios) {
      const cantidadActual = reseller.other_empresas.length;
      return cantidadActual < reseller.limite_subsidiarios;
    }
    
    return true; // Sin límite
  }

  // Obtener el holding de cualquier empresa
  async getHolding(empresaId: string) {
    const empresa = await this.prisma.empresas.findUnique({
      where: { id: empresaId }
    });

    if (empresa.type === 'holding') {
      return empresa;
    }

    if (empresa.holding_empresa_id) {
      return this.prisma.empresas.findUnique({
        where: { id: empresa.holding_empresa_id }
      });
    }

    // Buscar recursivamente hacia arriba
    let current = empresa;
    while (current.parent_id) {
      current = await this.prisma.empresas.findUnique({
        where: { id: current.parent_id }
      });
      
      if (current.type === 'holding') {
        return current;
      }
    }

    return null;
  }
}
```

## 🎮 DASHBOARD DIFERENCIADO

### Dashboard HOLDING:
- **Vista General**: Total ingresos directos vs por resellers
- **Resellers**: Lista con métricas (subsidiarios, ventas, comisiones)
- **Subsidiarios Directos**: Lista y gestión
- **Comisiones**: Por pagar, pagadas, proyecciones
- **Configuración**: Precios base, comisiones por reseller

### Dashboard RESELLER:
- **Mis Subsidiarios**: Lista y gestión
- **Mis Comisiones**: Ganadas, pendientes, historial
- **Ventas**: Nuevas suscripciones, renovaciones
- **Precios**: Configurar precios de venta
- **Límites**: Estado actual vs límites asignados

### Dashboard SUBSIDIARIO:
- **Mi Suscripción**: Plan actual, próximo pago
- **Mi Reseller/Holding**: Información de contacto
- **Facturas**: Historial de pagos
- **Soporte**: Canal de comunicación

## 🚀 PLAN DE IMPLEMENTACIÓN

### Fase 1: Base de Datos (1-2 semanas)
- Migraciones SQL
- Actualizar modelos Prisma
- Scripts de migración de datos existentes

### Fase 2: Servicios Backend (2-3 semanas)
- JerarquiaEmpresasService
- ComisionesService
- PreciosResellerService
- Tests unitarios

### Fase 3: APIs (1-2 semanas)
- Endpoints para cada tipo de usuario
- Validaciones de permisos
- Documentación API

### Fase 4: Frontend (3-4 semanas)
- Dashboards diferenciados
- Gestión de jerarquía
- Reportes y métricas

### Fase 5: Testing y Deploy (1 semana)
- Testing integral
- Deploy gradual
- Monitoreo y ajustes
