Clipper On Line • Ver Tópico - Cálculo de impostos
Página 1 de 1

Cálculo de impostos

MensagemEnviado: 02 Out 2018 20:04
por JoséQuintas
Faz tempo que não atualizo essa minha rotina.
Importação nunca usei, mas coloquei também.
Mistura DBF e MySQL, não sei se vai ser problema.... rs

METHOD ItemCalculaImpostos() CLASS Pedido

   LOCAL mipIcmBas, mipIcmAli, mipIcmRed, mipIcmVal
   LOCAL mipFcpAli, mipFcpVal
   LOCAL mipIpiBas, mipIpiAli, mipIpiVal
   LOCAL mipIssBas, mipIssAli, mipIssVal
   LOCAL mipPisBas, mipPisAli, mipPisVal
   LOCAL mipCofBas, mipCofAli, mipCofVal
   LOCAL mipSubBas, mipSubIva, mipSubAli, mipSubRed, mipSubVal
   LOCAL mipValNot, mipIIBas, mipIIVal
   LOCAL mipIcsBas, mipIcsVal, mipIcsAli, mipIpiIcm
   LOCAL mipValPro, mipValFre, mipValSeg, mipValOut, nCont, mipLeis, mTmpLei
   LOCAL mipValDes, mipIIAli, mipDifAlii, mipDifAliu, mipDifAlif, mipDifVali, mipDifValf, mipDifBas, mipDifCal
   LOCAL cnJPIBPT := ADOClass():New( AppcnMySqlLocal() )

   IF Empty( jppedi->pdPedido )
      RETURN NIL
   ENDIF
   Encontra( jppedi->pdCliFor, "jpcadas", "numlan" )
   Encontra( jpcadas->cdUfEnt, "jpuf", "numlan" )
   Encontra( jpitped->ipItem, "jpitem", "item" )
   IF jpitped->ipTribut != "999999"
      RecLock()
      REPLACE jpitped->ipValPro WITH Round( jpitped->ipPreNot * jpitped->ipQtde, 2 ), ;
              jpitped->ipInfAlt WITH LogInfo()
      IF Encontra( jppedi->pdTransa + jpuf->ufTriUf + jpcadas->cdTriCad + jpitem->ieTriPro, "jpimpos", "regra" )
         mipLeis := ""
         FOR nCont = 1 To Len( Trim( jpimpos->imLeis ) ) Step 7
            mTmpLei := Substr( jpimpos->imLeis,nCont, 6 )
            IF Val( mTmpLei ) != 0
               mipLeis := mipLeis + mTmpLei + ","
            ENDIF
         NEXT
         REPLACE ;
            jpitped->ipCfOp    WITH jpimpos->imCfOp, ;
            jpitped->ipTribut  WITH jpimpos->imNumLan, ;
            jpitped->ipIIAli   WITH jpimpos->imIIAli, ;
            jpitped->ipIssAli  WITH jpimpos->imIssAli, ;
            jpitped->ipIpiCst  WITH jpimpos->imIpiCst, ;
            jpitped->ipIpiAli  WITH jpimpos->imIpiAli, ;
            jpitped->ipIpiIcm  WITH jpimpos->imIpiIcm, ;
            jpitped->ipIpiEnq  WITH jpimpos->imIpiEnq, ;
            jpitped->ipIcmCst  WITH jpimpos->imIcmCst, ;
            jpitped->ipIcmAli  WITH jpimpos->imIcmAli, ;
            jpitped->ipIcmRed  WITH jpimpos->imIcmRed, ;
            jpitped->ipFcpAli  WITH jpimpos->imFcpAli, ;
            jpitped->ipSubAli  WITH jpimpos->imSubAli, ;
            jpitped->ipSubIva  WITH jpimpos->imSubIva, ;
            jpitped->ipSubRed  WITH jpimpos->imSubRed, ;
            jpitped->ipDifCal  WITH jpimpos->imDifCal, ;
            jpitped->ipDifAlii WITH jpimpos->imDifAlii, ;
            jpitped->ipDifAliu WITH jpimpos->imDifAliu, ;
            jpitped->ipDifAlif WITH jpimpos->imDifAlif, ;
            jpitped->ipPisCst  WITH jpimpos->imPisCst, ;
            jpitped->ipPisAli  WITH jpimpos->imPisAli, ;
            jpitped->ipPisEnq  WITH jpimpos->imPisEnq, ;
            jpitped->ipCofCst  WITH jpimpos->imCofCst, ;
            jpitped->ipCofAli  WITH jpimpos->imCofAli, ;
            jpitped->ipCofEnq  WITH jpimpos->imCofEnq, ;
            jpitped->ipIcsAli  WITH jpimpos->imIcsAli, ;
            jpitped->ipLeis    WITH mipLeis, ;
            jpitped->ipInfAlt  WITH LogInfo()
      ELSEIF jpitped->ipTribut != "999999"
         REPLACE ;
            jpitped->ipCfOp    WITH "X", ;
            jpitped->ipTribut  WITH "", ;
            jpitped->ipIIAli   WITH 0, ;
            jpitped->ipIssAli  WITH 0, ;
            jpitped->ipIpiCst  WITH "X", ;
            jpitped->ipIpiAli  WITH 0, ;
            jpitped->ipIpiIcm  WITH "S", ;
            jpitped->ipIcmCst  WITH "X", ;
            jpitped->ipIcmAli  WITH 0, ;
            jpitped->ipIcmRed  WITH 0, ;
            jpitped->ipFcpAli  WITH 0, ;
            jpitped->ipSubAli  WITH 0, ;
            jpitped->ipSubIva  WITH 0, ;
            jpitped->ipSubRed  WITH 0, ;
            jpitped->ipDifCal  WITH "N", ;
            jpitped->ipDifAlii WITH 0, ;
            jpitped->ipDifAliu WITH 0, ;
            jpitped->ipDifAlif WITH 0, ;
            jpitped->ipPisCst  WITH "X", ;
            jpitped->ipPisAli  WITH 0, ;
            jpitped->ipCofCst  WITH "x", ;
            jpitped->ipCofAli  WITH 0, ;
            jpitped->ipIcsAli  WITH 0, ;
            jpitped->ipImpAli  WITH 0, ;
            jpitped->ipLeis    WITH "", ;
            jpitped->ipInfAlt  WITH LogInfo()
      ENDIF
      RecUnlock()
   ENDIF

   IF AppcnMySqlLocal() == NIL
      IF Encontra( jpitem->ieNcm, "jpibpt", "numlan" )
         RecLock()
         IF Substr( jpitped->ipIcmCst, 1, 1 ) $ "0,3,4,5"
            REPLACE jpitped->ipImpAli WITH jpibpt->ibNacAli
         ELSE
            REPLACE jpitped->ipImpAli WITH jpibpt->ibImpAli
         ENDIF
         RecUnlock()
      ENDIF
   ELSE
      WITH OBJECT cnJPIBPT
         :cSql := "SELECT * FROM JPIBPT WHERE IBCODIGO=" + StringSql( jpitem->ieNcm )
         :Execute()
         RecLock()
         IF :Eof()
            REPLACE jpitped->ipImpAli WITH 0
         ELSE
            IF Substr( jpitped->ipIcmCst, 1, 1 ) $ "0,3,4,5"
               REPLACE jpitped->ipImpAli WITH :NumberSql( "IBNACALI" )
            ELSE
               REPLACE jpitped->ipImpAli WITH :NumberSql( "IBIMPALI" )
            ENDIF
         ENDIF
         RecUnlock()
         :CloseRecordset()
      END WITH
   ENDIF
   mipValPro  := jpitped->ipValPro
   mipValFre  := jpitped->ipValFre
   mipValSeg  := jpitped->ipValSeg
   mipValOut  := jpitped->ipValOut
   mipValDes  := jpitped->ipValDes
   mipIIAli   := jpitped->ipIIAli
   mipIssAli  := jpitped->ipIssAli
   mipIpiAli  := jpitped->ipIpiAli
   mipIpiIcm  := jpitped->ipIpiIcm
   mipIcmBas  := jpitped->ipIcmBas
   mipIcmRed  := jpitped->ipIcmRed
   mipSubIva  := jpitped->ipSubIva
   mipIcmAli  := jpitped->ipIcmAli
   mipFcpAli  := jpitped->ipFcpAli
   mipSubBas  := jpitped->ipSubBas
   mipSubRed  := jpitped->ipSubRed
   mipSubAli  := jpitped->ipSubAli
   mipIcsAli  := jpitped->ipIcsAli
   mipPisAli  := jpitped->ipPisAli
   mipCofAli  := jpitped->ipCofAli
   mipDifCal  := jpitped->ipDifCal
   mipDifAlii := jpitped->ipDifAlii
   mipDifALiu := jpitped->ipDifAliu
   mipDifAlif := jpitped->ipDifAlif

   IF mipIIAli > 0
      mipIIBas := mipValPro
      mipIIVal := Int(mipIIBas * mipIIAli ) / 100
   ELSE
      mipIIBas := 0
      mipIIVal := 0
   ENDIF

   IF mipIssAli > 0
      mipIssBas := mipValPro  + mipIIVal
      mipIssVal := Int( mipIssBas * mipIssAli ) / 100
   ELSE
      mipIssBas := 0
      mipIssAli := 0
      mipIssVal := 0
   ENDIF

   IF mipIpiAli > 0
      mipIpiBas := mipValPro + mipIIVal
      mipIpiVal := Int( mipIpiBas * mipIpiAli) / 100
   ELSE
      mipIpiBas := 0
      mipIpiAli := 0
      mipIpiVal := 0
   ENDIF

   IF mipIcmAli > 0 .AND. Substr( jpitped->ipIcmCst, 2, 3 ) $ "00 ,10 ,20 ,70 ,90 ,201,202,203,900"
      mipIcmBas := mipValPro + mipValFre + mipValSeg + mipValOut + mipIIVal
      IF mipIpiIcm != "N"
         mipIcmBas += mipIpiVal
      ENDIF
      IF mipIcmRed > 0 .AND. Substr( jpitped->ipIcmCst, 2, 2 ) $ "20 ,70 ,90 ,201,202,203.900"
         mipIcmBas := mipIcmBas - ( Int( mipIcmBas * mipIcmRed ) / 100 )
      ELSE
         mipIcmRed := 0
      ENDIF
      mipIcmVal := Int( mipIcmBas * mipIcmAli ) / 100
   ELSE
      mipIcmBas := 0
      mipIcmAli := 0
      mipIcmVal := 0
   ENDIF
   IF mipFcpAli > 0
      mipFcpVal := Int( mipIcmBas * mipFcpAli ) / 100
   ELSE
      mipFcpVal := 0
   ENDIF
   IF mipSubAli > 0 .AND. Substr( jpitped->ipIcmCst, 2, 2 ) $ "10 ,30 ,70 ,90 ,900"
      mipSubBas := mipValPro + mipValFre + mipValSeg + mipValOut + mipIIVal
      IF mipIpiIcm != "N"
         mipSubBas += mipIpiVal
      ENDIF
      mipSubBas := mipSubBas + ( Int( mipSubBas * mipSubIva ) / 100)
      IF mipSubRed > 0 .AND. Substr( jpitped->ipIcmCst, 2, 3 ) $ "20 ,70 ,90 ,900"
         mipSubBas := mipSubBas - ( Int( mipSubBas * mipSubRed ) / 100)
      ELSE
         mipSubRed := 0
      ENDIF
      mipSubVal := Int( mipSubBas * mipSubAli ) / 100
      mipSubVal := mipSubVal - mipIcmVal
      IF mipSubVal < 0
         mipSubVal := 0
     ENDIF
   ELSE
      mipSubBas := 0
      mipSubIva := 0
      mipSubAli := 0
      mipSubRed := 0
      mipSubVal := 0
   ENDIF
   IF mipDifCal == "S"
      mipDifBas := mipValPro + mipValFre + mipValSeg + mipValOut + mipIIVal
      IF mipIpiIcm != "N"
         mipDifBas += mipIpiVal
      ENDIF
      mipDifVali := Max( Int( ( mipDifBas * mipDifAliu ) - ( mipDifBas * mipDifAlii ) ) / 100, 0 )
      mipDifValf := Int( mipDifBas * mipDifAlif ) / 100
   ELSE
      mipDifBas  := 0
      mipDifVali := 0
      mipDifValf := 0
   ENDIF

   // Aqui sem ST
   mipValNot := mipValPro + mipIIVal + mipIpiVal + mipValFre + mipValSeg + mipValOut
   IF mipPisAli > 0
      mipPisBas := mipValNot
      mipPisVal := Int( mipPisBas * mipPisAli ) / 100
   ELSE
      mipPisBas := 0
      mipPisVal := 0
   ENDIF

   IF mipCofAli > 0
      mipCofBas := mipValNot
      mipCofVal := Int( mipCofBas * mipCofAli ) / 100
   ELSE
      mipCofBas := 0
      mipCofVal := 0
   ENDIF
   IF mipIcsAli > 0
      mipIcsBas := mipValNot
      mipIcsVal := Int(mipIcsBas * mipIcsAli ) / 100
   ELSE
      mipIcsBas := 0
      mipIcsVal := 0
   ENDIF
   // Soma pra nota ST e desconto
   mipValNot := mipValNot - mipValDes + mipSubVal

   IF Substr( jpitped->ipCfOp, 1, 1 ) = "3" .AND. Substr( jpitped->ipIcmCst, 1, 1 ) == "1" // Importacao direta

      // Formula Pis/Cofins retirada de http://www4.receita.fazenda.gov.br/simulador/Simulacao-tag.jsp
      // Demais retiradas de http://www.comexblog.com.br/importacao/calculando-uma-nf-de-entrada-na-importacao

      mipPisBas := mipValPro * ( ( 1 + ( mipIcmAli / 100 * ( mipIIAli / 100 + ( mipIpiAli / 100 * ( 1 + mipIIAli / 100 ) ) ) ) ) / ( ( 1 - mipPisAli / 100 - mipCofAli / 100 ) * ( 1 - mipIcmAli / 100 ) ) )
      mipPisVal := mipPisBas * mipPisAli / 100
      mipCofBas := mipValPro * ( ( 1 + ( mipIcmAli / 100 * ( mipIIAli / 100 + ( mipIpiAli / 100 * ( 1 + mipIIAli / 100 ) ) ) ) ) / ( ( 1 - mipPisAli / 100 - mipCofAli / 100 ) * ( 1 - mipIcmAli / 100 ) ) )
      mipCofVal := mipCofBas * mipCofAli / 100
      mipIcmBas := mipValPro + mipValFre + mipValSeg + mipValOut + mipIIVal // + mipPisVal + mipCofVal // Pis/Cof calculado sobre ICMS
      IF mipIpiIcm != "N"
         mipIcmBas += mipIpiVal
      ENDIF
      mipIcmBas := Int( mipIcmBas / ( 100 - mipIcmAli ) * 10000 ) / 100
      mipIcmVal := Int( mipIcmBas * mipIcmAli ) / 100
      mipValNot := mipPisBas // equivalente a soma de tudo
   ENDIF
   IF len( Trim( jpitped->ipIcmCst ) ) > 3 // Simples Nacional
      mipIcmAli := 0
      mipIcmVal := 0
   ENDIF
   //IF jpitped->ipCfOp == "1.604 "
   //   mipValNot := 0
   //ENDIF
   RecLock()
   REPLACE ;
      jpitped->ipIIBas   WITH mipIIBas, ;
      jpitped->ipIIVal   WITH mipIIVal, ;
      jpitped->ipIssBas  WITH mipIssBas, ;
      jpitped->ipIssAli  WITH mipIssAli, ;
      jpitped->ipIssVal  WITH mipIssVal, ;
      jpitped->ipIpiBas  WITH mipIpiBas, ;
      jpitped->ipIpiVal  WITH mipIpiVal, ;
      jpitped->ipIcmBas  WITH mipIcmBas, ;
      jpitped->ipIcmAli  WITH mipIcmAli, ;
      jpitped->ipIcmRed  WITH mipIcmRed, ;
      jpitped->ipIcmVal  WITH mipIcmVal, ;
      jpitped->ipFcpAli  WITH mipFcpAli, ;
      jpitped->ipFcpVal  WITH mipFcpVal, ;
      jpitped->ipSubBas  WITH mipSubBas, ;
      jpitped->ipSubIva  WITH mipSubIVA, ;
      jpitped->ipSubAli  WITH mipSubAli, ;
      jpitped->ipSubRed  WITH mipSubRed, ;
      jpitped->ipSubVal  WITH mipSubVal, ;
      jpitped->ipPisBas  WITH mipPisBas, ;
      jpitped->ipPisAli  WITH mipPisAli, ;
      jpitped->ipPisVal  WITH mipPisVal, ;
      jpitped->ipCofBas  WITH mipCofBas, ;
      jpitped->ipCofAli  WITH mipCofAli, ;
      jpitped->ipCofVal  WITH mipCofVal, ;
      jpitped->ipValNot  WITH mipValNot, ;
      jpitped->ipIcsBas  WITH mipIcsBas, ;
      jpitped->ipIcsVal  WITH mipIcsVal, ;
      jpitped->ipDifCal  WITH mipDifCal, ;
      jpitped->ipDifBas  WITH mipDifBas, ;
      jpitped->ipDifAlii WITH mipDifAlii, ;
      jpitped->ipDifAliu WITH mipDifAliu, ;
      jpitped->ipDifAlif WITH mipDifALif, ;
      jpitped->ipDIfVali WITH mipDifVAli, ;
      jpitped->ipDifValf WITH mipDifValf, ;
      jpitped->ipInfAlt  WITH LogInfo()
   Encontra( jppedi->pdTransa, "jptransa", "numlan" )
   IF "CONSUMIDOR" $ jptransa->trReacao
      REPLACE jpitped->ipImpVal WITH mipValNot * jpitped->ipImpAli / 100
   ELSE
      REPLACE jpitped->ipImpVal WITH 0
   ENDIF
   RecUnlock()

   RETURN .T.


