AlexandreSoaresSP Postado 7 Abril Postado 7 Abril 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 Juliomar Marchetti Postado 7 Abril Consultores Postado 7 Abril E resolveu ? anexe o arquivo modificado Juliomar Marchetti Ajude o Projeto ACBr crescer - Seja Pro discord: juliomar telegram: juliomar e-mail: [email protected] http://www.juliomarmarchetti.com.br 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 !!
AlexandreSoaresSP Postado 8 Abril Autor Postado 8 Abril 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 Alexandre
Consultores Juliomar Marchetti Postado 8 Abril Consultores Postado 8 Abril 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 Juliomar Marchetti Ajude o Projeto ACBr crescer - Seja Pro discord: juliomar telegram: juliomar e-mail: [email protected] http://www.juliomarmarchetti.com.br 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 !!
Consultores Juliomar Marchetti Postado 2 Junho Consultores Postado 2 Junho Tópico fechado por falta de retorno do usuário Juliomar Marchetti Ajude o Projeto ACBr crescer - Seja Pro discord: juliomar telegram: juliomar e-mail: [email protected] http://www.juliomarmarchetti.com.br 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 !!
Recommended Posts