Workflow / BPM

Workflow / BPM

El módulo de Workflow implementa un motor BPM (Business Process Management) propio que permite definir procesos, tareas y formularios dinámicos. Los procesos se modelan con estados, transiciones y acciones configurables desde la interfaz de administración.

Base URL: /workflow/  ·  Auth: Sesión Django  ·  Webhook: Header X-Reconcile-Token desde variable de entorno BPM_RECONCILE_TOKEN

Conceptos clave

EntidadModeloDescripción
ProcesoProcesoWorkFlow_PDefinición de un flujo de trabajo (estados, transiciones)
TareaTarea_PPaso individual dentro de un proceso
FormularioFormulario_PDefinición de formulario dinámico asociado a una tarea
InstanciaEjecución concreta de un proceso para un ciudadano/trámite
HistorialHistorialProceso_PVersionado y staging de los procesos
SoporteSoporte_PTickets de soporte y documentos adjuntos a instancias

Flujo de vida de una instancia

  1. Se crea una instancia del proceso (normalmente desde un módulo ciudadano).
  2. El sistema asigna la primera tarea al pool o a un usuario específico.
  3. El usuario toma la tarea (POST /api/tomar-tarea/).
  4. El usuario completa el formulario dinámico de la tarea.
  5. Se ejecuta una acción (POST /api/ejecutar-accion/) para avanzar el proceso.
  6. El sistema actualiza el estado de la instancia y asigna la siguiente tarea.
  7. El ciclo se repite hasta que el proceso llega a un estado final.

Endpoints de usuario

Mis tareas

MétodoEndpointDescripción
GET/workflow/mis-tareas/Dashboard de tareas del usuario
GET/workflow/mis-tareas/data/Datos AJAX para tabla de tareas
GET/workflow/instancia/{instancia_llave}/trazabilidad/Trazabilidad de una instancia

Formulario de tarea

MétodoEndpointDescripción
GET/workflow/instancia/{instancia_llave}/formulario/{tar_codigo}/Renderizar el formulario dinámico de la tarea

API de tareas y procesos

MétodoEndpointBody / ParamsDescripción
POST/workflow/api/ejecutar-accion/{"action_name", "instance_id", ...params}Ejecutar acción/botón en el BPM
POST/workflow/api/tomar-tarea/{"task_id": "..."}Tomar tarea del pool
GET/workflow/api/pool-status/Estado del pool de tareas del usuario
GET/workflow/api/soportes-visibles/Soportes/tickets visibles
GET/workflow/api/catalogos/Catálogos LOV para formularios
POST/workflow/api/soportes/crear/data (JSON)Crear ticket de soporte
GET/workflow/api/procesos/{llave}/tareas/{codigo}/detalle/Detalle de una tarea en un proceso
POST/workflow/api/procesos/{llave}/staging/guardar/data (JSON)Guardar datos en staging
POST/workflow/api/procesos/{llave}/refrescar/Refrescar estado del proceso
POST/workflow/api/procesos/{llave}/publicar/Publicar proceso (promover desde staging)

Gestión de formularios dinámicos

MétodoEndpointDescripción
GET/workflow/formularios/Listar todos los formularios
POST/workflow/formularios/crear/Crear formulario
GET/POST/workflow/formularios/{codigo}/editar/Editar formulario
DELETE/workflow/formularios/{codigo}/eliminar/Eliminar formulario
GET/workflow/formularios/{codigo}/builder/Constructor visual de formulario
POST/workflow/api/formularios/{codigo}/guardar/Guardar esquema del formulario (JSON Schema)
GET/workflow/api/formularios/{codigo}/preview/Vista previa del formulario

Esquema de formulario (JSON Schema)

Los formularios dinámicos se definen mediante JSON Schema. Ejemplo mínimo:

