From 822aa6819782e2ede509882ee960aebc0a5abc24 Mon Sep 17 00:00:00 2001 From: "Andrey Cunh@" Date: Sun, 22 Mar 2026 16:12:12 -0300 Subject: [PATCH 1/3] att --- Transferência Ginseng/.vscode/servers.json | 4 +- .../events/validateForm.js | 4 + .../script.js | 99 +- .../teste.html | 57 + .../totvsflow_solicitacao_transferencia.html | 8 +- .../tpl_coleta_realizada.html | 44 + .../tpl_entrega_realizada.html | 44 + .../Solicitação de transferência.ecm30.xml | 620 ++++- .../Solicitação de transferência.png | Bin 51903 -> 50256 bytes ...licitação de transferência.processimage.svg | 2 +- .../workflow/.resources/teste3.ws.cache | 716 +++++ .../Solicitação de transferência.process | 2362 +++++++++-------- ...icitação de transferência.beforeTaskSave.js | 205 ++ .../Solicitação de transferência.onNotify.js | 27 + .../aberturadeChamado.beforeTaskSave.js | 4 +- 15 files changed, 2878 insertions(+), 1318 deletions(-) create mode 100644 Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/teste.html create mode 100644 Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/tpl_coleta_realizada.html create mode 100644 Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/tpl_entrega_realizada.html create mode 100644 Transferência Ginseng/workflow/scripts/Solicitação de transferência.beforeTaskSave.js create mode 100644 Transferência Ginseng/workflow/scripts/Solicitação de transferência.onNotify.js diff --git a/Transferência Ginseng/.vscode/servers.json b/Transferência Ginseng/.vscode/servers.json index b3a4066..4a764ca 100644 --- a/Transferência Ginseng/.vscode/servers.json +++ b/Transferência Ginseng/.vscode/servers.json @@ -2,13 +2,13 @@ "version": "1.0.0", "configurations": [ { - "id": "1v6yi27yg82mmzgeg2todjqzi42g7", + "id": "5i6o3b75rrmmn0z5dbms6ldputs2v", "name": "teste", "host": "comerciode188007.fluig.cloudtotvs.com.br", "ssl": true, "port": 443, "username": "andrey.cunha", - "password": "eyJpdiI6Ijk2Mzg4MGUwODVkYTVkZmI0YjQ2ZTdmNmNlYTJlMGI2Iiwic2FsdCI6ImI0ODMzZTAyNDkxNWYzNGFkNDVkYjE5ZThkMGNlOTM3IiwidGV4dCI6IjY3NDBmZjM2MTE1YjhiODAyM2IzYjVjZDYyYzEwYWRiIn0=", + "password": "eyJpdiI6ImE1ZmNlY2U2NjVlMjFlMzJiM2U1NzFjM2RlNTU3NDQyIiwic2FsdCI6ImU5ZDQ5MWUzNjA5OWZmYmFlZjgxZTRmODFmM2M1ZDNlIiwidGV4dCI6IjRkYTIxY2E1Mjg0ZDkxNTkzZTk0MTliYTljZGQ1ZjUzIn0=", "userCode": "andrey.cunha", "confirmExporting": false, "hasBrowser": false, diff --git a/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/events/validateForm.js b/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/events/validateForm.js index c0f4550..f99f2af 100644 --- a/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/events/validateForm.js +++ b/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/events/validateForm.js @@ -95,6 +95,10 @@ function validateForm(form) { message += getMessage("Data da entrega", 1, form); hasErros = true; } + if (String(form.getValue("nomerecebedor") || "").trim() == "") { + message += getMessage("Nome de quem recebeu a mercadoria", 1, form); + hasErros = true; + } break; case RECEBIMENTO: diff --git a/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/script.js b/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/script.js index ece38a2..59e9ee1 100644 --- a/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/script.js +++ b/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/script.js @@ -353,30 +353,67 @@ function clearZoomField(fieldId) { $("#" + fieldId).val(""); } -var MOTORISTAS_GROUP_ID = "Motoristas"; -var motoristasEntregaCache = null; -var motoristasEntregaLoading = false; +var MOTORISTAS_GROUP_DEFAULT_ID = "Motoristas"; +var MOTORISTAS_GROUP_BY_UF = { + AL: "motoristaAL", + BA: "motoristaBA", + SE: "motoristaSE" +}; +var motoristasEntregaCacheByGroup = {}; +var motoristasEntregaLoadingByGroup = {}; +var motoristaEntregaGroupAtual = ""; + +function normalizeUfCode(value) { + return String(value || "").toUpperCase().replace(/[^A-Z]/g, "").substring(0, 2); +} + +function resolveMotoristasGroupIdByUf(uf) { + var ufCode = normalizeUfCode(uf); + if (!ufCode) { + return MOTORISTAS_GROUP_DEFAULT_ID; + } + if (MOTORISTAS_GROUP_BY_UF[ufCode]) { + return String(MOTORISTAS_GROUP_BY_UF[ufCode] || "").trim() || MOTORISTAS_GROUP_DEFAULT_ID; + } + // Convencao para facilitar novos estados sem precisar alterar o JS. + return "motorista" + ufCode; +} + +function getMotoristasEntregaQueryContext() { + var uf = normalizeUfCode($("#ufDestino").val()); + var groupId = resolveMotoristasGroupIdByUf(uf); + return { + uf: uf, + groupId: groupId, + cacheKey: groupId + }; +} function loadMotoristasEntregaSelect(forceReload) { var select = $("#motoristaEntregaSelecionado"); if (!select.length) return; - if (!forceReload && motoristasEntregaCache && motoristasEntregaCache.length) { - renderMotoristasEntregaOptions(motoristasEntregaCache); + var context = getMotoristasEntregaQueryContext(); + var cacheKey = context.cacheKey; + motoristaEntregaGroupAtual = context.groupId; + + if (!forceReload && Object.prototype.hasOwnProperty.call(motoristasEntregaCacheByGroup, cacheKey)) { + renderMotoristasEntregaOptions(motoristasEntregaCacheByGroup[cacheKey], context); return; } - if (motoristasEntregaLoading) return; + if (motoristasEntregaLoadingByGroup[cacheKey]) return; - motoristasEntregaLoading = true; + motoristasEntregaLoadingByGroup[cacheKey] = true; + select.prop("disabled", true); var requestPayload = { name: "ds_motoristas_grupo", fields: null, constraints: [{ _field: "GROUP_ID", - _initialValue: MOTORISTAS_GROUP_ID, - _finalValue: MOTORISTAS_GROUP_ID, + _initialValue: context.groupId, + _finalValue: context.groupId, _type: 1 }], order: null @@ -390,14 +427,22 @@ function loadMotoristasEntregaSelect(forceReload) { data: JSON.stringify(requestPayload) }).done(function (response) { var values = ((((response || {}).content || {}).values) || []); - motoristasEntregaCache = normalizeMotoristasEntregaRows(values); - renderMotoristasEntregaOptions(motoristasEntregaCache); + var rows = normalizeMotoristasEntregaRows(values); + motoristasEntregaCacheByGroup[cacheKey] = rows; + if (motoristaEntregaGroupAtual === context.groupId) { + renderMotoristasEntregaOptions(rows, context); + } }).fail(function (xhr) { - console.error("Falha ao carregar motoristas do dataset:", xhr); - motoristasEntregaCache = []; - renderMotoristasEntregaOptions([]); + console.error("Falha ao carregar motoristas do dataset (" + context.groupId + "):", xhr); + motoristasEntregaCacheByGroup[cacheKey] = []; + if (motoristaEntregaGroupAtual === context.groupId) { + renderMotoristasEntregaOptions([], context); + } }).always(function () { - motoristasEntregaLoading = false; + motoristasEntregaLoadingByGroup[cacheKey] = false; + if (motoristaEntregaGroupAtual === context.groupId) { + select.prop("disabled", false); + } }); } @@ -429,14 +474,21 @@ function normalizeMotoristasEntregaRows(values) { return out; } -function renderMotoristasEntregaOptions(rows) { +function renderMotoristasEntregaOptions(rows, context) { var select = $("#motoristaEntregaSelecionado"); if (!select.length) return; var selectedValue = String($("#motoristaEntregaLogin").val() || select.val() || "").trim(); + var placeholder = "Selecione o motorista"; + if (context && context.uf) { + placeholder = "Selecione o motorista da UF " + context.uf; + } + if ((rows || []).length === 0 && context && context.uf) { + placeholder = "Sem motoristas cadastrados para UF " + context.uf; + } select.empty(); - select.append($("").val("").text("Selecione o motorista")); + select.append($("").val("").text(placeholder)); for (var i = 0; i < rows.length; i++) { var row = rows[i]; @@ -462,6 +514,12 @@ function renderMotoristasEntregaOptions(rows) { applySelectedMotoristaEntregaOption(); } +function refreshMotoristasEntregaByUf(forceReload) { + var escolha = String($("input[name='tipoMotoristaEntrega']:checked").val() || ""); + if (escolha !== "outro") return; + loadMotoristasEntregaSelect(forceReload === true); +} + function syncMotoristaEntregaSelectFromHidden() { var select = $("#motoristaEntregaSelecionado"); if (!select.length) return; @@ -1043,7 +1101,7 @@ var beforeSendValidate = function (numState, nextState) { throw "'Complemento' é obrigatório."; } else if ($("#justificativa").val() == "") { $("#justificativa").parent("div").addClass("errorValidate"); - throw "'Qual o motivo da compra?' é obrigatório."; + throw "'Qual o motivo da transferência?' é obrigatório."; } else { $("input[id^='quantidadeItem___']").each(function (index, value) { var linha = $(value).attr("name").split("___")[1]; @@ -1152,6 +1210,9 @@ var beforeSendValidate = function (numState, nextState) { if ($("#dataEntrega").val() == "") { throw "'Data da entrega' é obrigatória."; } + if (String($("#nomerecebedor").val() || "").trim() == "") { + throw "'Nome de quem recebeu a mercadoria' é obrigatório."; + } } else if (numState == 18) { var validacaoItens = $("input[name='validacaoItens']:checked").val(); if (validacaoItens == "" || validacaoItens == undefined) { @@ -1224,6 +1285,7 @@ function setSelectedZoomItem(selectedItem) { $("#gestorEmail").val(selectedItem["emailGestor"] || ""); $("#gestor_cc").val(selectedItem["COLLEAGUE_ID"] || ""); $("#ufDestino").val(selectedItem["UF"] || ""); + refreshMotoristasEntregaByUf(true); } if (name_item == "estabelecimento") { @@ -1275,6 +1337,7 @@ function removedZoomItem(removedItem) { $("#gestorEmail").val(""); $("#gestor_cc").val(""); $("#ufDestino").val(""); + refreshMotoristasEntregaByUf(true); } else if (name_item == "estabelecimento") { $("#gestorNomeE").val(""); $("#gestorEmailE").val(""); diff --git a/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/teste.html b/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/teste.html new file mode 100644 index 0000000..bf98a5f --- /dev/null +++ b/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/teste.html @@ -0,0 +1,57 @@ +
+ +
+ + +
+

Transferências Ginseng

+

Notificação de Processo

+
+ + +
+ +

Nota Fiscal Emitida ✅

+ +

Olá,

+ +

+ Sua solicitação teve a Nota Fiscal emitida com sucesso. +

+ + +
+

Nº Solicitação: ${WKNumProces}

+

Chave NFe: ${chaveNfe}

+
+ +

+ Clique no botão abaixo para acessar o processo: +

+ + +
+ + Acessar Solicitação + +
+

+ Se o botao nao abrir, copie e cole este link no navegador:
+ ${linkSolicitacao} +

+ +

+ Este é um e-mail automático, não responda. +

+ +
+ + +
+ © Ginseng +
+ +
+
diff --git a/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/totvsflow_solicitacao_transferencia.html b/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/totvsflow_solicitacao_transferencia.html index 7338787..767928e 100644 --- a/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/totvsflow_solicitacao_transferencia.html +++ b/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/totvsflow_solicitacao_transferencia.html @@ -517,8 +517,14 @@ - +
+
+ + +
+
+

Validação do Recebimento

diff --git a/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/tpl_coleta_realizada.html b/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/tpl_coleta_realizada.html new file mode 100644 index 0000000..c18f70b --- /dev/null +++ b/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/tpl_coleta_realizada.html @@ -0,0 +1,44 @@ +
+
+ +
+

Transferências Ginseng

+

Notificação de Processo

+
+ +
+

Coleta Realizada

+ +

Olá,

+

O motorista ${motoristaColetaNome} coletou o produto na data ${dataColeta}.

+

O motorista ${motoristaEntregaNome} irá realizar a entrega.

+ +
+

Nº Solicitação: ${WKNumProces}

+

Chave NFe: ${chaveNfe}

+
+ +

Clique no botão abaixo para acessar o processo:

+ + +

+ Se o botão não abrir, copie e cole este link no navegador:
+ ${linkSolicitacao} +

+ +

+ Este é um e-mail automático, não responda. +

+
+ +
+ © Ginseng +
+
+
diff --git a/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/tpl_entrega_realizada.html b/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/tpl_entrega_realizada.html new file mode 100644 index 0000000..108b3fd --- /dev/null +++ b/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/tpl_entrega_realizada.html @@ -0,0 +1,44 @@ +
+
+ +
+

Transferências Ginseng

+

Notificação de Processo

+
+ +
+

Entrega Realizada

+ +

Olá,

+

O motorista ${motoristaEntregaNome} entregou a mercadoria na data ${dataEntrega}.

+

Quem recebeu foi: ${nomerecebedor}.

+ +
+

Nº Solicitação: ${WKNumProces}

+

Chave NFe: ${chaveNfe}

+
+ +

Clique no botão abaixo para acessar o processo:

+ + +

+ Se o botão não abrir, copie e cole este link no navegador:
+ ${linkSolicitacao} +

+ +

+ Este é um e-mail automático, não responda. +

+
+ +
+ © Ginseng +
+
+
diff --git a/Transferência Ginseng/workflow/.resources/Solicitação de transferência.ecm30.xml b/Transferência Ginseng/workflow/.resources/Solicitação de transferência.ecm30.xml index fe18df6..fb7abe7 100644 --- a/Transferência Ginseng/workflow/.resources/Solicitação de transferência.ecm30.xml +++ b/Transferência Ginseng/workflow/.resources/Solicitação de transferência.ecm30.xml @@ -8,10 +8,10 @@ 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 - Fluig teste + Default Transferência - Usuário - <AssignmentController><User>projetos</User></AssignmentController> + Grupo + <AssignmentController><Group>CD</Group></AssignmentController> 0 0 0 @@ -29,11 +29,10 @@ 1 Transferência Ginseng - 46 + 65 590 - 0 true true false @@ -127,8 +126,8 @@ true true false - 490 - 281 + 500 + 280 0 0 false @@ -179,7 +178,7 @@ true true false - 490 + 500 490 0 0 @@ -232,7 +231,7 @@ true false 1170 - 270 + 284 0 0 false @@ -283,7 +282,7 @@ true true false - 1410 + 1400 479 0 0 @@ -319,8 +318,7 @@ false 0 - Pool Grupo - <AssignmentController><Group>Motoristas</Group></AssignmentController> + 1 false false @@ -439,7 +437,7 @@ false false 1600 - 260 + 284 0 0 false @@ -541,7 +539,7 @@ false false 1660 - 260 + 284 0 0 false @@ -598,8 +596,33 @@ 0 true - 1430 - 250 + 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 @@ -778,8 +801,8 @@ false false false - 1780 - 280 + 1777 + 300 0 0 false @@ -803,7 +826,7 @@ 1 Transferência Ginseng 1 - 46 + 65 2 hAPI.getCardValue("gestor_cce") != "" @@ -817,7 +840,7 @@ 1 Transferência Ginseng 2 - 46 + 65 2 true @@ -831,7 +854,7 @@ 1 Transferência Ginseng 1 - 46 + 65 46 hAPI.getCardValue("validacaoItens") == "entregue" && hAPI.getCardValue("dataEntradaNfeConsulta") != "" @@ -843,13 +866,69 @@ 1 Transferência Ginseng 2 - 46 + 65 46 true 24 0 + + + 1 + Transferência Ginseng + 1 + 65 + 107 + + hAPI.getCardValue("ufOrigem") == "AL" + 31 + <AssignmentController><Group>motoristaAL</Group></AssignmentController> + Pool Grupo + 0 + + + + 1 + Transferência Ginseng + 2 + 65 + 107 + + hAPI.getCardValue("ufOrigem") == "BA" + 31 + <AssignmentController><Group>motoristaBA</Group></AssignmentController> + Pool Grupo + 0 + + + + 1 + Transferência Ginseng + 3 + 65 + 107 + + hAPI.getCardValue("ufOrigem") == "SE" + 31 + <AssignmentController><Group>motoristaSE</Group></AssignmentController> + Pool Grupo + 0 + + + + 1 + Transferência Ginseng + 4 + 65 + 107 + + hAPI.getCardValue("ufOrigem") == "" + 31 + <AssignmentController><Group>CD</Group></AssignmentController> + Pool Grupo + 0 + @@ -913,12 +992,12 @@ 1 26 - + Ajuste realizado false 24 18 - + Ajuste de transferência false false 0 @@ -947,12 +1026,12 @@ 1 47 - + Confirmar recebimento false 18 46 - + Confirmar recebimento false false 0 @@ -1015,7 +1094,7 @@ 1 85 - Produtos entregue + Transferência entregue false 57 18 @@ -1025,23 +1104,6 @@ false 0 - - - 1 - Transferência Ginseng - 1 - 95 - - Enviar para coleta - false - 68 - 31 - - Enviar para coleta - false - false - 0 - 1 @@ -1066,12 +1128,12 @@ 1 98 - + Pedido coletado false 31 57 - + Entregar produto false false 0 @@ -1144,9 +1206,292 @@ 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://comerciode188007.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 @@ -1154,54 +1499,54 @@ 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, ""); -} + 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, ""); +} @@ -1210,7 +1555,7 @@ function onlyDigits(value) { FFFFFF 794 - 1791 + 1861 20 20 Solicitação de Transferência @@ -1226,7 +1571,7 @@ function onlyDigits(value) { 82b0b7 198 - 1761 + 1831 50 218 Gerente de loja @@ -1242,7 +1587,7 @@ function onlyDigits(value) { d0daae 198 - 1761 + 1831 50 416 Logistica @@ -1258,7 +1603,7 @@ function onlyDigits(value) { d6e0d0 198 - 1761 + 1831 50 20 Analista de suprimentos @@ -1274,7 +1619,7 @@ function onlyDigits(value) { adc9ac 200 - 1761 + 1831 50 614 Motorista @@ -1295,7 +1640,7 @@ function onlyDigits(value) { 1 Transferência Ginseng - 46 + 65 5 1 @@ -1306,7 +1651,7 @@ function onlyDigits(value) { 1 Transferência Ginseng - 46 + 65 5 2 @@ -1317,7 +1662,7 @@ function onlyDigits(value) { 1 Transferência Ginseng - 46 + 65 7 1 @@ -1328,7 +1673,7 @@ function onlyDigits(value) { 1 Transferência Ginseng - 46 + 65 26 1 @@ -1339,7 +1684,7 @@ function onlyDigits(value) { 1 Transferência Ginseng - 46 + 65 61 1 @@ -1350,37 +1695,17 @@ function onlyDigits(value) { 1 Transferência Ginseng - 46 + 65 85 1 1149 308 - - - 1 - Transferência Ginseng - 46 - 95 - 1 - - 543 - 717 - - - - 1 - Transferência Ginseng - anexo_lista1 - - Nome do arquivo - 1 - 1 @@ -1388,7 +1713,7 @@ function onlyDigits(value) { centroCusto Filial Destino - 2 + 1 @@ -1397,6 +1722,15 @@ function onlyDigits(value) { dataAbertura Data de abertura + 2 + + + + 1 + Transferência Ginseng + dataEmissaoNfe + + dataEmissaoNfe 3 @@ -1421,9 +1755,9 @@ function onlyDigits(value) { 1 Transferência Ginseng - userSolicitante + requesterName - Solicitante + requesterName 6 @@ -1446,7 +1780,7 @@ function onlyDigits(value) { 0 0 Transferência Ginseng - 46 + 65 4 approval title @@ -1456,7 +1790,7 @@ function onlyDigits(value) { 0 0 Transferência Ginseng - 46 + 65 4 approval description @@ -1466,7 +1800,7 @@ function onlyDigits(value) { 0 0 Transferência Ginseng - 46 + 65 4 approval highlight @@ -1476,7 +1810,7 @@ function onlyDigits(value) { 0 0 Transferência Ginseng - 46 + 65 4 approval approve @@ -1486,7 +1820,7 @@ function onlyDigits(value) { 0 0 Transferência Ginseng - 46 + 65 4 approval reject @@ -1496,7 +1830,7 @@ function onlyDigits(value) { 0 0 Transferência Ginseng - 46 + 65 6 approval title @@ -1506,7 +1840,7 @@ function onlyDigits(value) { 0 0 Transferência Ginseng - 46 + 65 6 approval description @@ -1516,7 +1850,7 @@ function onlyDigits(value) { 0 0 Transferência Ginseng - 46 + 65 6 approval highlight @@ -1526,7 +1860,7 @@ function onlyDigits(value) { 0 0 Transferência Ginseng - 46 + 65 6 approval approve @@ -1536,7 +1870,7 @@ function onlyDigits(value) { 0 0 Transferência Ginseng - 46 + 65 6 approval reject @@ -1546,7 +1880,7 @@ function onlyDigits(value) { 0 0 Transferência Ginseng - 46 + 65 24 approval title @@ -1556,7 +1890,7 @@ function onlyDigits(value) { 0 0 Transferência Ginseng - 46 + 65 24 approval description @@ -1566,7 +1900,7 @@ function onlyDigits(value) { 0 0 Transferência Ginseng - 46 + 65 24 approval highlight @@ -1576,7 +1910,7 @@ function onlyDigits(value) { 0 0 Transferência Ginseng - 46 + 65 24 approval approve @@ -1586,7 +1920,7 @@ function onlyDigits(value) { 0 0 Transferência Ginseng - 46 + 65 24 approval reject diff --git a/Transferência Ginseng/workflow/.resources/Solicitação de transferência.png b/Transferência Ginseng/workflow/.resources/Solicitação de transferência.png index 1ea384d6eb203407e317376eb4af22b5b245f327..d5bc181d6cf4de942b855d1262a31021eac14646 100644 GIT binary patch literal 50256 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¬UDtyR6lc1gThDTepb^|8!hB0Qr6-A5_vSXiD_mB z1MbHF)F9cj?|%;!UdNQAytCaHXB9F3O;OtJ`M#_%|fw+YduKmMD0ot_cK?cIf+PM=F08j)u8+-LE z*e!-7!>e*^;C?~v~R z!bl1U2n!2v`6EAqQ@k*RJS=Uf`f6B0c3WyX%xgPrs_hE zrxei!zsyi|7>?vg%=I0O(Nj=nf%5tx=16_dX1qT9yZu%noe$l3iz?wK=hK#7P0mcmwnfWbQY9q3meR~nZeJufX`V603Ai`>5f zl}EvrpM|>Www0LLEbPfO6rx^}`CG5u{SKX%<~YsxRtUO$-5^c6Hsuyg?R$9K5Ahz( zB)5TijNJk6U7O21;We(P;pVYSv@F5Vj8h5$p|sbBt-8zm-ebq=*2AaCIgA&_B^Fr7 zfL_PBPvk~He5ckm#{0piwkYQ?Nk#Om!R+@UDTAJ%L>(*s6w0`#E?cSUmlHlBp;@wb z;?wXwxvU+l)p(W)_Xp%Jg?*6qY-*jp#b1@KesTvP-hX|+go05;>i!e*loQmiweJ>N z+d-Zu6*Rh+bB?4)_tK309DqpAjIDKIpD?kB1MJWQP?EVgv%E#dQEedT!r#

R2N` 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

`cr34hiHiOE@5?K>B?iWhoUSq) z?XpXK=7-zAwd%TRurkpUYKB$6lCijbK*Yh4Wi2>d%TcHVZ#e09iATY~wm{{t$ z?n8nVP0L(Qf5XJf^}4kn?X%J>x0~LEDc&-ObA7E@3w6}0)}Kfa2jqOa;10s^;z`6zoRwIhR-jl!B@U&sWUP3M6IW4-_i}Hpo$DNaEW`L{ue;c-F>^+ z#2M|-7O8t0f-dVKsVL`f@SNL9PyADFIS70NUG{96M?wSZpyK_x0tQP`%f(_8FaQUL?V(*2|Xf#I6YeF1xke!#uvcLB+`US0jX%$~TF7x`x>CvhIigdylHJ#elq?<5za z2>liypW=ns4Q*vyVYZ7MURKiim>Y3=lKk$O!~A`cJc7pkdfjOvN{21~;l$fRLM$fV zGi?8id7qhA1g3|<_HQ@vDjSwfb)1&$A@;Vlje78^qF^xku-}lNp&YJZG}u1=d#^Dt znD9%mbo8ll?a(_AIUpw`tR$*25^dS4=_(-T={&wBu6ysImrTutyZVw3+mcnV(`oE6 zKMFd(1~M$8e1s@K0W?qMi%z?v9zoXeDZYoZ-{C8~#5)#hnKiDW#T^EF4U1Mf-jIfj zAhH9ar}Z_A@$4T8H0&khzO<+6T9}K)#twB1r0i7a{%N__?o@KnI!wD5#*X3Mg_S%9 z$n+p-%EA4vI(_{#FkmFymZhD&zWzKL5!@n8l5t$9VU#=0fY#R5t}}TuQ`b8&WE20w z86q#ARUcs-9{uJ`pK5P@ibajrVR`ujCQm*`XsiI7LgLpmgLd!az5hkPO$8>5-Qb7m z={;@didE0DdmTnmFDQmxT`>Fnl9Mn4_}o=u2})gZ?A7x_MJa>T)i=nlblL`+A&NS{ zNb1WUJs&JYs*AtW=OdU53U3`-J5S*!FEg>MqHhnA4#mOEw;tgRs#ob zx8P(S_jX9H7ZJ=rqvcq%QFn~NfLNs67MF&+=I_Tu7dV;S7-@jtlG?XZSp28z?gunO zJkPMCu-p?~7^L_%ESwWiwnoNCUj?7V^@Ub(dpsI#B)#B6r|qee{3f?P?^mj?ug{Yf zB?z(NKV53a-~6e}mxQlkYpwO?<)vw0s7*qzg)mC0{01&&!xbh1j!~MmYoue@4=oZ; zPo4T%LHQYN6Mh)`RtvtTjA-97`xz6Sq(GtY!_!o~W5}6Yvq<0P&!0zdX^07`X=#!d zIy3DNLCZuOZ1T%>)ett>@yWIn6O*c^d+pKWx*Yw2KYBvn9G1o;y!LrpFT#_d7VG)Y zT&%H`o){b)71|F`Jq0@}BjGgNNuQA8@ukciryF>9&>@9Wqk;ZES`>b{@g3z_m66NU zuFeQQX+H?n480s=uRFB6LyA-F!$y5TFMu;DS=P(gm+rTwsl6FJ*fr#FIoRBQ&sqbv z_S1_Cq3Tmu5cIgXii%2!?a&;w>9wG*W81Tpy^LNm_WL5EV3y|Q1p-w<4Ob^Vc^dUFI+vYzpog*RGIuWwi*J8h{d!B<+ni1mO zb`%Hq4%`jkQfYY_|7NRhef?vgL(f$|HBlmZW9m~Y?O3KQu2@u5v`$U9Ek%(LZeeC5 z3U(NbeuGMCEViZ3kX0=+l1<_qpTsmY1QEgL zTq=?L;CDtdG_P7!I z_qvf~y_S!QFtV+;>5WgNCmt~pH#cuB^PtRK4Yx4387n6H4w^LHdg27qzONnH!~_h$ zxGlqjkp<>u#kQ=E26FNe&Xf{HYLKdlzUsGXhU35dC*nV+4%8}Qm(M&uaP^K_0&}oC zAg`lB6F@8crow-^5T2v2wLV(qN9bK%nMf2jPfJfn#Nq&RD|OUDxe=FV`!1O8%VQPk z_#hI5HHW4dU(3WcD#6;OH8uyJ)K!)^k6)Vs!nsh7+cO;JS0l@PNR`FMDk z>I=HqTJe4-vb*gh?vCjfx~eGZ`6lwdzBCOvOAw;<^XCJbQXV(P!0gNG zBeYu6)b=bgnsvp%QV^hyx^)ODfr*(Yy@Ljb`@wOi0R<2IJ7BCF4TD3?U1QMifKN60P)j&h`bU?}y5bI&;-y!y7Br1kp4YU-l z&lqLRI~MRLDdyt8ra*)sHG(t%b!0u4jXpg5TsD!g*0l^_fG_(d&4eq4`D%WcLNBy1 zH}dPfzduyz!xmdk4Ub}kqKaedMTG9iV{tSN-)~>F7}(pYnBdvWWdI{uKt+vmDn06(fv1DYIMQ}dc-(Xuj-hs?qr+y2F944^V5>hki- zUq7b@$C@OUdjbH_XW~i1=P&78XoC zKd`!&AZ^q4G8qb{C4baj&&r-Kvq*%LPXq+keUyGXf5Q$REsU&;xw5###;7{m`}y)) zYnbrF*hB}^TbygsU^BD;8m>e6u;S~pIl_pYOvNs#qvXCdkKwV;~^&N6Zi*q>1dI^Y*AG*?u?0Q&n05xlXcwnRr7=~)_{LN_KVcnpcj`(Y$ z+CW3Osamt3#WB;Az$kTe9BdAGuSI}*PiVCB27`TmrHjZq~-g;Pq*dje}<)gY&ZI?CBE^G%dwuerXqf{D2Rwr_^G zw>N3Tk{-ivfcBszoacZ$-m&MvL>mTxO?<(~%CJta!ZzO}$rGJ*z`);)Gc?YFyY9qO z$F$144FSxX64?-^wok|mzy2wbcF#! z{j#JH2q$Ma(x|U*U>AWHKaYhuPsbm@e8YP&%B^N_ai$7KDk;U5!&)mx{68{(g*L<~ z0~r9IOj}tDT#^Ffx3t|mjv20Q+wXk*QZ3M3wCnMubB{oz-2V<;9tWVGd^3C0-m-%J z(LZKXI__G?GY+ulqF|+R!iS!6^K#TlWV?MHFmZyDT`M{kgk!vOci?mU$~P}YfJAwW zRP)hr3;8>ooJuBdk`|%_ZLK|bIWDP3)0P+Em%0-sz;CT7HA+ee=?MoF$A+t{rD4lR z>8aHj!{SHV`B%W%F3n)qt-m^7%a4vAw&l9wtQf0Hbo(|1;v* zAEy8~-gUhFw>YhOty;xccS(|z9;ce`6P&Eqden6i@7zEax2XkVi%`e7xBft1e4k{| z{r6yuvsGsP*J-7_@jmHYUgD`jk`mBZUpego?Rj5f(}$p&#SC>kZ z5XOG2Ax|g4W*yC3`FAYHU15EdO;)BRK+(z&;~Rmj=+SQ7#q{%l~eKtN@Y7m zPZ{a7d}Z4@OoXf-{>+ zLX2}}LqvA)J0xFc7HGFW(W<%DV zT?8PP4w1RhF+-i9uQe*5caxoHbN3_pY09#_-nrL$>|Y;g!!47%i%?=6 zup1SQNXJ$0iB19~RBcM-$mgE44T$&0rVnI@2z_<29Ltx`+(OfSFcNQAETd~oOQ_eH zh0Wh@DYl(biK0RH-+QlY;Ff1U&>oI{jdy5@*0pX8By}}LB-ml|xDw{=bH7$lk~`rq zB|-rAdRZ{DIEdYX-pIDoMX|+L;IjDqfaA9)?p;YdOc-<}4>0Svjt^(A{AFa$+a@q- z0ppwVQX#vu$QO-Y=cqs=j#f+&3G|{i9Cl47PS!Ui|C+w0FZu7hf=~tH*s?Z56vAub zotdY&wzSp^0hm}I;JYI5Gwo);4W8)iEY#d&GcIo3&3^C@z1Xbr6Vc1S&+?P*H$@@eWEr|%g{ID*)PPqz0$4z z)0b3#0(uscH|}m}6Ih=d7=HRQ1g(jH2?%E84qG?6q_{Ck6%-?o1rKZ9tS+;X2peh@ zH14{J%4z6$M@W<)ZEP`WgT2&%+^&+~IGU5~I~F<1YJXJ>^(|62`QDS4?ueH_CtE7@ z+=wUn{qr5HCbVV(_sYxX*|w}r7yxL@u}kw_a(G}Qp$HhR3=<=BA1CKuG;Tq`b6#f6 zE*19K4Fw=86QJfzQ0Do*+?ye9D*Yj`-6(30IE%_E7^TfG`5CopWEu-Ov>1B4X(<1a=8@kv`&dT+V6G8E_m?b8quET;yYmG)3sFs_hc=4$w0_T`*uftGz4r}7Ez zppvaS`ep+RRRSpa0ZnCr>;M+DY;4(&Be$5VjJ)?Npd1nNa>?xrs*c)FwNy z7dXPh8cWAs&m1|!4fgf6z8WY1fJ;qM$miz8t8&CbyPAYd7_uA74z$#(jmN*whi7@L zthl5ICidn>Of-v+8PJCP>go`eR0HoGQYP^JNFr|GTBUOImxr62u4N=Q&fxY$YHEH+ zi@?Ff9+;lz8;`ipXl=K^MvvI z+DC#mI*xK?lZ?^$%e8V{=;irqqdmQ=_3RYYHyk~4AmhtowCg0irqy*Nqvu$)HA)GFepED{I#&tW8% zIxz#Z5`dD>WJF0f7V3;UYtnOgF@46qw8*g4a}_O-mXJQwSmcAe{EV6&a{z*3bzRBR zOp)nG`|Rpo{io?@2d*Ui-(1-Qq0wh-HnASKFCI^v{SU_z?4+IbDmaH?JYu6Qy>sK` zG;;6{RR5|wO?ZMQeQ_uhzC$-`b5L)pl-z{|5Os50k)T4X*~2i=qYg{Bm!`(xeQsoU z{fg;GR|Hx_I{kH?n2vpEbbi&np_dWpnSHqXQ}=DP>eio9QWpMPsbHS~#-ZDQIlf$G z+}psY4C4te=-r0gLC=I0DCXcSK|^ZgEA%RTOvo@!uyVnLtW!>Xl~Xd~Q-ewmebkHX znVESGEq>INW7i@@kwIB))X_4{O>k~?LebwGM`cKreDQQlxP0bbPDh|cd8=T#;FoxX zFMk;$f?0di%XdU2)@i7BKih5o#OUP*!*Pmh7XD>>>82jK0!TPmwC<%{q+T3mlI z^4KK@RW`-Cho~CMzgcx!&!2paBr_ZYzn_#QkG5m?x z{2!ZDI=z`!(DiD}N0Jadafm(z2P%=tVSfIB0YJ8(A|UJj(*f8GR_hICUzqRkw22>} zmR|YYtOpJ#h&xJ%bci^ox%7z-se&{f$`b{_OJ!_91}|UMadLuN>~Hm6U_-g*b|$o2 z2b0EoVKvCn3%LckF65=xHl>-jC4tb|*!Tdm#HDbq1vVS$v8obpai0?fZfL6?qNL%|2oO({3R8w6`!_VLg4i2cFcwZ{SpMH*Drm=jj4_*P)8J z)d^Y;J3e|=%1`{{JWVCbetqfn0h*Eee6u9^<1W2(z8*fX_q@Cz(*v-&)xVX@hAbyA zt!_Onoqv56H@C7tuJs%)kIuhtd&4lzB@o}w0KJRpi8o-$O-~!8R65;&d!|czo`n;i z?8ycuc^`)9l?0t2Yg)D6j5~R@1%s5?FwV;-JGWpy`b-QGtbxie&8tX|=AeDt=iX7O znCNVZLX;6jll;Evt}~7?zi-lUR{FuaBAOCc;y})eQ*yt#1G05}bnsJ&;{g!w8s*hC8s5ryz-)bl0J)YuwIoTjIDDvdN)9quYI*Og z$py+%BH@V5%ASKRL)9dF4~8~f#D$?Sx|cq#KZtI`i2CF*dKDq1hZ*r0WYuTddA5F& zGW)#{v?uUOB)bhtPRU=jRLdtB%DykbAL-G-lVFz{CO--quL-Z1m(OT_-Q9@V!%OQ= zL<)DnTHJ?CXw6ovZ5IBX=Z56YQzxz(`KT6?JXRD=JiO@I;sDZs+PC@`&cmHq1V`EL z4m(@U#xm2kg|RVHpOw)&ncET?)DqE9+r*J8l_=|L8qc}(X0P*fYbHjIxUVP{F9@c- ztn^A*>U0USP5Ki3B@u5KgA9YZu2bu72NlKX)Jhj9m8i=!@T4breuf$Z?Jg<9s8p!L z0C53hKz8!&nFb4u0hemd#!GIEF6ogm{gvHVMT-8P9ar%OZmw%J*M`N1q~r{a)_IIK zy~uW2buk^?@=yZYLD}20bk-Bq7K^u4l~?aSXdext$cPUvm+Y&3D=|v|_^1`t!?Ko# z!jwEML*i5Kr=jT?$Q)$uROnMX;$bzXjlb|+gzGQ zyVK8*6beN)X8tOD;ke3HKKIFXr7uV>eJj#&b0Zh^Y-A8`GMUj7B$8P2HefFvHyF~T z943#``vxk%mA@F9k-hV==|P>sAE0d8jEdN^-Sba?R)oVk$g_8A;GLP2(%tkw?!oV! ze@*s5{*kEix4rtUJ$vq7=P##zv>Tip>rkG#H@~{qVv*D5tmhZ(;+wfVth`AYJTgh8 z9h<^*9$e9J(EcpkVa%~L3Mg2q2oYkfA_V1uayfzZn9E1Pn2}p4Z}6fZ*i`FdoEjD~ z@CMR;(BHL#hMsz+({ zK>s3wI!D;Bc(Im6?7yLCSSQVu^nmfM+e}B0CHuaLKSDHM_d^rRW1@`@Mrhs)W;%0s3E!L{3JO{C@X@_GYtm=@-dszGM7 zG4s4;Hqw4k5M4*_%eBN>he#dwE2l4f<3K-Pd zhJ8)rom2e-L#Zp4>3f%3o&Z|!cn=7C3q})OIs|g&g2*O^$Q|$K@a4I^;NVp}9g_=M z)blD-%zsqGpkX+JnM7XYT}{CUo)O^X*uR@UFk`QK)!69kBvTcJT$-8FmP3pzDT zZ#+k(gM+=5uV?0Daa)kjE?~2y$q^gq8W0 zP~a|NSc0FFLPUxBp<}S{_CFY_UtrUfTm@=^QIcIs7Jiwi1T9XlQ}p96y!SRy^$zzD z_18mQ=}L&&73Y$?k58~#q_`ZQAAhO46#msUl+ew)0%%lKquMYh0S#*YdcO zy0TU~x4*9Kd&P*PuUy^DXcBSFY;taIYCM);X<;D-amQ-69J(AM6O=(iGzTv;r}qf4|8i!O;E_==v)n~7K(6#a>DvsPT2zA<4%10(%%^XY2T zFVoN&$CYoi4IrU!4IkP2qabM0P;6Zy#bvLgzG7l$ z62Dx5khGF&B%orr>x3(s&Xnk*&B9nr*_&L9eU6)s9c|TIDA6z&zJ7ZgA%3MnF#V{b z2-*PkqRF^lP;juODY#Oh+jR^onMm7 z)u-<`*6+zAS%x{9-IG1j!zQ)VpF2KY*C5%QzWj8-(WlHU+bj{4Z@TMBk~uk%bNKpx z<_y(+A+Q&A(&@taK*tEYq~Ng7B+LV(zdoP&95S2Bj@0PUB^|F;JEL)w{f06O56kFM zH0ZCKm2G@UnO<;e_@*P8j>n-@8v!PE^5gYJ?pW9Gy3VdQ#feo0auUPb9GesZ?V_zJ@2Etj+e;0t`o}ub$r3*M8AN$gLU4#eQ+W{UTH! zon`9A()e7%wnwWd$MjiG-N2Q2BUI4>KYpypu%p@3)c;!xKi-4b{k2nEL;bGMhSj?B zjYr5qUfIsDjH4k4jkD1ME5|tm3*3DkOurKs9KZKO5B+J^6)|tC2Noil-0a41I{$9Q zu+=j5+})#)T0;Jtx_2|#u;Ao+@)`xxj<3Wi>8k_h9%&_%WEOnM_>6j8Y<=EK@lbPr z#dP)6>=#%In+H`Iq56aN==|LBa-aGm=dJ3(x?*$RNOh&}f7MXTfnc~2nX4~zQA<6Y zMv^mFU+Qi#?6O7@*ZqbVkLMhHNS-pkpd@l36qTvIh@0j%Z#-oo?ws`zLjmn7C(%-~ zmy(L>mAFFV$RfCkhvYX8$q=qlCYH+yvgM_o>DN9>(ByD9)|^+If09SuxlCvrDO%+= zt8^E=M!)#x9TzFrh?Y=39&6yAAo79Md^7a<_`!p=KCU=|fpd+xZkN>|zC(zv+=JHb z$nk8OPlO5C3Xc_S-6?zHnjC#1W(_h9HYjP4IkyaCXu$GG_lmVI7P#MB8K_DbKglAO zhq3OQL^X`Td>_8OT@U;++X{cW8TkNoy+(7M$dGvgu%-yHo~RG z#IAck%G6&U(Q*Hq6LWx_FD7+joNsjrhjO!BYZS5|d>n5+p$p9wr#9SVTzLh*tFOn@ zLg;EE^XSWr63#2W8=bvP@_r4706dU5uQhsaEGOl?&I)P%gj!v7$xOh+D>Z?fvw89r zpU0+SYC@kEwQ{Qz_W*M~8V0=ScDmh`2081|y7cn055*%Q&po@5Hr8d0{b6#|zL%8k zj_m52=1Y$^Ka0%0^lid-0g8b=Ab~+V?8fXquOBl!pbrGt7@SEgfYVioM0;*JXCR|U zsx*DnfluaB!q77ndo~lJlT*{#j5dAkwCQYoVa4LzuHh;LEjo=9Kp`&h(BFM{&k=`h z$_tSM4{&$mSJWUx!z*{S$er%DSlt_$-eu3VO^`j+!_&j)H;bzKjI%UC1t{<~#` zPP?3xbRrU&akX1hH_vF@ZTheevvW}H*$?i!{vUI19Tnvk{|gT)qM~Aw3MwihB~l_W zs0bp`3Jx_#=^VPtL>&o5X&8}~QaT1krCVBJ7#O-4ddPP_gK+em^WL@IwcdO0&&5B& z6MKL2^R4|zB_D_1vzPz&j&@n6yZxTX`)3^CPQ*4>jAJ>L+LYe&)ako@`>XHnXMZ(H znEr7q%jNQ===`SR-3h4}mDUR`^#vT`n3X+L6272=BxM)rbiCcrnzvT(wT0F5ZlB%O zfQ|IozZPn?VA0XM-eHEf&&}`HPYjxyC~$1!#e7$~D8^NVa2qWl?SJLX{l+(gy>J$x zC>pVxwzhX8;V_mSy%7|cr_`Cs(`Mt)x3FGjqB)pKsNghj7HOVw6e@5`jqVyYR#%uE zi$AVDdSg6GSgnJkv=IJs2kg2Ta0Ep*9VYHH`%l~x?8J@^zTB`&_jph*3CGT?$}e+@ zq%sO$$H|kYmzSijUl2mGskFv)cdNm_WAQwd+(iM$LjzxPS96*kD;&ZX4@q_f-_4(E zjx;(_;(Y=kj=-|aGVlp(Bs$yUJX~4bGuP(Z@GHi}&tI9P@@rL0v^T}~2UK;ua-gSs zdM$>o?U&@OuQWYHW!~@ll%S%s?)#=RY-~TWK|e2wH?1js$q1g665y1bz|E27pczSu z&ej~roKUc@OeVDYdZv%w5p=Rm%I3NM*{b*5h@am&>1|ZbXk-OTEVpxi5M7Q>$cG!=jgJE!PK2%!TR7Wpi z-J$&H-qy5le#dKP_{cHo*%ib`cWy3Q-7A`DFQPef(XEy^|G|wUR_0f4iu{C8FeHgO z&)ZjBjW8IVVzh1k+1b!4;wjkK+Cu?WU?3OHcMjW&U(G2yj`^vCzi4XweSHwu%go*>Nig zCO1D^43$>%S$>qtW8R^uZOGl+dKY!#jxnuS&L zaz;H6bNco3ZpQOzLAs8G^JceN{7)CKI{mdVTc3j?J#Xn{Kz3zV^)7Uxa#FEa&kZs< zsJ3AT8|JOjMKd%vYsFn47izANAqy+4-<3ooI#x`+bNHDBY2rKf3|X8Te5MwcHr&QH zvG``_IUN#Tse>-}71#(5;*LC`t51@OJL8_~QMl+_^NLZWYNUC?Ep$&P{Rbri>r&so z_Yp=PB}25bEJ#ZQ5$uGq-E`|c*_{jB9t9?C{---ZQ6PJ;FWNIX{EWOOJ?zkHrmX@&ke- zVrI7s@LkGka9jP@$O=AJrE%N4q&$qpBvZU@Iw{ikT>X9(-&E`RpKaQ+b6(-;r)jxG zk{5XsDy(^*n%{PmoQ8yYknnUiva5gfd*cXZ`e5OF)H$w{uz*sv?^~SgcIVC4>)tU^ zKtvM%XVSBcRJn|*PWrBCC#JL@P*@0l6*?pc;T z=}<9!v}53>c%L3Ivt7La$RRVo@ANoYm(sCN@x+gt)pPOfHIXYDe?e;EVb{vnq}%Zd zVoF0Dk=B#{sz%D=$BmD>+{zZN``$7l0V9cx{p-~nUdrgX63@8#k<$Zqqf-DIQW<@` zE`GmASJXmC=>evK#s0&G5AK6^L^R_R@j`C7c@wWZ*365QV5b5vlU=0;ipK(Oq+A!G zHx+eiqa`FK*30W!WqmHYzdrb>L)=~N%hkxj&oVkoEE5iO6`B@n9Rx9 zv8CL&r7tExrfw-@LKg_L)5}41iwxfvC`O6=wITRaDz3|UXjGn;Up6}Cr1uWk7k&c+ za-u~295yesl+E%PjoYMAl&^_tX1Gr60K?t>{f%$!?7yyb@SA~PspI|!+RU1JLp^(}2dBHuS0XbyCcG3lqZ;h~LhB`+uF#CvLsIMrHp9704zqvwXGVe6Gv zu%|P<^M1vE9QAAF@9wl1-9d)!|A7qt(lc_puhsNPyBhma{{f4E{wt2vCxjLbh=qBv zuB+wGMzQ}!!S5h2(Z;I0MtdK7Q%4-KBDa24?S3aV$a7`notp2L<{&?bg?CLw3u%Oc z&yE=MyQV}xNqOm?V)N`aRWk2{s5gFuzce%k2IwR^vE0|fbNbsIHz$I-p&79KZ`a3R zUpX}Pv+!HhoQxFFki;(hBIr5yVV6?>Yh^G8iFa)2e^u`n(02?fjc-@RL>uM@p)axD z(4;5qrdv`NWP`*6#Hvhy0^(e}>m*s;qsW%rZPN6vAiUZU?@`d*Gn14W3OTEzyI^o_ z5XTnB)4Ozsb4PNs;%$^>l$PdxbcJWhRJS%6k(Lj1o)9t-K8p^L9jWuy>gb`u?Unc? zL`(fAgqHorrkG1}ohlB`bL(0!i_~%Ue1EBv?|Lm!NHu40WS?22M;)1v6*t5Y>6Sj< z4M3hHemd?Yxz#Wt$ON3dp(q@tntktr&oC;`=IT7@k@Vu-woz;691-zX=Y_`jOpoD{ zk?(>OofGHV+-k=220KX;Y}&~<1*GVN;F^$zW$;u)UPr>m_J~4cd(RshHh#Wb7pL{r zg+|pd_`nd?Vro(UTlWkjtsu5wF-QDB5SJq-*H2*+F3!YZ0uq&N*XZ7eVTUbUBVSOF z6cb0Kx;eQ+5aQIMD%Fll4z`b(^@vOTLK-b+@gUZVV0l|weS=9$kpMYNHz zc+87y^vKWp15nhulz4H(mB=OF(SjG`CorSO_;W@|0+h04Mytm33flrpwZaMkX%bGV zcOPDBP}(RH72Q~8AHcPe?5alYHi6w6BUT$Fmi z<=yej!^2hk1Y|~OS>|P!tL7A{Y-CzZ6@++%Xz+f`!pVxM{%WGp`J5Aav4|mKx_EB> zMN^q9mmqg<9b3=ySM~5NL-4P`-ml1x`&&J&^8iG17aFK-6nRaA+i{8!+Hr#1OfE_5 zb%nwX<|}W{347*mc+C3owIbc^tG_>6p2;pnC+$8cIHjsSW?nq7wj%Gj4D0dU?=1;} zSd4r3KDt{UynZU@&kpfe{A~_H5m-HN5@X^cX?_sf84I+`P1>p~#Sc!451>`6{90Y# zzfb85eG*~+U@7P&Cs(x}fQzV&o`(kYX^g_(v*ke)aH&B;NRxgebv-)NFKHytImn|^ zdq_uUzK+xKF1>Jaawab&=cI4;B`=S@oI&K%gfUl5f{KRmuv2bx`RxM54sZEF4R>w5 zPCK#jW&1-O=S?NJX?*i;z(4Y0i5J&yiLJ2=4aJS7 z*2@PMuZ+aJ5%4f9H0y2(s}*0fGBH_sbzI#u^m3^%Lt{1zs(Gq|-z|57*TA52a4fAz z6KA$gG-yQbf*n#M3)c73eX1Z<5~%=eLrb%W_lQIp>66|~zcQpx^Lgxe_u8Xz-dE$t z{J3@b4HvqaaMpD^)M|zr%j*n5>2Yo^!+~je?|63NsET5IC|$OL-(jsWxNu!_I%>B2 zdFXOT>HFnVb0I=0wKA*t@cgLk_rj6x($;J0(TM;(X|Ny=CSk$478mEgG^Pbi_GSv1 z3Qqm4yM;hzmGIv4TtC3KKA$#D$oX5s6p$=RR;FipY%)K3_9aOK}B=t zW^KMn)Qh%>?_eVjJXv)!A%3(zs%wrY9MP_6%-7%zi`rYf|aLFcOeoI1%SRQByAL|clr}8L1c7Z=v{6tCEl=MffT+5f17GdI0*{m5JM=Q& zD!o`F$3(Gx|9B<+TZCKaNnaKEskh|Cb2-QEG_2r((DE0=wBN&ZuZX)>KGV>SO%n$G z&5&?s#qpAn=a^VFPIkn(F7Gz2Qom1Q-wfSQjmbt!nz>}Kge!hyonWcD)Don-9E4e` z$tFMIi2O076X=>U*G3O}S}l%-FWux4e^EOm35ylW`JHJHl+YGOh+jYDfe=4)4MfiU z%4UnkOp7y%b8IZMS$3Vd^3}Pv%`dR(^(An*=Y81+04l4MS5#9oHt)u2R}<&slDT3$ zlQYNc7Oav?1H{xf3~jQ$hf?&kB3qzAE>?d2r#lE5CD1rvuLRQJlTVM%eO;SFh3hG< z*>#c1!>+C7Z4egg3VU1$*dAAEd39bUyC>_}6I?tNo-=asYku&e1{KZ;GSYgmRP}a&}b^Pe0p4TH!C_?tRveWo@Th z8QCxKY$HC+V;*1+2RA=fNFTxtZ`W7Ry?dVpU$fKX85j^^mvx{oL9twxMnq*;aHV43 zg4bvpM3%B$ZQMt<)FmszouFJN{hWK)?imwpBNk%a2lK7InB-=JT!DC z$z^$Ju{ig`H|dr3rtL8z0maZK?V(C{x)tU2WwjinpuRfJq$(f~9$kAm+yDjukx32L zbDz(Om$K&a$L5pWHeMZ{2ots+OkolL8DB@drzZnTYSEl3$hlabJA+0&0T42p#rJI~ zib)`W+vo%WEBIu}gBY)dS+<%g9}c|frvXN{WHbV*41Wo4{RyExdpB3m<(Ye&bvj}- zLFRaE5wMg30-BfS)FrqGTACf};~9z;VZsxP0&!!arlvA}mIz#TUP`($@`3ZldLt5a zJ@U?SuUp9jJ7^2nN_KXUQf&9PKE5+kz?Z6No{K0hAf0Eyot!I+Nbeb;dNL>An{|Vp zQKL45UkCYM!r$7=hg%n=KszwS6pu=xCM}QDe26!)Ydp3pY~0m%J6}0P}j|GUvpNx&#E8L-cEUCrs&4(nFQ@bHN}Y0J-IqWS*{%rIQf` zB)%As?CpFv$3W#}{EKFEPj`89#V8lu_kdtUk6513xhC{n?rLnor0GU2DtUnyk)G=5 zDRK>~h#)^HXU)j|amhB$qmB5bF9xo*NvYXDVW+P{9@(E`hRUp*gf4*eT7U9oP2<$~ z(UW5_+=4e&qYX$VVQ)9izz+Fr#l2UwPd}R}oq>`BRD?u`TGwi;Wa%*!Ce5RTvcI&kiM+F#U7g-v{DT)yHnmhvq51AQD{enW& z)UnigWcgS}6@3mM64wAI;ww$>GMg`1eR31sVP=-1yIiScZnCm$mS)kO9&53(@QDSL zNkf8@U)p!>WDyB$YOB-oZ*O$BUoul)nes52 zZ7g}YTA-MHNivYjY6al?uvcXskToyJB#SwUZ)T5!=_jGB25Rw24 zim6fA347=dMV`OKO}|Jnji!)dzl6G=e0{CP+*pp|M8`r9GTV71(p5L?a%tXbim2_o z0&`kA^KNbH`4*QaXb&5|IU^dF$TN{vG^)@k&v)+ttGPDa!l$G`i9ESwa9}7#Ke*I0Ua0{IH@=;j z9i?@U_3Dg|ZTxM|MJm{)ouibkta7iv(k(nsv6dA?fyKYb%K&JySg#7Tjdx}yu4T35 zk6GDgF_nO{4+_Fq7zWr9M=`g@G+t@dZd8qJa*Yw6K1>?rvYc5@-w8_x$6SD-9VY}Ni+iG4aJnw|`PRP*O)LC$=)^y7kcT=6 zPQ|0sXue5At`(TF(bCZE#=+H^U=>IB>xdlU`L{&bcs)MdUXFypPSH~qUrCf7&D=;l zz1sch2!jgn;~$@Lv#QRG3XvhBBSp{Gij5cH3%~4s6X((DkDu$B?oATQGXp6A?d0Q9 z3ooqcH|mYTqr&MH3m$x)lc0i0aYF`|43|~Vd3pG|(h+f9);)UE5gQ9UBL%x)UQ&>q-UpuXGd+y=O?X_~hYy*j zL@+9h{!aiQ{7VBsbM2Y4frwS=HC}j`>V{hx6Tn+B}7O%*dAR1)lR)YH3m@bcpY7|%oksu+I7aA0C@cvGTKn7=o)GC z{!(nTE$zNY*Qis#pj})>=1UzfFwe2#YN&4R|j#Sh*hSca28ze2Fxp& zf)p;)t2FWRc3&u?sOBwFgyc=nwGW&P9nURAorWt!>LM<#P3(l}hk@rfO3wY<%Mod3 zS}&j^PSziATLSf?xGUslH4v!4z5tWHH|UD*^J?C8)VKgikl(yhn4_^?8TO=&9V(xac#T)A*fMACWNF zUpGOir3>Wfn$tXCu=9`}P`@d4HOoUse$YwJ`f$o1>Z;iR-~|477cdeq#a}|0qom6I z7Z}`^VIC{hq@4-jV{QE7;lPr?fVTzDwV6=wMPLsX#Rr}XrFmT9NcZ)n2NlfgI70l8 zjXnt$PFeIV`YD^YOU;3P9c-B)rmr75FyGp~vPFm;rFM&O05hHE$9M`2HV@H9YA}Js zfu_0sxcKnl&3dHTn;fI6Z$gU`5&z@F}d zjG1gCCj{mGKnXS$8X3c+Z5;>HRm~@+o0d>&Nu_b+OeRpn2@4hPyd@$H& zP-wsI%gyR_6nf(0a6Vlgktf8?O5$P8KbE{rl^5LITGfp!EImiOxi$rG6lBLh#_-7; zetIuv<;A0F6!Q$IApu^&q9_)Jkl|#ZjIC~%=KPZuNm~2j=1yKxUbb9%TJK&Wh23zX z_7Z^@Hsh&{y^6$!aS|u~yyZ_01zVFi2MqniIc#4XI;im<5(NZY|JCm_+!jdd3H5*Q zeYbC3->V1gFd<(a{&xexWfJV3LB8j^BaUq@cHbGa5{M2}H8hAb zms7)QPG7&GO~tWH4FgB#`jVHryz$`1{Vp!gNqqu0Y+8L0?5@AxJ_ARmamgtjOEVzl zr8YV#4jwwaMfoJBayPfhV%~FT&)!IDgB$e5IShAWKx2?b6656y6K`L+M!G&Io6A~W z-Wi7qiC#+}eC`%*lk0rE;_mCnLEQs%7x;V7yb@Z(a)bDO18llv{}$UWcJs4gRzAy% z@ph;GxHZ(0Xg+s(R;z4(I!^;?%sD@U+Q7Z@h`~t<12bCu;VH#^Us))MEXvz`f_3VX z!N}SHtCw4(Jw6reSMUBawvGX{-%y06G>n#K1j}ECXC`uuad3o+$hHy$c$vP1+5T`8 z50oHH1v)vZ!n!H&tb$Bzu@SgX6v55<=KGdVG7Gp)=6G6t*%YbI@=Rd7IM%YV^<+{W zD0x0h4CuBKb|`WMDeDg)nck1HgMEJrxg-xmQiq$Mec1^iyd}cLbEh`ZiaLB49L|5g zRBW)%md&A6sw>y*_f!o}+I2tenmj7~5YRUY5 z5T?I4wzbPY>@jeDX$I5h?wzzPF9`YaJU~=>&zA5&PUmk&U|i(1b~$x<*eMnN>hC>( z#h;d?2ZkP67nKjXjiyB7+)-zd|Ilc|WUUR5Z~J>2RJ9CgO2<$&C#F*Wlr*74yAjZ9 z!Qn3A_I*f__=ug!Yg5WAh!X!W)ryaEuJ!AX@ehGdbONYxiFi zZ!49GzfJFVzi*2RU$%_Aw0-CC3OCYg zv~2RWYykf@4g4ErPke(3RF_M)^a>dJ?^EHkIM>C;st{HX|K)a(s_|<|2YMIP-{-yn zVEyp9Z3_enLy7=vjTH1Am0UbbSGb~W2ija39d}AOLF!w*A!<5$`}HA@BYnifN?Uh@ zF?wDpTS`2gaG}iNOA2vkI@_C-hdE{qF%E^pj#U zg3WUBnQ2jGf2jD+lBHt)GNl8EfyW*}eiuV|AU_G96tI8*1ciN!EBI6JwqFfg&~)Hq z&h0&ML2jiqOY5+}|LcDK@D2Z3Uv)XRu0n5tgo@igq~&}Wn=ikIX$1f!|H1U5eRSoF za3THo0L=9QpSr!E>LG4P9UwUmpKsaQ?MtERw?9z+?@u5lgW3nS)Lyte!s`2Y6;GpM zF`e5aJL?wlKtH9|oh?x@2Nk}-ckc)ObrI;bIJPCm&wuGUMTutk(e*Kk67$V^7hZk* z{YSs~B?o3)ZAQ+(;+Y_NV|@|FS5TmG?B;Jj?+XXE{;r|fy|$hqb#@D`nAcq`7+PS^ z0H6U50G?Cutkrr?)K175PoDw;^asI#!c#!wzxCz@0JM;c-_)BorBf-P?~>I26NrIJ zC|HjoQPmsVMX6`oF7Tl1?cbN#UiRLzWr@L`cb?YBHy;#gTY${dCZU0q9sS@WiQ3DfYuFJ-%UqkNNVk!Zhctf^tb<~tP!ap>DI7_W8c;lsKaPm zIv}9jxlVkQQ8&rCeZ?xMEu&gueCH$vyi@;lH9$h7DuB_X=zP!=0(f=HwcVCp!|De5ccf`O^x#vR5!$7bo8;0=URp#ys zwog}8{>{E6h<%i_=_v#@{@+aT7()JV?F&2td5^P@_ZUFZr`0J$`#jEh{mM~7?!fO@ z9O9w}!{S&*{zG3V7&}72_O{w?I&yLmdifwRQgZNjD+33iC52tU%Cvo4>YsL+_cYyu z%lY*5cMt_h+4eGn(h%6dB9@IYMz;Fg-=y1+=wOD|;1wkK_mC4cyI9kr~ zFE>PC7_g8OhH-(EkKUhd9+D*-WBobmuRAGRe^bhm(R|-B*W^zR1az(!(m6`o(7F++ zqghaM7wQfZQdQNaImGnJKl!=MEdoeUo0Cq$6R)}H+>;A>@JB>Lq2l%ye&jltDTLlt z&B{py;KTacmTUim$B%>gx`V@H=!hU9|5E(>C8*V>QPgUl+}k4bxPn-i^+%Ko%<7|Q zv^AW%hl=7oD~J;T&ACi}2Bb&(UIWBmBJ+BM69#gHfVLG`kPevr?K6!)?7}YmuuF*w zq?43Dte(E~_UgnYLrZF3lYWnsgyAa#PkW2p=<|kD>D-5x20cVCj%?v33Mu&~<6$5P z2T+N!ZF9_8V)d4kSKO1#8xJhM7(4a+0F(|0WBkV!`1T^iZJSR4IDfjSTB-XoxsqI5 zRUJDecM*#Ag!${1K()-gBp0&-B)@<^2H{9qjNrl<3gEo{ai-FM%o3U6Z0<9I)a!*F zkSy+bAEBs-sOvwFDBoP6i$D}|l`|@&tr{Op5Hy1q}5a$ZD+;d*t|L>0NXIi@>Z8kaIO zQkC8D-Phv%yoEgXL>N!*4JdnbzKjV(fiHZ#<>R$Ii|Mvak;YfsX1nMu?45q!J9BJj ze@kbecK7{nq0OiZBG2=+ggG(cuX_Rg zYraLk%I9wEyh@;|I|({=zQ1D=J1I6r57GP&O@tZ+0SxK?95c!cdYkG*O;rs)%hk5e zcm4|60$Y?pO%w(LZ5o@9mty+}LkXm=tt>JIBX4U5;< zbL~pLxftz8Oy8|pd=!)pgKRQ{x;HKRo6@%TjC#GbES8$T;;F;D`1;y4DQJ_1Bcq75 zv~jLYul*3DUN?>FYCTA3D z&x~4oNhbacIUzcPv+_oKJW(v+5^l9lUC6hJB#18jOd*QHVZ1TgvXSjTM1Kz0y)x zNP2qIH)l7AK%T@!dXy!mjeqhlLc#he?%)sto3o`To0%3!nKb)2_P4~xHJFtQk5Tfb zUZA)HgcI0rqgOcxUpc}BBY%$@A>qhKTdRhTU0eN9?mg8gvZH9$xTLTE{IF1-FEaVM$o~Vc2p{&4J+b#cJ zH0kmsq)7lLx^>k*VZoV4eN0}IcokHr{>~g_Sj$(E8RmeWfs7MAEB|4w{S#J@&%dm# zs+%gyz!$JyM%BI*C7xvO$G?6lqWMP@E)4v(b!)o>uq|xBNaS!M3uf}K(cRsctjC0+DMQ*1p+51w&L!Vyyug2_ zfa8d0*0U8NFo6mQnr8o6+LCka)W$-a(vji7ob`qFoFWN@FfpkcL4my|5Hj}r%ocoKa7D|g_tLN2OVf-+rAw@1BmE$_9&Ei@6*1NYpae$D{1i< z>rt+Pi!oCyFjynFBp=kmrpPOYp&G)j*AP>G(ejcH=F;3xJ)F5AiCqSn#!ab7JOw`H zgIdOtpD*NEPyGe)ZeKqrRvJ4+*BqXawb=5o$wdo%8_6`Jwgbz(2&2VhSJ&t{ogJ`K z`+?im0l9a=+VCD=)oFG>2^`>SoRqf1y_V4U!IO@w*0*uPo&$8joWNj!Y$p&TkU9QH zDP^o1l15hrJHiDArG-)r6HcRLV*v0H4$^gq3M^fGU&OJQm8X!!m5uEYu)tDZDd-2Z zyWCMwQw_RmfDJR*^6m75BTgsg7D{hb_uSnmNO69tW-nTP0 z68TOcb0P;}{t>$E_pE{TP=wcw5f3u5^mNjoJPP9C;OO(B{63`UB&I%mc+JH9$RK%o zze6C~A9KIRVE~AD!a5!U7wy^|^e)J36_0c2xpuyu3RZErZMG~|l5Z&nREwrWvi|1W z%wk7MrJyd$F;pF*FLfY#fkp_8$+B8Z$|xHcXIF4* z^8vf^2U2kE3n?h2fb|6`Sh|{aJxkv*w&$o28udHLQ1lo%sAL&7ReKU{R=#4!;0K}$ zeIi(~vSJAVlDe;sj4&^5YYEirvDwE;?*hJ*4bnS(b>=>F3DSU@qUbi&rH{3m7t+*O z!H5$zSjRJ)GetvFvOQFU2QXNA$vl=nwVqb;^xx6}8hRfo_gFnUW=g-&@E>o$3Fds= zS*Q2Ni(-sB5UbA-Wmv(%1E-wa7QK#Dy<93_JNbyl%^Ohe$S=xCi!!aiS2TO5hQ4eH z((wUq-LOy@bdL{bUklk(f3qkgMJZRqr27A3RiOOl$X#C@k#&h2&0H=Z$f^oTFRB+f zh*R!vyI7}B?uMO`-y-9H{&?CSZ|mijbgpdm1qKo-?m)!bn6st@?H>DKQh~XVB4zW= z-#Dr&f71MM7g!@3GlqM2=?(fKSE+pi(yR3fJkwrNmtZgi(WRTQZHO9^fLP@Kzni_k zsmqjc9x71%JO$AcCavhlTHXd(e9JxM2{vcXeeVzWGc4TB4|d=(8y{_s$%L?oc)1dFS~Bwm?*kN_JIy?l9T++39cFB6Att zHuBPKraTK>Zabk~0iY@8yQ3tESZ&H$ZE`*C!(tiFIRHRaqM%7Wab#F@+)%{o@a?9L z*!1x4GPs3H0^#L5C`zo6obL3i+zEA|fFowYa}7z`VUpC{3mkfElS)g`DlB^l2^&kV zh3~904J<5l^o}Y!-W+J2P#6p?rkx+is>kZ2btzA3hR3I=2L^ySyD!QXqw~jQXp3oC zkRr@!HT;3ixJmOL7>!OD@zbz(EA6IR0}A-a z|HWwU@=QR^e%JK#v-Twk;qaOh3F!cNPl|N;v;AOw?rU>qz0G}FNkU7f24_-+4`MQw zN-}PiiO{k$wVj#o)x=uLwG_N5-N<3LYGb`_A#3K(&H93eVzI7*qVFfpj@9w!h>l}I zeMS@h_?vGch~cF)(g%nr=j6sE>l@CBiq6h+kvD$;!K7ON2DzyCgVuVkQ4@M>2oB$f ze}7a4#VBw$hg5gC>g~q;d31yrSIpFDuRSlV>EVS=s}_Bh?}}Jn>>AKFpNikhX3_v2 zIM6r6DDR+|iVxK`mL4iQU-{F0Dqg|Q3=AKBFHxNBNVz#L2CzT8^`Jm8e#oQBEg7zhZs(PyF1&c;jD8&%YF(Dl@AtMrKZWm~2$S&fv=&vJ3RRt!N3 zN4$!9Vj8%%>gOsf2PCVPp^v+0a>A!7qm#6f)wsB;H$MFJT7CT9-<-e|blVVGVM z&PAN$B3N|nl&F{gn0t3S1st$Qf^6Op(Zd}iI=?H`65;Z{ITFwsCCRIs~3?+9JF2)qYnu;~w9#iyHSUEMaS*AI2n#V6<{RJqd=_#e62RODrF znt54Kh|6?QfoN~sjum|m?*tS02}j6X~Y z|GpSNmv7ymRryRVhZkj20PiqOU1&WCWLZGWQT^xhVw}TlEzNlaQ_SU90Ul~uPbthLhPRo260jV&2qJ41~ijjQHs zB?7f1JxZV?0b(+oP96KW98tA)LddWt<@pRJ$XnhlI7g*)P^Ya;g~K+7E>$V4v@;d| zNz!GsU$`=^5v~makP&A0k3$=4wVSdtUG27Z(?tKyL2ag@gtPdZNscudzcupshqhsG5n zf9BJW4?fdwJ{e?QMM*{28S`7D|)rso_QI~y)C6^+3w6Z*xYXEQEZn(j< zl3!1h5302z@B7;;rriRW-wp8{Do&Oyg{O~ zW!#n28F&r_2EIANH1CUPyN*0(XyxNgZZ_%&&i|OG_iRD|J^MDzO?Pdq?0W38vcysK z<-x4_7~v%01i^=r#^ve}Q+}mmTyut8@umg(=DGNv_w30FahA9p%tggtM}W{GWJ^R| zv*OohF^+A>Nv!SsxuD?aKF3M@I~QOD+?B-RAVv*#LUx0Qpt)EZRi6(upEpCNbdE^k zW!D=R#~U1R2l?&3%Xsxs5HuB-tG81H6=+_XFP}s{+Ox*<82Ez*qu*=;6yt;f4`?F^ z>PK#e7q5slVhu@#KND^axftvIT*?o1*I*tYua^jzuHwHu4t!!}?e?J0o0GN$)O?04 z=webXi7T0%6+$b4Z-1}HOn%B1P^do^$b@j4VcXptQ&fEd1BRCFy@!{H)5C+Wd|7)$ zgKZZvsLHSAZR%{lWS9Vk(oUJDbD-NmJg$Q2mv$yj-mu63L0|V;!gOaDe)w{adR;e= z0bHuv{be&oXxQY`X+q@kVNnBtPdeQD4{RgRw;({j2<*%-FgJ~kH^klVxO6ae9^L^E zspo`}ozi98Hw2LsYgpF}Naa^?KW&T|?G0*$s>Y7tXPZ?hjvWSmS2Nr^?`v;Z;;13sWel-SAU zeAc$W5~qW*(wThk*_9y&CdLl2>XW`&PKalZNL^=?kl_1tGHOk2=|%c^3+KN51KD3b zJ0zvY1-*}iLg|?i_5IIf{%D0Zuv0ji*#YmwVtNtZU6rT zYMnz1S5GBX2sfe23Br>yBL$C=kG$m8#r2*>w`sI$TDoLcFz!HcH!qw%m&}2d-R-fG zpVQYFyv;6sBtLTvS%mgZN2jT2PLt-xqd zU=qTuu3~w2^;LFtVa^;Db#>;k7`(EUabA?g$8Ie!#@DQn=`bgpL!T5Mr}dsjwY8b8 zxl6i7KmtO4f)p%q1x;8RO|}Lg;*y8<{dcZY&llTxS?iNY{vUwi7)9W1%cn#aPW>#7 zRm;ZZo|(`AqSCE&6d!OIUJzB`0CDO*^m26~S=1CKk5KIxhrb#&kc&tKVz z$nHo!Ke7;a70)KmE*1b<4C8!wE-!oo&0p>s62Jl`3%_Ri#HO0&bF#BY|K$Z}SgWwT zMPngo{R96a{2szJN&SsPxD19fj+xq9>t*3vm(kZ zMYTv;XP*Jpy} zuB_+w`L5-lBJ@tOr%?`{0Sio5Hu8Kp!~#YRL3l`VBn<|Y zlV}`P0!otvicgqko$UcWt;ly>Pqre`;f8=kn+T`notHCyfu$%e-ln$ZK#*T}LumxR zU_?q(D+A|13fsqspZd16_r?mceeu1{aR8)9R?AHBC-o9pIU=p9r_IK?yK}Wx4$dyt zAAv%^_Bb@0-`R2y@1ou9k0BH}q}+EMs%v3E!fif-`2wk1`&qC4RaXpEwf*G*+V59R zx}+(odtW;&UP14E?k9v+_x*%tQ-h|c*5;veX?V^1P2)c=<)s&WmLZhn%D3y2T~o4M z;SK3d?&L5qsNUT=>n>E1Rx6LEI=yXMpnmKfGP+c<7iy|H~gb_QL47R@GZ=e4qU)7e&sb$8XH{`G`Dwuv20rI=uItnJhF z11rU%wjG}HTwe}~lb&`vk>~TE8M)IS3LJ0ESSn8WzRDTmM{6zs3QWHe07S$p$agRm z6KCmh7jftv`5F%Q?qK<*z?v3t>1j4MmXK#Q@@IPYM-Md`2nf86Jl;l_F0N@ZT5Pa2 zvIjIaEMm#=Dc~>Gi2iHTPhf+CYUl(rQgi@QW8_ks6{Krx0XIN_lJS=?Yf^{-sY-rg z-Cd1J3Zd>sknpoZSXmNSXmwU&TRty?dNc{qGZf|sBHhF2X7JB3gKd?uZ0oH5kVuvyGSLZJ<<6&BD^{hW}vQi{fLp7 z&fMCRKBENE)&f_Pu>`6I`jL|Io?+j|fvhZxb%Ua|w+~~&s)loIt?T=vBrxp!^+|=h zw~9wd?v$D>Yn>wjjo)ZgJ_ujLMc3gz33<7t0=-%+4e{F zc^ab#@}u0geHA>eK>CW!>tREwq*>>q;vfN)QsCV~9Gpu;q zkCrs4OrI=6vE;m4B8gnZFKeAx+_3q;*1DpRY)r_M%LPMcw<*;r)}IQLTpFdv1Y{vk zVQ&Z3-YxnfHk8_);_gjek~(vxCCf#dH-CUK8N7cc4?OsN5C&U1Lw6}hTs@JOX+hto z+Ty(sK5Z(4cfCZvI5=uqplfp^>0wqfGEJmtxe81mZ3$eR9()aZoORm;f&GHnJSkx{ z#gedtXCH&98u`UxFlbr9$)a*s?79z=Sq|$hbDmFv&ubW3L@scRC$dGQT+)jv`mBPA ziMm6G;WpAwX}#N|YWrjDmPN4?w7xrU=YGUY=Y!?+w{!N*->|A5Z=cZ0ev#!_%UnnT zjy49j2X_52H|x)oh;okwXh=w$ep^_$gb8NnNjJj=993X@UW0kGJGXa&$}5; zLJ}fVji9WBO#&yCl=@VCfByb`>odrmg_-jRi?k7!h-IfRw1fxR)`KI1#*38$LE=PnHHU`>)&a2SQN~w7m`5OO-n{y@UntTv)RxW z8cEbMn(d(3Jbek|mq25;7x%~T7gJ)*%qMtMk(8m)Pg_HyzHVS>wCh7^v>|B)cpd?b zTkW3_3KO!-3}!9#!hGO7oK515Jk-X1!P=~U*7xc@++`-;s86c=xwcl<7BqLKI<3CN zabR=e>89vs>uB;23?-NxwDEk$9-4Hgzj7i=JsbAXZCO;1RfD~Vnbs$DzG^}A zLFTICQ7L2KX&}XY0-e3F1yn(q4|YZlq@utird8%Gcd{#B$}`PRmR+&W#zm{%5;Y|( zHqJ5?bPBs=#0m3(*6OG)&a*Z=Xu3^}vNRwqXHJ<`M4m_UVYCBr-x?K-#^hb%z`l?{ zuCX54!Zo2S>jeaZ$!Pnrnro!AwQ?Ks)OoKTAaaPj4*GLI6%C9{Y^4!lF93XpcY)Ez zgMGI}1{36TBkmQ%B{3IhwcXw6*qNmzhCp@)r0CvFm?C_t=EeW(Fs-hdf&tuns3n!6 zBdpLEpw9sJ3(tGCXeqgoaEZKn6W`7gw^9(#BCGq&DpgR8!nSo93%X{Kjma z>PS7U6x7xP@u3(Rd*232`XCtzf#U)|up#0w zne60HwUilB(Da=D2GV(bFBk_pwF&?L9vaw`vV*F3n?hYn#2JI5PrM(wf@owU2N$|H z{*H9~22K0SB1i;)3|1;)!M5!CPAhQ!3}jEUp;6_nJj)hI*;YS-*;Oc^4+_bjwd#pl zo&UH9%tBD|$e1;o@6#%60NzTaPA&4Rj?pN*Y!$Yv{&qvQh+NCLU0S3pE)i63ynTTl z0!j4Z20j@=LZD5jKU7zHxhYY}J$F&huKHtnl5F>a|6C3o)V4_Jr1HAen7*_*Bjo># zoAn1CZV_d3`?)2P>q=F`lsNlZ;m&l*fWoG1HjyY&29z9HKMZ!5G86zA779;5bpr?^ z?9l1$r;mc-Bjr4X|F|Uvl*ByW7(;__py&Wz0DEx=3T*%&kUBdL#=vfUJOGu;VERB+ zV5hEci{>v9odEBJouM>~QzWg>MZppp<)qL6dZzTA&BiLARhyI6|MjrBwW4Q#j49zn zZ-O!@tU^&@D{TZ-lIPgnOS{J!apphU3lX3u(_}iAix9YC}U-CcdH$QV@ z`$3)sq}qSm4p``^J=^u~-7uKduWnWF2iT!qe{ke~;%}Y;03SZn5&)WG{;~E$MI&Gb z$A3vKY!!TQl=@a``d5Z4u7$=a+Bv!QNeQE7&hp6x$w}%u?c7w-kIZ-NtGTW`BXy3d z`BvGB8%K6L+9i~%-*&F|G;O~E>vQpEUeYhd4`@9Ox^(f`_bN+etP6?%>%$#Xm*rZz znug})=0-*$@3<6=G@GiEP_X|X2R7i(kngmY6ycOJ~q<;^#8Ygegrlf z`=eBT8e9g0g-QcrI7gv_dcb8cnBYtB#F^{c3;O4a%ZsM)i{eWuHA*{SSI+*ug7xJR zIv!-fssE|#-XfS1+JPj?=011$%=SM-zmBIv^By5gW41{H?|L!Yx>c)^$l!;A);_BSuNVHVZ!+A zEC*<=_)Vo!1C*8yuiUy6V+74(r*8F{_jV=A}R%<)HAgQjGy~jD%V( z7WsHm7df3J{hya?bj^j-V?;~{U3rCKjxsC9P}1#r0{Mr1WVHl5U+sXw_Fw<)fg8>Y`Pli=xXT_WrW6`{ z6K7L?XPQglBJP8HiW}e)90c3mp(>Fx4Y~6`jJ@dNx1_p15xp@nNaHax#38MYTj*40;JC= zvtPAsGLp1!Wb$K>Jmmh`k_&pX_K)r5wLu!x|88qfn=1WJ4cd~#|5n{Q1*RPcjQBtG z|1HxjPSCI`_@8RGwU7V(ivPb}c1;1fqfbdva+~$P%o(+#+u9S)`EUPI*WH!7P^RbS ziW-ckf}ME#w`*|ha$Vtnrgs^B0M_IGzsHjPuL-&>c;K>soAC6(-WJ)yv4nq+)fxMf z3X;by(_W4~39A5KiumOw{_p+ygO0XmdAeHtl4;bB%0oAisa&X~_!^wG;8$~zPO86x ze^J;gd%8s{DBPt?gKd?tu`pBgWWUPXK>i$Ul2J{;xmgsOcPZuirS0pjzRRY%4}U?f z%?z*}tXA^O8gk#Tbr>W_9z?fWX7BtuJ@U)FTSO@jyDdAS8oh?)gUC64#SgQ?CSaG` zemPAktqaGlV#xR~K`F5iF~frPgRtWGUp_JO*+Vh%iinAq!)3=Bhm4c3=SsiaqcQEX z>qEHpbp_@R5j7Fl3|COB?sFVLO3uWO8IBS5rgQxHCw=rK%Qd~h^9;6M^`q2`qf@r9 zeLYN;4R7C?h|BL6;Nx5BU@;4nVT3Ll&WA48w}MA%LuYs)VjrG?EqV>f?h5IJeTGYNN@Os+z_m-v}{eft$ME5y*F7Oj5pr9b5*Ir&L$4 zB#O?q1YTx5hTItqcaUZi@C@7m%RH}xbx3yy`|)F&U2o%EpNVXe%p1y7I>&eQBg;!; z@s3dP9W!b}G1xnZhc;cMD4iyLhpPXly=(tVGTYwHbjmZ8Ih`q)N~JT7Lyo0onVAVS z-Lz6GQ%XfDH8U@SH&kww%~+aJnVESZ^Ojf2d!Seu;w3dT@d_l~ML@g&3c`7@X__;i z`Thal&*%8-2Hv&zUh7%wdDiybRS7ibcVr$A7S|2}d#0+!!nEGokJvZ&xL27F-Y~E* z@wjK~<1KB1Lw}u5xR5ufL-(+AYh*fA@d50fFe;BX75*`&WatbiN9BL|t?1=c(D0^v ze`7-;>zUEw3rb?^!nu_i?;o%HwT1oV2Z*%!>tx0JH*LPL)roEow^ZNenb;%w2U_Zzn!WGDCT>98PImd*}pMsru7X zTzWk=iQFSZ=8Tai3 zJ4x$ljccqkeh?(bVOeSXOAo-T{k~M}xK_SN_0@)Fry^a^oF0BaRVd$M(@xlh-W0V_ zOa!jj9VZ^_ZtoPw>lD^2KJOK>x{AEwG9-uzpvZX11&Qo*wPnb;_XgYwNs8Dv@sdiT zAy$j8L#g`Mf3SQi;UU>lBFwVzB#e~qR2vsZlMPX2LpNme_*mS?l4+T#AMDGufpvs9 zZ{@YVBpk$H7eAabzQhFyKT^Yf6TXPe_jWUzYLp^?>uwd^(3v+Ma=l<1VFWo7=3X|M zcignUI0zvj-6+ol(54{>1g3z%UhPlUH<(W+!47|=;o=M|JW=Jb?4>j$<9lOfwSgv<%wD z@zkobG)Q$g*M@O;mXT+@*XD3x&2s~H;ZGZK@ug2dALG4~%T1Alk#41Nf6j@1?EG*w z9AUmr?%ll5cJrG>L*?xZ3%^RknWKkjZE7zqj-j|2(al%@S9+Fna!fI2Y`p~72IhSg zAezjT;JjnHr0AQBhbJl{m<6_s?8|RDX~e~2(rxhz)C^k$siqj~TvdCMS07g>KJe3n z$60nI4Vm+mj>#p0sksGJINe{BoR# z6gwHLkIIu}-Q`g&hVc{nvE|b4x<+FjSpmGEb+p;atraf}YI4|8Of4z>L)gIejsj-5|t*gK{9l@(SS{RKb>%_7&rypD-1=sR?4fW~dpQP+yA_9LV? ziJEsdpg~|H2k9Zvai;;p?=B2K5p>5wfYsp;onWq}ux8t=&#UF5EFyzD>_ zY*reeH*~qQZ2f2|!rg!_P3G#3^^A9rlXrN0l&vc9KAOBDPIYBss4?k z>=?~y&qYC3BKK+t_sy@>7VI;_JsWmL^J~ag-yH8kz%A+01wK3#7g%c4n?7Np3EJj@ zZ8U1Q(B)=nJ;Ss~R+n)@l`$3W`!x0^BoQ$TJt@aM$Ps{pH(=}ppB@sxo!Af`+P@II zXgz3#mPn{p`(9N0N>XW>i*CypF{s(3?G^mnwKQyjXnNoY#5pt7&#v~7Aof@x2wA{D zj`4Z&@_=J$Rt`V8|VejOad|hYM#&0fJ zZO0iy$YjMM`M?9C>I$~=a1RBSrHBt+9M2IUtM+Vwg*9z+ZP}AiWz<{9(Mu#uK6nQ< z@c*nPgvH2MBd(-dGdUtfN6#v6xc@dF8OfPxd#R|@Gm~009xRj*;{nVlHFYq0s!vukT{!XSwY;|{E_A z(>oPOQw_luZBL)13t%+@YZ2CA*r}Eg8tCBQ&*kTFp&lk_K*G~?L|ANAkoak;6xPY_{?=H?R`ns z)`;Wx^>!mR5Q})Xol*v@gW~1RDUo?6-p zj1_ik!78!7{r1WL2M0UE@o3N+B7gj=gFG~Cl@hsT_k zBMs|FDXT-dn@men_tsili$BI;rI`)|Bk2=3G$AL|&ndP!bcJ{MvV&((>Ceqm$qp0K z5bt+mh?m9fq-+Puxk_zbRHC~}_)SoeY2l%o=^H^iRV&}GQ9~zCxyfU~LiTBF|IwnT z8vR-i3C{L`+a=59Z`Z16v9_{PGivwIv#0XbUZ{`?7MZsO-w zB!-6EP3LlVctB z-{X77#%`k6VNI;plyxQ*-Q(ha2aA_&Qsgz#D!)DfSBd%Sx#mpA$evJf5-fGYv)4T> zPoA10W+M&5niqTGT5k$?Ognv$0=D{wVw+=<0hi!86|cK9;6yjY^G8{QRrtnf*6#XW zE*Q61S>-k%spHw45dMmYVV0|fbJbB_JHBcJHNmc~au`AWqxbb%Aei(34HC87xZD)1 zJkHFgTjm_@y*>yHcDt*yxxPucnKCoV#tEis4iuf;mpOL)0glgI9 zn)OTij1(I&F-G?fM4LYX1DC9#`_s9S;8u~G6}Vx~o>45`byO(qqk6c`pA>&Auhir^ z_ip5RwF)iqnkVut)AS37X5#Z0#rV(mTlKf5y}R~ZKK>aMsf)lFZ>;lU`l0Rvj&Bv# zZ0(^;ynzwFR@H8ffUcPLKH+sk0guRP%ZXj1Ot?c>xm*?J4UN@2Rd%wwk0UAfQ1QC8 zak6DZ^lY0goQ`R@&(Yd+rI*-+(6&o+qui-uUTvn<;14_!`|AfkfWEm|tbV{vb~ktq#6AGZJM=y*y=pMSo#7 zM@m7$rs!?wi)-6SsrTpM*Fv9ss!)(_8JAj~(qTo9V2AY_Y*xYhzs;nt4!L*uIO6Qu zD}pAq_*D;rd`QNy0ZHi{ME_O2(Yn1fspP$yG2NN+GYt_B_hpO-O|)9<2**8`__pj> zk^7HQeBdhzI#{~+)V6ev{;~m2Q{`3#)(#ax__~dLnr6Fz*aIlUeZ{MY5h_2T!au(l zK$&f$DLWrX1K44#bCiO!r$VHcf9#?1s!DdMe)t5KYKj>ljxzj!nnwgO7zcoohS(M* zs;>ZV$P9oA4>Ffql20OVcTubxEcdJ5UR&z~a4f;6l53zxze{+W7E_@zrvsv_mB}y! zW1TeF0prXJwO57`pXJEYd1X`L^HO}*RwJ!CtPZNG_d9K2B_-@;Wn9fA3>zp6_h+l2 zk$vNwEkap83ggPzBIk&K@;>L(z{Zo&vO}daGZvh);Wr@^>d!sFU8Sv;l!u=zWvuBQ z27Iesyvuedo54kk1P7>1CsCyDu81r1ENp!Cq;nQ8^$(#B(4laAko{dz*Kgqd)Ol^+ zE$7Pfc*y$z^|C0%vVSLZgy|?u06(XE(sCId;OZcx^?o&t-1(*iFLg@bGms_nhUt&y zw0JzP9mmA4mpiyET)eVfI82EcdliH3bgvRmT&J5rsf!oe8C_Nnde(RraeldwT)xf7 z)F5a|DaY1GtBa4)r+)24u_9hC*GA&d&30{wpGn^elI{=za%=WEh0Ra$2J=5^W_q9j zhJ5XTSN@TZf>!0Ouk*SX71KabueLAI-RiS_)n{)xxJY=LBOOePb;hJQ7FjFgR9PZ{ zV{Y_P+I=#zwPupqzoM=;_{bG23InF!C`(!6r~A`?a@_LWEW zRiHLl6j5)HcNb36u@(VaQM~}`9MO*d3(5WAHF(tmU(JDwr&t0kEY7vkvEOY9s>XR2-X5wzu12q%z;(xQA_i)QbQ5Q!OB2DYcutX4fwT@i+6#^$v zd(0}=pyoTLJ)i;ouQkDwc-g=)5>6a5d<;K-8$vG)^*5tqIiRkKf_#I@4dib<&2|{yI+EvjC9L=F66S zVw?N=Fi5?`!ANcB+{vy?x`kWyLVCN*u_^S#u_HxBMGC^)LB?xQUByv5&RS8;AT7%} z{x$G^XLUfkupXxJAI4gm&%c-(Qp^Kw7w7Py;->qBt?XdOVcDvt#KdS>lSw|cNhG4? ztNala&Zc*k85~mcwowy$%`G@{*|yw~5V2D;_C<>@|E1j2!xSW4@7vtvrkQ>5x$0l? z*P^p!WvuiSX~euBhr-C3%xM>;dJ2Wz_QFs8wIrjIv$mx;MwDIUje(qtCKnTlxzqKt zf zWLhJ!3**=de?ES;txgv=bZ^_}!!>1o?{brCYWB`V9g+VoXdij^Elq~t=je0=iCo*V z@?3^LIa>S6u73$4?ZniDxLcot{E#Xhm4oGwa2`Khl&~b zEpk_RJCrZy@XBQFlySN9Gcl(yl8b)D%FE~s7qLE=%V~KWTAAp%xr5b==rLlKlP9 zA6xa+`7fOlps64fS^lkETgu}#*DQ4#z9_xwBNOj+ptCha%HbKdwdR_@v+j67vs6J! zN+QblZ2fD?q!sZ(7JZJZoLfcw_`Dy-j~x67XYe;2oX{O!bx(gukFPcJnrM$D1+*xz z%mK5dX{)90r6wtGL`JP!EwvOiG;GvL;L_0r4UN;k>uSL9jce=v_woO&%>Q>MXnmgj zp$#~na`V>bzj{|=b*J~FR)NjGRMiH5oLc$8thkL4^Z8S^Zr$+<7JnK1!C(`j>dRn# iJ&;?zjG7hCs}RSYGjeuCL;<0rVSCvAP|+{vZ~O<(0>Tae diff --git a/Transferência Ginseng/workflow/.resources/Solicitação de transferência.processimage.svg b/Transferência Ginseng/workflow/.resources/Solicitação de transferência.processimage.svg index 727409a..9b9ba8f 100644 --- a/Transferência Ginseng/workflow/.resources/Solicitação de transferência.processimage.svg +++ b/Transferência Ginseng/workflow/.resources/Solicitação de transferência.processimage.svg @@ -1,2 +1,2 @@ -MotoristaAnalista de suprimentosLogisticaGerente de lojaSolicitação de TransferênciaValidarLojaAprovarTransferênciaEmitir NFEde TransfReceberProdutosVerificarproblemaColetarProdutoValidarprodutoEntregarProdutoConsultarEntradaVerificarproblema delançamentoGestor IdentificadoLoja sem GestorAprovarReprovarReprovarCancelarValidar produtosrecebidosEnviar para coletaFinalizar +MotoristaAnalista de suprimentosLogisticaGerente de lojaSolicitação de TransferênciaValidarLojaAprovarTransferênciaEmitir NFEde TransfReceberProdutosVerificarproblemaColetarProdutoValidarprodutoEntregarProdutoConsultarEntradaVerificarproblema delançamentoValidarrotaGestor IdentificadoLoja sem GestorAjuste de transferênciaAprovarConfirmar recebimentoReprovarReprovarCancelarValidar produtosrecebidosFinalizarEntregar produtoEnviar para rota diff --git a/Transferência Ginseng/workflow/.resources/teste3.ws.cache b/Transferência Ginseng/workflow/.resources/teste3.ws.cache index c8f2401..f350835 100644 --- a/Transferência Ginseng/workflow/.resources/teste3.ws.cache +++ b/Transferência Ginseng/workflow/.resources/teste3.ws.cache @@ -511,6 +511,197 @@ + + camposFormulario, documentoId = 590 + + + activity + + + centroCusto + + + chaveNfe + + + codigoItem + + + codigoProdutoItem + + + currentUserId + + + currentUsermail + + + currentUserName + + + dataAbertura + + + dataColeta + + + dataEmissaoApiNfe + + + dataEmissaoNfe + + + dataEntradaNfeConsulta + + + dataEntrega + + + dataValidacaoGestor + + + descricao + + + emailSolicitante + + + estabelecimento + + + excelUpload + + + fdAnexo_Coleta + + + fdAnexo_Entrega + + + fdAnexo_recebimento + + + fnAnexo_Nfe + + + formMode + + + fornecedorNfeConsulta + + + gestorEmail + + + gestorEmailE + + + gestorNome + + + gestorNomeE + + + gestor_cc + + + gestor_cce + + + invoiceIdNfeConsulta + + + itensNfeConsulta + + + itensNfeJson + + + justificativa + + + justificativaDecisaoGestor + + + justificativaDecisaoItens + + + lojaNfeConsulta + + + motoristaColetaLogin + + + motoristaColetaNome + + + motoristaEntregaLogin + + + motoristaEntregaNome + + + motoristaEntregaSelecionado + + + numeroNfeConsulta + + + operacaoNfeConsulta + + + productIdItem + + + qtdDivergenciasNfe + + + quantidadeItem + + + requesterId + + + requesterMail + + + requesterName + + + serieNfeConsulta + + + situacaoNfeConsulta + + + storeIdNfeConsulta + + + tipoMotoristaEntrega + + + ufDestino + + + ufOrigem + + + userValidacaoGestor + + + usuarioEmissorNfe + + + validacaoItens + + + valorNfeConsulta + + + WKNumProces + + + mecanismo @@ -636,5 +827,530 @@ + + forms + + + + + FLUIGADHOC + + + FLUIGADHOC + + + 3 + + + + + + + FLUIGADHOCPROCESS + + + FLUIGADHOCPROCESS + + + 4 + + + + + + + totvsflow_dataset_tipo_ocorrencia + + + totvsflow_dataset_tipo_ocorrencia + + + 14 + + + + + + + totvsflow_abertura_chamado + + + totvsflow_abertura_chamado + + + 15 + + + + + + + DSFormulariodeAberturadechamado + + + Formulário de Abertura de chamado + + + 20 + + + + + + + Abertura_de_chamados + + + Solicitação de abertura de chamados + + + 21 + + + + + + + DSvistoriadeServico + + + vistoriadeServico + + + 24 + + + + + + + DSFormulariodeReservadesala + + + Formulário de Reserva de sala + + + 34 + + + + + + + totvsflow_dataset_centrocusto + + + totvsflow_dataset_centrocusto + + + 103 + + + + + + + totvsflow_dataset_cadastro_item + + + totvsflow_dataset_cadastro_item + + + 104 + + + + + + + totvsflow_dataset_estabelecimento + + + totvsflow_dataset_estabelecimento + + + 105 + + + + + + + totvsflow_solicitacao_compras + + + totvsflow_solicitacao_compras + + + 165 + + + + + + + aberturadechamado_manutencao + + + aberturadechamado_manutencao + + + 400 + + + + + + + Solicitacao_transferencia + + + Solicitacao_transferencia + + + 590 + + + + + + + recrutamento + + + recrutamento + + + 823 + + + + + + + kit_aniversariantes + + + Aniversariantes + + + 7690 + + + + + + + kit_cardapio + + + Cardápio do Dia + + + 7695 + + + + + + + kit_convenios + + + Convênios + + + 7703 + + + + + + + kit_news + + + Notícias + + + 7709 + + + + + + + compras_digital + + + compras_digital + + + 9305 + + + + + + + dpf_di_formulario_processo_admissao + + + Digte_Public_Form_Di_Formulario_Processo_Admissao_Protheus + + + 9626 + + + + + + + dpf_cadastro_status + + + Digte_Public_Form_Status + + + 9627 + + + + + + + dpf_configuracoes + + + Digte_Public_Form_Configuracoes + + + 9628 + + + + + + + dpf_cadastro_jornada + + + Digte_Public_Form_Jornada + + + 9629 + + + + + + + dpf_tipo_documento + + + Digte_Public_Form_Tipo_Documento + + + 9630 + + + + + + + dpf_dataset + + + Digte_Public_Form_Dataset + + + 9631 + + + + + + + dpf_di_configuracao + + + Digte_Public_Form_Di_Configuracoes + + + 9632 + + + + + + + dpf_di_beneficio + + + Digte_Public_Form_Di_Beneficios + + + 9633 + + + + + + + dpf_di_compl_contrato + + + Digte_Public_Form_Di_Comp_Contrato + + + 9634 + + + + + + + dpf_di_funcao_jornada + + + Digte_Public_Form_Di_Funcao_Jornada + + + 9635 + + + + + + + dpf_dataset_estrutura + + + Digte_Public_Form_Di_Dataset_Estrutura + + + 9636 + + + + + + + dpf_grupo_tipo_contrato + + + Digte_Public_Form_Grupo_Tipo_Contrato + + + 9637 + + + + + + + dpf_tipo_contrato + + + Digte_Public_Form_Tipo_Contrato + + + 9638 + + + + + + + dpf_di_traducao_campo_valor + + + Digte_Public_Form_Di_Traducao_Campo_Valor + + + 9639 + + + + + + + dpf_di_restricoes_cpf + + + Digte_Public_Form_Di_Formulario_Restricao_CPF + + + 9640 + + + + + + + dpf_di_compl_vt + + + Digte_Public_Form_Di_Compl_VT + + + 9641 + + + + + + + dpf_di_traducao_campo + + + Digte_Public_Form_Di_Traducao_Campo + + + 9995 + + + + + + + desligamento + + + desligamento + + + 12959 + + + + + + + form_param_sla_csc + + + Formulário de Parametrização de SLA - Atendimento de Chamado TI + + + 28647 + + + + + + + totvsflow_lancamento_documento + + + totvsflow_lancamento_documento + + + 32331 + + + + + diff --git a/Transferência Ginseng/workflow/diagrams/Solicitação de transferência.process b/Transferência Ginseng/workflow/diagrams/Solicitação de transferência.process index c8bf690..c35bfc0 100644 --- a/Transferência Ginseng/workflow/diagrams/Solicitação de transferência.process +++ b/Transferência Ginseng/workflow/diagrams/Solicitação de transferência.process @@ -1,80 +1,79 @@ - - - - - - + + + + + - - + + - - + + - - - + + + - + - - + + - - + + - + - - + + - - + + - + - - + + - - + + - + - + - - - + + + - - - + + + - - - + + + @@ -83,100 +82,100 @@ - + - - + + - - + + - + - - + + - - - + + + - + - + - - + + - - - + + + - + - + - - + + - - - + + + - + - + - - + + - - - + + + - + - + - - + + - - - + + + - + - + - - - + + + - - - + + + - + @@ -192,9 +191,9 @@ - - - + + + @@ -203,44 +202,44 @@ - + - - + + - - + + - + - - + + - - - + + + - + - + - - - + + + - - - + + + - + @@ -256,54 +255,92 @@ - - - + + + - - - + + + - - + + - - - + + + - + - + - + - - - + + + - - - + + + - - - - - - - - + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -313,20 +350,6 @@ - - - - - - - - - - - - - - @@ -334,146 +357,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -493,26 +516,26 @@ - + - + - + - + - + - + @@ -525,10 +548,10 @@ - + - + @@ -542,146 +565,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -695,146 +718,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -848,146 +871,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -1001,146 +1024,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -1154,146 +1177,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -1307,26 +1330,26 @@ - + - + - + - + - + - + @@ -1339,10 +1362,10 @@ - + - + @@ -1356,26 +1379,26 @@ - + - + - + - + - + - + @@ -1388,26 +1411,26 @@ - + - + - + - + - + - + @@ -1420,146 +1443,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -1568,7 +1591,7 @@ - + @@ -1587,26 +1610,26 @@ - + - + - + - + - + - + @@ -1620,26 +1643,26 @@ - + - + - + - + - + - + @@ -1653,10 +1676,10 @@ - + - + @@ -1672,146 +1695,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -1820,8 +1843,8 @@ - - + + @@ -1835,146 +1858,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -1989,26 +2012,26 @@ - + - + - + - + - + - + @@ -2023,146 +2046,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -2179,146 +2202,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -2333,26 +2356,26 @@ - + - + - + - + - + - + @@ -2366,146 +2389,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -2521,26 +2544,26 @@ - + - + - + - + - + - + @@ -2553,146 +2576,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -2709,146 +2732,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -2863,26 +2886,26 @@ - + - + - + - + - + - + @@ -2895,146 +2918,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3054,146 +3077,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3214,146 +3237,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3375,10 +3398,10 @@ - + - + @@ -3392,26 +3415,26 @@ - + - + - + - + - + - + @@ -3426,10 +3449,10 @@ - + - + @@ -3446,10 +3469,10 @@ - + - + @@ -3465,26 +3488,26 @@ - + - + - + - + - + - + @@ -3499,26 +3522,26 @@ - + - + - + - + - + - + @@ -3533,146 +3556,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3687,26 +3710,26 @@ - + - + - + - + - + - + @@ -3720,146 +3743,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3874,26 +3897,26 @@ - + - + - + - + - + - + @@ -3906,146 +3929,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -4056,323 +4079,358 @@ - - + + + + + + + + + + + + + + + + + + + + + - - + + - - - + + + - - + + - - + + - - + + - - - + + + - - + + - - + + - - + + - - - + + + - - + + - - + + - - + + - - - + + + - - + + - - + + - - + + - - - + + + - - + + - - + + - - + + - - - + + + - - + + - - + + - - + + - - - + + + - - + + - - + + - - + + - - - + + + - - + + - - + + - - + + - - - + + + - - + + - - + + - - + + - - - + + + - - + + - - - - - - - - - - - - - - - - - - + + - - + + - - - + + + - - + + - - + + - - + + - - - + + + - - + + - - + + - - + + - - - + + + - - + + - - + + - - + + - - - + + + - - + + - - + + - - + + - - - + + + - - + + - - + + - - + + - - - + + + - - + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + - - - + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Transferência Ginseng/workflow/scripts/Solicitação de transferência.beforeTaskSave.js b/Transferência Ginseng/workflow/scripts/Solicitação de transferência.beforeTaskSave.js new file mode 100644 index 0000000..0220c19 --- /dev/null +++ b/Transferência Ginseng/workflow/scripts/Solicitação de transferência.beforeTaskSave.js @@ -0,0 +1,205 @@ +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://comerciode188007.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, ""); +} diff --git a/Transferência Ginseng/workflow/scripts/Solicitação de transferência.onNotify.js b/Transferência Ginseng/workflow/scripts/Solicitação de transferência.onNotify.js new file mode 100644 index 0000000..c6cd4a6 --- /dev/null +++ b/Transferência Ginseng/workflow/scripts/Solicitação de transferência.onNotify.js @@ -0,0 +1,27 @@ +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()); +} \ No newline at end of file diff --git a/Transferência Ginseng/workflow/scripts/aberturadeChamado.beforeTaskSave.js b/Transferência Ginseng/workflow/scripts/aberturadeChamado.beforeTaskSave.js index 4fc4d00..cc1a845 100644 --- a/Transferência Ginseng/workflow/scripts/aberturadeChamado.beforeTaskSave.js +++ b/Transferência Ginseng/workflow/scripts/aberturadeChamado.beforeTaskSave.js @@ -18,4 +18,6 @@ function beforeTaskSave(colleagueId,nextSequenceId,userList){ log.error("Erro ao buscar os dados do dataset 'colleague'."); } -} \ No newline at end of file +} + + \ No newline at end of file From c2720400bb490c5dd21427a61eb398cde9017284 Mon Sep 17 00:00:00 2001 From: "Andrey Cunh@" Date: Fri, 27 Mar 2026 08:13:09 -0300 Subject: [PATCH 2/3] =?UTF-8?q?att=20produ=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../datasets/{ds_LojasTransfteste.js => ds_LojasTransf.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Transferência Ginseng/datasets/{ds_LojasTransfteste.js => ds_LojasTransf.js} (100%) diff --git a/Transferência Ginseng/datasets/ds_LojasTransfteste.js b/Transferência Ginseng/datasets/ds_LojasTransf.js similarity index 100% rename from Transferência Ginseng/datasets/ds_LojasTransfteste.js rename to Transferência Ginseng/datasets/ds_LojasTransf.js From fb2bec0fd5a12aa7ca426f9e84249c722114b5f0 Mon Sep 17 00:00:00 2001 From: "Andrey Cunh@" Date: Fri, 27 Mar 2026 08:13:35 -0300 Subject: [PATCH 3/3] att --- Transferência Ginseng/.vscode/settings.json | 3 +- .../datasets/ds_LojasTransf.js | 2 +- .../datasets/ds_fiscal_invoice_by_keys.js | 2 +- .../datasets/ds_rgb_products.js | 297 +++- .../datasets/ds_rgb_products_v2.js | 517 +++++++ .../.metadata | Bin 626 -> 709 bytes .../excel.js | 25 +- .../script.js | 44 +- .../totvsflow_solicitacao_transferencia.html | 54 +- .../workflow/.resources/Producao.ws.cache | 839 ++++++++++ .../workflow/.resources/Producao.ws.cache.bkp | 1372 +++++++++++++++++ .../Solicitação de transferência.ecm30.xml | 60 +- .../Solicitação de transferência.png | Bin 50256 -> 56278 bytes ...licitação de transferência.processimage.svg | 2 +- .../Solicitação de transferência.process | 2 +- 15 files changed, 3143 insertions(+), 76 deletions(-) create mode 100644 Transferência Ginseng/datasets/ds_rgb_products_v2.js create mode 100644 Transferência Ginseng/workflow/.resources/Producao.ws.cache create mode 100644 Transferência Ginseng/workflow/.resources/Producao.ws.cache.bkp diff --git a/Transferência Ginseng/.vscode/settings.json b/Transferência Ginseng/.vscode/settings.json index 6def96a..aa86c45 100644 --- a/Transferência Ginseng/.vscode/settings.json +++ b/Transferência Ginseng/.vscode/settings.json @@ -1,3 +1,4 @@ { - "totvsLanguageServer.welcomePage": false + "totvsLanguageServer.welcomePage": false, + "totvsLanguageServer.editor.linter.includes": "C:\\25-04-14-P12-SMARTCLIENT_BUILD 20.3.2.12_WINDOWS_X64\\include" } \ No newline at end of file diff --git a/Transferência Ginseng/datasets/ds_LojasTransf.js b/Transferência Ginseng/datasets/ds_LojasTransf.js index d6c4ad9..1273d55 100644 --- a/Transferência Ginseng/datasets/ds_LojasTransf.js +++ b/Transferência Ginseng/datasets/ds_LojasTransf.js @@ -18,7 +18,7 @@ function createDataset(fields, constraints, sortFields) { var clientService = fluigAPI.getAuthorizeClientService(); var data = { companyId: String(getValue("WKCompany") || "1"), - serviceCode: "GINSENG APITESTE", // ajuste para o codigo do servico cadastrado no Fluig + serviceCode: "GINSENG API", // ajuste para o codigo do servico cadastrado no Fluig endpoint: "/base_pdvs", method: "get", timeoutService: "60000", diff --git a/Transferência Ginseng/datasets/ds_fiscal_invoice_by_keys.js b/Transferência Ginseng/datasets/ds_fiscal_invoice_by_keys.js index ad4ffc2..259ac84 100644 --- a/Transferência Ginseng/datasets/ds_fiscal_invoice_by_keys.js +++ b/Transferência Ginseng/datasets/ds_fiscal_invoice_by_keys.js @@ -236,7 +236,7 @@ function invokeAuthorizedGet(clientService, endpoint, auth) { var data = { companyId: String(getValue("WKCompany") || "1"), - serviceCode: "GINSENG APITESTE", + serviceCode: "GinsengAPI2", endpoint: endpoint, method: "get", timeoutService: "30000", diff --git a/Transferência Ginseng/datasets/ds_rgb_products.js b/Transferência Ginseng/datasets/ds_rgb_products.js index 0fc0eb6..a9daf36 100644 --- a/Transferência Ginseng/datasets/ds_rgb_products.js +++ b/Transferência Ginseng/datasets/ds_rgb_products.js @@ -6,10 +6,16 @@ function defineStructure() { addColumn("sku"); addColumn("brand"); addColumn("ncmId"); + addColumn("categoria"); } function onSync(lastSyncDate) {} +var GB_TOKEN_URL = "https://api.grupoboticario.com.br/global/v2/jwt-token/token"; +var GB_STRATEGICS_URL = "https://api.grupoboticario.com.br/global/v1/franchising/gb-stores-data/product/classification/strategics"; +var DEFAULT_GB_CLIENT_ID = "88ymKwAUNfu06sD85i0RiokCxWGSkFBkx9ytgI5y1ZKxX3OQ"; +var DEFAULT_GB_CLIENT_SECRET = "YDFz43qAzL6ApNIKVCxu3dAmS9GWOqJbcc2aPnFDkmEaBXexSpsHGfcItg56i2dE"; + function createDataset(fields, constraints, sortFields) { var dataset = DatasetBuilder.newDataset(); dataset.addColumn("Code"); @@ -19,6 +25,7 @@ function createDataset(fields, constraints, sortFields) { dataset.addColumn("sku"); dataset.addColumn("brand"); dataset.addColumn("ncmId"); + dataset.addColumn("categoria"); try { var filtro = parseConstraints(constraints); @@ -62,6 +69,8 @@ function createDataset(fields, constraints, sortFields) { var searchNorm = normalize(filtro.search); var maxRows = filtro.maxRows; + var categoryMap = null; + var categoryDiag = ""; for (var i = 0; i < itens.length; i++) { var item = itens[i] || {}; @@ -77,7 +86,17 @@ function createDataset(fields, constraints, sortFields) { var desc = trim(item.description); var codigoDescricao = code + " - " + desc; var brand = trim(item.brand); - var blob = normalize([code, desc, brand, trim(item.id)].join(" ")); + var categoria = trim(item.strategicDescription || item.strategic_description || item.categoria); + if (!categoria) { + if (categoryMap == null) { + var categorization = loadStrategicCategoryMap(constraints, 30000); + categoryMap = categorization.map || {}; + categoryDiag = categorization.diag || ""; + } + var strategicId = resolveStrategicId(item, code); + categoria = resolveCategory(categoryMap, strategicId); + } + var blob = normalize([code, desc, brand, trim(item.id), categoria].join(" ")); if (searchNorm && searchNorm.length >= 2 && blob.indexOf(searchNorm) === -1) { continue; @@ -90,7 +109,8 @@ function createDataset(fields, constraints, sortFields) { desc, code, brand, - trim(item.ncmId) + trim(item.ncmId), + categoria ]); if (dataset.rowsCount >= maxRows) { @@ -99,7 +119,8 @@ function createDataset(fields, constraints, sortFields) { } if (dataset.rowsCount === 0) { - addDiagRow(dataset, "Sem produtos apos filtros (busca: " + filtro.search + ")"); + var suffix = categoryDiag ? " | Categoria: " + categoryDiag : ""; + addDiagRow(dataset, "Sem produtos apos filtros (busca: " + filtro.search + ")" + suffix); } } catch (e) { @@ -126,9 +147,10 @@ function parseConstraints(constraints) { if (!c || !c.fieldName) continue; var name = String(c.fieldName); + var lowerName = name.toLowerCase(); var value = cleanSearchValue(c.initialValue); - if (name === "sqlLimit") { + if (lowerName === "sqllimit") { var n = parseInt(value, 10); if (!isNaN(n) && n > 0 && n <= 1000) { out.maxRows = n; @@ -138,9 +160,13 @@ function parseConstraints(constraints) { if ( value && - name !== "metadata#id" && - name !== "metadata#active" && - name !== "sqlLimit" + lowerName !== "metadata#id" && + lowerName !== "metadata#active" && + lowerName !== "sqllimit" && + lowerName !== "gbclientid" && + lowerName !== "gbclientsecret" && + lowerName !== "clientid" && + lowerName !== "clientsecret" ) { if (!out.search || value.length > out.search.length) { out.search = value; @@ -209,6 +235,205 @@ function extractItems(obj) { return []; } +function getConstraintValue(constraints, fieldName) { + if (!constraints || !fieldName) return ""; + var target = String(fieldName).toLowerCase(); + for (var i = 0; i < constraints.length; i++) { + var c = constraints[i]; + if (!c || !c.fieldName) continue; + if (String(c.fieldName).toLowerCase() === target) { + return c.initialValue; + } + } + return ""; +} + +function resolveGbCredentials(constraints) { + var clientId = trim(getConstraintValue(constraints, "gbClientId")); + if (!clientId) clientId = trim(getConstraintValue(constraints, "clientId")); + if (!clientId) { + try { clientId = trim(java.lang.System.getenv("GB_CLIENT_ID")); } catch (e1) {} + } + if (!clientId) clientId = DEFAULT_GB_CLIENT_ID; + + var clientSecret = trim(getConstraintValue(constraints, "gbClientSecret")); + if (!clientSecret) clientSecret = trim(getConstraintValue(constraints, "clientSecret")); + if (!clientSecret) { + try { clientSecret = trim(java.lang.System.getenv("GB_CLIENT_SECRET")); } catch (e2) {} + } + if (!clientSecret) clientSecret = DEFAULT_GB_CLIENT_SECRET; + + return { + clientId: clientId, + clientSecret: clientSecret + }; +} + +function loadStrategicCategoryMap(constraints, timeoutMs) { + var out = { map: {}, diag: "" }; + + var creds = resolveGbCredentials(constraints); + if (!creds.clientId || !creds.clientSecret) { + out.diag = "credenciais ausentes"; + return out; + } + + var tokenResp = requestGbToken(creds, timeoutMs || 30000); + if (!tokenResp.token) { + out.diag = tokenResp.diag || "falha ao obter token"; + return out; + } + + var strategicsResp = requestStrategics(tokenResp.token, timeoutMs || 30000); + var strategics = strategicsResp.items || []; + if (!strategics.length) { + out.diag = strategicsResp.diag || "sem classificacoes"; + return out; + } + + for (var i = 0; i < strategics.length; i++) { + var item = strategics[i] || {}; + var id = trim(item.strategicId || item.strategicID || item.id || item.code); + var descricao = trim(item.description || item.descricao || item.category || item.name); + if (!id || !descricao) continue; + out.map[id] = descricao; + } + + if (!hasOwnKeys(out.map)) { + out.diag = "classificacoes sem strategicId/description"; + } + + return out; +} + +function requestGbToken(creds, timeoutMs) { + var timeout = timeoutMs || 30000; + var body = "client_id=" + urlEncode(creds.clientId) + + "&client_secret=" + urlEncode(creds.clientSecret); + + var attempts = [ + { + name: "post-query-body", + method: "POST", + url: GB_TOKEN_URL + "?grant_type=client_credentials", + headers: { + "Accept": "application/json", + "Content-Type": "application/x-www-form-urlencoded" + }, + body: body + } + ]; + + var trace = []; + for (var i = 0; i < attempts.length; i++) { + var attempt = attempts[i]; + var resp = httpRequest(attempt.url, attempt.method, attempt.headers, attempt.body, timeout); + trace.push(attempt.name + ":" + trim(resp.status)); + var parsed = normalizeApiBody(resp.body); + var token = trim(parsed && (parsed.access_token || parsed.accessToken || parsed.token)); + if (token) { + return { token: token, diag: "token ok (" + attempt.name + ")" }; + } + } + + return { token: "", diag: "token falhou [" + trace.join(" | ") + "]" }; +} + +function requestStrategics(accessToken, timeoutMs) { + var resp = httpRequest( + GB_STRATEGICS_URL, + "GET", + { + "Accept": "application/json", + "Authorization": "Bearer " + trim(accessToken) + }, + "", + timeoutMs || 30000 + ); + + var parsed = normalizeApiBody(resp.body); + var items = extractItems(parsed); + if ((!items || !items.length) && parsed && parsed.items instanceof Array) { + items = parsed.items; + } + if ((!items || !items.length) && parsed && parsed.strategics instanceof Array) { + items = parsed.strategics; + } + + if (!items || !items.length) { + return { items: [], diag: "strategics HTTP " + trim(resp.status) }; + } + + return { items: items, diag: "ok" }; +} + +function resolveStrategicId(item, fallbackCode) { + var candidates = [ + item && item.strategicId, + item && item.strategicID, + item && item.classificationStrategicId, + item && item.productStrategicId, + item && item.estrategicId, + item && item.strategyId, + item && item.code, + fallbackCode + ]; + + for (var i = 0; i < candidates.length; i++) { + var value = trim(candidates[i]); + if (value) return value; + } + + return ""; +} + +function resolveCategory(map, strategicId) { + var id = trim(strategicId); + if (!id || !map) return ""; + + if (map.hasOwnProperty(id)) { + return trim(map[id]); + } + + var asInt = parseInt(id, 10); + if (!isNaN(asInt)) { + var normalized = String(asInt); + if (map.hasOwnProperty(normalized)) { + return trim(map[normalized]); + } + } + + return ""; +} + +function normalizeApiBody(text) { + var obj = parseJsonSafe(text); + if (!obj) return null; + + if (obj.content && typeof obj.content === "string") { + var parsedContent = parseJsonSafe(obj.content); + if (parsedContent) return parsedContent; + } + + if (obj.result && typeof obj.result === "string") { + var parsedResult = parseJsonSafe(obj.result); + if (parsedResult) return parsedResult; + } + + return obj; +} + +function hasOwnKeys(obj) { + for (var k in obj) { + if (obj.hasOwnProperty(k)) return true; + } + return false; +} + +function urlEncode(value) { + return String(java.net.URLEncoder.encode(String(value || ""), "UTF-8")); +} + function addDiagRow(dataset, msg) { dataset.addRow([ "DEBUG", @@ -223,23 +448,53 @@ function addDiagRow(dataset, msg) { } function fetchDirect(url, timeoutMs) { + return httpRequest( + url, + "GET", + { "Accept": "application/json" }, + "", + timeoutMs || 30000 + ); +} + +function httpRequest(url, method, headers, body, timeoutMs) { var conn = null; var reader = null; + var writer = null; try { var URL = java.net.URL; - var HttpURLConnection = java.net.HttpURLConnection; var InputStreamReader = java.io.InputStreamReader; var BufferedReader = java.io.BufferedReader; + var OutputStreamWriter = java.io.OutputStreamWriter; var StringBuilder = java.lang.StringBuilder; - conn = new URL(url).openConnection(); - conn.setRequestMethod("GET"); - conn.setConnectTimeout(timeoutMs || 30000); - conn.setReadTimeout(timeoutMs || 30000); - conn.setRequestProperty("Accept", "application/json"); + var httpMethod = String(method || "GET").toUpperCase(); + var timeout = timeoutMs || 30000; + var payload = body == null ? "" : String(body); - var status = conn.getResponseCode(); - var stream = (status >= 200 && status < 300) ? conn.getInputStream() : conn.getErrorStream(); + conn = new URL(url).openConnection(); + conn.setRequestMethod(httpMethod); + conn.setConnectTimeout(timeout); + conn.setReadTimeout(timeout); + + if (headers) { + for (var h in headers) { + if (!headers.hasOwnProperty(h)) continue; + if (headers[h] == null || headers[h] === "") continue; + conn.setRequestProperty(String(h), String(headers[h])); + } + } + + if (payload && (httpMethod === "POST" || httpMethod === "PUT" || httpMethod === "PATCH")) { + conn.setDoOutput(true); + writer = new OutputStreamWriter(conn.getOutputStream(), "UTF-8"); + writer.write(payload); + writer.flush(); + } + + var statusCode = conn.getResponseCode(); + var status = String(statusCode); + var stream = (statusCode >= 200 && statusCode < 300) ? conn.getInputStream() : conn.getErrorStream(); if (stream == null) { return { status: status, body: "" }; } @@ -251,14 +506,12 @@ function fetchDirect(url, timeoutMs) { sb.append(line); } - return { - status: status, - body: String(sb.toString()) - }; + return { status: status, body: String(sb.toString()) }; } catch (e) { - return { status: 0, body: "" }; + return { status: "", body: "" }; } finally { - try { if (reader) reader.close(); } catch (e1) {} - try { if (conn) conn.disconnect(); } catch (e2) {} + try { if (writer) writer.close(); } catch (e1) {} + try { if (reader) reader.close(); } catch (e2) {} + try { if (conn) conn.disconnect(); } catch (e3) {} } } diff --git a/Transferência Ginseng/datasets/ds_rgb_products_v2.js b/Transferência Ginseng/datasets/ds_rgb_products_v2.js new file mode 100644 index 0000000..cf0783c --- /dev/null +++ b/Transferência Ginseng/datasets/ds_rgb_products_v2.js @@ -0,0 +1,517 @@ +function defineStructure() { + addColumn("Code"); + addColumn("Description"); + addColumn("codigoDescricao"); + addColumn("descricao"); + addColumn("sku"); + addColumn("brand"); + addColumn("ncmId"); + addColumn("categoria"); +} + +function onSync(lastSyncDate) {} + +var GB_TOKEN_URL = "https://api.grupoboticario.com.br/global/v2/jwt-token/token"; +var GB_STRATEGICS_URL = "https://api.grupoboticario.com.br/global/v1/franchising/gb-stores-data/product/classification/strategics"; +var DEFAULT_GB_CLIENT_ID = "88ymKwAUNfu06sD85i0RiokCxWGSkFBkx9ytgI5y1ZKxX3OQ"; +var DEFAULT_GB_CLIENT_SECRET = "YDFz43qAzL6ApNIKVCxu3dAmS9GWOqJbcc2aPnFDkmEaBXexSpsHGfcItg56i2dE"; + +function createDataset(fields, constraints, sortFields) { + var dataset = DatasetBuilder.newDataset(); + dataset.addColumn("Code"); + dataset.addColumn("Description"); + dataset.addColumn("codigoDescricao"); + dataset.addColumn("descricao"); + dataset.addColumn("sku"); + dataset.addColumn("brand"); + dataset.addColumn("ncmId"); + dataset.addColumn("categoria"); + + try { + var filtro = parseConstraints(constraints); + var clientService = fluigAPI.getAuthorizeClientService(); + var data = { + companyId: String(getValue("WKCompany") || "1"), + serviceCode: "GINSENG APITESTE", + endpoint: "/dados_rgb_products", + method: "get", + timeoutService: "60000", + params: {} + }; + + var vo = clientService.invoke(JSON.stringify(data)); + var statusHttp = vo ? String(vo.getHttpStatusResult() || "") : ""; + var retorno = vo ? String(vo.getResult() || "") : ""; + + // Fallback: se o servico integrado estiver com endpoint/base incorreto, chama URL direta. + if (statusHttp !== "200" || !retorno) { + var direct = fetchDirect("https://api.grupoginseng.com.br/dados_rgb_products", 60000); + statusHttp = String(direct.status || statusHttp); + retorno = direct.body || retorno; + } + + if (!retorno) { + addDiagRow(dataset, "Sem retorno da API (HTTP " + statusHttp + ")"); + return dataset; + } + + var obj = parseJsonSafe(retorno); + if (!obj) { + addDiagRow(dataset, "Falha no JSON da API (HTTP " + statusHttp + ")"); + return dataset; + } + + var itens = extractItems(obj); + if (!itens || !itens.length) { + addDiagRow(dataset, "API sem itens (HTTP " + statusHttp + ")"); + return dataset; + } + + var searchNorm = normalize(filtro.search); + var maxRows = filtro.maxRows; + var categoryMap = null; + var categoryDiag = ""; + + for (var i = 0; i < itens.length; i++) { + var item = itens[i] || {}; + + if (item.discontinued === true) { + continue; + } + if (item.purchaseBlocked === true) { + continue; + } + + var code = trim(item.sku); + var desc = trim(item.description); + var codigoDescricao = code + " - " + desc; + var brand = trim(item.brand); + var categoria = trim(item.strategicDescription || item.strategic_description || item.categoria); + if (!categoria) { + if (categoryMap == null) { + var categorization = loadStrategicCategoryMap(constraints, 30000); + categoryMap = categorization.map || {}; + categoryDiag = categorization.diag || ""; + } + var strategicId = resolveStrategicId(item, code); + categoria = resolveCategory(categoryMap, strategicId); + } + var blob = normalize([code, desc, brand, trim(item.id), categoria].join(" ")); + + if (searchNorm && searchNorm.length >= 2 && blob.indexOf(searchNorm) === -1) { + continue; + } + + dataset.addRow([ + code, + desc, + codigoDescricao, + desc, + code, + brand, + trim(item.ncmId), + categoria + ]); + + if (maxRows > 0 && dataset.rowsCount >= maxRows) { + break; + } + } + + if (dataset.rowsCount === 0) { + var suffix = categoryDiag ? " | Categoria: " + categoryDiag : ""; + addDiagRow(dataset, "Sem produtos apos filtros (busca: " + filtro.search + ")" + suffix); + } + + } catch (e) { + addDiagRow(dataset, "Erro ao consultar API: " + e); + } + + return dataset; +} + +function onMobileSync(user) {} + +function parseConstraints(constraints) { + var out = { + search: "", + maxRows: 0 + }; + + if (!constraints) { + return out; + } + + for (var i = 0; i < constraints.length; i++) { + var c = constraints[i]; + if (!c || !c.fieldName) continue; + + var name = String(c.fieldName); + var lowerName = name.toLowerCase(); + var value = cleanSearchValue(c.initialValue); + + if (lowerName === "sqllimit") { + var n = parseInt(trim(c.initialValue), 10); + if (!isNaN(n) && n > 0) { + out.maxRows = n; + } + continue; + } + + if ( + value && + lowerName !== "metadata#id" && + lowerName !== "metadata#active" && + lowerName !== "sqllimit" && + lowerName !== "gbclientid" && + lowerName !== "gbclientsecret" && + lowerName !== "clientid" && + lowerName !== "clientsecret" + ) { + if (!out.search || value.length > out.search.length) { + out.search = value; + } + } + } + + return out; +} + +function cleanSearchValue(v) { + var s = trim(v); + s = s.replace(/[%*_]/g, ""); + // Evita que flags comuns do Fluig virem termo de busca + if (s === "true" || s === "false" || s === "on" || s === "off" || s === "1") { + return ""; + } + return trim(s); +} + +function normalize(v) { + return trim(v).toLowerCase(); +} + +function trim(v) { + return String(v == null ? "" : v).trim(); +} + +function parseJsonSafe(text) { + try { + return JSON.parse(text); + } catch (e) { + return null; + } +} + +function extractItems(obj) { + if (!obj) return []; + if (obj instanceof Array) return obj; + if (obj.data && obj.data instanceof Array) return obj.data; + + if (obj.content) { + if (obj.content instanceof Array) return obj.content; + if (typeof obj.content === "string") { + var parsedContent = parseJsonSafe(obj.content); + if (parsedContent && parsedContent.data && parsedContent.data instanceof Array) { + return parsedContent.data; + } + if (parsedContent && parsedContent instanceof Array) { + return parsedContent; + } + } + if (obj.content.data && obj.content.data instanceof Array) return obj.content.data; + } + + if (obj.result) { + if (obj.result instanceof Array) return obj.result; + if (typeof obj.result === "string") { + var parsedResult = parseJsonSafe(obj.result); + if (parsedResult && parsedResult.data && parsedResult.data instanceof Array) { + return parsedResult.data; + } + } + } + + return []; +} + +function getConstraintValue(constraints, fieldName) { + if (!constraints || !fieldName) return ""; + var target = String(fieldName).toLowerCase(); + for (var i = 0; i < constraints.length; i++) { + var c = constraints[i]; + if (!c || !c.fieldName) continue; + if (String(c.fieldName).toLowerCase() === target) { + return c.initialValue; + } + } + return ""; +} + +function resolveGbCredentials(constraints) { + var clientId = trim(getConstraintValue(constraints, "gbClientId")); + if (!clientId) clientId = trim(getConstraintValue(constraints, "clientId")); + if (!clientId) { + try { clientId = trim(java.lang.System.getenv("GB_CLIENT_ID")); } catch (e1) {} + } + if (!clientId) clientId = DEFAULT_GB_CLIENT_ID; + + var clientSecret = trim(getConstraintValue(constraints, "gbClientSecret")); + if (!clientSecret) clientSecret = trim(getConstraintValue(constraints, "clientSecret")); + if (!clientSecret) { + try { clientSecret = trim(java.lang.System.getenv("GB_CLIENT_SECRET")); } catch (e2) {} + } + if (!clientSecret) clientSecret = DEFAULT_GB_CLIENT_SECRET; + + return { + clientId: clientId, + clientSecret: clientSecret + }; +} + +function loadStrategicCategoryMap(constraints, timeoutMs) { + var out = { map: {}, diag: "" }; + + var creds = resolveGbCredentials(constraints); + if (!creds.clientId || !creds.clientSecret) { + out.diag = "credenciais ausentes"; + return out; + } + + var tokenResp = requestGbToken(creds, timeoutMs || 30000); + if (!tokenResp.token) { + out.diag = tokenResp.diag || "falha ao obter token"; + return out; + } + + var strategicsResp = requestStrategics(tokenResp.token, timeoutMs || 30000); + var strategics = strategicsResp.items || []; + if (!strategics.length) { + out.diag = strategicsResp.diag || "sem classificacoes"; + return out; + } + + for (var i = 0; i < strategics.length; i++) { + var item = strategics[i] || {}; + var id = trim(item.strategicId || item.strategicID || item.id || item.code); + var descricao = trim(item.description || item.descricao || item.category || item.name); + if (!id || !descricao) continue; + out.map[id] = descricao; + } + + if (!hasOwnKeys(out.map)) { + out.diag = "classificacoes sem strategicId/description"; + } + + return out; +} + +function requestGbToken(creds, timeoutMs) { + var timeout = timeoutMs || 30000; + var body = "client_id=" + urlEncode(creds.clientId) + + "&client_secret=" + urlEncode(creds.clientSecret); + + var attempts = [ + { + name: "post-query-body", + method: "POST", + url: GB_TOKEN_URL + "?grant_type=client_credentials", + headers: { + "Accept": "application/json", + "Content-Type": "application/x-www-form-urlencoded" + }, + body: body + } + ]; + + var trace = []; + for (var i = 0; i < attempts.length; i++) { + var attempt = attempts[i]; + var resp = httpRequest(attempt.url, attempt.method, attempt.headers, attempt.body, timeout); + trace.push(attempt.name + ":" + trim(resp.status)); + var parsed = normalizeApiBody(resp.body); + var token = trim(parsed && (parsed.access_token || parsed.accessToken || parsed.token)); + if (token) { + return { token: token, diag: "token ok (" + attempt.name + ")" }; + } + } + + return { token: "", diag: "token falhou [" + trace.join(" | ") + "]" }; +} + +function requestStrategics(accessToken, timeoutMs) { + var resp = httpRequest( + GB_STRATEGICS_URL, + "GET", + { + "Accept": "application/json", + "Authorization": "Bearer " + trim(accessToken) + }, + "", + timeoutMs || 30000 + ); + + var parsed = normalizeApiBody(resp.body); + var items = extractItems(parsed); + if ((!items || !items.length) && parsed && parsed.items instanceof Array) { + items = parsed.items; + } + if ((!items || !items.length) && parsed && parsed.strategics instanceof Array) { + items = parsed.strategics; + } + + if (!items || !items.length) { + return { items: [], diag: "strategics HTTP " + trim(resp.status) }; + } + + return { items: items, diag: "ok" }; +} + +function resolveStrategicId(item, fallbackCode) { + var candidates = [ + item && item.strategicId, + item && item.strategicID, + item && item.classificationStrategicId, + item && item.productStrategicId, + item && item.estrategicId, + item && item.strategyId, + item && item.code, + fallbackCode + ]; + + for (var i = 0; i < candidates.length; i++) { + var value = trim(candidates[i]); + if (value) return value; + } + + return ""; +} + +function resolveCategory(map, strategicId) { + var id = trim(strategicId); + if (!id || !map) return ""; + + if (map.hasOwnProperty(id)) { + return trim(map[id]); + } + + var asInt = parseInt(id, 10); + if (!isNaN(asInt)) { + var normalized = String(asInt); + if (map.hasOwnProperty(normalized)) { + return trim(map[normalized]); + } + } + + return ""; +} + +function normalizeApiBody(text) { + var obj = parseJsonSafe(text); + if (!obj) return null; + + if (obj.content && typeof obj.content === "string") { + var parsedContent = parseJsonSafe(obj.content); + if (parsedContent) return parsedContent; + } + + if (obj.result && typeof obj.result === "string") { + var parsedResult = parseJsonSafe(obj.result); + if (parsedResult) return parsedResult; + } + + return obj; +} + +function hasOwnKeys(obj) { + for (var k in obj) { + if (obj.hasOwnProperty(k)) return true; + } + return false; +} + +function urlEncode(value) { + return String(java.net.URLEncoder.encode(String(value || ""), "UTF-8")); +} + +function addDiagRow(dataset, msg) { + dataset.addRow([ + "DEBUG", + String(msg), + String(msg), + String(msg), + "", + "", + "", + "" + ]); +} + +function fetchDirect(url, timeoutMs) { + return httpRequest( + url, + "GET", + { "Accept": "application/json" }, + "", + timeoutMs || 30000 + ); +} + +function httpRequest(url, method, headers, body, timeoutMs) { + var conn = null; + var reader = null; + var writer = null; + try { + var URL = java.net.URL; + var InputStreamReader = java.io.InputStreamReader; + var BufferedReader = java.io.BufferedReader; + var OutputStreamWriter = java.io.OutputStreamWriter; + var StringBuilder = java.lang.StringBuilder; + + var httpMethod = String(method || "GET").toUpperCase(); + var timeout = timeoutMs || 30000; + var payload = body == null ? "" : String(body); + + conn = new URL(url).openConnection(); + conn.setRequestMethod(httpMethod); + conn.setConnectTimeout(timeout); + conn.setReadTimeout(timeout); + + if (headers) { + for (var h in headers) { + if (!headers.hasOwnProperty(h)) continue; + if (headers[h] == null || headers[h] === "") continue; + conn.setRequestProperty(String(h), String(headers[h])); + } + } + + if (payload && (httpMethod === "POST" || httpMethod === "PUT" || httpMethod === "PATCH")) { + conn.setDoOutput(true); + writer = new OutputStreamWriter(conn.getOutputStream(), "UTF-8"); + writer.write(payload); + writer.flush(); + } + + var statusCode = conn.getResponseCode(); + var status = String(statusCode); + var stream = (statusCode >= 200 && statusCode < 300) ? conn.getInputStream() : conn.getErrorStream(); + if (stream == null) { + return { status: status, body: "" }; + } + + reader = new BufferedReader(new InputStreamReader(stream, "UTF-8")); + var sb = new StringBuilder(); + var line = null; + while ((line = reader.readLine()) != null) { + sb.append(line); + } + + return { status: status, body: String(sb.toString()) }; + } catch (e) { + return { status: "", body: "" }; + } finally { + try { if (writer) writer.close(); } catch (e1) {} + try { if (reader) reader.close(); } catch (e2) {} + try { if (conn) conn.disconnect(); } catch (e3) {} + } +} diff --git a/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/.metadata b/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/.metadata index d744d9a4c92fc19bfc43edf285c95e04e7c13079..0a702dd8c51b71cedd8d2835ba50b1563b9c1c4b 100644 GIT binary patch delta 112 zcmeywa+Gz#6?Ud_76t|erj57L7$b`d8R{6=N*EYQ7$k%9b25`NOA?b4^W#g367!1F lQj1dak~0&*inxJV{0d4KI0B0DQ%Zqq@ad>1nC#A^4FKQ2B_IF* delta 29 lcmX@g`iW)26?VpQ76t|e#*Mer7}+Wc8R{7LCeLEh1^|jN2yp-a diff --git a/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/excel.js b/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/excel.js index e1d8155..893d865 100644 --- a/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/excel.js +++ b/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/excel.js @@ -97,6 +97,7 @@ function processarArquivoExcel(file) { var codigo = getCellByAliases(item, ["codigoItem", "codigo", "codItem", "sku", "code", "item"]); var quantidade = getCellByAliases(item, ["quantidadeItem", "quantidade", "qtd", "qtde"]); var descricao = getCellByAliases(item, ["descricao", "description", "desc"]); + var categoria = getCellByAliases(item, ["categoria", "category"]); if (!codigo || !quantidade) { return; @@ -105,7 +106,8 @@ function processarArquivoExcel(file) { linhasValidas.push({ codigo: String(codigo).trim(), quantidade: String(quantidade).trim(), - descricao: String(descricao || "").trim() + descricao: String(descricao || "").trim(), + categoria: String(categoria || "").trim() }); }); @@ -141,6 +143,11 @@ function processarArquivoExcel(file) { if (descricaoFinal) { $("#codigoItem___" + idx).val(descricaoFinal); } + + var categoriaFinal = item.categoria || produtoInfo.categoria; + if (categoriaFinal) { + $("#categoriaItem___" + idx).val(categoriaFinal); + } }); if (typeof processarConferenciaNfe === "function") { @@ -192,16 +199,16 @@ function normalizeHeader(text) { function buscarProdutoPorCodigo(codigo) { try { if (typeof DatasetFactory === "undefined" || typeof ConstraintType === "undefined") { - return { descricao: "", id: "" }; + return { descricao: "", id: "", categoria: "" }; } var codigoTxt = String(codigo || "").trim(); - if (!codigoTxt) return { descricao: "", id: "" }; + if (!codigoTxt) return { descricao: "", id: "", categoria: "" }; var cCodigo = DatasetFactory.createConstraint("Code", codigoTxt, codigoTxt, ConstraintType.MUST); - var ds = DatasetFactory.getDataset("ds_rgb_products", null, [cCodigo], null); + var ds = DatasetFactory.getDataset("ds_rgb_products_v2", null, [cCodigo], null); if (!ds || !ds.values || !ds.values.length) { - return { descricao: "", id: "" }; + return { descricao: "", id: "", categoria: "" }; } for (var i = 0; i < ds.values.length; i++) { @@ -209,7 +216,8 @@ function buscarProdutoPorCodigo(codigo) { if (String(row.Code || "").trim() === codigoTxt) { return { descricao: String(row.descricao || row.Description || "").trim(), - id: String(row.id || "").trim() + id: String(row.id || "").trim(), + categoria: String(row.categoria || row.strategicDescription || "").trim() }; } } @@ -217,11 +225,12 @@ function buscarProdutoPorCodigo(codigo) { var first = ds.values[0] || {}; return { descricao: String(first.descricao || first.Description || "").trim(), - id: String(first.id || "").trim() + id: String(first.id || "").trim(), + categoria: String(first.categoria || first.strategicDescription || "").trim() }; } catch (e) { console.error("Erro ao buscar descricao por codigo:", e); - return { descricao: "", id: "" }; + return { descricao: "", id: "", categoria: "" }; } } diff --git a/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/script.js b/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/script.js index 59e9ee1..535fd70 100644 --- a/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/script.js +++ b/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/script.js @@ -49,13 +49,15 @@ $(document).ready(function () { processarConferenciaNfe(); }); + var activity = String($("#activity").val() || ""); + applyTransferStatus(activity); + if ($("#formMode").val() == "VIEW") { showAndBlock(["all"]); $("#btnConsultarChaveNfe").prop("disabled", true).hide(); - updateConferenciaNfeVisibility($("#activity").val()); + updateConferenciaNfeVisibility(activity); } else { //show the right fields - var activity = $("#activity").val(); var requestDate = getCurrentDate(); if (String(activity) !== "6") { @@ -209,6 +211,40 @@ $(document).ready(function () { }); +function applyTransferStatus(activity) { + var current = String(activity || ""); + var pills = $("#transferStatus .status-pill"); + if (!pills.length) return; + + pills.removeClass("is-active is-done"); + + var activeOrder = -1; + pills.each(function () { + var pill = $(this); + var activities = String(pill.attr("data-activities") || "").split(","); + for (var i = 0; i < activities.length; i++) { + if ($.trim(activities[i]) === current) { + pill.addClass("is-active"); + var order = parseInt(pill.attr("data-order"), 10); + if (!isNaN(order)) { + activeOrder = order; + } + break; + } + } + }); + + if (activeOrder < 0) return; + + pills.each(function () { + var pill = $(this); + var order = parseInt(pill.attr("data-order"), 10); + if (!isNaN(order) && order < activeOrder) { + pill.addClass("is-done"); + } + }); +} + function resolveFormModeFallback() { var mode = ($("#formMode").val() || "").toUpperCase(); if (mode) return mode; @@ -1312,9 +1348,11 @@ function setSelectedZoomItem(selectedItem) { var itemDescricao = selectedItem["descricao"] || selectedItem["Description"] || ""; var itemCode = selectedItem["Code"] || selectedItem["sku"] || ""; var itemProductId = selectedItem["id"] || selectedItem["productId"] || ""; + var itemCategoria = selectedItem["categoria"] || selectedItem["strategicDescription"] || ""; $("#codigoItem" + "___" + indice).val(itemDescricao); $("#codigoProdutoItem" + "___" + indice).val(itemCode); $("#productIdItem" + "___" + indice).val(itemProductId); + $("#categoriaItem" + "___" + indice).val(itemCategoria); processarConferenciaNfe(); } @@ -1355,6 +1393,7 @@ function removedZoomItem(removedItem) { $("#codigoItem___" + linha[1]).val(""); $("#codigoProdutoItem___" + linha[1]).val(""); $("#productIdItem___" + linha[1]).val(""); + $("#categoriaItem___" + linha[1]).val(""); $("#quantidadeItem___" + linha[1]).val(""); processarConferenciaNfe(); } @@ -1364,6 +1403,7 @@ function removedZoomItem(removedItem) { $("#codigoItem" + "___" + indice).val(""); $("#codigoProdutoItem" + "___" + indice).val(""); $("#productIdItem" + "___" + indice).val(""); + $("#categoriaItem" + "___" + indice).val(""); processarConferenciaNfe(); } } diff --git a/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/totvsflow_solicitacao_transferencia.html b/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/totvsflow_solicitacao_transferencia.html index 767928e..d9a87af 100644 --- a/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/totvsflow_solicitacao_transferencia.html +++ b/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/totvsflow_solicitacao_transferencia.html @@ -25,13 +25,40 @@ } .status-pill { - background: #e9f4ff; - color: #0d5b91; - border: 1px solid #c3def6; + background: #eef2f6; + color: #5f7080; + border: 1px solid #d3dde7; padding: 6px 12px; border-radius: 999px; font-size: 11px; font-weight: 600; + transition: all .2s ease; + } + + .status-pill.is-done { + background: #e8f7ed; + color: #1f6e3e; + border-color: #b8e3c4; + } + + .status-pill.is-active { + background: #e8f2ff; + color: #0e56a2; + border-color: #8fb8e8; + box-shadow: 0 0 0 2px rgba(31, 110, 169, 0.12); + } + + .status-pill.status-pill--problem.is-active { + background: #ffecec; + color: #a12f2f; + border-color: #efb1b1; + box-shadow: 0 0 0 2px rgba(199, 58, 58, 0.12); + } + + .status-pill.status-pill--problem.is-done { + background: #fff4e6; + color: #8a5c12; + border-color: #f2d3a2; } .transfer-main-title { @@ -216,11 +243,15 @@

-
- Solicitação - Coleta - Entrega - Recebimento +
+ Solicitação + Aprovação + Emissão NFe + Coleta + Entrega + Recebimento + Verificar Problema + Finalizada

Formulário de Transferência de Mercadorias

@@ -310,6 +341,7 @@ Código do item Quantidade Descrição + Categoria @@ -319,11 +351,12 @@ + + +