Clipper On Line • Ver Tópico - Uso da classesefaz

Uso da classesefaz

Projeto hbNFe (Nota Fiscal Eletronica/Danfe) para [x]Harbour

Moderador: Moderadores

 

Uso da classesefaz

Mensagempor gu_bf » 02 Ago 2016 08:26

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
Nota de Moderação:
Toledo: O presente tópico foi movido da seção CA-Clipper, uma vez que seu conteúdo não tem relação com os objetivos daquela seção, onde só podem constar dúvidas técnicas de programação diretamente relacionadas com o Clipper.
gu_bf
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 13
Data de registro: 01 Ago 2016 07:36
Cidade/Estado: São Paulo
Curtiu: 0 vez
Mens.Curtidas: 1 vez

Uso da classesefaz

Mensagempor JoséQuintas » 02 Ago 2016 17:46

É 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.

/*
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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Uso da classesefaz

Mensagempor JoséQuintas » 02 Ago 2016 17:52

Ou se facilitar, o fonte enxuto:

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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Uso da classesefaz

Mensagempor gu_bf » 05 Ago 2016 20:04

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.
Anexos
NFe35160856782766000120550010000000231000000233-pre.xml
(2.57 KiB) Baixado 193 vezes
gu_bf
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 13
Data de registro: 01 Ago 2016 07:36
Cidade/Estado: São Paulo
Curtiu: 0 vez
Mens.Curtidas: 1 vez

Uso da classesefaz

Mensagempor JoséQuintas » 05 Ago 2016 20:17

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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Uso da classesefaz

Mensagempor JoséQuintas » 05 Ago 2016 20:35

É até bom conferir esse bloco de totais na nota autorizada pelo ACBR.
Se continuar igual o original, pode acusar assinatura inválida.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Uso da classesefaz

Mensagempor gu_bf » 06 Ago 2016 11:32

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
Anexos
Visualizar DANFE.jpg
totais.jpg
inicio.jpg
retorno.jpg
gu_bf
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 13
Data de registro: 01 Ago 2016 07:36
Cidade/Estado: São Paulo
Curtiu: 0 vez
Mens.Curtidas: 1 vez

Uso da classesefaz

Mensagempor JoséQuintas » 06 Ago 2016 13:47

Pergunta:
assinou antes de transmitir?
A que postou é sem assinatura.

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

<?xml version="1.0" encoding="UTF-8"?>
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Uso da classesefaz

Mensagempor gu_bf » 06 Ago 2016 14:53

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.
gu_bf
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 13
Data de registro: 01 Ago 2016 07:36
Cidade/Estado: São Paulo
Curtiu: 0 vez
Mens.Curtidas: 1 vez

Uso da classesefaz

Mensagempor JoséQuintas » 07 Ago 2016 11:06

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".
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Uso da classesefaz

Mensagempor JoséQuintas » 07 Ago 2016 17:35

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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Uso da classesefaz

Mensagempor gu_bf » 10 Ago 2016 19:01

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.
gu_bf
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 13
Data de registro: 01 Ago 2016 07:36
Cidade/Estado: São Paulo
Curtiu: 0 vez
Mens.Curtidas: 1 vez

Uso da classesefaz

Mensagempor JoséQuintas » 10 Ago 2016 21:08

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:

FUNCTION XmlTransform( cTexto )
   RETURN cTexto


Ela não é usada na parte da Sefaz, assim como a ze_spedxmlclass.prg também não.
.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Uso da classesefaz

Mensagempor JoséQuintas » 10 Ago 2016 21:11

Faltou comentar:

Este tópico está no lugar errado, não tem a ver com Clipper.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Uso da classesefaz

Mensagempor gu_bf » 11 Ago 2016 09:46

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.
gu_bf
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 13
Data de registro: 01 Ago 2016 07:36
Cidade/Estado: São Paulo
Curtiu: 0 vez
Mens.Curtidas: 1 vez

Próximo



Retornar para Projeto hbNFe

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 5 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro