diff --git a/Transferência Ginseng/workflow/diagrams/workflow/.resources/Solicitação de transferência.png b/Transferência Ginseng/workflow/diagrams/workflow/.resources/Solicitação de transferência.png new file mode 100644 index 0000000..c1329be Binary files /dev/null and b/Transferência Ginseng/workflow/diagrams/workflow/.resources/Solicitação de transferência.png differ diff --git a/Transferência Ginseng/workflow/diagrams/workflow/.resources/producao.ws.cache b/Transferência Ginseng/workflow/diagrams/workflow/.resources/producao.ws.cache new file mode 100644 index 0000000..8f35f24 --- /dev/null +++ b/Transferência Ginseng/workflow/diagrams/workflow/.resources/producao.ws.cache @@ -0,0 +1,706 @@ + + + + + volume + + + Default + + + + + expediente + + + Default + + + Expediente BackOffice, Logística e Motorista + + + Expediente Escritório Matriz + + + Expediente Lojas + + + + + mecanismo + + + + + Atribuição por Associação + + + Associado + + + + + + + Atribuição por Campo de Formulário + + + Campo Formulário + + + + + + + dpf_di_emp_filial_filtro + + + dpf_di_emp_filial_filtro + + + + + + + dpf_di_inicio_diadmissao + + + dpf_di_inicio_diadmissao + + + + + + + Atribuição por Executor de Atividade + + + Executor Atividade + + + + + + + Atribuição por Grupo + + + Grupo + + + + + + + Atribuição por Grupos do Colaborador + + + Grupos Colaborador + + + + + + + mecCustomAprov + + + mecCustomAprov + + + + + + + Atribuição por Papel + + + Papel + + + + + + + Atribuição para um Grupo + + + Pool Grupo + + + + + + + Atribuição para um Papel + + + Pool Papel + + + + + + + Atribuição por Usuário + + + Usuário + + + + + + + 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 + + + + + + + checklist + + + checklist + + + 40213 + + + + + + + totvsflow_lancamento_documento + + + totvsflow_lancamento_documento + + + 41254 + + + + + + + transferenciav2 + + + transferência + + + 43582 + + + + + + + desligamentov2 + + + desligamentov2 + + + 46963 + + + + + + + diff --git a/Transferência Ginseng/workflow/diagrams/workflow/.resources/producao.ws.cache.bkp b/Transferência Ginseng/workflow/diagrams/workflow/.resources/producao.ws.cache.bkp new file mode 100644 index 0000000..de68bfa --- /dev/null +++ b/Transferência Ginseng/workflow/diagrams/workflow/.resources/producao.ws.cache.bkp @@ -0,0 +1,729 @@ + + + + + mecanismoGrupo + + + + + Tecnologia e Comunicação + + + TIC + + + + + + + Compras Indiretos + + + ComprasIndiretos + + + + + + + Obras e manutenção + + + Manutencao + + + + + + + Aprovadores Compras Nvl 3 + + + AprovadoresComprasNvl3 + + + + + + + Motoristas + + + Motoristas + + + + + + + Requisitantes de Vaga + + + Requisitantesdevaga + + + + + + + Recrutamento + + + Recrutamento + + + + + + + TODOS-TODOS-DIADMISSAO + + + TODOS-TODOS-DIADMISSAO + + + + + + + ResponsavelDesligamento + + + ResponsavelDesligamento + + + + + + + GENTE & CULTURA + + + GENTE_CULTURA + + + + + + + LOJA AL + + + LOJA_AL + + + + + + + CD + + + CD + + + + + + + ESPAÇO DO REVENDEDOR AL + + + ESPACO_DO_REVENDEDOR_AL + + + + + + + FINANCEIRO + + + FINANCEIRO + + + + + + + OPERAÇÕES + + + OPERACOES + + + + + + + AMG AL + + + AMG_AL + + + + + + + REGIONAL ALAGOAS + + + REGIONAL_ALAGOAS + + + + + + + PREVENÇÃO DE PERDA + + + PREVENCAO_DE_PERDA + + + + + + + MARKETING, TREINAMENTO + + + MARKETING_TREINAMENTO + + + + + + + SECRETARIA EXECUTIVA + + + SECRETARIA_EXECUTIVA + + + + + + + DIRETORIA EXECUTIVA + + + DIRETORIA_EXECUTIVA + + + + + + + INFRAESTRUTURA + + + INFRAESTRUTURA + + + + + + + ESPAÇO DO REVENDEDOR BA + + + ESPACO_DO_REVENDEDOR_BA + + + + + + + BUSINESS INTELLIGENCE + + + BUSINESS_INTELLIGENCE + + + + + + + DEPARTAMENTO PESSOAL + + + DEPARTAMENTO_PESSOAL + + + + + + + LOJA BA + + + LOJA_BA + + + + + + + TREINAMENTO + + + TREINAMENTO + + + + + + + AMG BA + + + AMG_BA + + + + + + + MARKETING + + + MARKETING + + + + + + + COMPRAS + + + COMPRAS + + + + + + + AMG SE + + + AMG_SE + + + + + + + LOJA SE + + + LOJA_SE + + + + + + + ESPAÇO DO REVENDEDOR SE + + + ESPACO_DO_REVENDEDOR_SE + + + + + + + VENDAS IN COMPANY + + + VENDAS_IN_COMPANY + + + + + + + REGIONAL BAHIA + + + REGIONAL_BAHIA + + + + + + + CANAL LOJA 01 + + + CANAL_LOJA_01 + + + + + + + AUDITORIA + + + AUDITORIA + + + + + + + CANAL LOJA 02 + + + CANAL_LOJA_02 + + + + + + + PLANEJAMENTO DE DEMANDAS + + + PLANEJAMENTO_DE_DEMANDAS + + + + + + + PROJETOS + + + PROJETOS + + + + + + + COMPLIANCE + + + COMPLIANCE + + + + + + + ESCRITÓRIO - MATRIZ + + + ESCRITORIO_MATRIZ + + + + + + + ESCRITÓRIO - CONQUISTA + + + ESCRITORIO_CONQUISTA + + + + + + + REGIONAL SERGIPE + + + REGIONAL_SERGIPE + + + + + + + Transferencia + + + Transferencia + + + + + + + Fiscal + + + Fiscal + + + + + + + motoristaAL + + + motoristaAL + + + + + + + motoristaBA + + + motoristaBA + + + + + + + motoristaSE + + + motoristaSE + + + + + + + expediente + + + Default + + + Expediente BackOffice, Logística e Motorista + + + Expediente Escritório Matriz + + + Expediente Lojas + + + + + camposFormulario, documentoId = 43582 + + + activity + + + analistasup + + + categoriaItem + + + centroCusto + + + chaveNfe + + + codigoItem + + + codigoProdutoItem + + + currentUserId + + + currentUsermail + + + currentUserName + + + dataAbertura + + + dataColeta + + + dataEmissaoApiNfe + + + dataEmissaoNfe + + + dataEntradaNfeConsulta + + + dataEntrega + + + dataValidacaoGestor + + + descAnexo_PlanilhaItens + + + descricao + + + emailSolicitante + + + estabelecimento + + + excelUpload + + + fdAnexo_Coleta + + + fdAnexo_Entrega + + + fdAnexo_recebimento + + + fnAnexo_Nfe + + + fnAnexo_PlanilhaItens + + + formMode + + + fornecedorNfeConsulta + + + gestorEmail + + + gestorEmailE + + + gestorNome + + + gestorNomeE + + + gestor_cc + + + gestor_cce + + + invoiceIdNfeConsulta + + + itensNfeConsulta + + + itensNfeJson + + + justificativa + + + justificativaDecisaoGestor + + + justificativaDecisaoItens + + + lojaNfeConsulta + + + motoristaColetaLogin + + + motoristaColetaNome + + + motoristaEntregaLogin + + + motoristaEntregaNome + + + motoristaEntregaSelecionado + + + nomerecebedor + + + numeroNfeConsulta + + + operacaoNfeConsulta + + + productIdItem + + + qtdDivergenciasGestor + + + qtdDivergenciasNfe + + + quantidadeAprovadaGestor + + + quantidadeItem + + + requesterId + + + requesterMail + + + requesterName + + + serieNfeConsulta + + + situacaoNfeConsulta + + + storeIdNfeConsulta + + + tipoMotoristaEntrega + + + ufDestino + + + ufOrigem + + + userValidacaoGestor + + + usuarioEmissorNfe + + + validacaoItens + + + valorNfeConsulta + + + WKNumProces + + + + + diff --git a/compras_digital/.vscode/servers.json b/compras_digital/.vscode/servers.json index 5ae09ec..934d36f 100644 --- a/compras_digital/.vscode/servers.json +++ b/compras_digital/.vscode/servers.json @@ -2,13 +2,13 @@ "version": "1.0.0", "configurations": [ { - "id": "uyzzp0mq8qomoutcaz19tssb58lcc7", + "id": "o9cixezp329movgapv2risawf8wvym", "name": "Ginseng Produção", "host": "comerciode188006.fluig.cloudtotvs.com.br", "ssl": true, "port": 443, "username": "andrey.cunha", - "password": "eyJpdiI6IjAyMjdkMjdmZDI1NTczYzFkZmUwMGU4ZWExMWRjZTBmIiwic2FsdCI6ImExMjJlYjdiZDA0MmM3ZGUzYjU3Y2I4YWU4NTUwYzE5IiwidGV4dCI6ImQ2Y2Q4ZjFhNjk0MmQ0MGFhMjQ0NzhjMzExODhiZGQ2In0=", + "password": "eyJpdiI6IjM5MGNhMzMwMWIyNWI2ZDMyYmVmM2FiNDg5NzQ3NzZhIiwic2FsdCI6ImU1ZWE3MDZhOWE0NGMyMjExNmE3NjIyYmRmZTdmMjNhIiwidGV4dCI6ImZkMTY4MTAwNjM0ZmQ3NmI5M2MwZjQ1YmE4NDJmMjRhIn0=", "userCode": "andrey.cunha", "confirmExporting": false, "hasBrowser": false, diff --git a/compras_digital/datasets/dsComprasCotacao.js b/compras_digital/datasets/dsComprasCotacao.js index 50674df..77eb365 100644 --- a/compras_digital/datasets/dsComprasCotacao.js +++ b/compras_digital/datasets/dsComprasCotacao.js @@ -11,6 +11,7 @@ function createDataset(fields, constraints, sortFields) { dataset.addColumn("C8_TOTAL"); dataset.addColumn("C8_FORNECE"); dataset.addColumn("C8_LOJA"); + dataset.addColumn("C8_FORNOME"); dataset.addColumn("C8_COND"); dataset.addColumn("C8_NUMSC"); dataset.addColumn("C8_ITEMSC"); @@ -32,7 +33,7 @@ function createDataset(fields, constraints, sortFields) { return [ "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", - "", "", sucesso ? "true" : "false", erro || "" + "", "", "", sucesso ? "true" : "false", erro || "" ]; } @@ -144,6 +145,7 @@ function createDataset(fields, constraints, sortFields) { item.C8_TOTAL || "", item.C8_FORNECE || "", item.C8_LOJA || "", + item.C8_FORNOME || "", item.C8_COND || "", item.C8_NUMSC || "", item.C8_ITEMSC || "", diff --git a/compras_digital/datasets/ds_consultaSC.js b/compras_digital/datasets/ds_consultaSC.js index 6e9a04b..8a088f7 100644 --- a/compras_digital/datasets/ds_consultaSC.js +++ b/compras_digital/datasets/ds_consultaSC.js @@ -24,9 +24,20 @@ function createDataset(fields, constraints, sortFields) { dataset.addColumn("sucesso"); dataset.addColumn("COTACOES_JSON"); dataset.addColumn("COTACAO_ERRO"); + dataset.addColumn("PEDIDO_JSON"); + dataset.addColumn("PEDIDO_ERRO"); function emptyRow() { - return ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "false", "", ""]; + return ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "false", "", "", "", ""]; + } + + function documentoValido(valor) { + var v = String(valor || "").trim().toUpperCase(); + if (!v) return false; + if (/^0+$/.test(v)) return false; + if (/^X+$/.test(v)) return false; + if (v == "XXXX" || v == "XXXXXX") return false; + return true; } function consultarCotacao(clientService, cotacao) { @@ -80,6 +91,57 @@ function createDataset(fields, constraints, sortFields) { }; } + function consultarPedido(clientService, pedido) { + var endpoints = [ + "/UF_MATA120/" + pedido, + "/rest/UF_MATA120/" + pedido, + "/rest/uf_mata120/" + pedido + ]; + + var ultimoErro = ""; + for (var i = 0; i < endpoints.length; i++) { + try { + var dataPed = { + companyId: "1", + serviceCode: "Postprod", + endpoint: endpoints[i], + method: "get", + timeoutService: "60000", + headers: { + "Content-Type": "application/json" + } + }; + + var responsePed = clientService.invoke(JSON.stringify(dataPed)); + if (!responsePed || !responsePed.getResult()) { + ultimoErro = "Sem resposta ao consultar pedido"; + continue; + } + + var resultPed = JSON.parse(responsePed.getResult()); + if (resultPed && resultPed.sucesso && resultPed.pedidos && resultPed.pedidos.length > 0) { + return { + sucesso: true, + pedidos: resultPed.pedidos + }; + } + + if (resultPed && resultPed.message) { + ultimoErro = String(resultPed.message); + } else { + ultimoErro = "Pedido sem itens retornados"; + } + } catch (ePed) { + ultimoErro = String(ePed); + } + } + + return { + sucesso: false, + erro: ultimoErro || "Falha ao consultar pedido" + }; + } + try { var numeroSC = null; if (constraints != null) { @@ -130,6 +192,18 @@ function createDataset(fields, constraints, sortFields) { } } + var pedido = String(sc.C1_PEDIDO || "").trim(); + var pedidoJson = ""; + var pedidoErro = ""; + if (documentoValido(pedido)) { + var consultaPed = consultarPedido(clientService, pedido); + if (consultaPed.sucesso) { + pedidoJson = JSON.stringify(consultaPed.pedidos || []); + } else { + pedidoErro = consultaPed.erro || ""; + } + } + dataset.addRow([ sc.C1_FILIAL || "", sc.C1_NUM || "", @@ -153,7 +227,9 @@ function createDataset(fields, constraints, sortFields) { result.hora_consulta || "", "true", cotacoesJson, - cotacaoErro + cotacaoErro, + pedidoJson, + pedidoErro ]); } else { dataset.addRow(emptyRow()); diff --git a/compras_digital/forms/Compras_digital/Compras_digital.html b/compras_digital/forms/Compras_digital/Compras_digital.html index 7c4501e..f60c659 100644 --- a/compras_digital/forms/Compras_digital/Compras_digital.html +++ b/compras_digital/forms/Compras_digital/Compras_digital.html @@ -61,7 +61,7 @@ .sc-status-panel { margin-top: 15px; - padding: 18px; + padding: 10px; border: 1px solid #d8e1e8; border-radius: 12px; background: #f7fafc; @@ -71,27 +71,27 @@ .sc-primary-grid, .sc-secondary-grid { display: grid; - grid-template-columns: repeat(3, minmax(220px, 1fr)); - gap: 12px; + grid-template-columns: repeat(3, minmax(150px, 1fr)); + gap: 8px; } .sc-primary-grid { - margin-bottom: 12px; + margin-bottom: 8px; } .sc-secondary-grid { - gap: 8px 12px; + gap: 8px; } .sc-info { background: #fff; - border-radius: 10px; - padding: 12px 14px; - min-height: 72px; + border-radius: 8px; + padding: 8px 10px; + min-height: 52px; } .sc-info--primary { - border-left: 4px solid #04506b; + border-left: 3px solid #04506b; box-shadow: inset 0 0 0 1px #d9e4ec; } @@ -111,32 +111,39 @@ } .sc-label { - font-size: 11px; + font-size: 10px; color: #4d6073; letter-spacing: .04em; text-transform: uppercase; - margin-bottom: 4px; + margin-bottom: 3px; } .sc-value { - font-size: 15px; + font-size: 13px; font-weight: 600; color: #24313f; word-break: break-word; } .sc-info--primary .sc-value { - font-size: 30px; - line-height: 1.1; + font-size: 13px; + line-height: 1.25; color: #102a43; font-weight: 700; letter-spacing: .01em; } + .sc-info--secondary .sc-value { + font-size: 13px; + line-height: 1.25; + color: #173750; + font-weight: 700; + } + .sc-hint { display: block; - margin-top: 6px; - font-size: 11px; + margin-top: 4px; + font-size: 10px; color: #5f7386; letter-spacing: .02em; } @@ -144,14 +151,29 @@ .sc-value.badge { display: inline-flex; align-items: center; - min-height: 30px; - padding: 6px 12px; + min-height: 24px; + padding: 4px 10px; border-radius: 999px; - font-size: 12px; + font-size: 11px; font-weight: 700; line-height: 1; } + /* Exibe apenas texto (sem fundo) nos status resumidos */ + #statusSCProtheus_label, + #statusSC_label, + #cotacaoResultado_label { + background: transparent !important; + border-radius: 0 !important; + min-height: 0 !important; + padding: 0 !important; + display: inline !important; + font-size: 13px !important; + font-weight: 700 !important; + line-height: 1.25 !important; + color: #1f3f56 !important; + } + .sc-timeline-wrap { margin-top: 16px; padding-top: 0; @@ -166,11 +188,25 @@ .sc-timeline-wrap.is-open { padding-top: 14px; border-top-color: #d7e2eb; - max-height: 640px; + max-height: 3400px; opacity: 1; pointer-events: auto; } + .sc-timeline-layout { + display: grid; + grid-template-columns: minmax(0, 1.3fr) minmax(0, 1fr); + gap: 12px; + align-items: start; + } + + .sc-timeline-panel { + padding: 12px; + border-radius: 10px; + background: #fff; + box-shadow: inset 0 0 0 1px #dfe8f0; + } + .sc-timeline-wrap.is-focus { background: #f2f9ff; border-radius: 8px; @@ -179,7 +215,7 @@ .sc-timeline-title { margin: 0 0 10px; color: #12344d; - font-size: 14px; + font-size: 13px; font-weight: 700; letter-spacing: .01em; } @@ -242,7 +278,7 @@ .sc-timeline-event { color: #18354f; - font-size: 14px; + font-size: 13px; font-weight: 700; } @@ -280,84 +316,218 @@ list-style: none; } - .sc-cotacao-item { - display: flex; - align-items: center; - justify-content: space-between; - gap: 10px; - padding: 8px 0; - border-top: 1px solid #edf2f7; + .sc-cotacao-kpis { + display: grid; + grid-template-columns: repeat(3, minmax(120px, 1fr)); + gap: 8px; + margin-bottom: 10px; } - .sc-cotacao-item:first-child { - border-top: 0; - padding-top: 0; + .sc-cotacao-kpi { + background: #f6f9fc; + border: 1px solid #e2eaf2; + border-radius: 8px; + padding: 8px 10px; } - .sc-cotacao-item:last-child { - padding-bottom: 0; + .sc-cotacao-kpi-label { + display: block; + font-size: 10px; + color: #65798c; + letter-spacing: .04em; + text-transform: uppercase; + margin-bottom: 3px; } - .sc-cotacao-item-info { - color: #324a5f; + .sc-cotacao-kpi-value { font-size: 13px; + font-weight: 700; + color: #102a43; } - .sc-cotacao-item-info strong { + .sc-cotacao-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); + gap: 10px; + } + + .sc-cotacao-card { + border: 1px solid #dfe8f0; + border-left: 4px solid #8ea5b8; + border-radius: 10px; + padding: 10px 12px; + background: #fff; + } + + .sc-cotacao-card--winner { + border-left-color: #18aa46; + box-shadow: 0 0 0 1px rgba(24, 170, 70, .15); + } + + .sc-cotacao-card--homologado { + border-left-color: #20a7d8; + } + + .sc-cotacao-card--novo { + border-left-color: #2e86ff; + } + + .sc-cotacao-card--perdedor { + border-left-color: #e3a225; + } + + .sc-cotacao-top { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 8px; + } + + .sc-cotacao-top > div { + min-width: 0; + flex: 1 1 auto; + padding-right: 4px; + } + + .sc-cotacao-supplier { color: #20384d; + font-size: 13px; font-weight: 700; + line-height: 1.25; + overflow-wrap: anywhere; + word-break: break-word; } - #tbCotacao { - table-layout: fixed; - width: 100%; - margin-bottom: 0; + .sc-cotacao-code { + color: #62768a; + font-size: 12px; + margin-top: 2px; + overflow-wrap: anywhere; + word-break: break-word; } - #tbCotacao thead th { - background: #eef3f8; - color: #3b4d5f; + .sc-cotacao-top .badge { + align-self: start; + flex: 0 0 auto; + white-space: nowrap; + margin: 0 0 0 6px; + } + + .sc-cotacao-meta { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 8px; + margin-top: 8px; + } + + .sc-cotacao-meta-box { + background: #f8fbfd; + border: 1px solid #e6edf3; + border-radius: 8px; + padding: 7px 8px; + } + + .sc-cotacao-meta-label { + display: block; + font-size: 10px; + color: #6b7f92; + text-transform: uppercase; + letter-spacing: .04em; + margin-bottom: 2px; + } + + .sc-cotacao-meta-value { + font-size: 14px; font-weight: 700; + color: #1f384d; } - #tbCotacao tbody tr:nth-child(odd) { + .sc-cotacao-footer { + margin-top: 8px; + display: flex; + flex-wrap: wrap; + gap: 10px; + color: #4d6479; + font-size: 12px; + } + + .sc-cotacao-empty { + border: 1px dashed #c6d5e2; + border-radius: 8px; + padding: 10px; + font-size: 13px; + color: #4f657a; background: #f9fbfd; } - #tbCotacao tbody td, - #tbCotacao thead th, - #tbCotacao tfoot td { - vertical-align: middle; + .sc-pedido-track { + margin-top: 12px; + padding: 12px; + border-radius: 10px; + background: #fff; + box-shadow: inset 0 0 0 1px #dfe8f0; } - #tbCotacao th:nth-child(3), - #tbCotacao th:nth-child(4), - #tbCotacao th:nth-child(5), - #tbCotacao td:nth-child(3), - #tbCotacao td:nth-child(4), - #tbCotacao td:nth-child(5) { - text-align: right; + .sc-timeline-layout .sc-pedido-track { + margin-top: 0; } - #tbCotacao td:nth-child(3) input, - #tbCotacao td:nth-child(4) input, - #tbCotacao td:nth-child(5) input { - text-align: right; + .sc-pedido-resumo { + margin-top: 8px; + margin-bottom: 8px; + color: #26455d; + font-size: 13px; + line-height: 1.45; } - #tbCotacao tfoot .sc-total-label { - text-align: right; + .sc-pedido-assinaturas { + display: grid; + grid-template-columns: 1fr; + gap: 8px; + } + + .sc-pedido-ass-card { + border: 1px solid #e3ebf2; + border-left: 4px solid #90a8bd; + border-radius: 8px; + padding: 8px 10px; + background: #fbfdff; + } + + .sc-pedido-ass-card.aprovado { + border-left-color: #1aad4f; + } + + .sc-pedido-ass-card.pendente { + border-left-color: #e2a223; + } + + .sc-pedido-ass-card.bloqueado { + border-left-color: #d64f4f; + } + + .sc-pedido-ass-header { + display: flex; + align-items: flex-start; + justify-content: space-between; + flex-wrap: wrap; + gap: 8px; + margin-bottom: 4px; + } + + .sc-pedido-ass-title { + color: #1f3f56; + font-size: 13px; font-weight: 700; - background: #edf3f8; - color: #324a60; } - #tbCotacao tfoot .sc-total-value { - background: #edf3f8; - color: #12344d; - font-size: 15px; - font-weight: 700; - text-align: right; + .sc-pedido-ass-meta { + display: flex; + flex-wrap: wrap; + gap: 10px; + color: #4b6176; + font-size: 12px; + line-height: 1.35; } @media (max-width: 992px) { @@ -365,6 +535,10 @@ .sc-secondary-grid { grid-template-columns: repeat(2, minmax(180px, 1fr)); } + + .sc-timeline-layout { + grid-template-columns: 1fr; + } } @media (max-width: 640px) { @@ -374,7 +548,19 @@ } .sc-info--primary .sc-value { - font-size: 24px; + font-size: 13px; + } + + .sc-info--secondary .sc-value { + font-size: 13px; + } + + .sc-cotacao-top { + flex-wrap: wrap; + } + + .sc-cotacao-top .badge { + margin-left: 0; } } @@ -410,6 +596,7 @@ + @@ -667,285 +854,76 @@ Clique para ver a linha do tempo
-
Status Cadastro
- - -
-
-
Andamento
- - -
- - -
-
-
Solicitante
-
-
-
-
-
Emissão
-
-
-
-
-
Qtd. Itens
-
-
-
-
-
Data do Cadastro
-
- às -
-
-
Cotação
-
-
+
Pedido
-
+
+
+
Status Cadastro
+ - +
+
+
Andamento
+ - +
+
+
Emissão
+
-
+
+
+
-

Linha do tempo da SC

- +
+
+

Linha do tempo da SC

+
    +
    + +
    +
    +

    Aprovação do pedido

    + Sem pedido +
    +
    Sem pedido vinculado.
    +
    +
    Sem assinaturas para exibir.
    +
    +
    +

    Acompanhamento da cotação

    Sem cotação
    -
      -
    • - Aguardando vínculo da cotação na SC. -
    • -
    -
    -
    -
    - - -
    -
    -
    -
    Consulta Cotação
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ItemProdutoQtdPreçoTotalSelecionar
    Total selecionadoR$ 0,00
    -
    -
    -
    - - -
    -
    -
    -

    Aprovar cotação

    -
    Análise da cotação
    -
    -
    - -
    -
    -
    -
    - - +
    +
    + Cotações + 0 +
    +
    + Com pedido + 0 +
    +
    + Menor total + - +
    -
    - - -
    -
    -
    -
    - -
    -
    -
    -
    - - - +
    +
    Aguardando vínculo da cotação na SC.
    - -
    -
    -
    -

    Aprovação do Gestor do C.Custo

    -
    Aprovação da cotação
    -
    -
    - -
    -
    -
    -
    - - -
    -
    - - -
    -
    -
    -
    - -
    -
    -
    -
    - - - -
    -
    - - -
    -
    -
    -
    -
    - -
    -
    -
    -

    Aprovação do Gerente Financeiro

    -
    Aprovação do Gerente Financeiro
    -
    -
    - -
    -
    -
    -
    - - -
    -
    - - -
    -
    -
    -
    - -
    -
    -
    -
    - - - -
    -
    - - -
    -
    - - -
    -
    -
    -
    -
    - -
    -
    -
    -

    Aprovação CEO

    -
    Aprovação do CEO
    -
    -
    - -
    -
    -
    -
    - - -
    -
    - - -
    -
    -
    -
    - -
    -
    -
    -
    - - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    -
    -
    -
    +

    @@ -955,14 +933,6 @@
    -
    - -
    - ⏳ Aguardando geração do pedido... -
    -
    - -
    diff --git a/compras_digital/forms/Compras_digital/compras_digital.js b/compras_digital/forms/Compras_digital/compras_digital.js index 27fe6f4..80685a5 100644 --- a/compras_digital/forms/Compras_digital/compras_digital.js +++ b/compras_digital/forms/Compras_digital/compras_digital.js @@ -410,17 +410,29 @@ function badgeClassByStatus(status) { var s = String(status || "").toLowerCase(); if (!s) return "badge bg-secondary"; if (s.indexOf("erro") >= 0 || s.indexOf("reprov") >= 0 || s.indexOf("cancel") >= 0) return "badge bg-danger"; - if (s.indexOf("sucesso") >= 0 || s.indexOf("aprov") >= 0 || s.indexOf("gerad") >= 0 || s.indexOf("liberad") >= 0) return "badge bg-success"; if (s.indexOf("aguard") >= 0 || s.indexOf("pend") >= 0) return "badge bg-warning"; + if (s.indexOf("sucesso") >= 0 || s.indexOf("aprov") >= 0 || s.indexOf("gerad") >= 0 || s.indexOf("liberad") >= 0) return "badge bg-success"; + if (s.indexOf("bloque") >= 0 || s.indexOf("rejeit") >= 0) return "badge bg-danger"; return "badge bg-info"; } function setBadge(selector, valor) { var texto = String(valor || "").trim() || "-"; + var classe = badgeClassByStatus(texto); + var textoLower = texto.toLowerCase(); + + // Mantem os badges de resumo da SC sem destaque verde para sucesso/geracao. + if ( + (selector === "#statusSCProtheus_label" && textoLower.indexOf("sc cadastrada com sucesso") >= 0) || + (selector === "#statusSC_label" && textoLower.indexOf("pedido gerado") >= 0) + ) { + classe = "badge bg-info"; + } + $(selector) .text(texto) .removeClass("bg-secondary bg-success bg-danger bg-warning bg-info") - .addClass(badgeClassByStatus(texto)); + .addClass(classe); } function normalizarStatusCadastro(statusCadastro, numeroSC) { @@ -487,11 +499,35 @@ function possuiFornecedorCotacao(row) { return !!(fornece && loja); } +function textoUtilFornecedor(valor) { + var txt = String(valor || "").trim(); + if (!txt) return ""; + if (txt === "-" || txt === "--") return ""; + if (txt.toUpperCase() === "NULL") return ""; + return txt; +} + +function obterNomeFornecedorCompleto(row) { + var candidatos = [ + textoUtilFornecedor(row.C8_FORNOME), + textoUtilFornecedor(row.A2_NOME), + textoUtilFornecedor(row.A2_NREDUZ) + ].filter(function (v) { return !!v; }); + + if (!candidatos.length) return ""; + + candidatos.sort(function (a, b) { + if (b.length !== a.length) return b.length - a.length; + return a.localeCompare(b); + }); + return candidatos[0]; +} + function classificarLinhaCotacao(row) { var status = String(row.STATUS || "").trim().toUpperCase(); if (linhaCotacaoVencedora(row)) { - return { tipo: "PEDIDO_GERADO", label: "VENCEDOR", badge: "badge bg-success", tipoFornecedor: "Fornecedor homologado" }; + return { tipo: "PEDIDO_GERADO", label: "GANHOU", badge: "badge bg-success", tipoFornecedor: "Fornecedor homologado" }; } if (possuiFornecedorCotacao(row)) { @@ -499,7 +535,7 @@ function classificarLinhaCotacao(row) { } if (status.indexOf("PEDIDO_GERADO") >= 0) { - return { tipo: "PERDEDOR", label: "PERDEDOR", badge: "badge bg-warning", tipoFornecedor: "-" }; + return { tipo: "PERDEDOR", label: "", badge: "badge bg-warning", tipoFornecedor: "-" }; } if (!possuiFornecedorCotacao(row)) { @@ -515,6 +551,41 @@ function formatarValorCotacao(valor) { return floatToBRL(parseNumeroCotacao(txt)); } +function formatarDocumentoVisual(valor) { + var txt = String(valor || "").trim(); + if (!txt || documentoEhPlaceholder(txt)) return "-"; + return txt; +} + +function classeCardCotacao(tipo) { + if (tipo === "PEDIDO_GERADO") return "sc-cotacao-card sc-cotacao-card--winner"; + if (tipo === "FORNECEDOR_HOMOLOGADO") return "sc-cotacao-card sc-cotacao-card--homologado"; + if (tipo === "NOVO_FORNECEDOR") return "sc-cotacao-card sc-cotacao-card--novo"; + if (tipo === "PERDEDOR") return "sc-cotacao-card sc-cotacao-card--perdedor"; + return "sc-cotacao-card"; +} + +function renderizarResumoCotacao(totalCotacoes, totalComPedido, menorTotal) { + var alvo = $("#cotacaoResultadoResumo"); + if (!alvo.length) return; + + var menorTxt = (menorTotal !== null) ? floatToBRL(menorTotal) : "-"; + alvo.html([ + '
    ', + ' Quantidade', + ' ' + escapeHTML(String(totalCotacoes || 0)) + "", + "
    ", + '
    ', + ' Pedidos Gerados', + ' ' + escapeHTML(String(totalComPedido || 0)) + "", + "
    ", + '
    ', + ' Menor Valor', + ' ' + escapeHTML(menorTxt) + "", + "
    " + ].join("")); +} + function comporDataHora(data, hora) { var d = String(data || "").trim(); var h = String(hora || "").trim(); @@ -614,13 +685,14 @@ function renderizarResultadoCotacao(resumo) { if (!resumo || !resumo.detalhes || !resumo.detalhes.length) { setBadge("#cotacaoResultado_label", "Sem cotacao"); - lista.html('
  • Aguardando vinculo da cotacao na SC.
  • '); + renderizarResumoCotacao(0, 0, null); + lista.html('
    Aguardando vinculo da cotacao na SC.
    '); return; } var statusResumo = "Sem fornecedor definido"; if ((resumo.qtdPedidoGerado || 0) > 0) { - statusResumo = "Pedido gerado em " + resumo.qtdPedidoGerado + " item(ns)"; + statusResumo = "Cotacao concluida"; } else if ((resumo.qtdFornecedorHomologado || 0) > 0) { statusResumo = "Fornecedor homologado em " + resumo.qtdFornecedorHomologado + " item(ns)"; } else if ((resumo.qtdNovoFornecedor || 0) > 0) { @@ -629,24 +701,69 @@ function renderizarResultadoCotacao(resumo) { setBadge("#cotacaoResultado_label", statusResumo); - var html = resumo.detalhes.map(function (linha) { + var detalhesOrdenados = resumo.detalhes.slice().sort(function (a, b) { + var pesoA = (a.tipo === "PEDIDO_GERADO") ? 0 : 1; + var pesoB = (b.tipo === "PEDIDO_GERADO") ? 0 : 1; + if (pesoA !== pesoB) return pesoA - pesoB; + + var totalA = parseNumeroCotacao(a.total); + var totalB = parseNumeroCotacao(b.total); + if (totalA === totalB) return 0; + return totalA - totalB; + }); + + var menorTotal = null; + var totalComPedido = 0; + for (var i = 0; i < detalhesOrdenados.length; i++) { + var t = parseNumeroCotacao(detalhesOrdenados[i].total); + if (t > 0 && (menorTotal === null || t < menorTotal)) menorTotal = t; + if (!documentoEhPlaceholder(detalhesOrdenados[i].pedido)) totalComPedido++; + } + renderizarResumoCotacao(detalhesOrdenados.length, totalComPedido, menorTotal); + + var html = detalhesOrdenados.map(function (linha) { var numeroTxt = escapeHTML(linha.numero || "-"); var itemTxt = escapeHTML(linha.item || "-"); var produtoTxt = escapeHTML(linha.produto || "-"); + var fornecedorNomeTxt = escapeHTML(linha.fornecedorNome || linha.fornecedor || "Fornecedor nao informado"); var fornecedorTxt = escapeHTML(linha.fornecedor || "-"); var tipoFornecedorTxt = escapeHTML(linha.tipoFornecedor || "-"); var precoTxt = escapeHTML(formatarValorCotacao(linha.preco)); var totalTxt = escapeHTML(formatarValorCotacao(linha.total)); - var pedidoTxt = escapeHTML(linha.pedido || "-"); + var pedidoTxt = escapeHTML(formatarDocumentoVisual(linha.pedido)); var statusApiTxt = escapeHTML(linha.statusApi || "-"); - var statusTxt = escapeHTML(linha.label || "EM COTACAO"); + var statusRaw = String(linha.label || "").trim(); + var statusTxt = escapeHTML(statusRaw); var badgeStatus = linha.badge || "badge bg-secondary"; + var classeCard = classeCardCotacao(linha.tipo); + var qtdTxt = escapeHTML(String(linha.quantidade || "-")); + var entregaTxt = escapeHTML(normalizarDataProtheus(linha.dataPrevista || "")); + var condicaoTxt = escapeHTML(linha.condicao || "-"); return [ - '
  • ', - ' Cotacao ' + numeroTxt + ' | Item ' + itemTxt + " | Produto: " + produtoTxt + " | Fornecedor: " + fornecedorTxt + " | Tipo: " + tipoFornecedorTxt + " | Preco: " + precoTxt + " | Total: " + totalTxt + " | Pedido: " + pedidoTxt + " | Status: " + statusApiTxt + "", - ' ' + statusTxt + "", - "
  • " + '
    ', + '
    ', + "
    ", + '
    ' + fornecedorNomeTxt + "
    ", + '
    Fornecedor: ' + fornecedorTxt + " | Tipo: " + tipoFornecedorTxt + "
    ", + "
    ", + statusRaw ? (' ' + statusTxt + "") : "", + "
    ", + '
    ', + '
    Preco unitario' + precoTxt + "
    ", + '
    Total' + totalTxt + "
    ", + "
    ", + ' ", + "
    " ].join(""); }).join(""); @@ -658,13 +775,166 @@ function renderizarErroCotacao(mensagem) { if (!lista.length) return; setBadge("#cotacaoResultado_label", "Erro consulta cotacao"); + renderizarResumoCotacao(0, 0, null); lista.html( - '
  • ' + + '
    ' + escapeHTML(mensagem || "Nao foi possivel carregar a cotacao no momento.") + - "
  • " + "
    " ); } +function mapearStatusAlcada(codigo) { + var status = String(codigo || "").trim(); + if (status === "01") return { label: "Pendente em niveis anteriores", badge: "badge bg-warning", classe: "pendente" }; + if (status === "02") return { label: "Pendente", badge: "badge bg-warning", classe: "pendente" }; + if (status === "03") return { label: "Aprovado", badge: "badge bg-success", classe: "aprovado" }; + if (status === "04") return { label: "Bloqueado", badge: "badge bg-danger", classe: "bloqueado" }; + if (status === "05") return { label: "Aprovado/rejeitado pelo nivel", badge: "badge bg-info", classe: "pendente" }; + if (status === "06") return { label: "Rejeitado", badge: "badge bg-danger", classe: "bloqueado" }; + if (status === "07") return { label: "Documento rejeitado ou bloqueado por outro usuario", badge: "badge bg-danger", classe: "bloqueado" }; + return { label: status ? ("Status " + status) : "Sem status", badge: "badge bg-secondary", classe: "" }; +} + +function primeiroTextoPreenchido() { + for (var i = 0; i < arguments.length; i++) { + var txt = String(arguments[i] || "").trim(); + if (txt) return txt; + } + return ""; +} + +function montarResumoRastreioPedido(pedidos, numeroPedido) { + if (!pedidos || !pedidos.length) return null; + + var pedidoFiltro = normalizarCodigoComparacao(numeroPedido); + var pedidoBase = null; + for (var i = 0; i < pedidos.length; i++) { + var num = normalizarCodigoComparacao(String((pedidos[i] || {}).C7_NUM || "")); + if (!pedidoFiltro || num === pedidoFiltro) { + pedidoBase = pedidos[i]; + break; + } + } + if (!pedidoBase) pedidoBase = pedidos[0]; + + var assinaturas = []; + var vistos = {}; + + for (var j = 0; j < pedidos.length; j++) { + var ped = pedidos[j] || {}; + var alcadas = ped.ALCADAS || []; + for (var k = 0; k < alcadas.length; k++) { + var a = alcadas[k] || {}; + var chave = [ + String(a.CR_TIPO || "").trim(), + String(a.CR_USER || "").trim(), + String(a.CR_USERLIB || "").trim(), + String(a.CR_STATUS || "").trim(), + String(a.CR_PRAZO || "").trim(), + String(a.CR_DATALIB || "").trim() + ].join("|"); + if (vistos[chave]) continue; + vistos[chave] = true; + + var statusInfo = mapearStatusAlcada(a.CR_STATUS); + assinaturas.push({ + statusCodigo: String(a.CR_STATUS || "").trim(), + statusLabel: statusInfo.label, + badge: statusInfo.badge, + classe: statusInfo.classe, + tipo: String(a.CR_TIPO || "").trim(), + prazo: normalizarDataProtheus(a.CR_PRAZO), + dataLiberacao: normalizarDataProtheus(a.CR_DATALIB), + usuario: primeiroTextoPreenchido(a.CR_USER_NOME, a.AK_NOME, a.CR_USER), + usuarioLiberacao: primeiroTextoPreenchido(a.CR_USERLIB_NOME, a.AK_NOME_USERLIB, a.CR_USERLIB) + }); + } + } + + var resumo = { + numero: String(pedidoBase.C7_NUM || "").trim(), + statusPedido: String(pedidoBase.STATUS || "").trim(), + fornecedor: primeiroTextoPreenchido(pedidoBase.A2_NOME, pedidoBase.A2_NREDUZ, pedidoBase.C7_FORNECE), + emissao: normalizarDataProtheus(pedidoBase.C7_EMISSAO), + entrega: normalizarDataProtheus(pedidoBase.C7_DATPRF), + assinaturas: assinaturas + }; + + return resumo; +} + +function renderizarErroRastreioPedido(mensagem) { + setBadge("#pedidoRastreio_label", "Erro no rastreio"); + $("#pedidoRastreioResumo").text("Nao foi possivel consultar o rastreio do pedido."); + $("#pedidoRastreioAssinaturas").html( + '
    ' + escapeHTML(mensagem || "Erro ao consultar rastreio.") + "
    " + ); +} + +function renderizarRastreioPedido(resumo) { + var badge = $("#pedidoRastreio_label"); + var resumoEl = $("#pedidoRastreioResumo"); + var lista = $("#pedidoRastreioAssinaturas"); + if (!badge.length || !resumoEl.length || !lista.length) return; + + if (!resumo || !resumo.numero) { + setBadge("#pedidoRastreio_label", "Sem pedido"); + resumoEl.text("Sem pedido vinculado."); + lista.html('
    Sem assinaturas para exibir.
    '); + return; + } + + var possuiBloqueio = resumo.assinaturas.some(function (a) { return a.classe === "bloqueado"; }); + var possuiPendente = resumo.assinaturas.some(function (a) { return a.classe === "pendente"; }); + var todosAprovados = resumo.assinaturas.length > 0 && resumo.assinaturas.every(function (a) { return a.statusCodigo === "03"; }); + + var statusTopo = "Pedido pendente"; + if (possuiBloqueio) statusTopo = "Pedido bloqueado"; + else if (todosAprovados) statusTopo = "Pedido aprovado"; + else if (!possuiPendente && resumo.statusPedido) statusTopo = resumo.statusPedido; + setBadge("#pedidoRastreio_label", statusTopo); + + var resumoTxt = "Pedido " + (resumo.numero || "-"); + if (resumo.fornecedor) resumoTxt += " | Fornecedor: " + resumo.fornecedor; + if (resumo.emissao) resumoTxt += " | Emissao: " + resumo.emissao; + if (resumo.entrega) resumoTxt += " | Entrega: " + resumo.entrega; + resumoEl.text(resumoTxt); + + if (!resumo.assinaturas.length) { + lista.html('
    Pedido encontrado, mas sem alcadas retornadas pela API.
    '); + return; + } + + var html = resumo.assinaturas.map(function (a, idx) { + var classeCard = "sc-pedido-ass-card" + (a.classe ? (" " + a.classe) : ""); + var nivel = "Nivel " + (idx + 1); + var usuario = escapeHTML(a.usuario || "-"); + var usuarioLib = escapeHTML(a.usuarioLiberacao || "-"); + var prazo = escapeHTML(a.prazo || "-"); + var dataLib = escapeHTML(a.dataLiberacao || "-"); + var tipo = escapeHTML(a.tipo || "-"); + var statusLabel = escapeHTML(a.statusLabel || "-"); + var badgeStatus = a.badge || "badge bg-secondary"; + + return [ + '
    ', + '
    ', + '
    ' + nivel + " - " + usuario + "
    ", + ' ' + statusLabel + "", + "
    ", + '
    ', + ' Tipo: ' + tipo + "", + ' Prazo: ' + prazo + "", + ' Data liberacao: ' + dataLib + "", + ' Liberado por: ' + usuarioLib + "", + "
    ", + "
    " + ].join(""); + }).join(""); + + lista.html(html); +} + function montarResumoCotacaoPorLinhas(rows, cotacao) { if (!rows || !rows.length) return null; @@ -699,10 +969,14 @@ function montarResumoCotacaoPorLinhas(rows, cotacao) { detalhes.push({ numero: String(row.C8_NUM || "").trim(), item: item, - produto: String(row.C8_PRODUTO || "").trim(), + produto: String(row.B1_DESC || row.C8_DESCRI || row.C8_PRODUTO || "").trim(), + quantidade: String(row.C8_QUANT || "").trim(), + condicao: String(row.C8_COND || "").trim(), + dataPrevista: String(row.C8_DATPRF || "").trim(), fornecedor: possuiFornecedorCotacao(row) ? (String(row.C8_FORNECE || "").trim() + "/" + String(row.C8_LOJA || "").trim()) : "", + fornecedorNome: obterNomeFornecedorCompleto(row), preco: row.C8_PRECO, total: row.C8_TOTAL, pedido: String(row.C8_NUMPED || "").trim(), @@ -881,7 +1155,7 @@ function montarStatusAndamento(scRow, cotacao, pedido) { return ""; } -function preencherResumoSC(resumoCotacao, erroCotacao) { +function preencherResumoSC(resumoCotacao, erroCotacao, resumoPedido, erroPedido) { var numero = valorCampo("numeroSCProtheus"); var statusCadastro = valorCampo("statusSCProtheus"); var solicitante = valorCampo("solicitanteSCProtheus"); @@ -934,6 +1208,14 @@ function preencherResumoSC(resumoCotacao, erroCotacao) { } else { renderizarResultadoCotacao(null); } + + if (erroPedido) { + renderizarErroRastreioPedido(erroPedido); + } else if (resumoPedido && resumoPedido.numero) { + renderizarRastreioPedido(resumoPedido); + } else { + renderizarRastreioPedido(null); + } } function consultarAndamentoSC() { @@ -974,7 +1256,19 @@ function consultarAndamentoSC() { } } - preencherResumoSC(resumoCotacao, erroCotacao); + var resumoPedido = null; + var erroPedido = String(row.PEDIDO_ERRO || "").trim(); + var jsonPedido = String(row.PEDIDO_JSON || "").trim(); + if (jsonPedido) { + try { + var pedidos = JSON.parse(jsonPedido); + resumoPedido = montarResumoRastreioPedido(pedidos, pedido); + } catch (ePed) { + if (!erroPedido) erroPedido = "Falha ao ler rastreio do pedido retornado pelo ds_consultaSC"; + } + } + + preencherResumoSC(resumoCotacao, erroCotacao, resumoPedido, erroPedido); } catch (e) { console.warn("Nao foi possivel consultar andamento da SC no ds_consultaSC:", e); } @@ -1001,47 +1295,11 @@ function parseNumeroCotacao(valor) { return parseFloat(texto) || 0; } -function recalcularTotalCotacao() { - var soma = 0; - - $("input[name^='selecionado___']").each(function() { - var idCampo = String($(this).attr("id") || ""); - if (idCampo.indexOf("___") < 0) return; - var idx = idCampo.split("___")[1]; - - // pega qtd e preço da linha - var qtd = parseNumeroCotacao($("#qtdc___" + idx).val() || "0"); - var preco = parseNumeroCotacao($("#preco___" + idx).val() || "0"); - - // calcula total da linha - var total = qtd * preco; - - // atualiza campo total da linha - $("#total___" + idx).val(total.toFixed(2)); - - // se marcado, acumula na soma - if ($(this).is(":checked")) { - soma += total; - } - }); - - // Atualiza o hidden e dispara change pro Fluig gravar - $("#valorTotalCotacao").val(soma.toFixed(2)).trigger("change"); - $("#valorTotalCotacaoLabel").text(floatToBRL(soma)); -} -// dispara sempre que marcar/desmarcar -$(document).on("change", "input[name^='selecionado___']", function() { - recalcularTotalCotacao(); -}); - -// recalcula ao abrir a atividade -$(document).ready(function() { - recalcularTotalCotacao(); -}); - // garante que o total seja salvo antes de enviar a atividade function beforeSendValidate(numState, nextState) { - console.log("Executando beforeSendValidate, recalculando total..."); - recalcularTotalCotacao(); - return true; // precisa retornar true senão bloqueia o envio + var campoTotal = $("#valorTotalCotacao"); + if (campoTotal.length && !String(campoTotal.val() || "").trim()) { + campoTotal.val("0").trigger("change"); + } + return true; } diff --git a/compras_digital/forms/Compras_digital/events/displayFields.js b/compras_digital/forms/Compras_digital/events/displayFields.js index ff756ae..23640fd 100644 --- a/compras_digital/forms/Compras_digital/events/displayFields.js +++ b/compras_digital/forms/Compras_digital/events/displayFields.js @@ -52,4 +52,12 @@ function displayFields(form, customHTML) { } form.setValue("data_validacao_gestor", hoje); } + + // Receber produto/servico + if (activity === 18) { + if (nomeUsuario) { + form.setValue("userValidacaoItens", nomeUsuario); + } + form.setValue("dataValidacaoItens", hoje); + } } diff --git a/compras_digital/workflow/.resources/Solicitação de compras V2.ecm30.xml b/compras_digital/workflow/.resources/Solicitação de compras V2.ecm30.xml index 6d793a7..1f39bed 100644 --- a/compras_digital/workflow/.resources/Solicitação de compras V2.ecm30.xml +++ b/compras_digital/workflow/.resources/Solicitação de compras V2.ecm30.xml @@ -29,7 +29,7 @@ 1 Solicitação de compra - Ginseng - 86 + 89 9305 @@ -180,7 +180,7 @@ true false 1560 - 415 + 330 0 0 false @@ -303,58 +303,6 @@ false 1 - - - 1 - Solicitação de compras - 1 - 105 - - Selecionar cotação - Selecionar cotação - - 0 - - false - 0 - Executor Atividade - <AssignmentController><BaseActivity>1</BaseActivity><Returns>Last</Returns></AssignmentController> - 1 - false - true - false - 3600 - 3600 - 0 - 0 - false - - 0 - true - false - false - 620 - 21 - 0 - 0 - false - false - 0 - 0 - false - - 0 - 80 - 0 - false - 0 - 0 - 0 - 0 - - false - 0 - 1 @@ -369,7 +317,6 @@ false 0 - 1 false false @@ -510,210 +457,6 @@ false 0 - - - 1 - Solicitação de compras - 1 - 133 - - Aprovação Centro de custo - Aprovação Centro de custo - - 0 - - false - 0 - Campo Formulário - <AssignmentController><FormField>gestor_cc</FormField></AssignmentController> - 1 - false - true - false - 3600 - 3600 - 0 - 0 - false - - 0 - true - false - false - 910 - 110 - 0 - 0 - false - false - 0 - 0 - false - - 0 - 80 - 0 - false - 0 - 0 - 0 - 0 - - false - 0 - - - - 1 - Solicitação de compras - 1 - 137 - - Aprovação Compras - Aprovação Compras - - 0 - - false - 0 - - 1 - false - true - false - 3600 - 3600 - 0 - 0 - false - - 0 - true - false - false - 800 - 225 - 0 - 0 - false - false - 0 - 0 - false - - 0 - 80 - 0 - false - 0 - 0 - 0 - 0 - - false - 0 - - - - 1 - Solicitação de compras - 1 - 147 - - Aprovação GERF - Aprovação GERF - - 0 - - false - 0 - - 1 - false - true - false - 3600 - 3600 - 0 - 0 - false - - 0 - true - false - false - 1060 - 429 - 0 - 0 - false - false - 0 - 0 - false - - 0 - 80 - 0 - false - 0 - 0 - 0 - 0 - - false - 0 - - - - 1 - Solicitação de compras - 1 - 158 - - Aprovação CEO - Aprovação CEO - - 0 - - false - 0 - 1 - false - true - false - 3600 - 3600 - 0 - 0 - false - - 0 - true - false - false - 1340 - 520 - 0 - 0 - false - false - 0 - 0 - false - - 0 - 80 - 0 - false - 0 - 0 - 0 - 0 - - false - 0 - 1 @@ -833,81 +576,6 @@ false - - - 1 - Solicitação de compras - 1 - 128 - - Alçada - Alçada - false - false - false - - 0 - true - 710 - 217 - false - 1 - 120 - 0 - 0 - - false - - - - 1 - Solicitação de compras - 1 - 150 - - Valor N1 - Valor N1 - false - false - false - - 0 - true - 1090 - 100 - false - 1 - 120 - 0 - 0 - - false - - - - 1 - Solicitação de compras - 1 - 154 - - Valor N2 - Valor N2 - false - false - false - - 0 - true - 1220 - 230 - false - 1 - 120 - 0 - 0 - - false - 1 @@ -1009,7 +677,7 @@ 1 Solicitação de compras 1 - 86 + 89 46 hAPI.getCardValue("validacaoItens") == "entregue" @@ -1021,85 +689,13 @@ 1 Solicitação de compras 2 - 86 + 89 46 true 24 0 - - - 1 - Solicitação de compras - 1 - 86 - 128 - - parseFloat(hAPI.getCardValue("valorTotalCotacao")) <= 100000.00 - 137 - <AssignmentController><User>001142</User></AssignmentController> - Usuário - 0 - - - - 1 - Solicitação de compras - 1 - 86 - 150 - - parseFloat(hAPI.getCardValue("valorTotalCotacao")) >= 5001.00 && -parseFloat(hAPI.getCardValue("valorTotalCotacao")) <= 50000.00 - - 147 - <AssignmentController><User>AriNascimento</User></AssignmentController> - Usuário - 0 - - - - 1 - Solicitação de compras - 2 - 86 - 150 - - true - 18 - <AssignmentController><User>andrey.cunha</User></AssignmentController> - Usuário - 0 - - - - 1 - Solicitação de compras - 1 - 86 - 154 - - parseFloat(hAPI.getCardValue("valorTotalCotacao")) > 50000.00 - 158 - <AssignmentController><User>900010</User></AssignmentController> - Usuário - 0 - - - - 1 - Solicitação de compras - 2 - 86 - 154 - - parseFloat(hAPI.getCardValue("valorTotalCotacao")) < 50000.00 - 18 - <AssignmentController><BaseActivity>1</BaseActivity><Returns>Last</Returns></AssignmentController> - Executor Atividade - 0 - @@ -1322,193 +918,6 @@ parseFloat(hAPI.getCardValue("valorTotalCotacao")) <= 50000.00 false 0 - - - 1 - Solicitação de compras - 1 - 129 - - Enviar para gestão - false - 105 - 128 - - - false - false - 0 - - - - 1 - Solicitação de compras - 1 - 138 - - - false - 128 - 137 - - - false - false - 0 - - - - 1 - Solicitação de compras - 1 - 142 - - - false - 114 - 105 - - - false - false - 0 - - - - 1 - Solicitação de compras - 1 - 144 - - - false - 137 - 133 - - - false - false - 0 - - - - 1 - Solicitação de compras - 1 - 151 - - - false - 133 - 150 - - - false - false - 0 - - - - 1 - Solicitação de compras - 1 - 152 - - - false - 150 - 18 - - - false - false - 0 - - - - 1 - Solicitação de compras - 1 - 153 - - - false - 150 - 147 - - - false - false - 0 - - - - 1 - Solicitação de compras - 1 - 155 - - - false - 147 - 154 - - - false - false - 0 - - - - 1 - Solicitação de compras - 1 - 156 - - - false - 154 - 18 - - - false - false - 0 - - - - 1 - Solicitação de compras - 1 - 159 - - - false - 154 - 158 - - - false - false - 0 - - - - 1 - Solicitação de compras - 1 - 160 - - - false - 158 - 18 - - - false - false - 0 - 1 @@ -1526,6 +935,23 @@ parseFloat(hAPI.getCardValue("valorTotalCotacao")) <= 50000.00 false 0 + + + 1 + Solicitação de compras + 1 + 162 + + + false + 114 + 18 + + + false + false + 0 + @@ -1576,10 +1002,16 @@ function servicetask82(attempt, message) { log.info("📌 Item adicionado: " + JSON.stringify(item)); } - var filial = String(hAPI.getCardValue("filialprotheus") || hAPI.getCardValue("filialProtheus") || "").trim(); - if (!filial) { - throw "Campo de filial não preenchido no formulário (filialprotheus)."; - } + var filial = String( + hAPI.getCardValue("filialprotheus") || + hAPI.getCardValue("filialProtheus") || + hAPI.getCardValue("codigocentroCusto") || + "" + ).trim(); + if (!filial) { + throw "Campo PROTHEUS da filial não preenchido no formulário (filialprotheus)."; + } + log.info("🏬 Filial PROTHEUS enviada no C1_FILENT: " + filial); var payload = { "C1_SOLICIT": String(hAPI.getCardValue("usuarioSolicitante")), @@ -1616,18 +1048,21 @@ function servicetask82(attempt, message) { if (response && response.getResult()) { var result = JSON.parse(response.getResult()); - if (result.sucesso) { - hAPI.setCardValue("numeroSCProtheus", result.C1_NUM || ""); - hAPI.setCardValue("statusSCProtheus", "SC cadastrada com sucesso"); - hAPI.setCardValue("solicitanteSCProtheus", result.C1_SOLICIT || ""); - hAPI.setCardValue("emissaoSCProtheus", result.C1_EMISSAO || ""); - hAPI.setCardValue("qtdItensSCProtheus", String(result.quantidade_itens || "")); - hAPI.setCardValue("dataCadastroSCProtheus", result.data_cadastro || ""); - hAPI.setCardValue("horaCadastroSCProtheus", result.hora_cadastro || ""); - } else { - hAPI.setCardValue("statusSCProtheus", "Erro: " + result.erro); - throw "Erro Protheus: " + result.message; - } + if (result.sucesso) { + hAPI.setCardValue("numeroSCProtheus", result.C1_NUM || ""); + hAPI.setCardValue("statusSCProtheus", "SC cadastrada com sucesso"); + hAPI.setCardValue("statusAtendimento", "Em andamento"); + hAPI.setCardValue("solicitanteSCProtheus", result.C1_SOLICIT || ""); + hAPI.setCardValue("emissaoSCProtheus", result.C1_EMISSAO || ""); + hAPI.setCardValue("qtdItensSCProtheus", String(result.quantidade_itens || "")); + hAPI.setCardValue("dataCadastroSCProtheus", result.data_cadastro || ""); + hAPI.setCardValue("horaCadastroSCProtheus", result.hora_cadastro || ""); + } else { + var erroMsg = result.erro || result.message || JSON.stringify(result); + hAPI.setCardValue("statusSCProtheus", "Erro: " + erroMsg); + hAPI.setCardValue("statusAtendimento", "Erro no envio"); + throw "Erro Protheus: " + erroMsg; + } } else { throw "Sem resposta da API Protheus"; } @@ -1649,26 +1084,162 @@ function servicetask82(attempt, message) { Solicitação de compras 1 - function servicetask114(attempt, message) { - log.info("🚀 ST92 — Verifica se já existe código de cotação no formulário"); - - var numSC = hAPI.getCardValue("numeroSCProtheus"); - var numCot = hAPI.getCardValue("cotacaoSCProtheus"); - - log.info("📌 SC: " + numSC + " | Cotação: " + numCot); - - if (!numSC) { - throw "❌ Número da SC não informado no formulário."; - } - - // se não tiver cotação ainda, força o loop da atividade - if (!numCot || numCot === "000000" || numCot === "000001") { - throw "⏳ Cotação ainda não disponível para a SC " + numSC; - } - - // se já tiver código, só registra log e deixa o processo seguir - log.info("✅ Cotação " + numCot + " encontrada no formulário. Processo segue."); -} + function documentoValido(valor) { + var v = String(valor || "").trim().toUpperCase(); + if (!v) return false; + if (v === "000000" || v === "000001") return false; + if (/^0+$/.test(v)) return false; + if (/^X+$/.test(v)) return false; + return true; +} + +function consultarComFallback(clientService, endpoints, contexto) { + var ultimoErro = ""; + + for (var i = 0; i < endpoints.length; i++) { + try { + var req = { + companyId: "1", + serviceCode: "Postprod", + endpoint: endpoints[i], + method: "get", + timeoutService: "60000", + headers: { + "Content-Type": "application/json" + } + }; + + log.info("[ST114] Consulta " + contexto + " => " + endpoints[i]); + var response = clientService.invoke(JSON.stringify(req)); + if (!response || !response.getResult()) { + ultimoErro = "Sem resposta"; + continue; + } + + var body = JSON.parse(response.getResult()); + if (body && body.sucesso) { + return { sucesso: true, body: body }; + } + + ultimoErro = (body && (body.erro || body.message)) ? String(body.erro || body.message) : "Resposta sem sucesso"; + } catch (e) { + ultimoErro = String(e); + } + } + + return { sucesso: false, erro: ultimoErro || ("Falha na consulta de " + contexto) }; +} + +function apurarAssinaturas(pedidos) { + var resumo = { + total: 0, + aprovadas: 0, + pendentes: 0, + bloqueadas: 0, + rejeitadas: 0, + outros: 0 + }; + + for (var i = 0; i < pedidos.length; i++) { + var alcadas = (pedidos[i] && pedidos[i].ALCADAS) ? pedidos[i].ALCADAS : []; + for (var j = 0; j < alcadas.length; j++) { + var status = String((alcadas[j] && alcadas[j].CR_STATUS) || "").trim(); + if (!status) continue; + + resumo.total++; + if (status === "03") { + resumo.aprovadas++; + } else if (status === "01" || status === "02") { + resumo.pendentes++; + } else if (status === "04") { + resumo.bloqueadas++; + } else if (status === "06" || status === "07") { + resumo.rejeitadas++; + } else { + resumo.outros++; + } + } + } + + return resumo; +} + +function servicetask114(attempt, message) { + log.info("[ST114] Inicio - valida cotacao, pedido e assinaturas"); + + var numSC = String(hAPI.getCardValue("numeroSCProtheus") || "").trim(); + var numCotForm = String(hAPI.getCardValue("cotacaoSCProtheus") || "").trim(); + var numPedForm = String(hAPI.getCardValue("pedidoSCProtheus") || "").trim(); + + if (!numSC) { + throw "Numero da SC nao informado no formulario."; + } + + var clientService = fluigAPI.getAuthorizeClientService(); + + var consultaSC = consultarComFallback(clientService, [ + "/UF_MATA110/" + numSC, + "/rest/UF_MATA110/" + numSC, + "/rest/uf_mata110/" + numSC + ], "SC " + numSC); + + if (!consultaSC.sucesso) { + throw "Nao foi possivel consultar a SC " + numSC + ": " + consultaSC.erro; + } + + var solicitacoes = (consultaSC.body && consultaSC.body.solicitacoes) ? consultaSC.body.solicitacoes : []; + if (!solicitacoes.length) { + throw "SC " + numSC + " sem retorno de dados no Protheus."; + } + + var sc = solicitacoes[0] || {}; + var numCot = documentoValido(sc.C1_COTACAO) ? String(sc.C1_COTACAO).trim() : numCotForm; + var numPed = documentoValido(sc.C1_PEDIDO) ? String(sc.C1_PEDIDO).trim() : numPedForm; + + if (!documentoValido(numCot)) { + hAPI.setCardValue("statusAtendimento", "Aguardando cotacao"); + throw "Cotacao ainda nao disponivel para a SC " + numSC + "."; + } + hAPI.setCardValue("cotacaoSCProtheus", numCot); + + if (!documentoValido(numPed)) { + hAPI.setCardValue("statusAtendimento", "Aguardando pedido"); + throw "Pedido ainda nao gerado para a SC " + numSC + "."; + } + hAPI.setCardValue("pedidoSCProtheus", numPed); + + var consultaPedido = consultarComFallback(clientService, [ + "/UF_MATA120/" + numPed, + "/rest/UF_MATA120/" + numPed, + "/rest/uf_mata120/" + numPed + ], "Pedido " + numPed); + + if (!consultaPedido.sucesso) { + throw "Nao foi possivel consultar o pedido " + numPed + ": " + consultaPedido.erro; + } + + var pedidos = (consultaPedido.body && consultaPedido.body.pedidos) ? consultaPedido.body.pedidos : []; + var assinatura = apurarAssinaturas(pedidos); + + if (assinatura.total === 0) { + hAPI.setCardValue("statusAtendimento", "Pedido sem alcadas"); + throw "Pedido " + numPed + " sem alcadas de assinatura retornadas."; + } + + if (assinatura.bloqueadas > 0 || assinatura.rejeitadas > 0) { + hAPI.setCardValue("statusAtendimento", "Pedido bloqueado/rejeitado"); + throw "Pedido " + numPed + " bloqueado/rejeitado. Nao pode seguir para recebimento."; + } + + if (assinatura.aprovadas < assinatura.total) { + hAPI.setCardValue("statusAtendimento", "Pedido pendente de assinatura"); + throw "Pedido " + numPed + " ainda nao esta 100% assinado (" + assinatura.aprovadas + "/" + assinatura.total + ")."; + } + + hAPI.setCardValue("statusAtendimento", "Pedido 100% assinado"); + log.info("[ST114] Pedido " + numPed + " 100% assinado. Fluxo liberado para receber produto/servico."); +} + @@ -1809,18 +1380,18 @@ function servicetask82(attempt, message) { 1 Solicitação de compras - 86 + 89 26 1 1492 - 452 + 368 1 Solicitação de compras - 86 + 89 125 1 @@ -1831,7 +1402,7 @@ function servicetask82(attempt, message) { 1 Solicitação de compras - 86 + 89 126 1 @@ -1842,7 +1413,7 @@ function servicetask82(attempt, message) { 1 Solicitação de compras - 86 + 89 127 1 @@ -1853,68 +1424,24 @@ function servicetask82(attempt, message) { 1 Solicitação de compras - 86 - 129 - 1 - - 739 - 61 - - - - 1 - Solicitação de compras - 86 - 142 - 1 - - 612 - 48 - - - - 1 - Solicitação de compras - 86 - 144 - 1 - - 852 - 155 - - - - 1 - Solicitação de compras - 86 - 152 - 1 - - 1120 - 96 - - - - 1 - Solicitação de compras - 86 - 152 - 2 - - 1120 - 59 - - - - 1 - Solicitação de compras - 86 + 89 161 1 511 47 + + + 1 + Solicitação de compras + 89 + 162 + 1 + + 613 + 55 + @@ -2030,8 +1557,8 @@ function servicetask82(attempt, message) { 5 Integração executada com sucesso - 1 - 2 + 6 + 0 diff --git a/compras_digital/workflow/.resources/Solicitação de compras V2.png b/compras_digital/workflow/.resources/Solicitação de compras V2.png index f973cda..c7cec10 100644 Binary files a/compras_digital/workflow/.resources/Solicitação de compras V2.png and b/compras_digital/workflow/.resources/Solicitação de compras V2.png differ diff --git a/compras_digital/workflow/.resources/Solicitação de compras V2.processimage.svg b/compras_digital/workflow/.resources/Solicitação de compras V2.processimage.svg index 55ae151..64b8dff 100644 --- a/compras_digital/workflow/.resources/Solicitação de compras V2.processimage.svg +++ b/compras_digital/workflow/.resources/Solicitação de compras V2.processimage.svg @@ -1,2 +1,2 @@ -CEOGERFComprasTIGestor CCComprasSolicitanteSolicitação de comprasReceber oproduto/serviçoVerificarproblemaValidarcompraTratar erroEnviar SCSelecionarcotaçãoIntegradorCotaçãoCotação forado prazoAnalisarnecessidadede compraAlçadaAprovaçãoCentro decustoAprovaçãoComprasAprovaçãoGERFValorN1ValorN2AprovaçãoCEOReprovar +CEOGERFComprasTIGestor CCComprasSolicitanteSolicitação de comprasReceber oproduto/serviçoVerificarproblemaValidarcompraTratar erroEnviar SCIntegradorCotaçãoCotação forado prazoAnalisarnecessidadede compraReprovar diff --git a/compras_digital/workflow/diagrams/Solicitação de compras V2.process b/compras_digital/workflow/diagrams/Solicitação de compras V2.process index 2b634bb..a040a99 100644 --- a/compras_digital/workflow/diagrams/Solicitação de compras V2.process +++ b/compras_digital/workflow/diagrams/Solicitação de compras V2.process @@ -1,152 +1,151 @@ - - - - - - + + + + + - - + + - - + + - - + + - + - - + + - - + + - + - - + + - - + + - + - - + + - - + + - + - - + + - - + + - + - - + + - - + + - + - - + + - - + + - + - + - - - + + + - - - + + + - - + + - - - + + + - + - + - - + + - - - + + + - + - + - - - + + + - - - + + + - + @@ -162,9 +161,9 @@ - - - + + + @@ -173,85 +172,71 @@ - + - - + + - - + + - + - - - + + + - - - + + + - - + + - - - + + + - + - + - - + + - - - + + + - + - + - + - - - - - - - - - - - - - - - - - + + + - - - + + + - + @@ -261,176 +246,62 @@ - - + + - - - + + + - + - + - + - - + + - - - + + + - + - + - - + + - - - + + + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - + + + - + @@ -440,20 +311,6 @@ - - - - - - - - - - - - - - @@ -461,146 +318,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -620,26 +477,26 @@ - + - + - + - + - + - + @@ -652,10 +509,10 @@ - + - + @@ -669,146 +526,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -822,146 +679,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -975,146 +832,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -1128,146 +985,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -1281,146 +1138,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -1434,26 +1291,26 @@ - + - + - + - + - + - + @@ -1466,10 +1323,10 @@ - + - + @@ -1483,26 +1340,26 @@ - + - + - + - + - + - + @@ -1515,26 +1372,26 @@ - + - + - + - + - + - + @@ -1547,146 +1404,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -1695,7 +1552,7 @@ - + @@ -1714,26 +1571,26 @@ - + - + - + - + - + - + @@ -1747,26 +1604,26 @@ - + - + - + - + - + - + @@ -1780,10 +1637,10 @@ - + - + @@ -1799,146 +1656,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -1947,8 +1804,8 @@ - - + + @@ -1962,146 +1819,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -2116,26 +1973,26 @@ - + - + - + - + - + - + @@ -2150,146 +2007,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -2306,146 +2163,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -2460,26 +2317,26 @@ - + - + - + - + - + - + @@ -2493,146 +2350,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -2648,26 +2505,26 @@ - + - + - + - + - + - + @@ -2680,146 +2537,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -2836,146 +2693,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -2990,26 +2847,26 @@ - + - + - + - + - + - + @@ -3022,146 +2879,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3181,146 +3038,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3343,146 +3200,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3497,146 +3354,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3651,146 +3508,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3805,26 +3662,26 @@ - + - + - + - + - + - + @@ -3838,26 +3695,26 @@ - + - + - + - + - + - + @@ -3874,146 +3731,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -4028,10 +3885,10 @@ - + - + @@ -4046,146 +3903,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -4201,146 +4058,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -4358,146 +4215,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -4514,26 +4371,26 @@ - + - + - + - + - + - + @@ -4548,10 +4405,10 @@ - + - + @@ -4570,146 +4427,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -4724,146 +4581,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -4880,146 +4737,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -5035,146 +4892,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -5189,146 +5046,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -5344,146 +5201,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -5498,26 +5355,26 @@ - + - + - + - + - + - + @@ -5530,146 +5387,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -5687,146 +5544,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -5847,10 +5704,10 @@ - + - + @@ -5867,10 +5724,10 @@ - + - + @@ -5883,10 +5740,10 @@ - + - + @@ -5899,10 +5756,10 @@ - + - + @@ -5916,10 +5773,10 @@ - + - + @@ -5932,10 +5789,10 @@ - + - + @@ -5948,10 +5805,10 @@ - + - + @@ -5965,146 +5822,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -6120,146 +5977,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -6274,26 +6131,26 @@ - + - + - + - + - + - + @@ -6308,146 +6165,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -6463,146 +6320,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -6617,10 +6474,10 @@ - + - + @@ -6637,146 +6494,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -6793,146 +6650,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -6948,146 +6805,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -7105,146 +6962,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -7259,146 +7116,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -7414,146 +7271,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -7573,146 +7430,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -7727,146 +7584,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -7881,146 +7738,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -8036,146 +7893,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -8190,146 +8047,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -8344,146 +8201,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -8498,10 +8355,10 @@ - + - + @@ -8518,10 +8375,10 @@ - + - + @@ -8539,146 +8396,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -8689,451 +8546,280 @@ - - + + + - - + + - - - + + + - - + + - + - - + + - - + + - - - + + + - - + + - - + + - - + + - - - + + + - - + + - - + + - - + + - - - + + + - - + + - - + + - - + + - - - + + + - - + + - - + + - - + + - - - + + + - - + + - - + + - - + + - - - + + + - - + + - - + + - - + + - - - + + + - - + + - - + + - - + + - - - + + + - - + + - - + + - - + + - - - + + + - - + + - - + + - - + + - - - + + + - - + + - - + + - - + + - - - + + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + - - - + + + - - + + - - - + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + - - - - - - - + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + \ No newline at end of file diff --git a/compras_digital/workflow/scripts/Solicitação de compras V2.servicetask114.js b/compras_digital/workflow/scripts/Solicitação de compras V2.servicetask114.js index d650ea6..2d24cff 100644 --- a/compras_digital/workflow/scripts/Solicitação de compras V2.servicetask114.js +++ b/compras_digital/workflow/scripts/Solicitação de compras V2.servicetask114.js @@ -1,20 +1,155 @@ +function documentoValido(valor) { + var v = String(valor || "").trim().toUpperCase(); + if (!v) return false; + if (v === "000000" || v === "000001") return false; + if (/^0+$/.test(v)) return false; + if (/^X+$/.test(v)) return false; + return true; +} + +function consultarComFallback(clientService, endpoints, contexto) { + var ultimoErro = ""; + + for (var i = 0; i < endpoints.length; i++) { + try { + var req = { + companyId: "1", + serviceCode: "Postprod", + endpoint: endpoints[i], + method: "get", + timeoutService: "60000", + headers: { + "Content-Type": "application/json" + } + }; + + log.info("[ST114] Consulta " + contexto + " => " + endpoints[i]); + var response = clientService.invoke(JSON.stringify(req)); + if (!response || !response.getResult()) { + ultimoErro = "Sem resposta"; + continue; + } + + var body = JSON.parse(response.getResult()); + if (body && body.sucesso) { + return { sucesso: true, body: body }; + } + + ultimoErro = (body && (body.erro || body.message)) ? String(body.erro || body.message) : "Resposta sem sucesso"; + } catch (e) { + ultimoErro = String(e); + } + } + + return { sucesso: false, erro: ultimoErro || ("Falha na consulta de " + contexto) }; +} + +function apurarAssinaturas(pedidos) { + var resumo = { + total: 0, + aprovadas: 0, + pendentes: 0, + bloqueadas: 0, + rejeitadas: 0, + outros: 0 + }; + + for (var i = 0; i < pedidos.length; i++) { + var alcadas = (pedidos[i] && pedidos[i].ALCADAS) ? pedidos[i].ALCADAS : []; + for (var j = 0; j < alcadas.length; j++) { + var status = String((alcadas[j] && alcadas[j].CR_STATUS) || "").trim(); + if (!status) continue; + + resumo.total++; + if (status === "03") { + resumo.aprovadas++; + } else if (status === "01" || status === "02") { + resumo.pendentes++; + } else if (status === "04") { + resumo.bloqueadas++; + } else if (status === "06" || status === "07") { + resumo.rejeitadas++; + } else { + resumo.outros++; + } + } + } + + return resumo; +} + function servicetask114(attempt, message) { - log.info("🚀 ST92 — Verifica se já existe código de cotação no formulário"); + log.info("[ST114] Inicio - valida cotacao, pedido e assinaturas"); - var numSC = hAPI.getCardValue("numeroSCProtheus"); - var numCot = hAPI.getCardValue("cotacaoSCProtheus"); - - log.info("📌 SC: " + numSC + " | Cotação: " + numCot); + var numSC = String(hAPI.getCardValue("numeroSCProtheus") || "").trim(); + var numCotForm = String(hAPI.getCardValue("cotacaoSCProtheus") || "").trim(); + var numPedForm = String(hAPI.getCardValue("pedidoSCProtheus") || "").trim(); if (!numSC) { - throw "❌ Número da SC não informado no formulário."; + throw "Numero da SC nao informado no formulario."; } - // se não tiver cotação ainda, força o loop da atividade - if (!numCot || numCot === "000000" || numCot === "000001") { - throw "⏳ Cotação ainda não disponível para a SC " + numSC; + var clientService = fluigAPI.getAuthorizeClientService(); + + var consultaSC = consultarComFallback(clientService, [ + "/UF_MATA110/" + numSC, + "/rest/UF_MATA110/" + numSC, + "/rest/uf_mata110/" + numSC + ], "SC " + numSC); + + if (!consultaSC.sucesso) { + throw "Nao foi possivel consultar a SC " + numSC + ": " + consultaSC.erro; } - // se já tiver código, só registra log e deixa o processo seguir - log.info("✅ Cotação " + numCot + " encontrada no formulário. Processo segue."); -} \ No newline at end of file + var solicitacoes = (consultaSC.body && consultaSC.body.solicitacoes) ? consultaSC.body.solicitacoes : []; + if (!solicitacoes.length) { + throw "SC " + numSC + " sem retorno de dados no Protheus."; + } + + var sc = solicitacoes[0] || {}; + var numCot = documentoValido(sc.C1_COTACAO) ? String(sc.C1_COTACAO).trim() : numCotForm; + var numPed = documentoValido(sc.C1_PEDIDO) ? String(sc.C1_PEDIDO).trim() : numPedForm; + + if (!documentoValido(numCot)) { + hAPI.setCardValue("statusAtendimento", "Aguardando cotacao"); + throw "Cotacao ainda nao disponivel para a SC " + numSC + "."; + } + hAPI.setCardValue("cotacaoSCProtheus", numCot); + + if (!documentoValido(numPed)) { + hAPI.setCardValue("statusAtendimento", "Aguardando pedido"); + throw "Pedido ainda nao gerado para a SC " + numSC + "."; + } + hAPI.setCardValue("pedidoSCProtheus", numPed); + + var consultaPedido = consultarComFallback(clientService, [ + "/UF_MATA120/" + numPed, + "/rest/UF_MATA120/" + numPed, + "/rest/uf_mata120/" + numPed + ], "Pedido " + numPed); + + if (!consultaPedido.sucesso) { + throw "Nao foi possivel consultar o pedido " + numPed + ": " + consultaPedido.erro; + } + + var pedidos = (consultaPedido.body && consultaPedido.body.pedidos) ? consultaPedido.body.pedidos : []; + var assinatura = apurarAssinaturas(pedidos); + + if (assinatura.total === 0) { + hAPI.setCardValue("statusAtendimento", "Pedido sem alcadas"); + throw "Pedido " + numPed + " sem alcadas de assinatura retornadas."; + } + + if (assinatura.bloqueadas > 0 || assinatura.rejeitadas > 0) { + hAPI.setCardValue("statusAtendimento", "Pedido bloqueado/rejeitado"); + throw "Pedido " + numPed + " bloqueado/rejeitado. Nao pode seguir para recebimento."; + } + + if (assinatura.aprovadas < assinatura.total) { + hAPI.setCardValue("statusAtendimento", "Pedido pendente de assinatura"); + throw "Pedido " + numPed + " ainda nao esta 100% assinado (" + assinatura.aprovadas + "/" + assinatura.total + ")."; + } + + hAPI.setCardValue("statusAtendimento", "Pedido 100% assinado"); + log.info("[ST114] Pedido " + numPed + " 100% assinado. Fluxo liberado para receber produto/servico."); +}