Volver a la documentación

⚖️ Endpoints de Comparador

Herramientas para la estimación y comparación de ofertas energéticas

📝 Descripción General

Los endpoints de comparador permiten realizar cálculos estimativos de costes anuales basados en los datos de consumo real de un punto de suministro (CUPS).

Existen dos grandes familias de endpoints:

🔍 Filtrado Inteligente: El sistema ahora soporta filtrado por el código técnico de la tarifa (codigo_atr) y por zona geográfica (_PEN, _BAL, _CAN), asegurando que solo se comparen ofertas válidas para el suministro.
🔐 Autentificación: Estos endpoints requieren un token JWT válido obtenido a través del sistema de autentificación. Consulte la Guía de Autenticación JWT para más detalles.
POST /comparador_anual_tarifa

🔍 Comparador Anual por Tarifa

Calcula el coste estimado anual aplicando las condiciones de una tarifa específica del sistema al histórico de consumo del CUPS.

🚀 Optimización: Si la tarifa seleccionada es de Precio Fijo, el sistema omite el proceso de perfilado horario pesado, realizando el cálculo directamente sobre los totales mensuales de SIPS. Esto reduce el tiempo de respuesta de segundos a milisegundos.

Cuerpo de la Petición (JSON)

Campo Tipo Descripción
cups string Requerido Código CUPS.
id_tarifa string Requerido ID de la tarifa.
incluir_detalle_mensual boolean Opcional (default: true). Si se incluye, devuelve el desglose de costes mes a mes.

Ejemplo de Petición cURL

curl -X POST "http://localhost:5000/comparador_anual_tarifa" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"cups": "ES0031...", "id_tarifa": "123", "incluir_detalle_mensual": true}'
POST /comparador_anual_tarifas_bulk

🚀 Comparador Anual Masivo (Bulk)

Calcula las estimaciones para una lista de tarifas en una única petición. Es el endpoint óptimo para interfaces que muestran comparativas completas.

⚡ Rendimiento: Este endpoint utiliza una caché de hilo (thread-safe) para los datos del CUPS, evitando accesos redundantes a SIPS durante el procesamiento de la lista.

Cuerpo de la Petición (JSON)

Campo Tipo Descripción
cups string Requerido Código CUPS.
id_tarifas array Requerido Lista de IDs de tarifas a calcular.
POST /comparador_anual_manual

🛠️ Comparador Anual Manual

Realiza una estimación personalizada permitiendo configurar manualmente precios, fees y otros parámetros comerciales.

Cuerpo de la Petición (JSON)

Campo Tipo Descripción
cups string Requerido Código CUPS.
tipo_precio string fijo o indexado
precios_energia object Precios por período (P1, P2, etc.) en €/kWh.
fee number Fee de gestión (para indexados).
precios_potencia object Precios de potencia (€/kW/año).
incluir_detalle_mensual boolean Opcional (default: true).

Ejemplo de Petición

{
  "cups": "ES0031405678912345AB1F",
  "tipo_precio": "fijo",
  "precios_energia": {
    "p1": 0.15,
    "p2": 0.12,
    "p3": 0.08
  },
  "precios_potencia": {
    "p1": 35.5,
    "p2": 1.2
  }
}

📤 Estructura de Respuesta (Estimación Anual)

Los endpoints /comparador_anual_* devuelven un objeto con el resumen de la estimación y, opcionalmente, el detalle mensual.

{
  "cups": "ES0031405678912345AB1F",
  "tarifa_atr": "2.0TD",
  "tipo_precio": "fijo",
  "consumo_total_kwh": 4250.50,
  "coste_energia": 645.20,
  "coste_potencia": 320.15,
  "total": 965.35,
  "resultado_mensual": [
    {
      "mes_referencia": "01",
      "coste_total": 110.50,
      "coste_energia": 80.25,
      "coste_potencia": 30.25,
      ...
    }
  ]
}

🌐 Comparador Web

Familia de endpoints pensados para el portal web del cliente. Devuelven, para todas las tarifas activas en el sistema, una estimación completa de factura (energía + potencia + bono social + alquiler + impuestos) y señalan automáticamente la mejor tarifa (la de menor importe total).

