Ir para conteúdo
  • Cadastre-se

Controle da tag <ValorIss> no provedor DeISS (município Indaiatuba/SP)


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

Recommended Posts

  • Membros Pro
Postado

Olá pessoal, boa tarde!

Estamos implementando o novo componente ACBrNFSeX para um cliente na cidade de Indaiatuba/SP (provedor DeISS). Porém, estamos enfrentando um problema quando ao controle da tag <ValorIss>:

Se a NFSe é emitida a um cliente que retém ISS, acontece o seguinte erro na transmissão:

---------
Código  : X999
Mensagem: Erro de Conexão: soap:Server - javax.xml.ws.WebServiceException: Verifique sua mensagem SOAP e a passagem desses parâmetros necessários. Não conseguiu obter a mensagem XML do cabeçalho ou dos dados. 
Verifique a passagem desses parâmetros pela mensagem SOAP.
---------

Segundo suporte do WebService, foi nos dito que, nesses casos, é necessário passar o valor do ISS através da tag <ValorIss>. Por padrão, essa tag não é gerada para esse provedor pois, no arquivo "ACBrNFSeXServicos.ini", tem o seguinte parâmetro ativo:

Params=NaoGerarTag:ValorIss

Ao removermos manualmente esse parâmetro, a NFSe para cliente que retém ISS passa a ser transmitida com sucesso. Porém, se emitirmos daí para um cliente que não retém ISS, caímos no seguinte erro:

--------
 Código  : E220
Mensagem: Valor do ISSQN informado indevidamente.
Correção: O valor do ISSQN será calculado pela Prefeitura e não deve ser informado pelo contribuinte.
---------

Em resumo, temos:
- Se o cliente Retém ISS, tem que ter valor de ISS (parâmetro "Params=NaoGerarTag:ValorIss" desativado). Senão, erro X999
- Se o cliente não Retém ISS, não pode haver valor de ISS (parâmetro "Params=NaoGerarTag:ValorIss" ativado). Senão, erro E220 (e também o E221 caso seja informada alguma alíquota)

@Juliomar Marchetti, através do Discord, nos orientou a procurarmos por alguma opção que controlasse a impressão ou não da referida TAG, mas nós não encontramos. Também nos orientou a não passar a TAG e assim já tínhamos feito, mas também sem sucesso. A TAG aparece com o valor padrão 0. Acredito que o preenchimento, inclusive, se dê nesse trecho (Unit "ACBrNFSeXLerXml_ABRASFv2", procedure "TNFSeR_ABRASFv2.LerServicos", linha 938):

      if Valores.IssRetido = stRetencao then
      begin
        Valores.ValorIssRetido := Valores.ValorIss;
        Valores.ValorIss := 0;
      end
      else
        Valores.ValorIssRetido := 0;

Notem que sempre que for caso de retenção, o valor 0 é atribuído ao "ValorIss", o que impede a emissão para cliente que não retém ISS neste provedor (mesmo removendo o parâmetro do .ini). Então, até o presente momento, estamos sem saber como tratar a referida situação.

Muito obrigado, em antecipado, pela atenção!

  • Membros Pro
Postado

Olá @Italo Giurizzato Junior, boa tarde!

Farei os testes agora mesmo. Em paralelo, nós conseguimos alterar o parâmetro em tempo de execução através da nossa Unit, sendo necessário apenas a limpeza da TStringList "fSL" do ACBr (TACBrNFSeXConfigParams) que armazena os parâmetros. Isso porque ela somente os adiciona, então quando eu tento substituir o valor, o valor original acaba ficando deixando o parâmetro sempre ativo. Talvez seja intencional, mas segue abaixo para caso achem interessante essa saída também:

// Nossa Unit. Entra aqui somente quando for caso de retenção:
           // Controle do parâmetro "NaoGerarTag:ValorIss" para o provedor "proDeISS":
           // Quando tem retenção, precisa da tag <ValorIss>. Portanto, precisa remover o parâmetro para passar a gerá-la (caso tenha):
           // OBS: O controle não precisa ser desfeito caso não tenha retenção pois na próxima nota acontece nova leitura do .ini, recriando o parâmetro.
           if ACBrNFSe.Configuracoes.Geral.Provedor = proDeISS then
            if ACBrNFSe.Provider.ConfigGeral.Params.ParamTemValor('NaoGerarTag', 'ValorIss') then
             begin
              vParametroAlterado := ACBrNFSe.Provider.ConfigGeral.Params.AsString;
              if Pos(vParametroAlterado, 'NaoGerarTag:ValorIss') > 0 then
               begin
                vParametroAlterado := ReplaceText(vParametroAlterado, 'NaoGerarTag:ValorIss', '');
                ACBrNFSe.Provider.ConfigGeral.Params.AsString := vParametroAlterado;
               end;
             end;

Aqui o ajuste que foi necessário no ACBr para funcionar:

procedure TACBrNFSeXConfigParams.SetAsString(const AValue: String);
var
  s: String;
begin
  if FAsString = AValue then Exit;
  FAsString := Trim(AValue);
  s := StringReplace(FAsString, ':', '=', [rfReplaceAll]);
  fSL.clear(); // * Linha adicionada
  AddDelimitedTextToList(s, '|', fSL, #0);
end;

Vou desfazer os ajustes e implementar a sua solução e já lhe dou um retorno sobre o resultado.

Muito obrigado pela atenção!

  • Curtir 1
  • Membros Pro
Postado (editado)

Olá novamente, @Italo Giurizzato Junior!

A sua solução deu certo e, ao meu parecer, faz mais sentido que a nossa uma vez que o parâmetro se torna desnecessário a partir do momento que o WebService passa a exigir essa tag em algumas situações (quando retido). Já a nossa solução tem como objetivo justamente "burlar" o parâmetro. Então já descartamos a nossa e vamos usar a sua como oficial daqui em diante, tudo bem?

Se me permitir, só faça um ajuste ali onde o NrOcorrValorIss recebe os valores. Está recebendo 1 nos dois casos (com e sem retenção). O correto, ao meu ver, seria 1 para retenção (gerar) e -1 para não retenção (não gerar). Mas já ajustei o meu aqui:

function TNFSeW_DeISS203.GerarXml: Boolean;
begin
  if NFSe.Servico.Valores.IssRetido = stRetencao then
    NrOcorrValorIss := 1
  else
    NrOcorrValorIss := -1;

  Result := inherited GerarXml;
end;

No mais, pode encerrar.

Muito obrigado pela ajuda!

Editado por Danilo MSI Soluções
  • Curtir 1
  • Este tópico foi criado há 403 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
Visitante
Este tópico está agora fechado para novas respostas
×
×
  • 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.

The popup will be closed in 10 segundos...