Saltar a contenido

Enviar respuestas

PUT /apientidades/v1/declaraciones/{iddeclaracion}/cuestionarios/{idcuestionario}

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):

{
  "grupos": [
    {
      "grupoId": 10,
      "preguntas": [
        {
          "id": 301,
          "preguntaId": 150,
          "respuesta": [
            {
              "id": 1,
              "tipo": "checkbox",
              "nombre": "Sí/No",
              "valores": null,
              "validado": false,
              "valorcampo": true
            }
          ]
        }
      ]
    }
  ],
  "aclaraciones": ""
}
{
  "grupos": [
    {
      "grupoId": 10,
      "preguntas": [
        {
          "id": 301,
          "preguntaId": 150,
          "respuesta": [
            { "id": 1, "valor": true, "validado": false }
          ]
        }
      ]
    }
  ],
  "aclaraciones": ""
}

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)

{
  "message": "5 respuestas actualizadas.",
  "count": 5
}

Campos del body

Campo Tipo Obligatorio Descripción
grupos array Grupos del cuestionario con sus preguntas
grupos[].grupoId int idgrupo del GET
grupos[].preguntas array Preguntas con respuestas
grupos[].preguntas[].id int 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 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).