# 🔧 Diagnóstico y Soluciones para Envío de Errores en Devlyn

## 📋 Problemas Comunes y Soluciones

### 1. **Los Registros No Se Encuentran en la Base de Datos**

**Problema:** 
```
El reintento busca el registro original con:
WHERE consulta1.codigo = ? AND consulta1.enviado_devlyn = 0
```

Si el registro fue marcado manualmente como `enviado_devlyn = 1`, no se encontrará.

**Solución:**
```sql
-- Verificar qué registros existen para un código específico
SELECT 
    codigo, 
    id_Toperacion, 
    enviado_devlyn, 
    fecha,
    id_Unico
FROM OperacionPrueba 
WHERE codigo = 'EB5226053'
ORDER BY fecha DESC;
```

Si muestra `enviado_devlyn = 1` pero TAMBIÉN está en el archivo de errores, necesitas:
```sql
-- Opción 1: Marcar como NO enviado para reintentar
UPDATE OperacionPrueba 
SET enviado_devlyn = 0 
WHERE codigo = 'EB5226053' AND enviado_devlyn = 1;

-- Opción 2: O eliminar el registro del archivo de errores
-- (si ya fue enviado correctamente)
```

---

### 2. **Error HTTP 500 (API del servidor)**

**Problema:**
```
HTTP: 500
Error CURL: (empty)
Respuesta: Error interno del servidor de Devlyn
```

**Causas:**
- La API de Devlyn está temporalmente caída
- El token expiró o es inválido
- El JSON tiene formato incorrecto

**Soluciones:**

**a) Verificar el Token:**
```php
// En config_devlyn.php
define("DEVLYN_URL", "https://app.devlyn.me/WebApiAircond/api/Airdond/?token=8f52830d69966981c228a37b1961e01f");
// ☝️ Este token debe estar activo en Devlyn
```

**b) Reintentar después de esperar:**
```
1. Ve a: ver_errores.php
2. Espera 30 minutos (API puede recuperarse)
3. Presiona: "🔄 Reintento (Preview)"
4. Ejecuta: "▶️ Reintentar Ahora"
```

**c) Verificar JSON válido:**
```php
// Agregar en reintentar_errores.php línea ~115
$json_valido = json_decode($json, true);
if ($json_valido === null) {
    die("JSON INVÁLIDO: " . json_last_error_msg());
}
```

---

### 3. **Error HTTP 0 (Problema de Red/Conexión)**

**Problema:**
```
HTTP: 0
Error CURL: SSL certificate problem
        o Connection refused
        o Temporary failure in name resolution
```

**Soluciones:**

**a) Problema SSL:**
```php
// En funciones_devlyn.php línea ~9, agregar:
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
```

**b) Problema de conectividad:**
- Verificar si procesos.grupoac.mx puede alcanzar app.devlyn.me
- Abrir cmd y ejecutar: `ping app.devlyn.me`

**c) Timeout muy corto:**
```php
// En funciones_devlyn.php línea ~15
// Aumentar si hay conexión lenta:
CURLOPT_CONNECTTIMEOUT => 30,    // En lugar de 20
CURLOPT_TIMEOUT => 600            // En lugar de 300
```

---

### 4. **Estructura de Datos Incorrecta**

**Problema:**
El SQL query no reconstruye correctamente los movimientos (Recepción y Entrega).

**Solución - Depuración:**

Crear archivo temporal `C:\xampp\htdocs\GRUPOAC\procesos.grupoac.mx\Devlyn\debug_reintentos.php`:

```php
<?php
date_default_timezone_set("America/Mexico_City");
require_once("conexion.php");
require_once("config_devlyn.php");

// Reemplaza con un código real que esté en errores
$codigo_test = "EB5226053";

$sql = "
    SELECT
        consulta1.id_Unico,
        consulta1.id_unidodos,
        consulta1.codigo,
        consulta1.id_usuario,
        consulta1.fecha AS recepcion,
        consul2.fecha AS entrega,
        consul2.nombre,
        consul2.id_unidodos AS id_unidodos_entrega
    FROM OperacionPrueba consulta1
    INNER JOIN OperacionPrueba consul2
        ON consulta1.codigo = consul2.codigo
        AND consulta1.id_usuario = consul2.id_usuario
        AND consulta1.id_Toperacion = 'Recepcion'
        AND consul2.id_Toperacion = 'Entrega'
        AND consulta1.fecha <= consul2.fecha
    WHERE consulta1.codigo = ? 
        AND consulta1.enviado_devlyn = 0
    ORDER BY consulta1.fecha ASC
";

$stmt = $conexion->prepare($sql);
$stmt->bind_param("s", $codigo_test);
$stmt->execute();
$result = $stmt->get_result();

echo "<pre>";
echo "Buscando código: " . htmlspecialchars($codigo_test) . "\n";
echo "Registros encontrados: " . $result->num_rows . "\n\n";

while ($row = $result->fetch_assoc()) {
    print_r($row);
    echo "\n";
}

if ($result->num_rows === 0) {
    echo "❌ NO SE ENCONTRÓ REGISTRO\n";
    echo "Posibles causas:\n";
    echo "1. El código NO existe en OperacionPrueba\n";
    echo "2. El registro tiene enviado_devlyn = 1 (ya marcado como enviado)\n";
    echo "3. Falta la pareja Recepcion/Entrega\n";
}

$stmt->close();
?>
```

Acceder a: `http://procesos.grupoac.mx/Devlyn/debug_reintentos.php`

---

### 5. **El Archivo de Errores Está Vacío o Corrupto**

**Verificar contenido:**

```php
<?php
$archivo = "logs/errores_devlyn_" . date("Y-m-d") . ".txt";
$contenido = file_get_contents($archivo);

if ($contenido === false) {
    die("❌ Archivo no existe: " . $archivo);
}

if (empty($contenido)) {
    die("✓ El archivo existe pero está vacío");
}

echo "<pre>";
echo "Tamaño: " . filesize($archivo) . " bytes\n";
echo "Primeras 1000 caracteres:\n";
echo htmlspecialchars(substr($contenido, 0, 1000));
echo "\n\n";
echo "Número de bloques de error: " . substr_count($contenido, "========================================");
?>
```

---

### 6. **Solución Rápida: Resetear y Reintentar Manual**

Si todo falla, opción nuclear:

```sql
-- PASO 1: Ver cuántos están marcados como no enviados
SELECT COUNT(*) FROM OperacionPrueba 
WHERE enviado_devlyn = 0;

-- PASO 2: Obtener un código de error específico
-- (desde ver_errores.php)

-- PASO 3: Resetear ese código específico
UPDATE OperacionPrueba 
SET enviado_devlyn = 0 
WHERE codigo = 'EB5226053';

-- PASO 4: Ejecutar reintentar_errores.php desde el navegador
```

---

## 🚀 Paso a Paso: Solucionar Envío de Errores

### Caso 1: API de Devlyn caída (HTTP 500)
```
1. Verificar token en config_devlyn.php
2. Esperar 30-60 minutos
3. Reintentar
```

### Caso 2: Registro no existe en BD
```
1. Ejecutar: debug_reintentos.php
2. Si dice "NO SE ENCONTRÓ REGISTRO":
   - Resetear: UPDATE OperacionPrueba SET enviado_devlyn = 0 WHERE codigo = 'XXX'
3. Reintentar
```

### Caso 3: Error de conexión (HTTP 0)
```
1. Verificar: ping app.devlyn.me desde cmd
2. Si falla: problema de red/firewall
3. Si funciona: aumentar timeout en funciones_devlyn.php
4. Reintentar
```

### Caso 4: Los errores simplemente no se envían
```
1. Ver archivo de errores:
   http://procesos.grupoac.mx/Devlyn/logs/errores_devlyn_YYYY-MM-DD.txt
2. Si está vacío: no hay errores, todo OK ✓
3. Si tiene errores: ejecutar debug_reintentos.php para cada código
```

---

## 📊 Checklist de Diagnóstico

- [ ] Token en `config_devlyn.php` es válido
- [ ] Conexión a app.devlyn.me funciona (ping)
- [ ] Archivo de errores existe y tiene contenido
- [ ] BD tiene registros con `enviado_devlyn = 0`
- [ ] Pares Recepcion/Entrega existen para el código
- [ ] JSON generado es válido
- [ ] No hay reintentos pendientes bloqueados

---

**Versión**: 1.0  
**Fecha**: 2026-11-13  
**Próximo paso**: Corre `debug_reintentos.php` y comparte el resultado
