Clipper On Line • Ver Tópico - Problema com função Round(), vPIS e vCOFINS e Schema da NFe

Problema com função Round(), vPIS e vCOFINS e Schema da NFe

Discussão sobre desenvolvimento de software para atender as exigências da legislação fiscal e tributária (ECF, TEF, SINTEGRA, NF-e, ECD, EFD, etc.)

Moderador: Moderadores

 

Problema com função Round(), vPIS e vCOFINS e Schema da NFe

Mensagempor rochinha » 08 Mai 2017 22:56

Amiguinhos,

Vinha eu caminhando saltitante pelo bosque dos cálculos de impostos quando num momento de envio do .XML fui barrado porque o calculo do total não batia.

O valor em questão é R$ 54,6312.

A função round() do Harbour que uso me retorna para 2 dígitos o valor de R$ 54,63.

No ACBr, eu jogo os valores todos com 4 dígitos pois ele se encarrega de cortar ou arredondar e também dá R$ 54,63.

Mas o SEFAZ, lobo maldito, insiste em assoprar o valor de R$ 54,64.

Pombas, eu sempre usei a técnica de arredondar de trás para frente caso encontrasse algum 5.

Mas segundo o WikiPédia eu tô no bosque errado.

Tudo bem que meu Harbour é velhinho, mas...


Harbour Compiler Alpha build 45.0 (Flex)
Copyright 1999-2005, http://www.harbour-project.org/


...e com vocês, o valor, a função de arredondamento que usam, etc também daria o valor de R$ 54,64?
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4538
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 800 vezes
Mens.Curtidas: 242 vezes

Problema com função Round(), vPIS e vCOFINS e Schema da NFe

Mensagempor Kiko Fernandes » 09 Mai 2017 07:25

Bom dia!

Mas mesmo seguindo a orientação que está no Wikipédia o valor aredondado permaneceria 54,63.

Veja: 54,6312

Wikipédia:
Se os algarismos decimais seguintes forem menores que 50, 500, 5000..., o anterior não se modifica

Teríamos 12 de algarismo decimais seguintes e neste caso não modificaria o anterior.

Uso um Round() não do Harbour e tenho o mesmo resultado que o teu 54,63.

* Se vc está encontrando o valor 54,64 no XML, este erro é de quem está gerando o XML.
Kiko Fernandes
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 213
Data de registro: 24 Out 2008 21:41
Cidade/Estado: Foz do Iguaçu
Curtiu: 4 vezes
Mens.Curtidas: 9 vezes

Problema com função Round(), vPIS e vCOFINS e Schema da NFe

Mensagempor rubens » 09 Mai 2017 08:33

Bom dia,

Rochinha fiz o teste aqui também e ficou 54,63.

Round( 54.6312, 2 )

Harbour 3.2
Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar de usuário

rubens
Colaborador

Colaborador
 
Mensagens: 1518
Data de registro: 16 Ago 2003 09:05
Cidade/Estado: Nova Xavantina - MT
Curtiu: 77 vezes
Mens.Curtidas: 104 vezes

Problema com função Round(), vPIS e vCOFINS e Schema da NFe

Mensagempor gilbertosilverio » 09 Mai 2017 15:24

Rochina,

Ja tive problemas com arredondamento no SEFAZ, por que eles somam os itens individualmente, eles não fazem o calculo direto do total pelo percentual.

Tinha que fazer os cálculos item a item e somar e so depois fazer o arredondamento.

Não sei se e o seu caso, mais fica a dica...
gilbertosilverio
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 332
Data de registro: 18 Jan 2009 09:39
Cidade/Estado: Ribeirao Pires - SP
Curtiu: 1 vez
Mens.Curtidas: 23 vezes

Problema com função Round(), vPIS e vCOFINS e Schema da NFe

Mensagempor rochinha » 09 Mai 2017 17:03

Amiguihos,

Fiz um teste com um único item que desse o valor R$ 53.6312 validei e enviei. O SEFAZ recebeu sem chiar. lembrando que jogo na nota os valores com 4 decimais, mas ao validar o ACBr se encarrega de colocar os decimais conforme o layout.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4538
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 800 vezes
Mens.Curtidas: 242 vezes

Problema com função Round(), vPIS e vCOFINS e Schema da NFe

Mensagempor JoséQuintas » 09 Mai 2017 17:29

Lembro de alguma coisa sobre aceitar imposto com mais casas decimais, opcional
Até achei esquisito na época.
Talvez tenha aparecido o motivo... rs

No manual, só encontrei esta parte sobre arredondamento, mas sem encontrar aonde isso vale.

arredonda.png
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Problema com função Round(), vPIS e vCOFINS e Schema da NFe

Mensagempor JoséQuintas » 09 Mai 2017 17:33

e na NT mencionada, apesar que em termos de lei, pode ter sido alterada a qualquer momento.

arredonda2.png
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Problema com função Round(), vPIS e vCOFINS e Schema da NFe

Mensagempor rochinha » 09 Mai 2017 20:31

Amiguinhos,

Baseado em uma NT que o JoseQuintas apresentou no PCToledo e na função que o kapiaba apresentou, mas não explicou o porque de um tal 0,01 é que pude entender que se tratava de um fator de arredondamento.

O problema que este fator de arredondamento, como dito na NT, serve para arredondar para mais ou para menos o valor afim de se adequar as regras do SEFAZ.

Nossos sistemas não são dotados de inteligencia artificial(ainda) para decidir que momento usar um ou outro método, além daqueles que programamos.

Partindo deste pressuposto elaborei uma função para testar as regras conforne ABNT.

Arredondando a 2 algarismos decimais deveremos ter em atenção o terceiro e quarto decimal. Assim, conforme as regras anteriores:

O número 12,6529 seria arredondado para 12,65 (aqui fica 12.65, uma vez que 29 é inferior a 50, então não se modifica)
O número 12,86512 seria arredondado para 12,87 (aqui fica 12.87, uma vez que 512 é superior a 500, então incrementa-se uma unidade)
O número 12,744623 seria arredondado para 12,74 (aqui fica 12.74, uma vez que 4623 é inferior a 5000, então não se modifica)
O número 12,8752 seria arredondado para 12,88
O número 12,8150 seria arredondado para 12,82 (aqui fica 12.82, uma vez que os algarismos seguintes é igual a 50, então incrementa-se uma unidade)
O número 12,80050 seria arredondado para 12,80 (aqui fica 12.80, uma vez que 050 e menor que 500)
O numero 13,4666..., se fossemos arredondar à parte inteira, será sempre arredondado para 13, pois 4666... sempre será menor que 5000... (Se fizermos o arredondamento número a número, teríamos : 13,4666... ? 13,47 ? 13,5 ? 14, porém, isso seria afirmar que 13,4666... está mais próximo de 14 do que está de 13, que não é verdade. Portanto, não devemos arredondar o número já previamente arredondado!!!)

FUNCTION ABNTROUND( R_VALOR )
   R_VALOR_INT := INT( R_VALOR )
   R_VALOR_DEC := ROUND( DEC( R_VALOR ), 2 )
   R_VALOR_RND := R_VALOR_DEC - DEC( R_VALOR )
   IF     R_VALOR_RND >= .0050 .AND. R_VALOR_RND < .00499
          R_VALOR_DEC := R_VALOR_DEC + 1
   ELSEIF R_VALOR_RND >= .00500 .AND. R_VALOR_RND < .004999
          R_VALOR_DEC := R_VALOR_DEC + 1
   ELSEIF R_VALOR_RND >= .005000 .AND. R_VALOR_RND < .0049999
          R_VALOR_DEC := R_VALOR_DEC + 1
   ENDIF
   RETURN R_VALOR_INT + R_VALOR_DEC


Com esta função consegui fazer os valores serem calculados baterem com ABNT com excessão do 12,8150 que não arredondou, mesmo porque fiz a função rapidamente.

Nela também o meu valor não se alterou.

Usando a função do kapiaba os valores bateram com excessão do 12,744623 que arredondou para 12,75 e do 12,80050 que arredondou para 12,81 e do meu valor que foi de 53,6312 para 53,64.

Resumindo:

Para efeitos do fisco, diferenças para cima são aceitas.

Observação:

Não encontrei referencia a função trunk() e quando pesquisei sobre a função dec() ou Decimals vi que só a tenho pois a mesma esta criada em minhas funções.

Em tempos, vou passar a usar a função conforme o cálculo que o kapiaba apresentou.

Esta mensagem esta sendo reverberada nos foruns aos quais coloquei em pauta.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4538
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 800 vezes
Mens.Curtidas: 242 vezes

Problema com função Round(), vPIS e vCOFINS e Schema da NFe

Mensagempor rochinha » 09 Mai 2017 21:19

Amiguinhos,

A função que mais chegou perto do resultado ABNT foi esta:
#xtranslate round(<nVal>,<nDec>) => val(str(<nVal>,20,<nDec>))

