Gerar NF-e em HB: qual melhor opção para iniciante?
Moderador: Moderadores
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Gerar NF-e em HB: qual melhor opção para iniciante?
Importante também:
O emissor não vai parar em 2017, ele apenas não vai mais ser atualizado.
A nota atual, 3.10, vai ser aceita até dezembro/2017.
A próxima nota, 4.00, só começa em junho/2017.
Mesmo que o governo invente alguma coisa, ele sempre dá um prazo de adaptação.
Então dá pra contar com o emissor por mais uns 3 meses no mínimo, ou até dezembro/2017 no máximo.
Eu diria que fez a parte mais difícil, que exige mais "mão de obra", que tem mais detalhes.
O que o emissor do governo, ou um componente de NFE vão fazer:
pegar seu xml, acrescentar assinatura e enviar pro governo.
Se o governo autorizar, vão acrescentar no seu XML o protocolo de autorização, e vão imprimir o Danfe a partir do seu XML.
Ou seja, está com o principal pronto.
Não tem drama nisso, ao contrário, está mais adiantado do que muitos do fórum que optaram de outra forma.
Já não vai ter nenhum problema do componente estar convertendo errado, que já deve ter visto mensagens desse tipo por aqui.
O que muita gente confunde:
Os problemas que o pessoal enfrenta, não são problemas de XML ou TXT, são problemas de informar o imposto e tudo mais corretamente.
Não é o componente que rejeita, é o governo.
Ao usar TXT ou INI, você "briga" com as mudanças do governo e com compatibilidade com o componente de NFE.
Ao usar XML.... você "briga" só com o governo, apenas informar o que o governo quer.
Preste atenção nos posts sobre problemas com NFE, que vai ver que se trata apenas sobre como preencher os valores, e não sobre complicações de formato.
por exemplo DIFAL, em operações interestaduais: o governo inventou imposto novo, só acrescentar o(s) bloco(s) do imposto novo.
Mas inventou que depende de ser pessoa física, jurídica, não contribuinte, isento.... etc....
Isso tem a ver com preenchimento, não foi a NFE que complicou, foi o conteúdo e o aplicativo fornecer essa informação.
Ué... se vai mexer no aplicativo pra acrescentar essa informação, é só acrescentar no XML.... pronto.
Muitos acham que um componente facilita a vida, mas na prática, todos estão fazendo o trabalho, e não o componente.
O componente apenas vai entregar suas informações na Fazenda e pegar a resposta.
Se as informações estão corretas ok, se estão erradas vai ter que corrigir.
No que o componente ajuda então? talvez só pra dar a sensação de tranquilidade, e a tranquilidade é que se torna a chave pra resolver tudo.
Você mesmo demonstrou isso: "fiz pra poder usar o emissor do governo".
Está correto. Está apenas buscando uma forma de se sentir tranquilo.
Trabalhando tranquilo, tudo vai tranquilo.
Pra ficar tranquilo pode fazer o que mencionei: acrescente a assinatura "fake" (ou falsa, se preferir).
O emissor avisa que é inválida, importa, e remove a assinatura inválida.
Vai fazer todo processo pelo emissor normalmente.
Depois disso, pode começar a escolher o componente NFE, ou até a classe Sefaz.
Se for a classe Sefaz:
Comece pela assinatura, já vai tirar a prova importando no emissor sem a mensagem de "assinatura inválida".
Depois, só transmitir diretamente pela classe Sefaz e ver a resposta.
O emissor não vai parar em 2017, ele apenas não vai mais ser atualizado.
A nota atual, 3.10, vai ser aceita até dezembro/2017.
A próxima nota, 4.00, só começa em junho/2017.
Mesmo que o governo invente alguma coisa, ele sempre dá um prazo de adaptação.
Então dá pra contar com o emissor por mais uns 3 meses no mínimo, ou até dezembro/2017 no máximo.
Eu diria que fez a parte mais difícil, que exige mais "mão de obra", que tem mais detalhes.
O que o emissor do governo, ou um componente de NFE vão fazer:
pegar seu xml, acrescentar assinatura e enviar pro governo.
Se o governo autorizar, vão acrescentar no seu XML o protocolo de autorização, e vão imprimir o Danfe a partir do seu XML.
Ou seja, está com o principal pronto.
Não tem drama nisso, ao contrário, está mais adiantado do que muitos do fórum que optaram de outra forma.
Já não vai ter nenhum problema do componente estar convertendo errado, que já deve ter visto mensagens desse tipo por aqui.
O que muita gente confunde:
Os problemas que o pessoal enfrenta, não são problemas de XML ou TXT, são problemas de informar o imposto e tudo mais corretamente.
Não é o componente que rejeita, é o governo.
Ao usar TXT ou INI, você "briga" com as mudanças do governo e com compatibilidade com o componente de NFE.
Ao usar XML.... você "briga" só com o governo, apenas informar o que o governo quer.
Preste atenção nos posts sobre problemas com NFE, que vai ver que se trata apenas sobre como preencher os valores, e não sobre complicações de formato.
por exemplo DIFAL, em operações interestaduais: o governo inventou imposto novo, só acrescentar o(s) bloco(s) do imposto novo.
Mas inventou que depende de ser pessoa física, jurídica, não contribuinte, isento.... etc....
Isso tem a ver com preenchimento, não foi a NFE que complicou, foi o conteúdo e o aplicativo fornecer essa informação.
Ué... se vai mexer no aplicativo pra acrescentar essa informação, é só acrescentar no XML.... pronto.
Muitos acham que um componente facilita a vida, mas na prática, todos estão fazendo o trabalho, e não o componente.
O componente apenas vai entregar suas informações na Fazenda e pegar a resposta.
Se as informações estão corretas ok, se estão erradas vai ter que corrigir.
No que o componente ajuda então? talvez só pra dar a sensação de tranquilidade, e a tranquilidade é que se torna a chave pra resolver tudo.
Você mesmo demonstrou isso: "fiz pra poder usar o emissor do governo".
Está correto. Está apenas buscando uma forma de se sentir tranquilo.
Trabalhando tranquilo, tudo vai tranquilo.
Pra ficar tranquilo pode fazer o que mencionei: acrescente a assinatura "fake" (ou falsa, se preferir).
O emissor avisa que é inválida, importa, e remove a assinatura inválida.
Vai fazer todo processo pelo emissor normalmente.
Depois disso, pode começar a escolher o componente NFE, ou até a classe Sefaz.
Se for a classe Sefaz:
Comece pela assinatura, já vai tirar a prova importando no emissor sem a mensagem de "assinatura inválida".
Depois, só transmitir diretamente pela classe Sefaz e ver a resposta.
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/
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/
Gerar NF-e em HB: qual melhor opção para iniciante?
José Quintas, mais uma vez, obrigado pela atenção e orientações!...
Farei o que você está propondo, vou copiar o trecho da assinatura de um xml válido e colocar em um função que complementa a montagem do xml!... depois posto aqui o resultado!...
Grato pela atenção.
Farei o que você está propondo, vou copiar o trecho da assinatura de um xml válido e colocar em um função que complementa a montagem do xml!... depois posto aqui o resultado!...
Não conheço essa classe Sefaz... onde posso ver a sintaxe das funções e como implementá-las no processo!... seria muito bom já poder gerar o xml assinado!...JoséQuintas escreveu:Importante também:
Comece pela assinatura, já vai tirar a prova importando no emissor sem a mensagem de "assinatura inválida".
Depois, só transmitir diretamente pela classe Sefaz e ver a resposta.
Grato pela atenção.
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Gerar NF-e em HB: qual melhor opção para iniciante?
Eu também acabo tendo que olhar na classe, pra lembrar de como é.... rs
se quiser só assinar:
Completo:
cXml - o texto do seu xml, não o nome do arquivo.
cLote - pode ser sempre "1"
cUF - a UF que vai trabalhar, "SP", por exemplo
cCertificado - o nome que está no certificado, como sendo CN
cAmbiente - 1=produção, 2=homologação
oSefaz:cXmlAutorizado - o xml que corresponde à nota autorizada - este é o processo todo finalizado, é a nota em si.
oSefaz:cStatus - o código de status retornado pela fazenda
oSefaz:cXmlRetorno - o xml retornado pela fazenda, ou o texto do erro
oSefaz:cXmlAssinado - o seu xml com assinatura, apenas pra conferência/curiosidade/etc.
vai ver se cStatus é o código de status autorizado, e conforme o que acontecer, vai ver cXmlRetorno pra ver o que deu de errado.
E pode usar as outras variáveis pra ver algum detalhe adicional, essas acima e outras.
se quiser só assinar:
Código: Selecionar todos
oSefaz := SefazClass():New()
oSefaz:AssinaXml( @cXml, cCertificado )
? oSefaz:cXmlRetorno
Código: Selecionar todos
oSefaz := SefazClass():New()
oSefaz:NFeLoteEnvia( cXml, cLote, cUF, cCertificado, cAmbiente )
hbNFeDaNFe( oSefaz:cXmlAutorizado )
hb_MemoWrit( "xmlautorizado.xml", oSefaz:cXmlAutorizado )
? oSefaz:cStatus
? oSefaz:cXmlRetorno
? oSefaz:cXmlAutorizado
? oSefaz:cXmlAssinado
cLote - pode ser sempre "1"
cUF - a UF que vai trabalhar, "SP", por exemplo
cCertificado - o nome que está no certificado, como sendo CN
cAmbiente - 1=produção, 2=homologação
oSefaz:cXmlAutorizado - o xml que corresponde à nota autorizada - este é o processo todo finalizado, é a nota em si.
oSefaz:cStatus - o código de status retornado pela fazenda
oSefaz:cXmlRetorno - o xml retornado pela fazenda, ou o texto do erro
oSefaz:cXmlAssinado - o seu xml com assinatura, apenas pra conferência/curiosidade/etc.
vai ver se cStatus é o código de status autorizado, e conforme o que acontecer, vai ver cXmlRetorno pra ver o que deu de errado.
E pode usar as outras variáveis pra ver algum detalhe adicional, essas acima e outras.
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/
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/
Gerar NF-e em HB: qual melhor opção para iniciante?
O que deve ter em "cCertificado" exatamente?!..JoséQuintas escreveu:Eu também acabo tendo que olhar na classe, pra lembrar de como é.... rs
se quiser só assinar:
Código: Selecionar todos
oSefaz := SefazClass():New() oSefaz:AssinaXml( @cXml, cCertificado ) ? oSefaz:cXmlRetorno
Tem alguma função que consiga ler o certificado e atribuir o conteúdo a esta variável?!...
Esta função hbNFeDaNFe( oSefaz:cXmlAutorizado) imprime a danfe?!... tem algum parâmetro para informar em qual impressora e logomarca da empresa?!..JoséQuintas escreveu:Completo:
Código: Selecionar todos
oSefaz := SefazClass():New() oSefaz:NFeLoteEnvia( cXml, cLote, cUF, cCertificado, cAmbiente ) hbNFeDaNFe( oSefaz:cXmlAutorizado ) hb_MemoWrit( "xmlautorizado.xml", oSefaz:cXmlAutorizado ) ? oSefaz:cStatus ? oSefaz:cXmlRetorno ? oSefaz:cXmlAutorizado ? oSefaz:cXmlAssinado
Esse conjunto de funções são nativos no harbour 3.2 (estou usando este!..) ou preciso adicionar alguma lib ao meu arquivo de compilação?!...JoséQuintas escreveu: cXml - o texto do seu xml, não o nome do arquivo.
cLote - pode ser sempre "1"
cUF - a UF que vai trabalhar, "SP", por exemplo
cCertificado - o nome que está no certificado, como sendo CN
cAmbiente - 1=produção, 2=homologação
oSefaz:cXmlAutorizado - o xml que corresponde à nota autorizada - este é o processo todo finalizado, é a nota em si.
oSefaz:cStatus - o código de status retornado pela fazenda
oSefaz:cXmlRetorno - o xml retornado pela fazenda, ou o texto do erro
oSefaz:cXmlAssinado - o seu xml com assinatura, apenas pra conferência/curiosidade/etc.
vai ver se cStatus é o código de status autorizado, e conforme o que acontecer, vai ver cXmlRetorno pra ver o que deu de errado.
E pode usar as outras variáveis pra ver algum detalhe adicional, essas acima e outras.
Você tem algum material descrevendo o uso dessas funções/!..
Obrigado pela ajuda!..
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Gerar NF-e em HB: qual melhor opção para iniciante?
Coloquei errado da Danfe, é pra gerar um PDF, então precisa também do nome do PDF.
O que precisa:
- Pra Danfe, é harupdf, faz parte do Harbour
- Capicom pra assinatura, é da Microsoft, só baixar
- msxml5, pra assinatura/comunicação, é da Microsoft, mas saiu como parte do Office, precisa baixar em separado
Esses dois da Microsoft são DLLs. Não são necessários pra compilar, mas serão necessários na máquina do cliente e na sua.
o CN do certificado, dá pra ver no Internet Explorer, ferramentas, opções de internet, conteúdo, certificados, e em certificados propriedades e detalhes, assim vê o nome exatamente como está.
Tem rotina na classe também pra pegar o nome do certificado, mas no momento o que interessa é emitir nota.
Isso de pegar o nome do certificado vai ser feito uma única vez, se é manual ou automático não é nenhum problema.
Mas tem o exemplo lá na classe.
O que precisa:
- Pra Danfe, é harupdf, faz parte do Harbour
- Capicom pra assinatura, é da Microsoft, só baixar
- msxml5, pra assinatura/comunicação, é da Microsoft, mas saiu como parte do Office, precisa baixar em separado
Esses dois da Microsoft são DLLs. Não são necessários pra compilar, mas serão necessários na máquina do cliente e na sua.
o CN do certificado, dá pra ver no Internet Explorer, ferramentas, opções de internet, conteúdo, certificados, e em certificados propriedades e detalhes, assim vê o nome exatamente como está.
Tem rotina na classe também pra pegar o nome do certificado, mas no momento o que interessa é emitir nota.
Isso de pegar o nome do certificado vai ser feito uma única vez, se é manual ou automático não é nenhum problema.
Mas tem o exemplo lá na classe.
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/
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/
Gerar NF-e em HB: qual melhor opção para iniciante?
Fiz o que você sugeriu, criei uma função para adicionar ao xml a string da assinatura de um xml já autorizado, mas o importador rejeita apesar de apresentar o xml com a indicação de assinado!.. Antes porém submeti o mesmo arquivo ao http://validadornfe.tecnospeed.com.br/ e não apresentou problemas.JoséQuintas escreveu: Pra importar no emissor, em XML, obriga que exista assinatura, mas pode ser qualquer assinatura, não precisa ser válida.
Basta colocar um bloco de outro xml assinado <signature.>...</signature>
Vai acusar assinatura inválida, mas vai importar normalmente, como se fosse o txt.
O próprio emissor vai poder assinar corretamente e fazer todo resto do processo.
Você poderia me ajudar neste ponto?!..
Código: Selecionar todos
/*************************************************************
* Preenche as tags do grupo ZZ. Informações da Assinatura Digital
*/
Static FUNCTION Fxml_Signature(pXml)
pXml+='<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" /><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" /><Reference URI="#NFe26160509339936000701550210004831477015570477"><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /><Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" /></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /><DigestValue>AlYzfysIa1TAnyPJB3Yv1qlTI+0=</DigestValue></Reference></SignedInfo><SignatureValue>s/LjeFo6EjcYolMBKA5GLjM7br33Z24hP5nFe4rb4y08lZn/20Tff3VBJjPtBnWbb99H2pDpNuRdKQ/0OLvTi4iPOcrssFCUEt6R3YMgiA/cNkCHsESKMeG7NQwc5y9KdqrbVWlYIRT4v8b0L79+o/Blqvz81JW/h9m+OMoyJnn8H9qFwK63cVX4vw5t/qA8Pt5FqBf/7jW8b1yTM00DuFH4weoPbHCJanFOuLXioEu5Dm2Phv46Wyxji07KdcnYYzNRQ/tb/Y5vxAIe+zyOC248itYLdQchLUtOVM3mJ+WwmjdwJfcsoZpfA3N0ZwU9pkpKblQe2hbO93xDD7zFfg==</SignatureValue><KeyInfo><X509Data><X509Certificate>MIIIPTCCBiWgAwIBAgIQT+qUugRzb8WqvZipdL6rMDANBgkqhkiG9w0BAQsFADB0MQswCQYDVQQGEwJCUjETMBEGA1UEChMKSUNQLUJyYXNpbDEtMCsGA1UECxMkQ2VydGlzaWduIENlcnRpZmljYWRvcmEgRGlnaXRhbCBTLkEuMSEwHwYDVQQDExhBQyBDZXJ0aXNpZ24gTXVsdGlwbGEgRzUwHhcNMTUwODEzMDAwMDAwWhcNMTYwODExMjM1OTU5WjCB0zELMAkGA1UEBhMCQlIxEzARBgNVBAoUCklDUC1CcmFzaWwxODA2BgNVBAsUL0F1dGVudGljYWRvIHBvciBDZXJ0aXNpZ24gQ2VydGlmaWNhZG9yYSBEaWdpdGFsMRswGQYDVQQLFBJBc3NpbmF0dXJhIFRpcG8gQTExFTATBgNVBAsUDElEIC0gODg5NTA3NzEdMBsGA1UEAxMUTlMyIENPTSBJTlRFUk5FVCBTIEExIjAgBgkqhkiG9w0BCQEWE2Zpc2NhbEBuZXRzaG9lcy5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDd08S0RUeNNy/3pmeQVrsYPf4Tnj9OtX3Zn0jaDlk8ia5dNbnivQ/qJyhvUhHwDWea3/sDJg1DR3HAR/YuaG/GY31rnOPbe/QLi/+JblzNCXus8+3n9emOsHRMOnaq9m3lr+SGRQivhM2xN1mLEiA8SfhdqbnS9zdCzz1Djyb2lWdwJ3bOxJO7qTk9fgN1lIKBbphw3Yj6KCs5lVoZemQEVw3ZEBFDiN7wdXNQIbCk0/QeviEk+lPSeH3ERETThM4B4JE0w+iVP29feDUDuJTC9NKrGPkPJWMYf535DJ3FhrQVC9sT/78Bzkv5VMZQFS1sQif319kNjy+kMpVcsS5pAgMBAAGjggNpMIIDZTCBrwYDVR0RBIGnMIGkoD0GBWBMAQMEoDQEMjIwMDExOTc0MTY4NzY0NDE4NzMwMDAwMDAwMDAwMDAwMDAwMDAyNDEyMjIyMVNTUFNQoBoGBWBMAQMCoBEED01BUkNJTyBLVU1SVUlBTqAZBgVgTAEDA6AQBA4wOTMzOTkzNjAwMDExNqAXBgVgTAEDB6AOBAwwMDAwMDAwMDAwMDCBE2Zpc2NhbEBuZXRzaG9lcy5jb20wCQYDVR0TBAIwADAfBgNVHSMEGDAWgBSdUM+9/yTKr7Ez6xfiQnqOaSqOUzAOBgNVHQ8BAf8EBAMCBeAwgYkGA1UdIASBgTB/MH0GBmBMAQIBCzBzMHEGCCsGAQUFBwIBFmVodHRwOi8vaWNwLWJyYXNpbC5jZXJ0aXNpZ24uY29tLmJyL3JlcG9zaXRvcmlvL2RwYy9BQ19DZXJ0aXNpZ25fTXVsdGlwbGEvRFBDX0FDX0NlcnRpU2lnbk11bHRpcGxhLnBkZjCCASUGA1UdHwSCARwwggEYMFygWqBYhlZodHRwOi8vaWNwLWJyYXNpbC5jZXJ0aXNpZ24uY29tLmJyL3JlcG9zaXRvcmlvL2xjci9BQ0NlcnRpc2lnbk11bHRpcGxhRzUvTGF0ZXN0Q1JMLmNybDBboFmgV4ZVaHR0cDovL2ljcC1icmFzaWwub3V0cmFsY3IuY29tLmJyL3JlcG9zaXRvcmlvL2xjci9BQ0NlcnRpc2lnbk11bHRpcGxhRzUvTGF0ZXN0Q1JMLmNybDBboFmgV4ZVaHR0cDovL3JlcG9zaXRvcmlvLmljcGJyYXNpbC5nb3YuYnIvbGNyL0NlcnRpc2lnbi9BQ0NlcnRpc2lnbk11bHRpcGxhRzUvTGF0ZXN0Q1JMLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwQwgaAGCCsGAQUFBwEBBIGTMIGQMGQGCCsGAQUFBzAChlhodHRwOi8vaWNwLWJyYXNpbC5jZXJ0aXNpZ24uY29tLmJyL3JlcG9zaXRvcmlvL2NlcnRpZmljYWRvcy9BQ19DZXJ0aXNpZ25fTXVsdGlwbGFfRzUucDdjMCgGCCsGAQUFBzABhhxodHRwOi8vb2NzcC5jZXJ0aXNpZ24uY29tLmJyMA0GCSqGSIb3DQEBCwUAA4ICAQDBWYBEDoZuuKxE9cmp48Gj/s2JO23FDCrFkq3DpvomvAk7UwE3ty+c/e5Wpczc/xrENVwlh5TaYYKx31Mfxn/L/EIZql/mmj/NhLc7ltGEDU0eQZetM/r2N29wB/c2iSpIR+vyzRr17zUqK9ttucG1kcUQ2k4J9pl2/xuK+/4o9CWeonhOb4cJiikjGcteCNm9PnbhIkO8pNKRZiYMlbm9SboCTWWopmQk8YsUUQ4X+PuUCxltb0EN8nqSR6QlmeRxKYX8Qvq4tbKBpGMzRJOovgdH+MfyMGtheYnenHVLoUAJqJg1m+wAXrfHpVaxTNbKlVv6XrMq72U+8lU4Q8jSUm/8kxNKQEsxiiKBjzDCEC4SghCunlE4eWM11MGW4wA5KAkGeMpafXCdMDsYJyV7GtcCrl27xXuAY3/OwSB/h6NhrvsgjTxU5jQ3E3iRqmv+vIwCEskX0TJxabDxMxJZkBnoleKqcEUM3tPMQCvVYcJmHFlDkxO++yDKQaoukBgHKqhFuZOBc13WJNVmM7FBphn/Tkn6NbUlHOFhiS4DHyR12wujeoYMaPtspOjnyWj7zbNnOP8v11HrfbXHdDk44lYMbMuQpYK8BWksYGwjYfsXkpQpL2PGhj/6Ji5QRR24rfttAgX6xdMXE2k+kZOrhNK7qbPVhySvac8Ei0iQTA==</X509Certificate></X509Data></KeyInfo></Signature>'
Return Nil
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Gerar NF-e em HB: qual melhor opção para iniciante?
Faltou só comparar um XML assinado com um XML não assinado.
Apesar de eu dizer que é acrescentar assinatura, não significa que basta somá-la ao final do XML.
Ela tem um lugar apropriado dentro do XML.
Se não me engano é o último bloco dentro de NFE (não olhei um XML).
Só olhar um XML assinado, o que vém antes de <Signature> e depois de </Signature>
É só colocar no mesmo lugar.
Se for o </NFE>, de repente:
ou
É só confirmar olhando um xml assinado.
Isso vai valer pra qualquer tipo de xml, então acaba sendo interessante dar uma olhada, pra ir se acostumando.
Se achar mais fácil pra visualizar, pode abrir o xml pelo explorer, só pra ficar melhor de visualizar.
lembrando que o explorer mostra cada coisa numa linha, mas dentro do xml é tudo numa linha só.
Apesar de eu dizer que é acrescentar assinatura, não significa que basta somá-la ao final do XML.
Ela tem um lugar apropriado dentro do XML.
Se não me engano é o último bloco dentro de NFE (não olhei um XML).
Código: Selecionar todos
<NFE... >
<infNFe...>
</infNFe>
<Signature>
</Signature>
</nFe>
É só colocar no mesmo lugar.
Se for o </NFE>, de repente:
Código: Selecionar todos
cXml := StrTran( cXml, "</NFE>", Assinatura() + "</NFE>" )
Código: Selecionar todos
cXml := Substr( cXml, 1, At( "</NFE>", cXml ) - 1 ) + Assinatura() + "</NFE>"
Isso vai valer pra qualquer tipo de xml, então acaba sendo interessante dar uma olhada, pra ir se acostumando.
Se achar mais fácil pra visualizar, pode abrir o xml pelo explorer, só pra ficar melhor de visualizar.
lembrando que o explorer mostra cada coisa numa linha, mas dentro do xml é tudo numa linha só.
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/
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/
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Gerar NF-e em HB: qual melhor opção para iniciante?
Realmente esqueci de um detalhe:
cURI é o que vincula a assinatura ao documento.
É praticamente o que está em id=, precedido de #
Confirme no XML, porque o corretor ortográfico do Windows altera o que é digitado aqui.
Tem mais essa pra atrapalhar..... rs
Código: Selecionar todos
FUNCTION FakeSignature( cUri )
LOCAL cXml
cUri := iif( cUri == NIL, [#ProjetoChave], cUri )
cXml := [<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">]
cXml += [<SignedInfo>]
cXml += [<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>]
cXml += [<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>]
cXml += [<Reference URI="] + cUri + [">]
cXml += [<Transforms>]
cXml += [<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>]
cXml += [<Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>]
cXml += [</Transforms>]
cXml += [<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>]
É praticamente o que está em id=, precedido de #
Código: Selecionar todos
URI="#NFE" + chavedeacesso
Tem mais essa pra atrapalhar..... 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/
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/
Gerar NF-e em HB: qual melhor opção para iniciante?
Prezado José Quinas, boa tarde!...
Finalmente consegui importar o xml no emissor gratuito, inclui a estrutura abaixo (sugerida por você) na função para compor as tags de assinatura. Importei o xml e foi apresentada mensagem de alerta que a assinatura não é válida mas que poderia importar deixando a nota em digitação. Na sequencia a nota foi importada com sucesso. Consegui ainda validar internamente no emissor, assinar, pré-visualizar a danfe e transmitir com sucesso.
Tudo isso foi feito com a versão de teste do emissor, sem validade jurídica!... Só não consegui ter o retorno de aprovação da NF-e, pois o sefaz retornou a de rejeição: 203-Emissor não habilitado para NF-e. Não sei se esta mensagem se refere ao Emitente ou a versão de teste do aplicativo emissor. Porém, o importante é que o principal está feito: estou conseguindo gerar o xml dentro do processo operacional do sistema e o cliente terá o emissor gratuito para importar, validar, assinar e transmitir...
Agora terei tempo para concluir o tratamento do retorno dentro do sistema: ler o retorno do xml, capturar as informações de autorização e tentar migrar o processo para o ACBr.
Ainda devo postar muitas outras dúvidas aqui, mas desde já lhe agradeço pelas orientações dadas, sem as quais não teria conseguido chegar até aqui!..
Valeu!..
Finalmente consegui importar o xml no emissor gratuito, inclui a estrutura abaixo (sugerida por você) na função para compor as tags de assinatura. Importei o xml e foi apresentada mensagem de alerta que a assinatura não é válida mas que poderia importar deixando a nota em digitação. Na sequencia a nota foi importada com sucesso. Consegui ainda validar internamente no emissor, assinar, pré-visualizar a danfe e transmitir com sucesso.
Tudo isso foi feito com a versão de teste do emissor, sem validade jurídica!... Só não consegui ter o retorno de aprovação da NF-e, pois o sefaz retornou a de rejeição: 203-Emissor não habilitado para NF-e. Não sei se esta mensagem se refere ao Emitente ou a versão de teste do aplicativo emissor. Porém, o importante é que o principal está feito: estou conseguindo gerar o xml dentro do processo operacional do sistema e o cliente terá o emissor gratuito para importar, validar, assinar e transmitir...
Agora terei tempo para concluir o tratamento do retorno dentro do sistema: ler o retorno do xml, capturar as informações de autorização e tentar migrar o processo para o ACBr.
Ainda devo postar muitas outras dúvidas aqui, mas desde já lhe agradeço pelas orientações dadas, sem as quais não teria conseguido chegar até aqui!..
Valeu!..
Código: Selecionar todos
Static FUNCTION Fxml_Signature(pXml,pKeyNFe)
pXml += '<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">'
pXml += '<SignedInfo>'
pXml += '<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>'
pXml += '<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>'
pXml += '<Reference URI="NFe' + pKeyNFe + '">'
pXml += '<Transforms>'
pXml += '<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>'
pXml += '<Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>'
pXml += '</Transforms>'
pXml += '<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>'
pXml += '<DigestValue>AlYzfysIa1TAnyPJB3Yv1qlTI+0=</DigestValue>'
pXml += '</Reference>'
pXml += '</SignedInfo>'
pXml += '<SignatureValue>s/LjeFo6EjcYolMBKA5GLjM7br33Z24hP5nFe4rb4y08lZn/20Tff3VBJjPtBnWbb99H2pDpNuRdKQ/0OLvTi4iPOcrssFCUEt6R3YMgiA/cNkCHsESKMeG7NQwc5y9KdqrbVWlYIRT4v8b0L79+o/Blqvz81JW/h9m+OMoyJnn8H9qFwK63cVX4vw5t/qA8Pt5FqBf/7jW8b1yTM00DuFH4weoPbHCJanFOuLXioEu5Dm2Phv46Wyxji07KdcnYYzNRQ/tb/Y5vxAIe+zyOC248itYLdQchLUtOVM3mJ+WwmjdwJfcsoZpfA3N0ZwU9pkpKblQe2hbO93xDD7zFfg==</SignatureValue>'
pXml += '<KeyInfo>'
pXml+= '<X509Data>'
pXml += '<X509Certificate>MIIIPTCCBiWgAwIBAgIQT+qUugRzb8WqvZipdL6rMDANBgkqhkiG9w0BAQsFADB0MQswCQYDVQQGEwJCUjETMBEGA1UEChMKSUNQLUJyYXNpbDEtMCsGA1UECxMkQ2VydGlzaWduIENlcnRpZmljYWRvcmEgRGlnaXRhbCBTLkEuMSEwHwYDVQQDExhBQyBDZXJ0aXNpZ24gTXVsdGlwbGEgRzUwHhcNMTUwODEzMDAwMDAwWhcNMTYwODExMjM1OTU5WjCB0zELMAkGA1UEBhMCQlIxEzARBgNVBAoUCklDUC1CcmFzaWwxODA2BgNVBAsUL0F1dGVudGljYWRvIHBvciBDZXJ0aXNpZ24gQ2VydGlmaWNhZG9yYSBEaWdpdGFsMRswGQYDVQQLFBJBc3NpbmF0dXJhIFRpcG8gQTExFTATBgNVBAsUDElEIC0gODg5NTA3NzEdMBsGA1UEAxMUTlMyIENPTSBJTlRFUk5FVCBTIEExIjAgBgkqhkiG9w0BCQEWE2Zpc2NhbEBuZXRzaG9lcy5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDd08S0RUeNNy/3pmeQVrsYPf4Tnj9OtX3Zn0jaDlk8ia5dNbnivQ/qJyhvUhHwDWea3/sDJg1DR3HAR/YuaG/GY31rnOPbe/QLi/+JblzNCXus8+3n9emOsHRMOnaq9m3lr+SGRQivhM2xN1mLEiA8SfhdqbnS9zdCzz1Djyb2lWdwJ3bOxJO7qTk9fgN1lIKBbphw3Yj6KCs5lVoZemQEVw3ZEBFDiN7wdXNQIbCk0/QeviEk+lPSeH3ERETThM4B4JE0w+iVP29feDUDuJTC9NKrGPkPJWMYf535DJ3FhrQVC9sT/78Bzkv5VMZQFS1sQif319kNjy+kMpVcsS5pAgMBAAGjggNpMIIDZTCBrwYDVR0RBIGnMIGkoD0GBWBMAQMEoDQEMjIwMDExOTc0MTY4NzY0NDE4NzMwMDAwMDAwMDAwMDAwMDAwMDAyNDEyMjIyMVNTUFNQoBoGBWBMAQMCoBEED01BUkNJTyBLVU1SVUlBTqAZBgVgTAEDA6AQBA4wOTMzOTkzNjAwMDExNqAXBgVgTAEDB6AOBAwwMDAwMDAwMDAwMDCBE2Zpc2NhbEBuZXRzaG9lcy5jb20wCQYDVR0TBAIwADAfBgNVHSMEGDAWgBSdUM+9/yTKr7Ez6xfiQnqOaSqOUzAOBgNVHQ8BAf8EBAMCBeAwgYkGA1UdIASBgTB/MH0GBmBMAQIBCzBzMHEGCCsGAQUFBwIBFmVodHRwOi8vaWNwLWJyYXNpbC5jZXJ0aXNpZ24uY29tLmJyL3JlcG9zaXRvcmlvL2RwYy9BQ19DZXJ0aXNpZ25fTXVsdGlwbGEvRFBDX0FDX0NlcnRpU2lnbk11bHRpcGxhLnBkZjCCASUGA1UdHwSCARwwggEYMFygWqBYhlZodHRwOi8vaWNwLWJyYXNpbC5jZXJ0aXNpZ24uY29tLmJyL3JlcG9zaXRvcmlvL2xjci9BQ0NlcnRpc2lnbk11bHRpcGxhRzUvTGF0ZXN0Q1JMLmNybDBboFmgV4ZVaHR0cDovL2ljcC1icmFzaWwub3V0cmFsY3IuY29tLmJyL3JlcG9zaXRvcmlvL2xjci9BQ0NlcnRpc2lnbk11bHRpcGxhRzUvTGF0ZXN0Q1JMLmNybDBboFmgV4ZVaHR0cDovL3JlcG9zaXRvcmlvLmljcGJyYXNpbC5nb3YuYnIvbGNyL0NlcnRpc2lnbi9BQ0NlcnRpc2lnbk11bHRpcGxhRzUvTGF0ZXN0Q1JMLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwQwgaAGCCsGAQUFBwEBBIGTMIGQMGQGCCsGAQUFBzAChlhodHRwOi8vaWNwLWJyYXNpbC5jZXJ0aXNpZ24uY29tLmJyL3JlcG9zaXRvcmlvL2NlcnRpZmljYWRvcy9BQ19DZXJ0aXNpZ25fTXVsdGlwbGFfRzUucDdjMCgGCCsGAQUFBzABhhxodHRwOi8vb2NzcC5jZXJ0aXNpZ24uY29tLmJyMA0GCSqGSIb3DQEBCwUAA4ICAQDBWYBEDoZuuKxE9cmp48Gj/s2JO23FDCrFkq3DpvomvAk7UwE3ty+c/e5Wpczc/xrENVwlh5TaYYKx31Mfxn/L/EIZql/mmj/NhLc7ltGEDU0eQZetM/r2N29wB/c2iSpIR+vyzRr17zUqK9ttucG1kcUQ2k4J9pl2/xuK+/4o9CWeonhOb4cJiikjGcteCNm9PnbhIkO8pNKRZiYMlbm9SboCTWWopmQk8YsUUQ4X+PuUCxltb0EN8nqSR6QlmeRxKYX8Qvq4tbKBpGMzRJOovgdH+MfyMGtheYnenHVLoUAJqJg1m+wAXrfHpVaxTNbKlVv6XrMq72U+8lU4Q8jSUm/8kxNKQEsxiiKBjzDCEC4SghCunlE4eWM11MGW4wA5KAkGeMpafXCdMDsYJyV7GtcCrl27xXuAY3/OwSB/h6NhrvsgjTxU5jQ3E3iRqmv+vIwCEskX0TJxabDxMxJZkBnoleKqcEUM3tPMQCvVYcJmHFlDkxO++yDKQaoukBgHKqhFuZOBc13WJNVmM7FBphn/Tkn6NbUlHOFhiS4DHyR12wujeoYMaPtspOjnyWj7zbNnOP8v11HrfbXHdDk44lYMbMuQpYK8BWksYGwjYfsXkpQpL2PGhj/6Ji5QRR24rfttAgX6xdMXE2k+kZOrhNK7qbPVhySvac8Ei0iQTA==</X509Certificate>'
pXml+= '</X509Data>'
pXml += '</KeyInfo>'
pXml += '</Signature>'
Return Nil
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Gerar NF-e em HB: qual melhor opção para iniciante?
Provavelmente é necessário cadastrar a empresa na Fazenda.rejeição: 203-Emissor não habilitado para NF-
Seja homologação ou produção.
No momento você está pronto.
Todo restante que falta sobre NFe geralmente é o componente que faz.
Tem também cancelamento, carta de correção, etc.
Não dá pra testar o resto enquanto não tiver emitido pelo menos uma nota, e puder fazer isso com a Fazenda.
Mas o resto é muito simples, comparado à NFe em si.
Agora é verificar com a Fazenda e providenciar a liberaçã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/
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/
Gerar NF-e em HB: qual melhor opção para iniciante?
Olá, José Quintas!...
Estou precisando ler o xml de retorno da NFe para capturar os dados do protocolo de autorização e adequar os processos dentro do sistemas. Sei que tem funções no harbour para ler o conteúdo das tags. Você teria algum exemplo ou documentação a respeito?!...
Grato,
Araújo
Estou precisando ler o xml de retorno da NFe para capturar os dados do protocolo de autorização e adequar os processos dentro do sistemas. Sei que tem funções no harbour para ler o conteúdo das tags. Você teria algum exemplo ou documentação a respeito?!...
Grato,
Araújo
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Gerar NF-e em HB: qual melhor opção para iniciante?
No Emissor, o retorno é a nota autorizada.
Pra nota, tem na classe o XmlToDoc()
Em componente de NFe, depende do componente pra saber que retorno ele usa.
Na classe tem rotinas pra tratar retornos, já que ela faz tudo.
São os retornos oficiais, dos webservices do governo.
Pra nota, tem na classe o XmlToDoc()
Em componente de NFe, depende do componente pra saber que retorno ele usa.
Na classe tem rotinas pra tratar retornos, já que ela faz tudo.
São os retornos oficiais, dos webservices do governo.
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/
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/
Gerar NF-e em HB: qual melhor opção para iniciante?
Não conheço esta função!... Você tem alguma documentação sobre ela?!...JoséQuintas escreveu:No Emissor, o retorno é a nota autorizada.
Pra nota, tem na classe o XmlToDoc()
Você tem documentação com exemplos?!..JoséQuintas escreveu: Em componente de NFe, depende do componente pra saber que retorno ele usa.
Na classe tem rotinas pra tratar retornos, já que ela faz tudo.
São os retornos oficiais, dos webservices do governo.
Grato,
Araújo
-
Fernando queiroz
- Usuário Nível 4

- Mensagens: 779
- Registrado em: 13 Nov 2014 00:41
- Localização: Porto Alegre/RS
Gerar NF-e em HB: qual melhor opção para iniciante?
Quintas já fiz todo o processo informado acima, estou seguindo vocês nesse post, já tenho o arquivo xml importado corretamente no aplicativo da receita, agora gostaria de partir para a assinatura, mas já tentei via ACBR e não saiu nada, tem como fazer diretamente no meu aplicativo?
Já instalei o meu certificado digital no Windows
USO o harbour 3.2
:% :% :'( :'(
Já instalei o meu certificado digital no Windows
USO o harbour 3.2
:% :% :'( :'(
HARBOUR 3.2, HWGUI 2.23 B3, SEFAZCLASS, PDFClass, ADO + MariaDB/MySQL, RMChart
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Gerar NF-e em HB: qual melhor opção para iniciante?
Tá explicado mais acima.
Precisa ter instalado capicom.dll, mscml5.dll.
O ACBR e a classe Sefaz usam esses componentes, se não estiverem instalados na máquina, não funciona.
Diretamente pelo Harbour, sem nenhuma DLL adicional, que eu saiba ainda não dá.
No mínimo é instalar essas duas DLLs.
Precisa ter instalado capicom.dll, mscml5.dll.
O ACBR e a classe Sefaz usam esses componentes, se não estiverem instalados na máquina, não funciona.
Diretamente pelo Harbour, sem nenhuma DLL adicional, que eu saiba ainda não dá.
No mínimo é instalar essas duas DLLs.
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/
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/
