API REST - CMA Services

Equipo: Affinity · IT CMA Services
Framework: ASP.NET Web API (.NET 4.8) · DB: SQL Server
Integraciones: WCF SOAP (Eurocaja) + PA (Stored Procedures) + Token HMAC (Caser/Indexa)
Base URL: http(s)://<host>/APIRest Nota: En LOCAL se puede omitir token en Indexa

Estructura

Cliente (POSTMAN / Frontend)
   ↓
Controller (Web API)
   ↳ valida request (Validator) y llama a Service/Flow
        ↓
Service / Flow
   ↳ parsea/normaliza (Helpers) y llama a Repository (DB)
        ↓
Repository
   ↳ ejecuta Stored Procedure (PA_...)
        ↓
SQL Server
            
Helpers (sin duplicar): ParsingUtils, TokenUtils, ApiResponseFactory, IndexaCalculator, TokenHelper
Validators: PasoPrevioValidator (y los que vayas añadiendo por endpoint)
Modelos: Models/Indexa (PasoPrevioRequest, IndexaTarificacionRequest, etc.)

Autenticación AuthController

POST /api/auth/login
Genera token HMAC-SHA256 (con ApiAuthToken_caser) y caduca según ApiTokenExpireMinutes.
JSON Envío
{
  "Username": "usuario",
  "Password": "password"
}
JSON Retorno (ejemplo)
{
  "code": 200,
  "message": "Autenticación correcta.",
  "usuario": {
    "id": 1,
    "username": "usuario",
    "codigoCliente": 60,
    "denominacion": "Cliente Demo",
    "email": "demo@dominio.com"
  },
  "token": "BASE64(...)",
  "expiresInMinutes": 10,
  "expiresAt": "2026-02-17T14:50:00Z",
  "success": true
}
Uso: En endpoints protegidos, enviar token como Authorization: Bearer <token> (o body si aplica según endpoint).

Usuario Web UsuarioWebController

POST /api/usuarioweb/crear
Crea usuario (password PBKDF2 + salt). Devuelve ApiResponse.
{
  "UsuarioAcceso": "usuario",
  "Password": "password",
  "CodigoCliente": 1,
  "CodigoIdioma": "ES",
  "Denominacion": "Nombre Apellidos",
  "Email": "correo@dominio.com"
}
POST /api/usuarioweb/validar
Valida usuario y password.
{
  "UsuarioAcceso": "usuario",
  "Password": "password"
}
POST /api/usuarioweb/cambiar-password
Cambia password validando el anterior.
{
  "UsuarioAcceso": "usuario",
  "OldPassword": "oldPassword",
  "NewPassword": "newPassword"
}

Indexa IndexaController

GET /api/indexa/ping
Ping del servidor.
POST /api/indexa/tarificar
Calcula edad a fecha efecto + consulta tarifa (PA) + calcula primas. Usa INDEXA_CLIENT_ID y INDEXA_ACUERDO_MARCO_PERSONAL.
{
  "FechaNacimiento": "1985-10-01T00:00:00",
  "FechaEfecto": "2026-02-17T00:00:00",
  "CapitalAsegurado": 100000,
  "Periodicidad": "12",
  "SobreprimaPct": 0
}
Notas: tol=0.01 comparación primas (Paso Previo) · periodicidad permitida 1/3/6/12
POST /api/indexa/tarifa/obtener
Lista tarifas del tarificador vida. Filtros opcionales: Periodicidad, Edad.
{
  "Periodicidad": "12",
  "Edad": 40
}
POST /api/indexa/tarifa/modificar
Modifica una fila del tarificador vida por IdTarificadorVida.
{
  "IdTarificadorVida": 123,
  "Periodicidad": "12",
  "Edad": 40,
  "PrimaPura": 0.00,
  "PorcGGI": 0.00,
  "PrimaNeta": 1.23,
  "CCS": 0.00,
  "PrimaBruta": 1.45,
  "RecargoFraccionamiento": 0.00,
  "RecargoFraccCCS": 0.00
}

Paso Previo Contractación Póliza PasoPrevioController

