Clipper On Line • Ver Tópico - Atualizações/Alterações

Atualizações/Alterações

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

Moderador: Moderadores

 

Alteração em XmlTag()

Mensagempor JoséQuintas » 26 Jul 2019 17:48

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.

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:

   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.

   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.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 11717
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 12 vezes
Mens.Curtidas: 746 vezes

Alteração em XmlTag()

Mensagempor JoséQuintas » 26 Jul 2019 18:14

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

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


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.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 11717
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 12 vezes
Mens.Curtidas: 746 vezes

Alteração em XmlTag()

Mensagempor JoséQuintas » 26 Jul 2019 18:33

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.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 11717
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 12 vezes
Mens.Curtidas: 746 vezes

Faixa de CEP por UF

Mensagempor JoséQuintas » 22 Ago 2019 19:35

José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 11717
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 12 vezes
Mens.Curtidas: 746 vezes

Validação de IE de Tocantins

Mensagempor JoséQuintas » 19 Set 2019 20:34

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.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 11717
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 12 vezes
Mens.Curtidas: 746 vezes

Atualizações/Alterações

Mensagempor JoséQuintas » 20 Set 2019 19:17

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/sefazclass/commit/62a5716bb42f1b4b6c0d5d59955068fc0c2be6e3

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

https://github.com/JoseQuintas/sefazclass/commit/d3893c4d8ed84ec1a0b61c86e72e685698b322bc
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 11717
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 12 vezes
Mens.Curtidas: 746 vezes

Atualizações/Alterações

Mensagempor JoséQuintas » 20 Set 2019 19:55

José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 11717
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 12 vezes
Mens.Curtidas: 746 vezes

Atualizações/Alterações

Mensagempor JoséQuintas » 25 Set 2019 22:56

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:

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

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/sefazclass/commit/18d2e8ccc6421243fc96635baed70219ef804300
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 11717
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 12 vezes
Mens.Curtidas: 746 vezes

Atualizações/Alterações

Mensagempor JoséQuintas » 25 Set 2019 23:08

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/sefazclass/commit/369fc8504d60dd3cfdfe156437e70447602a6fc8
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 11717
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 12 vezes
Mens.Curtidas: 746 vezes

Atualizações/Alterações

Mensagempor JoséQuintas » 29 Set 2019 12:13

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.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 11717
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 12 vezes
Mens.Curtidas: 746 vezes

Atualizações/Alterações

Mensagempor JoséQuintas » 29 Set 2019 14:35

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.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 11717
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 12 vezes
Mens.Curtidas: 746 vezes




Retornar para Projeto hbNFe

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 1 visitante


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
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro