1 Transferência Ginseng Transferência Ginseng Este flow permite abertura de solicitação de transferências automatizadas, informando qual item será transferido e direcionado para as aprovações corretas. true false Default Transferência Grupo <AssignmentController><Group>CD</Group></AssignmentController> 0 0 0 Default false 1 true false 172800 0 true 1 Transferência Ginseng 49 43582 true true false true false false 0 2 false false true 1 Transferência Ginseng 1 1 Solicitar transferência Solicitar transferência 0 false 0 1 true false false 0 0 0 0 false 0 true true false 100 83 0 0 false false 0 0 false 0 10 0 false 0 0 0 0 false 1 Transferência Ginseng 1 4 Aprovar Transferência Aprovar Transferência 16200 false 0 1 false false false 0 0 0 0 false 0 true true false 500 280 0 0 false false 0 0 false Expediente Lojas 0 80 0 false 0 0 0 0 false 0 1 Transferência Ginseng 1 6 Emitir NFE de Transf Emitir NFE de Transf 57600 false 0 Pool Grupo <AssignmentController><Group>CD</Group></AssignmentController> 1 false false false 0 0 0 0 false 0 true true false 500 490 0 0 false false 0 0 false 0 80 0 false 0 0 0 0 false 0 1 Transferência Ginseng 1 18 Receber Produtos Receber Produtos 7200 false 0 Campo Formulário <AssignmentController><FormField>gestor_cc</FormField></AssignmentController> 1 false false false 0 0 0 0 false 0 true true false 1170 284 0 0 false false 0 0 false Expediente Lojas 0 80 0 false 0 0 0 0 false 0 1 Transferência Ginseng 1 24 Verificar problema Verificar problema 172800 false 0 Usuário <AssignmentController><User>logistica</User></AssignmentController> 1 false false false 0 0 0 0 false 0 true true false 1400 479 0 0 false false 0 0 false Expediente BackOffice, Logística e Motorista 0 80 0 false 0 0 0 0 false 0 1 Transferência Ginseng 1 31 Coletar Produto Coletar Produto 43200 false 0 1 false false false 0 0 0 0 false 0 true true false 850 679 0 0 false false 0 0 false Expediente BackOffice, Logística e Motorista 0 80 0 false 0 0 0 0 false 0 1 Transferência Ginseng 1 57 Entregar Produto Entregar Produto 57600 false 0 Campo Formulário <AssignmentController><FormField>motoristaEntregaLogin</FormField></AssignmentController> 1 false true false 3600 3600 0 0 false 0 true false false 1100 679 0 0 false false 0 0 false Expediente BackOffice, Logística e Motorista 0 80 0 false 0 0 0 0 false 0 1 Transferência Ginseng 1 99 Consultar Entrada Consultar Entrada 0 false 0 1 false false false 0 0 0 0 false 0 true false false 1600 284 0 0 false false 0 0 false 0 82 0 false 0 0 0 0 false 1 1 Transferência Ginseng 1 104 Verificar problema de lançamento Verificar problema de lançamento 0 false 0 1 false true false 3600 3600 0 0 false 0 true false false 1600 60 0 0 false false 0 0 false 0 80 0 false 0 0 0 0 false 0 1 Transferência Ginseng 1 103 Intermediário Intermediário Evento intermediário do processo 0 false 0 0 false true false 1 1 0 0 false 0 true false false 1660 284 0 0 false false 0 false 0 43 0 false 0 false 99 1 Transferência Ginseng 1 2 Validar Loja Validar Loja false false false 0 true 250 47 false 1 120 0 0 false 1 Transferência Ginseng 1 46 Validar produto Validar produto false false false 0 true 1420 268 false 1 120 0 0 false 1 Transferência Ginseng 1 107 Validar rota Validar rota false false false 0 true 520 663 false 1 120 0 0 false 1 Transferência Ginseng 1 39 Cancelado Cancelado Atividade final do processo 0 false 0 0 false true false 0 1 0 0 false 0 false true false 700 310 0 0 false false 0 0 false 6 65 0 false 0 false 1 Transferência Ginseng 1 60 Fim com cancelamento de processo Fim com cancelamento de processo Atividade final do processo 0 false 0 0 false true false 0 1 0 0 false 0 false false false 1570 699 0 0 false false 0 0 false 6 65 0 false 0 false 1 Transferência Ginseng 1 96 Fim Fim Atividade final do processo 0 false 0 0 false true false 0 1 0 0 false 0 false false false 770 510 0 0 false false 0 0 false 6 60 0 false 0 false 1 Transferência Ginseng 1 101 Fim Fim Atividade final do processo 0 false 0 0 false true false 0 1 0 0 false 0 false false false 1777 300 0 0 false false 0 0 false 6 60 0 false 0 false 1 Transferência Ginseng 1 49 2 hAPI.getCardValue("gestor_cce") != "" 4 <AssignmentController><FormField>gestor_cce</FormField></AssignmentController> Campo Formulário 0 1 Transferência Ginseng 2 49 2 true 6 <AssignmentController><User>logistica</User></AssignmentController> Usuário 0 1 Transferência Ginseng 1 49 46 hAPI.getCardValue("validacaoItens") == "entregue" && hAPI.getCardValue("dataEntradaNfeConsulta") != "" 99 0 1 Transferência Ginseng 2 49 46 true 24 0 1 Transferência Ginseng 1 49 107 hAPI.getCardValue("ufOrigem") == "AL" 31 <AssignmentController><Group>motoristaAL</Group></AssignmentController> Pool Grupo 0 1 Transferência Ginseng 2 49 107 hAPI.getCardValue("ufOrigem") == "BA" 31 <AssignmentController><Group>motoristaBA</Group></AssignmentController> Pool Grupo 0 1 Transferência Ginseng 3 49 107 hAPI.getCardValue("ufOrigem") == "SE" 31 <AssignmentController><Group>motoristaSE</Group></AssignmentController> Pool Grupo 0 1 Transferência Ginseng 4 49 107 hAPI.getCardValue("ufOrigem") == "" 31 <AssignmentController><Group>CD</Group></AssignmentController> Pool Grupo 0 1 Transferência Ginseng 5 49 107 hAPI.getCardValue("ufOrigem") == "VDC" 31 <AssignmentController><Group>motoristaBA</Group></AssignmentController> Pool Grupo 0 1 Transferência Ginseng 6 49 107 hAPI.getCardValue("ufOrigem") == "SE" 31 <AssignmentController><Group>motoristaSE</Group></AssignmentController> Pool Grupo 0 1 Transferência Ginseng 1 3 false 1 2 false false 0 1 Transferência Ginseng 1 5 false 2 4 Gestor Identificado false false 0 1 Transferência Ginseng 1 7 false 2 6 Loja sem Gestor false false 0 1 Transferência Ginseng 1 26 Ajuste realizado false 24 18 Ajuste de transferência false false 0 1 Transferência Ginseng 1 41 Aprovado e emitir NFE false 4 6 Aprovar false false 0 1 Transferência Ginseng 1 47 Confirmar recebimento false 18 46 Confirmar recebimento false false 0 1 Transferência Ginseng 1 48 false 46 24 Reprovar false false 0 1 Transferência Ginseng 1 53 false 4 39 Reprovar false false 0 1 Transferência Ginseng 1 61 false 57 60 Cancelar false false 0 1 Transferência Ginseng 1 85 Transferência entregue false 57 18 Validar produtos recebidos false false 0 1 Transferência Ginseng 1 97 Cancelar Transferência false 6 96 Finalizar false false 0 1 Transferência Ginseng 1 98 Pedido coletado false 31 57 Entregar produto false false 0 1 Transferência Ginseng 1 100 false 46 99 false false 0 1 Transferência Ginseng 1 102 false 99 101 false false 0 1 Transferência Ginseng 1 105 false 103 104 false false 0 1 Transferência Ginseng 1 106 false 104 99 false false 0 1 Transferência Ginseng 1 108 Enviar para coleta false 6 107 Enviar para rota false false 0 1 Transferência Ginseng 1 109 false 107 31 false false 0 1 beforeTaskSave Transferência Ginseng 1 function beforeTaskSave(colleagueId, nextSequenceId, userList) { try { var currentState = parseInt(getValue("WKNumState"), 10); var completeTask = String(getValue("WKCompletTask") || "false"); var nextState = parseInt(String(nextSequenceId || "0"), 10); if (completeTask !== "true") return; if (currentState === 6) { // Fluxo de cancelamento saindo da atividade 6 nao deve disparar template de nota emitida. if (nextState === 97) return; enviarNotificacaoNotaEmitida(); return; } if (currentState === 31) { enviarNotificacaoColetaRealizada(); return; } if (currentState === 57) { // 61 = cancelamento no diagrama. if (nextState === 61) return; enviarNotificacaoEntregaRealizada(); } } catch (e) { log.error("[Transferencia.beforeTaskSave] Erro no beforeTaskSave: " + e); } } function enviarNotificacaoNotaEmitida() { var envio = montarContextoEnvio(); if (!envio.ok) return; var params = buildCommonParams(envio.processNumber, envio.chaveNfe, envio.processLink); notifyTemplate("tpl_nota_emitida", envio.destinoEmail, envio.requesterId, params, envio.processNumber, envio.processLink); } function enviarNotificacaoColetaRealizada() { var envio = montarContextoEnvio(); if (!envio.ok) return; var motoristaColetaNome = safeTrim(hAPI.getCardValue("motoristaColetaNome")); var dataColeta = safeTrim(hAPI.getCardValue("dataColeta")); var motoristaEntregaNome = safeTrim(hAPI.getCardValue("motoristaEntregaNome")); var tipoMotoristaEntrega = safeTrim(hAPI.getCardValue("tipoMotoristaEntrega")); if (motoristaEntregaNome === "" && tipoMotoristaEntrega === "mesmo") { motoristaEntregaNome = motoristaColetaNome; } var params = buildCommonParams(envio.processNumber, envio.chaveNfe, envio.processLink); params.put("motoristaColetaNome", motoristaColetaNome); params.put("dataColeta", dataColeta); params.put("motoristaEntregaNome", motoristaEntregaNome); notifyTemplate("tpl_coleta_realizada", envio.destinoEmail, envio.requesterId, params, envio.processNumber, envio.processLink); } function enviarNotificacaoEntregaRealizada() { var envio = montarContextoEnvio(); if (!envio.ok) return; var motoristaEntregaNome = safeTrim(hAPI.getCardValue("motoristaEntregaNome")); var dataEntrega = safeTrim(hAPI.getCardValue("dataEntrega")); var nomerecebedor = safeTrim(hAPI.getCardValue("nomerecebedor")); var params = buildCommonParams(envio.processNumber, envio.chaveNfe, envio.processLink); params.put("motoristaEntregaNome", motoristaEntregaNome); params.put("dataEntrega", dataEntrega); params.put("nomerecebedor", nomerecebedor); notifyTemplate("tpl_entrega_realizada", envio.destinoEmail, envio.requesterId, params, envio.processNumber, envio.processLink); } function montarContextoEnvio() { var requesterId = safeTrim(hAPI.getCardValue("requesterId")); var requesterMail = safeTrim(hAPI.getCardValue("requesterMail")); if (requesterId === "" && requesterMail !== "") { requesterId = findColleagueIdByMail(requesterMail); } // Prioriza email explicito salvo no formulario; fallback para email do colleague. var destinoEmail = requesterMail; if (!isValidEmail(destinoEmail)) { destinoEmail = resolveEmailByColleagueId(requesterId); } if (!isValidEmail(destinoEmail)) { log.warn("[Transferencia.beforeTaskSave] Email do solicitante invalido. requesterId=" + requesterId + ", requesterMail=[" + requesterMail + "], destinoEmail=[" + destinoEmail + "]"); return { ok: false }; } var processNumber = safeTrim(getValue("WKNumProces")); var chaveNfe = onlyDigits(hAPI.getCardValue("chaveNfe")); if (chaveNfe === "") chaveNfe = safeTrim(hAPI.getCardValue("chaveNfe")); var processLink = buildProcessLink(processNumber); return { ok: true, requesterId: requesterId, destinoEmail: destinoEmail, processNumber: processNumber, chaveNfe: chaveNfe, processLink: processLink }; } function buildCommonParams(processNumber, chaveNfe, processLink) { var params = new java.util.HashMap(); params.put("WKNumProces", processNumber); params.put("chaveNfe", chaveNfe); params.put("linkSolicitacao", processLink); params.put("link", processLink); return params; } function notifyTemplate(templateCode, destinoEmail, requesterId, params, processNumber, processLink) { var NOTIFIER_SENDER_USER = "admin"; var recipients = new java.util.ArrayList(); recipients.add(destinoEmail); notifier.notify(NOTIFIER_SENDER_USER, templateCode, params, recipients, "text/html"); log.info("[Transferencia.beforeTaskSave] " + templateCode + " enviado. processo=" + processNumber + ", destino=" + destinoEmail + ", requesterId=" + requesterId + ", link=[" + processLink + "]"); } function buildProcessLink(processNumber) { var BASE_URL_FALLBACK = "https://comerciode188006.fluig.cloudtotvs.com.br"; var baseUrl = safeTrim(getValue("WKServerURL")); var companyId = safeTrim(getValue("WKCompany")); if (baseUrl === "") baseUrl = BASE_URL_FALLBACK; if (baseUrl.indexOf("http://") !== 0 && baseUrl.indexOf("https://") !== 0) { baseUrl = "https://" + baseUrl; } if (baseUrl.charAt(baseUrl.length - 1) === "/") baseUrl = baseUrl.substring(0, baseUrl.length - 1); if (companyId === "") companyId = "1"; if (baseUrl === "" || safeTrim(processNumber) === "") return ""; return baseUrl + "/portal/p/" + companyId + "/pageworkflowview?app_ecm_workflowview_detailsProcessInstanceID=" + processNumber; } function findColleagueIdByMail(mail) { var email = safeTrim(mail); if (email === "") return ""; try { var cMail = DatasetFactory.createConstraint("mail", email, email, ConstraintType.MUST); var dsColleague = DatasetFactory.getDataset("colleague", null, [cMail], null); if (!dsColleague || dsColleague.rowsCount < 1) return ""; return safeTrim( dsColleague.getValue(0, "colleaguePK.colleagueId") || dsColleague.getValue(0, "colleagueId") || dsColleague.getValue(0, "login") ); } catch (e) { log.warn("[Transferencia.beforeTaskSave] Falha ao buscar solicitante por mail: " + e); return ""; } } function resolveEmailByColleagueId(colleagueId) { var id = safeTrim(colleagueId); if (id === "") return ""; try { var cActive = DatasetFactory.createConstraint("active", "true", "true", ConstraintType.MUST); var cId = DatasetFactory.createConstraint("colleaguePK.colleagueId", id, id, ConstraintType.MUST); var byId = DatasetFactory.getDataset("colleague", null, [cId, cActive], null); if (byId && byId.rowsCount > 0) { return safeTrim(byId.getValue(0, "mail")); } var cLogin = DatasetFactory.createConstraint("login", id, id, ConstraintType.MUST); var byLogin = DatasetFactory.getDataset("colleague", null, [cLogin, cActive], null); if (byLogin && byLogin.rowsCount > 0) { return safeTrim(byLogin.getValue(0, "mail")); } } catch (e) { log.warn("[Transferencia.beforeTaskSave] Falha ao buscar email do solicitante por colleagueId: " + e); } return ""; } function isValidEmail(email) { var v = safeTrim(email); if (v === "") return false; if (/\s/.test(v)) return false; var at = v.indexOf("@"); if (at <= 0 || at !== v.lastIndexOf("@")) return false; var dot = v.lastIndexOf("."); return dot > at + 1 && dot < (v.length - 1); } function safeTrim(value) { return String(value == null ? "" : value).trim(); } function onlyDigits(value) { return String(value == null ? "" : value).replace(/\D/g, ""); } 1 onNotify Transferência Ginseng 1 function onNotify(subject, receivers, template, params) { log.info("===== onNotify GLOBAL ===== Template: " + template); var validos = new java.util.ArrayList(); for (var i = 0; i < receivers.size(); i++) { var email = receivers.get(i); log.info("Receiver original: [" + email + "]"); if (email && email.indexOf("@") > 0 && email.indexOf(".") > 0) { validos.add(email); } else { log.warn("REMOVIDO EMAIL INVALIDO: [" + email + "] TEMPLATE: " + template); } } receivers.clear(); for (var j = 0; j < validos.size(); j++) { receivers.add(validos.get(j)); } log.info("TOTAL FINAL RECEIVERS: " + receivers.size()); } 1 servicetask99 Transferência Ginseng 1 function servicetask99(attempt, message) { try { var validacaoItens = safeTrim(hAPI.getCardValue("validacaoItens")); // Só precisa consultar entrada da NFe quando o recebimento foi validado como entregue. if (validacaoItens !== "entregue") return; var dataEntrada = safeTrim(hAPI.getCardValue("dataEntradaNfeConsulta")); if (dataEntrada !== "") return; var chaveNfe = onlyDigits(hAPI.getCardValue("chaveNfe")); if (chaveNfe === "") { log.warn("[servicetask99] Chave NFe vazia. Nao foi possivel consultar entrada."); return; } var cKey = DatasetFactory.createConstraint("key", chaveNfe, chaveNfe, ConstraintType.MUST); var dsNfe = DatasetFactory.getDataset("ds_fiscal_invoice_by_keys", null, [cKey], null); if (!dsNfe || dsNfe.rowsCount < 1) { log.warn("[servicetask99] Dataset sem retorno para chave: " + chaveNfe); return; } var dsSuccess = safeTrim(dsNfe.getValue(0, "success")).toLowerCase() === "true"; var dsUpdatedAt = safeTrim(dsNfe.getValue(0, "updatedAt")); if (dsSuccess && dsUpdatedAt !== "") { hAPI.setCardValue("dataEntradaNfeConsulta", dsUpdatedAt); log.info("[servicetask99] Data de entrada atualizada automaticamente: " + dsUpdatedAt); return; } var dsMessage = safeTrim(dsNfe.getValue(0, "message")); log.warn("[servicetask99] Consulta executada sem data de entrada. message=" + dsMessage); } catch (e) { log.error("[servicetask99] Erro na consulta automatica da NFe: " + e); throw e; } } function safeTrim(value) { return String(value == null ? "" : value).trim(); } function onlyDigits(value) { return String(value == null ? "" : value).replace(/\D/g, ""); } FFFFFF 794 1861 20 20 Solicitação de Transferência 1 0 1 Transferência Ginseng 1 1 82b0b7 198 1831 50 218 Gerente de loja 2 1 1 Transferência Ginseng 1 2 d0daae 198 1831 50 416 Logistica 2 1 1 Transferência Ginseng 1 3 d6e0d0 198 1831 50 20 Analista de suprimentos 2 1 1 Transferência Ginseng 1 4 adc9ac 200 1831 50 614 Motorista 2 1 1 Transferência Ginseng 1 5 1 Transferência Ginseng 49 5 1 342 100 1 Transferência Ginseng 49 5 2 342 326 1 Transferência Ginseng 49 7 1 279 527 1 Transferência Ginseng 49 26 1 1223 517 1 Transferência Ginseng 49 61 1 1552 717 1 Transferência Ginseng 49 85 1 1149 308 1 Transferência Ginseng centroCusto Filial Destino 1 1 Transferência Ginseng dataAbertura Data de abertura 2 1 Transferência Ginseng dataEmissaoNfe dataEmissaoNfe 3 1 Transferência Ginseng estabelecimento Filial Emitente 4 1 Transferência Ginseng justificativa Justificativa 5 1 Transferência Ginseng motoristaColetaNome Motorista Coleta 6 1 Transferência Ginseng motoristaEntregaNome Motorista Entrega 7 1 Transferência Ginseng requesterName requesterName 8 1 Transferência Ginseng 1 99 10 Lançamento efetuado com sucesso no RGB 1 2 0 0 Transferência Ginseng 49 4 approval title Solicitação de compra 0 0 Transferência Ginseng 49 4 approval description 0 0 Transferência Ginseng 49 4 approval highlight Centro de Custo - Aprovar solicitação? 0 0 Transferência Ginseng 49 4 approval approve 6 0 0 Transferência Ginseng 49 4 approval reject 39 0 0 Transferência Ginseng 49 6 approval title Solicitação de transferência 0 0 Transferência Ginseng 49 6 approval description 0 0 Transferência Ginseng 49 6 approval highlight Transferência 0 0 Transferência Ginseng 49 6 approval approve 0 0 Transferência Ginseng 49 6 approval reject 0 0 Transferência Ginseng 49 24 approval title 0 0 Transferência Ginseng 49 24 approval description 0 0 Transferência Ginseng 49 24 approval highlight 0 0 Transferência Ginseng 49 24 approval approve 0 0 Transferência Ginseng 49 24 approval reject