Num resumo:

Procuro a regra de tributação pra pegar as alíquotas, CFOP, redução, etc.
Procuro na tabela IPBT, que pode ser DBF ou MySQL, pra procurar os percentuais de tributação.
Pego os valores de itens de pedido, faço os cálculos, e gravo nos ítens de pedido.

Só que:
- Antes desses cálculos faço rateios de frete, descontos, etc.
- Depois desses cálculos tem os totais para pedido/NF

Chamando o conjunto de rotinas, a cada alteração do usuário já tem todos os cálculos prontos, na hora, durante a digitação do pedido.
Na emissão de nota, nenhum cálculo, exceto a parte financeira, conforme a forma de pagamento.

Não é perfeita, nem completa, mas tem atendido minhas necessidades.

Acho que os campos são auto-explicativos: IcmBas, IpiBas, PisBas, IcmVal, IcmAli, SubRed, SubIva, DifVal
As tres primeiras letras são do imposto: ICMs, IPI, PIS, COFins, SUBstituição Tributária, DIFal, etc.
As três últimas letras o que é: BASe, ALIquota, VALor, REDução, IVA

Correção: as duas primeiras letras podem ser referente ao arquivo IP=arquivo itens de pedido, IM=arquivo impostos
Depois disso as três do imposto, e as três do que é.
E se for memória, temporária equivalente ao arquivo, um "m" antes do nome.
mipIcmBas -> M=memória, IP=Itens de Pedido, ICM=Icms, BAS=base -> base de cálculo do ICMS ref. item de pedido, lido ou pra ser gravado lá.

