Atualizações/Alterações

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

Alteração em XmlTag()

Mensagem por JoséQuintas »

Estou fazendo uma "pequena" alteração em XmlTag()
É um pouco perigosa, apesar de não fazer diferença pra quem já usa.
É pra simplificar o uso, uma conversão automática.
Converte numérico, data, e remove brancos de string.
Default numérico pra 2 dígitos, e com conversão.

Código: Selecionar todos

FUNCTION XmlTag( cTag, xValue, nDecimals, lConvert )

   LOCAL cXml

   hb_Default( @nDecimals, 2 )
   hb_Default( lConvert, .T. )

   IF lConvert
      IF ValType( xValue ) == "D"
         xValue := DateXml( xValue )
      ENDIF
      IF ValType( xValue ) == "N"
         xValue := NumberXml( xValue, nDecimals )
      ENDIF
      xValue := AllTrim( xValue )
      DO WHILE Space(2) $ xValue
         xValue := StrTran( xValue, Space(2), Space(1) )
      ENDDO
   ENDIF
   IF Len( xValue ) == 0
      cXml := [<]+ cTag + [/>]
   ELSE
      cXml := [<] + cTag + [>] + xValue + [</] + cTag + [>]
   ENDIF

   RETURN cXml
Qual a diferença no uso?
Aproveitando o que acabei de colocar em outro post....
Pode ser usada igual antes:

Código: Selecionar todos

   cXml += XmlTag( "qTrib", NumberXml( jpitped->ipQtde, 4 ) )
   cXml += XmlTag( "vUnTrib", NumberXml( iif( lSomenteIcms, 0, jpitped->ipPreNot ), 5 ) )
   IF jpitped->ipValFre != 0
      cXml += XmlTag( "vFrete", NumberXml( jpitped->ipValFre, 2 ) )
   ENDIF
   IF jpitped->ipValSeg != 0
      cXml += XmlTag( "vSeg", NumberXml( jpitped->ipValSeg, 2 ) )
   ENDIF
   IF jpitped->ipValDes != 0
      cXml += XmlTag( "vDesc", NumberXml( jpitped->ipValDes, 2 ) )
   ENDIF
   IF jpitped->ipValOut != 0
      IF jpitped->ipValOut != 0
         cXml += XmlTag( "vOutro", NumberXml( jpitped->ipValOut, 2 ) )
      ENDIF
   ENDIF
   cXml += XmlTag( "indTot", "1" ) // Indica se soma produto
Mas pode reduzir fonte aproveitando a conversão automática.
No caso de números, só precisei indicar quando NÃO SÃO 2 decimais.

Código: Selecionar todos

   cXml += XmlTag( "qTrib", jpitped->ipQtde, 4 )
   cXml += XmlTag( "vUnTrib", iif( lSomenteIcms, 0, jpitped->ipPreNot, 5 ) )
   IF jpitped->ipValFre != 0
      cXml += XmlTag( "vFrete", jpitped->ipValFre )
   ENDIF
   IF jpitped->ipValSeg != 0
      cXml += XmlTag( "vSeg", jpitped->ipValSeg )
   ENDIF
   IF jpitped->ipValDes != 0
      cXml += XmlTag( "vDesc", jpitped->ipValDes )
   ENDIF
   IF jpitped->ipValOut != 0
      cXml += XmlTag( "vOutro", jpitped->ipValOut )
   ENDIF
   cXml += XmlTag( "indTot", "1" ) // Indica se soma produto
Porque é perigosa?
Na prática não sei se poderia esconder algum erro do programador.
E para exceções... deixei a opção de não converter... não sei se pode acontecer alguma exceção, mas já deixei isso pronto.
Com certeza o fonte fica mais "limpo" do que era antes.
E como tem trocentos campos na geração de XML..... vai ser uma bela limpeza.
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

Alteração em XmlTag()

Mensagem por JoséQuintas »

Uia... só no bloco do ICMS900....

Código: Selecionar todos

