Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.
HTML
<style>
  /* Início estilo banner */

  .compositiondani-banner {
    position: relative;
    min-height: 220px;
    border-radius: 5px;
    margin-bottom: 5px;
    overflow: hidden;
  }

  .compositiondani-banner-image {
    background-image: url("https://totvscrm.com/wp-content/uploads/2023/08/capa-com-fundo-e-sem-icone-TDN21.png");
    background-size: cover;
    min-height: inherit;
    width: 100%;
  }

  .compositiondani-banner-overlay {
    min-height: inherit;
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    border-radius: 5px;
    pointer-events: none;
  }

  .compositiondani-banner-logo-container {
    display: flex;
    justify-content: center;
    align-items: center;
    position: absolute;
    top: 50%;
    left: 50%;
    bottom: 0;
    transform: translate(-50%, -50%);
  }

  .compositiondani-banner-logo {
    width: 350px;
    height: 180px;
    background-image: url("https://totvscrm.com/wp-content/uploads/2023/08/logo.png");
    background-size: contain;
    background-repeat: no-repeat;
  }

  .compositiondani-banner-title {
    margin-bottom: 10px !important;
    padding: 10px !important;
    background: rgba(0, 0, 0, 0.5) !important;
    display: flex !important;
    justify-content: center !important;
    align-items: center !important;
    font-size: 12px !important;
    line-height: 1.3 !important;
    max-height: 133px !important;
    font-family: "Roboto", sans-serif !important;
    -webkit-line-clamp: 3 !important;
    -webkit-box-orient: vertical !important;
    overflow: hidden !important;
    text-overflow: ellipsis !important;
    color: #ffffff !important;
    position: relative !important;
    margin-top: 130px !important;
    border-radius: 10px !important;
  }

  .compositiondani-banner-content {
    position: absolute;
    padding: 30px;
    max-width: 60%;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    z-index: 1;
    color: white;
    text-align: center;
  }

  .custom-header h1 {
    font-size: 16px;
    background-color: rgba(0, 0, 0, 0.6);
    padding: 10px;
    border-radius: 5px;
    margin: 0;
  }

  .negrito-materialize {
    font-weight: bold;
  }

  .custom-margin-justified {
    margin: 0 20px;
    text-align: justify;
  }
    /* Final estilo banner */

       /* Final estilo banner */

      #content.page.view {
    padding-right: 0 !important;
}   /* impedir vermelho no nav */

#breadcrumb-section > nav {
    background-color: initial !important;
    box-shadow: none !important;
}

@media only screen and (min-width: 601px) {
    nav, 
    nav .nav-wrapper i, 
    nav a.sidenav-trigger, 
    nav a.sidenav-trigger i {
        height: auto !important;
        line-height: normal !important;
    }
}
/* final vermelho no nav */   </style>

<header>
  <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400&display=swap" rel="stylesheet"/>

  <div class="compositiondani-banner">
    <div class="compositiondani-banner-image"></div>
    <div class="compositiondani-banner-overlay"></div>
    <div class="compositiondani-banner-logo-container">
      <div class="compositiondani-banner-logo"></div>
    </div>
    <div class="compositiondani-banner-content">
      <h1 class="compositiondani-banner-title">PLUGIN DE INTEGRAÇÃO PARA SIMULAÇÃO DE IMPOSTOS </h1>
</header>
  </div>
</div>
HTML
<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400&display=swap" rel="stylesheet"/>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css"/>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css"/>
    <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400&display=swap" rel="stylesheet"/>

<link
  rel="stylesheet"
  href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css"
/>
<link
  href="https://fonts.googleapis.com/icon?family=Material+Icons"
  rel="stylesheet"
/>
<link
  rel="stylesheet"
  href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css"
/>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css">
<!-- Inclua o estilo do tema Monokai -->



  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/monokai.min.css"/>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script>
  

  <style>
  /* ==============================
    =       CONFIGURAÇÕES GERAIS      =
    =============================== */

* {
  font-family: "Roboto", sans-serif;
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

body {
  margin: 0;
  padding: 0;
}

a {
  color: #42526e;
  text-decoration: none;
  -webkit-tap-highlight-color: transparent;
}

a:hover {
  color: white;
}

li {  font-size: 14px !important;
}

h3 {  font-size: 14px !important;
  font-weight: bold;  

}

h1 {  font-size: 13px !important;
  

}

h2 {  font-size: 15px !important;
  font-weight: bold;  

}

td, th {
    padding: 4px;
}


/* ==============================
      =        ESTILOS DE TÍTULOS       =
      =============================== */

#title-text {
  display: none !important;
}

.wiki-content h1,
.wiki-content h2 {
  font-family: "Roboto", sans-serif !important;
  font-size: 13px!important;
 
}

.wiki-content h1 {
  font-size: 13px !important;
}

.wiki-content h2 {
  font-size: 14px !important;
  color: #42526e !important;
  border-bottom: 2px solid #dfe1e5;
   padding-bottom: 5px;
  font-weight: bold;  
}

.custom-heading,
h3.custom-h3 {
  font-size: 16px;
  color: #42526e;
  margin-bottom: 20px;
}

.custom-h1 {
  color: #feac0e;
}

.explanation h2 {
  font-weight: bold;
}

/* ==============================
      =        ESTILOS DE TEXTO         =
      =============================== */

.wiki-content p {
  font-size: 14px !important;
}

.justificado,
.custom-justified {
  text-align: justify;
  margin: 10px 0;
}

/* ==============================
      =       ESTILOS DE LINKS         =
      =============================== */

.wiki-content a,
.wiki-content a:link,
.wiki-content a:visited,
.wiki-content a:focus,
.wiki-content a:active {
  text-decoration: none;
  color: #42526e;
  font-size: 14px;


}

.wiki-content a:hover {
  color: white;
}

/* ==============================
      =       ESTILOS DE CONTAINER     =
      =============================== */