Cálculo de impostos

MensagemEnviado: 02 Out 2018 23:26
por fladimir
Tb faço por ai.
Não tenho problemas.

Tanto q entrou a NFe 4.0 e praticamente não mudei nada a nivel de calculos.

Cálculo de impostos

MensagemEnviado: 03 Out 2018 16:11
por Itamar M. Lins Jr.
Ola!
Mas isso ai, sai como em um relatório ?
No caso eu tenho a impressão dos livros.
É um calculo de pedidos ? que depois vira um NFe de entrada ou saida ?

Saudações,
Itamar M. Lins Jr.

Cálculo de impostos

MensagemEnviado: 31 Out 2018 09:27
por JoséQuintas
Itamar M. Lins Jr. escreveu:É um calculo de pedidos ? que depois vira um NFe de entrada ou saida ?


Meu pedido é a base de tudo.
Ao gerar a nota, ela fica vinculada ao pedido, mas na nota tem as informações dos totais.
Nota vinculada ao pedido, financeiro vinculado ao pedido, estoque vinculado ao pedido, além das exceções lógico.

Para ter os detalhes da nota, só pesquisar o pedido.

Para um confronto geral, do tipo validar todo aplicativo, é pegar os pedidos e comparar com notas, ou comparar com financeiro, ou comparar com XMLs. Tenho isso no aplicativo, apesar de quase nem usar. É uma segurança a mais.

