# CHANGELOG v1.5.41 - SIMAFIR: Corrección Crítica de Orden de Parámetros

**Fecha:** 25 de enero de 2026  
**Tipo:** 🔴 HOTFIX CRÍTICO  
**Prioridad:** URGENTE - Afecta todas las consultas SIMAFIR  
**Módulo:** SIMAFIR API v1

---

## 🚨 PROBLEMA IDENTIFICADO

### Descripción del Error

El plugin estaba enviando los parámetros al API en el orden incorrecto, causando que:
- El **subjectID** (identificador del tema) se interpretara como **país**
- Los datos reales del **país** no llegaban en la posición correcta
- Las consultas fallaban o retornaban datos incorrectos

### Ejemplo del Error

**URL Generada (INCORRECTA):**
```
http://192.168.100.137:8081/simafir_api/ws/public/v1/obtenerDatos/porCriterio/1/14/3+13+50/39/265?startPeriod=...
                                                                                  ↑ subjectID (no es país!)
```

**URL Esperada por API (CORRECTA):**
```
http://192.168.100.137:8081/simafir_api/ws/public/v1/obtenerDatos/porCriterio/3+13+50/265/39/?/14?startPeriod=...
                                                                                  ↑ países    ↑ vars
```

### Origen del Problema

**JavaScript (App.js) enviaba:**
```javascript
subjectID / fits / countries / pers / refs / units / vars / dates
0         / 1    / 2         / 3    / 4    / 5     / 6    / 7+
Ejemplo: 1 / 14 / 3+13+50 / 39 / 265 / 19-258 / 78-313 / fechas
```

**API esperaba:**
```
Endpoint 1: {pais} / {variable} / {valoracion} / {unidad} / {frecuencia}
Endpoint 2: {pais} / {variable} / {unidad} / {frecuencia}

Ejemplo: 3+13+50 / 265 / 39 / ? / 14
```

---

## ✅ SOLUCIÓN IMPLEMENTADA

### Cambios en `inc/api.php` - Función `get_all_data1()`

Se implementó un **sistema de reordenamiento de parámetros** que:

1. **Identifica los segmentos** recibidos desde JavaScript
2. **Descarta el subjectID** (índice 0) que no va al API
3. **Reordena los parámetros** según la especificación del API
4. **Transforma separadores** (- por + en múltiples valores)
5. **Convierte variables** (+ por , según API v2)
6. **Detecta el endpoint** correcto (con o sin valoración)

### Código Agregado

```php
// ORDEN RECIBIDO DE App.js:
// Index 0: subjectID (identificador del tema, NO es el país - se descarta)
// Index 1: fits (frecuencia)
// Index 2: countries (país/países)
// Index 3: pers (valoración)
// Index 4: refs (referencia - NO se usa en API v1)
// Index 5: units (unidad)
// Index 6: vars (variables)
// Index 7+: dates (fechas/periodos)
//
// ORDEN ESPERADO POR API (Endpoint 1 - con valoración):
// {pais} / {variable} / {valoracion} / {unidad} / {frecuencia}
//
// ORDEN ESPERADO POR API (Endpoint 2 - sin valoración):
// {pais} / {variable} / {unidad} / {frecuencia}

// Extraer y transformar cada segmento
$subjectID = $urlParts[0]; // Se descarta, no va al API
$fits = str_replace('-', '+', $urlParts[1]);      // Frecuencia
$countries = str_replace('-', '+', $urlParts[2]); // País/países
$pers = str_replace('-', '+', $urlParts[3]);      // Valoración
$refs = str_replace('-', '+', $urlParts[4]);      // Referencia (no se usa)
$units = str_replace('-', '+', $urlParts[5]);     // Unidad
$vars = str_replace('-', '+', $urlParts[6]);      // Variables

// Convertir "+" a "," en variables (requisito API v2)
if (strpos($vars, '+') !== false) {
    $vars = str_replace('+', ',', $vars);
}

// REORDENAR según documentación del API
if ($useEndpoint2) {
    // Endpoint 2: Sin valoración
    $urlParts = array($countries, $vars, $units, $fits);
} else {
    // Endpoint 1: Con valoración
    $urlParts = array($countries, $vars, $pers, $units, $fits);
}
```

### Sistema de Debug Mejorado

Se agregaron pasos de debug que muestran:
- **Segmentos recibidos** desde JavaScript con sus nombres
- **Segmentos reordenados** para el API
- **Endpoint detectado** (1 o 2)
- **Transformaciones aplicadas** (-, +, ,)

---

## 📋 TRANSFORMACIONES APLICADAS

### 1. Reordenamiento de Parámetros

