Aprovação com múltiplos gestores

Bom dia, implementando um processo de requisição de produtos tenho a necessidade de que cada produtoseja aprovado pelo gestor do centro de custo destino. Porem na mesma solicitação é possível adicionar n produtos de diferentes centro de custos. Como fazer que cada gestor aprove o produto que foi informado para o seu centro de custo. Agradeço se alguém tiver um caminho para solução deste problema.

edit.: Esqueci de mencionar "Atividade conjunta" também seria uma possibilidade.

Opção 1: Se existirem centro de custo fixos que não serão alterados você pode criar 1 atividade para cada centro de custo e utilizar um Gateway Inclusivo, para iniciar somente as atividades necessárias.

Opção 2: Você pode colocar em loop sequencial, onde passaria por cada centro de custo individualmente... porem, este artefato disponibiliza somente uma atividade, se o Gestor assumir, os demais não vão conseguir interagir até que o processo seja enviado.

Opção 3: Atividade Ad-Hoc (https://tdn.totvs.com/display/public/fluig/Atividades+Workflow#AtividadesWorkflow-Ad-Hoc)

Opção 4: Iniciar múltiplos processos de aprovação (individuais) via api e monitorar no processo principal o preenchimento dos processos de aprovação, quando o status for alterado para "finalizado" você captura os dados da aprovação. (Este seria o modo mais complexo).

Deve haver outros modos, mas precisa entender qual seria mais adequado para as regra de negócio da empresa.

Bruno boa tarde.
A unica questão é como fazer isso dinamicamente, pois o colaborador pode escolher 1 ou mais centro de custos diferentes ou não.

Boa tarde. A unica maneira que encontrei de resolver o problema foi utilizando o web service e o mesmo abrindo cada solicitação separadamente. Assim porem é possível enviar a solicitação para um gestor especifico. Hoje pesquiso dentro do meu ERP o gestor e com ele a verificação via e-mail com o usuário do Fluig.


function servicetask10(attempt, message) {
    log.warn("####### Service TASK 10");
    var numProcessoPai = getValue("WKNumProces");
    usuarioCorrente = getValue("WKUser");
    emailUsuarioCorrente = fluigAPI.getUserService().getCurrent().getEmail();
    var servico = ServiceManager.getService("ECMWorkflow");
    var serviceHelper = servico.getBean();

    //var usuario = new java.util.ArrayList();
    //usuario.add("user" + "#####");

    var service = serviceHelper.instantiate('WSFluig.ECMWorkflowEngineServiceService');

    var request = service.getWorkflowEngineServicePort();

    var indexes = hAPI.getChildrenIndexes("table_Produtos");
    var total = 0;

    var gestores = new java.util.ArrayList();

    for (var i = 0; i < indexes.length; i++) {
        if(!gestores.contains(hAPI.getCardValue("email_gestor___" + indexes[i]))){
            gestores.add(hAPI.getCardValue("email_gestor___" + indexes[i]));
        }
    }
    var iterador = gestores.size();

    ObjFactory = serviceHelper.instantiate('WSFluig.ObjectFactory');

    var ProcessAttachmentDtoArray = ObjFactory.createProcessAttachmentDtoArray();
    var ProcessTaskAppointmentDtoArray = ObjFactory.createProcessTaskAppointmentDtoArray();


    for(i = 0; i < iterador; i++) {
        var contador = 0;
        var email_gestor_atual = gestores.get(i);
        var c1 = DatasetFactory.createConstraint("mail", email_gestor_atual, email_gestor_atual, ConstraintType.MUST);
        var constraints = new Array(c1); 
        var dataset = DatasetFactory.getDataset("colleague", null, constraints, null);
        var colleagueIds = ObjFactory.createStringArray();
        colleagueIds.getItem().add(dataset.getValue(0, "colleaguePK.colleagueId")); //responsavel
        var cardData = ObjFactory.createStringArrayArray();

        for (var j = 0; j < indexes.length; j++) {
            if(email_gestor_atual == hAPI.getCardValue("email_gestor___" + indexes[j])){
                cardData.getItem().add(incluiCampo(ObjFactory, "CP_MAT", hAPI.getCardValue("CP_MAT")));
                cardData.getItem().add(incluiCampo(ObjFactory, "email_gestor", hAPI.getCardValue("email_gestor___" + indexes[j])));
                cardData.getItem().add(incluiCampo(ObjFactory, "email_solicitante", emailUsuarioCorrente));
                cardData.getItem().add(incluiCampo(ObjFactory, "id_gestor", dataset.getValue(0, "colleaguePK.colleagueId")));
                cardData.getItem().add(incluiCampo(ObjFactory, "funcionarioZOOM", hAPI.getCardValue("funcionarioZOOM")));

                var produto = hAPI.getCardValue("produtoZOOM___" + indexes[j]);
                var codigoprod = hAPI.getCardValue("CP_COD___" + indexes[j]);
                var quantidadeprod = hAPI.getCardValue("CP_QUANT___" + indexes[j]);
                var ctt_custo = hAPI.getCardValue("ctt_custo___" + indexes[j]);

                cardData.getItem().add(incluiCampo(ObjFactory, "produtoZOOM___" +indexes[j],produto));
                cardData.getItem().add(incluiCampo(ObjFactory, "CP_COD___" +indexes[j],codigoprod));
                cardData.getItem().add(incluiCampo(ObjFactory, "CP_QUANT___" +indexes[j],quantidadeprod));
                cardData.getItem().add(incluiCampo(ObjFactory, "ctt_custo___" +indexes[j],ctt_custo));
            }
        }
        var userId = usuarioCorrente; //quem inicia
        var ativDestino = 5; 
        var codEmpresa = 99; //trocar no ambiente produção
        var retorno = request.startProcess("usuario", "#############", codEmpresa, 'Solicitação ao Armazem Aprovador', ativDestino, colleagueIds, 'processo iniciado pelo processo pai nº '+numProcessoPai, userId, true, ProcessAttachmentDtoArray, cardData, ProcessTaskAppointmentDtoArray, false);


        var idProcesso = retorno.getItem().get(5).getItem().get(1);
        log.info("*************** idProcesso gerado ************** "+idProcesso)    
    }
}

function incluiCampo(ObjFactory, nomeCampo, valorCampo) {
    var field = ObjFactory.createStringArray();
    field.getItem().add(nomeCampo); // nome do campo.
    field.getItem().add(valorCampo); // valor do campo.
    return field;
}