FUNCTION KROUND( preco )
   LOCAL nImp := 0.00, qt := 1.0001
   nImp := round( Val( StrZero( preco * qt, 12, 2 ) ), 6 )
   RETURN round( nImp, 2 )
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4538
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 800 vezes
Mens.Curtidas: 242 vezes

Problema com função Round(), vPIS e vCOFINS e Schema da NFe

Mensagempor JoséQuintas » 09 Mai 2017 22:31

FUNCTION Main()

   LOCAL nValor, nQt := 1.0005, cValor1, cValor2, nQtCalc := 0

   FOR nValor = 100000.01 TO 101000 STEP 0.01
      cValor1 := Str( Round( nValor * nQt, 2 ), 10, 2 )
      cValor2 := Str( KRound( nValor, nQt ), 10, 2 )
      IF cValor1 != cValor2
         ? cValor1, cValor2
      ENDIF
      nQtCalc++
   NEXT
   ? "Total de calculos " + Str( nQtCalc )

   RETURN NIL

FUNCTION KROUND( nValor, nQt )

   LOCAL nPreco

   nPreco := Round( Val( StrZero( nValor * nQt, 12, 2 ) ), 6 )

   RETURN Round( nPreco, 2 )


d:\temp>test

Total de calculos 100000


À primeira vista, não faz diferença.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Problema com função Round(), vPIS e vCOFINS e Schema da NFe

Mensagempor JoséQuintas » 09 Mai 2017 22:37

Aumentei e variei mais, pra ver se dava diferença.

FUNCTION Main()

   LOCAL nValor, cValor1, cValor2, nQtCalc := 0

   FOR nValor = 1 TO 1000 STEP 0.001
      cValor1 := Str( Round( nValor * nValor, 2 ), 10, 2 )
      cValor2 := Str( KRound( nValor, nValor), 10, 2 )
      IF cValor1 != cValor2
         ? cValor1, cValor2
      ENDIF
      nQtCalc++
   NEXT
   ? "Total de calculos " + Str( nQtCalc )

   RETURN NIL

FUNCTION KROUND( nValor, nQt )

   LOCAL nPreco

   nPreco := Round( Val( StrZero( nValor * nQt, 12, 2 ) ), 6 )

   RETURN Round( nPreco, 2 )


d:\temp>test

Total de calculos 999001


quase 1 milhão de cálculos.
Demorou menos de 5 segundos pra fazer, até estranhei.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Problema com função Round(), vPIS e vCOFINS e Schema da NFe

Mensagempor Kiko Fernandes » 10 Mai 2017 01:04

JoséQuintas escreveu:No manual, só encontrei esta parte sobre arredondamento, mas sem encontrar aonde isso vale.


Vale aonde aparece (*4). Conforme a figura em anexo.
Anexos
_4.png
Kiko Fernandes
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 213
Data de registro: 24 Out 2008 21:41
Cidade/Estado: Foz do Iguaçu
Curtiu: 4 vezes
Mens.Curtidas: 9 vezes

Problema com função Round(), vPIS e vCOFINS e Schema da NFe

Mensagempor rochinha » 10 Mai 2017 13:18

Amiguinhos,

Eu já havia aumentado alguns campos para conter 4 digitos ao criar o meu .XML para campos de impostos. Apesar de que ao validar no ACBr vejo que ele trunca alguns deles.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4538
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 800 vezes
Mens.Curtidas: 242 vezes

Problema com função Round(), vPIS e vCOFINS e Schema da NFe

Mensagempor JoséQuintas » 10 Mai 2017 14:49

Tem como colocar o produto em questão com o cálculo em questão?
Quem sabe o problema não é outro?
De repente está concentrado no arredondamento do valor final, e o problema é no arredondamento durante o cálculo.

Ou se for aquele erro de cálculo de ponto flutuante, talvez acrescentar 0.00001 antes do arredondamento.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Problema com função Round(), vPIS e vCOFINS e Schema da NFe

Mensagempor Kiko Fernandes » 10 Mai 2017 15:51

rochinha escreveu:Apesar de que ao validar no ACBr vejo que ele trunca alguns deles.


Boa tarde!
Rochinha o ACBrMonitor foi projetado para respeitar o valor informado. Ele não deve tomar esta decisão se vc informou algum valor.

Observe na aba de configuração [ Impressão ] se vc alterou os decimais para ficar igual ao do teu sistema.
Anexos
decimais.png
Kiko Fernandes
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 213
Data de registro: 24 Out 2008 21:41
Cidade/Estado: Foz do Iguaçu
Curtiu: 4 vezes
Mens.Curtidas: 9 vezes

Próximo



Retornar para Legislação Fiscal e Tributária

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 3 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro