Un foro de discusión para nuestra comunidad de hispano hablante
By andrewtwo
#786044
hola que tal, como puedo hacer para retomar una tarea especifica sin tener que iniciar todo el flujo por completo para llegar a esa tarea en especifico, como puedo hacerlo ?
Hice una prueba con el reassign pero solo asigna la tarea donde quedo el proceso a un usuario de ese grupo

Muchas gracias
Saludos
User avatar
By amosbatto
#786056
No hay una manera facil para hacer esto en PM. Puedes usar Process Supervisors para acceder a cualquier tarea y sus objetos.

Si quieres que un usuario normal es asignado a la tarea, puedes crear bucles en tu proceso para volver a tareas anteriores. Estas tareas pueden usar Value Based Assignment y puedes ingresar como el Process Supervisor para setear el usuario para la tarea y enrutear el proceso para volver a la tarea anterior. Adjunto un proceso que puedes estudiar.
(52.17 KiB) Downloaded 365 times
By andrewtwo
#786059
Muchas gracias por el ejemplo, pero quedo con una duda desde las opciones del search no puedo asignarme la tarea, no es porque sea un proceso normal del flujo realmente lo requiero para revisar las validaciones de los trigger por ejemplo pero sin tener que iniciar un flujo desde cero sino que yo pueda escoger la tarea a la que quiero ir.

Image

Saludos
User avatar
By amosbatto
#786071
Si quieres empezar el proceso en cualquier tarea, puedes añadir un evento de inicio en cada tarea.
ManyStartingEvents.png
ManyStartingEvents.png (9.53 KiB) Viewed 5678 times
By vmonsalve
#794541
Cordial Saludo a todos,

Me presento, mi nombre es Victor y soy nuevo en el foro y en ProcessMaker. Similar al compañero andrewtwo, tengo un caso de reasignar usuario.

En el proceso tengo una tarea que es asignada inicialmente a un usuario a través de Value Based Assignment. Si el usuario no realiza la tarea antes del DueDate, otro usuario pueda realizar esa tarea. Realmente en ese punto, cualquiera de los dos pueda ejecutar la tarea. Para implementar esto pensé en un inclusive gateway pero como debo verificar el DueDate para disparar el aviso al segundo usuario, no se como realizar esta validación. Entonces pensé en un script task que ejecutara la validación, pero no se como hacer el flujo para que se realice la validación y en paralelo el usuario inicial pueda realizar la tarea. Condenso estas ideas en la imagen adjunta. Si tienen alguna opinión/comentario al respecto, les agradezco su aporte. Voy a intentar realizarlo tal como la imagen y les cuento como me va.

Muchas gracias por la atención.
Image
User avatar
By amosbatto
#794589
No puedo ver tu imagen, pero creo que entiendo lo que quieres hacer.
El primer usuario debe ser asignado normalmente al caso y el segundo usuario debe ser asignado ad hoc al caso. Este segundo usuario debe tener Process Permissions para ver los formularios y documentos en la tarea y debe tener un rol que incluye PM_REASSIGNCASE para asignar a sí mismo al caso. También puede tener PM_ALLCASES y/o PM_PROCESSMANAGER en su rol para encontrar los casos más facilmente. Si es un Process Manager asignado al proceso, puede encontrar los casos en HOME > Reassign.

Si necesitas mandar un email cuando sobrepasa el Due Date de la tarea, puedes crear un bucle en paralelo que ejecuta un Script Task periodicamente como este proceso:
AfterDueDate_ProcessMap.png
AfterDueDate_ProcessMap.png (23.31 KiB) Viewed 7868 times
El exclusive gateway del bucle tiene un estas condiciones:
AfterDueDateRoutingRules.png
AfterDueDateRoutingRules.png (24.07 KiB) Viewed 7868 times
El script task tiene este trigger:
Code: Select all
//set to the unique ID of the "task to complete in a fixed time"
$taskId = '389925159599650c4cbf311009267781';

//set to the same email as found in Admin > Email Settings 
$emailFrom = 'amosbatto@gmail.com';

if (!isset(@@completed) or @@completed != 'yes') {
   $caseId = @@APPLICATION;
   $sql = "SELECT * FROM APP_DELEGATION WHERE APP_UID='$caseId' AND TAS_UID='$taskId' ORDER BY DEL_DELEGATE_DATE"; 
   $result = executeQuery($sql);

   if (!is_array($result) or count($result) == 0) {
	  throw new Exception("Unable to find task with query: $sql");
   }

   $dueDate = $result[1]['DEL_TASK_DUE_DATE'];
   $now = date('Y-m-d H:i:s');
	
   $emailTo = 'somebody@gmail.com';	
	
   if ($now >= $dueDate) {
	   PMFSendMessage(@@APPLICATION, $emailFrom, $emailTo, '', '', 'Task overdue', 'overdueTask.html', array());
   }
}
La tarea para ejecutar en un tiempo fijo tiene otro trigger que es ejecutado antes de la asignación (before assignment):
Code: Select all
@@completed = 'yes';
También hay que setear el Intermediate Timer Event para ejecutar cada hora.

No he probado este proceso pero lo adjunto para que puedes depurarlo.
(72.4 KiB) Downloaded 353 times
By vmonsalve
#795878
Cordial Saludo,

Muchas gracias por su respuesta. Me disculpo por no responder antes, me enfoqué en terminar y dejar esta opción para más adelante. Sobre su solución, tal cual así fue como la tenía en mi cabeza, pero a mitad de camino busqué otro medio porque la reasignación al ser tan dinámica, debía darle permiso a practicamente todo el mundo. Les cuento como es:

El proyecto en el que estoy consiste en automatizar las solicitudes de nómina(vacaciones, incapacidades, horas extras, etc.). Estas solicitudes las crea el empleado y el jefe inmediato (variable) es el asignado para resolver si las autoriza o no. La condición es que si el jefe inmediato no hace la tarea de autorizar o denegar la solicitud, a los dos días hábiles la tarea se le encargue ahora al jefe inmediato de éste (al jefe del jefe). Consultando en la web encontré un post resuelto por usted (agradezco enormemente sus aportes que he encontrado en la web) titulado Reasign Task on Due Date, el cual probaré este fin de semana y les cuento por este medio. Les relaciono el link:

viewtopic.php?f=44&t=710344
User avatar
By amosbatto
#795891
vmonsalve wrote:El proyecto en el que estoy consiste en automatizar las solicitudes de nómina(vacaciones, incapacidades, horas extras, etc.). Estas solicitudes las crea el empleado y el jefe inmediato (variable) es el asignado para resolver si las autoriza o no. La condición es que si el jefe inmediato no hace la tarea de autorizar o denegar la solicitud, a los dos días hábiles la tarea se le encargue ahora al jefe inmediato de éste (al jefe del jefe).
Primero, tienes que crear departmentos como estos:
DepartmentsForRouteToHigherManager.png
DepartmentsForRouteToHigherManager.png (14.59 KiB) Viewed 7762 times
Donde los gerentes superiores son asignados en "Higher Managers", y los usuarios que pueden empezar el proceso estan en los subdepartmentos.

Puedes usar un proceso como este:
RouteToHigherManagerProcess.png
RouteToHigherManagerProcess.png (27.92 KiB) Viewed 7762 times
Los usuarios en los subdepartmentos son asignados a "First Task". Los gerentes de cada subdepartmento son asignados a "Manager's task". Los gerentes superiores son asignados a "Higher manager's task". "Manager's task" y "Higher manager's task" tienen el tipo de asignación "Reports To".

El gateway después de "Manager's task" tiene estas condiciones:
RouteToHigherManagerRoutingRules.png
RouteToHigherManagerRoutingRules.png (23.59 KiB) Viewed 7762 times
Hay este Dynaform en las tareas "Manager's task" y "Higher manager's task" para setear la variable @@approved:
RouteToHigherManagerDynaform.png
RouteToHigherManagerDynaform.png (36.09 KiB) Viewed 7761 times
Y el trigger tiene este código:
Code: Select all
//set to the unique ID of the "Manager's task"
$taskId = '389925159599650c4cbf311009267781';

//set to the same email as found in Admin > Email Settings 
$emailFrom = 'amosbatto@gmail.com';

if (!isset(@@completed) or @@completed != 'yes') {
   $caseId = @@APPLICATION;
   $sql = "SELECT * FROM APP_DELEGATION WHERE APP_UID='$caseId' AND TAS_UID='$taskId' ORDER BY DEL_DELEGATE_DATE"; 
   $result = executeQuery($sql);

   if (!is_array($result) or count($result) == 0) {
	  throw new Exception("Unable to find task with query: $sql");
   }

   $dueDate = $result[1]['DEL_TASK_DUE_DATE'];
   $now = date('Y-m-d H:i:s');	
	
   if ($now >= $dueDate) {
       @@completed = "yes";
	   $g = new G();
	   $g->sessionVarSave();
	   PMFDerivateCase($caseId, $result[1]['DEL_INDEX'], false, $result[1]['USR_UID']); 
	   $g->sessionVarRestore();
   }
}
Adjunto el proceso para que puedas estudiarlo:
(94.59 KiB) Downloaded 323 times
By vmonsalve
#812669
Cordial saludo,

Gracias amosbatto por su ayuda. Funciona correctamente excepto un error que se me está presentando y es que duplica la tarea futura. Según la imagen adjunta, al empleado le notifica dos veces sobre su solicitud y en la bandeja de entrada de Nomina está recibiendo dos veces la misma solicitud para procesar. He revisado en la base de datos y veo que está ejecutando multiples veces la tarea (hasta ahi bien dado que su funcion es verificar el vencimiento de la solicitud) pero no estoy seguro del porqué . Veo que PM en el ciclo de la script tarea "Verificar Vencimeinto" agrega una linea (app_delegation) por cada vez que se repite , mi pregunta es si debido a que la primera vez que ejecuta la script tarea en paralelo y la marca como CLOSED y agrega la correspondiente debido al ciclo, y alguien realiza después de esto la tarea "Autorizar Vacaciones", PM continua el flujo por primera vez, y después cuando el timereventcron.php ejecuta la que quedó pendiente esté recorre por segunda vez el flujo. Agradezco de antemano cualquier colaboración. Si no es correcto lo de arriba, pienso que puede ser porque la tarea "Autorizar Vacaciones" tiene un script que cambia el valor de la variable completed haciendo que cuando PM evalua el flujo del proceso de por entendido que ese gateway (gateway ciclico para la script)está resuelto y hace que avance el flujo. Y como hay una script pendiente al ejecutar el timerevent vuelve a pasar por alli.

Un saludo para todos y espero de alguna forma aportar algo al foro, por el momento solo he aportado preguntas.
Attachments
Captura2018.PNG
Captura2018.PNG (38.61 KiB) Viewed 7457 times
User avatar
By amosbatto
#812676
Creo que debe funcionar correctamente si cambias esta línea en el trigger:
Code: Select all
   $sql = "SELECT * FROM APP_DELEGATION WHERE APP_UID='$caseId' AND TAS_UID='$taskId' ORDER BY DEL_DELEGATE_DATE";  
por:
Code: Select all
   $sql = "SELECT * FROM APP_DELEGATION WHERE APP_UID='$caseId' AND TAS_UID='$taskId' ORDER BY DEL_DELEGATE_DATE DESC";  
Así, el trigger va a enrutar la última instancia de la tarea en el caso.

Experience heightened pleasure with Cenforce 100 M[…]

Get an instant solution to move emails to MBOX for[…]

Most Demanding OST to PST Converter

The most demanding OST to PST Converter is TrijaT[…]

Betvisa clone scripts are pre-built software solut[…]