Ir para conteúdo
  • Cadastre-se

dev botao

Duvida como tratar o retorno


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

Recommended Posts

Amigos do forum, primeiro sei que esse assunto é discutido ate a exaustao, mas peço desculpas, pq nao fui capaz de fechar esse assunto, tenho mts codigos que peguei no forum, depois de uma pesquisa sobre o assunto, mas ainda nao estou seguro disso, somente por causa disso estou aqui pedindo a gentileza de se alguem puder me passar a maneira q vcs tratam os dados retornados apos o ACBrNFe.Enviar(0), o que vcs guardam no banco de dados, como tratam os erros de transmissao, e agora com essa coisa de denegada, como tratam isso.

Agradeço a paciencia e a ajuda de quem puder.

Abs

Link para o comentário
Compartilhar em outros sites

Basicamente todos os dados do XML eu gravo no Banco de dados, inclusive o XML completo.

Vou te passar trechos do meu sistema para você ver como eu gravo no Banco de Dados. O

Componente nos retorna os resultados da Sefaz e o sistema os exibe em memo chamado MemoStatus:

Envio de lote. Neste envio já recebemos o número do recibo:


function TF_StatusEnvioNFe.EnvioNFe: Boolean;

var i: Integer;

begin

  try

    MemoStatus.Lines.Add('-------------------------------------------------------------------------------------------');

    MemoStatus.Lines.Add(' =>  Enviando lote de nota(s) fiscal(is)');

    MemoStatus.Lines.Add('-------------------------------------------------------------------------------------------');

    F_Menu.ACBrNFe1.NotasFiscais.Assinar;

    F_Menu.ACBrNFe1.NotasFiscais.Valida;

    F_Menu.ACBrNFe1.WebServices.Enviar.Lote := FNFe.FEnvio.FNumLote;

    F_Menu.ACBrNFe1.WebServices.Enviar.Executar;

    FInfoRecibo := F_Menu.ACBrNFe1.WebServices.Enviar.Recibo;

    FInfoStat := IntToStr(F_Menu.ACBrNFe1.WebServices.Enviar.cStat);

    FInfoMotivo := F_Menu.ACBrNFe1.WebServices.Enviar.xMotivo;

    FInfoDataHora := DateTimeToStr(F_Menu.ACBrNFe1.WebServices.Enviar.dhRecbto);


    MemoStatus.Lines.Add('  ' + FInfoDataHora + '  ' + FInfoStat + ' - ' + FInfoMotivo);

    if F_Menu.ACBrNFe1.WebServices.Enviar.cStat = 103 then

      begin

        for i := 0 to (F_Menu.ACBrNFe1.NotasFiscais.Count - 1) do

          begin

            qryNfiscal.Close;

            qryNfiscal.SQL.Clear;

            qryNfiscal.SQL.Add('SELECT tbl_NOTA_FISCAL.*, ' +

                               'tbl_EMITENTE.CPF_CNPJ_EMIT FROM ' +

                               'tbl_NOTA_FISCAL LEFT OUTER JOIN tbl_EMITENTE ' +

                               'ON tbl_NOTA_FISCAL.ID_EMIT_NF = ' +

                               'tbl_EMITENTE.ID_EMIT ' +

                               'WHERE tbl_NOTA_FISCAL.NUM_NF = ' +

                               IntToStr(F_Menu.ACBrNFe1.NotasFiscais.Items[i].NFe.Ide.nNF) + ' AND ' +

                               'tbl_EMITENTE.CPF_CNPJ_EMIT = ' +

                               F_Menu.ACBrNFe1.NotasFiscais.Items[i].NFe.Emit.CNPJCPF);

            qryNfiscal.Open;

            qryNfiscal.Edit;

            qryNFiscal.FieldByName('SITUACAO_NF').Value := 1;

            qryNFiscal.FieldByName('NUM_RECIBO_NF').Value := FInfoRecibo;

            qryNFiscal.Post;

          end;

        MemoStatus.Lines.Add('  Recibo nº ' + FInfoRecibo);

        MemoStatus.Lines.Add(' ');

        Result := True;

      end

    else

      begin

        Disponivel;


        Result := False;

      end;

  except

    on E: Exception do

      begin

        MemoStatus.Lines.Add(' ');

        MemoStatus.Lines.Add('  ERRO: Não foi possível enviar o lote de NF-e');

        MemoStatus.Lines.Add('  MOTIVO: ' + E.Message);

        Disponivel;

      end;

  end;

