ZeusAutomacao / DFe.NET

Biblioteca para Geração de NFe(2.0, 3.10 e 4.0) e NFCe(3.10 e 4.0) e consumo dos serviços necessários à sua manutenção, conforme descritos em http://www.nfe.fazenda.gov.br/portal/principal.aspx
GNU Lesser General Public License v2.1
755 stars 479 forks source link

Duvida emissão NFe #627

Closed AlanJovita closed 6 years ago

AlanJovita commented 6 years ago

Boa tarde Pessoal, tudo certo ?

estou desenvolvendo a parte de NFe de meu sistema e o projeto disponibilizado esta me ajudando muito, porem ainda tenho algumas duvidas, acredito que de fácil solução.

<retConsSitNFe versao="3.10" xmlns="http://www.portalfiscal.inf.br/nfe"><tpAmb>1</tpAmb><verAplic>SP_NFE_PL_008i2</verAplic><cStat>217</cStat><xMotivo>Rejeição: NF-e não consta na base de dados da SEFAZ</xMotivo><cUF>35</cUF><chNFe>35180108299041000132550010000001631000012342</chNFe></retConsSitNFe>

consultei os tipos de ambientes e tanto de envio quanto consulta e estão como "Produção" não encontro onde estou errando. a disponibilização do antigo material de procedimentos será de grande ajuda.

Desde já, obrigado a todos!

robertorp commented 6 years ago

Não foi autorizada, tente hoje novamente para verse foi autorizada. As vezes a sefaz demora a autorizar, mas não e o caso de SP geralmente eles são rápido.

AlanJovita commented 6 years ago

Boa tarde @robertorp

O procedimento de envio da nota estou utilizando o projeto de teste adaptado para minha aplicação conforme código abaixo. Gostaria de saber o exato momento dentro dessa rotina que faz a autorização da NFe e se estou fazendo da forma correta, pois estou batendo cabeça aqui e talvez esteja chamando as funções em ordem errada.

1º passo (Gero a NFe conforme aplicativo de teste, Assino e faço envio)

_nfe.Assina() Dim servicoNFe = New ServicosNFe(_configuracoes.CfgServico) 'Envia a mensagem compactada para a SEFAZ Dim retornoEnvio = servicoNFe.NFeAutorizacao(Convert.ToInt32(lote), IndicadorSincronizacao.Assincrono, New List(Of NFe.Classes.NFe)() From {_nfe}, False)

2º feito o envio recebo a mensagem abaixo

<retEnviNFe versao="3.10" xmlns="http://www.portalfiscal.inf.br/nfe"><tpAmb>1</tpAmb><verAplic>SP_NFE_PL_008i2</verAplic><cStat>103</cStat><xMotivo>Lote recebido com sucesso</xMotivo><cUF>35</cUF><dhRecbto>2018-01-24T11:34:44-02:00</dhRecbto><infRec><nRec>351004535316959</nRec><tMed>1</tMed></infRec></retEnviNFe>

3º localizo o XML gerado para gravar o protocolo utilizando a função abaixo

