Ir para conteúdo
  • Cadastre-se

dev botao

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

Recommended Posts

  • Membros Pro
Postado
Em 13/06/2016 at 17:58, ivbolson disse:

Talvez você tenha que tratar a exception gerada pelo ACBr, quando vier em branco, ou seja: sem mensagem de erro, não fazer nada e prosseguir normalmente. Outra possibilidade é a mensagem de erro não estar sendo retornada pelo web service, neste caso você deve consultar a situação do seu RPS no portal, lá terá a descrição do erro que não está sendo retornado. Por exemplo o erro de inscrição municipal inválida não é retornado pelo web service.

 

Amigos, olá já estou tratando a exception... mas sem sucesso...

Depois de Atualizado os fontes, agora a lista abaixo tem dados, mas o Número do Lote está igual a (0) zeros...

for i := 0 to FRetornoNFSe.ListaNFSe.CompNFSe.Count -1 do 

Até aqui está OK, mas quando chega nas linhas conforme abaixo:

      if (Provedor = ProTecnos) then
      begin
        if (FRetornoNFSe.ListaNFSe.CompNFSe.Items.NFSe.NumeroLote <> '0') then  ?????
        begin

 

o Número do Lote está igual a (0) zeros...

não trazendo assim os Dados 

FRetornoNFSe.ListaNFSe.CompNFSe.Items.NFSe.NumeroLote;
FNotasFiscais.Items[ii].NFSe.dhRecebimento := FRetornoNFSe.ListaNFSe.CompNFSe.Items.NFSe.dhRecebimento;
FNotasFiscais.Items[ii].NFSe.Protocolo     := FRetornoNFSe.ListaNFSe.CompNFSe.Items.NFSe.Protocolo;

 

Estou testando para a Cidade de Ivoti, Provedor => Tecnos

 

  • 3 semanas depois ...
Postado

Olá pessoal

Fiz duas pequenas modificações para utilização no servidor Tecnos.

Uma delas é quanto ao Numero do protocolo, utilizado na consulta dos lotes durante o envio sincrono e outra é na Damfse referente ao código do municipio e nome do municío que está trocado.

Como segue:

Durante o envio do xml é retornado apenas um recibo de processamento, sendo então necessário uma consulta para obter o xml da nota.
O qual pode ser feito automático pelo componente, modificando-se a propriedade abaixo (usando as correções que disponibilizo aqui funciona):


FNotaServicoWebService.ACBr.Configuracoes.Geral.ConsultaLoteAposEnvio := True

 

Correções para o comportamente de envio já trazer os xmls.

Em ACBrNFSeWebServices.pas (anexo)

....
if (FRetornoNFSe.ListaNFSe.CompNFSe.Items.NFSe.NumeroLote <> '0') then
        begin
          FProtocolo := FRetornoNFSe.Protocolo;

...
    // Retorno do GerarNfse e ConsultarLoteRps
    if FPLayout in [LayNFSeGerar, LayNfseConsultaLote] then begin
      FNotasFiscais.Items[ii].NFSe.Situacao  := FRetornoNFSe.ListaNFSe.CompNFSe.Items.NFSe.Situacao;
      FNotasFiscais.Items[ii].NFSe.Protocolo := FProtocolo;
    end;

Com isto o envio preenche o FProtocolo (EnviarEvento) como valor retornado do recibo, e em seguida, durante a consulta, preenche a nota com o mesmo valor.
O protocolo não é retornado na consulta pois não faz parte do xml da nota, porem quando se está tentando autorizar a nota é interessante salvar o protocolo para eventuais posteriores consultas já que ele não ficará em lugar algum após isto.

Desta mesma forma o Protocolo pode ser obtido após a chamada do evento de EnviarSincrono, como segue este exemplo abaixo.

 
if FNotaServicoWebService.ACBr.EnviarSincrono(FNotaServicoWebService.Lote, False) then begin
    sPro   := FNotaServicoWebService.ACBr.NotasFiscais.Items[0].NFSe.Protocolo;
    sXML := FNotaServicoWebService.ACBr.NotasFiscais.Items[0].NomeArq;
 