end;

Com o número do recibo em nosso poder, fazemos a consulta dele para saber o resultado do processamento das notas fiscais contidas no lote:

function TF_StatusEnvioNFe.ConsultaReciboNFe: Boolean;

var sRecibo: String;

i: Integer;

begin

  try

    if FAcao = taEnvioNFe then

      sRecibo := F_Menu.ACBrNFe1.WebServices.Enviar.Recibo

    else

      sRecibo := FNFe.FConsultaRecibo.FNumRecibo;

    MemoStatus.Lines.Add('-------------------------------------------------------------------------------------------');

    MemoStatus.Lines.Add(' =>  Consultando recibo nº ' + sRecibo);

    MemoStatus.Lines.Add('-------------------------------------------------------------------------------------------');

    F_Menu.ACBrNFe1.WebServices.Retorno.Recibo := sRecibo;

    F_Menu.ACBrNFe1.WebServices.Retorno.Executar;

    MemoStatus.Lines.Add('  Nota fiscal  Número do protocolo                  Status da NF-e');

    MemoStatus.Lines.Add('  -----------  -----------------------------------  ---------------------------------------');

    for i := 0 to (F_Menu.ACBrNFe1.WebServices.Retorno.NFeRetorno.ProtNFe.Count - 1) do

      begin

        FInfoDataHora := DateTimeToStr(F_Menu.ACBrNFe1.WebServices.Retorno.NFeRetorno.ProtNFe.Items[i].dhRecbto);

        FInfoProtocolo := F_Menu.ACBrNFe1.WebServices.Retorno.NFeRetorno.ProtNFe.Items[i].nProt;

        FInfoStat := IntToStr(F_Menu.ACBrNFe1.WebServices.Retorno.NFeRetorno.ProtNFe.Items[i].cStat);

        FInfoMotivo := F_Menu.ACBrNFe1.WebServices.Retorno.NFeRetorno.ProtNFe.Items[i].xMotivo;

        FInfoNotaFiscal := Copy(F_Menu.ACBrNFe1.WebServices.Retorno.NFeRetorno.ProtNFe.Items[i].chNFe, 26, 3)

        + '.' + Copy(F_Menu.ACBrNFe1.WebServices.Retorno.NFeRetorno.ProtNFe.Items[i].chNFe, 29, 3)

        + '.' + Copy(F_Menu.ACBrNFe1.WebServices.Retorno.NFeRetorno.ProtNFe.Items[i].chNFe, 32, 3);

        // Grava as informações recebidas pela Sefaz no banco de dados

        if FAcao = taEnvioNFe then

          begin

            qryNfiscal.Close;

            qryNfiscal.SQL.Clear;

            qryNfiscal.SQL.Add('SELECT tbl_NOTA_FISCAL.*, ' +

                               'tbl_EMITENTE.CPF_CNPJ_EMIT FROM ' +

                               'tbl_NOTA_FISCAL LEFT OUTER JOIN tbl_EMITENTE ' +

                               'ON tbl_NOTA_FISCAL.ID_EMIT_NF = ' +

                               'tbl_EMITENTE.ID_EMIT ' +

                               'WHERE tbl_NOTA_FISCAL.NUM_NF = ' +

                               IntToStr(F_Menu.ACBrNFe1.NotasFiscais.Items[i].NFe.Ide.nNF) + ' AND ' +

                               'tbl_EMITENTE.CPF_CNPJ_EMIT = ' +

                               F_Menu.ACBrNFe1.NotasFiscais.Items[i].NFe.Emit.CNPJCPF);

            qryNfiscal.Open;

            qryNfiscal.Edit;

            qryNFiscal.FieldByName('CHAVE_NFE').Value := F_Menu.ACBrNFe1.NotasFiscais.Items[i].NFe.procNFe.chNFe;

            case F_Menu.ACBrNFe1.NotasFiscais.Items[i].NFe.procNFe.cStat of

              100: qryNFiscal.FieldByName('SITUACAO_NF').Value := 2;

              110: qryNFiscal.FieldByName('SITUACAO_NF').Value := 3;

            end;

            qryNFiscal.FieldByName('NUM_PROT_AUTO_NF').Value := FInfoProtocolo;

            qryNFiscal.FieldByName('DH_PROT_AUTO_NF').Value := FInfoDataHora;

            qryNFiscal.FieldByName('XML_NFE').Value := F_Menu.ACBrNFe1.NotasFiscais.Items[i].XML;

            if F_Menu.ACBrNFe1.NotasFiscais.Items[i].NFe.procNFe.cStat > 200 then //in [100, 110] then

              begin

                qryNFiscal.FieldByName('SITUACAO_NF').Value := 0;

                qryNFiscal.FieldByName('NUM_PROT_AUTO_NF').Value := '';

                qryNFiscal.FieldByName('DH_PROT_AUTO_NF').Value := '';

              end;

            qryNfiscal.Post;

          end;


        if FAcao = taConsultaNFe then

          begin

            qryNfiscal.Close;

            qryNfiscal.SQL.Clear;

            qryNfiscal.SQL.Add('SELECT tbl_NOTA_FISCAL.*, ' +

                               'tbl_EMITENTE.CPF_CNPJ_EMIT FROM ' +

                               'tbl_NOTA_FISCAL LEFT OUTER JOIN tbl_EMITENTE ' +

                               'ON tbl_NOTA_FISCAL.ID_EMIT_NF = ' +

                               'tbl_EMITENTE.ID_EMIT ' +

                               'WHERE tbl_NOTA_FISCAL.NUM_NF = ' +

                               IntToStr(F_Menu.ACBrNFe1.NotasFiscais.Items[i].NFe.Ide.nNF) + ' AND ' +

                               'tbl_EMITENTE.CPF_CNPJ_EMIT = ' +

                               F_Menu.ACBrNFe1.NotasFiscais.Items[i].NFe.Emit.CNPJCPF);

            qryNfiscal.Open;

            qryNfiscal.Edit;

            case F_Menu.ACBrNFe1.WebServices.Retorno.NFeRetorno.ProtNFe.Items[i].cStat of

              100: begin // Autorizada

                     qryNFiscal.FieldByName('SITUACAO_NF').Value := 2;

                     if qryNFiscal.FieldByName('NUM_PROT_AUTO_NF').Value > '' then

                     else

                       begin

                         qryNFiscal.FieldByName('NUM_PROT_AUTO_NF').Value := FInfoProtocolo;

                         qryNFiscal.FieldByName('DH_PROT_AUTO_NF').Value := FInfoDataHora;

                       end;

                     qryNFiscal.FieldByName('XML_NFE').Value := F_Menu.ACBrNFe1.NotasFiscais.Items[i].XML;

                   end;


              110: begin // Denegada

                     qryNFiscal.FieldByName('SITUACAO_NF').Value := 3;

                     if qryNFiscal.FieldByName('NUM_PROT_AUTO_NF').Value > '' then

                     else

                       begin

                         qryNFiscal.FieldByName('NUM_PROT_AUTO_NF').Value := FInfoProtocolo;

                         qryNFiscal.FieldByName('DH_PROT_AUTO_NF').Value := FInfoDataHora;

                       end;

                     qryNFiscal.FieldByName('XML_NFE').Value := F_Menu.ACBrNFe1.NotasFiscais.Items[i].XML;

                   end;


              101: begin // Cancelada

                     qryNFiscal.FieldByName('SITUACAO_NF').Value := 5;

                     if qryNFiscal.FieldByName('NUM_PROT_AUTO_NF').Value = '' then

                     else

                       begin

                         qryNFiscal.FieldByName('NUM_PROT_CANC_NF').Value := FInfoProtocolo;

                         qryNFiscal.FieldByName('DH_PROT_CANC_NF').Value := FInfoDataHora;

                       end;

                     qryNFiscal.FieldByName('XML_CANC_NFE').Value := F_Menu.ACBrNFe1.NotasFiscais.Items[i].XML;

                   end

              else

                begin

                  qryNFiscal.FieldByName('SITUACAO_NF').Value := 0;

                  qryNFiscal.FieldByName('NUM_PROT_AUTO_NF').Value := '';

                  qryNFiscal.FieldByName('DH_PROT_AUTO_NF').Value := '';

                  qryNFiscal.FieldByName('XML_NFE').Value := '';

                end;

            end; // case F_Menu.ACBrNFe1.WebServices.Retorno.NFeRetorno.ProtNFe.Items[i].cStat


            qryNfiscal.Post;

          end; // if FAcao = taConsultaNFe


          // Fim da gravação no banco de dados.

        MemoStatus.Lines.Add('  ' + FInfoNotaFiscal + '  ' + FInfoProtocolo + ' ' + FInfoDataHora + '  ' + FInfoStat + ' - ' + FInfoMotivo);

      end; // for i := 0 to (F_Menu.ACBrNFe1.WebServices.Retorno.NFeRetorno.ProtNFe.Count - 1)

    MemoStatus.Lines.Add(' ');

    Result := True;

  except

    on E: Exception do

      begin

        MemoStatus.Lines.Add(' ');

        MemoStatus.Lines.Add('  ERRO: Não foi possível consultar o recibo');

        MemoStatus.Lines.Add('  MOTIVO: ' + E.Message);

        Disponivel;


        Result := False;

      end;

  end; // try