POST /api/indexa/comunicacionpoliza Endpoint oficial
Endpoint orquestado: valida token (header/body) → valida request (PasoPrevioValidator) → tarifica → compara primas → inserta en BD con transacción (commit/rollback).
Alias legacy: /api/indexa/paso_previo_contractacion_poliza
Token: preferible por header: Authorization: Bearer <token>
JSON Envío (ejemplo)
{
  "Token": null,
  "Cert": "CERT-0001",
  "Producto": {
    "CodigoCompania": "001",
    "CodigoSubcompania": "01",
    "CodigoTerminal": "T01",
    "CodigoAgente": "A01",
    "CodigoProducto": "60008"
  },
  "Cliente": {
    "IdUsuario": "1",
    "Nombre": "María",
    "Apellidos": "Pérez López",
    "Nif": "12345678Z",
    "FechaNacimiento": "01/10/1985",
    "Sexo": "M",
    "Direccion": {
      "Via": "Calle Mayor",
      "Numero": "10",
      "Piso": "3B",
      "Cp": "28001",
      "Municipio": "Madrid",
      "Provincia": "Madrid",
      "Pais": "ES"
    }
  },
  "Riesgo": {
    "CapitalAsegurado": 100000,
    "PrimaBruta": 145.50,
    "PrimaNeta": 123.00,
    "FechaEfecto": "17/02/2026"
  },
  "Coberturas": [
    { "Codigo": "3", "Descripcion": "Fallecimiento", "Capital": 100000 }
  ],
  "Beneficiarios": [
    {
      "Tipo": "Persona física",
      "Nombre": "Juan",
      "Apellido1": "Pérez",
      "Apellido2": "López",
      "Nif": "87654321X",
      "Parentesco": "Cónyuge",
      "Porcentaje": 100,
      "CodigoTipoBeneficiarioDTB": 1191
    }
  ],
  "Pago": {
    "Iban": "ES1200000000XXXXXXXXXXXX",
    "FrecuenciaPago": "12",
    "CodigoCuentaPago": "1"
  }
}
Respuesta OK (estructura)
{
  "Status": "OK",
  "Message": "Paso previo procesado correctamente.",
  "Data": {
    "Tarificacion": { "...": "..." },
    "Insercion": {
      "CodigoPolizaMaster": 0,
      "IdPersona": 0,
      "IdContacto": 0,
      "IdSituacionRiesgo": 0,
      "IdSituacionRiesgoPoliza": 0,
      "IdDomiciliacion": null,
      "IdCertificadoPoliza": 0
    }
  }
}

Confirmación / Emisión ConfirmacionPolizaController

POST /api/indexa/confirmacionpoliza
Confirma / emite la póliza tras el paso previo. No crea certificado: valida que el cert ya existe en la póliza master y lo deja en estado VIGENTE.
Headers recomendados
Content-Type: application/json
Authorization: Bearer <token>
JSON Envío (ejemplo)
{
  "token": null,
  "cert": "CERT-PRUEBA-0004",
  "numeroPoliza": "60008",
  "fechaConfirmacion": "2026-02-18T00:00:00"
}
Nota: enviar campos en camelCase para evitar problemas de binding.
JSON Retorno (ejemplo)
{
  "Codigo": "00",
  "Descripcion": "Póliza confirmada correctamente.",
  "Data": {
    "Cert": "CERT-PRUEBA-0004",
    "NumeroPoliza": "60008",
    "Estado": "VIGENTE",
    "FechaConfirmacion": "2026-02-18T00:00:00"
  }
}
SP: dbo.PA_WSIndexa_ConfirmacionPoliza · Valida cert en master y actualiza estado/fecha de confirmación.

Consulta Póliza ConsultaPolizaController

POST /api/indexa/consultapoliza
Consulta de póliza/certificado. Devuelve cabecera (tomador/beneficiario/primas) y coberturas (si aplica). Valida cert contra póliza master.
JSON Envío
{
  "token": null,
  "cert": "CERT-PRUEBA-0004",
  "numeroPoliza": "60008"
}
JSON Retorno (ejemplo)
{
  "Codigo": "00",
  "Descripcion": "Consulta correcta",
  "Poliza": {
    "Cert": "CERT-PRUEBA-0004",
    "NumeroPoliza": "60008",
    "Estado": "VIGENTE",
    "FechaEfecto": "2026-02-18T00:00:00",
    "FechaVencimiento": null,
    "Tomador": { "Nombre": "...", "Documento": "...", "Direccion": "..." },
    "Beneficiario": { "Nombre": "...", "Documento": "..." },
    "TipoBeneficiario": null,
    "CapitalAsegurado": null,
    "PrimaNeta": null,
    "PrimaBruta": 145.30,
    "SobreprimaSalud": null,
    "Coberturas": []
  }
}
SP: dbo.PA_WSIndexa_ConsultaPoliza_Obtener

Cancelación CancelacionPolizaController

POST /api/indexa/cancelacionpoliza
Cancela un certificado existente en la póliza master. Registra motivo (DTB) y actualiza fechas. Motivos típicos: Desistimiento, Poliza Similar, No conforme con venta.
JSON Envío
{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "cert": "CERT-PRUEBA-0004",
  "numeroPoliza": "60008",
  "fechaCancelacion": "2026-02-18T00:00:00",
  "motivo": "Desistimiento"
}
JSON Retorno (ejemplo)
{
  "Codigo": "00",
  "Descripcion": "Cancelación realizada correctamente.",
  "Data": {
    "Cert": "CERT-PRUEBA-0004",
    "NumeroPoliza": "60008",
    "Estado": "CANCELADA",
    "FechaCancelacion": "2026-02-18T00:00:00"
  }
}
SP: dbo.PA_WSIndexa_CancelacionPoliza

Notas rápidas