SIGESA PPI: Modificar Flujo Activiti PPI-478 flujo de aprobación de aportes estratégicos

PASO1: TAREA DEFINICIÓN

Yo como Analista de planificación estratégica requiero modificar el flujo para los planes de aportes estratégicos para la formulación y modificación que contenga los pasos que modificaran el estado de cada plan según su avance:

  • Flujo Normal:
    • Borrador: Primer estado del flujo que se activará cuando se ejecute el proceso de copia del plan para las modificaciones.
      Efectuado automáticamente por la ejecución de un proceso.
    • Completado: Segundo paso del flujo. Sera activado por la Asistente Administrativa cuando finalice la formulación o modificación y requiera solicitar la aprobación correspondiente.
      • UNA_PPI_PPE_PAE_DIGITADOR
      • UNA_PPI_PPE_ADMIN
      • UNA_PPI_PPE_ANALISTA
    • Avalado: Tercer paso del flujo normal. Es realizado por el analista de planificación estratégica, para validar la información de los aportes.
      • UNA_PPI_PPE_ADMIN
      • UNA_PPI_PPE_ANALISTA
    • Ratificado: Cuarto paso del flujo normal. Es efectuado por el director de unidad, tanto para la formulación como para la modificación.
      • UNA_PPI_PPE_PAE_RATIFICADOR
      • UNA_PPI_PPE_ADMIN
      • UNA_PPI_PPE_ANALISTA
    • Verificación: Quinto paso del flujo normal.
      • Efectuado por el Decano, Vicerrector, Rector o superior jerárquico de unidad de adscripción.
      • El rector será el superior jerárquico, en el caso de las unidades no adscritas.
      • Al estar en estado Verificado por Unidad Superior el flujo quedará en espera de aprobación.
      • Roles:
        • UNA_PPI_PPE_PXE_RATIFICADOR
        • UNA_PPI_PPE_ADMIN
        • UNA_PPI_PPE_ANALISTA
    • Aprobado: Sexto paso del flujo normal
      • Se ejecuta al aprobar las acciones estratégicas de la entidad superior.
      • Efectuado por el Decano, Vicerrector, Rector o superior jerárquico de unidad de adscripción.
      • Sólo se aprueban en caso de que todos los aportes estratégicos de la unidad de adscripción esté verificados por la unidad superior y se haya aprobado las acciones estratégicas.
      • Roles:
        • UNA_PPI_PPE_PXE_RATIFICADOR
        • UNA_PPI_PPE_ADMIN
        • UNA_PPI_PPE_ANALISTA
  • Flujos alternos:
    • Rechazar el aval técnico: Es efectuado por el analista de planificación estratégica y regresa el estado del plan a borrador. Comenzando así nuevamente el flujo.
    • Rechazar la ratificación de unidad: Es efectuado por el director de unidad o por quien corresponda brindar la aprobación del plan y regresa el estado del plan a borrador. Comenzando así nuevamente el flujo.
    • Rechazar la verificación de unidad superior: Es efectuado por el superior jerárquico de la unidad de adscripción o por quien corresponda brindar la verificación del plan y regresa el estado del plan a borrador. Comenzando así nuevamente el flujo.
    • Rechazar completado: No se debe permitir rechazar el plan de aportes estratégicos en estado borrador.
      • Opciones:
        • No mostrar el botón de rechazar tarea.
        • Mostrar un mensaje indicando que no se puede rechazar en estado borrador.
  • Validaciones:
    • No debe permitir enviar a completar un plan sin aportes.
      • Summary: Error al completar.
      • Detail: Debe incluir al menos un aporte estratégico.
    • Validar que se tenga un Documento Relacionado AGD al pasar a estado Ratificado.
      • Summary: Error al ratificar.
      • Detail: Debe referenciar el documento del acuerdo de la asamblea de unidad.

