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.