# CHANGELOG v1.5.4

## 📋 Fecha
24 de enero de 2026

## 🎯 Tipo de Release
**BUGFIX CRÍTICO** - Normalización de formato de respuesta API

---

## ❌ PROBLEMA IDENTIFICADO

### Cambio en Formato de Respuesta del API

La nueva API retorna un formato **diferente** al esperado por el código:

**Formato NUEVO (API v2):**
```json
{
  "idTema": 29,
  "variables": [
    {
      "idVariable": 232,
      "codigoVariable": "XDC_USA_B",
      "variable": "Tipo de cambio de compra promedio del mes"
    },
    ...
  ],
  "paises": [
    {"id": 3, "nombre": "Costa Rica"},
    ...
  ]
}
```

**Formato ESPERADO (código actual):**
```json
[
  {
    "idVariable": 232,
    "codigoVariable": "XDC_USA_B",
    "variable": "Tipo de cambio de compra promedio del mes"
  },
  ...
]
```

### Síntoma
- La URL era correcta: `http://192.168.100.137:8081/simafir_api/ws/public/v1/criterios/TIP_CAMBIO_MERCADO`
- La API respondía correctamente (HTTP 200)
- Pero el shortcode mostraba "Error de Conexión" porque `$all[0]` no existía
- El código esperaba un array directo, pero recibía un objeto con `variables`, `paises` y `idTema`

---

## ✅ SOLUCIÓN IMPLEMENTADA

### Normalización Automática del Formato

Se agregó lógica en `get_report_variables()` para **detectar y normalizar** la respuesta:

```php
$myJSONArray = json_decode($data, true);

// NUEVO: Normalizar formato de respuesta
// La nueva API retorna: {"idTema": X, "variables": [...], "paises": [...]}
// El código espera: array directo de variables
if (is_array($myJSONArray) && isset($myJSONArray['variables'])) {
    // Formato nuevo detectado, extraer solo el array de variables
    if (is_user_logged_in() && function_exists('is_user_logged_in')) {
        echo "<div style='background: #e3f2fd; border-left: 4px solid #2196F3; padding: 12px; margin: 10px 0;'>";
        echo "<strong>🔄 Formato Normalizado</strong><br>";
        echo "<code>Detectado formato nuevo con 'variables' key</code><br>";
        echo "<code>Total variables: " . count($myJSONArray['variables']) . "</code>";
        echo "</div>";
    }
    return $myJSONArray['variables'];
}

return $myJSONArray;
```

### Funcionamiento

1. **Detecta** si la respuesta tiene la key `variables`
2. **Extrae** solo el array de variables (el que el código necesita)
3. **Retorna** en el formato esperado por el shortcode
4. **Muestra debug** (solo para usuarios logueados) confirmando la normalización

---

## 🔧 FUNCIONES ACTUALIZADAS

### inc/api.php (1 función)
- ✅ `get_report_variables()` - líneas 181-195
  - Agregada lógica de normalización de formato
  - Detección automática del formato nuevo vs. viejo
  - Extracción de `variables` array cuando existe
  - Debug logging para confirmar normalización

---

## 🧪 VALIDACIÓN

### Logs de Debug Esperados

Al cargar una página de parámetros, verás:

```
🔍 DEBUG get_report_variables()
URL: http://192.168.100.137:8081/simafir_api/ws/public/v1/criterios/TIP_CAMBIO_MERCADO
Data param: TIP_CAMBIO_MERCADO

📥 Response (primeros 500 chars)
{"idTema":29,"variables":[...], "paises":[...]}

🔄 Formato Normalizado
Detectado formato nuevo con 'variables' key
Total variables: 4
```

### Tests Recomendados

1. ✅ **SECMCA - Tipos de Cambio**: 
   - URL: `/params/?cid=3&scid=0&data=TIP_CAMBIO_MERCADO...`
   - Debe mostrar las 4 variables de tipo de cambio
   
