Ir para conteúdo
  • Cadastre-se

  • Este tópico foi criado há 127 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado

Olá, boa tarde.

Estamos com uma situação de diferença da cálculo ( arredondamento ) entre meu sistema e o Sefin, onde minha base de cálculo foi de 210,00 com 1,65% de Pis.

BC: 210,00
pPis: 1,65%
vPis: 3,46 ( 3,465 ) -> utilizamos o padrão de arredondamento bancário da ABNT (NBR 5891).

                        <vBCPisCofins>210.00</vBCPisCofins>
                        <pAliqPis>1.65</pAliqPis>
                        <pAliqCofins>7.60</pAliqCofins>
                        <vPis>3.46</vPis>
                        <vCofins>15.96</vCofins>

Mas ao gerar/enviar o DPS rejeitou com a seguinte mensagem:

"O valor do Pis informado não corresponde ao resultado da BC Pis/Cofins x Alíquota Pis, que foram informados na DPS."

Ao que me parece, o Sefin está usando arredondamento para >=5 e não segue o padrão ABNT.

Como resolver este tipo de situação sem "quebrar" os demais provedores ou Sefaz?

Obrigado.

Postado (editado)

fazendo o calculo pelo emissor:

image.thumb.png.d7a8c740c876cca0738026aeecadb532.png

 

Aproveitando esse post, como vc preenche esses campos?
quando é retenção, vc informa os % de retenção e quando não tem retenção vc informa as aliquotas totais?

Editado por marcosling
Postado
16 horas atrás, Milton Campanhã disse:

Olá, boa tarde.

Estamos com uma situação de diferença da cálculo ( arredondamento ) entre meu sistema e o Sefin, onde minha base de cálculo foi de 210,00 com 1,65% de Pis.

BC: 210,00
pPis: 1,65%
vPis: 3,46 ( 3,465 ) -> utilizamos o padrão de arredondamento bancário da ABNT (NBR 5891).

                        <vBCPisCofins>210.00</vBCPisCofins>
                        <pAliqPis>1.65</pAliqPis>
                        <pAliqCofins>7.60</pAliqCofins>
                        <vPis>3.46</vPis>
                        <vCofins>15.96</vCofins>

Mas ao gerar/enviar o DPS rejeitou com a seguinte mensagem:

"O valor do Pis informado não corresponde ao resultado da BC Pis/Cofins x Alíquota Pis, que foram informados na DPS."

Ao que me parece, o Sefin está usando arredondamento para >=5 e não segue o padrão ABNT.

Como resolver este tipo de situação sem "quebrar" os demais provedores ou Sefaz?

Obrigado.

No inicio tive este problema, resolvi usando a regra: qdo o terceiro digito é maior ou igual 5 arredonta pra cima

Postado
7 horas atrás, Gildenor disse:

No inicio tive este problema, resolvi usando a regra: qdo o terceiro digito é maior ou igual 5 arredonta pra cima

Fizemos testes para garantir que não iria quebrar a NFe/NFCe se fosse arredondado de outra forma.

E como passou , então vamos optar por alterar nosso motor de cálculo para usar o arredondamento comum ( maior ou igual 5 sempre arredondar para cima ).

Mas caso SERPRO ou RECEITA me responda, eu trarei a resposta aqui.

Obrigado pela ajuda.

  • Curtir 1
Postado

Resposta da RECEITA FEDERAL
Prezado cidadão,
Em atenção à sua manifestação, sugere-se que o interessado entre em contato diretamente com o Município competente, a fim de obter os esclarecimentos e providências cabíveis sobre o assunto.
Sempre que precisar, conte com a Ouvidoria para registrar denúncias, reclamações, sugestões ou elogios sobre os serviços da Receita Federal do Brasil.
Nosso papel é garantir que você exerça seu direito de se manifestar.
A Ouvidoria agradece o seu contato.

  • Confuso 1
  • 3 semanas depois ...
  • Membros Pro
Postado

estou com esse problema também.
sefaz calculou 228,03

<tribFed>
<piscofins>
<CST>01</CST>
<vBCPisCofins>13820.00</vBCPisCofins>
<pAliqPis>1.65</pAliqPis>
<pAliqCofins>7.60</pAliqCofins>
<vPis>228.04</vPis>
<vCofins>1050.32</vCofins>
<tpRetPisCofins>2</tpRetPisCofins>
</piscofins>
</tribFed>
Postado

Gabriel,

Neste caso 13.820.00 x 1.65% = 228.03. ( nem teve dízimas )

13.820.00 x 7.60% = 1050.32 ( também sem dízimas )

Eu tive um problema aqui onde o sistema permite lançar 2 ou mais serviços, mas quando vou gerar a NFSe eu agrupo para 1 único serviço. E ao agrupar (somar) os valores não bate, pois eu fiz o cálculo e arredondamento item a item mas a Sefaz calcula pela base vBCPisCofins.

Então, para o padrão nacional, precisei fazer o cálculo novamente no momento da emissão, considerando a base de cálculo total e não item a item.

Pode ser este seu problema?

Postado

