Questions and discussion about developing processes and programming in PHP, JavaScript, web services & REST API.

Moderator: amosbatto

Forum rules: Please search to see if a question has already asked before creating a new topic. Please don't post the same question in multiple forums.
#790481
Buena tarde, tengo un proceso que actualmente en la primera tarea se selecciona 1 usuario para trabajar en la siguiente, lo hago mediante la regla de asignación basada en un valor y por el Dynaform con un dropdown. Ahora debo seleccionar varias personas para que trabajen en esta tarea; no sé como hacerlo puesto que si coloco una grid y dentro de la grid coloco un dropdown con la misma consulta que tenía anteriormente no la ejecuta de manera adecudada, lo mismo pasa con el Suggest; trae usuarios que no debería, que ni siquiera tiene relación con el usuario que se encuentra ejecutando la tarea, mientras que con la lista desplegable sin la grid ejecuta de manera correcta la consulta.

¿Que otra opción puedo utilizar para solucionar esta necesidad?
Gracias por su atención.
#790482
Puedes usar Value Based Assignment con un marcador paralelo o una tarea con Self Service Value Based Assignment.

Tu proceso sera uno de estos:
selectNextUserProcess.png
selectNextUserProcess.png (18.33 KiB) Viewed 2305 times
Primero, crea un DynaForm con un grid para seleccionar los usuarios que seran asignados a la próxima tarea.
SelectUsersForm.png
SelectUsersForm.png (25.36 KiB) Viewed 2305 times
El grid as asociado con la variable "usersNextTask" y contiene 3 campos:
- checkbox con la ID "assign"
- textbox con la ID "fullName"
- hidden con la ID "userId"

Segundo, crea el trigger para poblar el grid con los usuarios disponibles para la proxima tarea. Si la proxima tarea es Value Based Assignment con un marcador paralelo, debes usar este codigo:
Code: Select all
$taskTitle = 'Value Based Assignment & Parallel Marker';
$aTasks = PMFGetUidFromText($taskTitle, 'TAS_TITLE', @@PROCESS);
if (count($aTasks) == 0) {
   throw new Exception("Error: Task '$taskTitle' is not found.");
}
$taskId = $aTasks[0];

@=usersNextTask = array();
$d = new Derivation();
$aUsers = $d->getAllUsersFromAnyTask($taskId);
$rowNo = 1;
foreach ($aUsers as $userId) {
   $aUserInfo = userInfo($userId);
   $fullName = $aUserInfo['firstname'].' '.$aUserInfo['lastname'].' ('.$aUserInfo['username'].')';
   @=usersNextTask[$rowNo.''] = array(
	   'assign'        => '0',
	   'userId'        => $userId, 
	   'fullName'      => $fullName,
	   'fullName_label'=> $fullName,
   );
   $rowNo++;
}
Si la proxima tarea es Self Service Value Based Assignment, debes usar este codigo:
Code: Select all
//set to the name of the group whose users will be selected to assign to the task
$groupTitle = 'Work Team';  
@=usersNextTask = array();
$aGroups = PMFGetUidFromText($groupTitle, 'GRP_TITLE'); 
if (count($aGroups) == 0) {
   throw new Exception("Error: Group '$groupTitle' is not found.");
}

G::LoadClass("groups");
$g = new Groups();
$aUsers = $g->getUsersOfGroup($aGroups[0]);
$rowNo = 1;

foreach ($aUsers as $aUser) {
   $fullName = $aUser['USR_FIRSTNAME'].' '.$aUser['USR_LASTNAME'].' ('.$aUser['USR_USERNAME'].')';
   @=usersNextTask[$rowNo.''] = array(
	   'assign'         => '0',
	   'userId'         => $aUser['USR_UID'], 
	   'fullName'       => $fullName,
	   'fullName_label' => $fullName
	   
   );	
   $rowNo++;
}   
Este trigger debe ser ejecutado antes del DynaForm con el grid.

Tercero, crea otro trigger que sera ejecutado despues del DynaForm para llenar la variable utilizada para asignar los usuarios en la próxima tarea:
Code: Select all
//set to ID of forms with grid to select users:
$formId = '81367063558ffead25bea69035264010';
@=selectedUsers = array();

if (!isset(@=usersNextTask)) {
   G::SendMessageText("Select at least one user to assign to the next task.", "WARNING");
   PMFRedirectToStep(@@APPLICATION, @%INDEX, 'DYNAFORM', $formId);
}
 
foreach (@=usersNextTask as $aUser) {
   if ($aUser['assign'] == '1') {
      @=selectedUsers[] = $aUser['userId']; 		
   }
}

if (count(@=selectedUsers) == 0) {
	G::SendMessageText("Select at least one user to assign to the next task.", "WARNING");
	PMFRedirectToStep(@@APPLICATION, @%INDEX, 'DYNAFORM', $formId);
}
4. Establece que @@selectedUsers sera la variable utilizada en la próxima tarea. Si la proxima tarea es Self Service Value Based Assignment, debes asignar los usuarios a la tarea. Si es Value Based Assignment con un marcador paralelo, tienes que asignar los usuarios al grupo que esta indicado en el trigger.

Aca es un proceso que puedes bajar para probarlo:
(57.42 KiB) Downloaded 114 times
#790527
Gracias amosbatto, ¿puedo poblar la grilla con una consulta sql y su funcionamiento no cambia?
es decir, ¿solo cambiría el trigger antes del dynaform y ya?
Porque los usuarios los traigo de una PMT_Table de cauerdo al usuario logueado, no existen grupos para asignar, solo los que el elija en ese momento.

Mil gracias por tu pronta respuesta, quedo atenta a tus comentarios.
#790581
Gracias!!
Una consulta más, tengo la tarea paralela para los usuarios que yo elija desde el formulario; ¿como podría hacer para que esta tarea que esta para n usuarios se cree pero con número de caso diferente?
He leído sobre la opción PMFNewCase pero no sé como combinarla con la tarea paralela que es la que puedo asignar con varios usuarios a una tarea.


Mil gracias por su atención, en espera de sus comentarios.
#790587
El trigger para crear un número variable de casos basado en un query en la base de datos seria algo como este:
Code: Select all
//set to the IDs of the process and starting task where starting new cases:
$processId = 'XXXXXXXXXXXXXXXXXXXXXXX';
$taskId = 'XXXXXXXXXXXXXXXXXXXXX';

$someField = @@someVar;
$sql = "SELECT USERNAME, FIELD_X, FIELD_Y FROM TABLE_Z WHERE SOME_FIELD = '$someField' ";
$results = executeQuery($sql);
if (!is_array($results)) {
 throw new Exception("Bad query: $sql");
}
@=aNewCases = array(); //array to hold unique IDs of the new cases
foreach ($results as $aRow) {
   //lookup the ID of the user from username: 
   $aUser = executeQuery("SELECT USR_UID FROM USERS WHERE USR_USERNAME='".$aRow['USERNAME']."'"); 
   if (!is_array($aUser) or count($aUser) == 0) {
      throw new Exception("No user ". $aRow['USERNAME']);
   }
   $userId = $aUser[1]['USR_UID'];
  
   //variables to pass to the new case
   $aVars = array(
       'varX' => $aRow['FIELD_X'],
       'varY' => $aRow['FIELD_Y']
   );
   @=aNewCases[] = PMFNewCase($processId, $userId, $taskId, $aVars); 
}

As you have got seen that after every single updat[…]

issue with processmaker 3.2

Hello! The solution to your question is the foll[…]

BPMN project disappeared

Hi Alex! , maybe you forgot to save your process[…]

mcrypt extension is deprecated!

Hello Ehsan! If you did not find the mcrypt ext[…]