Ir para conteúdo
  • Cadastre-se

dev botao

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

Recommended Posts

Postado

Uso o ecfvirtual para gerar NFC-e e SAT com o delphi 7.

Ao aplicar um desconto de por exemplo R$ 2,00 na venda de um item é enviado pela procedure   TACBrECFVirtualClassCupom.DescAresItem(NumItem: Integer; ADescAcres: Double

O desconto de 2 reais é passado como -2 para a função  RoundABNT que retorna o valor de -1,99 e não -2 que é esperado. 

Passar número negativo para para  função RoundABNT pode retornar erro enquanto números positivos funcionam normal.

Abaixo alteração que resolveu o problema pontualmente.

--- ACBrECFVirtual.pas    (revision 11135)
+++ ACBrECFVirtual.pas    (working copy)
@@ -1016,8 +1016,14 @@
   if ItemCupom.DescAcres <> 0 then
     raise EACBrECFERRO.create(ACBrStr('Item ('+IntToStrZero(NumItem,3)+') já recebeu Desconto ou Acrescimo.')) ;
 
+  if ADescAcres < 0 then
+     ADescAcres := ADescAcres * -1;
+
   ItemCupom.DescAcres := RoundABNT( ADescAcres, -2);
 
+  if ADescAcres > 0 then
+     ADescAcres := ADescAcres * -1;
+
   fpSubTotal := fpSubTotal + ItemCupom.DescAcres;  // Atualiza SubTotal Cupom
 end;
 
 

Postado

--- ACBrECFVirtual.pas    (revision 11135)
+++ ACBrECFVirtual.pas    (working copy)
@@ -1008,6 +1008,7 @@
   );
 var
   ItemCupom: TACBrECFVirtualClassItemCupom;
+  Desconto : Boolean;
 begin
   VerificaFaixaItem(NumItem);
 
@@ -1016,9 +1017,15 @@
   if ItemCupom.DescAcres <> 0 then
     raise EACBrECFERRO.create(ACBrStr('Item ('+IntToStrZero(NumItem,3)+') já recebeu Desconto ou Acrescimo.')) ;
 
+  if ADescAcres < 0 then
+  begin
+     Desconto   := True;
+     ADescAcres := ADescAcres * -1;
+  end;
+
   ItemCupom.DescAcres := RoundABNT( ADescAcres, -2);
 
-  fpSubTotal := fpSubTotal + ItemCupom.DescAcres;  // Atualiza SubTotal Cupom
+  fpSubTotal := fpSubTotal + (ItemCupom.DescAcres * IfThen(Desconto, -1, 1));  // Atualiza SubTotal Cupom
 end;
 
 procedure TACBrECFVirtualClassCupom.CancelaItem(NumItem: Integer);

ACBrECFVirtual.pas

  • Fundadores
Postado

Não acho que a implementação seja correta, a rotina espera que o valor de "ItemCupom.DescAcres" contenha sinal (loops com a soma pode dar errado)

Não consegui reproduzir o problema que você alega... usando o FPCUnitTeste da ACBrComum, adicionei os testes abaixo:

procedure RoundABNTTest.ValoresNegativos;
var
  AVal: Double;
begin
  AVal := -2;
  CheckEquals( AVal, RoundABNT(AVal, 0) );
  CheckEquals( AVal, RoundABNT(AVal, -1) );
  CheckEquals( AVal, RoundABNT(AVal, -2) );
end;    

... e tudo funcionou a contento...

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

Pois é...

Também achei a implementação errada mas tive que faze-la para resolver este problema.

Fiz o teste que você colocou com 2:   -1, -0,9, -0,89

já com o valor positivo -2 -> -2, -2, -2

Vou testar com o Lazarus amanhã para ver o que acontece.

Postado

Pssss decepcionante este compilador do delphi 7....

O FPC do lazarus funcionou 100%

 

Analisando o restante dos casos de uso da função RoundABNT no fonte ACBR me arrisco a dizer que é o único lugar onde a função pode receber um argumento com valor negativo é nesta classe ACBrECFVirtual.

Estaremos migrando o sistema em breve pro Delphi Seatle ai espero que estes casos minimizem.

Obrigado.

  • Fundadores
Postado

Tenho um D7 aqui... Vou tentar nele...

Um workaround, seria mudar o valor para positivo, arredondar e depois voltar ele pra negativo... e só então, somar nos fields da classe 

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á 3195 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.