Daí para livro fiscal, contabilidade, SPED, etc., mais simples.

E como o pedido tem todos os cálculos, não sobra quase nada pra calcular na emissão de nota.

Cálculo de impostos

MensagemEnviado: 10 Nov 2018 09:54
por JAIR RANGEL
Olá, pessoal!

Também estou montando desse jeito. Ou seja, calculando os impostos no Pedido.
Vou estudar a rotina do Quintas. Já ví que vai me ajudar muito...

Obrigado por este post!!!

:-Y

Cálculo de impostos

MensagemEnviado: 10 Nov 2018 15:36
por Poka
Olá

Indo um pouco mais além, se o sistema tiver orçamentos o cálculo já sair no orçamento, no orçamento o sistema já verificar o tipo de cliente, estado, o ncm do produto, se tem subs trib. , se é revenda, prá uso próprio e por aí vai. Se não a nota final vai ser diferente do orçamento, aí o cliente chia.

Fazer uma nota fiscal com todos os impostos realmente não é uma das tarefas mais fáceis. O correto é o sistema ter mesmo uma ficha de impostos com todos
os impostos para que o usuário preencha junto com o seu contador e o sistema pegar automático essa ficha. Definir os impostos no cadastro de produtos como eu vejo por aí, coitado do usuário, imagina uns cem mil itens.