ACBrNFSeDANFSeFR.pas

ACBrNFSeWebServices.pas

  • Consultores
Postado

Bom dia Elazar,

No que diz respeito ao Numero do Protocolo, fiz de uma forma diferente, acredito que vai funcionar.

Por favor faça uma cópia dos seus fontes, atualize e teste.

Quanto ao DANFSE por não conhecer o Fast Report, deixo para outro colega da equipe ACBr avaliar as suas alterações.

Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / Araraquara-SP

Araraquara - A era dos Trólebus

Postado (editado)

Olá, boa tarde

Fiz uma breve comparação nos fontes, falando sobre o ACBrNFSeWebServices a primeira modificação fica ok, fica certo se todos os provedores sincronos tiverem o mesmo comportamento.

 

Sobre a segunda modificação sugerida, acredito que seria interessante manter o preenchimento da tag protocolo de cada NFSe.
Veja que Codigo de verificação é preenchido normalmente, assim poderia ser feito para o protocolo tambem.

FNotasFiscais.Items[ii].NFSe.CodigoVerificacao := FRetornoNFSe.ListaNFSe.CompNFSe.Items.NFSe.CodigoVerificacao;

Minha sugestão consiste em manter esta parte assim:
    // Retorno do GerarNfse e ConsultarLoteRps
    if FPLayout in [LayNFSeGerar, LayNfseConsultaLote] then begin
      FNotasFiscais.Items[ii].NFSe.Situacao  := FRetornoNFSe.ListaNFSe.CompNFSe.Items.NFSe.Situacao;
      FNotasFiscais.Items[ii].NFSe.Protocolo := FProtocolo;
    end;

Talvez isto seja uma exceção da Tecnos que retorna o protocolo apenas na consulta... porem a linha faz falta;

Nos nossos fontes poderia ficar normalmente assim:

    if FNotaServicoWebService.ACBr.EnviarSincrono(FNotaServicoWebService.Numero, False) then begin
      sProtocolo := FNotaServicoWebService.ACBr.NotasFiscais.Items[0].NFSe.Protocolo;
      sChave  := FNotaServicoWebService.ACBr.NotasFiscais.Items[0].NFSe.CodigoVerificacao;
      sNumero := FNotaServicoWebService.ACBr.NotasFiscais.Items[0].NFSe.Numero;
      sCaminhoXML    := FNotaServicoWebService.ACBr.NotasFiscais.Items[0].NomeArq;

 ....
 

Obrigado

Editado por Elazar
  • Consultores
Postado

Boa tarde Elazar,

Não vejo necessidade dessa sua última alteração, porque:

Na unit pnfsLerListaNFSe temos a leitura da TAG e o armazenamento do numero do protocolo na variável ProtocoloTemp:

      ProtocoloTemp:= Leitor.rCampo(tcStr, 'Protocolo');
      if trim(ProtocoloTemp) = '' then
        ProtocoloTemp := '0';

Depois temos:

              // Retorno do GerarNfse e EnviarLoteRpsSincrono
              FNFSe.NumeroLote    := NumeroLoteTemp;
              FNFSe.dhRecebimento := DataRecebimentoTemp;
              FNFSe.Protocolo     := ProtocoloTemp;

O valor de FNFSe.Protocolo é lido da seguinte forma na unit ACBrNFSeWebServices:

FRetornoNFSe.ListaNFSe.CompNFSe.Items[ i ].NFSe.Protocolo

Se você observar na unit pnfsLerListaNFSe vai notar que FNFSe é um elemento da lista.

Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / Araraquara-SP

Araraquara - A era dos Trólebus

Postado

Olá

Porem quando isto ocorre o ii está como 1 (novoretorno = true) = LayNFSeGerar, LayNFSeRecepcaoLoteSincrono
Mas quando a efetiva resposta com o xml da nota retorna o ajuste é feito no index 0 = LayNFSeGerar, LayNfseConsultaLote ***1 e o xml das notas fica sem protocolo;

Sendo assim, no final da execução existem dois itens no NotasFiscais, até onde pude verificar o 1 tem protocolo e  0 sem o .Protocolo

FNotaServicoWebService.ACBr.NotasFiscais.Items[0].NFSe.Protocolo
e
FNotaServicoWebService.ACBr.NotasFiscais.Items[1].NFSe.Protocolo. 

Já que o ajuste de "codigoverificação" é feito em .NFSe.CodigoVerificacao no index 0 acredito que o .Protocolo também poderia

 

***1  If que falei e ajusta para 0 o index onde será ajustados os dados

      if ((FProvedor <> proNFSeBrasil) and
         ((StrToInt64Def(FNotasFiscais.Items[l].NFSe.IdentificacaoRps.Numero, 0) = StrToInt64Def(FRetornoNFSe.ListaNFSe.CompNFSe.Items.NFSe.IdentificacaoRps.Numero, 0)) and
           (FNotasFiscais.Items[l].NFSe.IdentificacaoRps.Serie = FRetornoNFSe.ListaNFSe.CompNFSe.Items.NFSe.IdentificacaoRps.Serie) and
           (FNotasFiscais.Items[l].NFSe.IdentificacaoRps.Tipo = FRetornoNFSe.ListaNFSe.CompNFSe.Items.NFSe.IdentificacaoRps.Tipo)) or
          (FNotasFiscais.Items[l].NFSe.InfID.ID = FRetornoNFSe.ListaNFSe.CompNFSe.Items.NFSe.InfID.ID)) or
         ((FProvedor = proNFSeBrasil) and
          (StrToInt64Def(FNotasFiscais.Items[l].NFSe.IdentificacaoRps.Numero, 0) = StrToInt64Def(FRetornoNFSe.ListaNFSe.CompNFSe.Items.NFSe.IdentificacaoRps.Numero, 0))) then
      begin
        NovoRetorno := False;
        ii := l;
        break;
      end;

e o 1 ainda existe, ocasionando 2 objetos na list.

Postado

Update 1

Provedor da Tecnos tem o seguinte funcionamento

1-Envia o xml das notas
2-Retorna o recibo de processamento com o protocolo do lote (nota)
3-Envia consulta do lote com o protocolo recem recebido
4-Retorna o xml da nota (sem protocolo) ...se formos manter o padrão você precisa preencher a tag com o protocolo já recibo, esta seria a minha sugestão.

Nos fontes atuais, o "FRetornoNFSe.ListaNFSe.CompNFSe.Items.NFSe.Situacao" no quarto passo retorna 4 - "Processado com sucesso" o qual é ajustado apenas no NotasFiscais[0], seguindo a lógica deste o protocolo deveria ser ajustado no index 0 também, não no index 1.

 

Update 2

Comprovando o que digo... você pode verificar as duas imagens abaixo, onde descreve as situações retornadas pelo servidor.

Atual.jpg, fontes acbr atual.
Tecnos.jpg com a minha modificação do protocolo.

Ademais, porque uso o FProtocolo? porque o
FRetornoNFSe.ListaNFSe.CompNFSe.Items.NFSe.Protocolo; (ainda no quarto passo estaria zerado porque no retorno do xml da nota ele não existe, logo precisamos manter o que já possuimos, retornado na consulta, lá no passo 2).

Bom, isto é só explicando os motivos de qual eu vou continuar usando a linha que sugeri por enquanto.


Update 3


Outra coisa que notei agora a pouco e vou investigar melhor em seguida é quanto a Damfse, pareçe o servidor Tecnos não está retornando uma meia duzia de campos atualmente exibidos, já cogitei uma possibilidade de implementação de um novo layout com estes ajustes.

 

