Classe para gerar nfe/nfce

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

Moderador: Moderadores

malcarli
Usuário Nível 3
Usuário Nível 3
Mensagens: 239
Registrado em: 20 Ago 2015 18:14
Localização: marilia/sp

Classe para gerar nfe/nfce

Mensagem por malcarli »

Bom dia devs, estou desenvolvendo uma classe para gerar xml. Não terminei ainda mas está funcionando parcialmente. Vou postar aqui para que quiser usar, e alterar fique a vontade. Somente poste as atualizações aqui para que todos possam usufruir. Sei que logo, irá ser atualizada a legislação com muitas mudanças, então resolvi "separar" em métodos para ficar mais fácil a manutenção.

para usar é simples:

Código: Selecionar todos


oXml:= Malc_GeraXml():New()

   *** cria o xml
   oXml:cNf      := GetProperty([form_GNFEXML], [p_nrnf], [Value])
   oXml:cUf      := parametrosiniciais->ceibge
   oXml:cCnpj    := parametrosiniciais->cgc
   oXml:cNrdoc   := GetProperty([form_GNFEXML], [p_NRDoc], [Value])
   oXml:cSerie   := GetProperty([form_GNFEXML], [p_serie], [Value])
   oXml:cModelo  := cVarModelo
   oXml:cAmbiente:= Str(parametrosiniciais->TPANFE, 1)

   oXml:fCria_Xml()

 Identificação - Tag Ide
   oXml:cNatop   := GetProperty([form_GNFEXML], [p_Natureza], [Value])
   oXml:dDatae   := GetProperty([form_GNFEXML], [p_dtemis], [Value])
   oXml:cTimee   := GetProperty([form_GNFEXML], [p_hsaient], [Value])
   oXml:dDatas   := GetProperty([form_GNFEXML], [p_dtemis], [Value])
   oXml:cTimes   := GetProperty([form_GNFEXML], [p_hsaient], [Value])
   oXml:cTpnf    := GetProperty([form_GNFEXML], [p_TIPO], [Value])
   oXml:cIdest   := Hb_Ntos(GetProperty([form_GNFEXML], [p_TPOPER], [Value]))
   oXml:cMunfg   := parametrosiniciais->CmIbge
   oXml:cFinnfe  := SubStr(GetProperty([form_GNFEXML], [p_FINALIDADE], [DisplayValue]), 1, 1)
   oXml:cIndfinal:= Str(GetProperty([form_GNFEXML], [p_OpConsFinal], [Value]) - 1)
   oXml:cIndpres := Substr(GetProperty([form_GNFEXML], [p_OpConsNaVenda], [DisplayValue]), 1, 1)
   oXml:cRefnfe  := cVarRef1 + hb_OsNewLine() + cVarRef2 + hb_OsNewLine() + cVarRef3 + hb_OsNewLine() + cVarRef4 + hb_OsNewLine() + cVarRef5 + hb_OsNewLine() + cVarRef6 + hb_OsNewLine() + cVarRef7 + hb_OsNewLine() + cVarRef8 + hb_OsNewLine() + cVarRef9 + hb_OsNewLine() + cVarRef10 + hb_OsNewLine() + cVarRef11 + hb_OsNewLine() + cVarRef12 + hb_OsNewLine() + cVarRef13 + hb_OsNewLine() + cVarRef14

   oXml:fCria_Ide()
Att.

Marcelo A. L. Carli
Marília/SP
Capital Nacional do Alimento ®
https://malc-informatica.ueniweb.com
Insta: @malcarli25
Email / Skype: marceloalcarli@gmail.com
Anexos
nfe_classe.prg
(43.95 KiB) Baixado 113 vezes
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Classe para gerar nfe/nfce

Mensagem por JoséQuintas »

Acho melhor não inventar moda.
Gerar XML é realmente cada um gerar o seu, pode inventar INI, TXT, Classe, o raio que o parta, mas cada um sempre gera o seu.

Do jeito básico é lindo.

No momento gerando em MySQL, não gero mais pelo harbour.

Gero em MySQL do jeito que gerava em harbour, ficou até mais fácil.
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

Classe para gerar nfe/nfce

Mensagem por JoséQuintas »

Olhe em MySQL.
Em último caso, cada um faz o SELECT conforme a base de dados.
Não precisa nem converter número nenhum.

Código: Selecionar todos

CREATE PROCEDURE ze_XmlNfeTotais( nIdNotFis INT(11), INOUT cEndXml TEXT )

