Ir para conteúdo
  • Cadastre-se

Recommended Posts

Postado

Olá pessoal,

Estou utilizando o ACBr NFSeX com o provedor CONAM (Etransparência) para emissão de NFSe no município de Taboão da Serra/SP e identifiquei um comportamento incorreto na geração do XML, especificamente no Registro 40 (campos adicionais).

🔴 Problema encontrado

O componente está gerando automaticamente os campos:

  • LOCPREEXT_CODPOST
  • LOCPREEXT_CIDADE
  • LOCPREEXT_ESTPROVREG

mesmo quando o serviço é prestado no Brasil e sem conteúdo preenchido.

Isso resulta no seguinte erro do webservice:

"Reg40 - Sigla (LOCPREEXT_CODPOST) é necessário informar o conteúdo.
A quantidade de Reg40 no Registro 90 não corresponde à quantidade válida."


🔎 Análise

O problema ocorre porque o código atual gera esses campos apenas com base em:

if CodigoPais <> 1058 then
 

Porém, em muitos casos o CodigoPais vem como 0, fazendo com que o sistema interprete erroneamente como exterior e gere os campos LOCPREEXT, mesmo sem dados válidos.

Além disso, o campo LOCPREEXT_CODPOST estava sendo preenchido incorretamente com UF ao invés de CEP.


✅ Correção aplicada

Foi necessário ajustar a geração do Reg40 para:

  • validar também CodigoPais <> 0
  • só gerar os campos quando houver conteúdo
  • corrigir o uso do CEP no CODPOST

Exemplo:

 
 
if (CodigoPais <> 0) and (CodigoPais <> 1058) then
 

E validar conteúdo antes de gerar cada campo.


💡 Sugestão de melhoria

Seria interessante que o ACBr:

  • não gerasse automaticamente campos LOCPREEXT quando vazios
  • validasse corretamente CodigoPais = 0 como Brasil ou ignorasse
  • garantisse consistência entre Reg40 e Reg90

✔ Resultado

Após o ajuste, o XML passou a ser aceito normalmente pelo webservice.


Obrigado pelo excelente trabalho com o ACBr.

Segue código alterado:

function TNFSeW_Conam.GerarReg40: TACBrXmlNode;
var
  xmlNode: TACBrXmlNode;
  aValor: string;
