Diferencia entre revisiones de «API Modulo Forms»

De WikiSerpi
Ir a la navegación Ir a la búsqueda
Sin resumen de edición
Sin resumen de edición
 
Línea 1: Línea 1:
== ⚡ Referencia de Endpoints ==


= ✨ SERPI Forms Core API (v1) =
A continuación, los servicios expuestos organizados por método HTTP. Haz clic en cada bloque para expandir la documentación.
 
== Descripción ==
El microservicio '''SERPI Forms''' proporciona almacenamiento, renderizado y análisis histórico de respuestas para formularios dinámicos. Opera bajo una arquitectura multi-tenant y se integra de forma nativa con el ERP SERPI, permitiendo a las empresas gestionar encuestas, auditorías y captura de datos en terreno.
 
== Autorización ==
La API utiliza un esquema de seguridad basado en tokens JWT (Bearer Token). Para acceder a los endpoints protegidos, debes incluir el token en las cabeceras HTTP de tu petición:<source lang="http">
Authorization: Bearer <TOKEN_JWT>
</source>> '''Nota de Desarrollo:''' Si el bypass de desarrollo local está habilitado, se puede utilizar el encabezado `X-Empresa-Id: <ID>` en lugar del JWT.
 
== Beneficio ==
 
* '''Trazabilidad y Auditoría:''' Inmutabilidad de respuestas en el histórico y captura automática de la IP de origen (`ip_origen`).
* '''Aislamiento de Datos (Multi-Tenant):''' Despliegue de bases de datos dedicadas por cliente para máxima seguridad.
* '''Flexibilidad Estructural:''' Modelo híbrido Relacional/JSON que ofrece compatibilidad instantánea con motores de Inteligencia de Negocios (BI).
 
== Tipos de peticiones ==
El API sigue los estándares RESTful utilizando los siguientes métodos HTTP:


* '''GET:''' Recuperar información (ej. listar formularios, consultar carpetas o métricas).
<div class="mw-collapsible mw-collapsed" style="border: 1px solid #c8e6c9; background-color: #f1f8e9; padding: 10px; margin-bottom: 10px; border-radius: 4px;">
* '''POST:''' Crear nuevos recursos en el sistema o enviar respuestas públicas.
<div style="font-weight: bold; font-size: 1.1em; color: #2e7d32;">🟩 GET (Consultas y Lecturas)</div>
* '''PUT:''' Actualizar recursos existentes, reubicar carpetas o cambiar estados (activo/inactivo).
<div class="mw-collapsible-content" style="background-color: #ffffff; padding: 15px; margin-top: 10px; border: 1px solid #c8e6c9;">
* '''DELETE:''' Ejecutar eliminaciones lógicas (soft-delete) o físicas de recursos protegidos.
 
== ¿Cómo funciona? ==
El ciclo de vida transaccional en SERPI Forms consta de los siguientes pasos:
 
# '''Configuración y Organización:''' Se crean ''Categorías'' (con reglas de roles) y ''Carpetas'' para organizar el entorno (Workspace).
# '''Diseño del Formulario:''' Se registra el esquema dinámico JSON que define las preguntas y lógicas del formulario.
# '''Distribución:''' Se generan URLs públicas o se habilitan para consultas en tiempo real durante visitas comerciales (aplicando reglas de frecuencia).
# '''Recolección:''' El encuestado diligencia los datos, impactando el endpoint público que registra la respuesta y orquesta el cobro SaaS (folios).
# '''Análisis:''' Se consultan los indicadores globales y el histórico de respuestas a través de los endpoints de gestión.
 
---
 
== ⚡ Referencia de Endpoints ==
<tabber> Categorías y Roles=


=== GET /api/v1/categories ===
=== GET /api/v1/categories ===
Devuelve un listado completo de todas las categorías configuradas en el sistema para la empresa del usuario autenticado. Las categorías permiten organizar formularios y establecer políticas de acceso basado en roles (RBAC).
Devuelve un listado completo de todas las categorías configuradas en el sistema para la empresa del usuario autenticado.
 
