Página 1 de 6

Uso da classesefaz

Enviado: 02 Ago 2016 08:26
por gu_bf
Bom dia,
Alguem saberia me dizer se a classesefaz está apta para uso em produção?
Alguem tem um exemplo de autorização de NFe?
Obrigado.

Gustavo

Uso da classesefaz

Enviado: 02 Ago 2016 17:46
por JoséQuintas
É como sempre procuro chamar a atenção:
É tudo padrão, mas infelizmente só na teoria.
Precisa testar com sua UF, se vai precisar algum ajuste.

Este é meu fonte atual, aguardando que o cliente faça mais testes.
Por ser teste, tem muita gravação de temporário por precaução.

Código: Selecionar todos

/*
P0600NFE - ROTINAS DO SISTEMA
2012.06.27.0000 - José Quintas

...
2015.10.21.1940 - Ambiente homologação
2016.06.17.0900 - Utiliza hora emissão/saída gravada
2016.06.28.0230 - Ajuste
2016.07.03.2130 - Base de dados local
2016.07.18.1115 - Processa NFE
2016.07.26.1800 - Ajustes
*/

#include "jpa.ch"
#include "hbthread.ch"

FUNCTION P0600NFE()

   LOCAL nSelect, cNfeTxt, cNfeXml, oSefaz := SefazClass():New(), cStatusAssinatura
   MEMVAR m_Prog
   PRIVATE m_Prog := "P0600NFE"

   DirMake( "NFE\TMP" )
   nSelect := Select()

   IF .NOT. Encontra( jppedi->pdPedido, "jpnota", "pedido" )
      MsgStop( "Inválido! Não tem nota emitida para esse pedido" )
      RETURN .F.
   ENDIF
   IF jpnota->nfDatEmi != Date()
      MsgStop( "Inválido! Nota fiscal não foi emitida hoje" )
      RETURN .F.
   ENDIF
   IF jpnota->nfStatus == "C"
      MsgStop( "Inválido! Nota fiscal cancelada, não há o que fazer" )
      RETURN .F.
   ENDIF
   IF jpnota->nfPedido != jppedi->pdPedido
      MsgStop( "Erro interno! Posicionado em NF diferente do pedido atual" )
      RETURN .F.
   ENDIF
   wSave()
   Cls()
   SayScroll( "Gerando TXT e XML" )
   NfeToXml( @cNfeTxt, @cNfeXml, "1", Date(), Time(), , , "1" )
   SayScroll( "Gravando TXT" )
   hb_MemoWrit( "NFE\TMP\NF" + jpnota->nfNotFis + ".txt", cNfeTxt )
   SayScroll( "Gravando XML" )
   hb_MemoWrit( "NFE\TMP\NF" + jpnota->nfNotFis + "-01-SemAssinatura.xml", cNfeXml )
   SayScroll( "Assinando" )
   cStatusAssinatura := AssinaXml( @cNfeXml, AppEmpresaApelido() )
   IF cStatusAssinatura != "OK"
      MsgExclamation( "Problema na assinatura " + cStatusAssinatura )
      RETURN .F.
   ENDIF
   SayScroll( "Gravando Assinado" )
   hb_MemoWrit( "NFE\TMP\NF" + jpnota->nfNotFis + "-02-Assinado.xml", cNfeXml )
   oSefaz:cCertificado := NomeCertificado( AppEmpresaApelido() )
   SayScroll( "Transmitindo Sefaz" )
   oSefaz:NfeLoteEnvia( cNfeXml )
   SayScroll( "Gravando resultado" )
   hb_MemoWrit( "NFE\TMP\NF" + jpnota->nfNotFis + "-03-Recibo.xml", oSefaz:cXmlRecibo )
   hb_MemoWrit( "NFE\TMP\NF" + jpnota->nfNotFis + "-04-Protocolo.xml", oSefaz:cXmlProtocolo )
   IF oSefaz:cStatus == "101"
      hb_MemoWrit( "NFE\NF" + jpnota->nfNotFis + "-05-Autorizado.xml", oSefaz:cXmlAutorizado )
      RUN ( "start d:\unidanfe\unidanfe.exe NFE\NF" + jpnota->nfNotFis + "-Autorizado.xml" )
      MsgExclamation( "Nota autorizada" )
   ELSEIF oSefaz:cStatus $ "202,302"
      hb_MemoWrit( "NFE\NF" + jpnota->nfNotFis + "05-Denegado.xml" )
      RUN ( "Start d:\unidanfe\unidanfe.exe NFE\NF" + jpnota->nfNotFis + "-Autorizado.xml" )
      MsgExclamation( "Nota denegada" )
   ELSE
      hb_MemoWrit( "NFE\TMP\NF" + jpnota->nfNotFis + "-05-Erro.xml", oSefaz:cXmlProtocolo )
      MsgExclamation( "Erro " + oSefaz:cXmlProtocolo )
   ENDIF
   SELECT ( nSelect )
   wRestore()

   RETURN NIL

Como dá pra ver aí, basicamente é:
- gerar o XML
- assinar
- transmitir
- e conforme o retorno, tá pronto.

Uso da classesefaz

Enviado: 02 Ago 2016 17:52
por JoséQuintas
Ou se facilitar, o fonte enxuto:

Código: Selecionar todos

FUNCTION P0600NFE()

 LOCAL cNfeXml, oSefaz := SefazClass():New()

cNfeXml := "seu xml da nota"
IF AssinaXml( @cNfeXml, "nome do certificado" ) != "OK"
   MsgExclamation( "Problema na assinatura " + cStatusAssinatura )
   RETURN .F.
 ENDIF
 oSefaz:cCertificado := "nome do certificado"
 oSefaz:NfeLoteEnvia( cNfeXml )
 IF oSefaz:cStatus == "101"
   hb_MemoWrit( "NFE\NF" + jpnota->nfNotFis + "-05-Autorizado.xml", oSefaz:cXmlAutorizado )
 ELSEIF oSefaz:cStatus $ "202,302"
   hb_MemoWrit( "NFE\NF" + jpnota->nfNotFis + "05-Denegado.xml" )
 ELSE
   MsgExclamation( "Erro " + oSefaz:cXmlProtocolo )
 ENDIF
 RETURN NIL

Uso da classesefaz

Enviado: 05 Ago 2016 20:04
por gu_bf
Boa noite
Obrigado pela dica Jose Quintas mas não consegui validar o xml no sefaz o erro devolvido é (225-Rejeição: Falha no Schema XML do lote NF-e).
Este mesmo arquivo am anexo, é enviado pelo acbr monitor é autorizado sem problema.
Mais alguma dica?
Obrigado
Gustavo.

Uso da classesefaz

Enviado: 05 Ago 2016 20:17
por JoséQuintas
Você caiu no mesmo problema que tive hoje.

O xml tem erro, tá faltando os totais interestaduais que inventaram em julho.

Os esquemas da Sefaz estão desatualizados, pra não dizer ERRADOS.

Nenhum lugar acusa erro, porque usam os arquivos da Sefaz pra validar.

Tanto o emissor gratuito, quanto o ACBR incluem os campos que faltam.

Então na prática não é esse XML que é enviado, é outro corrigido.
O lado ruim disso, é que você pensa que está certo, mas está ERRADO, acaba desaprendendo a fazer o XML.
(Apesar que chega uma hora que cansa, parece muito trabalho pra pouca coisa... rs)

Como tive o problema hoje, tá na mão.
Abaixo antes e depois de passar pelo emissor gratuito. (o meu que testei hoje).

xmlnfe.png

Uso da classesefaz

Enviado: 05 Ago 2016 20:35
por JoséQuintas
É até bom conferir esse bloco de totais na nota autorizada pelo ACBR.
Se continuar igual o original, pode acusar assinatura inválida.

Uso da classesefaz

Enviado: 06 Ago 2016 11:32
por gu_bf
Bom dia
Isso é muito estranho, eu segui o que me informou, primeiro adicionei as tres tags e resultado foi alterado o codigo do erro de 225 para 215 -Falha no esquema.
Fiz teste com acbr novamente com mesmo xml, ele removeu os 3 novas tags e autorizou o xml.
Voce tem mais alguma dica?
Obrigado
Gustavo

Uso da classesefaz

Enviado: 06 Ago 2016 13:47
por JoséQuintas
Pergunta:
assinou antes de transmitir?
A que postou é sem assinatura.

A outra única diferença da autorizada no emissor é na parte inicial.

Código: Selecionar todos

<?xml version="1.0" encoding="UTF-8"?>

Uso da classesefaz

Enviado: 06 Ago 2016 14:53
por gu_bf
Ola
O xml que postei está sem assinatura porque eu separei antes de qquer alteração mas, estou usando de acordo com sua dica:

SayScroll( "Assinando" )

