Enviar respuestas
Actualiza las respuestas de un cuestionario completo. Las notas parciales (ICS, ITV) se recalculan automáticamente tras cada envío.
Parámetros de ruta
| Parámetro | Tipo | Descripción |
|---|---|---|
iddeclaracion |
int | ID de la declaración |
idcuestionario |
int | ID del cuestionario (campo idcuestionario del GET) |
Flujo completo: GET estructura, modificar, PUT
sequenceDiagram
participant S as Sistema externo
participant API as API T-Canaria
S->>API: GET /declaraciones/5001/cuestionarios/20
API-->>S: Estructura con secciones, grupos y preguntas
Note over S: Recorrer secciones → grupos → preguntas
Note over S: Para cada pregunta, modificar valorcampo
Note over S: de cada componente en el array respuesta
S->>API: PUT /declaraciones/5001/cuestionarios/20
API-->>S: "N respuestas actualizadas"
Paso 1: Obtener la estructura
curl -s "https://apientidades-pro.transparenciacanarias.org/apientidades/v1/declaraciones/5001/cuestionarios/20" \
-H "Authorization: Bearer $TOKEN" | jq '.secciones[0].grupos[0].preguntas[0]'
Respuesta (una pregunta de ejemplo):
{
"id": 150,
"idpregunta": 301,
"codigo": "ICS-01",
"titulo": "Dispone de formulario de quejas y sugerencias",
"descripcion": "",
"respuesta": [
{
"id": 1,
"tipo": "checkbox",
"nombre": "Sí/No",
"valores": null,
"validado": false,
"valorcampo": false
}
],
"totalrespuestas": 1,
"respuestascontestadas": 0,
"alegacionhabilitada": false,
"alegacionnota": 0,
"alegacionvalorada": false,
"comentariorevision": ""
}
Paso 2: Modificar valorcampo
Para cada componente del array respuesta, modificar el campo valorcampo según su tipo:
| Tipo | Antes | Después |
|---|---|---|
checkbox |
false |
true |
texto |
"" |
"https://portal.es/quejas" |
entero |
0 |
42 |
decimal |
0 |
75.5 |
fecha |
"" |
"2024-06-15" |
memo |
"" |
"Texto explicativo largo..." |
selector |
0 |
1 |
Paso 3: Enviar con PUT
En el body del PUT, el campo id de cada pregunta debe contener el valor de idpregunta del GET (no el id):
Formato compacto
La API transforma automáticamente el formato compacto {id, valor, validado} al formato interno. No es necesario enviar todos los campos del componente. Solo id y valorcampo (o valor) son imprescindibles.
Mapeo GET → PUT
| Campo en GET | Campo en PUT | Descripción |
|---|---|---|
secciones[].grupos[].idgrupo |
grupos[].grupoId |
ID del grupo |
secciones[].grupos[].preguntas[].idpregunta |
preguntas[].id |
ID del registro de remisión — este es el que valida y guarda la API |
secciones[].grupos[].preguntas[].id |
preguntas[].preguntaId |
ID del catálogo (referencia) |
respuesta[].valorcampo |
respuesta[].valorcampo o respuesta[].valor |
Valor de la respuesta |
Ejemplo completo
curl -s -X PUT \
"https://apientidades-pro.transparenciacanarias.org/apientidades/v1/declaraciones/5001/cuestionarios/20" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"grupos": [
{
"grupoId": 10,
"preguntas": [
{
"id": 301,
"preguntaId": 150,
"respuesta": [
{"id": 1, "valor": true, "validado": false}
]
}
]
}
],
"aclaraciones": ""
}' | jq .
import requests
BASE_URL = "https://apientidades-pro.transparenciacanarias.org/apientidades/v1"
headers = {
"Authorization": f"Bearer {token}",
"Content-Type": "application/json"
}
# 1. Obtener estructura del cuestionario
cuestionario = requests.get(
f"{BASE_URL}/declaraciones/5001/cuestionarios/20",
headers=headers
).json()
# 2. Construir el body del PUT recorriendo la estructura real
grupos = []
for seccion in cuestionario.get("secciones", []):
for grupo in seccion.get("grupos", []):
preguntas_put = []
for pregunta in grupo.get("preguntas", []):
respuesta_modificada = []
for comp in pregunta.get("respuesta", []):
comp_put = dict(comp)
if comp["tipo"] == "checkbox":
comp_put["valorcampo"] = True
elif comp["tipo"] == "texto":
comp_put["valorcampo"] = "https://portal.entidad.es/datos"
respuesta_modificada.append(comp_put)
preguntas_put.append({
"id": pregunta["idpregunta"], # idpregunta del GET → id en el PUT
"preguntaId": pregunta["id"], # id del GET → preguntaId en el PUT
"respuesta": respuesta_modificada
})
grupos.append({
"grupoId": grupo["idgrupo"], # idgrupo del GET → grupoId en el PUT
"preguntas": preguntas_put
})
# 3. Enviar respuestas
response = requests.put(
f"{BASE_URL}/declaraciones/5001/cuestionarios/20",
headers=headers,
json={"grupos": grupos, "aclaraciones": ""}
)
print(response.json())
// 1. Obtener estructura
var getResponse = await client.GetAsync($"{baseUrl}/declaraciones/5001/cuestionarios/20");
var cuestionario = JsonConvert.DeserializeObject<CuestionarioDto>(
await getResponse.Content.ReadAsStringAsync());
// 2. Construir body del PUT
var grupos = new List<object>();
foreach (var seccion in cuestionario.Secciones)
{
foreach (var grupo in seccion.Grupos)
{
var preguntas = grupo.Preguntas.Select(p => new
{
id = p.Idpregunta, // idpregunta del GET → id en el PUT
preguntaId = p.Id, // id del GET → preguntaId en el PUT
respuesta = p.Respuesta.Select(c => new
{
id = c.Id,
valor = c.Tipo == "checkbox" ? (object)true : "https://portal.es",
validado = false
}).ToArray()
}).ToArray();
grupos.Add(new { grupoId = grupo.Idgrupo, preguntas });
}
}
// 3. Enviar
var payload = new { grupos, aclaraciones = "" };
var content = new StringContent(
JsonConvert.SerializeObject(payload), Encoding.UTF8, "application/json");
var response = await client.PutAsync(
$"{baseUrl}/declaraciones/5001/cuestionarios/20", content);
Respuesta exitosa (200)
Campos del body
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
grupos |
array | Sí | Grupos del cuestionario con sus preguntas |
grupos[].grupoId |
int | Sí | idgrupo del GET |
grupos[].preguntas |
array | Sí | Preguntas con respuestas |
grupos[].preguntas[].id |
int | Sí | idpregunta del GET (ID del registro de remisión) |
grupos[].preguntas[].preguntaId |
int | No | id del GET (ID del catálogo, solo referencia) |
grupos[].preguntas[].respuesta |
array | Sí | Array de componentes con valores |
aclaraciones |
string | No | Texto de aclaraciones (máximo 5.000 caracteres) |
Validaciones
| Validación | Límite | Error |
|---|---|---|
id de pregunta existe en el cuestionario |
Verificado contra estructura real | 400 |
Componente tiene campo id |
Obligatorio | 400 |
Tipo checkbox |
Valor debe ser boolean | 400 |
Tipo entero |
Valor debe ser integer | 400 |
Tipo decimal |
Valor debe ser número | 400 |
Tipo texto/memo |
Valor string, max 10.000 chars | 400 |
Tipo fecha |
Valor ISO parseable | 400 |
Tipo selector |
Valor debe ser integer o string | 400 |
| Grupos | Max 100 por petición | 400 |
| Preguntas totales | Max 500 por petición | 400 |
| Respuesta | Al menos 1 componente | 400 |
| Aclaraciones | Max 5.000 caracteres | 400 |
Errores posibles
| Código | Descripción |
|---|---|
400 |
Validación fallida (ver tabla) |
401 |
Token ausente, expirado o inválido |
404 |
La declaración o cuestionario no existe o no pertenece a la entidad |
Estado de la declaración
Solo funciona cuando la declaración está en estado NoPresentada (1) o AlegacionesAbiertas (4).