🧮 Impuestos y conceptos automáticos: Estos endpoints aplican automáticamente el Impuesto Eléctrico (IE), el IVA, el bono social y el alquiler de equipos a partir de la tabla prices.inputs_comparador, en función de la tarifa ATR.
🔍 Filtrado automático de tarifas del catálogo: Antes de calcular, el comparador aplica varios filtros sobre prices.tarifas_disponibles (columna activar = true):
  • Compatibilidad ATR y zona geográfica: solo se comparan tarifas cuya tarifa_atr coincide con la del suministro y con la zona (PENINSULA, BALEARES, CANARIAS, etc.).
  • es_solar: el endpoint por CUPS descarta siempre las tarifas solares (SIPS no aporta excedentes). Los endpoints por factura seleccionan solares si en la factura aparece consumo_excedentes_kwh > 0, o no solares en caso contrario.
  • rango_consumo_mwh: cada tarifa puede definir un tope de consumo anual (en MWh). Se descarta cuando el consumo anual estimado del CUPS supera ese tope. Si la columna es NULL, la tarifa no tiene tope. El consumo anual se obtiene de SIPS (endpoints con CUPS) o se extrapola desde la factura (endpoint sin CUPS: consumo_total_kwh × 365 / dias_intervalo).
Las tarifas descartadas por estos filtros no aparecen en la respuesta.
POST /comparador_web_cups

🔍 Comparador Web por CUPS

Calcula la factura mensual equivalente que pagaría el cliente con cada una de las tarifas activas, utilizando el histórico de consumo real del CUPS obtenido de SIPS. Internamente calcula la factura anual con todos los conceptos (incluyendo IE, IVA, bono social y alquiler) y la divide entre 12.

Cuerpo de la Petición (JSON)

CampoTipoDescripción
cups string Requerido Código CUPS del punto de suministro.
origen string Opcional. Identifica el origen de la petición (p.ej. "web", "app", "backoffice"). Si no se envía, se devuelve "sin informar".

Ejemplo de Petición cURL

curl -X POST "http://localhost:5000/comparador_web_cups" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"cups": "ES0031405678912345AB1F", "origen": "web"}'

Ejemplo de Respuesta

{
  "cups": {
    "cups": "ES0031405678912345AB1F",
    "tarifa_atr": "2.0TD",
    "geo_zone": "PENINSULA",
    "provincia": "28",
    "potencias_kw": { "P1": 4.6, "P2": 4.6 },
    "consumo_total_anual_kwh": 4250.50,
    "consumo_periodos_anual_kwh": { "P1": 1500.0, "P2": 1250.5, "P3": 1500.0 },
    "consumo_medio_mensual_kwh": 354.21,
    "consumo_periodos_medio_kwh": { "P1": 125.0, "P2": 104.21, "P3": 125.0 },
    "origen": "web"
  },
  "tarifas": [
    {
      "tarifa_id": "123",
      "nombre_tarifa_precio": "Tarifa Plana 2.0TD",
      "alias_precio": "PLANA-2TD",
      "tipo_precio": "fijo",
      "coste_energia": 53.77,
      "coste_potencia": 26.68,
      "bono_social": 0.04,
      "alquiler": 0.81,
      "base_imponible": 81.30,
      "impuesto_electrico": 2.74,
      "iva": 17.65,
      "total_factura": 101.69
    },
    {
      "tarifa_id": "124",
      "nombre_tarifa_precio": "Tarifa Indexada PVPC+",
      "alias_precio": "IDX-PVPC",
      "tipo_precio": "indexado",
      "coste_energia": 49.10,
      "coste_potencia": 26.68,
      "bono_social": 0.04,
      "alquiler": 0.81,
      "base_imponible": 76.63,
      "impuesto_electrico": 2.58,
      "iva": 16.63,
      "total_factura": 95.84
    }
  ],
  "mejor_tarifa": {
    "tarifa_id": "124",
    "nombre_tarifa_precio": "Tarifa Indexada PVPC+",
    "alias_precio": "IDX-PVPC",
    "tipo_precio": "indexado",
    "total_factura": 95.84
  },
  "cups_imagina": 1
}
🏷️ Campo cups_imagina: Indica si el CUPS pertenece a un contrato activo de Imagina Energía (id_estado = 3 en public.contratos_suministro). Vale 1 si está, 0 en caso contrario.
POST /comparador_web_factura

🧾 Comparador Web por Factura

Compara una factura real aportada por el cliente contra todas las tarifas activas. La tarifa ATR y la zona geográfica se obtienen automáticamente del CUPS, mientras que los consumos, potencias e importes los aporta el usuario tal y como aparecen en su factura. La comparativa se realiza para el periodo indicado (fecha_inicio_periodofecha_fin_periodo).

Cuerpo de la Petición (JSON)

CampoTipoDescripción
cupsstringRequerido Código CUPS.
fecha_inicio_periodostring (YYYY-MM-DD)Requerido Inicio del periodo facturado.
fecha_fin_periodostring (YYYY-MM-DD)Requerido Fin del periodo facturado.
consumo_p1_kwhconsumo_p6_kwhnumberConsumo por periodo en kWh (los que no apliquen a 0 o ausentes).
consumo_total_kwhnumberOpcional. Si no se envía, se calcula como suma de los periodos.
potencia_p1_kwpotencia_p6_kwnumberPotencias contratadas por periodo en kW.
consumo_excedentes_kwhnumberOpcional. Consumo cubierto por excedentes solares en el periodo (kWh). Si > 0, el filtro es_solar restringirá la comparativa a tarifas solares y las tarifas indexadas se omiten.
precio_excedentes_eur_kwhnumberOpcional. Precio unitario aplicado a los excedentes en la factura real (€/kWh). Se usa para descontar consumo_excedentes_kwh * precio_excedentes_eur_kwh del total energía+potencia real antes de calcular ahorros.
total_potencia_eurnumberImporte total de potencia en la factura real.
total_energia_eurnumberImporte total de energía en la factura real.
total_factura_eurnumberTotal de la factura (con impuestos).
total_sin_impuestos_eurnumberBase imponible de la factura.
total_impuestos_eurnumberSuma de impuestos repercutidos.
referencia_externastring / numberOpcional. Identificador externo de la factura origen (p.ej. id del PDF). Solo trazabilidad; no afecta al cálculo.
origenstringOpcional. Identifica el origen de la petición. Si no se envía, se devuelve "sin informar".

Ejemplo de Petición cURL

curl -X POST "http://localhost:5000/comparador_web_factura" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "cups": "ES0031405678912345AB1F",
    "fecha_inicio_periodo": "2026-01-01",
    "fecha_fin_periodo":    "2026-01-31",
    "consumo_p1_kwh": 150.0,
    "consumo_p2_kwh": 120.0,
    "consumo_p3_kwh": 100.0,
    "potencia_p1_kw": 4.6,
    "potencia_p2_kw": 4.6,
    "total_potencia_eur": 26.50,
    "total_energia_eur": 55.20,
    "total_sin_impuestos_eur": 81.70,
    "total_impuestos_eur": 20.30,
    "total_factura_eur": 102.00,
    "referencia_externa": "fact-2026-0001",
    "origen": "web"
  }'

Ejemplo de Respuesta

{
  "factura_real": {
    "cups": "ES0031405678912345AB1F",
    "fecha_inicio_periodo": "2026-01-01",
    "fecha_fin_periodo": "2026-01-31",
    "dias_intervalo": 30,
    "tarifa_atr": "2.0TD",
    "geo_zone": "PENINSULA",
    "provincia": "28",
    "consumo_total_kwh": 370.0,
    "consumo_por_periodo_kwh": { "P1": 150.0, "P2": 120.0, "P3": 100.0, "P4": 0, "P5": 0, "P6": 0 },
    "potencias_kw": { "P1": 4.6, "P2": 4.6, "P3": 0, "P4": 0, "P5": 0, "P6": 0 },
    "total_potencia_eur": 26.50,
    "total_energia_eur": 55.20,
    "total_factura_eur": 102.00,
    "total_sin_impuestos_eur": 81.70,
    "total_impuestos_eur": 20.30,
    "referencia_externa": "fact-2026-0001",
    "origen": "web"
  },
  "tarifas": [
    {
      "tarifa_id": "123",
      "nombre_tarifa_precio": "Tarifa Plana 2.0TD",
      "alias_precio": "PLANA-2TD",
      "tipo_precio": "fijo",
      "coste_energia": 52.10,
      "coste_potencia": 25.80,
      "bono_social": 0.04,
      "alquiler": 0.78,
      "base_imponible": 78.72,
      "impuesto_electrico": 2.65,
      "iva": 17.09,
      "total_factura": 98.46,
      "ahorro_vs_factura_real": 3.54,
      "porcentaje_ahorro": 3.47
    }
  ],
  "mejor_tarifa": {
    "tarifa_id": "123",
    "nombre_tarifa_precio": "Tarifa Plana 2.0TD",
    "total_factura": 98.46,
    "ahorro_vs_factura_real": 3.54,
    "porcentaje_ahorro": 3.47
  },
  "cups_imagina": 1
}
POST /comparador_web_datos_input