Notas.

  • El formulario de mantenimiento de aportes solamente deberá estar habilitado en estado borrador para su edición.
  • Los usuarios administradores son los únicos que pueden editar el encabezado de los planes.
    • UNA_PPI_PPE_ADMIN
    • UNA_PPI_PPE_ANALISTA
  • Los usuarios con rol de administrador de módulo de planificación estratégica, deben poder aceptar o rechazar cualquier tarea en cualquier estado y plan.
    • UNA_PPI_PPE_ADMIN
    • UNA_PPI_PPE_ANALISTA

Flujo Anterior

  • Flujo Nuevo

PASO 2: INGRESO AL ACTIVITi

  • Ingresamos con las credenciales
admin
unacgi2019activiti

INFORMATIVO: Crear Nuevo flujo Exportando y Importanto

  • Cuando lo que necesitamos es crear un nuevo flujo y por las configuraciones requeridas para SIGESA
  • NOTA CODIGO: Limpio después de borrar todo
<dataObject id="idFormMode" name="formMode" itemSubjectRef="xsd:boolean">
      <extensionElements>
        <activiti:value>false</activiti:value>
      </extensionElements>
    </dataObject>
    <dataObject id="idApprovalCondition" name="approvalCondition" itemSubjectRef="xsd:boolean">
      <extensionElements>
        <activiti:value>true</activiti:value>
      </extensionElements>
    </dataObject>
    <dataObject id="idCancelOption" name="cancelOption" itemSubjectRef="xsd:boolean">
      <extensionElements>
        <activiti:value>true</activiti:value>
      </extensionElements>
    </dataObject>
  • Por esto es más sencillo seleccionar un flujo existe y exportarlo para luego importarlo
  • Para ello primero ingresamos a «Menú» -> Proceso -> Model workspace

Exportar

  • y ubicar la sección de Model action -> Export model
  • Guardamos el archivo colocandole el nombre necesario

Importar

  • Ahora para importar ingresamos a «Menu» -> Proceso -> Model workspace -> Import

  • Nos muestra la ventana
  • Seleccionamos el archivo
  • Lo buscamos y lo editamos
  • Ahora le modificamos
    • Process identifier: Prueba Tavo
  • Name: Flujo Prueba Tavo
  • Y en la sección de Execution listeners
  • Vamos a encontrar el evento start el cual establecer el estado inicial de flujo
  • Este es el código
#{planAporteEstrategicoBean.estadoInicial(estadoFormulacionPAEServiceImpl.obtenerEstadoBorrador().getId(),"ESTADO_FORMULACION_PAE","cr.ac.una.cgi.sigesa.ppi.ppe.view.model.planAporteEstrategicoBean","cr.ac.una.cgi.sigesa.ppi.ppe.service.EstadoFormulacionPAEService","NOMBRE")}
  • Como se ve
  • Esta llamando la clase (planAporteEstrategicoBean)
  • La función estadoInicial (planAporteEstrategicoBean.estadoInicial)
  • Pasandole el estado inicial borrador estadoFormulacionPAEServiceImpl.obtenerEstadoBorrador().getId()
  • De la tabla «ESTADO_FORMULACION_PAE»
  • Definición del bean «cr.ac.una.cgi.sigesa.ppi.ppe.view.model.planAporteEstrategicoBean»
  • Servicio de la función «cr.ac.una.cgi.sigesa.ppi.ppe.service.EstadoFormulacionPAEService»
  • Y nombre de estado «NOMBRE»
  • Y ya con esto podemos borrar todos los elementos para poder crear el nuevo flujo
  • Guardamos y podemos trabajar

PASO 3: Respaldar flujo

  • Para el caso de esta tarea no debemos crear el flujo sino que el flujo ya existe
  • Para comenzar a modificar ingresamos al activiti
  • Menú -> Proceso -> Model workspace y ubicamos el flujo
  • Y luego ingresamos a Model action -> Export
  • Con esto lo podemos renombrar para establecer el nombre ORIGINAL y respaldar y adjuntarlo a la tarea

PASO 4: Modificación del Flujo

  • Como se menciona en la tarea debemos modificar el flujo actual

  • Para lograr este nuevo flujo
  • Para esto le damos en el botón de edit

