Ir para conteúdo
  • Cadastre-se

dev botao

Arredondamento de Desconto de Total - Como resolver na versão 0.06


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

Recommended Posts

A versão 0.06 do SAT não tratou corretamente a questão do arredondamento do rateio de desconto de subtotal para os itens resultando em valor diferente quando do somatório dos rateios dos itens  em relação ao valor de desconto no total.

Na versão 0.07, isto foi resolvido da seguitne forma... depois de fazer o rateio  ajusta-se a diferença no item de maior valor.

Pensando nisto, fiz alterações que permitam replicar a mesma coisa para a versão 0.06

1) incluido novo evento no ACBrECFVirtualSAT -  QuandoFechaCupom

 

2) no evento QuandoFecharCupom - implementado...

procedure TConectorSATEletronico.DoQuandoFechaCupom(CFe: TCFe);
var
  vDescTotal: double;
var
  i, iMax: integer;
  vMax: double;
  fator: double;
  vDescItem: double;
  vDescAcum: double;
  vProd: double;
  vItem:double;
  function RoundECF(valor:Double):double;
  begin
    result := FServer.ECFVirtual.ECFVirtualClass.RoundECF(valor);  // usa o tipo de arredondamento configurado no ECFVirtual;
  end;
begin
  inherited;
  // na versao 0.06 o arredondamento esta com diferença de arredondamento.
  // tentativa de correção do arredondamento, fazendo rateio pelos itens.
  vDescTotal := CFe.Total.DescAcrEntr.vDescSubtot;
  if (vDescTotal > 0) and  (FloatToString( CFe.infCFe.versaoDadosEnt) = FloatToString(0.06)) then
  begin
    iMax := 0;
    vDescAcum := 0;
    vProd := 0;
    for i := 0 to CFe.Det.count - 1 do
    begin
      vItem := RoundECF( CFe.Det.Items.Prod.qCom * CFe.Det.Items.Prod.vUnCom);
      vProd := vProd + vItem;
    end;
    if vProd > 0 then
    begin
      fator := vDescTotal / vProd;
      for i := 0 to CFe.Det.count - 1 do
      begin
        vItem := RoundECF( CFe.Det.Items.Prod.qCom * CFe.Det.Items.Prod.vUnCom);
        if vItem > vMax then
        begin
          iMax := i;
          vMax := vItem; // guarda o item de maior valor  -- conforme determinou a norma tecnica para a versao 0.07
        end;
        vDescItem := RoundECF(vItem * fator);
        CFe.Det.Items.Prod.VDesc := CFe.Det.Items.Prod.VDesc + vDescItem;
        vDescAcum := vDescAcum + vDescItem;
      end;
      // ajusta a diferença
      CFe.Det.Items[iMax].Prod.VDesc := CFe.Det.Items[iMax].Prod.VDesc +
        (vDescTotal - vDescAcum);
      CFe.Total.DescAcrEntr.vDescSubtot := 0;
    end;
  end;
end;
 

 

 

ACBrECFVirtualSAT.pas

Editado por amarildolacerda

Amarildo Lacerda

Storeware Team

Link para o comentário
Compartilhar em outros sites

http://www.fazenda.sp.gov.br/sat/downloads/Especificacao_SAT_v_ER_2_19_07.pdf

1- Desconto sobre subtotal deverá ser rateado proporcionalmen te ao valor de cada item, já considerado o desconto ou acréscimo sobre item;

2- Diferença entre o valor do desconto sobre subtotal e a soma dos seus rateios deve ser Especificação Técnica de Requisitos - SAT - Direitos Reservados - Versão ER 2.19.07 de 18/05/2016 72 alocada ao rateio de maior valor

Amarildo Lacerda

Storeware Team

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Compreendi a necessidade do evento... realmente estava fazendo falta um Evento na finalização do Cupom...

Apliquei modificações no SVN, baseado nas sugestões..

Citar

Data: 29/08/2016
-- ACBrECFVirtualSAT --
[+] Adicionado o evento "QuandoFecharDocumento",
[*] Modificado o tipo de evento: "TACBrECFVirtualSATQuandoAbrirDocumento" para
    "TACBrECFVirtualSATQuandoAbrirFecharDocumento"
    http://www.projetoacbr.com.br/forum/index.php?showtopic=32025
    (por: DSA e Amarildo)   

 

 

  • 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.

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 2799 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.