2. ✅ **SECMCA - IPC**: 
   - URL: `/params/?data=IPC...`
   - Debe mostrar las variables de inflación
   
3. ✅ **SECMCA - PIB**: 
   - URL: `/params/?data=PIB_TRIMESTRAL_REAL...`
   - Debe mostrar las variables del PIB

### Validación de Funcionamiento

```bash
# El shortcode NO debe mostrar el error de conexión
# Debe cargar correctamente la lista de variables
# Los selectores de variables deben estar poblados
```

---

## 📊 IMPACTO

### Archivos Modificados
- ✏️ `inc/api.php` - Función `get_report_variables()` actualizada
- ✏️ `secmca-api.php` - Versión actualizada a 1.5.4
- ✏️ `shortcodes/SIMAFIR/params-shortcode.php` - Mensaje de error usa URL correcta

### Compatibilidad
- ✅ **Retrocompatible**: Si la API retorna el formato viejo, funciona igual
- ✅ **Forward compatible**: Si la API retorna el formato nuevo, lo normaliza
- ✅ PHP 8.x compatible
- ✅ WordPress 5.0+
- ✅ No afecta base de datos
- ✅ No requiere cambios en shortcodes

### Rendimiento
- ⚡ Overhead mínimo: Solo un `isset()` check adicional
- ⚡ No agrega queries adicionales
- ⚡ Debug logs solo para usuarios logueados

---

## 🎯 BENEFICIOS

1. **Adaptabilidad**: Funciona con ambos formatos de API (viejo y nuevo)
2. **Transparencia**: El shortcode no necesita saber sobre el formato
3. **Debugging**: Los logs muestran exactamente qué está pasando
4. **Mantenibilidad**: Toda la lógica de normalización en un solo lugar
5. **Sin Breaking Changes**: Código existente sigue funcionando

---

## 📝 DEBUG LOGS (TEMPORALES)

Los siguientes logs están **activos** en esta versión para ayudar con el debugging:

1. **🔍 DEBUG get_report_variables()**: Muestra URL y parámetro
2. **📥 Response**: Primeros 500 chars de la respuesta
3. **🔄 Formato Normalizado**: Confirmación de normalización
4. **❌ CURL ERROR**: Si hay errores de conexión

**Nota**: Estos logs solo se muestran a **usuarios logueados** y pueden removerse en versiones futuras.

---

## ⚠️ PRÓXIMOS PASOS

1. **Probar v1.5.4** en el servidor con datos reales
2. **Confirmar** que todos los endpoints de criterios funcionan
3. **Decidir** si mantener o remover los debug logs
4. **Continuar** con Etapa 4B (EMFA) y 4C (ESEA) si es necesario

---

## 📚 DOCUMENTACIÓN RELACIONADA

- CHANGELOG-v1.5.0.md - Migración original a nuevos endpoints
- CHANGELOG-v1.5.1-HOTFIX.md - Primer fix con ltrim()
- CHANGELOG-v1.5.2-HOTFIX2.md - Función clean_url()
- CHANGELOG-v1.5.3-DEBUG.md - Versión de diagnóstico (no publicada)

---

## 👨‍💻 RESUMEN TÉCNICO

**Versión**: 1.5.4  
**Tipo**: Bugfix  
**Urgencia**: Alta (feature bloqueada)  
**Breaking Changes**: No  
**Rollback**: Compatible con v1.5.2/v1.5.3  

**Root Cause**: API cambió formato de respuesta sin actualizar documentación  
**Fix**: Normalización automática del formato en `get_report_variables()`  
**Impact**: Bajo - Solo una función modificada  

**Testing Checklist**:
- [ ] Página de parámetros carga sin error
- [ ] Variables se muestran correctamente
- [ ] Selectores están poblados
- [ ] Debug logs son informativos (usuarios logueados)
- [ ] No hay errores 404 en logs del servidor

---

✅ **v1.5.4 LISTA PARA INSTALACIÓN**