end;

Se precisar cancelar uma nota:

function TF_StatusEnvioNFe.CancelamentoNFe: Boolean;

var i, iCaracteres, iCaractereAtual: Integer;

begin

  try

    MemoStatus.Lines.Add('-------------------------------------------------------------------------------------------');

    MemoStatus.Lines.Add(' =>  Cancelando NF-e com chave de acesso nº ' + FNFe.FCancelamento.FChaveNFe);

    MemoStatus.Lines.Add('-------------------------------------------------------------------------------------------');

    if F_Menu.ACBrNFe1.NotasFiscais.Count > 0 then

      begin

        F_Menu.ACBrNFe1.WebServices.Cancelamento.NFeChave := FNFe.FCancelamento.FChaveNFe;

        F_Menu.ACBrNFe1.WebServices.Cancelamento.Justificativa := FNFe.FCancelamento.FJustificativa;

        F_Menu.ACBrNFe1.WebServices.Cancelamento.Protocolo := FNFe.FCancelamento.FProtocolo;

        F_Menu.ACBrNFe1.WebServices.Cancelamento.Executar;

        FInfoProtocolo := F_Menu.ACBrNFe1.WebServices.Cancelamento.Protocolo;

        FInfoMotivo := F_Menu.ACBrNFe1.WebServices.Cancelamento.xMotivo;

        FInfoStat := IntToStr(F_Menu.ACBrNFe1.WebServices.Cancelamento.cStat);

        FInfoDataHora := DateTimeToStr(F_Menu.ACBrNFe1.WebServices.Cancelamento.DhRecbto);

        iCaracteres := Length(FNFe.FCancelamento.FJustificativa) div 57;

        if iCaracteres = 0 then

          MemoStatus.Lines.Add('  Justificativa: ' + FNFe.FCancelamento.FJustificativa)

        else

          begin

            iCaractereAtual := 0;

            for i := 1 to (iCaracteres + 1) do

              begin

                iCaractereAtual := iCaractereAtual + 57;

                MemoStatus.Lines.Add('  Justificativa: ' + Copy(FNFe.FCancelamento.FJustificativa, (iCaractereAtual - 56), iCaractereAtual));

              end;

          end;

        if FInfoStat <> '101' then

          begin

            Disponivel;

            MemoStatus.Lines.Add(' ');


            Result := False;

          end

        else

          begin

            MemoStatus.Lines.Add('  Status...: ' + FInfoStat + ' - ' + FInfoMotivo);

            MemoStatus.Lines.Add('  Protocolo: ' + FInfoProtocolo + ' ' + FInfoDataHora);

            qryNfiscal.Close;

            qryNfiscal.SQL.Clear;

            qryNfiscal.SQL.Add('SELECT tbl_NOTA_FISCAL.*, ' +

                               'tbl_EMITENTE.CPF_CNPJ_EMIT FROM ' +

                               'tbl_NOTA_FISCAL LEFT OUTER JOIN tbl_EMITENTE ' +

                               'ON tbl_NOTA_FISCAL.ID_EMIT_NF = ' +

                               'tbl_EMITENTE.ID_EMIT ' +

                               'WHERE tbl_NOTA_FISCAL.NUM_NF = ' +

                               IntToStr(F_Menu.ACBrNFe1.NotasFiscais.Items[0].NFe.Ide.nNF) + ' AND ' +

                               'tbl_EMITENTE.CPF_CNPJ_EMIT = ' +

                               F_Menu.ACBrNFe1.NotasFiscais.Items[0].NFe.Emit.CNPJCPF);

            qryNfiscal.Open;

            qryNfiscal.Edit;

            qryNFiscal.FieldByName('SITUACAO_NF').Value := 5;

            qryNFiscal.FieldByName('NUM_PROT_CANC_NF').Value := FInfoProtocolo;

            qryNFiscal.FieldByName('DH_PROT_CANC_NF').Value := FInfoDataHora;

            qryNFiscal.FieldByName('JUSTIF_CANC_NF').Value := FNFe.FCancelamento.FJustificativa;

            qryNFiscal.FieldByName('XML_CANC_NFE').Value := F_Menu.ACBrNFe1.NotasFiscais.Items[0].XML;

            qryNFiscal.Post;

            MemoStatus.Lines.Add(' ');

            Result := True;

          end;

      end

    else

      begin

        Result := False;

      end;


    if Result = False then

      begin

        MemoStatus.Lines.Add('  ERRO: Não foi possível cancelar a NF-e');

        MemoStatus.Lines.Add('  MOTIVO: ' +

                             IntToStr(F_Menu.ACBrNFe1.WebServices.Cancelamento.cStat) +

                             ' - ' + F_Menu.ACBrNFe1.WebServices.Cancelamento.xMotivo);

        Exit;

      end;

  except

    on E: Exception do

      begin

        MemoStatus.Lines.Add(' ');

        MemoStatus.Lines.Add('  ERRO: Não foi possível cancelar a NF-e');

        MemoStatus.Lines.Add('  MOTIVO: ' + E.Message);

        Disponivel;

        Result := False;

      end;

  end;

end;

Basicamente é esse o procedimento que eu faço.

  • Curtir 1

Peterson de Cerqueira Matos
[email protected]
Vivo: (11) 97197-1474 / Oi: (11) 98059-4055

Link para o comentário
Compartilhar em outros sites

E o resultado final fica mais ou menos assim:


*******************************************************************************************

                               AMBIENTE: 2 - Homologação

*******************************************************************************************


-------------------------------------------------------------------------------------------

 =>  Enviando lote de nota(s) fiscal(is)

-------------------------------------------------------------------------------------------

  25/05/2012 09:34:11  103 - Lote recebido com sucesso

  Recibo nº 351000062026233


-------------------------------------------------------------------------------------------

 =>  Consultando recibo nº 351000062026233

-------------------------------------------------------------------------------------------

  Nota fiscal  Número do protocolo                  Status da NF-e

  -----------  -----------------------------------  ---------------------------------------

  000.000.057  135120003247292 25/05/2012 09:34:11  100 - Autorizado o uso da NF-e


-------------------------------------------------------------------------------------------

 =>  Imprimindo DANFE (1 via de cada)

-------------------------------------------------------------------------------------------

  Nota fiscal  Cliente

  -----------  ----------------------------------------------------------------------------

  000.000.057  NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL

-------------------------------------------------------------------------------------------

  Quantidade de DANFES impressos: 2


