Ir para conteúdo
  • Cadastre-se

dev botao

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

Recommended Posts

Postado (editado)

Bom dia,

Finalizei a integração do Provedor Governa, para emissão de NFS-e que atende dentre outras cidades a de Iturama.

Seguem units alteradas para atualização.

Fico aguardando retorno,

abço!

ACBrNFSeReg.pas

ACBrNFSeWebServices.pas

ACBrProvedorPronim.pas

pcnLeitor.pas

pnfsConversao.pas

pnfsNFSe.pas

pnfsNFSeG.pas

pnfsNFSeR.pas

pnfsNFSeW.pas

GOVERNA.INI

Editado por Gabriel Souza Lopes
Adicionar mais arquivos
  • 1 mês depois ...
  • 1 mês depois ...
Postado

Boa tarde! 
Atualizei os fontes hj e foram necessárias duas pequenas alterações:

1) Na unit pnfsConversao, os prefixos do provedor Governa realmente não possuem ':',  

" // Provedor Governa, os prefixos não tem ":" ????
// XML := StringReplace( XML, 'tc', '', [rfReplaceAll] );
// XML := StringReplace( XML, 'ts', '', [rfReplaceAll] ); " foi necessário remoção dos comentários;

2) Na unit ACBrNFSeDANFSeFR, na procedure CarregaItensServiço, hj está da seguinte forma:

for I := 0 to ANFSe.Servico.ItemServico.Count - 1 do
      with ANFSe.Servico.ItemServico.Items do
      begin
           //preenche itens
      end;

 if (ANFSe.Servico.ItemServico.Count < 12) then
      begin
        for I := 1 to 12 - ANFSe.Servico.ItemServico.Count do
          begin
           //preenche linhas vazias 
          end;
      end;

caso possua, preenche os itens da nfse. Logo abaixo preenche linhas  vazias, porem não confere se preencheu algum item antes para preenche-las. Como resultado, esta imprimindo uma tabela com 'Item', 'Quantidade', 'Valor unitário' e 'Valor Total' sobre a discriminação dos itens no DANFSE (utilizando o modelo DANFSENovo.fr3).

Fiz a seguinte alteração:

 if (ANFSe.Servico.ItemServico.Count < 12) and (ANFSe.Servico.ItemServico.Count > 0) then
      begin
        for I := 1 to 12 - ANFSe.Servico.ItemServico.Count do
          begin
           //preenche linhas vazias 
          end;
      end;

Verificando se havia algum serviço preenchido antes de preencher as linhas vazias. Seguem em anexo os arquivos alterados.

 

ACBrNFSeDANFSeFR.pas

pnfsConversao.pas

Postado

Bom dia !
Outra alteração necessária no  ACBrNFSEDANFSEFR e DANFSENovo.fr3 necessárias para o provedor Governa.
Na procedure CarregaParametros, para carregar o "CódigoMunicipio" hj faz da seginte forma:

FieldByName('CodigoMunicipio').AsString     := IfThen(CodigoMunicipio <> '', CodCidadeToCidade(StrToInt(CodigoMunicipio)), '');

porém no caso do Governa a estrutura do XML não me possibilita passar o Codigo do IBGE do municipio, logo não tenho de onde carregar a informação para impressão do DANFSE. E no IfThen tenta executar CodCidadeToCidade(StrToInt(CodigoMunicipio)) com o Codigo do municipio = '', dando erro de conversão de StrToInt. Fiz a seguinte alteração:

        if not (CodigoMunicipio.IsEmpty) then
          FieldByName('CodigoMunicipio').AsString := CodCidadeToCidade(StrToInt(CodigoMunicipio))
        else
          FieldByName('CodigoMunicipio').AsString :=  '';

que funcionará para ambos os casos. 

Outra alteração foi no DANFSENovo.fr3 foi colocar máscara para casa decimal no Valor total do serviço e aumentada um pouco a altura do Memo18 (que preenche ItemListaServiço), a antiga altura estava cortando parte da informação.

Seguem arquivos para análise.
Muito obrigado!

DANFSeNovo.fr3

ACBrNFSeDANFSeFR.pas

  • 6 meses depois ...
Postado

Olá,

Utilizo o ACBrNFSe na emissão de notas para a prefeitura de São Paulo.

Me deparei com a seguinte situação:

Após enviar um lote de RPS, é retornado o arquivo 'xxxxx-lista-nfse-soap.xml' e consequentemente obtêm-se o arquivo 'xxxxx-lista-nfse.xml', visto que o processamento é síncrono.

O "ACBrNFSe" possui utiliza uma rotina de extração dos 'xml´s' das NFS-e emitidas (existentes no arquivo 'xxxxx-lista-nfse.xml'), e baseado nisto, monta um arquivo chamado <numNFSe>-nfse.xml para cada ocorrência da tag '<NFe xmlns="">', respeitando o 'numNFe' de cada uma delas.

Durante este processo, existe uma chamada a rotina 'RetirarPrefixos' ( na unit ACBrNFSeNotasFiscais ), que recebe como parâmetro, a string 'xml' da NFS-e.

segue o conteúdo da rotina:

function RetirarPrefixos(const AXML: String): String;
var
 XML: String;
