Mais duas partes: cobrança e informações adicionais e demais alterações sugeridas pelo José. Não achei a função stringxml em nenhuma das tuas classes/funções. Poderia disponibilizar para alterar ? obg
/*****************************************************************************
* SISTEMA : ROTINA EVENTUAL *
* PROGRAMA : TESTE_GERAR_XML.PRG *
* OBJETIVO : Gerar Xml de Nfe *
* AUTOR : Marcelo Antonio Lázzaro Carli *
* DATA : 29.09.2016 *
* ULT. ALT.: 03.10.2016 *
*****************************************************************************/
#include "minigui.ch"
#define DOW_DOMINGO 1 /// este define está em ze_xmlfun.prg - postei somente para funcionar
Procedure Main()
REQUEST HB_LANG_PT
HB_LangSelect([PT])
REQUEST HB_CODEPAGE_PT850 &&& PARA INDEXAR CAMPOS ACENTUADOS
HB_SETCODEPAGE([PT850]) &&& PARA INDEXAR CAMPOS ACENTUADOS
Set wrap on
Set talk off
Set date briti &&& data no formato dd/mm/aaaa
Set dele on &&& ignora registros marcados por deleção
Set score off
Set exact on
Set ToolTip on
Setcancel(.F.) &&& evitar cancelar sistema c/ ALT + C
Set cent on &&& ano com 4 dígitos
Set epoch to 2000 &&& ano a partir de 2000
Set excl off &&& abre arquivos em modo compartilhado
Set navigation extended &&& enter no lugar do tab
Set language to portuguese &&& mensagens em português
Set multiple off warning &&& abrir 1 cópia somente
Set browsesync on &&& para o comando browse funcionar ok
Set tooltipstyle balloon &&& para mensagem dos campos em forma de balão
Set menustyle extended &&& padrão é standard, extended estilo office 2007
Set programmaticchange off &&& introduzida na build 1.9.94
define window fTeste_Xml at 0, 0 width 500 height 300 ICON [demo.ico] NOTIFYICON [demo.ico] MAIN title [Gerar Xml de Nfe] NOSIZE NOMAXIMIZE
DEFINE STATUSBAR FONT "Arial" SIZE 9
STATUSITEM [Sistemas] ICON [demo.ico] DEFAULT ACTION MsgInfo([Cliquei no ícone])
KEYBOARD
CLOCK
DATE
END STATUSBAR
define button btn_GerarXml
row 50
col 90
width 120
caption [&Gerar Xml]
action {|| fGeraXml([000000001], [99.999.999/0001-91])}
DEFAULT .t.
end button
on key escape action {|| Thiswindow.Release}
end window
fTeste_Xml.center()
fTeste_Xml.activate()
Return (Nil)
Static Procedure fGeraXml(cNf, cCnpj)
Local cXml:= [], cId:= GetChaveAcesso(cNf, cCnpj, [35], [1])
*** Cria o xml
fCria_Xml(@cXml, cId)
*** Identificação - Tag Ide
fCriaIde(@cXml, [35], [000000001], [Venda mercadoria adquirida ou recebida de terceiros], [0], [1], dtoc(date()), time(), dtoc(date()), time(), [0], [1], [2], [0], [1], [3550308], [1], [])
*** Emitente
fCriaEmitente(@cXml, [99.999.999/0001-91], [2], [NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL], [Loja Teste], [Rua do Sossego], [12345], [Centro], [3550308], [Marília], [SP], [17.533-280], [1058], [Brasil], [(14)3333-3333], [123.123.123.123], [], [], [1])
*** Destinatário
fCriaDestinatario(@cXml, [99.999.999/0001-91], [2], [NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL], [Rua sem Nome], [999999], [Centro], [3550308], [Marília], [SP], [17.507-200], [1058], [Brasil], [(14)9999-99999], [1], [123.456.789.012], [teste@teste.com.br])
*** Transportadora
fCriaTransportadora(@cXml, [1], [ABC-9999], [Transportadora Dora], [12.123.123/0001-99], [SP], 123456, [Caixa], [], 1.20, 1.50)
*** Cobrança
fCriaCobranca(@cXml, { {12345, date() + 30, 10.00}, {12346, date() + 60, 20.00}, {12347, date() + 90, 30.00} })
*** Informações Adicionais
fCriaInformacoes(@cXml, .F., 1, 1, 1, 1, [], [], [Teste observações;], {})
*** Fechamento do Cfe
fCriaFechamento(@cXml)
Return (Nil)
Static Procedure fCria_Xml(cXml, cId)
cXml+= '<NFe xmlns="http://www.portalfiscal.inf.br/nfe">' //+ hb_OsNewLine()
cXml+= '<infNFe versao="3.10" Id="NFe' + cId + '" >' //+ hb_OsNewLine()
Return (Nil)
Static Procedure fCriaFechamento(cXml)
Local nHandle
If Empty(cXml)
Return (Nil)
Endif
cXml+= "</infNFe>"
cXml+= "</NFe>"
If (nHandle:= FCREATE([teste.xml], 0)) == -1
MsgInfo([Não foi possível criar o arquivo rascunho XML], [Erro])
Return (Nil)
Endif
FWRITE(nHandle, cXml)
FCLOSE(nHandle)
Return (Nil)
Static Procedure fCriaIde(cXml, cUf, cNf, cCfop, cIndPag, cSerie, cDataE, cTimeE, cDataS, cTimeS, cTipoNf, cDv, cAmbiente, cIndPres, cIdest, cMunIbged, cFinalidade, cNfrefencia)
If Empty(cXml)
Return (Nil)
Endif
cXml+= "<ide>" // Início da TAG (ide)
cXml+= XmlTag( "cUF" , cUf) // UF do Emitente no caso SP = 35
cXml+= XmlTag( "cNF" , cNf ) // Controle da Nota ou número do pedido
cXml+= XmlTag( "natOp" , cCfop) // Natureza da Operação
cXml+= XmlTag( "indPag", cIndPag ) // Índice de Pagamento
cXml+= XmlTag( "mod" , "55" ) // Modelo NFE=55 (FIXA)
cXml+= XmlTag( "serie" , cSerie ) // Série
cXml+= XmlTag( "nNF" , cNf ) // Número da Nota Fiscal
cXml+= XmlTag( "dhEmi" , DateTimeXml(cDataE, cTimeE)) // Data Emissão Formato yyyy-mm-dd
If !Empty(cDataS)
cXml+= XmlTag( "dhSaiEnt" , DateTimeXml(cDataS, cTimeS)) // Data da Saida da mercadoria
Endif
cXml+= XmlTag( "tpNF", cTipoNf) // Tipo de Emissão da NF
cXml+= XmlTag( "idDest", cIdest) // Identificador de Local de destino da operação (1-Interna;2-Interestadual; 3-Exterior)
cXml+= XmlTag( "cMunFG", cMunIbged ) // IBGE do destinatário
cXml+= XmlTag( "tpImp", "1") // Tipo de Impressão (Paisagem/Retrato) (FIXO)
cXml+= XmlTag( "tpEmis", "1") // Tipo de Emissão (FIXO)
cXml+= XmlTag( "cDV", Right(cDv, 1)) // Dígito da Chave de Acesso
cXml+= XmlTag( "tpAmb" , cAmbiente) // Ambiente de Emissão (Hom./Producao)
cXml+= XmlTag( "finNFe" , cFinalidade ) // NF Complementar
If cAmbiente == [2] // Alteração para Homologação vigente a partir de 01/05/2011
cXml+= XmlTag( "indFinal" , "1") // Indica operação com consumidor final (0 - Não ; 1 - Consumidor Final)
Else
cXml+= XmlTag( "indFinal" , "0") // Indica operação com consumidor final (0 - Não ; 1 - Consumidor Final)
Endif
cXml+= XmlTag( "indPres" , cIndPres) // Indicador de Presença
* cXml+= "<indPres>" + Iif(oPresencial,"1",;
* Iif(GetProperty([f_Generico], [Cb_Finalidade], [Value]) == 2 .or. GetProperty([f_Generico], [Cb_Finalidade], [Value]) == 3, [0], [2])) + "</indPres>" // Indicador de presença do comprador no estabelecimento comercial no momento da
* // operação. (0-Não se aplica (ex.: Nota Fiscal complementar ou de ajuste;1-Operação
* // presencial;2-Não presencial, internet;3-Não presencial, tele-atendimento;4-NFC-e entrega
* // em domicílio;9-Não presencial, outros.
cXml+= XmlTag( "procEmi" , "3") // Fixo
cXml+= XmlTag( "verProc" , "3.10.86") // Versão do XML
If !Empty(cNfrefencia)
cXml+= "<NFref>"
cXml+= XmlTag( "refNFe" , CharRem("/;-:,\.(){}[] ", cNfrefencia))
cXml+= "</NFref>"
Endif
cXml += "</ide>" // Final da TAG (ide)
Return (Nil)
Static Procedure fCriaEmitente(cXml, cCnpj, cAmbiente, cNomeEmit, cFantasiaEmit, cEnderecoEmit, cNumeroEmit, cBairroEmit, cCidadeIbgeEmit, cCidadeEmit, cUfEmit, cCepEmit, cPaisBacenEmit, cPaisEmit, cFoneEmit, cIEEmit, cIMEmit, cCnaeEmit, cRegimeTribEmit)
If Empty(cXml)
Return (Nil)
Endif
cXml+= "<emit>" // Início da TAG (emit)
cXml+= XmlTag( "CNPJ" , SoNumeros(cCnpj)) // CNPJ do Emitente
If cAmbiente == [2] // Alteração para Homologação vigente a partir de 01/05/2011
cXml+= XmlTag( "xNome" , "NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL")
Else
cXml+= XmlTag( "xNome" , AllTrim(fRetiraAcento(cNomeEmit))) // Razão Social emitente
Endif
cXml+= XmlTag( "xFant" , CharRem("/;-:,\.(){}[] ", cFantasiaEmit)) // Nome Fantasia Emitente
cXml+= "<enderEmit>"
cXml+= XmlTag( "xLgr" , AllTrim(fRetiraAcento(cEnderecoEmit))) // Endereço Emitente
cXml+= XmlTag( "nro" , cNumeroEmit) // Número do Endereco do Emitente
cXml+= XmlTag( "xBairro" , AllTrim(fRetiraAcento(cBairroEmit))) // Bairro do Emitente
cXml+= XmlTag( "cMun" , cCidadeIbgeEmit) // Código IBGE do emitente
cXml+= XmlTag( "xMun" , AllTrim(fRetiraAcento(cCidadeEmit))) // Cidade do Emitente
cXml+= XmlTag( "UF" , cUfEmit) // UF do Emitente
cXml+= XmlTag( "CEP" , SoNumeros(cCepEmit)) // CEP do Emitente
cXml+= XmlTag( "cPais" , cPaisBacenEmit) // Código do País emitente
cXml+= XmlTag( "xPais" , cPaisEmit) // País Emitente da NF
cXml+= XmlTag( "fone" , SoNumeros(cFoneEmit)) // Telefone do Emitente
cXml+= "</enderEmit>"
cXml+= XmlTag( "IE" , SoNumeros(cIEEmit)) // Inscrição Estadual do Emitente
If !Empty(cIMEmit) // Não obrigatório
cXml+= XmlTag( "IM" , cIMEmit) // Inscrição Municipal do Emitente
Endif
If !Empty(cCnaeEmit) // Não obrigatório
cXml+= XmlTag( "CNAE" , cCnaeEmit) // CNAE do Emitente
Endif
cXml+= XmlTag( "CRT" , cRegimeTribEmit) // Códigos de Detalhamento do Regime e da Situação TABELA A – Código de Regime Tributário – CRT
// 1 – Simples Nacional
// 2 – Simples Nacional – excesso de sublimite da receita bruta
// 3 – Regime Normal NOTAS EXPLICATIVAS
cXml+= "</emit>" // Final da TAG Emitente
Return (Nil)
Static Procedure fCriaDestinatario(cXml, cCnpjCpfDest, cAmbiente, cNomeDest, cEnderecoDest, cNumeroDest, cBairroDest, cCidadeIbgeDest, cCidadeDest, cUfDest, cCepDest, cPaisBacenDest, cPaisDest, cFoneDest, cTipoIe, cIEDest, cEmail)
If Empty(cXml)
Return (Nil)
Endif
cXml+= "<dest>"
If cUfDest == [EX]
cXml+= "<idEstrangeiro></idEstrangeiro>"
Else
If cAmbiente == [1]
If Len(SoNumeros(cCnpjCpfDest)) == 11 // Pessoa Física - Cpf
cXml+= XmlTag( "CPF" , SoNumeros(cCnpjCpfDest))
Else // Pessoa Jurídica - Cnpj
cXml+= XmlTag( "CNPJ" , SoNumeros(cCnpjCpfDest))
Endif
Endif
Endif
If cAmbiente == [2] // Alteração para Homologação vigente a partir de 01/05/2011
cXml+= XmlTag( "CNPJ" , [99999999000191])
cXml+= XmlTag( "xNome" , [NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL])
Else
cXml+= XmlTag( "xNome" , AllTrim(fRetiraAcento(cNomeDest)))
Endif
cXml+= "<enderDest>"
cXml+= XmlTag( "xLgr" , AllTrim(fRetiraAcento(cEnderecoDest)))
cXml+= XmlTag( "nro" , cNumeroDest)
cXml+= XmlTag( "xBairro" , AllTrim(fRetiraAcento(cBairroDest)))
If cUfDest == [EX] // Importação/Exportação
cXml+= XmlTag( "cMun" , [9999999])
cXml+= XmlTag( "xMun" , [EXTERIOR])
cXml+= XmlTag( "UF" , [EX])
cXml+= XmlTag( "cPais" , cPaisBacenDest)
cXml+= XmlTag( "xPais" , cPaisDest)
Else // Comércio Interno
cXml+= XmlTag( "cMun" , cCidadeIbgeDest)
cXml+= XmlTag( "xMun" , AllTrim(fRetiraAcento(cCidadeDest)))
cXml+= XmlTag( "UF" , cUfDest)
cXml+= XmlTag( "CEP" , SoNumeros(cCepDest))
cXml+= XmlTag( "cPais" , cPaisBacenDest)
cXml+= XmlTag( "xPais" , cPaisDest)
If !Empty(SoNumeros(cFoneDest))
cXml+= XmlTag( "fone" , AllTrim(SoNumeros(cFoneDest)))
Endif
Endif
cXml+= "</enderDest>"
If cAmbiente == [2] // Ambiente de Homologação
cXml+= XmlTag( "indIEDest" , [9])
Else // Ambiente de Produção
cXml+= XmlTag( "indIEDest" , cTipoIe) // 1 = Contribuinte ICMS (informar a IE do destinatário);
// 2 = Contribuinte isento de Inscrição no cadastro de Contribuintes do ICMS;
// 9 = Não Contribuinte, que pode ou não possuir Inscrição Estadual no Cadastro de Contribuintes do ICMS;
If cUfDest == [EX] // Importação/Exportação
cXml+= "</IE>"
Else
cXml+= XmlTag( "IE" , SoNumeros(cIEDest))
Endif
Endif
If !Empty(cEmail)
cXml+= XmlTag( "email" , AllTrim(cEmail))
Endif
cXml+= "</dest>"
Return (Nil)
Static Procedure fCriaTransportadora(cXml, cModFrete, cPlaca, cNomeTrans, cCnpjCpfTrans, cUfTrans, nQteTrans, cEspecie, cCfop, nPesoLiq, nPesoBru)
If Empty(cXml)
Return (Nil)
Endif
cXml+= "<transp>"
cXml+= XmlTag( "modFrete" , cModFrete)
If !Empty(CharRem("/;-:,\.(){}[] ", cPlaca))
cXml+= "<transporta>"
If !Empty(cNomeTrans)
If Len(SoNumeros(cCnpjCpfTrans)) == 11 // Pessoa Física - Cpf
cXml+= XmlTag( "CPF" , SoNumeros(cCnpjCpfTrans))
Else // Pessoa Juridica - Cnpj
cXml+= XmlTag( "CNPJ" , SoNumeros(cCnpjCpfTrans))
Endif
cXml+= XmlTag( "xNome" , AllTrim(fRetiraAcento(cNomeTrans)))
Else
cXml+= XmlTag( "xNome" , [o Proprio])
Endif
cXml+= "</transporta>"
cXml+= "<veicTransp>"
cXml+= XmlTag( "placa" , CharRem("/;-:,\.(){}[] ", cPlaca))
cXml+= XmlTag( "UF" , cUfTrans)
cXml+= "</veicTransp>"
Endif
cXml+= "<vol>" // Informações de Volumes
If !Empty(nQteTrans)
cXml+= XmlTag( "qVol" , NumberXml(nQteTrans, 0))
Endif
If !Empty(cEspecie)
cXml+= XmlTag( "esp" , AllTrim(cEspecie))
Endif
// Remessa Para Industrialização
If SoNumeros(cCfop) $ [6901|5901|5915|6915]
cXml+= "marca></marca>"
Else
If !Empty(nQteTrans)
cXml+= XmlTag( "marca" , [PROPRIA])
Endif
Endif
If !Empty(nQteTrans)
cXml+= XmlTag( "nVol" , [S/N])
Endif
If !Empty(nPesoLiq)
cXml+= XmlTag( "pesoL" , NumberXml(nPesoLiq, 3))
Endif
If !Empty(nPesoBru)
cXml+= XmlTag( "pesoB" , NumberXml(nPesoBru, 3))
Endif
cXml+= "</vol>"
cXml+= "</transp>"
Return (Nil)
Static Procedure fCriaCobranca(cXml, aDupli)
Local i
If Empty(cXml)
Return (Nil)
Endif
If Len(aDupli) > 0
cXml+= "<cobr>"
For i:= 1 to Len(aDupli)
cXml+= "<dup>"
cXml+= XmlTag( "nDup" , NumberXml(aDupli[i, 1], 0))
cXml+= XmlTag( "dVenc" , DateXml(aDupli[i, 2]))
cXml+= XmlTag( "vDup" , NumberXml(aDupli[i, 3], 2))
cXml+= "</dup>"
Next i
cXml+= "</cobr>"
Endif
Return (Nil)
Static Procedure fCriaInformacoes(cXml, lComplementar, nVIcmsSufDest, nVIcmsSufRemet, nVPis, nvCofins, cUfDest, cCodDest, cObs, aDadosExporta)
If Empty(cXml)
Return (Nil)
Endif
hb_Default( @lComplementar, .F. )
hb_Default( @cObs, [])
hb_Default( @aDadosExporta, {})
cXml += "<infAdic>"
If lComplementar // Informações DIFAL
If nVIcmsSufDest > 0
cObs+= "DIFAL para UF destino R$ " + NumberXml(nVIcmsSufDest, 2) + hb_OsNewLine()
EndIf
If nVIcmsSufRemet > 0
cObs+= "DIFAL para UF Origem R$ " + NumberXml(nVIcmsSufRemet, 2) + hb_OsNewLine()
EndIf
If nVPis > 0 // Destaque valor do PIS/COFINS
cObs+= "Valor de PIS para movimento R$ " + NumberXml(nVPis, 2) + hb_OsNewLine()
cObs+= "Valor de COFINS para movimento R$ " + NumberXml(nvCofins, 2) + hb_OsNewLine()
EndIf
If cUfDest # "EX" .and. !Empty(cCodDest)
cObs+= "Cód:" + cCodDest + hb_OsNewLine()
EndIf
EndIf
cObs := StrTran(cObs, hb_OsNewLine(), ";")
cXml += XmlTag( "infAdFisco" , AllTrim(fRetiraAcento(cObs)))
cXml += "</infAdic>"
If Len(aDadosExporta) > 0 // Exportação
cXml += "<exporta>"
cXml += XmlTag( "UFSaidaPais>" , aDadosExporta[1])
cXml += XmlTag( "xLocExporta>" , aDadosExporta[2])
cXml += "</exporta>"
EndIf
Return (Nil)
Static Function GetChaveAcesso(cNF, cCnpj, cUfEmit, cSerie) // Manual cUf + AAMM + CNPJ + Mod + Serie + NrNota + cNF + cDV - Marcelo de Paula 22/06/2016
Local cKey:= cUfEmit /// no caso sp = 35
cKey+= SubStr(Dtoc(date()), 9, 2) + SubStr(Dtoc(date()), 4, 2)
cKey+= SoNumeros(cCnpj)
cKey+= [55] + Padl(cSerie, 3, [0])
cKey+= Padl(cNF, 9, [0])
cKey+= [1]
cKey+= Padl(cNF, 8, [0])
Return (cKey + fDv_nfe(cKey))
Static Function fDv_nfe(cVarchave) // Função para Calculo de Digito - Marcelo de Paula 22/06/2016
Local nCont1:= Len(cVarchave) + 1, nCont2:= x_Cont:= 1, nSoma:= 0, cDigito:= [0]
For x_Cont:= 1 to Len(cVarchave)
nCont1-= 1
nCont2+= 1
If nCont2 == 10
nCont2:= 2
Endif
nSoma+= Val(SubStr(cVarchave, nCont1, 1)) * nCont2
Next
If Mod(nSoma, 11) <= 1
cDigito:= [0]
Else
cDigito:= AllTrim(Str(11 - Mod(nSoma, 11), 10))
Endif
Return(cDigito)
********************* Retira Acentos e Letras de uma String ********************
Static Function fRetiraAcento(cStr)
cStr:= StrTran(cStr, [á], [a]) ; cStr:= StrTran(cStr, [à], [a]) ; cStr:= StrTran(cStr, [â], [a])
cStr:= StrTran(cStr, [ã], [a]) ; cStr:= StrTran(cStr, [Á], [A]) ; cStr:= StrTran(cStr, [À], [A])
cStr:= StrTran(cStr, [Â], [A]) ; cStr:= StrTran(cStr, [Ã], [A]) ; cStr:= StrTran(cStr, [É], [E])
cStr:= StrTran(cStr, [Ê], [E]) ; cStr:= StrTran(cStr, [é], [e]) ; cStr:= StrTran(cStr, [è], [e])
cStr:= StrTran(cStr, [È], [e]) ; cStr:= StrTran(cStr, [ê], [e]) ; cStr:= StrTran(cStr, [í], [i])
cStr:= StrTran(cStr, [ì], [i]) ; cStr:= StrTran(cStr, [Í], [I]) ; cStr:= StrTran(cStr, [Ì], [I])
cStr:= StrTran(cStr, [õ], [o]) ; cStr:= StrTran(cStr, [ô], [o]) ; cStr:= StrTran(cStr, [ó], [o])
cStr:= StrTran(cStr, [ò], [o]) ; cStr:= StrTran(cStr, [ö], [o]) ; cStr:= StrTran(cStr, [Ö], [O])
cStr:= StrTran(cStr, [Ò], [O]) ; cStr:= StrTran(cStr, [Ó], [O]) ; cStr:= StrTran(cStr, [Ô], [O])
cStr:= StrTran(cStr, [Õ], [O]) ; cStr:= StrTran(cStr, [ü], [u]) ; cStr:= StrTran(cStr, [ú], [u])
cStr:= StrTran(cStr, [ù], [u]) ; cStr:= StrTran(cStr, [Ú], [U]) ; cStr:= StrTran(cStr, [Ù], [U])
cStr:= StrTran(cStr, [Ü], [U]) ; cStr:= StrTran(cStr, [ç], [c]) ; cStr:= StrTran(cStr, [Ç], [C])
cStr:= StrTran(cStr, [ÿ], [y]) ; cStr:= StrTran(cStr, [ñ], [n]) ; cStr:= StrTran(cStr, [Ñ], [N])
cStr:= StrTran(cStr, [º], [o.]) ; cStr:= StrTran(cStr, [°], [o.]) ; cStr:= StrTran(cStr, [ª], [a.])
Return (cStr)
********************* Fim da Função Retira Acentos e Letras de uma String *******
FUNCTION XmlTag( cTag, cConteudo ) /// esta função está em ze_xmlfun.prg - postei somente para funcionar
LOCAL cTexto := ""
hb_Default( @cConteudo, "" )
cConteudo := AllTrim( cConteudo )
IF Len( Trim( cConteudo ) ) = 0
cTexto := [<]+ cTag + [/>]
ELSE
cConteudo := AllTrim( cConteudo )
IF Len( cConteudo ) == 0
cConteudo := " "
ENDIF
cTexto := cTexto + [<] + cTag + [>] + cConteudo + [</] + cTag + [>]
ENDIF
RETURN cTexto
FUNCTION DateTimeXml( dDate, cTime, cUF, lUTC ) /// esta função está em ze_xmlfun.prg - postei somente para funcionar
LOCAL cText, lHorarioVerao
hb_Default( @dDate, Date() )
hb_Default( @cTime, Time() )
hb_Default( @cUF, "SP" )
hb_Default( @lUTC, .T. )
lHorarioVerao := ( dDate >= HorarioVeraoInicio( Year( dDate ) ) .AND. dDate <= HorarioVeraoTermino( Year( dDate - 1 ) ) )
cText := Transform( Dtos( dDate ), "@R 9999-99-99" ) + "T" + cTime
DO CASE
CASE ! lUTC ; cText += "" // no UTC
CASE cUF $ "AC" ; cText += "-05:00"
CASE cUF $ "MT,MS" .AND. lHorarioVerao ; cText += "-05:00"
CASE cUF $ "DF,ES,GO,MG,PR,RJ,RS,SC,SP" .AND. lHorarioVerao ; cText += "-04:00"
CASE cUF $ "AM,MT,MS,RO,RR" ; cText += "-04:00"
OTHERWISE ; cText += "-03:00"
ENDCASE
RETURN cText
FUNCTION HorarioVeraoInicio( iAno ) /// esta função está em ze_xmlfun.prg - postei somente para funcionar
LOCAL dPrimeiroDeOutubro, dPrimeiroDomingoDeOutubro, dTerceiroDomingoDeOutubro
dPrimeiroDeOutubro := Stod( StrZero( iAno, 4 ) + "1001" )
dPrimeiroDomingoDeOutubro := dPrimeiroDeOutubro + iif( Dow( dPrimeiroDeOutubro ) == DOW_DOMINGO, 0, ( 7 - Dow( dPrimeiroDeOutubro ) + 1 ) )
dTerceiroDomingoDeOutubro := dPrimeiroDomingoDeOutubro + 14
RETURN dTerceiroDomingoDeOutubro
FUNCTION DomingoDePascoa( iAno ) /// esta função está em ze_xmlfun.prg - postei somente para funcionar
LOCAL iA, iB, iC, iD, iE, iF, iG, iH, iI, iK, iL, iM, iMes, iDia
iA := iAno % 19
iB := Int( iAno / 100 )
iC := iAno % 100
iD := Int( iB / 4 )
iE := iB % 4
iF := Int( ( iB + 8 ) / 25 )
iG := Int( ( iB - iF + 1 ) / 3 )
iH := ( 19 * iA + iB - iD - iG + 15 ) % 30
iI := Int( iC / 4 )
iK := iC % 4
iL := ( 32 + 2 * iE + 2 * iI - iH - iK ) % 7
iM := Int( ( iA + 11 * iH + 22 * iL) / 451 )
iMes := Int( ( iH + iL - 7 * iM + 114 ) / 31 )
iDia := ( ( iH + iL - 7 * iM + 114 ) % 31 ) + 1
RETURN Stod( StrZero( iAno, 4 ) + StrZero( iMes, 2 ) + StrZero( iDia, 2 ) )
FUNCTION TercaDeCarnaval( iAno ) /// esta função está em ze_xmlfun.prg - postei somente para funcionar
RETURN DomingoDePascoa( iAno ) - 47
FUNCTION HorarioVeraoTermino( iAno ) /// esta função está em ze_xmlfun.prg - postei somente para funcionar
LOCAL dPrimeiroDeFevereiro, dPrimeiroDomingoDeFevereiro, dTerceiroDomingoDeFevereiro
dPrimeiroDeFevereiro := Stod( StrZero( iAno + 1, 4 ) + "0201" )
dPrimeiroDomingoDeFevereiro := dPrimeiroDeFevereiro + iif( Dow( dPrimeiroDeFevereiro ) == DOW_DOMINGO, 0, ( 7 - Dow( dPrimeiroDeFevereiro ) + 1 ) )
dTerceiroDomingoDeFevereiro := dPrimeiroDomingoDeFevereiro + 14
IF dTerceiroDomingoDeFevereiro == TercaDeCarnaval( iAno + 1 ) - 2 /* nao pode ser domingo de carnaval */
dTerceiroDomingoDeFevereiro += 7
ENDIF
RETURN dTerceiroDomingoDeFevereiro
FUNCTION NumberXml( nValue, nDecimals ) /// esta função está em ze_xmlfun.prg - postei somente para funcionar
hb_Default( @nDecimals, 0 )
RETURN Ltrim( Str( nValue, 16, nDecimals ) )
FUNCTION DateXml( dDate ) /// esta função está em ze_xmlfun.prg - postei somente para funcionar
RETURN Transform( Dtos( dDate ), "@R 9999-99-99" )
FUNCTION SoNumeros( cTxt )/// esta função está em ze_xmlfun.prg - postei somente para funcionar
LOCAL cSoNumeros := "", cChar
FOR EACH cChar IN cTxt
IF cChar $ "0123456789"
cSoNumeros += cChar
ENDIF
NEXT
RETURN cSoNumeros