.custom-content {
  background-color: #f5f5f5;
  padding: 20px;
  border-radius: 8px;
  margin: 0 10px;
  max-width: 100%;
  overflow: hidden;
}

.faq-container {
  max-width: 800px;
  margin: 0 auto;
  padding: 20px;
}

/* ==============================
      =       ESTILOS DE CARDS         =
      =============================== */

.card {
  border: 2px solid #9aa1ad;
  padding: 20px;
    box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
  border-radius: 8px;
  background-color: #f4f5f7;
  color: #42526e;
  overflow-x: hidden;
   top: 0;
  
}



/* ==============================
      =       ESTILOS DE TABS          =
      =============================== */

.tabs {
  background-color: #dfe1e5;
}

.tabs .tab a {
  color: rgb(66, 82, 110);
}

.tabs .tab a:hover,
.tabs .tab a.active,
.tabs .tab a:focus.active {
  color: #6B48FF;
  background-color: transparent;
}

.tabs .tab a:focus {
  background-color: rgba(82, 97, 232, 0.25);
}

.tabs .tab.disabled a,
.tabs .tab.disabled a:hover {
  color: rgba(16, 148, 184, 0.24);
}

.tabs .indicator {
  background-color: #6B48FF;
}

.tab-content {
   gap: 0;
  padding: 10px;
}

.tab-content pre {
  max-width: 100%;
  overflow-x: hidden;
}

/* ==============================
      =        ESTILOS DE ÍCONES        =
      =============================== */

.icon-list,
.icon {
  padding-left: 0;
  list-style-type: none;
}

.icon {
  display: inline-block;
  width: 24px;
  vertical-align: middle;
  margin-right: 45px;
  position: relative;
  left: -25px;
}

.item .label i {
  margin-right: 10px;
}

/* ==============================
      =    ESTILOS DE COMPONENTES      =
      =============================== */

.collapsible,
.collapsible-header,
.collapsible-body {
  box-shadow: none !important;
}

.faq-question {
  font-weight: bold;
  margin-bottom: 5px;
}

.faq-answer {
  margin-bottom: 20px;
}

.custom-list {
  padding-left: 0;
  margin-left: 1.5em;
}

.custom-list li {
  position: relative;
  padding-left: 1em;
}

ul.custom-list {
  padding-left: 10px;
}

ul.custom-list li {
  position: relative;
  list-style-type: disc;
  padding-left: 30px;
  margin-bottom: 10px;
}

.item {
  display: flex;
  align-items: center;
  padding: 10px;
  border-bottom: 1px solid #eee;
}

.item:last-child {
  border-bottom: none;
}

.item .label {
  flex: 1;
  font-weight: bold;
}

.item .value {
  flex: 1;
  text-align: right;
}
.item {
  border-bottom: 1px solid #e0e0e0;
  padding: 10px 0;
  display: flex;
  justify-content: space-between;
  align-items: center;
}

.item:last-child {
  border-bottom: none;
}

/* Estilos para o label */
.label {
  font-weight: bold;
  display: flex;
  align-items: center;
}

.item .label i {
  margin-right: 10px; /* Adiciona espaço depois dos ícones */
}

/* ==============================
      =     ESTILOS DE IMAGENS         =
      =============================== */

.imagem-responsiva {
  max-width: 100%;
  height: auto;
}

.custom-header-bg img {
  width: 100%;
  height: auto;
  display: block;
}

/* ==============================
      =     ESTILOS DE VÍDEO           =
      =============================== */

#youtube-video-container iframe {
  width: 100%;
  height: auto;
  display: block;
}

.video-container {
    max-width: 800px;
    margin: 0 auto;
  }

.ytp-cued-thumbnail-overlay-image {
  background-size: cover;
  background-position: center;
  width: 100%;
  height: 100%;
  position: absolute;
}

/* ==============================
      =    OUTROS ESTILOS PERSONALIZADOS =
      =============================== */
.custom-content {
  background-color: #f5f5f5;
  padding: 20px;
  border-radius: 8px;
  margin: 0 10px;
  max-width: 100%;
  overflow: hidden;
}

.custom-heading {
  font-size: 16px;
  color: #42526e;
  margin: 10px 0;
  border-bottom: 2px solid #e0e0e0;
  padding-bottom: 5px;
  font-weight: bold;  
}

#indice {
  border-radius: 5px;
  padding: 20px;
  max-width: 100%;
  overflow: hidden;
}

#indice h2 {
  text-align: center;
  margin-bottom: 16px;
}

#indice ul {
  list-style-type: none;
  padding-left: 0;
}

#indice li {
  padding: 10px;
  border-bottom: 1px solid #eee;
  cursor: pointer;
  transition: background-color 0.1s ease;
}

#indice li:last-child {
  border-bottom: none;
}

#indice li:hover {
  background-color: #6B48FF;
  color: white;
}

/* ==============================
  =      ESTILOS DE TABELAS        =
  ============================== */
.custom-grey {
  background-color: #ffffff;
}

.custom-grey th,
.custom-grey td {
  border: 1px solid #42526e;
  padding: 10px;
}

.custom-grey th {
  color: #fff;
  background-color: #42526e;
}



.custom-grey td {
  font-size: 13px;
}

.custom-grey tr:nth-child(odd) {
  background-color: #e4e4e6;
}

.custom-grey tr:nth-child(even) {
  background-color: #dfdfdf;
}

/* ========== FIM DO ESTILO ========= */
/* Estilo para o bloco de código */

/* Estilo para blocos de código dentro de .tab-content */


           .highlight-container pre code {
            background-color: #2d2d2d; /* Cor de fundo escuro */
            color: #f8f8f2; /* Cor do texto claro */
            padding: 10px; /* Espaçamento interno */
            border-radius: 5px; /* Bordas arredondadas */
            overflow-x: auto; /* Barra de rolagem horizontal se necessário */
            font-family: 'Courier New', Courier, monospace; /* Fonte do código */
        }

        /* Estilo para a tag <pre> dentro do contêiner */
        .highlight-container pre {
            margin: 20px 0; /* Margem acima e abaixo do bloco de código */
            padding: 0; /* Sem preenchimento extra */
        }

 /* Estilo Lista*/
        ul.custom-list li {
  list-style-type: disc; /* Define o tipo de marcador como disco (bolinha) */
  list-style-position: inside; /* Coloca o marcador dentro da área de layout do item da lista */
 padding-left: 1px !important;

}
 

  </style>
  






  <!-- Tabs e conteúdo das guias -->
  <div class="card">
    <ul class="tabs">
      <li class="tab col s4"><a href="#tab1">DETALHES FUNCIONAIS</a></li>
      <li class="tab col s4"><a href="#tab2">DETALHES TÉCNICOS</a></li>
      <li class="tab col s4"><a href="#tab3">FAQ</a></li>
    </ul>
     <!-- Tab Content -->
 
      <div id="tab1" class="col s12">
        <div class="tab-content">
          <div style="background-color: #f4f5f7; padding: 10px; margin-left: 50px; margin-right: 50px;">
            <section id="section1" style="margin-top: 40px;">
               <!-- Tab 70 conteúdo -->
  <!-- Segundo Card -->

    <!-- Primeiro Card -->
  <!-- Primeiro Card -->
  <div class="card">
    <div class="item">
      <span class="label">
        <table border="1">
          <tr>
              <td><i class="fas fa-tags"></i> Produto:</td>
              <td>Automação da Força de Vendas</td>
          </tr>
          <tr>
              <td><i class="fas fa-link"></i> Linha de Produto:</td>
              <td>TOTVS CRM</td>
          </tr>
          <tr>
              <td><i class="fas fa-chart-pie"></i> Segmento:</td>
              <td>Cross Segmentos</td>
          </tr>
          <tr>
              <td><i class="fas fa-desktop"></i> Módulo:</td>
              <td>Vendas - Impostos
            </td>
          </tr>
          <tr>
              <td><i class="fas fa-globe"></i> Aplicação:</td>
              <td>App móvel</td>
          </tr>
          <tr>
              <td><i class="fas fa-hashtag"></i> Identificador:</td>
              <td> DTSFAPD-2267</td>
          </tr>
      </table>
      </span>
    </div>
    </div>
 

      <br>

       <!-- Segundo Card -->

       <h2 class="custom-heading">
        <i class="fa-solid fa-eye"></i>&nbsp &nbsp VISÃO GERAL
      </h2>
      <p class="justificado">
        Esta atualização introduz um plugin de integração para simulação de impostos, compatível com as APIs nativas do Datasul, Protheus e sistemas genéricos. Este plugin permite a simulação precisa dos impostos antes da exportação do pedido para o ERP, melhorando a precisão dos valores totais no pedido.
        
      </p>
<br>

    <h2 class="custom-heading">
      <i class="fa-solid fa-rocket"></i>&nbsp &nbsp OBJETIVO
    </h2>
    <p class="justificado">
      Proporcionar aos usuários uma visão mais clara dos custos totais, incluindo impostos, no momento da realização do pedido. Isso facilita decisões mais informadas e aumenta a eficiência do processo de venda.
    </p> <br>



    <!-- ... (seu conteúdo existente) ... -->

    <h2 class="custom-heading">
      <i class="fa-solid fa-book"></i> &nbsp ANTES DE COMEÇAR
  </h2>
  <h3>Requisitos</h3>
  <p>O plugin requer configurações específicas, incluindo a seleção do modelo de simulação (Protheus, Datasul ou Genérico) e detalhes de conexão e autenticação.</p>
  