cNfeXml := MemoRead(hb_DirBase() + "NFe35160856782766000120550010000000261000000260-pre.XML")

cStatusAssinatura := AssinaXml( @cNfeXml, cCert )
IF cStatusAssinatura != "OK"
MsgExclamation( "Problema na assinatura " + cStatusAssinatura )
RETURN .F.
ENDIF

SayScroll( "Gravando Assinado" )

hb_MemoWrit( cNfeXml )

oSefaz:cCertificado := cCert

SayScroll( "Transmitindo Sefaz" )

//oSefaz:NfeLoteEnvia( cNfeXml )
oSefaz:NFeLoteEnvia( cNfeXml, cLote, "SP", cCert, "2" ) // , "0" )

SayScroll( "Gravando resultado" )

hb_MemoWrit( oSefaz:cXmlRecibo )
hb_MemoWrit( oSefaz:cXmlProtocolo )

IF oSefaz:cStatus == "101"
hb_MemoWrit( oSefaz:cXmlAutorizado )
//RUN ( "start d:\unidanfe\unidanfe.exe NFE\NF" + jpnota->nfNotFis + "-Autorizado.xml" )
MsgExclamation( "Nota autorizada" )
ELSEIF oSefaz:cStatus $ "202,302"
hb_MemoWrit( "05-Denegado.xml" )
//RUN ( "Start d:\unidanfe\unidanfe.exe NFE\NF" + jpnota->nfNotFis + "-Autorizado.xml" )
MsgExclamation( "Nota denegada" )
ELSE
hb_MemoWrit( /*"NFE\TMP\NF" + jpnota->nfNotFis + "-05-Erro.xml",*/ oSefaz:cXmlProtocolo )
MsgExclamation( "Erro " + oSefaz:cXmlProtocolo )
ENDIF
RETURN NIL

Gustavo.

Uso da classesefaz

Enviado: 07 Ago 2016 11:06
por JoséQuintas
Hoje a Sefaz está fora do ar, então não dá pra fazer testes.

Na rotina que postei esqueci do número do lote.
Já alterei a classe pra usar um número default, quando não informado número de lote.

Agora aguardando a Sefaz voltar ao normal pra fazer mais testes.

Também aproveitei pra acertar o texto de retorno nessa situação, porque antes só retornava o texto "erro".

Uso da classesefaz

Enviado: 07 Ago 2016 17:35
por JoséQuintas
Explicando:

A classe funcionava antes, tudo era chamado isoladamente.
As últimas mudanças foram pra fazer mais automático, tipo já enviar o lote e já consultar o recibo e já gerar o autorizado. Três operações de uma vez.

O erro no schemma não é no XML da nota, é no XML de consultar recibo.
Nessas mudanças cometi um erro, e a consulta estava indo sem número de recibo.
A falha de schemma era no XML de consultar recibo, e não no XML da nota.

Por serem duas operações em seguida, o erro parecia na primeira operação, mas era na segunda.

Estou vendo que precisa melhorar muito a parte de mensagens, afinal, até eu que criei a classe me perdi nisso.

Uso da classesefaz

Enviado: 10 Ago 2016 19:01
por gu_bf
Boa noite
Para informação, no teste que fiz agora a na atualização do CVS, consegui a validar NFe no sefaz.
Apenas tive que incluir ( #include "hbwin.ch") no fonte ze_xmlfun.prg e tambem acrescentar uma função que acusou falta
( XMLTRANSFORM() ).
Obrigado
Gustavo.

Uso da classesefaz

Enviado: 10 Ago 2016 21:08
por JoséQuintas
EQuando coloca hbwin.hbc já acrescenta tudo que precisa.
Vou acrescentar #require "hbwin.hbc" pra garantir.

XmlTransform() , devo ter esquecido de salvar no github.
Serve este tapa-buraco:

Código: Selecionar todos

FUNCTION XmlTransform( cTexto )
   RETURN cTexto
Ela não é usada na parte da Sefaz, assim como a ze_spedxmlclass.prg também não.
.

Uso da classesefaz

Enviado: 10 Ago 2016 21:11
por JoséQuintas
Faltou comentar:

Este tópico está no lugar errado, não tem a ver com Clipper.

Uso da classesefaz

Enviado: 11 Ago 2016 09:46
por gu_bf
Bom dia,
Sr moderador, me desculpe por este inconveniente de colocar mensagem no grupo errado.
Tomarei cuidado para que não ocorra no futuro.
Obrigado.
Gustavo.