# Sistema de Listas de Precios y Planes de Cuotas

## 📋 Objetivo
Crear un sistema flexible de listas de precios y planes de cuotas que se adapte a empresas pequeñas, medianas y grandes, con opciones de configuración manual y automática.

## 🎯 Casos de Uso

### Listas de Precios
1. **Empresa Pequeña:** Una lista única con precios base
2. **Empresa Mediana:** Múltiples listas (mayorista, minorista, VIP)
3. **Empresa Grande:** Listas por cliente, zona geográfica, canal de venta, temporada

### Planes de Cuotas
1. **Manual:** Usuario define cantidad de cuotas y monto de cada una
2. **Automático:** Sistema calcula según tasa de interés y plazo
3. **Mixto:** Entrada manual + cuotas automáticas
4. **Personalizado:** Cuotas con montos diferentes por período

## 🏗️ Estructura de Base de Datos

### 1. Listas de Precios

```sql
-- Tabla principal de listas de precios
CREATE TABLE listas_precios (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    empresa_id UUID NOT NULL REFERENCES empresas(id),
    codigo VARCHAR(20) NOT NULL,
    nombre VARCHAR(100) NOT NULL,
    descripcion TEXT,
    
    -- Configuración de aplicación
    tipo_aplicacion VARCHAR(20) DEFAULT 'general', -- general, cliente, zona, canal, temporada
    prioridad INTEGER DEFAULT 1, -- Para resolver conflictos entre listas
    
    -- Configuración de vigencia
    fecha_inicio DATE,
    fecha_fin DATE,
    activa BOOLEAN DEFAULT true,
    
    -- Configuración de descuentos/recargos
    aplica_descuento_general BOOLEAN DEFAULT false,
    descuento_porcentaje DECIMAL(5,2) DEFAULT 0,
    aplica_recargo_general BOOLEAN DEFAULT false,
    recargo_porcentaje DECIMAL(5,2) DEFAULT 0,
    
    -- Configuración de redondeo
    redondeo_activo BOOLEAN DEFAULT false,
    redondeo_tipo VARCHAR(10) DEFAULT 'normal', -- normal, arriba, abajo
    redondeo_decimales INTEGER DEFAULT 0,
    
    -- Metadatos
    created_at TIMESTAMP(6) DEFAULT NOW(),
    updated_at TIMESTAMP(6) DEFAULT NOW(),
    usuario_creacion VARCHAR(50),
    
    UNIQUE(empresa_id, codigo)
);

-- Precios específicos por producto en cada lista
CREATE TABLE lista_precios_productos (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    lista_precio_id UUID NOT NULL REFERENCES listas_precios(id) ON DELETE CASCADE,
    producto_id UUID NOT NULL REFERENCES productos(id) ON DELETE CASCADE,
    
    -- Precios
    precio_base DECIMAL(15,4) NOT NULL,
    precio_con_descuento DECIMAL(15,4),
    precio_final DECIMAL(15,4) NOT NULL, -- Precio final calculado
    
    -- Configuración específica del producto
    descuento_porcentaje DECIMAL(5,2) DEFAULT 0,
    recargo_porcentaje DECIMAL(5,2) DEFAULT 0,
    precio_minimo DECIMAL(15,4), -- Precio mínimo permitido
    precio_maximo DECIMAL(15,4), -- Precio máximo permitido
    
    -- Configuración de cuotas para este producto
    permite_cuotas BOOLEAN DEFAULT true,
    cuotas_maximas INTEGER DEFAULT 12,
    cuota_minima_monto DECIMAL(15,4),
    
    -- Metadatos
    created_at TIMESTAMP(6) DEFAULT NOW(),
    updated_at TIMESTAMP(6) DEFAULT NOW(),
    
    UNIQUE(lista_precio_id, producto_id)
);

-- Asignación de listas a entidades específicas
CREATE TABLE lista_precios_asignaciones (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    lista_precio_id UUID NOT NULL REFERENCES listas_precios(id) ON DELETE CASCADE,
    
    -- Tipo de asignación
    tipo_asignacion VARCHAR(20) NOT NULL, -- cliente, zona, canal, vendedor, categoria_cliente
    
    -- Referencias según tipo
    cliente_id UUID REFERENCES clientes(id),
    zona_geografica VARCHAR(100),
    canal_venta VARCHAR(50),
    vendedor_id UUID REFERENCES vendedores_cobradores(id),
    categoria_cliente VARCHAR(50),
    
    -- Configuración de la asignación
    activa BOOLEAN DEFAULT true,
    fecha_inicio DATE,
    fecha_fin DATE,
    prioridad INTEGER DEFAULT 1,
    
    created_at TIMESTAMP(6) DEFAULT NOW(),
    updated_at TIMESTAMP(6) DEFAULT NOW()
);
```

### 2. Planes de Cuotas

```sql
-- Tabla principal de planes de cuotas
CREATE TABLE planes_cuotas (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    empresa_id UUID NOT NULL REFERENCES empresas(id),
    codigo VARCHAR(20) NOT NULL,
    nombre VARCHAR(100) NOT NULL,
    descripcion TEXT,
    
    -- Configuración del plan
    tipo_calculo VARCHAR(20) NOT NULL, -- manual, automatico, mixto
    cantidad_cuotas INTEGER NOT NULL,
    
    -- Para cálculo automático
    tasa_interes DECIMAL(8,4) DEFAULT 0, -- Tasa de interés mensual
    tipo_interes VARCHAR(20) DEFAULT 'simple', -- simple, compuesto
    incluye_entrada BOOLEAN DEFAULT false,
    porcentaje_entrada DECIMAL(5,2) DEFAULT 0,
    
    -- Configuraciones adicionales
    permite_cuotas_variables BOOLEAN DEFAULT false,
    redondeo_cuotas BOOLEAN DEFAULT true,
    redondeo_decimales INTEGER DEFAULT 0,
    
    -- Restricciones
    monto_minimo DECIMAL(15,4),
    monto_maximo DECIMAL(15,4),
    activo BOOLEAN DEFAULT true,
    
    -- Metadatos
    created_at TIMESTAMP(6) DEFAULT NOW(),
    updated_at TIMESTAMP(6) DEFAULT NOW(),
    usuario_creacion VARCHAR(50),
    
    UNIQUE(empresa_id, codigo)
);

-- Detalle de cuotas para planes manuales o mixtos
CREATE TABLE plan_cuotas_detalle (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    plan_cuota_id UUID NOT NULL REFERENCES planes_cuotas(id) ON DELETE CASCADE,
    numero_cuota INTEGER NOT NULL,
    
    -- Para cuotas manuales
    porcentaje_monto DECIMAL(8,4), -- Porcentaje del total
    monto_fijo DECIMAL(15,4), -- Monto fijo específico
    
    -- Para cuotas automáticas con variaciones
    dias_vencimiento INTEGER DEFAULT 30, -- Días desde la cuota anterior
    aplica_interes BOOLEAN DEFAULT true,
    tasa_interes_especifica DECIMAL(8,4), -- Si es diferente a la general
    
    -- Configuración adicional
    descripcion VARCHAR(200),
    es_entrada BOOLEAN DEFAULT false,
    obligatoria BOOLEAN DEFAULT true,
    
    created_at TIMESTAMP(6) DEFAULT NOW(),
    
    UNIQUE(plan_cuota_id, numero_cuota)
);

-- Historial de cálculos de cuotas aplicados
CREATE TABLE cuotas_calculadas (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    
    -- Referencias
    factura_id UUID REFERENCES factura_cab(id),
    plan_cuota_id UUID REFERENCES planes_cuotas(id),
    cliente_id UUID REFERENCES clientes(id),
    
    -- Datos del cálculo
    monto_total DECIMAL(15,4) NOT NULL,
    monto_entrada DECIMAL(15,4) DEFAULT 0,
    monto_financiado DECIMAL(15,4) NOT NULL,
    cantidad_cuotas INTEGER NOT NULL,
    tasa_interes_aplicada DECIMAL(8,4),
    
    -- Resultado del cálculo
    tipo_calculo VARCHAR(20), -- manual, automatico, mixto
    cuotas_json JSONB NOT NULL, -- Array con el detalle de cada cuota
    
    -- Estado
    estado VARCHAR(20) DEFAULT 'activo', -- activo, cancelado, refinanciado
    
    -- Metadatos
    created_at TIMESTAMP(6) DEFAULT NOW(),
    updated_at TIMESTAMP(6) DEFAULT NOW(),
    usuario_calculo VARCHAR(50)
);

-- Detalle individual de cada cuota calculada
CREATE TABLE cuotas_individuales (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    cuota_calculada_id UUID NOT NULL REFERENCES cuotas_calculadas(id) ON DELETE CASCADE,
    numero_cuota INTEGER NOT NULL,
    
    -- Datos de la cuota
    monto_cuota DECIMAL(15,4) NOT NULL,
    monto_capital DECIMAL(15,4) NOT NULL,
    monto_interes DECIMAL(15,4) DEFAULT 0,
    saldo_pendiente DECIMAL(15,4) NOT NULL,
    
    -- Fechas
    fecha_vencimiento DATE NOT NULL,
    fecha_pago DATE,
    
    -- Estado
    estado VARCHAR(20) DEFAULT 'pendiente', -- pendiente, pagado, vencido, refinanciado
    monto_pagado DECIMAL(15,4) DEFAULT 0,
    
    -- Referencias de pago
    recibo_cobro_id UUID REFERENCES recibos_cobro(id),
    
    created_at TIMESTAMP(6) DEFAULT NOW(),
    updated_at TIMESTAMP(6) DEFAULT NOW(),
    
    UNIQUE(cuota_calculada_id, numero_cuota)
);
```

### 3. Configuraciones Empresariales

```sql
-- Configuraciones generales de precios y cuotas por empresa
CREATE TABLE configuracion_precios_empresa (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    empresa_id UUID NOT NULL UNIQUE REFERENCES empresas(id),
    
    -- Configuración de listas de precios
    lista_precio_default_id UUID REFERENCES listas_precios(id),
    permite_multiples_listas BOOLEAN DEFAULT true,
    resolucion_conflictos VARCHAR(20) DEFAULT 'prioridad', -- prioridad, menor_precio, mayor_precio
    
    -- Configuración de cuotas
    plan_cuotas_default_id UUID REFERENCES planes_cuotas(id),
    permite_cuotas_manuales BOOLEAN DEFAULT true,
    permite_cuotas_automaticas BOOLEAN DEFAULT true,
    cuotas_maximas_general INTEGER DEFAULT 24,
    tasa_interes_default DECIMAL(8,4) DEFAULT 0,
    
    -- Configuración de descuentos
    permite_descuentos_adicionales BOOLEAN DEFAULT true,
    descuento_maximo_porcentaje DECIMAL(5,2) DEFAULT 50,
    requiere_autorizacion_descuentos BOOLEAN DEFAULT false,
    
    -- Configuración de redondeo
    redondeo_precios_activo BOOLEAN DEFAULT false,
    redondeo_cuotas_activo BOOLEAN DEFAULT true,
    redondeo_decimales INTEGER DEFAULT 0,
    
    created_at TIMESTAMP(6) DEFAULT NOW(),
    updated_at TIMESTAMP(6) DEFAULT NOW()
);
```

## 🔧 Funcionalidades Principales

### 1. Gestión de Listas de Precios
- **Creación flexible:** Por cliente, zona, canal, temporada
- **Priorización:** Sistema de resolución de conflictos
- **Vigencia:** Fechas de inicio y fin
- **Descuentos/Recargos:** Generales y específicos por producto
- **Redondeo:** Configuración de decimales