</section> 

                          
          </section>

          <section id="section2" style="margin-top: 40px;">
            <h2 class="custom-heading"><i class="fa-solid fa-star"></i>&nbsp DETALHES FUNCIONAIS</h2>
            <h3>Funções </h3>
        
            <ol><li>Configuração de Plugin: Os usuários podem configurar o plugin para conectar-se com a API correspondente (Protheus, Datasul ou Genérico) e realizar simulações de impostos em pedidos de venda.</li><li>Botão "Calcular Imposto": Disponível em pedidos de venda, realiza a comunicação com o ERP e exibe os valores dos impostos.</li><li>Opções de Configuração Avançadas: Incluem URL de conexão, dados de autenticação, timeout para requisição de impostos e opções para obrigar simulação ao gravar ou finalizar o pedido.</li></ol>
            
          </section>
         
      
          <section id="section3" style="margin-top: 40px;">
            <h2 class="custom-heading"><i class="fa-solid fa-shoe-prints"></i>&nbsp COMO USAR?</h2>
            <h3> Passo a Passo</h3>

            <ol><li>Acesse a seção de Configuração > Integração > Plugins de Integração no TOTVS CRM SFA.</li><li>Selecione o plugin "Simulação de Impostos".</li><li>Configure as informações de conexão e autenticação conforme o ERP utilizado (Protheus, Datasul ou Genérico).</li><li>No pedido de venda, utilize o botão "Calcular Imposto" para simular e visualizar os impostos aplicáveis.</li></ol>
            <br>

          <p>
            <video autoplay loop muted style="width: 100%; height: auto; max-width: 100%; display: block;">
              <source src="https://totvscrm.com/wp-content/uploads/2024/01/imposttos25.mp4">
            </video>
          </p><br>   
         

          </section>

          <section id="section4" style="margin-top: 40px;">
            <h2 class="custom-heading"><i class="fa-solid fa-signs-post"></i> &nbspEXEMPLO PRÁTICO</h2>
                       

             
              <b>Desafio Antigo:</b>
              <p>Antes dessa atualização, os usuários não podiam visualizar os impostos aplicáveis antes da exportação do pedido para o ERP.
                
                </p>
              
              <br>
              
              <b>Solução Atualizada:</b>
              <p>Com o novo plugin, é possível calcular e visualizar os impostos diretamente no pedido de venda, proporcionando uma visão completa dos custos antes da finalização do pedido.

                </p>
              
              <br>
              
              
              </p>
          </section>
      
         
          </div>
          
            <!-- Tab 30 fim -->
          
            <!-- Tab 30 fim -->
          
          </div>
        </div>
    


      <div id="tab2" class="col s12">
        <div class="tab-content">
          <div style="background-color: #f4f5f7; padding: 20px; margin-left: 50px; margin-right: 50px;">
            <section id="section5" style="margin-top: 40px;">
            <!-- Primeira coluna do conteúdo da guia 2 -->
            <h2 class="custom-heading"><i class="fa-solid fa-gear"></i>&nbsp DETALHES TÉCNICOS</h2>

            <ol>
              <li><b>Cadastro de dados de acesso do Pentaho Carte</b></li>
        
          <ul class="custom-list">
              <li>Na tela de Configuração > Integração > Plugins de Integração, ao invés de todos os plugins conterem campos para "Dados de acesso ao Pentaho Carte":
                  <ul class="custom-list">
                      <li>O sistema disponibilizará um botão "Configurações gerais" no rodapé da tela, abrindo uma nova tela com campos específicos.</li>
                      <li>O campo senha deverá ser tipado como "password" para não permitir a visualização direta da senha na tela.</li>
                  </ul>
              </li>
              <li>Pelo tools, opção 5, o sistema deverá inserir um novo registro na tabela pluginintegracao com o código "configgeral".</li>
              <li>A persistência dos valores da tela de "Configurações gerais" deverá acontecer na tabela pluginintconfig para esses campos, vinculada ao registro da tabela pluginintegracao de código "configgeral".</li>
              <li>Os plugins existentes (ReceitaWS e TOTVS Pagamento instantâneo) deverão ter os campos de "Configurações do Pentaho" removidos e precisarão de refatoração para buscar das "Configurações Gerais".</li>
          </ul>
          
       <br>
            <li><b>Cadastro de dados de acesso do Pentaho Carte</b></li>
        
        <ul class="custom-list">
            <li>O sistema deverá disponibilizar novo plugin de nome "Simulação de impostos", com descrição "Simule impostos diretamente no pedido de venda para negociações mais precisas com seu cliente."</li>
            <li>O link para o manual do plugin será "Manual - Plugin de Integração 'Simulação de Impostos'".</li>
            <li>Pelo tools, opção 18, o sistema deverá persistir novo registro na tabela pluginintegracao.codigo com valor = IMPOSTO.</li>
            <li>Para funcionamento correto, o cadastro das configurações do plugin de Imposto deve inserir na tabela pluginintconfig as seguintes informações:
                <ul class="custom-list">
                    <li>Campo de label "Modelo de simulação de impostos" com opções fixas e respectivos valores.</li>
                    <li>Campo de label "URL de conexão": textual obrigatório.</li>
                    <li>Grupo de elementos de label "Autenticação" com campos para usuário e senha.</li>
                    <li>Campo de label "Timeout ao requisitar impostos (seg)": campo numérico com padrão de 30 segundos, se não informado.</li>
                    <li>Campo de label "Obrigar simulação de impostos para:" com opções de Checkbox para "Gravar pedido" e "Finalizar pedido".</li>
                </ul>
            </li>
        </ul>
        
        
          <li><b>Implementação no pedido</b></li>
      
      <ul class="custom-list">
          <li>No pedido de venda, se o plugin de integração de código "imposto" estiver ativo:
              <ul class="custom-list">
                  <li>O sistema deverá disponibilizar o botão de "Calcular impostos" na Web e ícone no Android.</li>
                  <li>Gerenciamento da exibição de ícone colorido baseado na situação dos impostos:
                      <ul class="custom-list">
                          <li>Impostos não calculados: cor amarela.</li>
                          <li>Impostos calculados: cor verde.</li>
                      </ul>
                  </li>
                  <li>Ao alterar dados dos produtos, o ícone deve retornar para o status de "não calculado".</li>
                  <li>Aproveitamento dos impostos calculados para pedidos gravados através do campo pedidoproduto.idnimpostocalculado, semelhante ao modelo "PLUGIN_WINTHOR".</li>
                  <li>As cores citadas também serão consequência do valor deste campo, onde valor 1 indica impostos calculados e valor 0 indica impostos não calculados.</li>
                  <li>Ao alterar qualquer campo editável do item, o sistema deverá zerar o campo pedidoproduto.idnimpostocalculado.</li>
                  <li>Ao clicar no botão de "Calcular impostos", o sistema deverá disparar uma requisição POST para o Carte do Pentaho com configurações e parâmetros específicos.</li>
  
      
        <div style="background-color: #2d2d2d; padding: 10px; border-radius: 5px;">
          <pre style="margin: 0; overflow-x: auto;"><code class="language-xml" style="color: #f8f8f2; font-family: 'Courier New', Courier, monospace;">
            {
              "idusuario": 1, //pedido.idusuarioprofissional
              "idparceiro": 1, //pedido.idparceiro
              "idlocal": 2, //pedido.idlocal
              "idlocalcobranca": 3, //pedido.idlocalcobranca
              "idfilialvenda": 3, //pedido.idlocalfilialvenda
              "idfilialretira": 4, //pedido.idlocalfilialretirada
              "idfilialfaturamento": 5, //pedido.idlocalfilialfaturamento
              "idtipopedido": 4, //pedido.idtipopedido
              "idtipocobranca": 5, //pedido.idtipocobranca
              "idtabelapreco": 6, //pedido.idtabelapreco
              "idcondicaopagamento": 5, //pedido.idcondicaopagamento
              "idsegmento": 8, //pedido.idsegmento
              "idtipologia": 8, //pedido.idtipologia
              "idoperacao": 8, //pedido.idoperacao
              "idmoeda": 8, //pedido.idindexador
              "idtipoestoque": 8, //pedido.idtipoestoque
              "valortotalbruto": 8.00, //Campo "Valor total bruto do resumo"
              "valortotalliquido": 9.00,//Campo "Valor total liquido do resumo"
              "descontopedido": [
                  {
                      "codigo": "8", //pedidotipodesconto.idtipodesconto > tipodesconto.codigo
                      "percentual": 9.00, //pedidotipodesconto.percentual
                      "valor": 10.00 //pedidotipodesconto.valor
                  },
                  {
                      "codigo": "8", //pedidotipodesconto.idtipodesconto > tipodesconto.codigo
                      "percentual": 9.00, //pedidotipodesconto.percentual
                      "valor": 10.00 //pedidotipodesconto.valor
                  }
              ],
              "pedidoproduto": [
                  {
                      "ordem": 1, //pedidoproduto.ordem
                      "idproduto": 8, //pedidoproduto.idproduto
                      "idembalagem": 10, //pedidoproduto.idembalagem,
                      "quantidade": 9.00, //pedidoproduto.quantidade
                      "precovenda": 10.00, //pedidoproduto.precovenda PS:Valor unitário
                      "precotabela": 11.00, //pedidoproduto.precotabela PS:Valor unitário
                      "precooriginal": 12.00, //pedidoproduto.precooriginal PS:Valor unitário
                      "percentualdesconto": 13.00, //pedidoproduto.percentualdesconto
                      "valordesconto": 13.00, //pedidoproduto.valordesconto PS:Valor unitário
                      "percentualacrescimo": 13.00, //pedidoproduto.percentualacrescimo
                      "valoracrescimo": 13.00, //pedidoproduto.valoracrescimo PS:Valor unitário
                      "idtipopedido": 13.00, //pedidoproduto.idtipopedido
                      "idtipoestoque": 14, //pedidoproduto.idtipoestoque
                      "idtabelapreco": 15, //pedidoproduto.idtabelapreco
                  },
                  {
                      "ordem": 1, //pedidoproduto.ordem
                      "idproduto": 8, //pedidoproduto.idproduto
                      "idembalagem": 10, //pedidoproduto.idembalagem,
                      "quantidade": 9.00, //pedidoproduto.quantidade
                      "precovenda": 10.00, //pedidoproduto.precovenda PS:Valor unitário
                      "precotabela": 11.00, //pedidoproduto.precotabela PS:Valor unitário
                      "precooriginal": 12.00, //pedidoproduto.precooriginal PS:Valor unitário
                      "percentualdesconto": 13.00, //pedidoproduto.percentualdesconto
                      "valordesconto": 13.00, //pedidoproduto.valordesconto PS:Valor unitário
                      "percentualacrescimo": 13.00, //pedidoproduto.percentualacrescimo
                      "valoracrescimo": 13.00, //pedidoproduto.valoracrescimo PS:Valor unitário
                      "idtipopedido": 13.00, //pedidoproduto.idtipopedido
                      "idtipoestoque": 14, //pedidoproduto.idtipoestoque
                      "idtabelapreco": 15, //pedidoproduto.idtabelapreco
                  }
              ],
              "pedidoentrega": [
                  {
                      "idtipofrete": 4, //pedidoentrega.idtipofrete
                      "idtransportadora": 7,//pedidoentrega.idparceirotransportador
                      "idparceiroentrega": 8, //pedidoentrega.idparceiroentrega
                      "valorfrete": 5.00, //pedidoentrega.valorfrete
                      "valordespesa": 6.00, //pedidoentrega.valordespesa
                      "valorseguro": 7.00 //pedidoentrega.valorseguro       
                  },
                  {
                      "idtipofrete": 4, //pedidoentrega.idtipofrete
                      "idtransportadora": 7,//pedidoentrega.idparceirotransportador
                      "idparceiroentrega": 8, //pedidoentrega.idparceiroentrega
                      "valorfrete": 5.00, //pedidoentrega.valorfrete
                      "valordespesa": 6.00, //pedidoentrega.valordespesa
                      "valorseguro": 7.00 //pedidoentrega.valorseguro       
                  }
              ]
          }
           </code></pre>
    </div> <br> 
        <li>O retorno esperado virá com o modelo a seguir:
        </li>

        <div style="background-color: #2d2d2d; padding: 10px; border-radius: 5px;">
          <pre style="margin: 0; overflow-x: auto;"><code class="language-xml" style="color: #f8f8f2; font-family: 'Courier New', Courier, monospace;">    
            {
              "valortotalcomimpostos": 178.56,
              "valortotalimpostos": 21.96,
              "valortotaldespesa": 0, //pedidoentrega.valordespesa
              "valortotalseguro": 7, //pedidoentrega.valorseguro 
              "pedidoimposto": [
                {
                  "sglimposto": "ICMS",
                  "aliquota": 7,
                  "valortotalimposto": 12.14
                },
                {
                  "sglimposto": "IPI",
                  "aliquota": 6,
                  "valortotalimposto": 9.82
                }
              ],
              "itemimposto": [
                {
                  "ordem": 1, //pedidoproduto.ordem
                  "idproduto": 8, //pedidoproduto.idproduto
                  "idproduto_externalid": "ABC" //pedpedidoproduto.idproduto > produto.codigoerp
                  "valortotalcomimpostos": 89.21, //NÃO UNITÁRIO, precisa ser múltiplicado pela requisição.quantidade
                  "valortotalfrete": 2.5, //NÃO UNITÁRIO, precisa ser múltiplicado pela requisição.quantidade
                  "impostos": [
                    {
                      "sglimposto": "ICMS",
                      "valorbase": 78.3,
                      "aliquota": 6.24,
                      "valortotalimposto": 6.24 //NÃO UNITÁRIO, precisa ser múltiplicado pela requisição.quantidade
                    },
                    {
                      "sglimposto": "IPI",
                      "valorbase": 78.3,
                      "aliquota": 6,
                      "valortotalimposto": 4.91 //NÃO UNITÁRIO, precisa ser múltiplicado pela requisição.quantidade
                    },
                    {
                      "sglimposto": "ST",
                      "valorbase": 78.3,
                      "aliquota": 0,
                      "valortotalimposto": 0 //NÃO UNITÁRIO, precisa ser múltiplicado pela requisição.quantidade
                    },
                    {
                      "sglimposto": "COFINS",
                      "valorbase": 78.3,
                      "aliquota": 0,
                      "valortotalimposto": 0 //NÃO UNITÁRIO, precisa ser múltiplicado pela requisição.quantidade
                    },
                    {
                      "sglimposto": "CSLL",
                      "valorbase": 78.3,
                      "aliquota": 0,
                      "valortotalimposto": 0 //NÃO UNITÁRIO, precisa ser múltiplicado pela requisição.quantidade
                    }
                  ]
                },
                {
                  "ordem": 2, //pedidoproduto.ordem
                  "idproduto": 9, //pedidoproduto.idproduto //
                  "valortotalcomimpostos": 84.3, //NÃO UNITÁRIO, precisa ser múltiplicado pela requisição.quantidade
                  "valortotalfrete": 2.5, //NÃO UNITÁRIO, precisa ser múltiplicado pela requisição.quantidade
                  "impostos": [
                    {
                      "sglimposto": "ICMS",
                      "valorbase": 78.3,
                      "aliquota": 5.9,
                      "valortotalimposto": 5.9 //NÃO UNITÁRIO, precisa ser múltiplicado pela requisição.quantidade
                    },
                    {
          

01. DADOS GERAIS

...

TOTVS CRM Automação da Força de Vendas

...

Linha TOTVS CRM SFA

...

Jira
serverJIRA
serverId0c783de1-186e-383b-975c-a1acd7d76cb5
keyDTSFAPD-2267

02. ESCOPO FUNCIONAL/TÉCNICO

1. Cadastro de dados de acesso do Pentaho Carte

Ao invés de todos os plugins conterem campos para "Dados de acesso ao Pentaho Carte", na tela de Configuração > Integração > Plugins de Integração:

  • O sistema deverá disponibilizar botão "Configurações gerais" no roda teto da tela, abrindo nova tela, com os campos:
    • Image Removed
      • O campo senha deverá ser tipado como "password" para não pemitir visualização direta da senha na tela.
    • Pelo tools, opção 5, o sistema deverá inserir novo registro na tabela pluginintegracao de codigo "configgeral"
    • A persistência dos valores da tela de Configurações gerais deverá acontecer na tabela pluginintconfig para esses campos, vinculado à registro da tabela pluginintegracao de código "configgeral"
    • Os plugins existentes (ReceitaWS e TOTVS Pagamento instantâneo deverão ter os campos de "Configurações do Pentaho removidos" e precisarão de refatoração para buscar das "Configurações Gerais")

2. Criação de configuração do novo plugin "Simulação de impostos"

  • O sistema deverá disponibilizar novo plugin de nome "Simulação de impostos", com descrição "Simule impostos diretamente no pedido de venda para negociações mais precisas com seu cliente."
    • O link para o manual do plugin será Manual - Plugin de Integração "Simulação de Impostos"
    • Pelo tools, opção 18, o sistema deverá persistir novo registro na tabela pluginintegracao.codigo com valor = IMPOSTO
    • Para funcionar corretamente, o cadastro na tabela pluginintconfig deverá conter as seguintes informações:

idpluginintegracao = ID da tabela pluginintegracao com codigo = IMPOSTO

codigoelemento = IMPOSTO

agrupador = 0

sglcampo = IMPOSTO_MODELO

idnativo = 0

valor = Dependendo da seleção (PROTHEUS, DATASUL ou GENERICO)

      • Ao clicar em configurar, o sistema deverá abrir nova tela, exibindo os campos:
        • Campo de label "Modelo de simulação de impostos":
          • Opções fixas (pluginintconfig.valor):
            • "Protheus APIs Nativas": valor "protheus"
            • "Datasul APIs Nativas": valor "datasul"
            • "Genérico": valor "generico"
        • Campo de label "URL de conexão": textual obrigatório
        • Grupo de elementos de label "Autenticação"
          • Campo de label "Usuário": textual obrigatório
          • Campo de label "Senha": textual, obrigatório, tipado como "password" para não pemitir visualização direta da senha na tela.
        • Campo de label "Timeout ao requisitar impostos (seg)": campo numérico, se não informado, adotar o padrão 30 segundos
        • Campo de label "Obrigar simulação de pedidos para:": Checkbox, seleção opcional
          • Checkbox de label "Gravar pedido"
          • Checkbox de label "Finalizar pedido"

3. Implementação no pedido

...

  • Impostos não calculados: cor amarela
  • Impostos calculados: cor verde
    • Ao alterar dados dos produtos, o ícone deve retornar para o status de "não calculado"

...

  • Usuário: ${"Configurações gerais"."Configurações do Pentaho"."Usuário"}
  • Senha: ${"Configurações gerais"."Configurações do Pentaho"."Senha"}

...

            "

...

sglimposto": "

...

IPI",

...


            

...

 

...

 

...

        

...

"

...

valorbase": 

...

78.3,
        

...

        

...

      "aliquota": 6,
     

...

                 "

...

valortotalimposto": 

...

4.

...

91 //

...

NÃO UNITÁRIO, precisa ser múltiplicado pela requisição.quantidade
     

...

 

...

          

...

    

...

},
    

...

            

...

    {
        

...

 

...

 

...

            "

...

sglimposto": 

...

"ST",
            

...

 

...

 

...

        

...

"

...

valorbase": 

...

78.

...

3,
             

...

 

...

 

...

 

...

 

...

     "aliquota": 0,
      

...

 

...

 

...

 

...

 

...

            "

...

valortotalimposto": 

...

0 //

...

NÃO UNITÁRIO, precisa ser múltiplicado pela requisição.quantidade
    

...

 

...

 

...

 

...

 

...

            

...

},
            

...

 

...

 

...

 

...

 

...

    {
        

...

 

...

 

...

            "

...

sglimposto": 

...

"COFINS",
             

...

 

...

 

...

       

...

"valorbase": 78.3,
         

...

             "

...

aliquota": 

...

0,
        

...

 

...

 

...

            "

...

valortotalimposto": 

...

0 //

...

NÃO UNITÁRIO, precisa ser múltiplicado pela requisição.quantidade
            

...

        },
         

...

 

...

 

...

         {
      

...

 

...

 

...

 

...

 

...

            "

...

sglimposto": 

...

"CSLL",
                      "

...

valorbase": 

...

78.

...

3,

...


                      "

...

aliquota": 

...

0,
                      "

...

valortotalimposto": 

...

0 //

...

NÃO UNITÁRIO, precisa ser múltiplicado pela requisição.quantidade
            

...

 

...

 

...

      }
      

...

 

...

 

...

          ]
  

...

 

...

 

...

        

...

    

...

}
    

...

          

...

]
            

...

}

     </code></pre>