* '''Ruta y Método:''' <code>GET /api/v1/categories</code>
 
==== Respuesta Exitosa (200 OK) ====
==== Respuesta Exitosa (200 OK) ====
<source lang="json">
<source lang="json">
Línea 54: Línea 20:
]
]
</source>
</source>
* '''Errores posibles:''' <code>401 Unauthorized</code>, <code>403 Forbidden</code>
=== POST /api/v1/categories ===
Registra una nueva categoría en el sistema.
* '''Ruta y Método:''' <code>POST /api/v1/categories</code>
==== Parámetros ====
{| class="wikitable"
!Parámetro
!Tipo
!Obligatorio
!Descripción
|-
|Body
|Object
|Sí
|Objeto JSON con nombre, color hexadecimal y roleIds.
|}
==== Payload y Respuesta (201 Created) ====
<source lang="json">
{
  "nombre": "Control de Calidad",
  "color": "#F59E0B",
  "roleIds": [105, 108]
}
</source>
=== PUT y DELETE /api/v1/categories/{id} ===
* '''PUT:''' Actualiza las propiedades de una categoría existente. Retorna <code>204 No Content</code>.
* '''DELETE:''' Elimina de forma física una categoría (falla si posee carpetas activas). Retorna <code>204 No Content</code>.
=== GET /api/v1/categories/roles ===
Recupera todos los roles y perfiles configurados en la base de datos maestra del ERP (MvcSERPI) para la empresa actual.
* '''Ruta y Método:''' <code>GET /api/v1/categories/roles</code>
|-| Carpetas y Workspace=


=== GET /api/v1/folders ===
=== GET /api/v1/folders ===
Retorna la estructura jerárquica completa de carpetas, subcarpetas y formularios, filtrada automáticamente por los roles del usuario.
Retorna la estructura jerárquica completa de carpetas, subcarpetas y formularios, filtrada automáticamente por los roles del usuario.


* '''Ruta y Método:''' <code>GET /api/v1/folders</code>
=== GET /api/v1/forms/stats ===
 
Calcula y devuelve los indicadores clave (KPIs) globales del Workspace para la empresa.
==== Respuesta Exitosa (200 OK) ====
==== Respuesta Exitosa (200 OK) ====
<source lang="json">
<source lang="json">
[
{
   {
   "respuestasHoy": 142,
    "id": "folder_10",
  "respuestasTotal": 12850,
    "name": "Comercial 2026",
  "formulariosActivos": 18
    "parentId": null,
}
    "categoriaId": 1,
    "color": "#3B82F6",
    "children": [],
    "forms": []
  }
]
</source>
</source>


=== POST /api/v1/folders ===
=== GET /api/v1/forms/public/{empresaid}/{uuid} ===
Crea una nueva carpeta en la raíz o como subcarpeta.
Devuelve el esquema y diseño público de un formulario para renderizarse en el frontend (No requiere JWT).
 
* '''Ruta y Método:''' <code>POST /api/v1/folders</code>
 
==== Parámetros ====
==== Parámetros ====
{| class="wikitable"
{| class="wikitable"
!Parámetro
!Tipo
!Obligatorio
!Descripción
|-
|-
|Body
! Parámetro !! Tipo !! Obligatorio !! Descripción
|Object
|-
|Sí
| empresaid || Integer || Sí (Path) || ID de la empresa o 0 para resolver automáticamente.
|Datos de la carpeta (name, parentId, categoriaId).
|-
| uuid || String || Sí (Path) || UUID público del formulario.
|}
|}


=== PUT y DELETE /api/v1/folders/{id} ===
</div>
</div>


* '''PUT:''' Renombra o mueve una carpeta existente. Retorna <code>204 No Content</code>.
<div class="mw-collapsible mw-collapsed" style="border: 1px solid #bbdefb; background-color: #e3f2fd; padding: 10px; margin-bottom: 10px; border-radius: 4px;">
* '''DELETE:''' Borrado lógico en cascada de una carpeta y sus dependencias. Retorna <code>204 No Content</code>.
<div style="font-weight: bold; font-size: 1.1em; color: #1565c0;">🟦 POST (Creación y Procesos)</div>
 