begin
 XML := StringReplace( AXML, 'ns1:', '', [rfReplaceAll] );
 XML := StringReplace( XML, 'ns2:', '', [rfReplaceAll] );
 XML := StringReplace( XML, 'ns3:', '', [rfReplaceAll] );
 XML := StringReplace( XML, 'ns4:', '', [rfReplaceAll] );
 XML := StringReplace( XML, 'ns5:', '', [rfReplaceAll] );
 XML := StringReplace( XML, 'tc:', '', [rfReplaceAll] );
 XML := StringReplace( XML, 'ii:', '', [rfReplaceAll] );
 XML := StringReplace( XML, 'p1:', '', [rfReplaceAll] );
 XML := StringReplace( XML, 'env:', '', [rfReplaceAll] );
 XML := StringReplace( XML, 'nfse:', '', [rfReplaceAll] );
 XML := StringReplace( XML, 'soap:', '', [rfReplaceAll] );
 XML := StringReplace( XML, 'soap12:', '', [rfReplaceAll] );
 XML := StringReplace( XML, 'SOAP-ENV:', '', [rfReplaceAll] );
 XML := StringReplace( XML, 'tin:', '', [rfReplaceAll] );
 XML := StringReplace( XML, 'a:', '', [rfReplaceAll] );
 XML := StringReplace( XML, 'b:', '', [rfReplaceAll] );
 XML := StringReplace( XML, '<![CDATA[', '', [rfReplaceAll] );
 XML := StringReplace( XML, ']]>', '', [rfReplaceAll] );
 XML := StringReplace( XML, 'R$', '', [rfReplaceAll] );

 // Provedor Governa, os prefixos não tem ":"
 XML := StringReplace( XML, 'tc', '', [rfReplaceAll] );
 XML := StringReplace( XML, 'ts', '', [rfReplaceAll] );

 result := XML;
end;

o problema, é que esta rotina esta retirando TODAS as ocorrências de encontros consonantais 'tc' e 'ts'. Na prática, ocorre que todo o conteúdo do xml é varrido, e em casos de ocorrência dos prefixos mencionados, estes caracteres são eliminados.

exemplo:

no arquivo 'xxxxxx-lista-nfse.xml', uma determinada NFS-e possui o e-mail ' [email protected] ', porém no arquivo <numNFe>-nfse.xml (extraído pelo "ACBr"), o e-mail fica da seguinte forma ' [email protected] '.

esta situação esta causando alguns transtornos, pois uso 'e-mail' retornado pela prefeitura como referência cadastral (operações posteriores).

Ao meu ver, esta substituição está correta pois o provedor 'Governa' trabalha desta forma, porém não deveria ser generalizada, mas sim pontual, por exemplo, além do parâmetro 'xml', também poderia ser enviado a tag 'provedor', e internamente a rotina 'retirarPrefixos aplicaria a regra de eliminar 'tc' e 'ts' apenas quando o provedor for igual 'proGoverna'.

minha proposta é esta:

function RetirarPrefixos(const AXML: String; AProvedor: TnfseProvedor): String;
var
 XML: String;
begin
 XML := StringReplace( AXML, 'ns1:', '', [rfReplaceAll] );
 XML := StringReplace( XML, 'ns2:', '', [rfReplaceAll] );
 XML := StringReplace( XML, 'ns3:', '', [rfReplaceAll] );
 XML := StringReplace( XML, 'ns4:', '', [rfReplaceAll] );
 XML := StringReplace( XML, 'ns5:', '', [rfReplaceAll] );
 XML := StringReplace( XML, 'tc:', '', [rfReplaceAll] );
 XML := StringReplace( XML, 'ii:', '', [rfReplaceAll] );
 XML := StringReplace( XML, 'p1:', '', [rfReplaceAll] );
 XML := StringReplace( XML, 'env:', '', [rfReplaceAll] );
 XML := StringReplace( XML, 'nfse:', '', [rfReplaceAll] );
 XML := StringReplace( XML, 'soap:', '', [rfReplaceAll] );
 XML := StringReplace( XML, 'soap12:', '', [rfReplaceAll] );
 XML := StringReplace( XML, 'SOAP-ENV:', '', [rfReplaceAll] );
 XML := StringReplace( XML, 'tin:', '', [rfReplaceAll] );
 XML := StringReplace( XML, 'a:', '', [rfReplaceAll] );
 XML := StringReplace( XML, 'b:', '', [rfReplaceAll] );
 XML := StringReplace( XML, '<![CDATA[', '', [rfReplaceAll] );
 XML := StringReplace( XML, ']]>', '', [rfReplaceAll] );
 XML := StringReplace( XML, 'R$', '', [rfReplaceAll] );

 // Provedor Governa, os prefixos não tem ":"
 if AProvedor = proGoverna then
 begin
      XML := StringReplace( XML, 'tc', '', [rfReplaceAll] );
      XML := StringReplace( XML, 'ts', '', [rfReplaceAll] );
 end;

 result := XML;
end;

A carácter de teste, comentei as linhas em que os prefixos 'tc' e ts' são eliminados. Após Enviar um lote de RPS, consultei os arquivos <numNFe>-nfse.xml extraídos, o problema mencionado não ocorreu. 

grato!

pnfsConversao.pas

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