# Diagnóstico: Problema con Adrian Suarez

**Cliente:** Adrian Suarez (RUT: 4599310-8)  
**Problema:** No aparecen boletas pendientes en módulo de pagos, pero existen registros en BD

---

## 🔍 Análisis del Problema

### Query Actual de Boletas Pendientes

La función `getBoletasPendientesCliente` usa esta consulta:

```sql
SELECT 
    b.*, 
    d.monto AS total_boleta,
    b.total_boleta AS total_original
FROM boletas b
JOIN deudas d ON d.Id_boleta = b.id_boleta AND d.Id_cliente = b.id_cliente
WHERE b.id_cliente = ?
  AND b.estado_pago = 5      -- ⚠️ Requiere estado_pago = 5
  AND d.estado_deuda = 5     -- ⚠️ Requiere estado_deuda = 5
ORDER BY b.fecha_a_pagar ASC
```

### Posibles Causas

1. **Estado de pago incorrecto en tabla `boletas`**
   - `b.estado_pago` no es 5 (pendiente)
   - Puede estar en 0, 1, 2, 3, 4, etc.

2. **Estado de deuda incorrecto en tabla `deudas`**
   - `d.estado_deuda` no es 5 (pendiente)
   - Puede estar en otro estado

3. **Inconsistencia entre tablas**
   - Existe registro en `boletas` pero no en `deudas`
   - O viceversa

4. **Problema con el procedimiento almacenado**
   - `ingreso_lecturas_main` puede haber dejado datos inconsistentes

---

## 🔧 Queries de Diagnóstico

### 1. Verificar datos en tabla `boletas`

```sql
-- Ver todas las boletas del cliente
SELECT 
    id_boleta,
    num_boleta,
    fecha_a_pagar,
    total_boleta,
    estado_pago,
    CASE estado_pago
        WHEN 0 THEN 'Sin estado'
        WHEN 1 THEN 'Pagada'
        WHEN 2 THEN 'Parcialmente pagada'
        WHEN 3 THEN 'Anulada'
        WHEN 4 THEN 'Condonada'
        WHEN 5 THEN 'Pendiente'
        ELSE CONCAT('Desconocido: ', estado_pago)
    END as estado_texto
FROM boletas
WHERE id_cliente = (
    SELECT Id_cliente FROM clientes WHERE rut_cliente = '4599310-8'
)
ORDER BY fecha_a_pagar DESC;
```

### 2. Verificar datos en tabla `deudas`

```sql
-- Ver todas las deudas del cliente
SELECT 
    Id_deuda,
    Id_boleta,
    fecha,
    monto,
    estado_deuda,
    CASE estado_deuda
        WHEN 0 THEN 'Sin estado'
        WHEN 1 THEN 'Pagada'
        WHEN 2 THEN 'Parcialmente pagada'
        WHEN 3 THEN 'Anulada'
        WHEN 4 THEN 'Condonada'
        WHEN 5 THEN 'Pendiente'
        ELSE CONCAT('Desconocido: ', estado_deuda)
    END as estado_texto
FROM deudas
WHERE Id_cliente = (
    SELECT Id_cliente FROM clientes WHERE rut_cliente = '4599310-8'
)
ORDER BY fecha DESC;
```

### 3. Verificar relación entre boletas y deudas

```sql
-- Ver boletas con sus deudas asociadas
SELECT 
    b.id_boleta,
    b.num_boleta,
    b.fecha_a_pagar,
    b.total_boleta,
    b.estado_pago as estado_boleta,
    d.Id_deuda,
    d.monto as monto_deuda,
    d.estado_deuda,
    CASE 
        WHEN b.estado_pago = 5 AND d.estado_deuda = 5 THEN '✅ Debería aparecer'
        WHEN b.estado_pago != 5 THEN '❌ Estado boleta incorrecto'
        WHEN d.estado_deuda != 5 THEN '❌ Estado deuda incorrecto'
        WHEN d.Id_deuda IS NULL THEN '❌ Sin registro en deudas'
        ELSE '⚠️ Otro problema'
    END as diagnostico
FROM boletas b
LEFT JOIN deudas d ON d.Id_boleta = b.id_boleta AND d.Id_cliente = b.id_cliente
WHERE b.id_cliente = (
    SELECT Id_cliente FROM clientes WHERE rut_cliente = '4599310-8'
)
ORDER BY b.fecha_a_pagar DESC;
```

### 4. Verificar lecturas del cliente