| Posición JS | Parámetro | Posición API | Nuevo Orden |
|------------|-----------|--------------|-------------|
| 0 | subjectID | - | **DESCARTADO** |
| 1 | fits | 4 o 3 | frecuencia |
| 2 | countries | 0 | **pais** |
| 3 | pers | 2 | valoracion (opcional) |
| 4 | refs | - | **NO USADO** |
| 5 | units | 3 o 2 | unidad |
| 6 | vars | 1 | **variable** |
| 7+ | dates | query | startPeriod/endPeriod |

### 2. Transformación de Separadores

| Parámetro | Entrada | Transformación | Salida |
|-----------|---------|----------------|--------|
| countries | 3-13-50 | `-` → `+` | 3+13+50 |
| vars | 265-266-267 | `-` → `+` → `,` | 265,266,267 |
| units | 19-258 | `-` → `+` | 19+258 |
| fits | 14 | (sin cambio) | 14 |

### 3. Detección de Endpoint

El código detecta automáticamente qué endpoint usar:

```php
// Endpoint 2 si valoración está vacía o es un valor por defecto
$useEndpoint2 = empty($pers) || $pers === '0' || $pers === 'null';
```

**Endpoint 1 (con valoración):**
```
{pais}/{variable}/{valoracion}/{unidad}/{frecuencia}
3+13+50/265,266,267/39/19+258/14
```

**Endpoint 2 (sin valoración):**
```
{pais}/{variable}/{unidad}/{frecuencia}
3+13+50/265,266,267/19+258/14
```

---

## 📊 CASOS DE PRUEBA

### Caso 1: Consulta Simple (Un País, Una Variable)

**Entrada JavaScript:**
```
1/14/3/39/0/19/265/20211-20212-20213
```

**Reordenamiento:**
```
subjectID: 1 (descartado)
fits: 14 → frecuencia
countries: 3 → pais
pers: 39 → valoracion
refs: 0 (no usado)
units: 19 → unidad
vars: 265 → variable
dates: 20211-20212-20213 → query params
```

**URL Final:**
```
/public/v1/obtenerDatos/porCriterio/3/265/39/19/14?startPeriod=01-01-2021&endPeriod=31-03-2021
```

### Caso 2: Múltiples Países y Variables

**Entrada JavaScript:**
```
1/14/3-13-50/39/0/19-258/265-266-267/20211-202112
```

**Reordenamiento:**
```
countries: 3-13-50 → 3+13+50
vars: 265-266-267 → 265+266+267 → 265,266,267
pers: 39
units: 19-258 → 19+258
fits: 14
```

**URL Final:**
```
/public/v1/obtenerDatos/porCriterio/3+13+50/265,266,267/39/19+258/14?startPeriod=01-01-2021&endPeriod=31-12-2021
```

### Caso 3: Sin Valoración (Endpoint 2)

**Entrada JavaScript:**
```
1/14/3/0/0/19/265/20211-20213
```

**Reordenamiento:**
```
pers: 0 → detecta Endpoint 2 (sin valoración)
URL: countries/vars/units/fits
```

**URL Final:**
```
/public/v1/obtenerDatos/porCriterio/3/265/19/14?startPeriod=01-01-2021&endPeriod=31-03-2021
```

---

## 🔍 DEBUGGING

### Información de Debug en Consola

Cuando estés logueado, verás en el panel de debug:

```
📊 Segmentos Recibidos de JavaScript
├─ 0: subjectID → 1
├─ 1: fits (frecuencia) → 14
├─ 2: countries (país) → 3+13+50
├─ 3: pers (valoración) → 39
├─ 4: refs (referencia) → 0
├─ 5: units (unidad) → 19+258
├─ 6: vars (variables) → 265+266+267
└─ 7+: dates → 20211-202112

🔄 Segmentos Reordenados para API
├─ Endpoint: Endpoint 1 (con valoración)
├─ 0: pais → 3+13+50
├─ 1: variable → 265,266,267
├─ 2: valoracion → 39
├─ 3: unidad → 19+258
├─ 4: frecuencia → 14
└─ 5+: dates → 20211-202112

📅 Conversión de Fechas
├─ basePath → 3+13+50/265,266,267/39/19+258/14
├─ primero → 20211 → 01-01-2021
└─ último → 202112 → 31-12-2021
```

### Validar en Network Tab

1. Abre DevTools (F12) → Network
2. Filtra por "obtenerDatos"
3. Verifica la URL del request:
   - **País correcto** en primera posición (no "1")
   - **Variables** separadas por ","
   - **Query params** con startPeriod y endPeriod

---

## 🎯 IMPACTO