`Private Sub BtnAdicionaNfeproc_Click(sender As Object, e As RoutedEventArgs) Try Dim arquivoXml = Funcoes.BuscarArquivoXml()

        If String.IsNullOrWhiteSpace(arquivoXml) Then
            Return
        End If

        Dim nfe = New NFe.Classes.NFe()
        nfe.CarregarDeArquivoXml(arquivoXml)
        Dim chave = nfe.infNFe.Id.Substring(3)

        If String.IsNullOrEmpty(chave) Then
            Throw New Exception("A Chave da NFe não foi encontrada no arquivo!")
        End If
        If chave.Length <> 44 Then
            Throw New Exception("Chave deve conter 44 caracteres!")
        End If

        Dim servicoNFe = New ServicosNFe(_configuracoes.CfgServico)
        Dim retornoConsulta = servicoNFe.NfeConsultaProtocolo(chave)
        TrataRetorno(retornoConsulta)

        Dim nfeproc = New nfeProc() With {
                .NFe = nfe,
                .protNFe = retornoConsulta.Retorno.protNFe,
                .versao = retornoConsulta.Retorno.versao
        }
        If nfeproc.protNFe IsNot Nothing Then
            Dim novoArquivo = Path.GetDirectoryName(arquivoXml) + "\" + nfeproc.protNFe.infProt.chNFe + "-procNfe.xml"
            FuncoesXml.ClasseParaArquivoXml(nfeproc, novoArquivo)
            Funcoes.Mensagem("Arquivo salvo em " + novoArquivo, "Atenção", MessageBoxButton.OK)
        End If
    Catch ex As ComunicacaoException
        Funcoes.Mensagem(ex.Message, "Erro", MessageBoxButton.OK)
    Catch ex As ValidacaoSchemaException
        Funcoes.Mensagem(ex.Message, "Erro", MessageBoxButton.OK)
    Catch ex As Exception
        If Not String.IsNullOrEmpty(ex.Message) Then
            Funcoes.Mensagem(ex.Message, "Erro", MessageBoxButton.OK)
        End If
    End Try
End Sub`

Neste momento que tenho o retorno da SEFAZ de Rejeição por inexistência.

Desde já grato pela ajuda!

robertorp commented 6 years ago

Em lugar nem um você esta autorizando a nota nesse código ai. Dim servicoNFe = New ServicosNFe(_configuracoes.CfgServico) Dim retornoConsulta = servicoNFe.NfeConsultaProtocolo(chave)

veja que você faz uma consulta protocolo pela chave mas a mesma nem se quer foi autorizada ainda. O método para autorizar a nota e servicoNFe.NFeAutorizacao

Enfim recomendo que você estude melhor o appTeste.

edit: No código que me mandou não tem autorização hehe. na explicação sim

edit2: após o recebimento do recibo, tente fazer uma consulta Recibo e passa o recibo no lugar do consulta protocolo, veja oque retorna se deu certo se deu algum erro no lote, bom enfim..

AlanJovita commented 6 years ago

@robertorp Obrigado pelo retorno,

O meu código está sim fazendo a autorização na linha Dim retornoEnvio = servicoNFe.NFeAutorizacao(Convert.ToInt32(lote), IndicadorSincronizacao.Assincrono, New List(Of NFe.Classes.NFe)() From {_nfe}, False) acontece que ele ficou junto na mesma linha hehe

o meu treinamento e duvida está acontecendo tanto no AppTeste quanto na minha aplicação! nos dois tenho o mesmo problema.

o retorno sempre é de "lote enviado com sucesso".

robertorp commented 6 years ago

Achei que era somente o ultimo trecho de código mas pelo visto tem mais so que não esta ele completo lá. Mande o código completo de autorização, incluindo a linha que autoriza a nf-e.

nessa imagem não tem seu código que autoriza que quis dizer print

AlanJovita commented 6 years ago

@robertorp òtimo amigo, vou te enviar abaixo o código que estou seguindo para realizar esta autorização NFe. Lembrando que o código é uma conversão em VB.NET do AppTeste exatamente o mesmo.

Após carregar as configurações do certificado e webservice da receita eu chamo esse procedimento que cria uma NFe e Envia (igual ao AppTeste).