</div> <br>


<li>Com o retorno acima, o sistema deverá persistir as informações em tela, segundo o seguinte de-para</li>

<table class="striped custom-grey">
  <thead>
      <tr>
          <th>Retorno 

...

da Simulação</th>
          <th>Campo 

...

do SFA</th>
      </tr>
  </thead>
  <tbody>
      <tr>
  

...

        

...

<td>itemimposto.impostos.sglimposto</td>
          <td>pedidoimposto.idimposto</td>
    

...

 

...

 </

...

tr>
      <tr>
         

...

 <td>itemimposto.impostos.valorbase</td>
          <td>pedidoimposto.valorbasecalculo</td>
    

...

 

...

 </

...

tr>
      <tr>
         

...

 <td>itemimposto.impostos.aliquota</td>
          <td>pedidoimposto.valorbasecalculo</td>
  

...

 

...

 

...

  </tr>
      <tr>

...

       

...

   

...

<td>itemimposto.impostos.valortotalimposto</td>
    

...

      <td>pedidoimposto.valorimposto</td>
     

...

 </tr>
    

...

 

...

 <tr>
        

...

  <td>itemimposto.ordem / itemimposto.idproduto</td>
         

...

 <td>pedidoimposto.idpedidoproduto (procurar 

...

por pedidoproduto.ordem e pedidoproduto.idproduto respectivamente)</td>
      

...

</tr>
      

...

<tr>
     

...

 

...

    <td>itemimposto.valortotalfrete</td>
        

...

  <td>pedidoproduto.valorfrete</td>
      </tr>
      <tr>
 

...

 

...

        

...

<td>itemimposto.valortotalcomimpostos</td>
          

...

<td>pedidoproduto.valortotalcomimpostos</td>
      </tr>
  </tbody>
</table>
<br>
<li>Para a devida identificação do produto 

...

no retorno, o sistema deverá considerar a seguinte lógica:</li>
<li>Caso seja enviada a propriedade "idproduto" diferente de nulo/vazio, o sistema deve considerá-la para a identificação do produto referenciado na tela.</li>
<li>Caso contrário, o sistema deve considerar a propriedade "idproduto_externalid", de forma que a identificação do idproduto deve acontecer pela seguinte consulta:</li>
<br>
<div style="background-color: #2d2d2d; padding: 10px; border-radius: 5px;">
  <pre style="margin: 0; overflow-x: auto;"><code class="language-xml" style="color: #f8f8f2; font-family: 'Courier New', Courier, monospace;"> 
/* select idproduto from produto where codigoerp = :idproduto_externalid
</code></pre> </div><br>

<li>A representação dos impostos em tela seguirá o modelo atual, exibindo os valores persistidos na linha do item e nos resumos, agrupando os valores dos itens.</li>
<li>Ao gravar o pedido,caso a checkbox "Gravar pedido" estiver marcada, o sistema deverá restringir a gravação caso os impostos não estiverem calculados (cor verde), com mensagem: "É obrigatória a simulação de impostos para executar esta ação"</li>
<li>Ao finalizar o pedido, caso a checkbox "Finalizar pedido" estiver marcada, o sistema deverá restringir a finalização caso os impostos não estiverem calculados (cor verde), com mensagem: "É obrigatória a simulação de impostos para executar esta ação"</li>
<li>PS: É importante que tanto a requisição, quanto o retorno sejam logadas no console (f12) e log (server.log) da Web/Wildfly, para facilitar triagem de chamados envolvendo simulação de impostos.</li>
</ul>
</li>
</ul>
 

  <li><b>Modelo de requisição para simulação de impostos Protheus APIs Nativas</b></li>

<ul class="custom-list">
  <li>O Pentaho Carte, ao receber a requisição da aplicação na rota COMMONS_Bloco_TAXSIMULATION, deverá tratar os dados recebidos conforme o modelo da entrada da API de simulação de impostos do Protheus, conforme documentação disponível em <a href="https://api.totvs.com.br/apidetails/SalesTaxes_v1_000.json">https://api.totvs.com.br/apidetails/SalesTaxes_v1_000.json</a>.</li>
  <li>Com o retorno, o serviço de integração deverá implementar ao menos os campos definidos pela tabela de-para mencionada anteriormente.</li>
</ul>


  <li><b>Modelo de requisição para Simulação de impostos Datasul APIs Nativas</b></li>

<ul class="custom-list">
  <li>O Pentaho Carte, ao receber a requisição da aplicação na rota COMMONS_Bloco_TAXSIMULATION, deverá tratar os dados recebidos conforme o modelo da entrada da API de simulação de impostos do Datasul. Este modelo segue o mesmo padrão de body da documentação disponível em <a href="https://api.totvs.com.br/apidetails/SalesTaxes_v1_000.json">https://api.totvs.com.br/apidetails/SalesTaxes_v1_000.json</a>.</li>
  <li>A URL da rota é definida pelo padrão <code>${base_url}/api/ftp/v2/ItemTaxSimulationPublic</code>.</li>
  <li>Com o retorno, o serviço de integração deverá implementar ao menos os campos definidos pela tabela de-para mencionada anteriormente.</li>
</ul>

        

  <li><b>Modelo de requisição para simulação 

...

de impostos Genérica</b></li>

<ul class="custom-list">
  <li>Será implementado um modelo genérico padrão, onde o Pentaho deverá enviar requisições com autenticação básica definida segundo um modelo padrão, esperando receber retorno de acordo com o modelo padrão definido pela documentação "Manual - Plugin de Integração 'Simulação de Impostos'".</li>
  <li>Caso os sistemas terceiros se adaptem ao modelo padrão definido, a simulação de impostos poderá ser implementada sem necessidade de customização.</li>
  <li>Entretanto, se os sistemas não puderem se adaptar para receber e retornar a requisição conforme definido pela documentação, esse modelo de simulação de impostos será configurado na aplicação para disparar um serviço de integração customizado, respeitando apenas o contrato de requisição/retorno definido entre a aplicação e o Pentaho.</li>
</ul>

     
  
  
<!-- Second Card -->

           


        

...

      </div>

      

...

 

...

 </

...

div>
    </div> 

    <div 

...

id="

...

tab3"

...

 class="col s12">
      

...

<div class="tab-content">
        <div style="background-color: #f4f5f7; padding: 20px; margin-left: 50px; margin-right: 

...

50px;">
              <!-- Primeira coluna do conteúdo da guia 

...

2 -->
              

...

<div class="container">
                <h2 

...

class="custom-heading"><i class="fa-solid fa-circle-question"></i> PERGUNTAS FREQUENTES</h2>
                <ul 

...

class="

...

collapsible">
                  <li>
  

...

 

...

                 <div 

...

class="collapsible-header"><i class="material-icons">question_answer</i>Quais ERPs são compatíveis com este plugin?</div>
                

...

    <div class="collapsible-body"><span>O plugin é compatível com as APIs nativas do Datasul, Protheus 

...

e também suporta sistemas genéricos.
                

...

      </span></div>
              

...

 

...

 </li> 
                  

...

 

...


                    

...

<!-- Adicione mais perguntas e respostas aqui conforme necessário -->
                

...

</ul>
            </div>

      

...

      
              

...

 

...

             <!-- Primeira coluna do conteúdo da guia 

...

2 -->

            
           

...

 </div>
             
      

...

pedidoimposto.idimposto

...

pedidoimposto.valorbasecalculoreducao

...

pedidoimposto.valorimposto

...

  • Caso a checkbox "Gravar pedido" estiver marcada, o sistema deverá restringir a gravação caso os impostos não estiverem calculados (cor verde), com mensagem: "É obrigatória a simulação de impostos para executar esta ação"

...

  • Caso a checkbox "Finalizar pedido" estiver marcada, o sistema deverá restringir a finalização caso os impostos não estiverem calculados (cor verde), com mensagem: "É obrigatória a simulação de impostos para executar esta ação"

...

  • O sistema deverá adotar o status dos impostos como "não calculados" (cor amarela)

PS: É importante que tanto a requisição, quanto o retorno sejam logadas no console (f12) e log (server.log) da Web/Wildfly, para facilitar triagem de chamados envolvendo simulação de impostos.

4. Modelo de requisição para simulação de impostos Protheus APIs Nativas

O Pentaho Carte, recebendo a requisição da aplicação na rota COMMONS_Bloco_TAXSIMULATION, deverá tratar os dados recebidos segundo o modelo da entrada da API de simulação de impostos do Protheus, segundo documentação  https://api.totvs.com.br/apidetails/SalesTaxes_v1_000.json

Com o retorno, o serviço de integração deverá ao menos implementar os campos definidos pela tabela de-para do ponto 3.

5. Modelo de requisição para Simulação de impostos Datasul APIs Nativas

O Pentaho Carte, recebendo a requisição da aplicação na rota COMMONS_Bloco_TAXSIMULATION, deverá tratar os dados recebidos segundo o modelo da entrada da API de simulação de impostos do Datasul, que segue o mesmo modelo de body da documentação  https://api.totvs.com.br/apidetails/SalesTaxes_v1_000.json

A URL da rota é definida pelo padrão; ${base_url}/api/ftp/v2/ItemTaxSimulationPublic

Com o retorno, o serviço de integração deverá ao menos implementar os campos definidos pela tabela de-para do ponto 3.

6. Modelo de requisição para simulação de impostos Genérica

Será implementado um modelo genérico padrão, onde o Pentaho deverá enviar requisição com autenticação básica definida segundo modelo padrão e esperando receber retorno segundo modelo padrão definido pela documentação Manual - Plugin de Integração "Simulação de Impostos".

Caso os sistemas terceiros se adaptem ao modelo padrão definido acima, o requisito de simulação de impostos poderá ser implementados sem necessidade de customização.

...

</div>
  </div>

    
<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
<script>
  // Inicialização das tabs
  document.addEventListener("DOMContentLoaded", function () {
    var tabs = document.querySelectorAll(".tabs");
    M.Tabs.init(tabs);
  });
</script>

<script>
  const items = document.querySelectorAll("#indice li");

  items.forEach(item => {
      item.addEventListener('click', (e) => {
          const targetId = e.target.getAttribute('data-target');
          const targetElement = document.getElementById(targetId);
          window.scrollTo({
              top: targetElement.offsetTop - 10,
              behavior: "smooth"
          });
      });
  });
</script>   <script src="https://kit.fontawesome.com/c97d4c197a.js" crossorigin="anonymous"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
   
  
  
  <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script> 
  
  <script>hljs.highlightAll();</script>
    
  
  
  <script src="scripts.js"></script>
  
  <script>
    document.addEventListener('DOMContentLoaded', function() {
        var elems = document.querySelectorAll('.collapsible');
        var instances = M.Collapsible.init(elems);
    });
  </script>
    <script>
    document.addEventListener('DOMContentLoaded', (event) => {
        hljs.highlightAll();
    });
</script>