Página 3 de 6
Acompanhando as mudanças da hbnfe
Enviado: 03 Dez 2014 21:52
por JoséQuintas
Bom... vamos lá.... Situação atual:
Agora dá pra compilar com Harbour, incluindo opção -w3 -es2
Um detalhe dos módulos que usam libcurl:
Apesar de ter um PRG pra completar quem não usa libcurl na hbnfe, mesmo assim vai precisar do include.
Talvez ele não esteja disponível no harbour nightly, porque a pasta só aparece quando gera libcurl junto.
Também acrescentei meus fontes PRG.
Como são exatamente os que uso no meu aplicativo, estão com mesmo nome e tudo mais.
Conforme o andamento veremos se precisarão nomes diferentes ou outras mudanças.
Nomeio meus fontes de funções como ZE_*. Só pra em ordem alfabética ficarem no final, nada mais.
Agora começam as mudanças.
Acompanhando as mudanças da hbnfe
Enviado: 04 Dez 2014 00:55
por Itamar M. Lins Jr.
Tira o ZE_, coloca uma coisa mais condizente, HbNFeSpeedSefaz, HbNFe_xHarbour, HbXMLFuncoes, HbNFeINI por exemplo.
Quanto a CURL é complicado mesmo, a HBNFe afinal funciona com certificado A1 ou apenas com A3 ?
Saudações,
Itamar M. Lins Jr.
Acompanhando as mudanças da hbnfe
Enviado: 04 Dez 2014 00:59
por Itamar M. Lins Jr.
Outra coisa que não vi, foi se está saindo na observação da nota a frase abençoada... bla,bla,bla IPBT x% etc,etc...
Alguns clientes já estão recebendo com a dita frase no campo observações.
As empresas estão obrigadas a informar a carga tributária nos cupons e notas fiscais, estando sujeitas a auto de infração aquelas que não prestarem a informação ao consumidor.
De acordo com a Portaria Interministerial 85/14, as empresas que não utilizam sistemas informatizados ou não adaptaram seus sistemas poderão exibir cartazes para o cumprimento da lei até o dia 03/02/2015, tempo previsto para que se adaptem à Lei 12.741/2012.
Saudações,
Itamar M. Lins Jr.
Acompanhando as mudanças da hbnfe
Enviado: 04 Dez 2014 12:07
por JoséQuintas
Não olhei essa parte ainda da observação.
Quanto aos nomes, só coloquei os PRGs lá dentro.
O de compatibilidade com xharbour, não sei se deveria ter o hbnfe no início, já que é apenas pra compatibilidade.
Na dúvida deixei pra renomear depois.
Mas pensando bem, o nome externo não afeta nada, melhor deixar já começando por hbnfe.
Acompanhando as mudanças da hbnfe
Enviado: 04 Dez 2014 13:05
por oxent_jabah
Boa Tarde José Quincas,
Sei que ainda esta em fase inicial as mudanças, mas tem alguma previsão de suporte a versão da NFe 3.1 nestas mudanças ?
Acompanhando as mudanças da hbnfe
Enviado: 04 Dez 2014 17:25
por JoséQuintas
É por isso que insisto que entendam como funciona o conjunto do SPED em geral.
É tudo questão de enviar um arquivo e receber outro.
Quem entendeu esse básico, sabe que está tudo pronto mesmo sem ter nada pronto.
Igual enviar email: o que muda é o endereço do destinatário, e o assunto.
Se a hbnfe já faz esssa parte, então é questão de atualizar endereço e assunto, sem precisar esperar.
E se gerar em XML no aplicativo, também pode até se antecipar nas alterações.
Acompanhando as mudanças da hbnfe
Enviado: 04 Dez 2014 19:24
por JoséQuintas
Ia avisar que estaria duplicando funções na hbnfe, mas no final vi que já estão.
No momento há 4 funções de assinatura: hbnfe, hbmdfe, hbcte, e uma nova.
As tres primeiras fazem parte das classes, e a nova é isolada.
Acho que basta mostrar a nova. A nova é assim:
Código: Selecionar todos
FUNCTION AssinaXml( cTxtXml, cCertCN )
...
aDelimitadores := { ;
{ "<enviMDFe", "</MDFe></enviMDFe>" }, ; // MDFE envio - no fonte hbmdfe assina envio completo
{ "<eventoMDFe", "</eventoMDFe>" }, ; // MDFE evento
{ "<infMDFe", "</MDFe>" }, ; // MDFE - antes porque MDFe contém CTe e NFe
{ "<infCte", "</CTe>" }, ; // CTE - antes porque CTe contém NFe - esquisito mas é infCte e não infCTe
{ "<infNFe", "</NFe>" }, ; // NFE
{ "<infCanc", "</cancNFe>" }, ; // Cancelamento antigo
{ "<infDPEC", "</envDPEC>" }, ; // DPEC
{ "<infInut", "</inutNFe>" }, ; // Inutilização
{ "<infEvento", "</evento>" }, ; // Evento 110110 carta de correção
{ "<infEvento", "</evento>" }, ; // Evento 110111 cancelamento
{ "<infEvento", "</evento>" }, ; // Evento 210200 manifestação
{ "<infEvento", "</evento>" }, ; // Evento 210210 manifestação
{ "<infEvento", "</evento>" }, ; // Evento 210220 manifestação
{ "<infEvento", "</evento>" }, ; // Evento 210240 manifestação
{ "<infEvento", "</evento>" } } // Evento 110112 manifesto encerramento
Isto deixa a assinatura independente. Ao invés de criar mais assinaturas, só mexer nessa lista.
No geral eu teria duas opções:
Alterar tudo de uma vez pra usar a nova assinatura, mas só funcionaria no final com tudo pronto.
Ou fazer isso, e posso alterar uma de cada vez tranquilamente, e já fazer commits.
É essa segunda opção que vou usar pra tudo, então vão existir códigos temporários até terminar.
No caso da assinatura nem tanto, mas na parte da comunicação sim.
Aproveitando:
Este é um exemplo para o que eu disse no outro post sobre estar pronto mesmo não estando pronto...
Se o governo inventar documento novo... é novo então não tem.... mas é só acrescentar aí.
Acompanhando as mudanças da hbnfe
Enviado: 05 Dez 2014 08:57
por Itamar M. Lins Jr.
Eu estava lendo coisas na internet... Não tem projeto para A3 open source, apenas o pessoal do ACBr tem via Windows.
O A3 é a pedra no sapato p/ o pessoal do PHP por exemplo.
A parte de ler o TOKEN, é que não sei como vc estão fazendo, ou a parte de ler, extrair do arquivo PFX(A1) os dois arquivos necessários p/ trabalhar com A1.
Por isso a turma do Linux dificilmente trabalha com A3.
Saudações,
Itamar M. Lins Jr.
Acompanhando as mudanças da hbnfe
Enviado: 05 Dez 2014 09:46
por JoséQuintas
Numa resposta simples:
No A3 a segurança é o próprio aparelho. No dia que alguém conseguir extrair alguma coisa de lá, então vão criar um novo aparelho.
E a segurança do A3 tem a ver justamente com impedir o acesso fácil, ou sem autorização do usuário.
Conclusão: pra sistema, tem que ser o A1.
Outra coisa que confunde:
Tem versão da libcurl que vém com o OpenSSL.
Quem assina não é libcurl e sim OpenSSL.
Só lembrar que libcurl é uma biblioteca de comunicação e não de assinatura.
Pra usar OpenSSL precisa extrar do certificado (geralmente o arquivo de instalação é .PFX) algumas partes pra arquivos separados.
Então é assim:
No Windows: capicom + xml 5.0 + certificado instalado no Windows
Libcurl e OpenSSL:
LibCurl, OpenSSL (caso seja libcurl sem ele), arquivos extraídos do certificado, assinatura usando RUN
Em 2008, seis anos atrás, quando começou NFE pesquisei sobre essas coisas e lembro de ter visto isso da OpenSSL.
Na época não deu certo o que eu tentei fazer, e já me esqueci de tudo.
Quem for usar vai ter que pesquisar, ou quem estiver usando pode mostrar como é.
Outra opção, mas que não vi por aí, seria usar o Framework (no Linux tem o mono).
Nunca se sabe quando a Microsoft vai abandonar de vez Capicom e XML 5.0, é sempre bom ter mais opções.
Acompanhando as mudanças da hbnfe
Enviado: 06 Dez 2014 18:46
por JoséQuintas
Criada função pro bloco de assinatura em hbnfeAssina.prg.
Isso ficava no meio do fonte da hbnfe, em uma linha só, e havia o bloco pra capicom e libcurl.
- Reduziu a parte igual entre as duas, e ficou claro o que é diferente
- O fonte de assinatura ficando menor pode ajudar a "clarear" o que sobrou
- Também tinha duas vezes em hbmdfe.prg, uma vez em hbcte_sefaz.prg e em hbnfesdf.prg
No final, de 6 vezes reduziu pra uma.
De quebra, apesar das outras não aceitarem libcurl, o bloco está preparado.
Também já reduz as próximas assinaturas.
Nota: As outras rotinas de assinatura vão sumir no final.
Acompanhando as mudanças da hbnfe
Enviado: 06 Dez 2014 18:56
por JoséQuintas
Reparei numa coisa chata na assinatura:
Código: Selecionar todos
hb_MemoWrit( 'sign_' + AllTrim( Str( nRandom ) ) + '.bat', 'xmlsec\xmlsec --sign --output signed.xml --pkcs12 ' + ;
::ohbNFe:cCertPFX + ' --pwd ' + ::ohbNFe:cCertPass + ' --trusted-pem ' + ::ohbNFe:cCertFilePub + ;
' --id-attr:Id infNFe xml.temp' )
Pra LibCurl precisa arquivo de certificado, senha, e qual o atributo do documento (nesse caso infNFe)
Pra Capicom só precisa saber qual é o certificado.
(Além das coisas comuns entre as duas, que é a preparação do XML).
No momento a hbnfe continua com opção de LibCurl somente na NFe.
Acompanhando as mudanças da hbnfe
Enviado: 06 Dez 2014 20:01
por JoséQuintas
Acho necessário dizer o que venho encontrando nas alterações, pra entenderem o porque tem que ser devagar....
é Froids!
em hbmdfe:
Código: Selecionar todos
oCert:=::ohbNFe:pegaObjetoCertificado(::ohbNFe:cSerialCert)
em hbnfedsf:
Código: Selecionar todos
oCert:=::ohbNFe:pegaObjetoCertificado(::ohbNFe:cSerialCert)
e o método chamado:
CTE tem seu próprio método clone desse.
Acompanhando as mudanças da hbnfe
Enviado: 06 Dez 2014 20:39
por JoséQuintas
Ainda nessa parte.
Código: Selecionar todos
METHOD ctPegaObjetoCertificado() Class oCTe_SEFAZ
LOCAL SubjectName:=''
...
IF !EMPTY( ::cSerialCert )
IF oCertificados:Item(nI):SerialNumber == ::cSerialCert
oResult := oCertificados:Item(nI)
EXIT
ENDIF
ELSEIF !EMPTY( SubjectName )
IF Upper( Alltrim(oCertificados:Item(nI):SubjectName) ) == SubjectName
oResult := oCertificados:Item(nI)
EXIT
ENDIF
ENDIF
Apesar da opção por subject, não está ativa no CTE.
Separei o método e nomeei CapicomObjetoCertificado( cKey, nModo )
nModo pode ser 1=serial, 2=subject
Pra quem não sabe, isso seria pra indicar o certificado.
serial é algo assim "32 30 31 34 30 33 30 36 31 34 34 39 30 31 34 34"
subject algo assim: "Microsoft S/A"
Aqui uso o subject e não o serial.
Acompanhando as mudanças da hbnfe
Enviado: 06 Dez 2014 22:10
por JoséQuintas
Como perceberam ainda estou na assinatura.
A assinatura envolve o certificado....
Situação que encontrei:
Pra comunicação é obrigatório o CN do certificado.
Pra assinatura é usado o serial, mas poderia ser o CN, tanto faz.
Mas a configuração da hbnfe é pelo serial, acaba precisando rotinas pra pegar o CN em pelo menos 20 locais.
Então esta vai ser a primeira incompatibilidade com a versão anterior:
o CN passa a ser a identificação do certificado, e não mais o serial.
Continuo na dúvida... Ninguém se manifestou sobre estar usando a hbnfe.
Acompanhando as mudanças da hbnfe
Enviado: 07 Dez 2014 09:29
por JoséQuintas
Ainda com assinatura. Encontrei isto:
Código: Selecionar todos
METHOD Assina_XML() Class hbMDFe
/* Finaliza a estrutura do arquivo XML e assina o XML
IF 'enviMDFe' $ cXML
cXML += '</MDFe>'
cXML += '</enviMDFe>'
ELSE
cXML += "</eventoMDFe>"
ENDIF
Está misturando assinatura com montagem do XML.
Querendo ou não, significa que o XML vém errado pra assinatura e a assinatura corrige.
Significa que a geração do XML está incompleta, e que a assinatura não serve pra um XML completo.
O conjunto funciona, mas se o usuário criar o XML segundo o manual da Fazenda não daria certo, porque seria completo.
Lembrando que hoje cada subprojeto tem sua própria rotina de assinatura, este não interfere nos demais.
Apesar de agora existir uma rotina que assina qualquer tipo de documento, aqui já precisa ajustes adicionais em algumas rotinas.