# Diseño: Sistema de Recordatorios de Pago de Paquetes

## 1. ANÁLISIS DEL PROBLEMA
Basado en la imagen de ejemplo, necesitamos:
- Registrar **paquetes** (procedimientos/servicios) con sesiones incluidas
- Ofrecer **2 formas de pago**:
  - **Contado**: Pago único 100% con fecha de recordatorio
  - **Partes**: Múltiples cuotas (máx 2 para Terapia Física según imagen) con fechas y montos
- Generar **recordatorios automáticos** para pagos pendientes

---

## 2. ESTRUCTURA DE TABLAS PROPUESTA

### Tabla: `paquetes_pagos` (Nueva)
Almacena los paquetes con sus opciones de pago

```sql
CREATE TABLE paquetes_pagos (
    id INT PRIMARY KEY AUTO_INCREMENT,
    historia_id INT NOT NULL,
    nombre VARCHAR(255) NOT NULL,
    descripcion TEXT,
    num_sesiones INT NOT NULL,
    precio_total DECIMAL(10, 2) NOT NULL,
    
    -- Tipo de pago elegido
    tipo_pago ENUM('contado', 'partes') NOT NULL DEFAULT 'contado',
    
    -- Fecha de recordatorio (para contado) o primera cuota
    fecha_recordatorio DATETIME NOT NULL,
    
    -- Estado
    estado ENUM('pendiente', 'pagado_parcial', 'pagado_completo', 'cancelado') NOT NULL DEFAULT 'pendiente',
    
    -- Auditoría
    created DATETIME DEFAULT CURRENT_TIMESTAMP,
    modified DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    user_id INT NOT NULL,
    
    -- Foreign Keys
    FOREIGN KEY (historia_id) REFERENCES historias_clinicas(id) ON DELETE CASCADE,
    FOREIGN KEY (user_id) REFERENCES users(id),
    
    INDEX (historia_id),
    INDEX (estado),
    INDEX (fecha_recordatorio)
);
```

**Campos clave:**
- `tipo_pago`: Define si es "contado" o "partes"
- `fecha_recordatorio`: Para "contado" es la fecha única; para "partes" se ignorará (se usa tabla de cuotas)
- `estado`: Rastrea el progreso del pago

---

### Tabla: `paquetes_pagos_cuotas` (Nueva)
Detalles de cada cuota cuando el pago es en partes

```sql
CREATE TABLE paquetes_pagos_cuotas (
    id INT PRIMARY KEY AUTO_INCREMENT,
    paquete_pago_id INT NOT NULL,
    
    -- Título referencial (Ej: "Cuota N° 01 (60%)" o "Cuota N° 02 (40%)")
    titulo_referencial VARCHAR(255) NOT NULL,
    
    monto DECIMAL(10, 2) NOT NULL,
    
    -- Fecha de recordatorio para esta cuota
    fecha_recordatorio DATETIME NOT NULL,
    
    -- Estado de la cuota
    estado ENUM('pendiente', 'pagado') NOT NULL DEFAULT 'pendiente',
    fecha_pago DATETIME,
    
    -- Auditoría
    created DATETIME DEFAULT CURRENT_TIMESTAMP,
    modified DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    -- Foreign Key
    FOREIGN KEY (paquete_pago_id) REFERENCES paquetes_pagos(id) ON DELETE CASCADE,
    
    INDEX (paquete_pago_id),
    INDEX (estado),
    INDEX (fecha_recordatorio)
);
```

**Campos clave:**
- `titulo_referencial`: Texto descriptivo (Ej: "Cuota N° 01 (60%)", "Cuota N° 02 (40%)")
- `monto`: Monto a pagar en esta cuota
- `fecha_recordatorio`: Fecha específica cuando se debe cobrar esta cuota
- `estado`: Rastrea si la cuota está pagada

---

## 3. RELACIONES ENTRE TABLAS

```
HistoriasClinicas (1)
    ↓
    └─→ PaquetesPagos (N)
            ↓
            └─→ PaquetesPagosCuotas (N) [Solo cuando tipo_pago = 'partes']

RecordatoriosControles (referencia en Home)
    └─→ Muestra recordatorios de pagos de paquetes pendientes
        (similar a cómo muestra otros recordatorios)
```

---

## 4. LÓGICA DE NEGOCIO

### A. CREACIÓN DE PAQUETE CON PAGO AL CONTADO
```
1. Usuario selecciona:
   - Paquete (nombre, descripción)
   - Número de sesiones
   - Precio total
   - Tipo de pago: CONTADO
   - Fecha del recordatorio

2. Sistema:
   - Inserta registro en paquetes_pagos
   - tipo_pago = 'contado'
   - fecha_recordatorio = fecha seleccionada
   - estado = 'pendiente'
   - NO crea registros en paquetes_pagos_cuotas
   
3. Resultado: 1 recordatorio simple
```

### B. CREACIÓN DE PAQUETE CON PAGO EN PARTES
```
1. Usuario selecciona:
   - Paquete (nombre, descripción)
   - Número de sesiones
   - Precio total
   - Tipo de pago: PARTES
   - Número de cuotas (1-2 para Terapia Física, según imagen)
   
2. Sistema:
   - Inserta registro en paquetes_pagos
   - tipo_pago = 'partes'
   - fecha_recordatorio = NULL o fecha primera cuota
   - estado = 'pendiente'
   
3. Crea cuotas según lo configurado:
   Ej: 2 cuotas
   - Cuota 1: 60%, fecha = HOY
   - Cuota 2: 40%, fecha = HOY + 30 días (configurable)
   
   Inserta en paquetes_pagos_cuotas (1 por cada cuota)
   
4. Resultado: N recordatorios (1 por cuota)
```

### C. FLUJO DE RECORDATORIO SIMPLE (CONTADO)
```
En la UI de paciente → Recordatorios de Pago:
- Mostrar tabla con:
  | PAQUETE | N° SESIONES | PRECIO | FORMA PAGO | FECHA RECORDATORIO | ESTADO | ACCIONES |
  | --------|-------------|--------|------------|-------------------|--------|----------|
  | Limpieza| 5           | $500   | Contado    | 30-05-2026        | Pendiente | Ver Pago |

- Campo de recordatorio:
  Mostrar: "Pago: $500 - Recordatorio: 30-05-2026"
```

### D. FLUJO DE RECORDATORIO CON CUOTAS (PARTES)
```
En la UI de paciente → Recordatorios de Pago:
- Mostrar tabla con:
  | PAQUETE | N° SESIONES | PRECIO | FORMA PAGO | ESTADO | ACCIONES |
  |---------|-------------|--------|------------|--------|----------|
  | Terapia | 8           | $800   | Partes     | Pend.  | Ver Cuotas |

- Al expandir/click en "Ver Cuotas":
  
  Tabla de Cuotas:
  | N° DE CUOTA | PORCENTAJE | MONTO  | FECHA RECORDATORIO | ESTADO |
  |-------------|------------|--------|-------------------|--------|
  | Cuota N° 01 | 60%        | $480   | 30-05-2026        | Pendiente |
  | Cuota N° 02 | 40%        | $320   | 29-06-2026        | Pendiente |
```

### E. ACTUALIZACIÓN DE ESTADO
```
Cuando se registra un pago en ventas_pagos:
- Si es CONTADO:
  → paquetes_pagos.estado = 'pagado_completo'
  
- Si es PARTES:
  → Actualizar paquetes_pagos_cuotas.estado = 'pagado'
  → Si TODAS las cuotas están pagadas:
     └─→ paquetes_pagos.estado = 'pagado_completo'
  → Si ALGUNAS están pagadas:
     └─→ paquetes_pagos.estado = 'pagado_parcial'
```

---

## 5. PANTALLA DE USUARIO (UI en view.php)

### Sección: "Recordatorios de Pago de Paquetes"
```
┌─────────────────────────────────────────┐
│ Recordatorios de Pago de Paquetes       │
├─────────────────────────────────────────┤
│ [+ NUEVO PAQUETE]                       │
├─────────────────────────────────────────┤
│                                         │
│ TABLA DE PAQUETES                       │
│ ┌─────────────────────────────────────┐ │
│ │ Paquete │ Sesiones │ Precio │ Pago  │ │
│ ├─────────────────────────────────────┤ │
│ │ Terapia │    8     │ $800   │Partes │ │
│ │ Facial  │    3     │ $500   │Contado│ │
│ └─────────────────────────────────────┘ │
│                                         │
│ FORMULARIO: Nuevo Paquete               │
│ ┌─────────────────────────────────────┐ │
│ │ Nombre Paquete: [_____________]    │ │
│ │ N° Sesiones: [___]                  │ │
│ │ Precio Total: [_________]           │ │
│ │                                     │ │
│ │ Forma de Pago:                      │ │
│ │ ○ Al Contado                        │ │
│ │   Fecha Recordatorio: [2026-06-15]  │ │
│ │                                     │ │
│ │ ○ En Partes                         │ │
│ │   N° Cuotas: [2] (máx según config) │ │
│ │                                     │ │
│ │   [Tabla de cuotas se genera aquí]  │ │
│ │   Cuota 1: 60% | $480 | [fecha]    │ │
│ │   Cuota 2: 40% | $320 | [fecha]    │ │
│ │                                     │ │
│ │ [GUARDAR] [CANCELAR]                │ │
│ └─────────────────────────────────────┘ │
│                                         │
└─────────────────────────────────────────┘
```

---

## 6. MIGRATIONS A CREAR

### Migration 1: CreatePaquetesPagos
```php
$this->table('paquetes_pagos');
→ Crear tabla base
```

### Migration 2: CreatePaquetesPagosCuotas
```php
$this->table('paquetes_pagos_cuotas');
→ Crear tabla de cuotas
```

---

## 7. CASOS DE USO IMPLEMENTADOS

✅ **Caso 1**: Crear paquete con pago contado
- Usuario selecciona paquete, sesiones, precio, fecha recordatorio
- Sistema crea 1 registro en paquetes_pagos
- Resultado: 1 recordatorio

✅ **Caso 2**: Crear paquete con pago en partes
- Usuario selecciona paquete, sesiones, precio, número de cuotas
- Sistema crea 1 registro en paquetes_pagos + N registros en paquetes_pagos_cuotas
- Resultado: N recordatorios (uno por cuota)

✅ **Caso 3**: Ver recordatorios pendientes
- Lista todos los paquetes del paciente
- Muestra fecha de recordatorio y estado

✅ **Caso 4**: Registrar pago
- Marcar cuota/paquete como pagado
- Sistema actualiza estado automáticamente

---

## 8. PRÓXIMOS PASOS

1. **BD**: Crear migrations y ejecutarlas
2. **Models**: Crear entidades y tablas
3. **Controllers**: CRUD básico para paquetes_pagos
4. **Views**: Implementar UI en Pacientes/view.php
5. **Home**: Agregar recordatorios de pago en RecordatoriosControles (referencial, como otros recordatorios)