begin
  Result := CreateElement('Reg40');

  if NFSe.Servico.Valores.DescontoIncondicionado > 0 then
  begin
    aValor := FormatFloat('0.00', NFSe.Servico.Valores.DescontoIncondicionado);
    xmlNode := GerarReg40Item('DESCINCOND', aValor);
    Result.AppendChild(xmlNode);
    Inc(FQtdReg40);
  end;

  if Trim(NFSe.Servico.InfAdicional) <> '' then
  begin
    aValor := NFSe.Servico.InfAdicional;
    xmlNode := GerarReg40Item('DADOSADICIONAIS', aValor);
    Result.AppendChild(xmlNode);
    Inc(FQtdReg40);
  end;

  if Trim(NFSe.Servico.CodigoCnae) <> '' then
  begin
    aValor := NFSe.Servico.CodigoCnae;
    xmlNode := GerarReg40Item('SRV_CNAE', aValor);
    Result.AppendChild(xmlNode);
    Inc(FQtdReg40);
  end;

  if Trim(NFSe.Servico.CodigoAnexoCnae) <> '' then
  begin
    aValor := NFSe.Servico.CodigoAnexoCnae;
    xmlNode := GerarReg40Item('SRV_ANEXOSN', aValor);
    Result.AppendChild(xmlNode);
    Inc(FQtdReg40);
  end;

  if Trim(NFSe.Servico.CodigoServicoNacional) <> '' then
  begin
    aValor := NFSe.Servico.CodigoServicoNacional;
    xmlNode := GerarReg40Item('SRV_CTN', aValor);
    Result.AppendChild(xmlNode);
    Inc(FQtdReg40);
  end;

  if Trim(NFSe.Servico.CodigoNBS) <> '' then
  begin
    aValor := NFSe.Servico.CodigoNBS;
    xmlNode := GerarReg40Item('SRV_NBS', aValor);
    Result.AppendChild(xmlNode);
    Inc(FQtdReg40);
  end;

  if NFSe.IBSCBS.tpEnteGov <> tcgNenhum then
  begin
    aValor := tpEnteGovToStr(NFSe.IBSCBS.tpEnteGov);
    if Trim(aValor) <> '' then
    begin
      xmlNode := GerarReg40Item('TOM_TPENTGOV', aValor);
      Result.AppendChild(xmlNode);
      Inc(FQtdReg40);
    end;
  end;

  if (NFSe.Tomador.Endereco.CodigoPais <> 0) and (NFSe.Tomador.Endereco.CodigoPais <> 1058) then
  begin
    aValor := CodIBGEPaisToSiglaISO2(NFSe.Tomador.Endereco.CodigoPais);
    if Trim(aValor) <> '' then
    begin
      xmlNode := GerarReg40Item('TOMEXT_PAIS', aValor);
      Result.AppendChild(xmlNode);
      Inc(FQtdReg40);
    end;

    aValor := OnlyNumber(NFSe.Tomador.Endereco.CEP);
    if Trim(aValor) <> '' then
    begin
      xmlNode := GerarReg40Item('TOMEXT_CODPOST', aValor);
      Result.AppendChild(xmlNode);
      Inc(FQtdReg40);
    end;

    aValor := Trim(NFSe.Tomador.Endereco.xMunicipio);
    if aValor <> '' then
    begin
      xmlNode := GerarReg40Item('TOMEXT_CIDADE', aValor);
      Result.AppendChild(xmlNode);
      Inc(FQtdReg40);
    end;

    aValor := Trim(NFSe.Tomador.Endereco.UF);
    if aValor <> '' then
    begin
      xmlNode := GerarReg40Item('TOMEXT_ESTPROVREG', aValor);
      Result.AppendChild(xmlNode);
      Inc(FQtdReg40);
    end;
  end;

  if (NFSe.Servico.Endereco.CodigoPais <> 0) and (NFSe.Servico.Endereco.CodigoPais <> 1058) then
  begin
    aValor := OnlyNumber(NFSe.Servico.Endereco.CEP);
    if Trim(aValor) <> '' then
    begin
      xmlNode := GerarReg40Item('LOCPREEXT_CODPOST', aValor);
      Result.AppendChild(xmlNode);
      Inc(FQtdReg40);
    end;

    aValor := Trim(NFSe.Servico.Endereco.xMunicipio);
    if aValor <> '' then
    begin
      xmlNode := GerarReg40Item('LOCPREEXT_CIDADE', aValor);
      Result.AppendChild(xmlNode);
      Inc(FQtdReg40);
    end;

    aValor := Trim(NFSe.Servico.Endereco.UF);
    if aValor <> '' then
    begin
      xmlNode := GerarReg40Item('LOCPREEXT_ESTPROVREG', aValor);
      Result.AppendChild(xmlNode);
      Inc(FQtdReg40);
    end;
  end;
end;

att,

Alexandre

 

  • Consultores
Postado
2 horas atrás, AlexandreSoaresSP disse:

Pulou a etapa do erro que estava tendo, enviou o lote mas deu problema na prefeitura, enviei mensagem para eles para consertar. Mas com a correção enviou o lote sim, segue anexo caso necessite.

Conam.GravarXml.pas 32.99 kB · 0 downloads

Alexandre

mas ficou tudo ok? só uma mensagem passar não seria válido. 
teria que ter o envio e retorno para ficar OK

 

Consultora ACBr Pro

Juliomar Marchetti

Ajude o Projeto ACBr crescer - Seja Pro

discord: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br

 

MVP_NewLogo_100x100_Transparent-02.png
Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

  • 1 mês depois ...
  • Consultores
Postado

Tópico fechado por falta de retorno do usuário

 

Consultora ACBr Pro

Juliomar Marchetti

Ajude o Projeto ACBr crescer - Seja Pro

discord: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br

 

MVP_NewLogo_100x100_Transparent-02.png
Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

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