<div class="mw-collapsible-content" style="background-color: #ffffff; padding: 15px; margin-top: 10px; border: 1px solid #bbdefb;">
=== GET /api/v1/folders/{id}/history ===
Obtiene la bitácora de auditoría histórica de eventos sobre la carpeta (creación, renombramiento, etc).
 
|-| Formularios Dinámicos=


=== POST /api/v1/forms ===
=== POST /api/v1/forms ===
Crea un nuevo formulario dinámico asociando su esquema JSON y retornando un UUID no secuencial para la URL pública.
Crea un nuevo formulario dinámico asociando su esquema JSON y retornando un UUID para la URL pública.
 
* '''Ruta y Método:''' <code>POST /api/v1/forms</code>
 
==== Parámetros ====
==== Parámetros ====
{| class="wikitable"
{| class="wikitable"
!Parámetro
!Tipo
!Obligatorio
!Descripción
|-
|-
|Body
! Parámetro !! Tipo !! Obligatorio !! Descripción
|Object
|-
|Sí
| Body || Object || Sí || Datos requeridos para la plantilla de formulario.
|Payload con nombre, título, descripción, carpetaId y esquemaJson.
|}
|}
==== Respuesta Exitosa (201 Created) ====
==== Respuesta Exitosa (201 Created) ====
<source lang="json">
<source lang="json">
Línea 172: Línea 73:
</source>
</source>


=== Endpoints de Gestión de Formularios ===
=== POST /api/v1/forms/public/{empresaid}/{uuid}/responses ===
Endpoint público para registrar la respuesta diligenciada por un encuestado. Garantiza inmutabilidad y orquesta el cobro de folio SaaS.
==== Payload Esperado ====
<source lang="json">
{
  "respuestaJson": "{\"idtercero\":1502,\"idsucursal\":1,\"respuestas\":[{\"pregunta_id\":\"q1\",\"valor\":\"Excelente\"}]}"
}
</source>


* '''PUT /api/v1/forms/{uuid}:''' Actualiza esquema JSON y detalles.
=== POST /api/v1/billing/process ===
* '''DELETE /api/v1/forms/{uuid}:''' Borrado lógico (Soft Delete) hacia la papelera.
Orquestación interna SaaS para debitar folios transaccionales (Zero-Trust). No utiliza JWT, sino el encabezado HTTP <code>X-Secret-Key</code>.
* '''PUT /api/v1/forms/{uuid}/toggle-status:''' Activa o desactiva el formulario.
* '''PUT /api/v1/forms/{uuid}/move?carpetaId={id}:''' Reubica el formulario en otra carpeta.
* '''GET /api/v1/forms/{uuid}/history:''' Auditoría cronológica de modificaciones.
* '''PUT /api/v1/forms/{uuid}/restore:''' Restaura un formulario desde la papelera.
 
=== Endpoints de Respuestas y Métricas ===
 
* '''GET /api/v1/forms/stats:''' Devuelve KPIs globales (respuestasHoy, respuestasTotal, formulariosActivos).
* '''GET /api/v1/forms/{formId}/responses:''' Listado detallado de respuestas (soporta startDate y endDate).
* '''GET /api/v1/forms/{formId}/responses/count:''' Conteo numérico total de respuestas.
 
=== Disponibilidad y Terceros ===
 
* '''GET /api/v1/forms/surveys/available:''' Evalúa encuestas disponibles para un tercero, aplicando reglas anti-spam.
* '''POST /api/v1/forms/terceros/verificar:''' Valida registros activos en <code>gdttercero</code> enviando un arreglo de NITs.


|-| Público, SaaS y Empresa=
</div>
</div>