` Public Sub EmitirNFe()

    Try

Region "Cria e Envia NFe"

        Dim numero = InputBox("Criar e Enviar NFe", "Número da Nota:")
        If String.IsNullOrEmpty(numero) Then
            Throw New Exception("O Número deve ser informado!")
        End If

        Dim lote = InputBox("Criar e Enviar NFe", "Id do Lote:")
        If String.IsNullOrEmpty(lote) Then
            Throw New Exception("A Id do lote deve ser informada!")
        End If

        _nfe = GetNf(Convert.ToInt32(numero), _configuracoes.CfgServico.ModeloDocumento, _configuracoes.CfgServico.VersaoNFeAutorizacao)
        _nfe.Assina()
        'não precisa validar aqui, pois o lote será validado em ServicosNFe.NFeAutorizacao
        If _nfe.infNFe.ide.[mod] = ModeloDocumento.NFCe Then
            'A URL do QR-Code deve ser gerada em um objeto nfe já assinado, pois na URL vai o DigestValue que é gerado por ocasião da assinatura
            'Define a URL do QR-Code.    
            _nfe.infNFeSupl = New infNFeSupl() With {
                    .qrCode = _nfe.infNFeSupl.ObterUrlQrCode(_nfe, _configuracoes.ConfiguracaoCsc.CIdToken, _configuracoes.ConfiguracaoCsc.Csc)
            }
        End If

        Dim servicoNFe = New ServicosNFe(_configuracoes.CfgServico)
        'Envia a mensagem compactada para a SEFAZ
        Dim retornoEnvio = servicoNFe.NFeAutorizacao(Convert.ToInt32(lote), IndicadorSincronizacao.Assincrono, New List(Of NFe.Classes.NFe)() From {_nfe}, False)
        'Para consumir o serviço de forma síncrona, use a linha abaixo:
        'var retornoEnvio = servicoNFe.NFeAutorizacao(Convert.ToInt32(lote), IndicadorSincronizacao.Sincrono, new List<Classes.NFe> { _nfe }, true/*Envia a mensagem compactada para a SEFAZ*/);

End Region

        TrataRetorno(retornoEnvio)

    Catch ex As ComunicacaoException
        'Faça o tratamento de contingência OffLine aqui.
        Funcoes.Mensagem(ex.Message, "Erro", MessageBoxButton.OK)
    Catch ex As ValidacaoSchemaException
        Funcoes.Mensagem(ex.Message, "Erro", MessageBoxButton.OK)
    Catch ex As Exception
        If Not String.IsNullOrEmpty(ex.Message) Then
            Funcoes.Mensagem(ex.Message, "Erro", MessageBoxButton.OK)
        End If
    End Try
End Sub`

Depois de feito a rotina na pasta de saida tenho dois arquivos XML, um com o XML propriamente dito sem o protocolo e o outro com os dados de retorno do envio de lote.

image

Retorno XML lote.

<retEnviNFe versao="3.10" xmlns="http://www.portalfiscal.inf.br/nfe"><tpAmb>1</tpAmb><verAplic>SP_NFE_PL_008i2</verAplic><cStat>103</cStat><xMotivo>Lote recebido com sucesso</xMotivo><cUF>35</cUF><dhRecbto>2018-01-24T11:52:15-02:00</dhRecbto><infRec><nRec>351004535373904</nRec><tMed>1</tMed></infRec></retEnviNFe>

Até aqui tudo bem, no meu pensamento o que devo fazer agora é protocolar o arquivo XML gerado para se ter realmente uma NFe válida! então eu chamo o seguinte procedimento para realizar tal tarefa.

` Private Sub BtnAdicionaNfeproc_Click(sender As Object, e As RoutedEventArgs) Try Dim arquivoXml = Funcoes.BuscarArquivoXml()

        If String.IsNullOrWhiteSpace(arquivoXml) Then
            Return
        End If

        Dim nfe = New NFe.Classes.NFe()
        nfe.CarregarDeArquivoXml(arquivoXml)
        Dim chave = nfe.infNFe.Id.Substring(3)

        If String.IsNullOrEmpty(chave) Then
            Throw New Exception("A Chave da NFe não foi encontrada no arquivo!")
        End If
        If chave.Length <> 44 Then
            Throw New Exception("Chave deve conter 44 caracteres!")
        End If

        Dim servicoNFe = New ServicosNFe(_configuracoes.CfgServico)
        Dim retornoConsulta = servicoNFe.NfeConsultaProtocolo(chave)
        TrataRetorno(retornoConsulta)

        Dim nfeproc = New nfeProc() With {
                .NFe = nfe,
                .protNFe = retornoConsulta.Retorno.protNFe,
                .versao = retornoConsulta.Retorno.versao
        }
        If nfeproc.protNFe IsNot Nothing Then
            Dim novoArquivo = Path.GetDirectoryName(arquivoXml) + "\" + nfeproc.protNFe.infProt.chNFe + "-procNfe.xml"
            FuncoesXml.ClasseParaArquivoXml(nfeproc, novoArquivo)
            Funcoes.Mensagem("Arquivo salvo em " + novoArquivo, "Atenção", MessageBoxButton.OK)
        End If
    Catch ex As ComunicacaoException
        Funcoes.Mensagem(ex.Message, "Erro", MessageBoxButton.OK)
    Catch ex As ValidacaoSchemaException
        Funcoes.Mensagem(ex.Message, "Erro", MessageBoxButton.OK)
    Catch ex As Exception
        If Not String.IsNullOrEmpty(ex.Message) Then
            Funcoes.Mensagem(ex.Message, "Erro", MessageBoxButton.OK)
        End If
    End Try
End Sub`

Pelo que analisei, esse ultimo passo deixa o XML já válido e protocolado, porem o retorno é de Rejeição.

robertorp commented 6 years ago

Toda vez que você fizer uma consulta protocolo e a chave que você enviou para a consulta protocolo não existir na base de dados da Sefaz, sempre vai a ver a rejeição que você mandou.

Logo então o ideal para você saber se a Nota Fiscal Eletrônica realmente foi autorizada você deve fazer uma consulta recibo pegando a seguinte informação o conteúdo da tag <nRec>351004535373904</nRec>

e executar o método var servicoNFe = new ServicosNFe(_configuracoes.CfgServico); var retornoRecibo = servicoNFe.NFeRetAutorizacao("351004535373904");

somente assim iremos saber o real motivo da rejeição.

Ou.. você pode executar o método de autorização como Sincrono

Dim retornoEnvio = servicoNFe.NFeAutorizacao(Convert.ToInt32(lote), IndicadorSincronizacao.Sincrono, New List(Of NFe.Classes.NFe)() From {_nfe}, False)

Veja o segundo parametro esta sincrono.. assim você não precisa consultar o Lote pelo recibo e fica sabendo na hora se ta autorizada ou rejeitada. Mas se utilizar Sincrono so pode enviar uma unica nota por vez.

edit/importante: lote processado não quer dizer que a nota foi autorizada

AlanJovita commented 6 years ago

@robertorp Matou a charada, agora consegui ver o erro que estava acontecendo, e um erro bem bobo por sinal hehe

<retConsReciNFe versao="3.10" xmlns="http://www.portalfiscal.inf.br/nfe"><tpAmb>1</tpAmb><verAplic>SP_NFE_PL_008i2</verAplic><nRec>351004535373904</nRec><cStat>104</cStat><xMotivo>Lote processado</xMotivo><cUF>35</cUF><protNFe versao="3.10"><infProt><tpAmb>1</tpAmb><verAplic>SP_NFE_PL_008i2</verAplic><chNFe>35180108299041000132550010000001631000012342</chNFe><dhRecbto>2018-01-24T11:52:15-02:00</dhRecbto><cStat>275</cStat><xMotivo>Rejeição: Código Município do Destinatário: difere da UF do Destinatário</xMotivo></infProt></protNFe></retConsReciNFe>

Muito obrigado pela ajuda, foi fundamental para eu ganhar o dia de serviço!

só aproveitando, esse componente trabalha com a versão 3.10, vcs tem planos para a 4.0 em andamento?

Abraço

robertorp commented 6 years ago

Planos para a versão 4.0 e que vai sair. E sim o componente suportara a versão 4.0

Qualquer duvida crie a issue ai. Se quiser também podemos trocar ideias as vezes pelo skype. robertoalves18@hotmail.com