Geração de Cálculo de Impostos no Protheus por Item

Geração de Cálculo de Impostos no Protheus por Item

Hoje, vamos demonstrar uma funcionalidade (customização) que pode ser aplicada a várias rotinas do ERP: Geração de cálculo de impostos no Protheus por Item.

Um exemplo de usabilidade de tal funcionalidade, seria por exemplo, obter, calcular e armazenar as alíquotas, bases e valores dos impostos, em campos customizados nos itens do Pedidos de Venda (MATA410), Orçamento (MATA415), etc.

Muitas vezes, precisamos obter as alíquotas, bases e valores dos impostos em relatórios ou em diversos processos do ERP, e infelizmente em muitas rotinas, o Protheus só exibe o cálculo dos mesmos em tempo de execução, tornando uma árdua tarefa recuperar os valores dos impostos.

No exemplo que iremos disponibilizar, utilizamos a função padrão de cálculo de impostos da ToTvs, que no caso é a MatxFis, obtendo o mesmos valores gerados pelas rotinas padrões Protheus.

Caso tenha cadastrado no Protheus exceções fiscais e/ou utilização de Pontos de Entrada para alteração de algum imposto, nossa customização também irá contemplar automaticamente, tais situações.

Além dos cálculos de base e valores dos impostos, iremos demonstrar também, como recuperar as alíquotas de ICMS e IPI.

Na nossa customização, iremos utilizar apenas cinco funções para obter as alíquotas e gerar as bases e valores dos impostos, porém a rotina MatxFis, possui uma enormidade de funções.

Para verificar todas as opções e a documentação completa da MatxFis, basta acessar a nossa área de Downloads, e em seguida escolher a opção Apostilas. Na árvore de apostilas, clique em AdvPL. Em seguida clique na apostila “Guia de Utilização MatxFis”.

Se preferir fazer o download diretamente, deixamos o link do manual, na seção “Anexos” no final do post.

As funções que iremos usar em nosso fonte, são as seguintes:

  • MaFisRelImp – Busca referências fiscais (“NF_” e “”IT_”) no Dicionário de Dados (Sx3);
  • MaFisIni – Inicia o processo de cálculo da MatxFis, gerando um array do Cabeçalho do Documento Fiscal;
  • MaFisAdd – Inclui um novo item ao array aNFItem da MatxFis, disparando o cálculo das bases e impostos, e recuperando as alíquotas de impostos;
  • MaFisRet – Retorna os valores dos impostos calculados, conforme suas respectivas referencias (Cabeçalho: “NF_”. Item: “IT_” e “LF”);
  • MaFisEnd – Finaliza o uso da função MatxFis, “zerando” os arrays de cálculo interno.

Para que possamos exemplificar a utilização da nossa User Function, vamos criar alguns campos, para armazenamento das alíquotas, bases e valores dos impostos na tabela de Itens do Pedido de Venda (SC6) do Protheus.

As alíquotas que iremos recuperar diretamente da MatxFis, são as seguintes:

  • ICMS;
  • IPI.

As bases e valores dos impostos calculados, serão os seguintes:

  • ICMS;
  • IPI;
  • ICMS ST (Substituição Tributária);
  • PIS;
  • COFINS;
  • ISS.

Segue descritivo técnico dos campos, que deverão ser criados na tabela de itens do Pedido de Venda (SC6):

CampoTipoTam.Dec.FormatoContextoPrioridadeTítuloDescrição
C6_XALICMS2 - Numérico52@E 99.991 - Real2 - Visualizar% ICMSAliquota do ICMS
C6_XBSICMS2 - Numérico122@E 999,999,999.991 - Real2 - VisualizarBase ICMSValor da Base do ICMS
C6_XVLICM 2 - Numérico122@E 999,999,999.991 - Real2 - VisualizarValor ICMSValor do ICMS
C6_XALIPI2 - Numérico52@E 99.991 - Real2 - Visualizar% IPIAliquota do IPI
C6_XBSIPI2 - Numérico122@E 999,999,999.991 - Real2 - VisualizarBase IPIValor da Base do IPI
C6_XVLIPI2 - Numérico122@E 999,999,999.991 - Real2 - VisualizarValor IPIValor do IPI
C6_XBSISS2 - Numérico122@E 999,999,999.991 - Real2 - VisualizarBase ISSBase do ISS
C6_XVLISS2 - Numérico122@E 999,999,999.991 - Real2 - VisualizarValor ISS Valor do ISS
C6_XBSICST2 - Numérico122@E 999,999,999.991 - Real2 - VisualizarBase STValor da Base do ICMS ST
C6_XVLICST2 - Numérico122@E 999,999,999.991 - Real2 - VisualizarValor STValor do ICMS ST
C6_XBSPIS2 - Numérico122@E 999,999,999.991 - Real2 - VisualizarBase PISValor da Base do PIS
C6_XVLPIS2 - Numérico122@E 999,999,999.991 - Real2 - VisualizarValor PISValor do PIS
C6_XBSCOF2 - Numérico122@E 999,999,999.991 - Real2 - VisualizarBase COFINS Valor da Base do COFINS
C6_XVLCOF2 - Numérico122@E 999,999,999.991 - Real2 - VisualizarValor COFINSValor da COFINS

