Ir para conteúdo
  • Cadastre-se

dev botao

NFS-e, Vila Velha - ES, RPS is unexpected... expecting LoteRps


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

Recommended Posts

Postado
3 horas atrás, Sérgio Caldeira Silva disse:

Boa tarde Ítalo!

As alterações de leiaute para prefeitura de Vila Velha - ES, passaram, mas ainda encontrei a necessidade de ajustar o código para esta prefeitura. Segue abaixo as observações, sendo que os itens 1 e 2 foram solucionados e o item 3 está pendente - ainda não consegui resolver.

1. O campo "InscricaoMunicipal" deverá ser preenchido com o CCM que a prefeitura fornece... no meu caso, substitui a inscrição por este código, já que não encontrei um campo que correspondesse ao CCM;

2. Na unit "pnfsEnvLoteRpsResposta", foi preciso alterar o método "function TretEnvLote.LerXml_ABRASF: Boolean;", visto que o campo DataRecebimento vem no formato UTF:

    // Alguns provedores retornam apenas a data, sem o horário
    if Length(Leitor.rCampo(tcStr, 'DataRecebimento')) > 10 then
    begin
      if FProvedor = proSmarAPDv23 then
      begin
        xData := Leitor.rCampo(tcstr, 'DataRecebimento');

        (* 31/03/2021. Sérgio Caldeira: o campo "DataRebimento" vem no formato
                       UTF, portanto, a formatação abaixo incorre em erro.
                       Substitui pela função ISO8601ToDate() do próprio Delphi.
        infRec.FDataRecebimento := StrToDate(Copy(xData, 1, 10)) +
                                   StrToTime(Copy(xData, 12, 8));
        *)
        infRec.FDataRecebimento := ISO8601ToDate(xData);
      end
      else
        infRec.FDataRecebimento := Leitor.rCampo(tcDatHor, 'DataRecebimento');
    end
    else
      infRec.FDataRecebimento := Leitor.rCampo(tcDat, 'DataRecebimento');
 

3. Na unit "pnfsNFSeR", no método "function TNFSeR.LerNFSe: Boolean;", o atributo LayoutXML, está sendo iniciado com o valor loABRASFv2, e no código abaixo está dando erro... imagino que seja pelo valor, na medida em que o leiaute foi alterado para a versão 2.03.

Empaquei aqui, ainda não identifiquei onde alterar. Se algum moderador quiser ajudar, estou com o ambiente todo preparado para auditar o código.

 

 

 

Corrigindo... data no formato UTC: UTC time zone ou ISO 8601. 

Postado (editado)

Sérgio, bati no mesmo problema que você.

Engraçado que no mês de março meu cliente conseguiu emitir todas as notas da maneira como estava o componente. Esse mês começou a dar erro e agora ele tem 300 notas esperando pra serem emitidas e esse maledeto provedor SmaraPD sem rodar.

Na unit pnfsEnvLoteRpsResposta eu apliquei a mesma correção que você, convertendo do formato ISO 8601:

infRec.FDataRecebimento := ISO8601ToDate(xData)

Com isso consegui passar desse ponto, mas acredito ter chegado no mesmo ponto em que você parou:

Nesse trecho da pnfsNFSeR, no método TNFSeR.LerNFSe_ABRASF_V2: (linha 2286)

      if FProvedor in [proSmarAPDv23, proAEG] then
        NFSe.DataEmissaoRps := Leitor.rCampo(tcDatVcto, 'DataEmissao')  <--- aqui
      else
        NFSe.DataEmissaoRps := Leitor.rCampo(tcDat, 'DataEmissao');

O erro é que o conteúdo de 'DataEmissao' está voltando -1

E aqui empaquei. Você conseguiu avançar desse ponto ? Alguém tem alguma ideia ?

 

Editado por rodrigo4t
Postado
17 horas atrás, rodrigo4t disse:

Sérgio, bati no mesmo problema que você.

Engraçado que no mês de março meu cliente conseguiu emitir todas as notas da maneira como estava o componente. Esse mês começou a dar erro e agora ele tem 300 notas esperando pra serem emitidas e esse maledeto provedor SmaraPD sem rodar.

Na unit pnfsEnvLoteRpsResposta eu apliquei a mesma correção que você, convertendo do formato ISO 8601:

infRec.FDataRecebimento := ISO8601ToDate(xData)

Com isso consegui passar desse ponto, mas acredito ter chegado no mesmo ponto em que você parou:

Nesse trecho da pnfsNFSeR, no método TNFSeR.LerNFSe_ABRASF_V2: (linha 2286)

      if FProvedor in [proSmarAPDv23, proAEG] then
        NFSe.DataEmissaoRps := Leitor.rCampo(tcDatVcto, 'DataEmissao')  <--- aqui
      else
        NFSe.DataEmissaoRps := Leitor.rCampo(tcDat, 'DataEmissao');

O erro é que o conteúdo de 'DataEmissao' está voltando -1

E aqui empaquei. Você conseguiu avançar desse ponto ? Alguém tem alguma ideia ?

 

Bom dia Rodrigo!

Não avancei neste ponto, fiquei na dúvida se criava um método novo para o leiaute 2.3 ou se era possível tratar no leiaute 2 da Abrasf.

Apesar de não conhecer profundamente os fontes, vou tentar hoje à tarde. O ruim é que as NFS-e dos clientes vão acumulando... a pressão é grande, a gente não tem paz nem para raciocinar (rsrsrs).

Assim que conseguir alguma coisa, posto aqui.

 

  • Consultores
Postado

Bom dia Sérgio,

Você sabe me dizer esse no Delphi 7 temos a função: ISO8601ToDate ?

Precisamos manter compatibilidade desde o Delphi 7.

Por favor anexe o XML de retorno para que eu possa verificar como esta sendo retornado a data de recebimento. 

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
6 horas atrás, Italo Giurizzato Junior disse:

Bom dia Sérgio,

Você sabe me dizer esse no Delphi 7 temos a função: ISO8601ToDate ?

Precisamos manter compatibilidade desde o Delphi 7.

Por favor anexe o XML de retorno para que eu possa verificar como esta sendo retornado a data de recebimento. 

Boa tarde Ítalo!

O erro está justamente ao ler o retorno, pelo menos foi isto que entendi.

Se tiver algum método que grave o retorno, me informe que eu faço o teste novamente. Se não tiver, podemos combinar um horário para testar, porque meu ambiente está todo preparado para isto, você conectando em meu computador realiza o procedimento rapidinho.

Quanto ao Delphi 7, não tenho como testá-lo... infelizmente.

  • Consultores
Postado

Bom dia Sérgio,

Atribua o valor True a propriedade: 

Configuracoes.Geral.Salvar e

Configuracoes.WebServices.Salvar

O primeiro vai salvar em disco tanto os arquivos de envio quanto de retorno, o segundo idem, mas com uma diferença, cotem a tag Envelope, ou seja, exatamente como é enviado para o webservice e como é retornado por ele.

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

Bom dia Ítalo!

A empresa reclamou que estamos fazendo os testes em ambiente de produção, contudo, confirmei na parametrização e em debug, que o parâmetro está Producao = snNao;

Sabe me dizer em qual unit debugo isto? Assim eu confirmo qual WS está sendo chamado e informo o Gerente de TI da empresa cliente que está querendo saber.

 

Grato pela atenção de sempre.

Postado
Em 12/04/2021 at 08:42, Italo Giurizzato Junior disse:

Bom dia Sérgio,

Você sabe me dizer esse no Delphi 7 temos a função: ISO8601ToDate ?

Precisamos manter compatibilidade desde o Delphi 7.

Por favor anexe o XML de retorno para que eu possa verificar como esta sendo retornado a data de recebimento. 

Bom dia Ítalo!

Segue a pasta onde os xml foram gerados.

NFSe Vila Velha.rar

Postado
Em 12/04/2021 at 15:37, Sérgio Caldeira Silva disse:

Boa tarde Ítalo!

O erro está justamente ao ler o retorno, pelo menos foi isto que entendi.

Se tiver algum método que grave o retorno, me informe que eu faço o teste novamente. Se não tiver, podemos combinar um horário para testar, porque meu ambiente está todo preparado para isto, você conectando em meu computador realiza o procedimento rapidinho.

Quanto ao Delphi 7, não tenho como testá-lo... infelizmente.

Ítalo, analisei a unit System.DateUtils, onde se encontram os métodos, nela não está documentado compatibilidade de versão ou data em que foi criada. Pelo que li, acredito não ser compatível. Contudo, esta unit poderia ser incorporada ao projeto ACBr com outro nome mantendo a compatibilidade com versões antigas e o lazarus, que acha?

Com as integrações com sistemas web e sistemas globais, entendo que esbarraremos com este formato inúmeras vezes.

 

Postado
Em 31/03/2021 at 13:36, Sérgio Caldeira Silva disse:

Boa tarde Ítalo!

As alterações de leiaute para prefeitura de Vila Velha - ES, passaram, mas ainda encontrei a necessidade de ajustar o código para esta prefeitura. Segue abaixo as observações, sendo que os itens 1 e 2 foram solucionados e o item 3 está pendente - ainda não consegui resolver.

1. O campo "InscricaoMunicipal" deverá ser preenchido com o CCM que a prefeitura fornece... no meu caso, substitui a inscrição por este código, já que não encontrei um campo que correspondesse ao CCM;