STATIC FUNCTION NfeBlocoProdutoIcms900( cXml )

   IF SubStr( jpitped->ipIcmCst, 2, 3 ) != "900"
      RETURN NIL
   ENDIF
   cXml += [<ICMSSN900>]
   cXml += XmlTag( "orig", SubStr( jpitped->ipIcmCst, 1, 1 ) )
   cXml += XmlTag( "CSOSN", SubStr( jpitped->ipIcmCst, 2, 3 ) )
   IF jpitped->ipIcmVal != 0
      cXml += XmlTag( "modBC", "3" )
      IF jpitped->ipIcmBas != 0
         cXml += XmlTag( "vBC", NumberXml( jpitped->ipIcmBas, 2 ) )
      ENDIF
      IF jpitped->ipIcmRed != 0
         cXml += XmlTag( "pRedBC", NumberXml( jpitped->ipIcmRed, 2 ) )
      ENDIF
      IF jpitped->ipIcmAli != 0
         cXml += XmlTag( "pICMS", NumberXml( jpitped->ipIcmAli, 2 ) )
      ENDIF
      cXml += XmlTag( "vICMS", NumberXml( jpitped->ipIcmVal, 2 ) )
   ENDIF
   IF jpitped->ipSubVal != 0
      cXml += XmlTag( "modBCST", "4" )
      IF jpitped->ipSubIva != 0
         cXml += XmlTag( "pMVAST", NumberXml( jpitped->ipSubIva, 2 ) )
      ENDIF
      IF jpitped->ipSubRed != 0
         cXml += XmlTag( "pRedBCST", NumberXml( jpitped->ipSubRed, 2 ) )
      ENDIF
      IF jpitped->ipSubBas != 0
         cXml += XmlTag( "vBCST", NumberXml( jpitped->ipSubBas, 2 ) )
      ENDIF
      IF jpitped->ipSubAli != 0
         cXml += XmlTag( "pICMSST", NumberXml( jpitped->ipSubAli, 2 ) )
      ENDIF
      cXml += XmlTag( "vICMSST", NumberXml( jpitped->ipSubVal, 2 ) )
   ENDIF
   IF jpitped->ipIcsVal != 0
      cXml += XmlTag( "pCredSN", NumberXml( jpitped->ipIcsAli, 2 ) )
      cXml += XmlTag( "vCredICMSSN", NumberXml( jpitped->ipIcsVal, 2 ) )
   ENDIF
   cXml += [</ICMSSN900>]

   RETURN NIL

Código: Selecionar todos

STATIC FUNCTION NfeBlocoProdutoIcms900( cXml )

   IF SubStr( jpitped->ipIcmCst, 2, 3 ) != "900"
      RETURN NIL
   ENDIF
   cXml += [<ICMSSN900>]
   cXml += XmlTag( "orig", SubStr( jpitped->ipIcmCst, 1, 1 ) )
   cXml += XmlTag( "CSOSN", SubStr( jpitped->ipIcmCst, 2, 3 ) )
   IF jpitped->ipIcmVal != 0
      cXml += XmlTag( "modBC", "3" )
      IF jpitped->ipIcmBas != 0
         cXml += XmlTag( "vBC", jpitped->ipIcmBas )
      ENDIF
      IF jpitped->ipIcmRed != 0
         cXml += XmlTag( "pRedBC", jpitped->ipIcmRed )
      ENDIF
      IF jpitped->ipIcmAli != 0
         cXml += XmlTag( "pICMS", jpitped->ipIcmAli )
      ENDIF
      cXml += XmlTag( "vICMS", jpitped->ipIcmVal )
   ENDIF
   IF jpitped->ipSubVal != 0
      cXml += XmlTag( "modBCST", "4" )
      IF jpitped->ipSubIva != 0
         cXml += XmlTag( "pMVAST", jpitped->ipSubIva )
      ENDIF
      IF jpitped->ipSubRed != 0
         cXml += XmlTag( "pRedBCST", jpitped->ipSubRed )
      ENDIF
      IF jpitped->ipSubBas != 0
         cXml += XmlTag( "vBCST", jpitped->ipSubBas )
      ENDIF
      IF jpitped->ipSubAli != 0
         cXml += XmlTag( "pICMSST", jpitped->ipSubAli )
      ENDIF
      cXml += XmlTag( "vICMSST", jpitped->ipSubVal )
   ENDIF
   IF jpitped->ipIcsVal != 0
      cXml += XmlTag( "pCredSN", jpitped->ipIcsAli )
      cXml += XmlTag( "vCredICMSSN", jpitped->ipIcsVal )
   ENDIF
   cXml += [</ICMSSN900>]

   RETURN NIL
Reduziu dezenas de caracteres só nesse bloco...
Ainda estou mexendo, depois mostro a diferença de tamanho do fonte inteiro
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

Alteração em XmlTag()

Mensagem por JoséQuintas »

Apaguei quase 3.000 caracteres no fonte....
Por isso demorei tanto...
Só de mexer na função XmlTag() reduziu tudo isso.

Pra um fonte de 1.400 linhas, é caractere até demais.
Tudo indica que valeu a pena.
xmlnfe.png
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

Faixa de CEP por UF

Mensagem por JoséQuintas »

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

Validação de IE de Tocantins

Mensagem por JoséQuintas »

Validação da IE de Tocantins corrigida.
Agradecimentos ao Ubiratan.

A página do governo ESTÁ errada.
tocantins.png
Se pegamos os dígitos 1,2,5,6,7,8. isso dá 6 dígitos, e não 8 como mostra a fórmula.
Na prática é pra pegar de 1 a 8, sem exceção.

Comparando isso com o cálculo anterior e IE anterior de 11 dígitos, justamente os dois dígitos que não faziam parte do cálculo foram removidos.
tocantins2.png
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

Atualizações/Alterações

Mensagem por JoséQuintas »

Novidades de hoje:

- Acrescentado endereço de homologação pra manifestação do destinatário de NFE - antes só funcionava em produção

https://github.com/JoseQuintas/sefazcla ... fc0c2be6e3

- Corrigido código de evento de cancelamento por substituição

https://github.com/JoseQuintas/sefazcla ... 5698b322bc
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

Atualizações/Alterações

Mensagem por JoséQuintas »

Quase ia esquecendo...
SP não tem mais horário de verão.

https://github.com/JoseQuintas/sefazcla ... d2bf32f9e5
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

Atualizações/Alterações

Mensagem por JoséQuintas »

Como o pessoal do XHarbour não gosta de facilidade, não usa HBMK2, e -xhb pode atrapalhar a geração da LIB no Harbour.....

Simplifiquei e sofistiquei:
-olib/sefazclass

-hblib
-hbx=sefazclass

$hb_pkg_install.hbm
TANTO FAZ a pasta aonde foi instalada a sefazclass.
Agora, ao compilar a sefazclass, ela é INSTALADA no Harbour como add-ons !!!!

Aqui ao compilar com harbour 3.4 e mingw:

Código: Selecionar todos

d:\harbour\addons\sefazclass\include
d:\harbour\addons\sefazclass\lib
d:\harbour\addons\sefazclass\README.md
d:\harbour\addons\sefazclass\sefazclass.hbc
d:\harbour\addons\sefazclass\sefazclass.hbx
d:\harbour\addons\sefazclass\tests
d:\harbour\addons\sefazclass\include\hb2xhb.ch
d:\harbour\addons\sefazclass\include\sefazclass.ch
d:\harbour\addons\sefazclass\include\sefaz_anpprod.ch
d:\harbour\addons\sefazclass\include\sefaz_capicom.ch
d:\harbour\addons\sefazclass\include\sefaz_cepuf.ch
d:\harbour\addons\sefazclass\include\sefaz_cest.ch
d:\harbour\addons\sefazclass\include\sefaz_cfop.ch
d:\harbour\addons\sefazclass\include\sefaz_cidade.ch
d:\harbour\addons\sefazclass\include\sefaz_cnae.ch
d:\harbour\addons\sefazclass\include\sefaz_icmcst.ch
d:\harbour\addons\sefazclass\include\sefaz_ipicst.ch
d:\harbour\addons\sefazclass\include\sefaz_modfis.ch
d:\harbour\addons\sefazclass\include\sefaz_ncm.ch
d:\harbour\addons\sefazclass\include\sefaz_origem.ch
d:\harbour\addons\sefazclass\include\sefaz_piscst.ch
d:\harbour\addons\sefazclass\include\sefaz_pisenq.ch
d:\harbour\addons\sefazclass\include\sefaz_uf.ch
d:\harbour\addons\sefazclass\include\sefaz_unidade.ch
d:\harbour\addons\sefazclass\lib\win
d:\harbour\addons\sefazclass\lib\win\mingw
d:\harbour\addons\sefazclass\lib\win\mingw\libsefazclass.a
d:\harbour\addons\sefazclass\tests\jpatecnologia.jpg
d:\harbour\addons\sefazclass\tests\test.hbp
d:\harbour\addons\sefazclass\tests\test.prg
A partir daí, só indicar no aplicativo, igual qualquer contribuição do Harbour.

Após gerar a LIB:

cd \harbour\add-ons\sefazclass\tests
hbmk2 test sefazclass.hbc

ou no aplicativo... indicar sefazclass.hbc
simples e prático.

E se digitar hbmk2 -find *
Além do que já se sabe...

Código: Selecionar todos

sefazclass.hbc (instalado):
   atmseguroclass()
   calculadigito()
   capicomassinaxml()
   capicomcertificado()
   capicomescolhecertificado()
   capicominstalapfx()
   capicomremovecertificado()
   chksignature()
   datetimexml()
   datexml()
   dfeemitente()
   dfemodfis()
   dfenumero()
   dfeserie()
   domingodepascoa()
   extenso()
   extensodolar()
   formatcnpj()
   formatnumber()
   hbnfedacte()
   hbnfedaevento()
   hbnfedageral()
   hbnfedamdfe()
   hbnfedanfce()
   hbnfedanfe()
   horarioveraoinicio()
   horarioveraotermino()
   multiplenodetoarray()
   nfepagamentosclass()
   nomemes()
   nomesemana()
   numberxml()
   picnfe()
   procfecha()
   sefazclass()
   sonumeros()
   stringtoxml()
   tercadecarnaval()
   trimxml()
   validcartao()
   validcnhantiga()
   validcnhatual()
   validcnhimpresso()
   validcnpjcpf()
   validgtin()
   validie()
   validpis()
   validrenavam()
   xmldate()
   xmlelement()
   xmlnode()
   xmltag()
   xmltodoc()
   xmltohash()
   xmltostring()
   xmltransform()
   ze_extensodinheiro()
   ze_feriado()
   __HBEXTERN__SEFAZCLASS__()
https://github.com/JoseQuintas/sefazcla ... 19ef804300
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

Atualizações/Alterações

Mensagem por JoséQuintas »

Alteração adicional:
Quando postei, vi no hbx que apareceu FuncFecha(), e não deveria aparecer.
Alterei pra STATIC pra ela não ficar visível externamente, e não causar conflito por ser nome comum.

https://github.com/JoseQuintas/sefazcla ... 47602a6fc8
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

Atualizações/Alterações

Mensagem por JoséQuintas »

Retirada a instalação automática em add-ons, retornei ao método anterior que acho mais eficiente.
Achei a instalação automática limitada.

Lembrando como usar:

Para indicar o uso da lib, no projeto adicionar: sefazclass.hbc

E pra indicar o path:
opção 1: indicar a pasta raiz da lib no projeto
opção 2: acrescentar a pasta em /harbour/bin/hbmk.hbc

Nota:
Só quando apaguei tudo pra configurar do zero é que percebi a diferença.
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

Atualizações/Alterações

Mensagem por JoséQuintas »

Se salvou o projeto em: \AquiTemLib.... indica no hbp.... -L\AquiTemLib

Ou... como o harbour\bin\hbmk.hbc serve como default, adiciona nele libpaths=\AquiTemLib
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/
Responder