O sistema disponibiliza o plugin de nome "Simulação de impostos", onde o usuário terá a possibilidade de visualizar os impostos que serão gerados no pedido, tendo uma visão mais precisa dos valores.
A configuração é realizada nas configurações > Integração > Plugins de integração.
Antes de realizar as configurações de impostos é preciso validar as configurações gerais, afim de garantir que a aplicação possui os acessos ao "Carte", veja o material:
Nas configurações do Plugin, o usuário realiza o cadastro dos dados confirme a sua necessidade:
Campo
Dados informados
Campo que definirá se o plugin utilizado será Protheus, Datasul ou Outro Plugin dentro das diretrizes informada na documentação
URL de conexão
Url fornecida pelo plugin para gerar a integração com o cálculo de imposto
Usuário
Usuário do plugin
Senha
Senha do plugin
Timeout ao requisitar impostos (seg)
Tempo de espera para o retorno da consulta no Plugin
Obrigar simulação de impostos para
Campo que permite selecionar se haverá validação de imposto calculado tanto na gravação do pedido quanto na finalização.
Exemplo de configuração do Plugin Simulação de impostos:
Simulação de imposto no pedido
No pedido de venda, caso o Plugin de integração de código "imposto" estiver ativo,
O sistema disponibiliza o botão de "Calcular impostos" Web e ícone no Android.
Este botão é dinâmico, ou seja, o sistema muda a cor de ícone baseado na situação dos impostos:
Impostos não calculados: cor amarela
Impostos calculados:cor verde
Se alterado dados dos produtos, o ícone retorna para o status de "não calculado"
Ao clicar no botão de "Calcular impostos" o sistema dispara uma requisição POST para carte do Pentaho:
Imagem de exemplo:
A representação dos impostos em tela exibe os valores persistidos na linha do item e nos resumos, agrupando os valores dos itens.
Sobre a validação ao Cincuir o Pedido, varia confirme for selecionado na Configuração do Plugin de Integração:
Selecionado opção para validar ao gravar o pedido,
Caso a checkbox "Gravar pedido" estiver marcada, o sistema restringi 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"
Selecionado opção para validar ao finalizar o pedido
Caso a checkbox "Finalizar pedido" estiver marcada, o sistema restringi 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"
Deck of Cards
effectDuration
0.5
history
false
id
samples
effectType
fade
Card
default
true
id
1
label
Protheus
Modelo de requisição para simulação de impostos Protheus APIs Nativas
O Pentaho Carte, recebe a requisição da aplicação na rota COMMONS_Bloco_TAXSIMULATION, e trata 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 implementa os campos definidos pela tabela de-para do Modelo Protheus (veja em "Escopo Técnico).
Card
default
true
id
2
label
Datasul
Modelo de requisição para Simulação de impostos Datasul APIs Nativas
O Pentaho Carte, recebe a requisição da aplicação na rota COMMONS_Bloco_TAXSIMULATION, e trata os dados recebidos segundo o modelo da entrada da API de simulação de impostos do Datasul, que segue o modelo: API-REST Imposto/Classificação Imposto
A URL da rota é definida pelo padrão; ${base_url}/api/ftp/v2/ItemTaxSimulationPublic
Com o retorno, o serviço de integração implementa os campos definidos pela tabela de-para do Modelo Datasul (veja em "Escopo Técnico).
Card
default
true
id
3
label
Genérico
Modelo de requisição para simulação de impostos Genérica
Foi também implementado um modelo genérico padrão, onde o Pentaho envia requisição com autenticação básica definida segundo modelo padrão e esperando receber retorno segundo modelo padrão definido pela documentação 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.
Entretanto, caso os sistemas não possam se adaptar para receber e retornar a requisição segundo o definido pela documentação acima, esse modelo de simulação de impostos será configurado na aplicação para que dispare serviço de integração customizado, que respeita apenas o contrato requisição/retorno definido entre aplicação/pentaho.
Card
label
Escopo Técnico
Escopo Técnico
Pelo tools, opção 5, o sistema cria o registro na tabela pluginintegracao.codigo com valor = IMPOSTO
Para funcionar corretamente, o cadastro das configurações do plugin de Imposto insere na tabela pluginintconfig as seguintes informações:
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"
Registro na tabela pluginintconfig:
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)
Campo de label "URL de conexão": textual obrigatório
Registro na tabela pluginintconfig:
idpluginintegracao = ID da tabela pluginintegracao com codigo = IMPOSTO
codigoelemento = IMPOSTO
agrupador = 0
sglcampo = IMPOSTO_URL
idnativo = 0
valor = Valor inserido pelo usuário
Grupo de elementos de label "Autenticação"
Campo de label "Usuário": textual obrigatório
Registro na tabela pluginintconfig:
idpluginintegracao = ID da tabela pluginintegracao com codigo = IMPOSTO
codigoelemento = IMPOSTO
agrupador = 0
sglcampo = IMPOSTO_USUARIO
idnativo = 0
valor = Valor inserido pelo usuário
Campo de label "Senha": textual, obrigatório, tipado como "password" para não pemitir visualização direta da senha na tela.
Registro na tabela pluginintconfig:
idpluginintegracao = ID da tabela pluginintegracao com codigo = IMPOSTO
codigoelemento = IMPOSTO
agrupador = 0
sglcampo = IMPOSTO_SENHA
idnativo = 0
valor = Valor inserido pelo usuário
Campo de label "Timeout ao requisitar impostos (seg)": campo numérico, se não informado, adotar o padrão 30 segundos
Registro na tabela pluginintconfig:
idpluginintegracao = ID da tabela pluginintegracao com codigo = IMPOSTO
codigoelemento = IMPOSTO
agrupador = 0
sglcampo = IMPOSTO_TIMEOUT
idnativo = 0
valor = Valor inserido pelo usuário
Campo de label "Obrigar simulação de impostos para:": Checkbox, seleção opcional
Checkbox de label "Gravar pedido"
Registro na tabela pluginintconfig:
idpluginintegracao = ID da tabela pluginintegracao com codigo = IMPOSTO
codigoelemento = IMPOSTO
agrupador = 0
sglcampo = IMPOSTO_OBRIGATORIO_AO_GRAVAR
idnativo = 0
valor = Valor 0 ou1
Checkbox de label "Finalizar pedido"
Registro na tabela pluginintconfig:
idpluginintegracao = ID da tabela pluginintegracao com codigo = IMPOSTO
Explicando cada um dos campos do corpo da simulação de impostos
"SalesType": "N"
Tipo da venda, usa o valor “N" fixo
"CustomerId": "0D69DO"
Código do cliente, extraído do campo PARCEIRO.NUMEROMATRICULA selecionado no cabeçalho da ordem de venda
"CustomerUnit": "01"
Código da loja selecionado no cabeçalho da ordem de venda, extraído do campo LOCAL.SPLIT_PART(CODIGOERP,'#',4), ou se for nulo, FILIALVENDA.SPLIT_PART(CODIGOERP,'#',3)
"CustomerIdDelivery": "0D69DO"
Código do cliente, extraído do campo PARCEIRO.NUMEROMATRICULA selecionado na entrega da ordem de venda
"CustomerUnitDelivery": "01"
Código da loja do cliente, extraído do campo LOCAL.SPLIT_PART(CODIGOERP,'#',4) selecionado na entrega da ordem de venda
"CustomerType": "S"
Tipo do cliente, usa o valor extraído do campo CLASSIFICACAOPARCEIRO.CODIGOERP
"Payment": "002"
Código da condição de pagamento, campo CONDICAOPAGAMENTO.SPLIT_PART(CODIGOERP,'#',2) selecionado no cabeçalho da ordem de venda
Campo Calculado: total bruto dos itens - total liquido dos itens ((1 - (totalliquido/ totalbruto)) * 100) na primeira tag, nas demais não é enviado nenhum valor.
"Currency": 1
Fixo 1
"Freight": 0
Valor do frete inserido na ordem de venda, campo PEDIDOENTREGA.VALORFRETE
"Insurance": 0
Valor do seguro do pedido, campo PEDIDOENTREGA.VALORSEGURO
"Expense": 0
Valor de despesas acessórias, campo PEDIDOENTREGA.VALORDESPESA
"ListofProducts"."ItemId": “1”
Número sequencial de cada item dentro da ordem de venda, campo PEDIDOPRODUTO.ORDEM
"ListofProducts"."ProductId": "181647"
Código do produto inserido nos itens da ordem de venda, campo PRODUTO.SPLIT_PART(CODIGOERP,'#',2)
"ListofProducts"."Quantity": 90
Quantidade do item em questão inserido nas ordens de venda, campoPEDIDOPRODUTO.QUANTIDADE
"ListofProducts"."UnitaryValue": 10
Valor unitário do item inserido nas ordens de venda (valor cheio, não considera desconto), campo PEDIDOPRODUTO.PRECOVENDA
"ListofProducts"."TotalValue": 900
Valor total do item inserido nas ordens de venda, PEDIDOPRODUTO.QUANTIDADE * PEDIDOPRODUTO.PRECOVENDA
"ListofProducts"."ItemDiscountPercentage": 13
Percentual de desconto inserido no item da ordem de venda, campo PEDIDOPRODUTO.PERCENTUALDESCONTO
"ListofProducts"."ItemDiscountValue": 0
Fixo 0
"ListofProducts"."OperationType": "03"
TES INTELIGENTE, campo TIPOPEDIDO.CODIGOERP
OBS: Caso o tipo de pedido do item for nulo, é enviado o do cabeçalho
"ListofProducts"."TES": "501"
TES PADRÃO, campo TIPOPEDIDO.SPLIT_PART(CODIGOERP,'#',2)
OBS: Caso o tipo de pedido do item for nulo, é enviado o do cabeçalho
Card
default
true
id
2
label
Datasul
Modelo Datasul
Abaixo está o escopo do cálculo de imposto do Datasul.
A integração recebe a solicitação da aplicação via Carte, busca, processa e retorna para a mesma.
Abaixo estão exemplos via POSTMAN:
URL
Na URL para o Datasul, o formato será o seguinte:
POST {{URL}/api/ftp/v2/ItemTaxSimulationPublic
Substitua a variável URL pelo caminho da API, informado pelo cliente.
Exemplo:
Autorização
Na aba de autorização, é selecionado o tipo Basic e informado os dados de usuário e senha:
Header
No header da requisição, informaado o tipo do conteúdo:
Content-Type: application/json
Body
No corpo da mensagem, substituido os dados da ordem de venda nas tags correspondentes.
Campo Calculado: total bruto dos itens - total liquido dos itens ((1 - (totalliquido/ totalbruto)) * 100) na primeira tag, nas demais não é enviado nenhum valor.
"Currency": 1
Moeda selecionada na ordem de venda, campo INDEXADOR.CAST(SPLIT_PART(CODIGOERP,'#',2) AS INT)
"Freight": 10
Valor do frete inserido na ordem de venda, campo PEDIDOENTREGA.VALORFRETE
"Insurance": 0
Valor do seguro do pedido, campo PEDIDOENTREGA.VALORSEGURO
"Expense": 0
Valor de despesas acessórias, campo PEDIDOENTREGA.VALORDESPESA
"ListofProducts"."ItemId": “01”
Número sequencial de cada item dentro da ordem de venda, campo PEDIDOPRODUTO.ORDEM * 10
"ListofProducts"."ProductId": "3395979"
Código do produto inserido nos itens da ordem de venda, campo PRODUTO.SPLIT_PART(CODIGOERP,'#',2)
"ListofProducts"."Quantity": 10
Quantidade do item em questão inserido nas ordens de venda, campoPEDIDOPRODUTO.QUANTIDADE
"ListofProducts"."UnitaryValue": 100
Valor unitário do item inserido nas ordens de venda (valor cheio, não considera desconto), campo PEDIDOPRODUTO.PRECOVENDA
"ListofProducts"."TotalValue": 1000
Valor total do item inserido nas ordens de venda, PEDIDOPRODUTO.QUANTIDADE * PEDIDOPRODUTO.PRECOVENDA
"ListofProducts"."ItemDiscountPercentage": 10
Percentual de desconto inserido no item da ordem de venda, campo PEDIDOPRODUTO.PERCENTUALDESCONTO
"ListofProducts"."ItemDiscountValue": 100
Fixo 0
"ListofProducts"."OperationType": "02"
Tipo de operação, campo TIPOPEDIDO.CODIGOERP
OBS: Caso o tipo de pedido do item for nulo, é enviado o do cabeçalho.
{ "valortotalcomimpostos": 15.00, "valortotalimpostos": 16.00, "valortotaldespesa": 6.00, //pedidoentrega.valordespesa "valortotalseguro": 7.00, //pedidoentrega.valorseguro "pedidoimposto": [ { "sglimposto": "ICMS", //20 caracteres max "aliquota": 11.00, "valortotalimposto": 0.5, }, { "sglimposto": "ST", //20 caracteres max "aliquota": 11.00, "valortotalimposto": 0.5 }, { "sglimposto": "IPI", //20 caracteres max "aliquota": 11.00, "valortotalimposto": 0.5 } ], "itemimposto": [ { "ordem": 1, //pedidoproduto.ordem "idproduto": 8, //pedidoproduto.idproduto // "idproduto_externalid": "cod", //pedidoproduto.idproduto > codigoerp //80 caracteres max "valortotalcomimpostos": 12.00, //NAO UNITARIO, precisa ser multiplicado pela requisicao.quantidade "valortotalfrete": 15.00, //NAO UNITARIO, precisa ser multiplicado pela requisicao.quantidade "impostos": [ { "sglimposto": "ICMS", //20 caracteres max "valorbase": 10.00, "aliquota": 11.00, "valortotalimposto": 12.00 //NAO UNITARIO, precisa ser multiplicado pela requisicao.quantidade }, { "sglimposto": "IPI", //20 caracteres max "valorbase": 10.00, "aliquota": 11.00, "valortotalimposto": 12.00 //NAO UNITARIO, precisa ser multiplicado pela requisicao.quantidade }, { "sglimposto": "ST", //20 caracteres max "valorbase": 10.00, "aliquota": 11.00, "valortotalimposto": 12.00 //NAO UNITARIO, precisa ser multiplicado pela requisicao.quantidade } ] }, { "ordem": 1, //pedidoproduto.ordem "idproduto": 8, //pedidoproduto.idproduto "idproduto_externalid": "cod", //pedidoproduto.idproduto > codigoerp //80 caracteres max "valortotalcomimpostos": 12.00, //NAO UNITARIO, precisa ser multiplicado pela requisicao.quantidade "valortotalfrete": 15.00, //NAO UNITARIO, precisa ser multiplicado pela requisicao.quantidade "impostos": [ { "sglimposto": "ICMS", //20 caracteres max "valorbase": 10.00, "aliquota": 11.00, "valortotalimposto": 12.00 //NAO UNITARIO, precisa ser multiplicado pela requisicao.quantidade }, { "sglimposto": "IPI", //20 caracteres max "valorbase": 10.00, "aliquota": 11.00, "valortotalimposto": 12.00 //NAO UNITARIO, precisa ser multiplicado pela requisicao.quantidade }, { "sglimposto": "ST", //20 caracteres max "valorbase": 10.00, "aliquota": 11.00, "valortotalimposto": 12.00 //NAO UNITARIO, precisa ser multiplicado pela requisicao.quantidade } ] } ] //Impostos para o item do pedido }
Card
default
true
id
4
label
Informações complementares Datasul
Liberação de acesso API nativa
Inicialmente quando utilziado a API nativa, o usuario da integração deve possuir acesso a estrutura da API dentro do DATASUL, para isso o cliente precisa realziar a seguinte configuração:
Acessar a tela do cadastro de permissão de usuário, CD0821 e realizar o cadastro do usuario que faz a chamada da API.
Outro erro que pode ser apresentado é de "data do faturamento maior que a data do próximo faturamento" é em relação a tua série, la no FT0114, usado para visualizar a data do próximo faturamento, para funcionamento, pode ser removido o parâmetro "controle próximo faturamento" e deixar o campo em branco pra série e estab que esta sendo usado.
Informações
title
Erro
O seguinte erro é apresentado caso as telas acima não estejam de acordo com as liberações.
{ "detailedMessage": "Usuário integrador não tem permissão para executar esse programa.\n", "code": "852", "details": [ { "detailedMessage": "A data de emissão da nota fiscal informada é maior que a data do próximo faturamento da série/estabelecimento.\n", "code": "5173", "message": "Data do faturamento maior que data do próximo faturamento", "type": "error" }, { "detailedMessage": "", "code": "17006", "message": "Ocorreu algum erro técnico durante a simulação dos impostos. Favor avaliar o log do Appserver Progress.", "type": "error" } ], "message": "Usuário integrador não Cadastrado no Banco Comercial", "type": "error" }
Quando as liberações estão corretas o calculo de imposto é possivel, conforme imagem abaixo:
Retorno da Simulação
Campo do SFA
itemimposto.impostos.sglimposto
pedidoimposto.idimposto
itemimposto.impostos.valorbase
pedidoimposto.valorbasecalculoreducao
itemimposto.impostos.aliquota
pedidoimposto.valorbasecalculo
itemimposto.impostos.valortotalimposto
pedidoimposto.valorimposto
itemimposto.ordem / itemimposto.idproduto
pedidoimposto.idpedidoproduto (procurar por pedidoproduto.ordem e pedidoproduto.idproduto respectivamente)
itemimposto.valortotalfrete
pedidoproduto.valorfrete
itemimposto.valortotalcomimpostos
pedidoproduto.valortotalcomimposto
Abaixo está o escopo do cálculo de imposto do Datasul.
A integração recebe a solicitação da aplicação via Carte, busca, processa e retorna para a mesma.
Abaixo estão exemplos via POSTMAN:
URL
Na URL para o Datasul, o formato será o seguinte:
POST {{URL}/api/ftp/v2/ItemTaxSimulationPublic
Substitua a variável URL pelo caminho da API, informado pelo cliente.
Exemplo:
Autorização
Na aba de autorização, é selecionado o tipo Basic e informado os dados de usuário e senha:
Header
No header da requisição, informaado o tipo do conteúdo:
Content-Type: application/json
Body
No corpo da mensagem, substituido os dados da ordem de venda nas tags correspondentes.