2. Na unit "pnfsEnvLoteRpsResposta", foi preciso alterar o método "function TretEnvLote.LerXml_ABRASF: Boolean;", visto que o campo DataRecebimento vem no formato UTF:

    // Alguns provedores retornam apenas a data, sem o horário
    if Length(Leitor.rCampo(tcStr, 'DataRecebimento')) > 10 then
    begin
      if FProvedor = proSmarAPDv23 then
      begin
        xData := Leitor.rCampo(tcstr, 'DataRecebimento');

        (* 31/03/2021. Sérgio Caldeira: o campo "DataRebimento" vem no formato
                       UTF, portanto, a formatação abaixo incorre em erro.
                       Substitui pela função ISO8601ToDate() do próprio Delphi.
        infRec.FDataRecebimento := StrToDate(Copy(xData, 1, 10)) +
                                   StrToTime(Copy(xData, 12, 8));
        *)
        infRec.FDataRecebimento := ISO8601ToDate(xData);
      end
      else
        infRec.FDataRecebimento := Leitor.rCampo(tcDatHor, 'DataRecebimento');
    end
    else
      infRec.FDataRecebimento := Leitor.rCampo(tcDat, 'DataRecebimento');
 

3. Na unit "pnfsNFSeR", no método "function TNFSeR.LerNFSe: Boolean;", o atributo LayoutXML, está sendo iniciado com o valor loABRASFv2, e no código abaixo está dando erro... imagino que seja pelo valor, na medida em que o leiaute foi alterado para a versão 2.03.

Empaquei aqui, ainda não identifiquei onde alterar. Se algum moderador quiser ajudar, estou com o ambiente todo preparado para auditar o código.

 

 

 

Ítalo, referente ao item 3 do post acima, consegui resolver. O erro vem da data no formato UTC, resolvi da forma descrita abaixo, porém, percebi que se alterar o tipo da tag para tcDatHorCFe possivelmente resolverá... é uma alternativa que ao meu ver, causará impacto em outros provedores, por isto fiz a alteração abaixo. Anexei a unit também.

function TLeitor.rCampo(const Tipo: TpcnTipoCampo; TAG: string; const TAGparada: string = ''): variant;var
  ConteudoTag: string;
  inicio, fim, inicioTAGparada: integer;
  Ano, Mes, Dia: word;
begin
   ...

    tcDatVcto:
      begin
        if length(ConteudoTag)>0 then
        begin
          (* 15/04/2021. Sérgio Caldeira: a variágel "ConteudoTag" vem no formato
                       UTC, portanto, a formatação abaixo incorre em erro.
                       Substitui pelo tratamento abaixo.

          result := EncodeDate(StrToInt(copy(ConteudoTag, 07, 4)), StrToInt(copy(ConteudoTag, 04, 2)), StrToInt(copy(ConteudoTag, 01, 2)));

          *)
          {Verifica o formato da data para decodificá-la com o método correto.}
          if Pos('T', ConteudoTag) > 0 then
          begin
             DecodeDate(ISO8601ToDate(ConteudoTag, false), Ano, Mes, Dia);
          end
          else if Pos('-', ConteudoTag) > 2 then
               begin
                 Ano := StrToInt(copy(ConteudoTag, 1, 4));
                 Mes := StrToInt(copy(ConteudoTag, 6, 2));
                 Dia := StrToInt(copy(ConteudoTag, 9, 2));
               end
          else if Pos('/', ConteudoTag) > 2 then
               begin
                 Ano := StrToInt(copy(ConteudoTag, 1, 4));
                 Mes := StrToInt(copy(ConteudoTag, 6, 2));
                 Dia := StrToInt(copy(ConteudoTag, 9, 2));
               end
          else begin
                 Ano := StrToInt(copy(ConteudoTag, 7, 4));
                 Mes := StrToInt(copy(ConteudoTag, 4, 2));
                 Dia := StrToInt(copy(ConteudoTag, 1, 2));
               end;
          result := EncodeDate(Ano, Mes, Dia);
        end
        else
          Result := 0;
      end;
....

 

pcnLeitor.pas

Postado (editado)
Em 15/04/2021 at 14:52, Sérgio Caldeira Silva disse:

Ítalo, referente ao item 3 do post acima, consegui resolver. O erro vem da data no formato UTC, resolvi da forma descrita abaixo, porém, percebi que se alterar o tipo da tag para tcDatHorCFe possivelmente resolverá... é uma alternativa que ao meu ver, causará impacto em outros provedores, por isto fiz a alteração abaixo. Anexei a unit também.