Paso flujo 1: Verificar información General

  • El primer paso es verificar el estado del documento
  • Para esto tocamos cualquier espacio en blanco y nos muestra la información general
  • Verificamos los siguientes datos
    • Process identifier: PlanAporteEstrategico
    • Name: Flujo Planes Aportes Estratégicos (PPI-PPE)
  • Y verificamos que en Execution listeners
  • Podemos observar que tenemos un evento Start (ejecutado al iniciarl el flujo)
  • Si lo vemos tenemos
#{planAporteEstrategicoBean.estadoInicial(estadoFormulacionPAEServiceImpl.obtenerEstadoBorrador().getId(),"ESTADO_FORMULACION_PAE","cr.ac.una.cgi.sigesa.ppi.ppe.view.model.planAporteEstrategicoBean","cr.ac.una.cgi.sigesa.ppi.ppe.service.EstadoFormulacionPAEService","NOMBRE")}
  • Aquí vemos que utiliza la clase
planAporteEstrategicoBean
  • Y que esta invocando al metodo
planAporteEstrategicoBean.estadoInicial
  • PARAMETRO1: id del estado que se le va asignar
estadoFormulacionPAEServiceImpl.obtenerEstadoBorrador().getId()
  • PARAMETRO2: De cual entidad (tabla) lo va obtener
"ESTADO_FORMULACION_PAE"
  • PARAMETRO3: donde esta la definición de la clase Bean que maneja los botones
"cr.ac.una.cgi.sigesa.ppi.ppe.view.model.planAporteEstrategicoBean"
  • PATRAMETRO4: Definición de la clase que meneja la tabla de donde se va obtener el valor a asignar
"cr.ac.una.cgi.sigesa.ppi.ppe.service.EstadoFormulacionPAEService"
  • PARAMETRO5: Nombre de columna de la tabla que identifica humanamente el estado
"NOMBRE"

>>>NOTA: Sobre escritura de estadoInicial / actualizarEstado<<<

  • Sin embargo si buscamos el método no lo encontramos en la clase ya que este se hereda del framework
  • Pero si lo necesitamos podemos sobreescribirlo dentro de la clase ServiceImpl
  • NOTA: No es necesario declarar en en el Service
  • Ejemplo
// *****************************************************
// estadoInicial
// *****************************************************
@Override
    public PlanOperativo estadoInicial(PlanOperativo entity, String columnName, String serviceClass, Long nextStatus, String columnaTablaEstados) {
      
      // *****************************
      // CODIGO NECESARIO AQUÍ
      // *****************************


        return super.estadoInicial(entity, columnName, serviceClass, nextStatus, columnaTablaEstados);
    }

// *****************************************************
// actualizarEstado
// *****************************************************
@Override
    public PlanOperativo actualizarEstado(PlanOperativo entity, String columnName, String serviceClass, Long nextStatus, String columnaTablaEstados) {
      
      // *****************************
      // CODIGO NECESARIO AQUÍ
      // *****************************


        return super.actualizarEstado(entity, columnName, serviceClass, nextStatus, columnaTablaEstados);
    }

>>>Fin de nota<<<

>>>NOTA: iniciar flujo desde codigo SIGESA<<<

  • Si necesitamos iniciar el flujo desde un método o proceso
  • Debemos hacerlo primero guardando al entidad ya que el flujo requiere que exista la entidad para poder iniciar
this.saveWithoutStartingFlow(evaluacionOperativa);
  • Y luego iniciar el flujo
iniciarFlujo(evaluacionOperativa);
  • Por ejemplo un metodo en EvaluacionOPerativaServiceImpl.java existe un método «crearEvaluacionOperativa» para crear las evaluaciones
  • Ejemplo
public void crearEvaluacionOperativa(PlanOperativo planOperativo, EtapaPlan etapaPlan) {
        EvaluacionOperativa evaluacionOperativa = new EvaluacionOperativa();
        evaluacionOperativa.setPlanOperativo(planOperativo);

        EstadoEvaluacionPOA estadoBorrador = estadoEvaluacionPOAService.obtenerEstadoBorrador();
        evaluacionOperativa.setEstadoEvaluacionPOA(estadoBorrador);

        evaluacionOperativa.setEtapaPlan(etapaPlan);

        TipoEtapa tipoEtapa = tipoEtapaService.findTipoEtapaByParametro("param_ppi_ppo_tipoEtapa_evaluacion");
        evaluacionOperativa.setTipoEtapa(tipoEtapa);

        //super.save(evaluacionOperativa);
        this.saveWithoutStartingFlow(evaluacionOperativa);
        iniciarFlujo(evaluacionOperativa);

        this.crearRegistroBitacoraEvaluacionPOA(evaluacionOperativa, 0L, true);
    }

>>>Fin de nota<<<

Paso flujo 2: Estado Borrador

  • Como se menciona en la tarea
Borrador: Primer estado del flujo que se activará cuando se ejecute el proceso de copia del plan para las modificaciones.
Efectuado automáticamente por la ejecución de un proceso.
  • Como se ve este estado en el inicial y va ser establecido e iniciado por un proceso
  • Y como se ha explicado anteriormente el flujo esta listo para iniciar en estado «Borrador»
  • La parte de iniciar el flujo pertenece a otra tarea por lo que no se explica aquí
  • Por esto podemos decir que este paso se encuentra listo
  • Sin embargo vamos a explicar
  • El elmento de inicio del flujo0 se encuentra en Start Events -> Start event por si se esta creando uno nuevo

  • Si lo seleccionamos verificamos
    • Name (BORRADOR)
    • Form Key: planAporteEstrategicoEditForm
  • Este es el formulario en SIGESA encargado de editar el flujo

Paso Flujo 3: Estado Completado

  • Cuando se esta creando un nuevo plan de Aporte Estrategico el flujo inicia en estado borrador luego funcionarios de derecho de ingreso complentan la información del plan y al guardarlo se le debe asignar el valor de «Completado»
  • Dicho esto es una tarea realizada o aprobada por personas por tanto dentro del activiti existe un componente «User Task» creado para esta labor
  • Lo encontramos dentro Activities -> User Task
  • Ahora si vemos el flujo anterior
  • Y nuevo
  • Existe un cambio en los roles que pueden realizar la tarea vamos hacerla
  • Pero antes vamos a revisar las configuraciones generales
  • Exclusive: true
true
  • Name: Enviar a Completar (COMPLETADO)
Enviar a Completar (COMPLETADO)
  • Form Key: pagina que va a manejar los cambios
planAporteEstrategicoEditForm

P 1.1 Modificar los roles (Candidate Groups)

  • Para modificar los roles que pueden acceder a completar el plan
  • Ingresamos a las propiedades -> Assignments

>>>NOTA: Nombres de Roles (ROLE_)<<<

  • Los nombres de los roles son iguales a los existentes en SIGESA pero para que el sistema funcione correctamente se les debe agregar «ROLE_»
ROLE_
  • Ejemplo
  • En SIGESA

>>> Fin de Nota <<<

  • Entonces Procedemos a modificarlos
  • roles a asignar
UNA_PPI_PPE_ADMIN

UNA_PPI_PPE_PAE_DIGITADOR

UNA_PPI_PPE_ANALISTA
  • Resultado
  • Y ahora debemos modificar las anotaciones que indican los roles asignados
  • Resultado

P 1.2 Verificar tareas (Task Listeners)

  • Ahora cuando el usuario completa el formulario y lo manda a completar el formulario se debe establecer en solo vista y deshabilitados los campos
  • Por esto si verificamos las tareas
  • Podemos observar que existen 3 del evento «Complete»
  • Que son:
  • La que actualiza estado Completado
#{planAporteEstrategicoBean.actualizarEstado(planAporteEstrategicoBean.entity, "ESTADO_FORMULACION_PAE", "cr.ac.una.cgi.sigesa.ppi.ppe.service.EstadoFormulacionPAEService", estadoFormulacionPAEServiceImpl.obtenerEstadoCompletado().getId(), "NOMBRE")}
  • La que establece el formulario de modo vista