### Módulos Afectados
- ✅ **SIMAFIR** - Todas las consultas ahora usan el orden correcto
- ⚪ **EMFA** - No afectado (usa endpoints diferentes)
- ⚪ **ESEA** - No afectado (usa endpoints diferentes)
- ⚪ **EFPA** - No afectado (usa endpoints diferentes)
- ⚪ **Tipo de Cambio** - No afectado (usa endpoint específico)

### Antes vs Después

| Aspecto | v1.5.40 (ANTES) | v1.5.41 (DESPUÉS) |
|---------|-----------------|-------------------|
| Orden parámetros | ❌ Incorrecto (subjectID como país) | ✅ Correcto (países, vars, etc.) |
| SubjectID | ❌ Enviado al API | ✅ Descartado correctamente |
| Variables múltiples | ⚠️ Separadas por + | ✅ Separadas por , (API v2) |
| Detección endpoint | ❌ Manual | ✅ Automática (1 o 2) |
| Debug | ⚠️ Básico | ✅ Completo con reordenamiento |

---

## 📦 INSTALACIÓN

### Paso 1: Instalar Plugin

1. Descarga `secmca-api-v1.5.41-REORDER-PARAMS-FIX.zip`
2. WordPress → Plugins → Add New → Upload Plugin
3. Selecciona el ZIP
4. Click "Install Now"
5. Click "Activate"

### Paso 2: Limpiar Caché

```bash
# Navegador
Ctrl + Shift + Delete → Clear cache

# WordPress (si usas plugin de caché)
WP Admin → Clear All Cache
```

### Paso 3: Validar

1. Ve a SIMAFIR
2. Selecciona países y variables
3. Click "Consultar"
4. Abre DevTools (F12) → Console
5. Verifica que aparezca debug info correcta
6. Verifica que los datos se carguen

---

## ✅ CHECKLIST DE VALIDACIÓN

- [ ] Plugin instalado y activado
- [ ] Caché del navegador limpiado
- [ ] Consulta simple funciona (1 país, 1 variable)
- [ ] Consulta con múltiples países funciona
- [ ] Consulta con múltiples variables funciona
- [ ] URL en Network tab tiene formato correcto
- [ ] País correcto en primera posición (no "1")
- [ ] Variables separadas por coma
- [ ] Query params startPeriod y endPeriod presentes
- [ ] Debug panel muestra reordenamiento
- [ ] Datos se cargan correctamente en tabla
- [ ] No hay errores 404 en consola

---

## 🐛 TROUBLESHOOTING

### Problema: URL sigue teniendo "1" como primer parámetro

**Causa:** Código no actualizado o caché

**Solución:**
```bash
# 1. Verificar versión del plugin
WordPress → Plugins → Busca "1.5.41"

# 2. Limpiar caché
Ctrl + F5 (hard refresh)

# 3. Reinstalar plugin
Desactivar → Eliminar → Instalar → Activar
```

### Problema: Variables separadas por "+" en lugar de ","

**Causa:** Transformación de variables no aplicada

**Solución:**
- Verifica que `inc/api.php` tenga el código actualizado
- Busca: `str_replace('+', ',', $vars)`
- Debe estar presente en línea ~641

### Problema: Datos no se cargan después del fix

**Causa:** Puede ser problema de backend o parámetros incorrectos

**Solución:**
1. Abre DevTools → Console
2. Revisa debug panel
3. Verifica cada segmento reordenado
4. Copia la URL final
5. Prueba en Postman o navegador directamente
6. Si falla, problema es del backend API

---

## 📚 DOCUMENTACIÓN RELACIONADA

- **Endpoints API:** `api-endpoints-documentation.md`
- **Fix jQuery v1.5.40:** `CHANGELOG-v1.5.40.md`
- **Fix Variables v1.5.39:** `CHANGELOG-v1.5.39.md`

---

## 👨‍💻 DESARROLLO

**Archivos Modificados:**
- `inc/api.php` - Función `get_all_data1()` (líneas ~565-680)
- `secmca-api.php` - Version bump 1.5.40 → 1.5.41

**Líneas de Código:**
- ~120 líneas nuevas de reordenamiento
- ~60 líneas de debug mejorado
- ~30 líneas de documentación inline

**Testing:**
- ✅ Sintaxis PHP validada
- ✅ Casos de prueba documentados
- ⏳ Pendiente: Testing en producción

---

## 🔄 PRÓXIMOS PASOS

1. **Usuario instala v1.5.41**
2. **Valida que consultas SIMAFIR funcionen**
3. **Reporta si hay casos edge no cubiertos**
4. **Testing en producción completo**
5. **Si todo OK, remover debug excesivo en v1.6.0**

---

**Versión:** 1.5.41  
**Autor:** GitHub Copilot + Fabian Hidalgo  
**Fecha:** 25 de enero de 2026  
**Estado:** ✅ LISTO PARA PRODUCCIÓN