### 2. Planes de Cuotas
- **Manual:** Usuario define cada cuota individualmente
- **Automático:** Cálculo con tasa de interés
- **Mixto:** Entrada manual + cuotas automáticas
- **Flexible:** Cuotas variables, diferentes vencimientos

### 3. Cálculo Inteligente
- **Interés Simple/Compuesto:** Según configuración
- **Entrada opcional:** Porcentaje o monto fijo
- **Redondeo inteligente:** Para facilitar pagos
- **Validaciones:** Montos mínimos y máximos

### 4. Integración con Facturación
- **Aplicación automática:** Según cliente y producto
- **Historial completo:** Trazabilidad de cálculos
- **Estados de cuotas:** Seguimiento de pagos
- **Refinanciación:** Posibilidad de recalcular

## 📊 Casos de Uso Específicos

### Empresa Pequeña
```sql
-- Lista única con precios simples
INSERT INTO listas_precios (empresa_id, codigo, nombre, tipo_aplicacion) 
VALUES ('empresa-id', 'GENERAL', 'Lista General', 'general');

-- Plan de cuotas simple
INSERT INTO planes_cuotas (empresa_id, codigo, nombre, tipo_calculo, cantidad_cuotas, tasa_interes)
VALUES ('empresa-id', 'CUOTAS3', '3 Cuotas sin interés', 'automatico', 3, 0);
```

### Empresa Mediana
```sql
-- Múltiples listas
INSERT INTO listas_precios (empresa_id, codigo, nombre, tipo_aplicacion, prioridad) VALUES
('empresa-id', 'MAYORISTA', 'Precios Mayorista', 'general', 1),
('empresa-id', 'MINORISTA', 'Precios Minorista', 'general', 2),
('empresa-id', 'VIP', 'Clientes VIP', 'cliente', 3);

-- Planes variados
INSERT INTO planes_cuotas (empresa_id, codigo, nombre, tipo_calculo, cantidad_cuotas, tasa_interes) VALUES
('empresa-id', 'SIN_INTERES', '6 Cuotas sin interés', 'automatico', 6, 0),
('empresa-id', 'CON_INTERES', '12 Cuotas con interés', 'automatico', 12, 2.5),
('empresa-id', 'MANUAL', 'Plan Manual', 'manual', 4, 0);
```

### Empresa Grande
```sql
-- Listas especializadas
INSERT INTO listas_precios (empresa_id, codigo, nombre, tipo_aplicacion) VALUES
('empresa-id', 'ZONA_NORTE', 'Zona Norte', 'zona'),
('empresa-id', 'CANAL_ONLINE', 'Canal Online', 'canal'),
('empresa-id', 'TEMPORADA_ALTA', 'Temporada Alta', 'temporada');

-- Asignaciones específicas
INSERT INTO lista_precios_asignaciones (lista_precio_id, tipo_asignacion, cliente_id) 
VALUES ('lista-id', 'cliente', 'cliente-vip-id');
```

## 🚀 Ventajas del Sistema

### Flexibilidad
- ✅ Se adapta a cualquier tamaño de empresa
- ✅ Configuración granular por producto
- ✅ Múltiples criterios de aplicación
- ✅ Planes de cuotas híbridos

### Escalabilidad
- ✅ Estructura modular
- ✅ Fácil adición de nuevos tipos
- ✅ Optimización con índices
- ✅ Historial completo

### Usabilidad
- ✅ Configuración intuitiva
- ✅ Cálculos automáticos
- ✅ Validaciones de negocio
- ✅ Trazabilidad completa

---

**Próximos Pasos:**
1. Implementar migraciones de base de datos
2. Crear servicios de cálculo
3. Desarrollar APIs REST
4. Crear interfaces de usuario
5. Testing con casos reales