@Níssius Ribas começou ontem. Estou na suspeita que o problema é deles.  Linha de Raciocínio. A alta demanda está provocando variações no ponto flutuante. Isso faz com que o mesmo calculo para eles tenha resultados diferentes.
Então o que nosso sistema faz o calculo e o resultado esta arredondando para cima quando cai no 5 exemplo 23.645 nos arredondamos para 23.65 o calculo deles deve estar dando 23.6499999999999 dai esta arredondando para baixo, é a única explicação que me ocorre no momento. 

Postado
3 minutos atrás, fagner queiroz santana disse:

@Níssius Ribas começou ontem. Estou na suspeita que o problema é deles.  Linha de Raciocínio. A alta demanda está provocando variações no ponto flutuante. Isso faz com que o mesmo calculo para eles tenha resultados diferentes.
Então o que nosso sistema faz o calculo e o resultado esta arredondando para cima quando cai no 5 exemplo 23.645 nos arredondamos para 23.65 o calculo deles deve estar dando 23.6499999999999 dai esta arredondando para baixo, é a única explicação que me ocorre no momento. 

Ontem o meu calculo dava 330*1,65% = 5,445 e eu arredondava para cima(5,45), passava, hoje o mesmo cliente emitindo a mesma nota com o mesmo valor não passa

 

EL Soluções em Informática

Desenvolvimento  e Suporte (ERP, NF-e, Sped Fiscal, EFD Contribuições, Emissor de Cupom Fiscal)
Ronda Alta - RS

(54)3364-1588
www.elinfo.com.br

 

Postado
11 minutos atrás, Níssius Ribas disse:

começou dar problema aqui agora... conseguiu? eu tava arredondano 1.355 para 1.36 e agora esta dando problema

Pelo que entendi eles ajustaram a validação do arredondamento usando a regra ABNT ( bancário ) onde seria:

A regra diz:

Quando a 3ª casa decimal é exatamente 5 (e não há outros dígitos depois), você olha para a 2ª casa decimal:

  • se a 2ª casa for par → mantém (trunca)

  • se a 2ª casa for ímpar → arredonda para cima

Exemplo 1 — trunca (mantém) porque a 2ª casa é PAR

Número original:
2,345

Queremos arredondar para 2 casas decimais.

  • 1ª casa: 3

  • 2ª casa: 4 (par)

  • 3ª casa: 5

➡️ Como a 2ª casa é par, o valor permanece igual.

Resultado ABNT:
2,34


Exemplo 2 — arredonda para cima porque a 2ª casa é ÍMPAR

Número original:
2,355

Queremos arredondar para 2 casas decimais.

  • 1ª casa: 3

  • 2ª casa: 5 (ímpar)

  • 3ª casa: 5

➡️ Como a 2ª casa é ímpar, você soma 1 à 2ª casa.

Resultado ABNT:
2,36


Resumo rápido 🧠

Número 2ª casa 3ª casa Resultado
2,345 4 (par) 5 2,34
2,355 5 (ímpar) 5 2,36
  • Obrigado 2
Postado (editado)

Exemplos (casos clássicos fiscais)

RoundABNT(2.345, 2); // 2.34 
RoundABNT(2.355, 2); // 2.36 
RoundABNT(1.005, 2); // 1.00 
RoundABNT(1.015, 2); // 1.02 
RoundABNT(10.125, 2); // 10.12 
RoundABNT(10.135, 2); // 10.14 

Por que isso é ideal para ICMS / financeiro?

  • ❌ Round() do Delphi não segue ABNT

  • ❌ Double introduz erro binário

  • ✅ Currency evita erro de ponto flutuante

  • ✅ Essa função bate com auditoria fiscal e contábil


A regra de arredondamento da ABNT (NBR 5891) é basicamente o arredondamento bancário (round half to even):

function RoundABNT(const AValue: Currency; Decimals: Integer): Currency;
var
  Factor   : Currency;
  Temp     : Currency;
  IntPart  : Integer;
  Fraction : Currency;
  SignVal  : Integer;
begin
  if AValue < 0 then
    SignVal := -1
  else
    SignVal := 1;

  Factor := 1;
  while Decimals > 0 do
  begin
    Factor := Factor * 10;
    Decimals := Decimals - 1;
  end;

  Temp := AValue * Factor;

  IntPart  := Trunc(Temp);
  Fraction := Abs(Temp - IntPart);

  if Fraction > 0.5 then
    Result := (IntPart + SignVal) / Factor
  else if Fraction < 0.5 then
    Result := IntPart / Factor
  else
  begin
    // Fraction = exatamente 0.5
    if (Abs(IntPart) mod 2) <> 0 then
      Result := (IntPart + SignVal) / Factor
    else
      Result := IntPart / Factor;
  end;
end;

Editado por Milton Campanhã
  • Curtir 1
  • Obrigado 3
Postado
16 minutos atrás, Milton Campanhã disse:

Pelo que entendi eles ajustaram a validação do arredondamento usando a regra ABNT ( bancário ) onde seria:

A regra diz:

Quando a 3ª casa decimal é exatamente 5 (e não há outros dígitos depois), você olha para a 2ª casa decimal:

  • se a 2ª casa for par → mantém (trunca)

  • se a 2ª casa for ímpar → arredonda para cima

