Uso da classesefaz

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

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Uso da classesefaz

Mensagem por JoséQuintas »

Autorizei nota hoje, com a rotina acima.
Parece piada, mas minha rotina estava errada.

Código: Selecionar todos

   IF oSefaz:cStatus == "101"
      hb_MemoWrit( "NFE\NF" + jpnota->nfNotFis + "-06-Autorizado.xml", oSefaz:cXmlAutorizado )
      RUN ( "start d:\unidanfe\unidanfe.exe NFE\NF" + jpnota->nfNotFis + "-06-Autorizado.xml" )
Pois é... errei na parte mais simples.... rs

Mas foi só olhar o XML de protocolo .
Aquele gravado como NFE\TMP\NF000094246-05-Protocolo.xml
É exatamente a resposta da Fazenda.
protocolo.png
Classe errada?
Não.
Eu é que errei... rs
Nota autorizada é status 100, e não 101.

É o que dá fazer de cabeça, sem conferir manual.... rs

Nota:
Os temporários acabam sendo interessantes nessa situação, quando algo dá errado.
O autorizado oficial estava gerado (a rotina acima também gravou).
Foi só a checagem do status que errei mesmo, e apresentei a mensagem que não tinha sido autorizada.... rs
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Uso da classesefaz

Mensagem por JoséQuintas »

Aproveitando...

A nota autorizada não é nada mais além da nota enviada, junto com o protocolo que está nessa resposta.
Só somar as strings: "<infNFe ...>" + nota enviada + protocolo + "</infNFe>"

A coisa toda é simples assim.

A complicação dos componentes pra NFe é converter TXT, converter INI, "conversar" com seu aplicativo, etc.

A classe apenas envia, pega resposta, nada extraordinário, e tudo através de strings diretas, sem arquivo intermediário.
A gravação de temporário, se quiser, é boa pra conferência.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Uso da classesefaz

Mensagem por JoséQuintas »

A rotina atualizada:

Código: Selecionar todos

#include "jpa.ch"

FUNCTION P0600NFE()

   LOCAL nSelect, cNfeTxt, cNfeXml, oSefaz := SefazClass():New(), cStatusAssinatura, cComando

   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
   Mensagem( "Autorizando nota" )
   NFDbfToXml( @cNfeTxt, @cNfeXml, "1", Date(), Time(), , "1" )
   cStatusAssinatura := AssinaXml( @cNfeXml, AppEmpresaApelido() )
   IF cStatusAssinatura != "OK"
      hb_MemoWrit( hb_cwd() + "NFE\TMP\" + jpnota->nfNotFis + "-01-SemAssinatura.xml", cNfeXml )
      hb_MemoWrit( hb_cwd() + "NFE\TMP\" + jpnota->nfNotFis + "-02-Assinado.xml", cNfeXml )
      MsgExclamation( "Problema na assinatura " + cStatusAssinatura )
      RETURN .F.
   ENDIF
   oSefaz:cCertificado := NomeCertificado( AppEmpresaApelido() )
   oSefaz:cAmbiente    := "1"
   oSefaz:NfeLoteEnvia( cNfeXml )
   IF oSefaz:cStatus $ "100,101,202,302"
      hb_MemoWrit( hb_cwd() + "IMPORTA\" + jpnota->nfNotFis + "-" + oSefaz:cStatus + "-Autorizado.xml", oSefaz:cXmlAutorizado )
      hb_MemoWrit( hb_cwd() + "NFE\TMP\" + jpnota->nfNotFis + "-" + oSefaz:cStatus + "-Autorizado.xml", oSefaz:cXmlAutorizado )
      cComando :=  [arquivo="] + hb_cwd() + [NFE\TMP\] + jpnota->nfNotFis + [-] + oSefaz:cStatus + [-Autorizado.xml"]
      IF File( "d:\unidanfe\" + SoNumeros( jpempre->emCnpj ) + ".jpg" )
         cComando += [ logotipo="d:\unidanfe\] + SoNumeros( jpempre->emCnpj ) + [.jpg"]
      ENDIF
      cComando += [ visualizar=1]
      wapi_ShellExecute( NIL, NIL, "d:\unidanfe\unidanfe.exe", cComando, SW_SHOWNORMAL )
      MsgExclamation( iif( oSefaz:cStatus == "100", "Nota autorizada", "Nota Denegada" ) )
   ELSE
      hb_MemoWrit( hb_cwd() + "NFE\"     + jpnota->nfNotFis + ".txt",                  cNfeTxt )
      hb_MemoWrit( hb_cwd() + "NFE\TMP\" + jpnota->nfNotFis + "-01-SemAssinatura.xml", cNfeXml )
      hb_MemoWrit( hb_cwd() + "NFE\TMP\" + jpnota->nfNotFis + "-02-Assinado.xml",      cNfeXml )
      hb_MemoWrit( hb_cwd() + "NFE\TMP\" + jpnota->nfNotFis + "-03-Envelope.xml",      oSefaz:cXmlSoap )
      hb_MemoWrit( hb_cwd() + "NFE\TMP\" + jpnota->nfNotFis + "-04-Recibo.xml",        oSefaz:cXmlRecibo )
      hb_MemoWrit( hb_cwd() + "NFE\TMP\" + jpnota->nfNotFis + "-05-Protocolo.xml",     oSefaz:cXmlProtocolo )
      hb_MemoWrit( hb_cwd() + "NFE\TMP\" + jpnota->nfNotFis + "-06-Erro.xml",          oSefaz:cXmlRetorno )
      hb_MemoWrit( hb_cwd() + "NFE\TMP\" + jpnota->nfNotFis + "-07-Autorizado.xml",    oSefaz:cXmlAutorizado )
      MsgExclamation( "Erro desconhecido " + Pad( oSefaz:cXmlProtocolo, 1000 ) )
   ENDIF
   SELECT ( nSelect )

   RETURN NIL
Por enquanto acertando a impressora padrão pro Unidanfe (não havia nenhuma instalada e o unidanfe reclamou)

E surgiu outra necessidade:
Pelo emissor da Fazenda, eram gerados XMLs e PDFs pra envio ao armazém externo, pra separação e posterior retirada de mercadoria.
Com o detalhe de que o emissor gera um PDF único contendo todas as notas.
Por enquanto ainda resolvendo a impressora padrão.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
gu_bf
Usuário Nível 1
Usuário Nível 1
Mensagens: 13
Registrado em: 01 Ago 2016 07:36
Localização: São Paulo

Uso da classesefaz

Mensagem por gu_bf »

Boa tarde,
Desculpe pela demora em responder mas, conformado o funcionamento da rotina de validação.
Comecei a testar cancelamento da NFe que no momento é que mais me importa então, encontrei um pequeno problema no código, mais especificamente
no method NFeEventoCancela na linha 561 tem a notação ( versão "1.00" ) que alterei para ( versao="1.00" ) e na linha 562
que está assim a declaração do id ( Id="ID110111" ) e eu alterei para ( Id="ID110111] ). Depois disso esse method passou sem problema, agora
está dando um erro na assinatura que estou verificando. Na imagem em anexo é ilustrado o problema que encontrei ate agora.
Obrigado
Gustavo
Anexos
cancelaNFE.jpg
gu_bf
Usuário Nível 1
Usuário Nível 1
Mensagens: 13
Registrado em: 01 Ago 2016 07:36
Localização: São Paulo

Uso da classesefaz

Mensagem por gu_bf »

Depois de regularizado o erro acima, o processo de cancelamento de NFe foi concluído sem maiores problemas como pode perceber pela imagem em anexo de consulta no SEFAZ SP.
e continuam os testes mas já está funcional pelo menos na base que preciso.
Obrigado.
Gustavo,
Anexos
cancelaNFE2.jpg
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Uso da classesefaz

Mensagem por JoséQuintas »

Valeu.

Me confundi um pouco na hora de entender o post, mas confirmei e corrigi.

No primeiro faltou o sinal de igual.

Código: Selecionar todos

versao "1.00"

versao="1.00"
E no segundo, era pra fechar com colchete, e estava fechado com aspas.
Não deu erro de compilação, porque o compilador considerou string tudo até o próximo fecha colchete.

Código: Selecionar todos

[<infEvento Id="ID110111]

[<infEvento Id="ID110111"
E isso causou erro de assinatura, porque a assinatura usa o ID do documento que estava errado.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
gu_bf
Usuário Nível 1
Usuário Nível 1
Mensagens: 13
Registrado em: 01 Ago 2016 07:36
Localização: São Paulo

Uso da classesefaz

Mensagem por gu_bf »

Boa noite
Eu não sei se é mais viável, mas, se for possível declarar a função FUNCTION MsgExclamation( cText ) do modulo ze_xmlfun.prg como STATIC, para não conflitar
como no meu caso a MINIGUI, está ai a sugestão.
Muito obrigado
Gustavo.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Uso da classesefaz

Mensagem por JoséQuintas »

Melhor ainda, eliminar de vez.

É usada num exemplo que está embutido na rotina de validação.
Deixar o exemplo comentado.
Pode ser substituída por qualquer rotina que mostre o resultado na tela
Assim não prende a recursos de tela, que variam conforme console/LIB gráfica.
Inclusive o Inkey(0) foi pra poder entrar no debug, e esqueci de retirar... rs
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
gu_bf
Usuário Nível 1
Usuário Nível 1
Mensagens: 13
Registrado em: 01 Ago 2016 07:36
Localização: São Paulo

Uso da classesefaz

Mensagem por gu_bf »

Bom dia
Acho que está faltando algum aquivo .ch

---------------------------
Program Error
---------------------------
Error BASE/1003 Vari vel nÆo existe: DOW_DOMINGO

Called from HORARIOVERAOINICIO(153)
Called from DATETIMEXML(109)
Called from (b)SEFAZCLASS(111)

Obrigado
Gustavo.
gu_bf
Usuário Nível 1
Usuário Nível 1
Mensagens: 13
Registrado em: 01 Ago 2016 07:36
Localização: São Paulo

Uso da classesefaz

Mensagem por gu_bf »

Ops
Ignore meu post anterior, acabei de atualizar a LIB e vi que ja está declarado a variavel.
Obrigado.
malcarli
Usuário Nível 3
Usuário Nível 3
Mensagens: 239
Registrado em: 20 Ago 2015 18:14
Localização: marilia/sp

Uso da classesefaz

Mensagem por malcarli »

Boa tarde, estou iniciando, não encontrei esta rotina NFDbfToXml( @cNfeTxt, @cNfeXml, "1", Date(), Time(), , "1" ). Poderia informar onde? obrigado
gu_bf
Usuário Nível 1
Usuário Nível 1
Mensagens: 13
Registrado em: 01 Ago 2016 07:36
Localização: São Paulo

Uso da classesefaz

Mensagem por gu_bf »

Boa noite Quintas,
Estou com problema estranho. Com sistema pronto e funcionando na minha maquina, resolvi fazer um teste com certificado de outra empresa e no micro
deles.
O problema ocorre no momento da assinatura do XML, que devolve o erro ( Erro: Problemas pra assinar XML ) que é a descrição padrão, como se não
tivesse passado em nenhum filtro e o arquivo não está assinado.
Refiz o teste com certificado que estava usando até agora e não da erro nenhum, o processo valida sem qualquer problema.
A única diferença além das informações cadastrais da empresa são os certificados, ambos A3 dentro da validade e de emissão de empresas diferentes.
como imagem em anexo.
O que apresenta problema e de emissão da AC SINCOR RFB G4.
Poderia me dar alguma dica?
Obrigado
Gustavo.
Anexos
Certificado2.jpg
Certificado1.jpg
gilbertosilverio
Usuário Nível 3
Usuário Nível 3
Mensagens: 339
Registrado em: 18 Jan 2009 10:39
Localização: Ribeirao Pires - SP

Uso da classesefaz

Mensagem por gilbertosilverio »

Ola Gustavo,

Tive um problema parecido com o seu, em minha maquina os dois certificados funcionavam, mais quando instalei no servidor, um dos certificados dava erro na assinatura da NFe, usando o UNINFE.

Para resolver, desinstalei os certificados e todos os componentes dos tokens, baixei os instaladores de cada certificado, fornecidos pela própria autorizadora, no meu caso CERTISING e SERASA, e os dois certificados funcionaram perfeitamente, não dando mais erro de assinatura.

Creio que este teu erro e devido a falta de alguma cadeia de certificados da autorizadora.
GilbertoSilverio
gilbertosilverio@gmail.com
gilbertosilverio2003@yahoo.com.br
gu_bf
Usuário Nível 1
Usuário Nível 1
Mensagens: 13
Registrado em: 01 Ago 2016 07:36
Localização: São Paulo

Uso da classesefaz

Mensagem por gu_bf »

Ola Gilberto, obrigado pela dica.
Deixa eu relatar aqui o que aconteceu pois se alguém tiver algum problema similar não caia nesse meu erro idiota.
Eu tenho um script .BAT que registra as dlls de uso com capicom e esse script executa o registro no modo silencioso com /S, então a mensagem de erro
de que não foi possível registrar as DLLs não apareciam e para mim estava tudo normal.
Removi esse parâmetro do regsvr32.exe fiz o registro com ADMINISTRADOR e beleza.
Viu que bobeira que minha?!?!? levei 2 dias para descobrir, pensei que estivesse no codigo que escrevi, então fiquem esperto com esse tipo de rotina para não marcar dessa maneira.
Muito obrigado.
Gustavo.
malcarli
Usuário Nível 3
Usuário Nível 3
Mensagens: 239
Registrado em: 20 Ago 2015 18:14
Localização: marilia/sp

Uso da classesefaz

Mensagem por malcarli »

Bom dia José, por acaso teria algum exemplo básico de como gerar xml, usando a classe ze_spedxmlClass.prg.

obrigado
Responder