{
  "type": "object",
  "properties": {
    "nombre": {
      "type": "string",
      "title": "Nombre completo"
    },
    "fecha_nacimiento": {
      "type": "string",
      "format": "date",
      "title": "Fecha de nacimiento"
    },
    "estado": {
      "type": "string",
      "title": "Estado",
      "enum": ["activo", "inactivo"]
    }
  },
  "required": ["nombre"]
}

Webhook de reconciliación BPM

Permite que sistemas externos sincronicen el estado de los procesos mediante una llamada server-to-server autenticada.

PropiedadValor
MétodoPOST
Ruta/workflow/api/reconciliar-bpm/
AutenticaciónHeader X-Reconcile-Token: <BPM_RECONCILE_TOKEN>
Content-Typeapplication/json
POST /workflow/api/reconciliar-bpm/
X-Reconcile-Token: tu_token_secreto_bpm
Content-Type: application/json

{
  "instancia_id": "uuid-de-la-instancia",
  "nuevo_estado": "completado",
  "datos": { }
}
import requests

TOKEN = "tu_token_secreto_bpm"
resp = requests.post(
    "https://TU-DOMINIO/workflow/api/reconciliar-bpm/",
    headers={"X-Reconcile-Token": TOKEN},
    json={
        "instancia_id": "uuid-de-la-instancia",
        "nuevo_estado": "completado",
        "datos": {}
    }
)
data = resp.json()
const TOKEN = 'tu_token_secreto_bpm';
const { data } = await axios.post(
  'https://TU-DOMINIO/workflow/api/reconciliar-bpm/',
  {
    instancia_id: 'uuid-de-la-instancia',
    nuevo_estado: 'completado',
    datos: {}
  },
  { headers: { 'X-Reconcile-Token': TOKEN } }
);
client.DefaultRequestHeaders.Add("X-Reconcile-Token", "tu_token_secreto_bpm");
var body = new StringContent(
    JsonSerializer.Serialize(new {
        instancia_id = "uuid-de-la-instancia",
        nuevo_estado = "completado",
        datos = new { }
    }),
    Encoding.UTF8, "application/json"
);
var response = await client.PostAsync(
    "https://TU-DOMINIO/workflow/api/reconciliar-bpm/", body);
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://TU-DOMINIO/workflow/api/reconciliar-bpm/"))
    .header("X-Reconcile-Token", "tu_token_secreto_bpm")
    .header("Content-Type", "application/json")
    .POST(HttpRequest.BodyPublishers.ofString(
        "{\"instancia_id\":\"uuid-de-la-instancia\"," +
        "\"nuevo_estado\":\"completado\",\"datos\":{}}"
    ))
    .build();
Seguridad: El token se configura en la variable de entorno BPM_RECONCILE_TOKEN. Nunca exponerlo en el cliente.

Modelos de datos

ModeloCampos claveDescripción
ProcesoWorkFlow_P codigo, nombre, estado, adduser, adddate Definición de proceso BPM
Tarea_P codigo, proceso (FK), nombre, tipo, orden Paso dentro de un proceso
Formulario_P codigo, nombre, schema (JSON), estado Definición de formulario dinámico
HistorialProceso_P proceso (FK), version, estado, adddate Versionado / staging de procesos
Soporte_P instancia (FK), tipo, descripcion, archivo Tickets y documentos adjuntos

Staging y publicación de procesos

Los procesos siguen un flujo de versionado antes de activarse en producción:

  1. Borrador (staging): Se editan los procesos y formularios sin afectar instancias activas.
  2. Guardar staging: POST /workflow/api/procesos/{llave}/staging/guardar/ — persiste cambios en staging.
  3. Publicar: POST /workflow/api/procesos/{llave}/publicar/ — promueve el staging a versión activa.

Generación de documentos desde Workflow

Las instancias de proceso pueden generar documentos PDF con información del trámite:

  • GET /generar/{plantilla}/{llave}/ — genera HTML desde plantilla Django con datos de la instancia.
  • POST /imprimir/ — convierte el HTML generado a PDF para descarga.
  • POST /api-siud/documentos/generar/ — versión API (requiere codigo y llave).