Exemplo 1 — trunca (mantém) porque a 2ª casa é PAR

Número original:
2,345

Queremos arredondar para 2 casas decimais.

  • 1ª casa: 3

  • 2ª casa: 4 (par)

  • 3ª casa: 5

➡️ Como a 2ª casa é par, o valor permanece igual.

Resultado ABNT:
2,34


Exemplo 2 — arredonda para cima porque a 2ª casa é ÍMPAR

Número original:
2,355

Queremos arredondar para 2 casas decimais.

  • 1ª casa: 3

  • 2ª casa: 5 (ímpar)

  • 3ª casa: 5

➡️ Como a 2ª casa é ímpar, você soma 1 à 2ª casa.

Resultado ABNT:
2,36


Resumo rápido 🧠

Número 2ª casa 3ª casa Resultado
2,345 4 (par) 5 2,34
2,355 5 (ímpar) 5 2,36

obrigado, alterei minha lógica aqui e funcionou

Postado

Mesmo problema de arredondamento aqui, vou mudar para o arredondamento bancário.

O maior problema é a falta de transparência e de uma documentação\comunicação efetiva. 

No final do ano passado tivemos problemas com cancelamentos de notas, simplesmente a forma como o sistema esta cancelando notas hoje não esta de acordo com a documentação publicada. A documentação não foi corrigida até, que se basear na documentação vai penar.

No inicio do mês tivemos problemas com a emissão de notas com retenção de ISSQN, simplesmente o valor liquido da NFSE não estava considerando o ISSQN retido, isso após atualização do sistema da SEFIN.

Hoje este problema...

Toda semana uma surpresa.

Postado

Acabei de passar por esse problema e esse post resolveu o problema, seria legal adicionarem essa informação na documentação da NFSe.

Marco Aurélio V. da Silva
Analista de Sistemas • Desenvolvedor
Especialista em rotinas fiscais, DF-e, integrações ERP e automação tributária.
💻 Linguagens: Java • Flutter • Harbour • VB.NET
WhatsApp (33) 99152-2942
 

  • Fundadores
Postado

Na pasta "tools" do SVN do ACBr, tem o Documento da ABNT

https://svn.code.sf.net/p/acbr/code/tools/Diversos/nbr-5891-2014-regras-de-arredondamento-na-numeraao-decimalpdf.pdf

Essa é a Rotina em Pascal, que o ACBr disponibiliza em ACBrUtil.Math.pas

{-----------------------------------------------------------------------------
 Arredondamento segundo as normas da ABNT NBR 5891/77  (por: DSA)
 Fontes:
 http://www.sofazquemsabe.com/2011/01/como-fazer-arredondamento-da-numeracao.html
 http://partners.bematech.com.br/2011/12/edicao-98-entendendo-o-truncamento-e-arredondamento-no-ecf/
 -----------------------------------------------------------------------------}
function RoundABNT(const AValue: Double; const Digits: TRoundToRange;
  const Delta: Double): Double;
var
   Pow, FracValue, PowValue : Extended;
   RestPart: Double;
   IntCalc, FracCalc, LastNumber, IntValue : Int64;
   Negativo: Boolean;
{$IFNDEF EXTERNALLINKER}
   OldRM: TFPURoundingMode;
{$ELSE}
   OldRM: TRoundingMode;
{$ENDIF}
begin
  OldRM := GetRoundMode;
  try
    if (OldRM <> rmNearest) then
      SetRoundMode(rmNearest);

    Negativo  := (AValue < 0);
    Pow       := intpower(10, abs(Digits) );
    PowValue  := abs(AValue) / 10 ;
    IntValue  := trunc(PowValue);
    FracValue := frac(PowValue);

    PowValue := SimpleRoundToEX( FracValue * 10 * Pow, -9) ; // SimpleRoundTo elimina dizimas ;
    IntCalc  := trunc( PowValue );
    FracCalc := trunc( frac( PowValue ) * 100 );

    if (FracCalc > 50) then
     Inc( IntCalc )

    else if (FracCalc = 50) then
    begin
     LastNumber := round( frac( IntCalc / 10) * 10);

     if odd(LastNumber) then
       Inc( IntCalc )
     else
     begin
       RestPart := frac( PowValue * 10 ) ;

       if RestPart > Delta then
         Inc( IntCalc );
     end ;
    end ;

    Result := ((IntValue*10) + (IntCalc / Pow));
    if Negativo then
     Result := -Result;
  finally
    SetRoundMode(OldRM);
  end;
end;

 

  • Curtir 1
Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Postado (editado)

Estou aplicando essa regra apenas para o emissor nacional, mas imagino que seja padrão para todos os municípios que estão pelo emissor nacional correto? 

 

 

Editado por Marcio Patyk
  • Fundadores
Postado

Arredondamento segundo normas da ABNT...

(Ele é diferente do arredondamento bancário)

Sim.. todos os Documentos Eletrônicos Brasileiros, usam o arredondamento segundo ABNT

  • Curtir 1
Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

  • Este tópico foi criado há 127 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.