Saltar a contenido

Tipos de componentes

Cada pregunta de un cuestionario contiene uno o más componentes de respuesta dentro del array respuesta. Cada componente tiene un tipo que determina el formato del valor esperado y los metadatos de configuración disponibles.

Estructura de un componente

Todos los componentes comparten estos campos:

Campo Tipo Descripción
id int ID único del componente dentro de la pregunta
tipo string Tipo de componente (ver tabla de tipos)
nombre string Etiqueta visible para el usuario
descripcion string Descripción o texto de ayuda del componente
valores array Metadatos de configuración (ver abajo). Nunca es null
validado bool Si el componente ya ha sido respondido y validado
valorcampo any Valor actual introducido por la entidad
valorinicial any Valor guardado en la última remisión aceptada (referencia histórica)

El array valores

El campo valores es un array de objetos {nombre, valor} que contiene la configuración del componente. Todos los tipos tienen este array; nunca llega como null.

"valores": [
  { "nombre": "campoBoolVinculado", "valor": 0 },
  { "nombre": "SelectorVinculado",  "valor": 0 },
  { "nombre": "OpcionSelectorActiva", "valor": 0 }
]

Las entradas del array valores presentes según el tipo:

Nombre en valores Tipos que lo tienen Descripción
campoBoolVinculado Todos ID de pregunta checkbox que activa/desactiva este campo. 0 = siempre activo
SelectorVinculado Todos ID de pregunta selector que condiciona este campo. 0 = sin vinculación
OpcionSelectorActiva Todos Valor del selector que activa este campo. 0 = sin vinculación
obligatorio texto, memo, entero, decimal, fecha, selector Si el campo es obligatorio
largo texto Longitud máxima en caracteres (0 = sin límite)
esUrl texto Si el valor debe ser una URL válida
esEmail texto Si el valor debe ser un email válido
esTelefono texto Si el valor debe ser un teléfono válido
min entero, decimal Valor mínimo admitido (0 = sin límite)
max entero, decimal Valor máximo admitido (0 = sin límite)
fechahoy fecha Si se inicializa con la fecha actual
valores selector Opciones del desplegable (JSON serializado, ver tipo selector)

Campos condicionales

Cuando campoBoolVinculado > 0, el campo se habilita solo si la pregunta checkbox con ese ID tiene valor true. Cuando SelectorVinculado > 0 y OpcionSelectorActiva > 0, el campo se habilita solo si el selector indicado tiene ese valor seleccionado. Un campo desactivado por estas vinculaciones debe ignorarse (no es obligatorio responderlo).


Tabla de tipos

Tipo Valor esperado Formato valorcampo Ejemplo
checkbox Boolean true / false true
texto String Texto corto o URL "https://portal.es/datos"
entero Integer Número entero 42
decimal Number Número con decimales 75.5
fecha String ISO Formato YYYY-MM-DD "2024-06-15"
memo String Texto largo multilínea "Texto extenso..."
selector Integer Valor numérico de la opción elegida 2

Detalle de cada tipo

checkbox

Pregunta de Sí/No. El valor es un booleano. La entrada valores contiene solo los campos de vinculación.

{
  "id": 1,
  "tipo": "checkbox",
  "nombre": "Sí/No",
  "descripcion": "",
  "valores": [
    { "nombre": "campoBoolVinculado",  "valor": 0 },
    { "nombre": "SelectorVinculado",   "valor": 0 },
    { "nombre": "OpcionSelectorActiva","valor": 0 }
  ],
  "validado": false,
  "valorcampo": false,
  "valorinicial": false
}

Valores válidos

Solo se aceptan true o false. Los valores 0, 1, "si", "no" no son válidos y generan error 400.


texto

Campo de texto corto. Puede estar configurado para validar URL, email o teléfono.

{
  "id": 1,
  "tipo": "texto",
  "nombre": "URL del portal",
  "descripcion": "Introduzca la URL completa incluyendo https://",
  "valores": [
    { "nombre": "campoBoolVinculado",  "valor": 0 },
    { "nombre": "SelectorVinculado",   "valor": 0 },
    { "nombre": "OpcionSelectorActiva","valor": 0 },
    { "nombre": "obligatorio",         "valor": true },
    { "nombre": "largo",               "valor": 255 },
    { "nombre": "esUrl",               "valor": true },
    { "nombre": "esEmail",             "valor": false },
    { "nombre": "esTelefono",          "valor": false }
  ],
  "validado": false,
  "valorcampo": "https://portal.entidad.es/transparencia",
  "valorinicial": ""
}
Validación Límite
Longitud máxima Según largo en valores (si largo = 0, sin límite; máximo absoluto 10.000)
Tipo Debe ser string
Formato URL Si esUrl = true, debe ser una URL válida

entero

Número entero sin decimales.

{
  "id": 1,
  "tipo": "entero",
  "nombre": "Número de solicitudes",
  "descripcion": "",
  "valores": [
    { "nombre": "campoBoolVinculado",  "valor": 0 },
    { "nombre": "SelectorVinculado",   "valor": 0 },
    { "nombre": "OpcionSelectorActiva","valor": 0 },
    { "nombre": "obligatorio",         "valor": false },
    { "nombre": "min",                 "valor": 0 },
    { "nombre": "max",                 "valor": 0 }
  ],
  "validado": false,
  "valorcampo": 42,
  "valorinicial": 0
}
Validación Límite
Tipo Debe ser integer

No enviar como string

El valor debe ser un número, no un string. 42 es correcto, "42" no.


decimal

Número con decimales. Se usa para porcentajes, importes, etc.

{
  "id": 1,
  "tipo": "decimal",
  "nombre": "Porcentaje de cumplimiento",
  "descripcion": "",
  "valores": [
    { "nombre": "campoBoolVinculado",  "valor": 0 },
    { "nombre": "SelectorVinculado",   "valor": 0 },
    { "nombre": "OpcionSelectorActiva","valor": 0 },
    { "nombre": "obligatorio",         "valor": false },
    { "nombre": "min",                 "valor": 0 },
    { "nombre": "max",                 "valor": 0 }
  ],
  "validado": false,
  "valorcampo": 75.5,
  "valorinicial": 0
}
Validación Límite
Tipo Debe ser numérico (entero o decimal)

Separador decimal

Use punto (.) como separador decimal, no coma. 75.5 es correcto, 75,5 no.


fecha

Campo de fecha en formato ISO 8601.

{
  "id": 1,
  "tipo": "fecha",
  "nombre": "Fecha de publicación",
  "descripcion": "",
  "valores": [
    { "nombre": "campoBoolVinculado",  "valor": 0 },
    { "nombre": "SelectorVinculado",   "valor": 0 },
    { "nombre": "OpcionSelectorActiva","valor": 0 },
    { "nombre": "obligatorio",         "valor": false },
    { "nombre": "fechahoy",            "valor": false }
  ],
  "validado": false,
  "valorcampo": "2024-06-15T00:00:00.000Z",
  "valorinicial": null
}
Validación Límite
Formato String ISO parseable (YYYY-MM-DD o YYYY-MM-DDTHH:MM:SS.mmmZ)

memo

Campo de texto largo. Para descripciones, justificaciones, textos extensos.

{
  "id": 1,
  "tipo": "memo",
  "nombre": "Justificación",
  "descripcion": "",
  "valores": [
    { "nombre": "campoBoolVinculado",  "valor": 0 },
    { "nombre": "SelectorVinculado",   "valor": 0 },
    { "nombre": "OpcionSelectorActiva","valor": 0 },
    { "nombre": "obligatorio",         "valor": false }
  ],
  "validado": false,
  "valorcampo": "La entidad ha implementado un sistema de gestión de calidad...",
  "valorinicial": ""
}
Validación Límite
Longitud máxima 10.000 caracteres
Tipo Debe ser string

selector

Selección de una opción entre varias predefinidas. El valor es el número correspondiente a la opción elegida.

Las opciones se obtienen de la entrada {nombre: "valores"} del array valores. Su contenido es un JSON serializado que contiene un array de {texto, valor}.