-------------------------------------------------------------------------------------------

 =>  Iniciando o envio do e-mail da nota fiscal para seu destinatário

-------------------------------------------------------------------------------------------

  Quantidade de notas fiscais no lote: 1

  Quantidade de notas fiscais autorizadas e/ou canceladas: 1


-------------------------------------------------------------------------------------------

 =>  Enviando e-mail da nota fiscal (Envio nº 1 de 1)

-------------------------------------------------------------------------------------------

  Nota fiscal: 000.000.057  Cliente: NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FI

  Preparando mensagem

  Anexando arquivo XML da NF-e

  Anexando arquivo PDF do DANFE

  Conectando-se ao servidor SMTP: smtp.jbrt.com.br ... => Conectado!

  Enviando e-mail para o destinatário: [email protected]

  E-mail enviado


-------------------------------------------------------------------------------------------

 =>  Fim do envio de e-mails

-------------------------------------------------------------------------------------------

  Quantidade de e-mails enviados: 1


-------------------------------------------------------------------------------------------

 =>  Iniciando o envio do e-mail da fatura para o departamento financeiro

-------------------------------------------------------------------------------------------

  Responsável pelo departamento financeiro: PETERSON

  Quantidade de faturas: 1


-------------------------------------------------------------------------------------------

 =>  Enviando e-mail da fatura (Envio nº 1 de 1)