Para quem quiser realizar testes, disponibilizamos abaixo na seção “Anexos”, os Patchs para criação dos campos do descritivo acima, tanto  para P11, como para o P12.

Após aplicar o patch no repositório, basta executar a função U_X3CALCIMP no “Programa Inicial, na tela de “Parâmetros Iniciais” do Protheus, e seguir as instruções, para criar os campos customizados no Sx3. Conforme exemplo abaixo:

Função X3CALCIMPImagem 01 – Parâmetros Inicias

Após digitar o nome do “Programa Inicial”, e confirmar os campo de Conexão e Ambiente, basta clicar no botão “OK”. Após tal procedimento, a seguinte tela será exibida:

Atualização Dicionario de DadosImagem 02 – Informativo atualização dos Dicionários de Dados

Após ler a mensagem de alerta, clique no botão “OK” (Check Verde).

Agora digite o usuário e senha do Administrador, conforme tela abaixo:

Imagem 03 – Digitação Usuário e Senha de Administrador

Selecione a empresa que deseja atualizar, e clique no botão “Processar”:

Empresa AtualizaçãoImagem 04 – Seleção de Empresa para atualização dos Dicionários de Dados

Confirme a atualização dos dicionários clicando em “Sim”:

Confirmação Atualização DicionariosImagem 05 – Confirmação de atualização dos Dicionários de Dados

Aguarde a atualização dos Dicionários:

Aguardando Atualização DicionáriosImagem 06 – Tela de processamento de atualização dos Dicionários de Dados

Pronto. Atualização finalizada, basta conferir o log de processamento:

Log de ProcessamentoImagem 07 – Tela de Log de Processamento

Agora, compile o fonte abaixo. Se preferir faça o download o patch da função CalcImps tanto para P11 como para P12, na seção de Anexos do post:

#Include "Protheus.ch"
#Include "RwMake.ch"