{
  "id": 1,
  "tipo": "selector",
  "nombre": "Frecuencia de actualización",
  "descripcion": "",
  "valores": [
    { "nombre": "campoBoolVinculado",  "valor": 0 },
    { "nombre": "SelectorVinculado",   "valor": 0 },
    { "nombre": "OpcionSelectorActiva","valor": 0 },
    { "nombre": "obligatorio",         "valor": false },
    {
      "nombre": "valores",
      "valor": "[{\"texto\":\"No aplica\",\"valor\":0},{\"texto\":\"Anual\",\"valor\":1},{\"texto\":\"Semestral\",\"valor\":2},{\"texto\":\"Trimestral\",\"valor\":3},{\"texto\":\"Mensual\",\"valor\":4}]"
    }
  ],
  "validado": false,
  "valorcampo": 2,
  "valorinicial": 0
}
Validación Límite
Tipo Debe ser integer
Valor Debe corresponder a un valor de la lista de opciones

Cómo leer las opciones

Las opciones del selector se obtienen localizando valores.find(x => x.nombre === "valores")?.valor y parseando el string resultante como JSON. El array resultante tiene la estructura [{texto: string, valor: number}]. No confundir el valor de cada opción con la clave nombre y valor del propio array de metadatos.

Estructura de las opciones: {texto, valor} — NO {id, nombre}

La estructura de cada opción es {"texto": "...", "valor": 0}. El campo numérico se llama valor (no id) y el texto visible se llama texto (no nombre). Envíe el campo valor de la opción elegida como valorcampo en el PUT.


Ejemplo de una pregunta con múltiples componentes

Algunas preguntas combinan varios componentes. En este ejemplo, el campo texto URL solo se habilita si el checkbox está marcado (campoBoolVinculado apunta al ID de la pregunta que contiene el checkbox):

{
  "id": 150,
  "idpregunta": 301,
  "codigo": "ICS-01",
  "titulo": "Publicación de datos de contratación pública",
  "descripcion": "Indique si la entidad publica datos de contratación y proporcione la URL",
  "respuesta": [
    {
      "id": 1,
      "tipo": "checkbox",
      "nombre": "Publica datos",
      "descripcion": "",
      "valores": [
        { "nombre": "campoBoolVinculado",  "valor": 0 },
        { "nombre": "SelectorVinculado",   "valor": 0 },
        { "nombre": "OpcionSelectorActiva","valor": 0 }
      ],
      "validado": false,
      "valorcampo": true,
      "valorinicial": false
    },
    {
      "id": 2,
      "tipo": "texto",
      "nombre": "URL de los datos",
      "descripcion": "URL donde se publican los datos de contratación",
      "valores": [
        { "nombre": "campoBoolVinculado",  "valor": 150 },
        { "nombre": "SelectorVinculado",   "valor": 0 },
        { "nombre": "OpcionSelectorActiva","valor": 0 },
        { "nombre": "obligatorio",         "valor": true },
        { "nombre": "largo",               "valor": 500 },
        { "nombre": "esUrl",               "valor": true },
        { "nombre": "esEmail",             "valor": false },
        { "nombre": "esTelefono",          "valor": false }
      ],
      "validado": false,
      "valorcampo": "https://portal.entidad.es/contratacion",
      "valorinicial": ""
    }
  ],
  "totalrespuestas": 2,
  "respuestascontestadas": 2,
  "alegacionhabilitada": false,
  "alegacionnota": 0,
  "alegacionvalorada": false,
  "comentariorevision": ""
}

En este ejemplo, el campo URL de los datos (id: 2) tiene campoBoolVinculado: 150, que apunta a la pregunta con idpregunta: 150 (la pregunta contenedora del checkbox con id: 1). Si el checkbox vale false, el campo texto queda desactivado y no es necesario responderlo.

Enviar todos los componentes

Al enviar respuestas con PUT, incluya todos los componentes de cada pregunta, incluso los que no haya modificado. La API espera el array completo de componentes.

Campo valorinicial

El campo valorinicial refleja el valor que tenía el componente en la última remisión. Úselo solo como referencia informativa. Al enviar el PUT, incluya siempre valorcampo con el valor actual deseado.