=== GET /api/v1/forms/public/{empresaid}/{uuid} ===
<div class="mw-collapsible mw-collapsed" style="border: 1px solid #ffe0b2; background-color: #fff3e0; padding: 10px; margin-bottom: 10px; border-radius: 4px;">
Devuelve el esquema y diseño público de un formulario para renderizarse en el frontend. (No requiere JWT).
<div style="font-weight: bold; font-size: 1.1em; color: #e65100;">🟧 PUT (Actualizaciones)</div>
 
<div class="mw-collapsible-content" style="background-color: #ffffff; padding: 15px; margin-top: 10px; border: 1px solid #ffe0b2;">
* '''Ruta y Método:''' <code>GET /api/v1/forms/public/{empresaid}/{uuid}</code>


=== PUT /api/v1/forms/{uuid} ===
Actualiza el título, descripción y estructura de preguntas (Esquema JSON) de un formulario existente.
==== Parámetros ====
==== Parámetros ====
{| class="wikitable"
{| class="wikitable"
!Parámetro
!Tipo
!Obligatorio
!Descripción
|-
|-
|empresaid
! Parámetro !! Tipo !! Obligatorio !! Descripción
|Integer
|Sí (Path)
|ID de la empresa o 0 para autocompletar.
|-
|-
|uuid
| uuid || String || Sí (Path) || UUID del formulario a actualizar.
|String
|-
|Sí (Path)
| Body || Object || Sí || Datos actualizados del formulario.
|UUID público del formulario.
|}
|}


=== POST /api/v1/forms/public/{empresaid}/{uuid}/responses ===
=== PUT /api/v1/forms/{uuid}/toggle-status ===
Endpoint público para registrar la respuesta de un encuestado. Garantiza inmutabilidad y orquesta el cobro de folio SaaS.
Alterna el estado de un formulario entre Activo e Inactivo (bloquea la recepción de respuestas).
 
=== PUT /api/v1/forms/{uuid}/move ===
Reubica un formulario en otra carpeta contenedora o en la raíz del Workspace enviando <code>?carpetaId=25</code>.
 
</div>
</div>


* '''Ruta y Método:''' <code>POST /api/v1/forms/public/{empresaid}/{uuid}/responses</code>
<div class="mw-collapsible mw-collapsed" style="border: 1px solid #ffcdd2; background-color: #ffebee; padding: 10px; margin-bottom: 10px; border-radius: 4px;">
<div style="font-weight: bold; font-size: 1.1em; color: #c62828;">🟥 DELETE (Eliminaciones)</div>
<div class="mw-collapsible-content" style="background-color: #ffffff; padding: 15px; margin-top: 10px; border: 1px solid #ffcdd2;">


==== Payload Esperado ====
=== DELETE /api/v1/categories/{id} ===
<source lang="json">
Elimina de forma física y permanente una categoría. Fallará si la categoría posee carpetas activas.
{
  "respuestaJson": "{\"idtercero\":1502,\"idsucursal\":1,\"respuestas\":[{\"pregunta_id\":\"q1\",\"valor\":\"Excelente\"}]}"
}
</source>


=== POST /api/v1/billing/process ===
=== DELETE /api/v1/folders/{id} ===
Orquestación interna SaaS para debitar folios transaccionales (Zero-Trust).
Realiza un borrado lógico en cascada de una carpeta y de todas sus subcarpetas y formularios dependientes.


* '''Autenticación:''' Utiliza el encabezado HTTP <code>X-Secret-Key</code> en lugar de JWT.
=== DELETE /api/v1/forms/{uuid} ===
Ejecuta un borrado lógico (Soft Delete) del formulario, desactivándolo y moviéndolo a la papelera sin perder respuestas históricas. Requiere estar apagado previamente.
==== Códigos de Error Posibles ====
* <code>400 Bad Request:</code> El formulario está Activo. Debe desactivarse antes de eliminarse.
* <code>401 Unauthorized:</code> No autenticado.
* <code>404 Not Found:</code> Formulario inexistente.


=== GET /api/v1/companies/logo ===
</div>
Obtiene el logotipo corporativo configurado en la base de datos maestra (retorna Base64 o URL). </tabber>
</div>

Revisión actual - 10:09 21 ago 2026

⚡ Referencia de Endpoints