#{planAporteEstrategicoBean.setFormViewMode(true,planAporteEstrategicoBean.entity)}
  • La que deshabilita el formulario
#{planAporteEstrategicoBean.setDisabledForm(true, planAporteEstrategicoBean.entity)}
  • Recuerde es en evento de complete

Paso Flujo 4: Agregar Aval Técnico

  • Si vemos el flujo actual
  • Y lo comparamos con el nuevo no existe el Aval Tecnico
  • Por lo que lo vamos a crear
  • Primero vamos a eliminar el estado Anular
  • Primero verificamos que en SIGESA no exista ningún plan en estado de Anulado
  • Sabiendo esto podemos eliminar del flujo el estado
  • Quedando así
  • Agregamos el nuevo estado
  • Agregamos y ubicamos el componente
  • Con sus propiedades
  • Exclusive: true
  • Assignments
    • UNA_PPI_PPE_ADMIN
    • UNA_PPI_PPE_ANALISTA
  • Name
Aval Técnico (AVALADO)
  • Form Key
planAporteEstrategicoEditForm
  • Task Listeners
    • complete
#{planAporteEstrategicoBean.actualizarEstado(planAporteEstrategicoBean.entity, "ESTADO_FORMULACION_PAE", "cr.ac.una.cgi.sigesa.ppi.ppe.service.EstadoFormulacionPAEService", estadoFormulacionPAEServiceImpl.obtenerEstadoAvalado().getId(), "NOMBRE")}
  • Ahora dentro del código esta función no existe así que la debemos crearademás vamos a crear las del estado de VerificadoUnidadSuperior
  • EstadoFormulacionPAEService.java
public EstadoFormulacionPAE obtenerEstadoAvalado();

public EstadoFormulacionPAE obtenerEstadoVerificadoUnidadSuperior();
  • EstadoFormulacionPAEServiceImpl.java
@Override
    public EstadoFormulacionPAE obtenerEstadoAvalado() {
        return findEstadoFormulacionPAEByParametro(parametroService.findOneByLlave("param_ppi_ppe_estadoFormulacionPAE_avalado"));
    }

@Override
    public EstadoFormulacionPAE obtenerEstadoVerificadoUnidadSuperior() {
        return findEstadoFormulacionPAEByParametro(parametroService.findOneByLlave("param_ppi_ppe_estadoFormulacionPAE_verificadoUnidadSuperior"));
    }
  • Ahora dentro de la base de datos no existe este estado debemos crearlo y de una vez agregamos el de Verificado_Unidad_Superior
  • Los agregamos
  • MENU-> PPI -> PPE -> Administración -> Estados->Lista de Estados de Formulacion de Aportes Estratégicos
  • Los agregamos en desarrollo y producción
  • Ademas debemos agregar los parametros
  • De momento lo tenemos asi
  • Ahora agregamos el condicional
  • En la linea del SI debemos agregar un Flow condition
${planAporteEstrategicoBean.isApproveTask()}
  • Y en el NO la negación
${!planAporteEstrategicoBean.isApproveTask()}
  • Ahora vamos a trabajar esta sección
  • Ya que tenemos que cambiar los roles a
    • UNA_PPI_PPE_ADMIN
    • UNA_PPI_PPE_PAE_RATIFICADOR
    • UNA_PPI_PPE_ANALISTA
  • Quedando así
  • Trabajamos las condicionales
  • Y ahora modificamos esta sección
  • Nombre
  • Roles
    • UNA_PPI_PPE_PXE_RATIFICADOR
    • UNA_PPI_PPE_ADMIN
    • UNA_PPI_PPE_ANALISTA
  • Quedando así
  • Revisamos la condicional
  • Ahora vamos a crear esta sección
  • Agregamos el componente
  • Le establecemos el nombre y lo ubicamos
  • Y en sus propiedades
  • Exclusive:true
  • ID: waitForApproval

Resultado final

  • Ya podemos cerrar
  • Y hacer el desplieguie
  • Una vez desplegado el flujo ya podemos ingresar a crear un plan de Aportes Estratégicos y si vemos el flujo ya es el nuevo