BEGIN

DECLARE cThisXml TEXT CHARSET latin1;
DECLARE nIcmBas, nIcmVal, nSubBas, nSubVal, nValPro, nValFre, nValSeg DECIMAL(16,2);
DECLARE nValDes, nIIVal, nPisVal, nCofVal, nValOut, nImpVal, nValNot  DECIMAL(16,2);
DECLARE nIpiVal, nDifValf, nMonoBas, nDifVali, nMonoAliq DECIMAL(16,2);
DECLARE nComplementar INT(11);
DECLARE dData DATE;

SET cThisXml := '';
SET nMonoAliq := 1.1200;

SELECT NFICMBAS, NFICMVAL, NFSUBBAS, NFSUBVAL, NFVALPRO, NFVALFRE,
   NFVALSEG, NFVALDES, NFIIVAL, NFIPIVAL, NFPISVAL, NFCOFVAL, NFVALOUT + NFVALEXT,
   NFIMPVAL, NFVALNOT, COALESCE( SUM( IPDIFVALF ), 0.00 ), COALESCE( SUM( IPDIFVALI ), 0.00 ),
   SUM( IF( NFCFOP = '1.604' OR INSTR( IENOME, ' DE ICMS' ) != 0, 1, 0 ) ),
   SUM( IF( IENOME LIKE '%LEO DIESEL%', IPQTDE, 0 ) ), NFDATEMI
FROM JPNOTFIS
LEFT JOIN JPPEDIDO ON JPPEDIDO.IDPEDIDO = JPNOTFIS.NFPEDIDO
LEFT JOIN JPITPED ON JPITPED.IPPEDIDO = JPPEDIDO.IDPEDIDO
LEFT JOIN JPITEM ON JPITEM.IDPRODUTO = JPITPED.IPPRODUTO
WHERE IDNOTFIS = nIdNotFis
INTO nIcmBas, nIcmVal, nSubBas, nSubVal, nValPro, nValFre, nValSeg, nValDes, nIIVal, nIpiVal,
   nPisVal, nCofVal, nValOut, nImpVal, nValNot, nDifValf, nDifVali, nComplementar, nMonoBas,
   dData ;

SET cThisXml := CONCAT( cThisXml,
   '<total>',
   '<ICMSTot>',
   ze_XmlTag( 'vBC',          nIcmBas ),
   ze_XmlTag( 'vICMS',        nIcmVal ),
   ze_XmlTag( 'vICMSDeson',   '0.00' ),
   ze_XmlTag( 'vFCPUFDest',   nDifValf ),
   ze_XmlTag( 'vICMSUFDest',  nDifVali ),
   ze_XmlTag( 'vICMSUFRemet', '0.00' ),
   ze_XmlTag( 'vFCP', '0.00' ),
   ze_XmlTag( 'vBCST',        nSubBas ),
   ze_XmlTag( 'vST',          nSubVal ),
   ze_XmlTag( 'vFCPST', '0.00' ),
   ze_XmlTag( 'vFCPSTRet', '0.00' ),
   IF(  nMonoBas = 0, '',
      CONCAT( ze_XmlTag( 'qBCMonoRet', nMonoBas ),
              ze_XmlTag( 'vICMSMonoRet', ROUND( nMonoBas * nMonoAliq, 2 ) ) ) ),
   ze_XmlTag( 'vProd',        IF( nComplementar = 1, '0.00', nValPro ) ),
   ze_XmlTag( 'vFrete',       nValFre ),
   ze_XmlTag( 'vSeg',         nValSeg ),
   ze_XmlTag( 'vDesc',        nValDes ),
   ze_XmlTag( 'vII',          nIIVal ),
   ze_XmlTag( 'vIPI',         nIpiVal ),
   ze_XmlTag( 'vIPIDevol', '0.00' ),
   ze_XmlTag( 'vPIS',         nPisVal ),
   ze_XmlTag( 'vCOFINS',      nCofVal ),
   ze_XmlTag( 'vOutro',       nValOut ),
   ze_XmlTag( 'vNF',          IF( nComplementar = 1, '0.00', nValNot ) ),
   IF( nImpVal = 0, '', ze_XmlTag( 'vTotTrib',  nImpVal ) ),
   '</ICMSTot>',
   '</total>' );

SET cEndXml := CONCAT( cEndXml, cThisXml );

END
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

Classe para gerar nfe/nfce

Mensagem por JoséQuintas »

A base de tudo, ze_xmlTag()