Tecnos.jpg

Atual.jpg

Postado

Olá, boa tarde Italo.
Com as alterações em pnfsLerListaNFSe.pas e pnfsNFSeR.pas o método EnviaSincrono está retornando false, e uma exception é lançada.
Ainda assim o protocolo não é retornado após leitura das mensagens.
 

function TWebServices.EnviaSincrono(ALote: String): Boolean;
begin
  FEnviarSincrono.FNumeroLote := ALote;
  Result := FEnviarSincrono.Executar;  //Retornando false **1
  if not (Result) then
    FEnviarSincrono.GerarException( FEnviarSincrono.Msg );
  // Alguns provedores requerem que sejam feitas as consultas para obter o XML
  // da NFS-e
  FConsSitLoteRPS.FProtocolo  := FEnviarSincrono.Protocolo;
  FConsSitLoteRPS.FNumeroLote := FEnviarSincrono.NumeroLote;
  FConsLote.FProtocolo := FEnviarSincrono.Protocolo; // .Protocolo deveria estar preenchido com o protocolo da primeira chamada.
  if (TACBrNFSe(FACBrNFSe).Configuracoes.Geral.ConsultaLoteAposEnvio) and (Result) then
  begin
    if ProvedorToVersaoNFSe(TACBrNFSe(FACBrNFSe).Configuracoes.Geral.Provedor) = ve100 then
    begin
      Result := FConsSitLoteRPS.Executar;
      if not (Result) then
        FConsSitLoteRPS.GerarException( FConsSitLoteRPS.Msg );
    end;
    if TACBrNFSe(FACBrNFSe).Configuracoes.Geral.Provedor = proInfisc then
      Result := True
    else
      Result := FConsLote.Executar;
    if not (Result) then
      FConsLote.GerarException( FConsLote.Msg );
  end;
end;
Postado

Olá, agora no final da tarde consegui fazer algumas modificações seguindo um pouco mais sua linha de raciocinio.

Para que funcione com o Tecnos segue então as sugestões.

~Baseando-se
-Leitura da datahora recebimento na consulta do lote enviado, sem isto o metodo extrair notas retorno vai retornar False no Result := FEnviarSincrono.Executar;
-
Atribuição da propriedade Protocolo durante o metodo ExtrairNotasRetorno no modo LayNfseConsultaLote;
 (Na segunda execução - retorno das informações da nota) (já que LayNFSeRecepcaoLoteSincrono nunca ocorrerá para o servidor Tecnos);

/ Retorno do GerarNfse e ConsultarLoteRps
    if FPLayout in [LayNFSeGerar, LayNfseConsultaLote] then
      FNotasFiscais.Items[ii].NFSe.Situacao  := FRetornoNFSe.ListaNFSe.CompNFSe.Items.NFSe.Situacao;
      FNotasFiscais.Items[ii].NFSe.Protocolo := FProtocolo;
    end;

ACBrNFSeWebServices.pas

pnfsLerListaNFSe.pas

Postado

Olá, agora sim, com este novo TNFSeEnviarSincrono.TratarResposta ficou bom demais.

Estava com suspeitas de por não existir a tag no xml ela voltasse a ficar em branco, já que o .protocolo estava sendo ajustado no index certo antes de receber os dados da nota, mas ficou ok.

Autorização para tecnos Ok.

OBS para quem estiver começando agora.

Tecnos requer:
FNotaServicoWebService.ACBr.Configuracoes.Geral.ConsultaLoteAposEnvio := True;

OBS 2

Vou continuar vendo o restante e grito assim que surgir algum detalhe.

Lembrando que a unit ACBrNFSeDANFSeFR.pas ainda precisa de ajustes. (estou anexando novamente para que alguem possa avaliar com calma)

Danfse também precisa de ajustes no layout, assim que possível farei isto e disponibilizarei aqui.

ACBrNFSeDANFSeFR.pas

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