-------------------------------------------------------------------------------------------

  Fatura: 000.000.057  Sacado: CONFECÇÕES CAEDU LTDA

  Preparando mensagem

  Conectando-se ao servidor SMTP: smtp.jbrt.com.br ... => Conectado!

  Enviando e-mail para: [email protected]

  E-mail enviado


-------------------------------------------------------------------------------------------

 =>  Fim do envio de e-mails

-------------------------------------------------------------------------------------------

  Quantidade de emails enviados: 1

  • Curtir 1

Peterson de Cerqueira Matos
[email protected]
Vivo: (11) 97197-1474 / Oi: (11) 98059-4055

Link para o comentário
Compartilhar em outros sites

Parabéns pela iniciativa, já esclareceu muitas coisas para mim que estava iniciando na questão de enviar mais de uma Nfe!

Porém ficam algumas dúvidas ainda

Quando o retorno é acionado ele atualiza os XML's, em caso por exemplo de em um lote de 5 Nfe 4 foram aceitas e 1 rejeitada, ele vai atualizar corretamente as outras 4?

Pelo que entendi existe um vetor ProtNfe sendo um para cada Nfe e nele está as informações se as Nfe foram aceitas ou não, é isso?

Neste retorno no caso uma das Nfe não tenham sido aceitas ele gerará alguma exception, ou tudo funciona sem excessão?

Outra dúvida, no caso de lote em processamento, vou tentar posteriormente a consulta, nesse caso ao tentar preciso carregar o componente todo de novo igual ao envio para que ele atualize corretamente o XML caso consiga obter o retorno?

Agradeço a todos do fórum na força que tem dado aos iniciantes como eu!

-----------------------------------------------------------

Até a Vitória sempre!

Atenciosamente

Ronnei Peterson

Invictos Tecnologia - www.invictos.com.br

Link para o comentário
Compartilhar em outros sites

Para os que estavam com a mesma dúvida que eu, depois de codificar e testar, segue a rotina

- Preencha o Componente ACBR dando Add, com todas as Nfes que deseja enviar

- Envie o lote, apenas verifique se ele foi aceito, se sim, passe todas as Nfe para Em processamento e guarde os XMLs atuais, pois não é certeza que conseguira resposta logo em seguida

- Codifique um procedimento de consulta do lote, antes de consultar carregue o componente novamente com as Nfs, uma dica é carregar pelo XML ja salvo usando comando ACBrNFe.NotasFiscais.LoadFromFile('caminhodoarquivo');

- Solicite o retorno, se der certo, varra o vetor de protnfe consultando o Cstat (status) de cada Nfe, ele mostrara as que foram aceitas e as que nao foram aceitas, atualize o XML delas no BD, agora com o novo XML ja com a autorizacao

-Limpe o componente

-Carregue somente as aceitas

-Mande imprimir.

Basicamente é isso, se alguem estiver enrolado no código me dá um toque eu ajudo no que for necessario. O código postado anteriormente aqui foi meu norte, foi muito boa a dica!

Obrigado pela ajuda de todos!!

-----------------------------------------------------------

Até a Vitória sempre!

Atenciosamente

Ronnei Peterson

Invictos Tecnologia - www.invictos.com.br

Link para o comentário
Compartilhar em outros sites

O código abaixo foi extraído do código do Peterson, que por sinal foi MUITO útil, obviamente o código abaixo não está completo pois tem as implementações de BD e configuracoes do componente ACBR que eu suprimi, mas pelo menos a logica acredito que ajudara, apesar de nao ser muito diferente da Lógica do Peterson


//Antes de tudo limpe o componente

FComponentesNfe.ACBrNFe.NotasFiscais.Clear;

//adicione todas as Nfes

//While notasdobd... do Begin


With FcomponentesNfe.ACBrNFe.NotasFiscais.add.Nfe do

Begin

//procedimento padrao de inserir os dados no componente e nos produtos

...

//guarde o Xml de cada Nfe ou em um arquivo XML ou no BD

FcomponentesNfe.ACBrNFe.NotasFiscais.Items[FcomponentesNfe.ACBrNFe.NotasFiscais.Count-1].SaveToFile(NumNfe+'temp.xml');

//faca isso para todas as Nfes

End;


End;


//Assine e valide o lote de Nfe que já foi adicionado

FcomponentesNfe.ACBrNFe.NotasFiscais.Assinar;

FcomponentesNfe.ACBrNFe.NotasFiscais.Valida;


//Envie o lote, a variavel Plote é uma variavel com um inteiro que eu uso 

//para os lotes


With FcomponentesNfe.ACBrNFe.WebServices do

Begin

  Try

      Enviar.Lote := Plote;

      Enviar.Executar;



      Recibo_numero    := Enviar.Recibo;

      Recibo_CStat     := IntToStr(Enviar.cStat);

      Recibo_XMotivo   := Enviar.xMotivo;

      Recibo_dhRecbto  := DateTimeToStr(Enviar.dhRecbto);

      if (Enviar.cStat <> 103)//103 lOTE RECEBIDO COM SUCESSO

      Then begin

                     MensagemErro('Não foi possível enviar o lote. Cstat '+Recibo_Cstat+'-'+Recibo_XMotivo);

                     exit;

      End;

  Except

         on e:Exception do

         Begin

                 MensagemErro('Erro ao tentar enviar o lote '+e.message);

                 exit;

         End;


   End;

End;


//se chegou até aqui o lote ja foi enviado

//guarde no BD o numero do recibo que foi enviado e marque as Nfes do lote

//para Enviada em Processamento, eu uso um codigo de situacao "3-Enviada em Processamento"


//chame o procedimento de consulta de lote


//**************exemplo do procedimento de consulta de lote ***************


//selecione no BD todas as Nfes do lote escolhido

//limpe o componente ACBR

FComponentesNfe.ACBrNFe.NotasFiscais.Clear;

//para cada Nfe extraia o XML em um arquivo e carregue o componente adicionando o XML

//isso é semelhante a um ADD, deixando o componente carregado com todos os dados

FcomponentesNfe.ACBrNFe.NotasFiscais.LoadFromFile(Pnfe+'TEMP.XML');


With FcomponentesNfe.ACBrNFe.WebServices do

Begin

     Try

         Retorno.Recibo := Self.nfe.get_reciboenvio;//de posso do recibo de envio posso consultar

         Retorno.Executar;


          if (Retorno.cStat<>104)//104 É lOTE PROCESSADO SE FOR DIFERENTE DISSO GERA UM ERRO

          Then Exception.Create(Retorno.Msg);


          //varrendo os protocolos de retorno 

          for cont := 0 to (Retorno.NFeRetorno.ProtNFe.Count - 1) do

          begin

                        FInfoDataHora := DateTimeToStr(Retorno.NFeRetorno.ProtNFe.Items[cont].dhRecbto);

                        FInfoProtocolo := Retorno.NFeRetorno.ProtNFe.Items[cont].nProt;

                        FInfoStat := IntToStr(Retorno.NFeRetorno.ProtNFe.Items[cont].cStat);

                        FInfoMotivo := Retorno.NFeRetorno.ProtNFe.Items[cont].xMotivo;


                        case Retorno.NFeRetorno.ProtNFe.Items[cont].cStat of

                              100: begin // Autorizada

                                        //neste ponto o XML ja esta na pasta, basta carregar para o BD

                                        //e marcar a Nfe no BD como autorizads

                                       end;

                              else begin

                                      //nao foi aceita, volta a nfe no BD para digitacao


                              end;

                        end; // case F_Menu.ACBrNFe1.WebServices.Retorno.NFeRetorno.ProtNFe.Items[i].cStat



          End;



    Except

         on e:exception do

                   Begin

                        MensagemErro('Erro na consulta do Lote '+#13+E.message);

                        exit;

                   End;

    End;

End;

//imprimindo todas as NFes do lote

//caso alguma delas nao tenha sido autorizada vai imprimir do mesmo jeito

//neste caso o correto era carregar o componente novamente

//somente com as aceitas

//e mandar imprimir

FcomponentesNfe.ACBrNFe.NotasFiscais.Imprimir;


-----------------------------------------------------------

Até a Vitória sempre!

Atenciosamente

Ronnei Peterson

Invictos Tecnologia - www.invictos.com.br

Link para o comentário
Compartilhar em outros sites

Ressuscitando o POST!!

Amigos, terminei a minha implementação porem aconteceu um erro MUITO estranho, preciso de ajudar em um questao:

- Monto o componente ACBR na sequencia Notas 1,2 e 3, propositalmente eu preparei a Nota 2 com um erro, quanto mandei consultar o lote ja enviado destas 3 Notas ele me retornar a nota 3 como errada, e era 2, tentei enviar a nota 3 de novo e ela ja estava aceita, entao fiquei na seguinte duvida

Fiz um laco

for cont := 0 to (Retorno.NFeRetorno.ProtNFe.Count - 1) do

begin

End

Neste laco acima usei o CONT para acessar o numero da NFe daquela posicao do protocolo de retorno, desta forma:

PnumeroNfeAtual:=ACBrNFe.NotasFiscais.Items[cont].NFe.Ide.nNF;

Pelo que entendi o retorno nao veio na mesma ordem nas Nfes enviadas, isso é possivel?

Era como se a segunda posicao do retorno fosse a Nfe 3 a 3º posicao fosse a Nfe 2

Alguem poderia me confirmar essa duvida?

Porque se isso ocorrer entao vou ter que usar a Chave da nfe e extrair o numero da nfe direto da Chave do Retorno, seria isso?

-----------------------------------------------------------

Até a Vitória sempre!

Atenciosamente

Ronnei Peterson

Invictos Tecnologia - www.invictos.com.br

Link para o comentário
Compartilhar em outros sites

Em outro Post o Italo me ajudou, existe um problema na forma como eu estava tratando e pode ser que o peterson161 possa ter problemas também, o retorno da Sefaz "nem sempre" vem na mesma ordem que foi enviada as Nfes, o Italo me contou um caso de Cte que as ctes rejeitadas vieram primeiro, portanto para evitar esse problema que eu tive, a dica enviada pelo italo foi resgatar as informacoes cstat e xmotivo com

NotasFiscais.items[cont].Nfe.procNfe....

e não como estava antes Retorno.NfeRetorno.protNfe.items[cont].

Segue a dica e a correção do inicio do código para quem estava se baseando no meu codigo e do peterson...

obrigado por todos que ajudaram. O link do post que o italo me ajudou foi esse



 for cont := 0 to (Retorno.NFeRetorno.ProtNFe.Count - 1) do

                     begin

                          (*

                          Tive problemas pois o retorno as vezes nao estava voltando na mesma sequencia

                          enviada, porem o componente atualiza os XMls corretamente, entao devo

                          usar NotasFiscais.items[cont].Nfe.procNfe. CAMPOQUEQUERO

                          substituindo o Retorno.NfeRetorno.protNfe.items[cont].campoquequero 

                          *)


                        FInfoDataHora := DateTimeToStr(FcomponentesNfe.ACBrNFe.NotasFiscais.Items[cont].NFe.procNFe.dhRecbto);

                        FInfoProtocolo := FcomponentesNfe.ACBrNFe.NotasFiscais.Items[cont].NFe.procNFe.nProt;

                        FInfoStat := Inttostr(FcomponentesNfe.ACBrNFe.NotasFiscais.Items[cont].NFe.procNFe.cStat);

                        FInfoMotivo := FcomponentesNfe.ACBrNFe.NotasFiscais.Items[cont].NFe.procNFe.xMotivo;

                        FinfoNotaFiscal:=inttostr(FcomponentesNfe.ACBrNFe.NotasFiscais.Items[cont].NFe.Ide.nNf);


-----------------------------------------------------------

Até a Vitória sempre!

Atenciosamente

Ronnei Peterson

Invictos Tecnologia - www.invictos.com.br

Link para o comentário
Compartilhar em outros sites

  • 1 ano depois...

Bom dia..pessoa, peguei carona no topico, que por sinal, é excelente...

Minha rotina de envio é bem parecida com as listadas acima, mas estou tendo problemas de duplicidade de notas, porque o envio da nota tem processamento assincrono, logo, que valores estão utilizando em Tentativas e Intervalo de Tentativas ???

 

Agradeço desde já.

Link para o comentário
Compartilhar em outros sites

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

The popup will be closed in 10 segundos...