function TLeitor.rCampo(const Tipo: TpcnTipoCampo; TAG: string; const TAGparada: string = ''): variant;var
  ConteudoTag: string;
  inicio, fim, inicioTAGparada: integer;
  Ano, Mes, Dia: word;
begin
   ...

    tcDatVcto:
      begin
        if length(ConteudoTag)>0 then
        begin
          (* 15/04/2021. Sérgio Caldeira: a variágel "ConteudoTag" vem no formato
                       UTC, portanto, a formatação abaixo incorre em erro.
                       Substitui pelo tratamento abaixo.

          result := EncodeDate(StrToInt(copy(ConteudoTag, 07, 4)), StrToInt(copy(ConteudoTag, 04, 2)), StrToInt(copy(ConteudoTag, 01, 2)));

          *)
          {Verifica o formato da data para decodificá-la com o método correto.}
          if Pos('T', ConteudoTag) > 0 then
          begin
             DecodeDate(ISO8601ToDate(ConteudoTag, false), Ano, Mes, Dia);
          end
          else if Pos('-', ConteudoTag) > 2 then
               begin
                 Ano := StrToInt(copy(ConteudoTag, 1, 4));
                 Mes := StrToInt(copy(ConteudoTag, 6, 2));
                 Dia := StrToInt(copy(ConteudoTag, 9, 2));
               end
          else if Pos('/', ConteudoTag) > 2 then
               begin
                 Ano := StrToInt(copy(ConteudoTag, 1, 4));
                 Mes := StrToInt(copy(ConteudoTag, 6, 2));
                 Dia := StrToInt(copy(ConteudoTag, 9, 2));
               end
          else begin
                 Ano := StrToInt(copy(ConteudoTag, 7, 4));
                 Mes := StrToInt(copy(ConteudoTag, 4, 2));
                 Dia := StrToInt(copy(ConteudoTag, 1, 2));
               end;
          result := EncodeDate(Ano, Mes, Dia);
        end
        else
          Result := 0;
      end;
....

 

 

Bom dia Ítalo!

Fiz novos testes com o tratamento de data e deu tudo certo, contudo, não consegui identificar a origem, o WS está retornando a seguinte mensagem:

"ERRO: Conjunto de RPS transmitidos  (máximo de 1 RPS) excedido. Quantidade atual: 18)

Você tem ideia do que pode ser?

Editado por Sérgio Caldeira Silva
Erro digitação
Postado
2 horas atrás, Sérgio Caldeira Silva disse:

Bom dia Ítalo!

Fiz novos testes com o tratamento de data e deu tudo certo, contudo, não consegui identificar a origem, o WS está retornando a seguinte mensagem:

"ERRO: Conjunto de RPS transmitidos  (máximo de 1 RPS) excedido. Quantidade atual: 18)

Você tem ideia do que pode ser?

Senhores,

Alguém sabe me informar como a propriedade NotasFiscais.Count é alimentada?

Pergunto porque envio uma NFS-e por vez, mas a cada envio, esta propriedade é incrementada, por isto o erro da mensagem acima.

  • Consultores
Postado

Bom dia Sérgio,

Não devemos alterar a unit pcnLeitor pois esta é utilizada por todos os componentes que emitem Documentos Fiscais Eletrônicos.

Peço mais uma vez, anexe o XML de retorno que contem a data fora do padrão para que a equipe ACBr possa analisar e com isso decidir se há necessidade de alterar algo no pcnLeitor ou não.

Evite ao máximo misturar assuntos em uma mesma postagem.

Respondendo a sua ultima postagem que não tem nada haver com o assunto que esta sendo tratado, a resposta é: toda vez que você ADD os dados de um RPS na lista NotaFiscais o valor de Count é incrementado automaticamente.

Se você envia um Rps por vez, e o Count esta sendo incrementado, isso significa que você não esta limpando a lista antes de ADD o novo Rps.

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
Em 23/04/2021 at 09:38, Italo Giurizzato Junior disse:

Bom dia Sérgio,

Não devemos alterar a unit pcnLeitor pois esta é utilizada por todos os componentes que emitem Documentos Fiscais Eletrônicos.

Peço mais uma vez, anexe o XML de retorno que contem a data fora do padrão para que a equipe ACBr possa analisar e com isso decidir se há necessidade de alterar algo no pcnLeitor ou não.

Evite ao máximo misturar assuntos em uma mesma postagem.

Respondendo a sua ultima postagem que não tem nada haver com o assunto que esta sendo tratado, a resposta é: toda vez que você ADD os dados de um RPS na lista NotaFiscais o valor de Count é incrementado automaticamente.

Se você envia um Rps por vez, e o Count esta sendo incrementado, isso significa que você não esta limpando a lista antes de ADD o novo Rps.

Boa tarde Ítalo!

As alterações já foram anexadas nos posts anteriores.

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