Centro de Consultores
Consultor
0 • Menú de la plataforma
0 • Menú de la plataforma
1 • Organización
1 • Organización
2 • Operaciones
2 • Operaciones
3 • Áreas de operación
3 • Áreas de operación
4 • Usuarios
4 • Usuarios
5 • Perfil de usuarios
5 • Perfil de usuarios
6 • Actores
6 • Actores
7 • Eventos
7 • Eventos
8 • Fichas de actores
8 • Fichas de actores
9 • Flujos de trabajo o proceso
9 • Flujos de trabajo o proceso
10 • Formularios
10 • Formularios
11 • Configuración de datos
11 • Configuración de datos
12 • Carga masiva de datos
12 • Carga masiva de datos
13 • Hojas de cálculo
13 • Hojas de cálculo
14 • Reportes PDF de Flujos y Formularios
14 • Reportes PDF de Flujos y Formularios
15 • Dashboards dinámicos
15 • Dashboards dinámicos
16 • Gestor documental
16 • Gestor documental
17 • Notificaciones
17 • Notificaciones
Secciones del JSON del flujo
El JSON del flujo se divide en varias secciones:
- Generalidades (obligatorio): Nombre e ID del flujo.
- Conectores (obligatorio): Configura la secuencia de pasos según el diagrama del flujo.
- Decisiones (opcional): Configura las decisiones.
- Acciones (obligatorio): Configura las acciones, que pueden ser de tipo
action
(realiza una acción en Sepiia) oevent
(configura el evento y actor relacionado con el flujo y sus atributos).
- Tareas (opcional): Enlaza los formularios que conforman cada tarea o
TASK
dentro del flujo.
A continuación se explicará cómo se configura cada sección de un flujo, tomando como ejemplo el Diagrama de flujo del Registro de un Hallazgo o Incidente, el cual consta de dos formularios, el
TRIGGER
(quien gatilla el flujo) y un TASK
, tres decisiones y seis acciones.Generalidades
{ "operationId": "24", "user": "admin.prevries@smartdici.com", "code": "INCI_FLOW", "description": "", "geoPosition": "0.0 0.0", "name": "Reporte de incidencia", "operationAreasTrigger": [45], "triggerData": { "flowBeginDate": "", "flowTittle": "Incidencia ##_SEQUENCE.incidente_prevencion#. '#_TRIGGER.reporte.INCI_TITULO#'" }, "type": "WORKFLOW" "template": { "actions": [], "connectors": [], "decisions": [], "tasks": [] } }
Parámetro | Valor | Descripción |
operationId | "24" | Identificador único de la operación. |
user | "admin.prevries@smartdici.com" | Email del usuario que realiza la operación. |
code | "INCI_FLOW" | Código que identifica el flujo o proceso. |
description | "" | Descripción del flujo o proceso (vacío en este caso). |
geoPosition | "0.0 0.0" | Posición geográfica relacionada con el flujo (en formato latitud y longitud). |
name | "Reporte de incidencia" | Nombre descriptivo del flujo. |
operationAreasTrigger | [45] | Áreas de la operación que pueden activar el flujo. |
triggerData | Array de objetos JSON | Array que especifica los datos del flujo. |
triggerData.flowBeginDate | "" | Fecha de inicio del flujo (vacío en este caso). |
triggerData.flowTittle | "Incidencia ##_SEQUENCE.incidente_prevencion#. '#_TRIGGER.reporte.INCI_TITULO#'" | Título dinámico del flujo generado por el disparador. |
type | "WORKFLOW" | Tipo de flujo, en este caso un flujo de trabajo. |
template | ㅤ | Objeto JSON que incluye acciones, conectores, decisiones y tareas. |
template.actions | Array de objetos JSON | Acciones definidas en la plantilla del flujo. |
template.connectors | Array de objetos JSON | Conectores entre diferentes elementos del flujo (por ejemplo, tasks, decisiones y acciones). |
template.decisions | Array de objetos JSON | Decisiones que determinan la ruta del flujo según las condiciones evaluadas. |
template.tasks | Array de objetos JSON | Tareas específicas definidas en el flujo. |
Conectores
Los conectores son la manera de indicar a Sepiia el orden de ejecución de los objetos en el flujo. Se forman de la siguiente forma:
"connectors": [ { "from": "start", "text": "", "to": "D1", "type": "line" }, { "from": "D1", "text": "", "to": "A1", "type": "lineYes" }, { "from": "D1", "text": "", "to": "A2", "type": "lineNot" }, { "from": "A1", "text": "", "to": "end", "type": "line" }, { "from": "A2", "text": "", "to": "end", "type": "line" } ],
Parámetro | Valor | Explicación |
from | "start" , "D1" , "A1" , etc. | Identificador del punto de inicio del conector. Start = Trigger, D1 = Decisión, A1 = Acción, T1 = Task. |
to | "D1" , "A1" , "T1" , "end" , etc. | Identificador del punto de destino del conector. |
type | "line" , "lineYes" , "lineNot" | Tipo de línea que representa la decisión o flujo entre elementos. lineYes = lleva a una Decisión Afirmativa, lineNot = lleva a una decisión negativa. line = si no esta involucrada ninguna decisión. END = fin del flujo. |
text | "" | Texto descriptivo asociado con el conector (vacío en estos casos). |
Decisiones
Las decisiones permiten bifurcar el flujo en diferentes caminos según las opciones seleccionadas en el formulario. En el flujo de ejemplo, se utiliza una decisión llamada
decision
, que puede leer y validar los datos del formulario para verificar si se cumple una condición (lineYes
y lineNot
).Las decisiones pueden causar:
- Que dentro del formulario activo aparezca una sección u otra con distinta información, desencadenando diferentes caminos del flujo.
- Que en el siguiente formulario o paso se muestre una u otra opción de tarea (
TASK
), tomando diferentes caminos en el flujo según la decisión.
- Que dependiendo de la decisión, el flujo termine o continúe con un siguiente formulario o paso (
TASK
).
A continuación, se muestra cómo configurar una decisión en el flujo en el ejemplo que venimos trabajando, “Registro de hallazgo”.
"decisions": [ { "cond": "'#_TRIGGER.reporte.INCI_RIES_PERCI.key#' == 'personas'", "id": "D1", "text": "¿Riesgo persona?", "type": "decision" }, { "cond": "#_TASK.T1.solucion.INCI_ACEPTA_INCI# == true", "id": "D2", "text": "¿El área designada toma el caso?", "type": "decision" }, { "cond": "'#_TASK.T1.solucion.INCI_RIES_PERCI.key#' == 'personas'", "id": "D3", "text": "¿Riesgo persona?", "type": "decision" } ],
Parámetro | Valor | Explicación |
id | "D1 ", "D2" , "D3" | Identificador único de cada decisión, debe coincidir con el nombre colocado en los conectores. |
text | "¿Riesgo persona?" , "¿El área designada toma el caso?" | Pregunta o texto que describe la decisión a tomar. |
type | "decision" | Tipo de elemento, indicando que es una decisión. |
cond | "cond": "'#_TASK.T1.solucion.INCI_RIES_PERCI.key#' == 'personas'" | Condiciones evaluadas para determinar el flujo basado en variables dinámicas. |
Acciones
Las acciones corresponden a tareas que Sepiia puede ejecutar como llamar a distintas APIs o enviar correos electrónicos.
Las acciones se configuran de la siguiente forma:
"actions": [ { "data": { "channel": "_WEB_", "clientId": 24, "details": "SmartPNG", "element": "#_TRIGGER._SEQUENCE.incidente_prevencion#", "elementType": "INCI_PREV", "eventId": "SET_INCI_PREV", "eventProcessId": 1, "forced": false, "parameters": [ { "key": "INCI_COD_INCI_PREV", "value": "#_TRIGGER._SEQUENCE.incidente_prevencion#" }, { "key": "INCI_ACEPTA_INCI", "value": "null" }, { "key": "INCI_AREA_SECTOR", "value": "#_TRIGGER.reporte.INCI_AREA_SECTOR.key#" }, { "key": "INCI_CATEGO_PERS", "value": "#_TRIGGER.reporte.INCI_CATEGO_PERS.key#" }, { "key": "INCI_ESTADO", "value": "abierta" }, { "key": "INCI_FEC_REPO", "value": "fx(getDate('#_TRIGGER.reporte.INCI_FEC_REPO#','dd-MM-yyyy HH:mm:ss');dateFormat($result,'yyyy-MM-dd HH:mm:ss'))" }, { "key": "INCI_ID_TSK_GANTT", "value": "657" } ], "user": "WEB" }, "id": "A1", "text": "Registra Incidente de prevención - Persona", "type": "event" }, { "data": { "channel": "_WEB_", "clientId": 24, "details": "SmartPNG", "element": "#_TRIGGER._SEQUENCE.incidente_prevencion#", "elementType": "INCI_PREV", "eventId": "SET_INCI_PREV", "eventProcessId": 1, "forced": false, "parameters": [ { "key": "INCI_COD_INCI_PREV", "value": "#_TRIGGER._SEQUENCE.incidente_prevencion#" }, { "key": "INCI_ACEPTA_INCI", "value": "null" }, { "key": "INCI_FEC_REPO", "value": "fx(getDate('#_TRIGGER.reporte.INCI_FEC_REPO#','dd-MM-yyyy HH:mm:ss');dateFormat($result,'yyyy-MM-dd HH:mm:ss'))" } ], "user": "WEB" }, "id": "A2", "text": "Registra Incidente de prevención - Producción", "type": "event" } ]
Parámetro | Valor | Explicación |
id | "A1" , "A2" , etc. | Identificador único de cada acción, debe coincidir con los nombres colocados en conectores. |
text | "Registra Incidente de prevención - Persona" , etc. | Descripción textual de la acción. |
type | "event" / "addTaskGantt" / “action” | Tipo de acción, event = que puede ser un evento, addTaskGantt = la adición de una tarea a un proyecto, action = cuand se ejecuta una Regla configurada es Sepiia, se debe hacer referencia al id de la Regla. |
data.channel | "_WEB_" | Canal por el cual se ejecuta la acción, en este caso web. |
data.clientId | 24 | Es el id de la operación. |
data.details | "SmartPNG" | No cambiar. |
data.element | "#_TRIGGER._SEQUENCE.incidente_prevencion#" | Elemento o identificador que dispara la acción, el cual tiene la siguiente estructura: #formulario.key_sección.key_campo# |
data.elementType | "INCI_PREV" | Código del elemento o actor asociado a la acción. |
data.eventId | "SET_INCI_PREV" | Código del evento relacionado con la acción. |
data.eventProcessId | 1 | Identificador del proceso de evento. |
data.forced | false | Indica si la acción es forzada. |
data.parameters | Array de objetos con claves y valores específicos. | Parámetros configurados para cada acción, como códigos, estados, y otros identificadores dinámicos. |
data.parameters.key | "INCI_SOLUCION" ,etc. | Corresponde al código del atributo. |
data.parameters.value | "#_TASK.T1.solucion.descrip#" | Corresponde al lugar del formulario desde donde se obtiene el valor, se forma de la siguiente manera:
#formulario.key_sección.key_campo# |
data.user | "WEB" , “APP” | Usuario que ejecuta la acción. |
Tipo Action
La accion de tipo
“action”
permite configurar el envío de un correo, notificación firebase, alerta firebase, después de que se ejecuta un paso en el flujo. Esta acción (correo, notificación o alerta) se configura desde la plataforma en el Menú Reglas y Estrategias, pero posteriormente se debe enlazar esa notificación con la Acción del flujo, esto se realiza anotando el código de la regla correspondiente.{ "loopTimes": "", "text": "Envia correo de notificación", "id": "A2", "type": "action", "ruleId": 1913 }
Parámetro | Valor | Explicación |
“id” | "A2" | Identificador único de cada acción, debe coincidir con los nombres colocados en conectores. |
text | "Envía correo de notificación” | Descripción textual de la acción. |
type | “action” | Tipo de acción, Action = cuando se ejecuta una Regla configurada es Sepiia, se debe hacer referencia al id de la Regla. |
“ruleId” | 1913 | Corresponde al id de la Regla configurada para que ejecute la acción, en este caso Envío de correo. Este id se puede ver en la Web. |
Tipo addTaskGantt
La acción de tipo
addTaskGantt
permite crear una tarea de proyecto y alojarla dentro de un proyecto en específico, sin importar el área de operación u organización, ya que sólo se debe indicar el flujo al que pertenece (alojado en la tabla gestion.flujo
) y dentro de una Etapa en específico de ese proyecto (alojados en gestion.gantt
).{ "data": { "assignedHours": "#_TASK.T1.solucion.assignedHours#", "budget": "#_TASK.T1.solucion.presupuesto#", "criticalId": "#_TASK.T1.solucion.critic.id#", "description": "#_TASK.T1.solucion.descrip#", "endDate": "fx( getDate('#_TASK.T1.solucion.fecha_fin#','dd-MM-yyyy'); dateFormat($result,'yyyy-MM-dd') )", "flowId": "#_TASK.T1.solucion.flowTaskId#", "formId": "657", "id": "#_TRIGGER._SEQUENCE.incidente_prevencion#", "managerId": "#_TASK.T1.solucion.asig.id#", "name": "#_TASK.T1.solucion.titulo#", "parentTaskId": "#_TASK.T1.solucion.parentTaskId#", "startDate": "fx( getDate('#_TASK.T1.solucion.fecha_inicio#','dd-MM-yyyy'); dateFormat($result,'yyyy-MM-dd') )", "userId": "#_CURRENT.user_id#" }, "id": "A6", "text": "Agrega una tarea a una gantt existente", "type": "addTaskGantt" }
Parámetros | ㅤ | Descripción |
"data": | "formId": | Id del template del formulario que tendrá la tarea de proyecto. |
ㅤ | "endDate": | Fecha de término de la tarea. |
ㅤ | "parentTaskId": | Id de la etapa del proyecto donde se almacenará la tarea en gestion.gantt . |
ㅤ | "criticalId": | Criticidad de la tarea. |
ㅤ | "name": | Nombre o título de la tarea. |
ㅤ | "description": | Descripción de la tarea. |
ㅤ | "managerId": | Id del responsable de ejecutar la tarea. |
ㅤ | "flowId": | Id del flujo del proyecto en gestion.flujo . |
ㅤ | "userId": | Creador de la tarea. |
ㅤ | "startDate": | Fecha de inicio. |
ㅤ | "budget": | Presupuesto (opcional). |
ㅤ | "assignedHours": | Horas diarias que el responsable le dedicará a la tarea (opcional). |
"text": | "Agrega una tarea a una gantt existente" | Texto descriptivo, visible en el log. |
"id": | numérico | Identifica la acción dentro del flujo. |
"type": | "addTaskGantt" | Es el tipo de acción, no modificar. |
Tareas
Las tareas corresponden a formularios digitales, los cuales a su vez pueden representar un paso en el proceso productivo. Un flujo puede estar compuesto por uno o más pasos.
Las
tasks
se configuran de la siguiente forma:"tasks": [ { "approveType": "MANAGER", "assignmentTypeId": "POSITION", "duration": 1440, "formCode": "RESP_INCI", "id": "T1", "operationId": 24, "positionJobCode": "#_GLOBAL.cargo_code#", "text": "Solución incidencia", "type": "task" } ]
Parámetro | Valor | Descripción |
id | "T1" | Identificador único de la tarea. Debe coincidir con lo colocado en los conectores. |
text | "Solución incidencia" | Descripción textual de la tarea. |
type | "task" | Tipo de elemento, indicando que es una tarea. |
approveType | "MANAGER" | Tipo de aprobación requerida para la tarea. |
assignmentTypeId | "POSITION" | Tipo de asignación basado en la posición del empleado. Para ver otros tipos de asignaciones (Asignación de tareas) |
duration | 1440 | Duración estimada de la tarea en minutos para que su avance programado sea de un 100%. |
formCode | "RESP_INCI" | Código del formulario asociado a la tarea. |
operationId | 24 | Identificador de la operación asociada a la tarea. |
positionJobCode | "#_GLOBAL.cargo_code#" | Código del puesto de trabajo necesario para la tarea. |
“managerId” | numérico, id del usuario | Completar sólo si el “assignmentTypeId” es PREDIFINED . Se debe colocar el id del usuario o bien el campo del formulario desde donde se rescata. Es a quien se le pasa la responsabilidad de aprobar la tarea. Los otros miembros podrán seguir viendo el formulario pero no aprobarlo y pasar al siguiente paso. |
Asignación de tareas
Las tareas dentro de cada formulario pueden asignarse de 3 maneras diferentes.
1. Asignación por área de operación: La tarea aparecerá en el Escritorio de todas las personas que sean parte de un Área de operación. El primer usuario que haga clic en ella tendrá la responsabilidad de aprobar o rechazar la tarea. Los demás participantes podrán seguir viendo la tarea pero sin poder aprobarla. Se debe indicar el
"operationAreaId"
que equivale al área de operación en cuestión. Los ID deben pedirse a soporte.{ "duration": 1440, "formId": 556, "approveType": "MANAGER", "assignmentTypeId": "MANUALLY", "operationAreaId": 63, "text": "Validación líder asistencia", "id": "T1", "type": "task" },
2. Asignación por cargo: La tarea aparecerá en el Escritorio de todas las personas que compartan un cargo. Se debe indicar el ID del cargo y la operación a la que pertenece. Los ID deben consultarse con soporte.
{ "duration": 1440, "formId": 592, "approveType": "MANAGER", "assignmentTypeId": "POSITION", "positionJobId": 9, || "positionJobCode": #_GLOBAL.cargo_code#", "operationId": 14, "text": "Asignación Revisor", "id": "T1", "type": "task" },
3. Asignación a usuario: La tarea aparecerá en el Escritorio del usuario asignado. La asignación debe hacerse por el ID de usuario el cual puede rescatarse a través de un
selection
que contenga una query a los sepiia.USUARIO
y usar el ID. { "duration": 1440, "formId": 593, "approveType": "MANAGER", "assignmentTypeId": "PREDEFINED", "managerId": "#_TASK.T1.asig.revisor_asignado.id#", "operationAreaId": 63, "text": "Revisión", "id": "T2", "type": "task" },