```sql
-- Ver lecturas del cliente
SELECT 
    id_lectura,
    fecha_ingreso_lectura,
    lectura_mes_ant,
    lectura_mes_act,
    id_boleta,
    estado_pago,
    MONTH(fecha_ingreso_lectura) as mes,
    YEAR(fecha_ingreso_lectura) as anio
FROM lecturas_clie_mensual
WHERE id_cliente = (
    SELECT Id_cliente FROM clientes WHERE rut_cliente = '4599310-8'
)
ORDER BY fecha_ingreso_lectura DESC
LIMIT 10;
```

### 5. Verificar si hay lectura del mes actual

```sql
-- Ver si ya tiene lectura este mes
SELECT 
    COUNT(*) as lecturas_este_mes,
    MAX(fecha_ingreso_lectura) as ultima_lectura
FROM lecturas_clie_mensual
WHERE id_cliente = (
    SELECT Id_cliente FROM clientes WHERE rut_cliente = '4599310-8'
)
  AND MONTH(fecha_ingreso_lectura) = MONTH(CURDATE())
  AND YEAR(fecha_ingreso_lectura) = YEAR(CURDATE());
```

---

## 🎯 Soluciones Posibles

### Solución 1: Corregir estados manualmente

Si los estados están incorrectos:

```sql
-- Actualizar estado de boleta a pendiente (5)
UPDATE boletas 
SET estado_pago = 5
WHERE id_boleta = [ID_BOLETA]
  AND id_cliente = (SELECT Id_cliente FROM clientes WHERE rut_cliente = '4599310-8');

-- Actualizar estado de deuda a pendiente (5)
UPDATE deudas
SET estado_deuda = 5
WHERE Id_boleta = [ID_BOLETA]
  AND Id_cliente = (SELECT Id_cliente FROM clientes WHERE rut_cliente = '4599310-8');
```

### Solución 2: Crear registro en deudas si no existe

Si existe boleta pero no deuda:

```sql
-- Insertar deuda faltante
INSERT INTO deudas (Id_cliente, Id_boleta, fecha, monto, estado_deuda)
SELECT 
    b.id_cliente,
    b.id_boleta,
    b.fecha_a_pagar,
    b.total_boleta,
    5 as estado_deuda
FROM boletas b
WHERE b.id_boleta = [ID_BOLETA]
  AND b.id_cliente = (SELECT Id_cliente FROM clientes WHERE rut_cliente = '4599310-8')
  AND NOT EXISTS (
    SELECT 1 FROM deudas d 
    WHERE d.Id_boleta = b.id_boleta 
      AND d.Id_cliente = b.id_cliente
  );
```

### Solución 3: Mejorar la query de boletas pendientes

Modificar `getBoletasPendientesCliente` para ser más flexible:

```typescript
export async function getBoletasPendientesCliente(clienteId: number) {
  return await query(
    `SELECT 
        b.*, 
        COALESCE(d.monto, b.total_boleta) AS total_boleta,
        b.total_boleta AS total_original,
        b.estado_pago,
        d.estado_deuda
     FROM boletas b
     LEFT JOIN deudas d ON d.Id_boleta = b.id_boleta AND d.Id_cliente = b.id_cliente
     WHERE b.id_cliente = ?
       AND (
         (b.estado_pago = 5 AND d.estado_deuda = 5)  -- Caso normal
         OR (b.estado_pago = 5 AND d.Id_deuda IS NULL)  -- Boleta sin deuda
         OR (b.estado_pago IN (0, 2) AND d.estado_deuda = 5)  -- Estados alternativos
       )
     ORDER BY b.fecha_a_pagar ASC`,
    [clienteId]
  );
}
```

---

## 📋 Pasos Recomendados

1. **Ejecutar queries de diagnóstico** en MySQL
2. **Identificar el problema específico** (estado incorrecto, registro faltante, etc.)
3. **Aplicar solución correspondiente**
4. **Verificar en la app** que ahora aparezcan las boletas
5. **Documentar la causa** para evitar que vuelva a ocurrir

---

## ⚠️ Prevención Futura

### Agregar validación en procedimiento almacenado

El procedimiento `ingreso_lecturas_main` debería garantizar que:
- Siempre crea registro en `deudas` cuando crea boleta
- Siempre establece `estado_pago = 5` en boletas nuevas
- Siempre establece `estado_deuda = 5` en deudas nuevas

### Agregar constraint en BD

```sql
-- Asegurar que toda boleta tenga su deuda
-- (Esto requeriría modificar el esquema)
ALTER TABLE boletas 
ADD CONSTRAINT fk_boleta_deuda 
FOREIGN KEY (id_boleta, id_cliente) 
REFERENCES deudas(Id_boleta, Id_cliente);
```

---

## 🔍 Siguiente Paso

**Ejecuta las queries de diagnóstico** y comparte los resultados para identificar la causa exacta.
