<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>    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>    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>   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>  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>  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/tdnPIX2S.mp4" type="video/mp4">
</video>
</p><br>
</section>
<section id="section4" style="margin-top: 40px;">
<h2 class="custom-heading"><i class="fa-solid fa-signs-post"></i>  EXEMPLO 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>  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
},
{
"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>
</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>
|