📝 Comparador Web por Datos Manuales (sin CUPS)

Igual que /comparador_web_factura pero sin CUPS. El cliente introduce manualmente la tarifa_atr que tiene contratada y el resto de datos de la factura. Útil para simulaciones rápidas en formularios web cuando todavía no se dispone (o no se quiere consultar) el CUPS.

🌍 Zona geográfica: El endpoint asume PENINSULA por defecto. Para otras zonas, la lógica interna usa el parámetro geo_zone (BALEARES, CANARIAS, CEUTA, MELILLA); si tu integración necesita exponerlo, contactar con el equipo de API.

Cuerpo de la Petición (JSON)

CampoTipoDescripción
tarifa_atrstringRequerido Tarifa ATR contratada (ej. 2.0TD, 3.0TD, 6.1TD).
fecha_inicio_periodostring (YYYY-MM-DD)Requerido Inicio del periodo a comparar.
fecha_fin_periodostring (YYYY-MM-DD)Requerido Fin del periodo a comparar.
consumo_p1_kwhconsumo_p6_kwhnumberConsumos por periodo en kWh.
consumo_total_kwhnumberOpcional, suma de periodos si se omite.
potencia_p1_kwpotencia_p6_kwnumberPotencias contratadas por periodo en kW.
total_potencia_eur, total_energia_eur, total_factura_eur, total_sin_impuestos_eur, total_impuestos_eurnumberOpcionales. Si se envían, se calcula el ahorro frente a la factura real.
origenstringOpcional. Identifica el origen de la petición. Si no se envía, se devuelve "sin informar".

Ejemplo de Petición cURL

curl -X POST "http://localhost:5000/comparador_web_datos_input" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "tarifa_atr": "2.0TD",
    "fecha_inicio_periodo": "2026-01-01",
    "fecha_fin_periodo":    "2026-01-31",
    "consumo_p1_kwh": 150.0,
    "consumo_p2_kwh": 120.0,
    "consumo_p3_kwh": 100.0,
    "potencia_p1_kw": 4.6,
    "potencia_p2_kw": 4.6,
    "total_factura_eur": 102.00,
    "origen": "web"
  }'

Ejemplo de Respuesta

{
  "factura_real": {
    "fecha_inicio_periodo": "2026-01-01",
    "fecha_fin_periodo": "2026-01-31",
    "dias_intervalo": 31,
    "tarifa_atr": "2.0TD",
    "geo_zone": "PENINSULA",
    "consumo_total_kwh": 370.0,
    "consumo_por_periodo_kwh": { "P1": 150.0, "P2": 120.0, "P3": 100.0, "P4": 0, "P5": 0, "P6": 0 },
    "potencias_kw": { "P1": 4.6, "P2": 4.6, "P3": 0, "P4": 0, "P5": 0, "P6": 0 },
    "total_potencia_eur": null,
    "total_energia_eur": null,
    "total_factura_eur": 102.00,
    "total_sin_impuestos_eur": null,
    "total_impuestos_eur": null,
    "origen": "web"
  },
  "tarifas": [
    {
      "tarifa_id": "123",
      "nombre_tarifa_precio": "Tarifa Plana 2.0TD",
      "tipo_precio": "fijo",
      "coste_energia": 53.81,
      "coste_potencia": 26.66,
      "bono_social": 0.04,
      "alquiler": 0.81,
      "base_imponible": 81.32,
      "impuesto_electrico": 2.74,
      "iva": 17.65,
      "total_factura": 101.71,
      "ahorro_vs_factura_real": 0.29,
      "porcentaje_ahorro": 0.28
    }
  ],
  "mejor_tarifa": {
    "tarifa_id": "123",
    "nombre_tarifa_precio": "Tarifa Plana 2.0TD",
    "total_factura": 101.71,
    "ahorro_vs_factura_real": 0.29,
    "porcentaje_ahorro": 0.28
  },
  "cups_imagina": 0
}
🏷️ Campo cups_imagina: En este endpoint no hay CUPS, por lo que siempre vale 0. Se devuelve para mantener una estructura de respuesta homogénea con los otros endpoints del comparador web.

📤 Estructura de Respuesta (Comparador Web)

Los endpoints /comparador_web_* comparten una estructura común:

❌ Errores Comunes

Código Descripción
401 Unauthorized Token JWT ausente o expirado.
404 Not Found El CUPS no existe en el sistema SIPS.
400 Bad Request Faltan parámetros obligatorios en el cuerpo del POST.