User Function CalcImps()

  //Busca referencias fiscais ("NF_" e ""IT_") no Dicionario de Dados (Sx3)
  Local aRelImp   := MaFisRelImp("MATA410",{"SF2","SD2"})

  //Variaveis para obtencao das posicoes dos campos na GetDados
  Local nPosPrd	  := aScan(aHeader,{|x| Alltrim(x[2]) == "C6_PRODUTO"})
  Local nPosTes   := aScan(aHeader,{|x| Alltrim(x[2]) == "C6_TES"})
  Local nPosQtVen := aScan(aHeader,{|x| Alltrim(x[2]) == "C6_QTDVEN"})
  Local nPosPrUnt := aScan(aHeader,{|x| Alltrim(x[2]) == "C6_PRUNIT"})
  Local nPosVDes  := aScan(aHeader,{|x| Alltrim(x[2]) == "C6_VALDESC"})
  Local nPosVlr   := aScan(aHeader,{|x| Alltrim(x[2]) == "C6_VALOR"})
  Local nPosAlICM := aScan(aHeader,{|x| Alltrim(x[2]) == "C6_XALICMS"})
  Local nPosBsICM := aScan(aHeader,{|x| Alltrim(x[2]) == "C6_XBSICMS"})
  Local nPosVlICM := aScan(aHeader,{|x| Alltrim(x[2]) == "C6_XVLICM"})
  Local nPosAlIPI := aScan(aHeader,{|x| Alltrim(x[2]) == "C6_XALIPI"})
  Local nPosBsIPI := aScan(aHeader,{|x| Alltrim(x[2]) == "C6_XBSIPI"})
  Local nPosVlIPI := aScan(aHeader,{|x| Alltrim(x[2]) == "C6_XVLIPI"})
  Local nPosBsIss := aScan(aHeader,{|x| Alltrim(x[2]) == "C6_XBSISS"})
  Local nPosVlISS := aScan(aHeader,{|x| Alltrim(x[2]) == "C6_XVLISS"})
  Local nPosBsST  := aScan(aHeader,{|x| Alltrim(x[2]) ==  "C6_XBSICST"})
  Local nPosVlST  := aScan(aHeader,{|x| Alltrim(x[2]) == "C6_XVLICST"})
  Local nPosBsPIS := aScan(aHeader,{|x| Alltrim(x[2]) == "C6_XBSPIS"})
  Local nPosVlPIS := aScan(aHeader,{|x| Alltrim(x[2]) == "C6_XVLPIS"})
  Local nPosBsCOF := aScan(aHeader,{|x| Alltrim(x[2]) == "C6_XBSCOF"})
  Local nPosVlCOF := aScan(aHeader,{|x| Alltrim(x[2]) == "C6_XVLCOF"})

  //Inicia o processo de calculo da MatxFis, gerando um array do Cabecalho do Documento Fisca/
  MaFisIni(	M->C5_CLIENTE,;		// 1-Codigo Cliente/Fornecedor
  M->C5_LOJACLI,;			// 2-Loja do Cliente/Fornecedor
  IIf(M->C5_TIPO $ 'DB', "F", "C"),;	// 3-C:Cliente , F:Fornecedor
  M->C5_TIPO,;				// 4-Tipo da NF
  M->C5_TIPOCLI,;			// 5-Tipo do Cliente/Fornecedor
  aRelImp,;				// 6-Relacao de Impostos que suportados no arquivo
  ,;					// 7-Tipo de complemento
  ,;					// 8-Permite Incluir Impostos no Rodape .T./.F.
  "SB1",;				// 9-Alias do Cadastro de Produtos - ("SBI" P/ Front Loja)
  "MATA461")				// 10-Nome da rotina que esta utilizando a funcao

  //Inclui um novo item ao array aNFItem da MatxFis, disparando o calculo das bases e impostos
  MaFisAdd(aCols[n][nPosPrd],; 	  		// 1-Codigo do Produto ( Obrigatorio )
  aCols[n][nPosTes],;				// 2-Codigo do TES ( Opcional )
  aCols[n][nPosQtVen],;	  			// 3-Quantidade ( Obrigatorio )
  aCols[n][nPosPrUnt],;	  			// 4-Preco Unitario ( Obrigatorio )
  aCols[n][nPosVDes],;    			// 5-Valor do Desconto ( Opcional )
  ,;		            			// 6-Numero da NF Original ( Devolucao/Benef )
  ,;		            			// 7-Serie da NF Original ( Devolucao/Benef )
  0,;			        		// 8-RecNo da NF Original no arq SD1/SD2
  0,;						// 9-Valor do Frete do Item ( Opcional )
  0,;						// 10-Valor da Despesa do item ( Opcional )
  0,;            				// 11-Valor do Seguro do item ( Opcional )
  0,;						// 12-Valor do Frete Autonomo ( Opcional )
  (aCols[n][nPosVlr]+aCols[n][nPosVDes]),;	// 13-Valor da Mercadoria ( Obrigatorio )
  0)						// 14-Valor da Embalagem ( Opiconal )

  //Atribui aos campos de aliquotas de ICMS e IPI, os valores de porcentagem do ICMS e IPI
  aCols[n][nPosAlICM] := MaFisRet(1, "IT_ALIQICM")
  aCols[n][nPosAlIPI] := MaFisRet(1, "IT_ALIQIPI")

  //Atribui aos campos de Bases e Valores dos Impostos, os valores de ICMS, ICMS ST e IPI	
  aCols[n][nPosBsICM] := MaFisRet(1, "IT_BASEICM")
  aCols[n][nPosVlICM] := MaFisRet(1, "IT_VALICM")
  aCols[n][nPosBsST]  := MaFisRet(1, "IT_BASESOL")
  aCols[n][nPosVlST]  := MaFisRet(1, "IT_VALSOL")
  aCols[n][nPosBsIPI] := MaFisRet(1, "IT_BASEIPI")
  aCols[n][nPosVlIPI] := MaFisRet(1, "IT_VALIPI")

  //Atribui aos campos de Bases e Valores dos Impostos, os valores de ISS
  aCols[n][nPosBsIss]  := MaFisRet(1, "IT_BASEISS")
  aCols[n][nPosVlISS]  := MaFisRet(1, "IT_VALISS")

  //Atribui aos campos de Bases e Valores dos Impostos, os valores de PIS e COFINS	
  aCols[n][nPosBsPIS] := MaFisRet(1, "IT_BASEPS2")
  aCols[n][nPosVlPIS] := MaFisRet(1, "IT_VALPS2")	
  aCols[n][nPosBsCOF] := MaFisRet(1, "IT_BASECF2")
  aCols[n][nPosVlCOF] := MaFisRet(1, "IT_VALCF2")

  //Finaliza o uso da funcao MatxFis, "zerando" os arrays de calculos interno
  MaFisEnd()

Return .T.

Finalizados os procedimentos, basta utilizar o fonte customizado em gatilhos (lembrando que se for utilizar o mesmo em gatilhos, precisa alterar o return da rotina, para os respectivos valores), ou diretamente em validações de campos, dos Itens do Pedido de Venda (SC6).

No caso do nosso exemplo, vamos colar a função customizada CalcImps, na “Validação de Usuário” no campo TES (C6_TES), do Pedido de Vendas.

Validação de Usuário TESImagem 08 – Tela de Configuração de Campo – Sx3

Agora basta entrar no Módulo de Faturamento, acessar a rotina de Pedidos de Venda, preencher as informações de cabeçalho e dos itens para verificar o funcionamento da customização.

Se observarem no fonte CalcImps, utilizamos o retorno dos valores dos impostos, através das variáveis de itens da função MaFisRet (MaFisRet(1, “IT_XXXXX”)).

Fixamos o número um no primeiro parâmetro da função MaFisRet, pois estamos chamando a função de calculo de impostos por item (linha), com isso, nós criamos e finalizamos os arrays de retorno dos impostos da função MatxFis, cada fez que chamamos a função CalcImps. Com isso, o array de retorno do MatxFis sempre terá apenas uma posição.

Se utilizássemos, por exemplo, a função CalcImps em um Ponto de Entrada ao salvar o Pedido de Venda, deveríamos colocar a função de adição de itens no array de cálculo do MatxFis (MaFisAdd) dentro de um laço (For, While, etc.), adicionando todos os itens do Pedido.

Consequentemente para recuperar os valores dos impostos do array do MatxFis, através do retorno da função MaFisRet (MaFisRet(xx, “IT_XXXXX”)), deveríamos passar no primeiro parâmetro da função, o número da posição do array de retorno, correspondente ao número do item do Pedido de Venda, fazendo isso, através também, de um laço (For, While, etc.).

Para demonstrarmos o funcionamento prático da função CalcImps, incluímos um novo Pedido de Venda com dos itens. Comparamos os valores de impostos gerados pela função CalcImps, com os  valores calculados pela Planilha Financeira do Pedido de Venda. Veja o resultado:

Itens Peido de Venda x Planilha FinanceiraImagem 09 – Itens do Pedido de Venda x Planilha Financeira

Podemos verificar que, somando os valores dos impostos dos campos customizados do itens do Pedido de Venda (box em vermelho), os mesmos “batem” exatamente com os valores da Planilha Financeira (box em verde). Além das suas respectivas alíquotas e bases, também estarem corretas.

Neste post, fizemos a recuperação das alíquotas de ICMS e IPI, além dos cálculos das bases e valores de impostos, através do retorno dos valores do array de itens da função MatxFis (“IT_XXXXXX”).

Em um próximo post, iremos demonstrar como recuperar os mesmos valores dos impostos, porém através do array de cabeçalho do MatxFis (“NF_XXXXXX”).

Bom galera, espero que vocês tenham gostado do post de hoje, e que tal funcionalidade venha a ajudar os nossos amigos analistas.

Dúvidas, críticas, elogios, basta deixar uma mensagem nos comentários.

Obrigado a todos e até a próxima.

Anexos


Anexo 01: Para obter a apostila “Guia de Utilização MatxFis”, basta clicar aqui;

Anexo 02:  Para obter o fonte da função CalcImps diretamente do nosso GitHub, basta clicar aqui;

Anexo 03: Para obter o Patch de criação dos campos de exemplos no Sx3 para Protheus 11 e Protheus 12 TOPConnect Português, clicar aqui;

Anexo 04: Para obter o Patch da função CalcImps, para Protheus 11 e Protheus 12 TOPConnect Português, clicar aqui.


Smart Siga - TI Inteligente

 


Referências:

Guia de Utilização MatxFis
Criação de Campos Sx3 0 ExporDic Ernani Forastieri
Compartilhe:
  •  
  •  
  •  

2 thoughts on “Geração de Cálculo de Impostos no Protheus por Item

  1. Boa tarde

    estou utilizando ao PE MTA410 para atualizar todos os itens do PV, porem, nao tive sucesso ao alterar para looping, como sugerido no texto.

    Poderiam me ajudar?

    agradeço!

    1. Bom dia Felipe,

      Primeiramente obrigado por acompanhar nosso site.

      Se eu não me engano, o PE MTA410 é executado para validação da linha da GetDados do Pedido de Venda.

      Tente fazer a geração dos impostos, nesse caso, em vez de um Loop para todos os itens, fazer o cálculo linha por linha, já que esse PE é invocado em cada item da GetDados.

      Se você necessita fazer a validação de todos os itens de uma única vez, tente utilizar um PE que é executado, por exemplo, quando o Pedido de Venda é salvo.

      Qualquer coisa estamos a disposição.

      Abraços.

      Smart Siga
      TI Inteligente

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Seja um Analista VIP!!!

Recebe em primeira mão as novidades do Canal Smart Siga, além de conteúdos exclusivos.