Poka

Cálculo de impostos

MensagemEnviado: 30 Nov 2018 11:53
por JAIR RANGEL
Olá, Pessoal!

O Poka falou sobre montar uma ficha para cadastro dos impostos...
Os impostos para cada produto seriam localizados pelo NCM?

Poderia esplanar melhor esse método de montar os cálculos?

Estou montando com base no que o Quintas exibiu acima.
Estou apanhando, mas progredindo devagar...

Agora, essa de montar uma tabela de impostos e não ter que informar em cada produto, me parece ótimo. Mas como montar isso?

Eu apanho, também, nos cálculos. Quando e onde calcular o que?
Nossa! Que coisa é essa que inventaram?

Mas, não tem outro jeito. Tenho que implementar....

Se puderem falar mais sobre isso, eu ficaria muito grato!

Abraços

Cálculo de impostos

MensagemEnviado: 30 Nov 2018 19:45
por rochinha
Amiguinhos,

Jair Rangel
Você encontra várias tabelas aqui na seção downloads(Tabelas em Geral e Tabelas e Referências de Legislação)

Para o cálculo de ICMS você necessitará da tabela de siglas(TABELAS: Aliquotas ICMS de origem e destino completa onde você encontra o percentual para o estado destino.

Pará o cálculo do IPI eu recorro a tabela de NCM que contém o percentual. Muitos recorrem a tabela IBPT mas eu a vejo como uma tabela com valores aproximados. A tabela correta para se obter o IPI é a TIPI.

Minha rotina de cálculos está exatamente na geração da nota. Vou gerar a nota e então disparo os cálculos, mesmo porque tudo vai depender do CFOP usado neste momento. A CST/CSOSN também definem a fórmula de cáculo. E por fim, o tipo do cliente também interfere na fórmula.

Portanto deixar os impostos já cadastrados no produto não dará certo.

Mais ou menos assim:

CFOP define se o item sendo vendido tem ICMS e/ou IPI
CST/CSOSN define se o ICMS e/ou IPI serão cáculados no percentual cheio, com redução, deferimento ou isenção.

O IPI possui tabela própria de CSTs que definem sua forma de cálculo.
O PIS possui tabela própria de CSTs que definem sua forma de cálculo.
O COFINS possui tabela própria de CSTs que definem sua forma de cálculo.

Fonte: Tabela CST

Bom trabalho.