Startprocess error al asignar tarefas a varios responsables simultáneos

Hola. Cree un proceso de gestión de capacitaciones, que tiene un pai filho. cuando llega a una instancia debe generar el proceso de evaluación de satisfacción. Es decir hace un start process a cada uno de los participantes que asistieron. El problema es que da un error al start process de cada uno de los usuarios. ¡Usuario seleccionado no es apto para recibir la tarea!.

Este es el código que genera el start process, si alguien tuvo este problema y me puede ayudar, encontré a alguien parecido que le ocurrió pero no lo resuelve.

function beforeStateEntry(sequenceId){

if (sequenceId == 19) {

var processo = getValue("WKNumProces"); var campos = hAPI.getCardData(processo); var contador = campos.keySet().iterator(); var count = 0;

while (contador.hasNext()) { var id = contador.next();

if (id.match(/cusuarioparticipante__/)) { // aqui você pode colocar qualquer campo do seu Pai x Filho var campo = campos.get(id); var seq = id.split(""); var asistio = campos.get("c_asistencia" + seq[1])

if (asistio == 'SI'){ var participante = campos.get("cusuarioparticipante__" + seq[1]) var users = new java.util.ArrayList(); users.add(participante); log.info("Usuario para enviarle la solicitud: " + participante); var formData = new java.util.HashMap();

//formData.put("c_solicitante", hAPI.getCardValue("c_solicitante")); formData.put("c_titulo_capa", hAPI.getCardValue("c_titulo_capa")); formData.put("c_capayperiodo", hAPI.getCardValue("c_capayperiodo")); formData.put("c_unid_capa", hAPI.getCardValue("c_unid_capa")); formData.put("c_lugar_capa", hAPI.getCardValue("c_lugar_capa")); formData.put("d_fechaestdesde", hAPI.getCardValue("d_fechaestdesde")); formData.put("d_fechaesthasta", hAPI.getCardValue("d_fechaesthasta"));

hAPI.startProcess("ProcesoEvaluaciondeSatisfacciondeCapacitaciones", 0, users, "Solicitud desde Gestión de Capacitaciones", false, formData, false);

}

count++; } }

}

}

Hola Ruben

El error ocurre pues en el proceso hijo, el usuario definido en el startProcess no puede iniciar este proceso, debido a los mecanismos de atribución de la primer tarea después de la inicial.

Utilizando el hAPI.startProcess el solicitante del proceso hijo siempre vaya ser lo mismo que el proceso padre.

Hay la posibilidad de utilizar un webservice para iniciar los procesos hijos utilizando el userid do usuario que deberá ser lo solicitante de el.

Pude resolver el problema con la recomendación de Eduardo.

Adjunto

  1. crear un serviço en panel de control con el nombre WorkflowEngineService y haciendo referencia al servicio (Ex.: http://localhost:8080/webdesk/WorkflowEngineService?wsdl )

Luego implementé en el evento del proceso afterstateleave la llamada al servicio, que lo que hace es recorrer un pai filho y le envía a cada uno una solicitud.

if (ativAtual == 14 && proximatarea == 19 ){

hAPI.setCardValue("c_estado", "Capacitación Ejecutada");

var processo = getValue("WKNumProces"); var campos = hAPI.getCardData(processo); var contador = campos.keySet().iterator(); var count = 0;

while (contador.hasNext()) { var id = contador.next();

if (id.match(/cusuarioparticipante__/)) { // aqui você pode colocar qualquer campo do seu Pai x Filho var campo = campos.get(id); var seq = id.split(""); var asistio = campos.get("c_asistencia" + seq[1]); var user="";

if (asistio == 'SI'){

user = campos.get("cusuarioparticipante__" + seq[1]);

// Consulta o Dataset para ver si el empleado tiene usuario de fluig var filtrousuario = DatasetFactory.createConstraint("login", user, user, ConstraintType.MUST); var filtros = new Array( filtrousuario ); var dsusuarioactivo = DatasetFactory.getDataset("colleague", null, filtros, null);

if (dsusuarioactivo != null && dsusuarioactivo.rowsCount > 0 && dsusuarioactivo.getValue(0, "active") == true ) {

log.info("[AVISO] Usuario Activo para Enviar Formulario de Satisfacción Curso: " + dsusuarioactivo.getValue(0, "login"));

log.info("########## inicio webservice workflow"); var workflow = ServiceManager.getService("WorkflowEngineService"); var serviceHelper = workflow.getBean(); var serviceLocator = serviceHelper.instantiate("com.totvs.technology.ecm.workflow.ws.ECMWorkflowEngineServiceService"); var service = serviceLocator.getWorkflowEngineServicePort(); log.info("########## carregou serviço workflow"); log.info("########## Carrega Colaboradores do segundo processo"); var stringArray = service.getAvailableUsersStart("barbieri", "catafran2204", 1, "ProcesoEvaluaciondeSatisfacciondeCapacitaciones", 11, 0);

var field1 = serviceHelper.instantiate("com.totvs.technology.ecm.workflow.ws.KeyValueDto"); field1.setKey("c_titulo_capa"); field1.setValue(hAPI.getCardValue("c_titulo_capa"));

var field2 = serviceHelper.instantiate("com.totvs.technology.ecm.workflow.ws.KeyValueDto"); field2.setKey("c_capayperiodo"); field2.setValue(hAPI.getCardValue("c_capayperiodo"));

var field3 = serviceHelper.instantiate("com.totvs.technology.ecm.workflow.ws.KeyValueDto"); field3.setKey("c_unid_capa"); field3.setValue(hAPI.getCardValue("c_unid_capa"));

var field4 = serviceHelper.instantiate("com.totvs.technology.ecm.workflow.ws.KeyValueDto"); field4.setKey("c_lugar_capa"); field4.setValue(hAPI.getCardValue("c_lugar_capa"));

var field5 = serviceHelper.instantiate("com.totvs.technology.ecm.workflow.ws.KeyValueDto"); field5.setKey("d_fechaestdesde"); field5.setValue(hAPI.getCardValue("d_fechaestdesde"));

var field6 = serviceHelper.instantiate("com.totvs.technology.ecm.workflow.ws.KeyValueDto"); field6.setKey("d_fechaesthasta"); field6.setValue(hAPI.getCardValue("d_fechaesthasta"));

var resultArr = serviceHelper.instantiate("com.totvs.technology.ecm.workflow.ws.KeyValueDtoArray");

resultArr.getItem().add(field1); resultArr.getItem().add(field2); resultArr.getItem().add(field3); resultArr.getItem().add(field4); resultArr.getItem().add(field5); resultArr.getItem().add(field6);

log.info("########## Inicia StartProcess"); var userArray = serviceHelper.instantiate("net.java.dev.jaxb.array.StringArray");

userArray.getItem().add(user);

var processAttachmentDtoArray = serviceHelper.instantiate("com.totvs.technology.ecm.workflow.ws.ProcessAttachmentDtoArray"); var appointment = serviceHelper.instantiate("com.totvs.technology.ecm.workflow.ws.ProcessTaskAppointmentDtoArray");

var ret = service.startProcessClassic("barbieri", "catafran2204", 1, "ProcesoEvaluaciondeSatisfacciondeCapacitaciones", 11, userArray , "Webservice desde proceso de Gestor de Capacitaciones", user, false, processAttachmentDtoArray,resultArr, appointment, false); / } }

count++; } }

}

Estoy trabajando en el tratamiento de errores, pero funciona. No encontré ningún ejemplo similar que funcione.