Ir para conteúdo
  • Cadastre-se

dev botao

Provedor ISSNET Praia Grande/SP Arredondar ou Truncar ISS


Ver Solução Respondido por Renato Rubinho,
  • Este tópico foi criado há 873 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

  • Membros Pro
Postado

Boa tarde,

Pessoal é o seguinte, vejam o exemplo Valor da NFSe R$ 50,00 e ISS 4,45% = R$ 2,225(resultado da calculadora do Windows) de imposto tenho a opção em meu sistema de arredondar, truncar ou não fazer nada apenas pegar o calcula direto como feito na calculadora o que tenho percebido que nesse caso ele sempre arredonda ou seja o valor do ISS fica R$ 2,23.

O problema é que somente nesse provedor dessa cidade tenho tido esse problema recorrente que se a terceira casa decimal depois da virgula for = 5 entao o provedor retorna o erro de que o valor do ISS não bate, dai se eu truncar o valor que informo para o componente passando R$ 2,22 dai o provedor aprova a emissao da NFSe.

para arredondar uso a seguinte função RoundTo5(ValorISS, -2);

function RoundTo5(Valor: Double; Casas: Integer): Double;
var
  xValor, xDecimais: String;
  p, nCasas: Integer;
  nValor: Double;
begin
  nValor := Valor;
  xValor := Trim(FloatToStr(Valor));
  p := pos(',', xValor);
  if Casas < 0 then
    nCasas := -Casas
  else
    nCasas := Casas;
  if p > 0 then
  begin
    xDecimais := Copy(xValor, p + 1, Length(xValor));
    if Length(xDecimais) > nCasas then
    begin
      if xDecimais[nCasas + 1] >= '5' then
        SetRoundMode(rmUP)
      else
        SetRoundMode(rmNearest);
    end;
    nValor := RoundTo(Valor, Casas);
  end;
  Result := nValor;
end;

Vejal essa informação que peguei no Google:

Arredondando Números
Condições Procedimentos
= 5 (i) Se ao 5 seguir em qualquer casa um algarismo diferente de zero, aumenta-se uma unidade no algarismo a permanecer.
= 5 (ii) Se o 5 for o último algarismo ou se ao 5 só seguirem zeros, o último algarismo a ser conservado só será aumentado de uma unidade se for ímpar.

 

Sera que esse provedor esta trabalhando com essa segunda condição, como posso resolver isso?

  • Consultores
Postado

Boa noite,

1 hora atrás, Destak disse:

Sera que esse provedor esta trabalhando com essa segunda condição, como posso resolver isso?

Tudo indica que sim.

Confirme no manual do provedor existe alguma informação a respeito, senão o ideal é questionar o provedor se essa é a regra a ser adotada para evitar problemas futuros.

  • Membros Pro
Postado

Ok partindo então que eles usam essa regra, conhece ou pode me indicar uma função que trate isso dessa forma?

Porque de vdd melhor eu ja resolver pois contato com provedor de NFSe quem atua nisso sabe como funciona é um parto contatar e ou resolver algum problema com a maioria deles, isso quando conseguimos algum contato direto.

Se alguem tiver uma função ai p indicar que trate isso como nessa segunda condição ja resolve.

  • Membros Pro
Postado

Entendi essa função não resolve,

O ideal é ter uma função que faca isso automaticamente, que trabalhe como definido na segunda condição que descrevi no primeiro post desse topico ou seja se o ultimo numero for = 5 e o anterior a ele for par ele deve truncar mas se for impar entao deve arredondar.

Vou pedir ajuda no Discord quem sabe alguém la ja passou por isso ou atende esse mesmo provedor/cidade em questão.

  • Membros Pro
Postado

Não testei pq se tiver q verificar se o ultimo digito é = 5 ai ja não é a solução adequada, bom pelo visto então o jeito é criar uma nova função mesmo, acredito que da para usar com base a 

17 horas atrás, Destak disse:

function RoundTo5(Valor: Double; Casas: Integer): Double;

dai fazer os ajustes nela gerando uma nova que atenda a segunda condição.

  • Curtir 2
  • Membros Pro
Postado

Boa noite,

Fiz uma alteração na RoundTo5 para poder atender a segunda condição porem ela esta remarcando para baixo veja que o trecho do codigo que eu acrescentei esta em negrito:

function RoundTo5Cond2(Valor: Double; Casas: Integer): Double;
var
  xValor, xDecimais: String;
  p, nCasas: Integer;
  nValor: Double;
begin
  nValor := Valor;
  xValor := Trim(FloatToStr(Valor));
  p := pos(',', xValor);
  if Casas < 0 then
    nCasas := -Casas
  else
    nCasas := Casas;
  if p > 0 then
  begin
    xDecimais := Copy(xValor, p + 1, Length(xValor));
    if Length(xDecimais) > nCasas then
    begin
      {if (xDecimais[nCasas + 1] = '5') and odd(StrToInt(xDecimais[nCasas])) then
        SetRoundMode(rmUP)
      else
      if (xDecimais[nCasas + 1] = '5') and not odd(StrToInt(xDecimais[nCasas])) then
        SetRoundMode(rmNearest)
      else
}
      if xDecimais[nCasas + 1] >= '5' then
        SetRoundMode(rmUP)
      else
        SetRoundMode(rmNearest);
    end;
    nValor := RoundTo(Valor, Casas);
  end;
  Result := nValor;
end;

O caso concreto é valor da NFSe R$ 30,00 ISS 4,45% = R$ 1,335 usando essa função acima ele da como result R$ 1,33 onde estou errando?

  • Consultores
Postado

Boa noite

Veja se apenas isso funciona.

Se sim, siga o raciocínio aos poucos.

    if Length(xDecimais) > nCasas then

    begin

      {if xDecimais[nCasas + 1] = '5' then

        SetRoundMode(rmUP)

      else}

      if xDecimais[nCasas + 1] >= '5' then

        SetRoundMode(rmUP)

      else

        SetRoundMode(rmNearest);

    end;

  • Membros Pro
Postado

Boa noite,

Então precisa ver que se o numero antes do 5 for impar dai ele arredonda para cima mas se for par dai ele arredonda para baixo, nesse trecho de codigo seu não esta sendo considerado isso.

  • Consultores
Postado

Pesquise a respeito de Debug com Pato de Borracha. 

A pergunta foi: apenas isso funciona?

Isso não é a regra total, é o primeiro passo.

Se nem isso funcionar, você tem que ver se tem alguma outra coisa influenciando.

Se isso funcionar, siga o raciocínio aos poucos.

  • Membros Pro
Postado
2 horas atrás, Destak disse:

Boa noite,

Fiz uma alteração na RoundTo5 para poder atender a segunda condição porem ela esta remarcando para baixo veja que o trecho do codigo que eu acrescentei esta em negrito:

function RoundTo5Cond2(Valor: Double; Casas: Integer): Double;
var
  xValor, xDecimais: String;
  p, nCasas: Integer;
  nValor: Double;
begin
  nValor := Valor;
  xValor := Trim(FloatToStr(Valor));
  p := pos(',', xValor);
  if Casas < 0 then
    nCasas := -Casas
  else
    nCasas := Casas;
  if p > 0 then
  begin
    xDecimais := Copy(xValor, p + 1, Length(xValor));
    if Length(xDecimais) > nCasas then
    begin
      {if (xDecimais[nCasas + 1] = '5') and odd(StrToInt(xDecimais[nCasas])) then
        SetRoundMode(rmUP)
      else
      if (xDecimais[nCasas + 1] = '5') and not odd(StrToInt(xDecimais[nCasas])) then
        SetRoundMode(rmNearest)
      else
}
      if xDecimais[nCasas + 1] >= '5' then
        SetRoundMode(rmUP)
      else
        SetRoundMode(rmNearest);
    end;
    nValor := RoundTo(Valor, Casas);
  end;
  Result := nValor;
end;

O caso concreto é valor da NFSe R$ 30,00 ISS 4,45% = R$ 1,335 usando essa função acima ele da como result R$ 1,33 onde estou errando?

@Italo Giurizzato Junior olha que curioso, reparei que quando uso essa minha função alterada o componente esta gerando a tag ValorIss>0.00</tc:ValorIss> então decidi "martelar" a propriedade do componente ValorIss := StrToFloat('1,34') e ocorre a mesma coisa o componente gera a tag zerada, seguem em anexo todos os XMLs.

1-env-lot.xml 1-env-lot-soap.xml 1-rec.xml 1-rec-soap.xml 9fdc9c7f67ef49d78a0b524df35ba368-con-lot.xml 9fdc9c7f67ef49d78a0b524df35ba368-con-lot-soap.xml 9fdc9c7f67ef49d78a0b524df35ba368-lista-nfse-con-lot.xml 9fdc9c7f67ef49d78a0b524df35ba368-lista-nfse-con-lot-soap.xml

  • Membros Pro
Postado

Boa tarde,

Se eu usar ponto ao invés de virgula retorna o erro de invalid  point value ou algo assim não lembro agora, mas de qq forma vou esperar aparecer a próxima NFSe de produção do cliente apresentar o problema relatado e ai trago aqui novamente o caso concreto, enquanto isso vou pesquisar mais sobre a segunda condição de arredondamento, o que pelo que vi parece uma novidade para todos nos, favor não fechar o tópico por enquanto.

  • Consultores
  • Solution
Postado
54 minutos atrás, Destak disse:

enquanto isso vou pesquisar mais sobre a segunda condição de arredondamento

Boa tarde,

Com relação à função, suas condições pareciam corretas. 

Para evitar influência externa, teste um projeto novo sem nada, só com a função para ver se funciona. 

Se funcionar você "caça" quem estava te atrapalhando.

  • Membros Pro
Postado

Boa noite,

Estou testando a função mas com alterações e tb ao mesmo entendo a logica do provedor, essa semana ainda retorno aqui com o resultado dos meus testes, favor deixar o tópico aberto por enquanto.

  • Curtir 2
×
×
  • 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.