Código: Selecionar todos

CREATE FUNCTION ze_XmlTag( cTag TEXT  CHARSET latin1, cValue TEXT )
RETURNS TEXT CHARSET latin1

BEGIN

DECLARE cXml TEXT CHARSET latin1 ;

SET cXml := '';

IF LENGTH( TRIM( cValue ) ) = 0 THEN
   SET cXml := CONCAT( '<', cTag, '/>' );
ELSE
   SET cXml := CONCAT( '<', cTag, '>', cValue, '</', cTag, '>' );
END IF;

RETURN cXml;

END
é o básico:

Código: Selecionar todos

[campo]valor[/campo]
se vazio

Código: Selecionar todos

[campo/]
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

Classe para gerar nfe/nfce

Mensagem por JoséQuintas »

Pior que é mesmo, pense bem nisto:

Código: Selecionar todos


SET cThisXml := CONCAT( cThisXml,
   '<total>',
   '<ICMSTot>',
   ze_XmlTag( 'vBC',          nIcmBas ),
   ze_XmlTag( 'vICMS',        nIcmVal ),
   ze_XmlTag( 'vICMSDeson',   '0.00' ),
   ze_XmlTag( 'vFCPUFDest',   nDifValf ),
   ze_XmlTag( 'vICMSUFDest',  nDifVali ),
   ze_XmlTag( 'vICMSUFRemet', '0.00' ),
   ze_XmlTag( 'vFCP', '0.00' ),
   ze_XmlTag( 'vBCST',        nSubBas ),
   ze_XmlTag( 'vST',          nSubVal ),
   ze_XmlTag( 'vFCPST', '0.00' ),
   ze_XmlTag( 'vFCPSTRet', '0.00' ),
   IF(  nMonoBas = 0, '',
      CONCAT( ze_XmlTag( 'qBCMonoRet', nMonoBas ),
              ze_XmlTag( 'vICMSMonoRet', ROUND( nMonoBas * nMonoAliq, 2 ) ) ) ),
   ze_XmlTag( 'vProd',        IF( nComplementar = 1, '0.00', nValPro ) ),
   ze_XmlTag( 'vFrete',       nValFre ),
   ze_XmlTag( 'vSeg',         nValSeg ),
   ze_XmlTag( 'vDesc',        nValDes ),
   ze_XmlTag( 'vII',          nIIVal ),
   ze_XmlTag( 'vIPI',         nIpiVal ),
   ze_XmlTag( 'vIPIDevol', '0.00' ),
   ze_XmlTag( 'vPIS',         nPisVal ),
   ze_XmlTag( 'vCOFINS',      nCofVal ),
   ze_XmlTag( 'vOutro',       nValOut ),
   ze_XmlTag( 'vNF',          IF( nComplementar = 1, '0.00', nValNot ) ),
   IF( nImpVal = 0, '', ze_XmlTag( 'vTotTrib',  nImpVal ) ),
   '</ICMSTot>',
   '</total>' );

SET cEndXml := CONCAT( cEndXml, cThisXml );
Isso gera o bloco de totais, diretamente o XML.
Se criar classe, função, txt, ini, etc. é só inventar um jeito de passar os parâmetros.
A rotina intermediária só vai servir pra passar parâmetros.
O usuário deixa de aprender XML, pra ter o mesmo trabalho de usar todos os parâmetros.

Gerar INI, TXT, função, classe, etc......
É só pedir pra ter problemas, pra usuários ficarem pedindo pra alterar, atualizar, etc. etc. etc.
Já mostrando como gerar XML direto, cada um consegue se virar, não depende de ninguém, nem de atualização, nem nada.

No MySQL é bom criar stored procedure/function pequenas, por bloco, assim melhor pra debug, que não existe no MySQL.

Note que é a ordem exata do XML, é só olhar o XML e comparar com a rotina, é tudo de bom pra conferir.
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

Classe para gerar nfe/nfce

Mensagem por JoséQuintas »

Bloco emitente

Código: Selecionar todos

CREATE PROCEDURE ze_XmlNfeEmitente( nIdEmpresa INT(11), INOUT cEndXml TEXT )

BEGIN

DECLARE nTriEmp INT(11);
DECLARE cIbge VARCHAR(10);
DECLARE cNome, cCnpj, cInsEst, cEndereco VARCHAR(100);
DECLARE cBairro, cCidade, cUF, cTelefone, cCep VARCHAR(100);
DECLARE cThisXml TEXT CHARSET latin1;
DECLARE cAmbiente CHAR(1) DEFAULT '1';

SET cThisXml := '';

SELECT SEFAZNFEAMBIENTE
   FROM JPTABSEFAZ
INTO cAmbiente;

SELECT
   COALESCE( EMNOME, '' ),
   ze_SoNumero( COALESCE( EMCNPJ, '' ) ),
   ze_SoNumero( COALESCE( EMINSEST, '' ) ),
   COALESCE( EMENDERECO, '' ),
   COALESCE( EMBAIRRO, '' ),
   COALESCE( EMCIDADE, '' ),
   COALESCE( EMUF, '' ),
   COALESCE( EMTELEFONE, '' ),
   LPAD( ze_SoNumero( COALESCE( EMCEP, '' ) ), 8, '0' ),
   COALESCE( CIIBGE, '' ),
   COALESCE( EMTRIEMP, 0 )
FROM JPEMPRESA
LEFT JOIN JPTABCIDADE ON CIUF = EMUF AND LEFT( CINOME, 20 ) = LEFT( EMCIDADE, 20 )
WHERE IDEMPRESA = nIdEmpresa
INTO cNome, cCnpj, cInsEst, cEndereco, cBairro, cCidade, cUF, cTelefone, cCep, cIbge, nTriEmp;

SET cEndereco := REPLACE( cEndereco, '&', 'E' );
SET cNome     := REPLACE( cNome, '&', 'E' );
SET cBairro   := REPLACE( cBairro, '&', 'E' );
SET cCidade   := REPLACE( cCidade, '&', 'E' );
SET cTelefone := RIGHT( ze_SoNumero( cTelefone ), 10 );
IF LENGTH( cEndereco ) < 2 THEN
   SET cEndereco := CONCAT( cEndereco, '..' );
END IF;
IF LENGTH( cBairro ) < 2 THEN
   SET cBairro := CONCAT( cBairro, '..' );
END IF;

SET cThisXml := CONCAT( cThisXml,
   '<emit>',
   ze_XmlTag( IF( LENGTH( cCnpj ) = 14, 'CNPJ', 'CPF' ), cCnpj ),
   ze_XmlTag( 'xNome', IF( cAmbiente = '1', cNome, 'NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL' ) ),
   '<enderEmit>',
   ze_XmlTag( "xLgr", cEndereco ),
   ze_XmlTag( "nro", "." ),
   ze_XmlTag( "xBairro", cBairro ),
   ze_XmlTag( "cMun", cIbge ),
   ze_XmlTag( "xMun", cCidade ),
   ze_XmlTag( "UF", cUF ),
   ze_XmlTag( "CEP", cCep ),
   ze_XmlTag( "cPais", "1058" ),
   ze_XmlTag( "xPais", "BRASIL" ),
   ze_XmlTag( "fone", cTelefone ),
   '</enderEmit>',
   ze_XmlTag( "IE", cInsEst ),
   ze_XmlTag( "CRT", CONCAT( nTriEmp, '' ) ),
   '</emit>' );

SET cEndXml := CONCAT( cEndXml, cThisXml );

END
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

Classe para gerar nfe/nfce

Mensagem por JoséQuintas »

Bloco destinatário

Código: Selecionar todos

CREATE PROCEDURE ze_XmlNfeDestinatario( nIdNotFis INT(11), INOUT cEndXml TEXT )

BEGIN

DECLARE cIbge VARCHAR(10);
DECLARE cNome, cCnpj, cInsEst, cEndereco, cNumero, cCompl VARCHAR(100);
DECLARE cBairro, cCidade, cUF, cTelefone, cCep VARCHAR(100);
DECLARE cThisXml TEXT CHARSET latin1;
DECLARE cAmbiente CHAR(1) DEFAULT '1';

SET cThisXml := '';

SELECT SEFAZNFEAMBIENTE
   FROM JPTABSEFAZ
INTO cAmbiente;

SELECT
   COALESCE( CDNOME, '' ),
   ze_SoNumero( COALESCE( CDCNPJ, '' ) ),
   ze_SoNumero( COALESCE( CDINSEST, '' ) ),
   COALESCE( CDENDERECO, '' ),
   COALESCE( CDNUMERO, '' ),
   COALESCE( CDCOMPL, '' ),
   COALESCE( CDBAIRRO, '' ),
   COALESCE( CDCIDADE, '' ),
   COALESCE( CDUF, '' ),
   COALESCE( CDTELEFONE, '' ),
   LPAD( ze_SoNumero( COALESCE( CDCEP, '' ) ), 8, '0' ),
   COALESCE( CIIBGE, '' )
FROM JPCADASTRO
LEFT JOIN JPTABCIDADE ON CIUF = CDUF AND LEFT( CINOME, 20 ) = LEFT( CDCIDADE, 20 )
WHERE IDCADASTRO = ( SELECT COALESCE( NFCADASTRO, 0 ) FROM JPNOTFIS WHERE IDNOTFIS = nIdNotFis )
INTO cNome, cCnpj, cInsEst, cEndereco, cNumero, cCompl, cBairro,
   cCidade, cUF, cTelefone, cCep, cIbge;

SET cEndereco := REPLACE( cEndereco, '&', 'E' );
SET cNome     := REPLACE( cNome, '&', 'E' );
SET cBairro   := REPLACE( cBairro, '&', 'E' );
SET cCidade   := REPLACE( cCidade, '&', 'E' );
IF LENGTH( cEndereco ) < 2 THEN
   SET cEndereco := CONCAT( cEndereco, '..' );
END IF;
IF LENGTH( cBairro ) < 2 THEN
   SET cBairro := CONCAT( cBairro, '..' );
END IF;
IF LENGTH( cNumero ) = 0 THEN
   SET cNumero := '.';
END IF;

SET cThisXml := CONCAT( cThisXml,
   '<dest>',
   IF( cUF = 'EX', ze_XmlTag( 'idEstrangeiro', '' ),
      ze_XmlTag( IF( LENGTH( cCnpj ) = 14, 'CNPJ', 'CPF' ), cCnpj ) ),
      ze_XmlTag( 'xNome', IF( cAmbiente = '1', cNome, 'NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL' ) ),
      '<enderDest>',
      ze_XmlTag( 'xLgr', cEndereco ),
      ze_XmlTag( 'nro', cNumero ),
      IF( LENGTH( cCompl ) = 0, '', ze_XmlTag( 'xCpl', cCompl ) ),
      ze_XmlTag( 'xBairro', cBairro ),
      ze_XmlTag( 'cMun', IF( cUF = 'EX', '9999999', cIbge ) ),
      ze_XmlTag( 'xMun', cCidade ),
      ze_XmlTag( 'UF', cUF ),
      ze_XmlTag( 'CEP', cCep ),
      ze_XmlTag( 'cPais', IF( cUF = 'EX', RIGHT( cIbge, 4 ), '1058' ) ),
      ze_XmlTag( 'xPais', IF( cUF = 'EX', cCidade, 'BRASIL' ) ),
      '</enderDest>',
      IF( 1 = 1, '', CONCAT( '<fone>', ze_SoNumero( cTelefone ), '</fone>' ) ),
      ze_XmlTag( 'indIEDest', IF( LENGTH( cInsEst ) = 0, '9', '1' ) ),
      IF( LENGTH( cInsEst ) = 0, '', ze_XmlTag( 'IE', cInsEst ) ),
      '</dest>' );

   SET cEndXml := CONCAT( cEndXml, cThisXml );

END
No geral, parece que nem precisa função, o "grosso" é mesmo pegar da base de cada um.

Lembrando:
CONCAT() é concatenar, é juntar tudo como string.
IF() é o mesmo que iif() do harbour
LENGTH() é o mesmo que Len()
REPLACE() é o mesmo que StrTran()
COALESCE() ainda não tem no harbour, é como um iif( x == Nil, a,b) mas usando uma lista e não um único valor
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

Classe para gerar nfe/nfce

Mensagem por JoséQuintas »

Complemento:

Alterei nesta semana de PROCEDURE pra FUNCTION.
Como function, retornava cThisXML.

Como procedure, recebe cEndXML como INOUT (o mesmo que por referência), e já acrescenta no cEndXml
cThisXml -> este xml -> é o xml sendo tratado na rotina
cEndXml -> xml fim -> é o xml que vai acumulando tudo

No computador deixo tudo isso em arquivos xxx.sql
Ao fazer upload pra internet do EXE, já faz upload de todos os arquivos xxx.sql com data mais nova.

No cliente, ao atualizar, atualiza tudo no MySQL.
Confere procedure/function contra os SQL que foram baixados.

Simples e prático.
Apenas um arquivo JPBINARY contendo resources de uso e/ou atualização, com data/hora
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/
malcarli
Usuário Nível 3
Usuário Nível 3
Mensagens: 239
Registrado em: 20 Ago 2015 18:14
Localização: marilia/sp

Classe para gerar nfe/nfce

Mensagem por malcarli »

Mestre seus exemplos ajudaram a ajustar mais a classe kk. Obg

Segue terminada e aberto a críticas, sugestões e colaboração. Se alterarem qq trecho, comente para ajudar a todos. obg

Att.

Marcelo A. L. Carli
Marília/SP
Capital Nacional do Alimento ®
https://malc-informatica.ueniweb.com
Insta: @malcarli25
Email / Skype: marceloalcarli@gmail.com
Anexos
nfe_classe.prg
(43.9 KiB) Baixado 110 vezes
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Classe para gerar nfe/nfce

Mensagem por JoséQuintas »

malcarli escreveu:Mestre seus exemplos ajudaram a ajustar mais a classe kk. Obg
Legal.
Na sua rotina também tem coisa que ainda não precisei.
Em nota eletrônica vai acabar sempre aparecendo novidade nas rotinas de cada um.
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

Classe para gerar nfe/nfce

Mensagem por JoséQuintas »

Veja se já preparou pra QRCode versão 3, e também pra CNPJ alfanumérico.
Eu ainda vou alterar o QRCode, estava esquecendo disso.
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/
malcarli
Usuário Nível 3
Usuário Nível 3
Mensagens: 239
Registrado em: 20 Ago 2015 18:14
Localização: marilia/sp

Classe para gerar nfe/nfce

Mensagem por malcarli »

Bom dia mestre Quintas, poderia postar o código de seu programa (igual postou do emitente e do destinatário) com as tags de combustível? pois ai já incluiria na classe. Se tiver um xml de exemplo e puder enviar em privado agradeço. Obg

Att.

Marcelo A. L. Carli
Marília/SP
Capital Nacional do Alimento ®
https://malc-informatica.ueniweb.com
Insta: @malcarli25
Email / Skype: marceloalcarli@gmail.com
malcarli
Usuário Nível 3
Usuário Nível 3
Mensagens: 239
Registrado em: 20 Ago 2015 18:14
Localização: marilia/sp

Classe para gerar nfe/nfce

Mensagem por malcarli »

acabei de deixar todas as tags do tamanho máximo que consta no manual e inclui as funções e prgs para poder compilar e testar. Testei em produção e homologação fazendo uma nota simples e autorizou ambas. Agora vou partir para as implementações enviadas.

Att.

Marcelo A. L. Carli
Marília/SP
Capital Nacional do Alimento ®
https://malc-informatica.ueniweb.com
Insta: @malcarli25
Email / Skype: marceloalcarli@gmail.com
Anexos
nfe_classe.prg
(57.53 KiB) Baixado 110 vezes
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Classe para gerar nfe/nfce

Mensagem por JoséQuintas »

A parte de combustível varia conforme produto.
Apenas modelo básico.

Código: Selecionar todos

      SET cThisXml := CONCAT(
         '<comb>',
         ze_XmlTag( "cProdANP", cAnp ),
         ze_XmlTag( "descANP", cAnpNome ),
         ze_XmlTag( "UFCons", cUF ),
         ze_XmlTag( "pBio", "15.00" ), 
         '</comb>' );
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/
malcarli
Usuário Nível 3
Usuário Nível 3
Mensagens: 239
Registrado em: 20 Ago 2015 18:14
Localização: marilia/sp

Classe para gerar nfe/nfce

Mensagem por malcarli »

obg. Já implementarei.

Na classe que estamos desenvolvendo, as tags estão limitadas e consistidas pelo valores contidos no manual, usando a função xmltag().

Sei que é IMPOSSÍVEL de acontecer, mas caso por algum discuido de um dev, enviar um valor negativo para a mesma irá aceitar.

Código: Selecionar todos

<vII>-1.000000</vII>
Uma simples sugestão seria alterar a mesma colocando um teste básico:

Código: Selecionar todos

FUNCTION NumberXml( nValue, nDecimals )

   hb_Default( @nDecimals, 0 )
 
   IF nValue < 0
      nValue:= 0
   ENDIF

   RETURN Ltrim( Str( nValue, 16, nDecimals ) )

Att.

Marcelo A. L. Carli
Marília/SP
Capital Nacional do Alimento ®
https://malc-informatica.ueniweb.com
Insta: @malcarli25
Email / Skype: marceloalcarli@gmail.com
Responder