Mise à jour des droits (organisation) sans impact sur les tâches en cours

Bonjour,

Dans mes processus, les tâches sont réalisables par plusieurs utilisateurs en fonction de rôle/groupe.

Les tâches sont donc à un état “Non assigné”. Il faut qu’une des personnes pouvant réaliser une tâche se l’assigne pour pouvoir la réaliser.

J’ai mis à jour l’organisation suite à des changements de responsabilité. Mon problème est que ces changements sont sans impact sur les tâches en cours.

Comment indiquer à Bonita de mettre à jour la liste des personnes éligibles suite à un changement d’organisation ?

D’avance merci

Cordialement

Je ne sais pas si on peut le faire au niveau d’un tenant, mais on peut demander à Bonita de mettre à jour les acteurs d’une tâche via : processAPI.updateActorsOfUserTask(taskId);

Voici un bout de code pour mettre à jour l’ensemble des tâches en attente et non assignée : SearchOptionsBuilder pendingHumanTaskSearchBuilder = new SearchOptionsBuilder(0, 100); pendingHumanTaskSearchBuilder.filter(HumanTaskInstanceSearchDescriptor.ASSIGNEE_ID, 0); SearchResult<HumanTaskInstance> searchPendingHumanTaskResults = processAPI.searchHumanTaskInstances(pendingHumanTaskSearchBuilder.done() ); for(HumanTaskInstance pendingHumanTaskInstance : searchPendingHumanTaskResults.getResult()) { logger.info("Found task : " + pendingHumanTaskInstance); try { processAPI.updateActorsOfUserTask(pendingHumanTaskInstance.getId()); } catch (Exception e) { logger.warn("Update actors for task : " + pendingHumanTaskInstance.getId() + " has failed ! " + e.getMessage()); } }

Mais cela ne fonctionne pas pour certaines tâches :
org.bonitasoft.engine.transaction.STransactionCommitException: bitronix.tm.internal.BitronixRollbackException: RuntimeException thrown during beforeCompletion cycle caused transaction rollback

En affichant le stacktrace, voici l’erreur :
Caused by: org.postgresql.util.PSQLException.: ERROR: duplicate key value violates unique constraint "idx_uq_pending_mapping" Detail: Key (tenantid, activityid, userid, actorid)=(1, 60033, 7, 0) already exists.

La méthode updateActorsOfUserTask semble donc faire des insertions de doublons dans la table pendingMapping.

J’ai ouvert un ticket avec une proposition d’évolution : https://bonita.atlassian.net/browse/BBPMC-445

Mon filtre d’acteurs renvoi des doublons. Je vais corriger mon filtre d’acteurs pour éliminer ces doublons.

Ne faudrait-il pas que la méthode updateActorsOfUserTask gère cela, et plus particulièrement la méthode createPendingMappingsAndAssignHumanTask?

Voici la méthode actuelle :
private void createPendingMappingsAndAssignHumanTask(final long humanTaskInstanceId, final FilterResult result) throws SBonitaException { final TenantServiceAccessor tenantAccessor = getTenantAccessor(); final List<Long> userIds = result.getResult(); for (final Long userId : userIds) { createPendingMappingForUser(humanTaskInstanceId, userId); } if (userIds.size() == 1 && result.shouldAutoAssignTaskIfSingleResult()) { tenantAccessor.getActivityInstanceService().assignHumanTask(humanTaskInstanceId, userIds.get(0)); } }

Voici une proposition de modification :

private void createPendingMappingsAndAssignHumanTask(final long humanTaskInstanceId, final FilterResult result) throws SBonitaException {
        final TenantServiceAccessor tenantAccessor = getTenantAccessor();
        final List<Long> userIds = result.getResult();
        final Set<Long> uniqUserIds = new HashSet<Long>(userIds);

        for (final Long userId : uniqUserIds) {
            createPendingMappingForUser(humanTaskInstanceId, uniqUserIds);
        }
        if (uniqUserIds.size() == 1 && result.shouldAutoAssignTaskIfSingleResult()) {
 tenantAccessor.getActivityInstanceService().assignHumanTask(humanTaskInstanceId, ((Long[])uniqUserIds.toArray())[0]);
        }
    }