A continuación, los servicios expuestos organizados por método HTTP. Haz clic en cada bloque para expandir la documentación.

🟩 GET (Consultas y Lecturas)

GET /api/v1/categories

Devuelve un listado completo de todas las categorías configuradas en el sistema para la empresa del usuario autenticado.

Respuesta Exitosa (200 OK)

[
  {
    "categoriaId": 1,
    "nombre": "Encuestas de Satisfacción",
    "color": "#3B82F6",
    "roleIds": [101, 102]
  }
]

GET /api/v1/folders

Retorna la estructura jerárquica completa de carpetas, subcarpetas y formularios, filtrada automáticamente por los roles del usuario.

GET /api/v1/forms/stats

Calcula y devuelve los indicadores clave (KPIs) globales del Workspace para la empresa.

Respuesta Exitosa (200 OK)

{
  "respuestasHoy": 142,
  "respuestasTotal": 12850,
  "formulariosActivos": 18
}

GET /api/v1/forms/public/{empresaid}/{uuid}

Devuelve el esquema y diseño público de un formulario para renderizarse en el frontend (No requiere JWT).

Parámetros

Parámetro Tipo Obligatorio Descripción
empresaid Integer Sí (Path) ID de la empresa o 0 para resolver automáticamente.
uuid String Sí (Path) UUID público del formulario.
🟦 POST (Creación y Procesos)

POST /api/v1/forms

Crea un nuevo formulario dinámico asociando su esquema JSON y retornando un UUID para la URL pública.

Parámetros

Parámetro Tipo Obligatorio Descripción
Body Object Datos requeridos para la plantilla de formulario.

Respuesta Exitosa (201 Created)

{
  "formId": 45,
  "uuid": "d3b07384-d113-4f4a-a62e-336712345678",
  "titulo": "Encuesta de Satisfacción en Visita",
  "urlPublica": "/f/15/d3b07384-d113-4f4a-a62e-336712345678"
}

POST /api/v1/forms/public/{empresaid}/{uuid}/responses

Endpoint público para registrar la respuesta diligenciada por un encuestado. Garantiza inmutabilidad y orquesta el cobro de folio SaaS.

Payload Esperado

{
  "respuestaJson": "{\"idtercero\":1502,\"idsucursal\":1,\"respuestas\":[{\"pregunta_id\":\"q1\",\"valor\":\"Excelente\"}]}"
}

POST /api/v1/billing/process

Orquestación interna SaaS para debitar folios transaccionales (Zero-Trust). No utiliza JWT, sino el encabezado HTTP X-Secret-Key.

🟧 PUT (Actualizaciones)

PUT /api/v1/forms/{uuid}

Actualiza el título, descripción y estructura de preguntas (Esquema JSON) de un formulario existente.

Parámetros

Parámetro Tipo Obligatorio Descripción
uuid String Sí (Path) UUID del formulario a actualizar.
Body Object Datos actualizados del formulario.

PUT /api/v1/forms/{uuid}/toggle-status

Alterna el estado de un formulario entre Activo e Inactivo (bloquea la recepción de respuestas).

PUT /api/v1/forms/{uuid}/move

Reubica un formulario en otra carpeta contenedora o en la raíz del Workspace enviando ?carpetaId=25.

🟥 DELETE (Eliminaciones)

DELETE /api/v1/categories/{id}

Elimina de forma física y permanente una categoría. Fallará si la categoría posee carpetas activas.

DELETE /api/v1/folders/{id}

Realiza un borrado lógico en cascada de una carpeta y de todas sus subcarpetas y formularios dependientes.

DELETE /api/v1/forms/{uuid}

Ejecuta un borrado lógico (Soft Delete) del formulario, desactivándolo y moviéndolo a la papelera sin perder respuestas históricas. Requiere estar apagado previamente.

Códigos de Error Posibles

  • 400 Bad Request: El formulario está Activo. Debe desactivarse antes de eliminarse.
  • 401 Unauthorized: No autenticado.
  • 404 Not Found: Formulario inexistente.