/*****************************************************************************
 * SISTEMA  : TCONTROL                                                       *
 * PROGRAMA : NFE_CLASSE.PRG   		                                     *
 * OBJETIVO : CLASSE PARA GERAÇÃO DE XML DE DFE'S                            *
 * AUTOR    : Marcelo Antonio Lázzaro Carli                                  *
 * ALTERADO :                                                                *
 * DATA     : 10.06.2025                                                     *
 * ULT. ALT.: 13.06.2025                                                     *
 *****************************************************************************/
#include <hbclass.ch>

CLASS Malc_GeraXml
   // Configurações iniciais básicas
   VAR cXml            INIT []
   VAR cUf             INIT [35] // SP
   VAR cId             INIT []
   VAR cNf             INIT []
   VAR cCnpj           INIT []   // Cnpj/Cpf Emitente
   VAR cAmbiente       INIT [2]  // Ambiente de Homologação 
   VAR cSerie          INIT [1]
   VAR cModelo         INIT [65] // Nfe
   VAR cNrdoc          INIT []

   // Tag ide
   VAR cNatop          INIT []
   VAR cMunfg          INIT []
   VAR dDataE          INIT Date()
   VAR cTimeE          INIT Time()
   VAR dDataS          INIT Date()
   VAR cTimeS          INIT Time()
   VAR cTpnf           INIT [1]        // 0 - entrada, 1 - saída
   VAR cIdest          INIT [1]        // 1 - Interna, 2 - Interestadual, 3 - Exterior
   VAR cTpImp          INIT [1]        // Tipo de Impressão    1 - Retrato / 2 - Paisagem
   VAR cTpEmis         INIT [1]        // Tipo de Emissão      1 - Normal  / 2 - Contingência
   VAR cFinnfe         INIT [1]        // 1 = NF-e normal; 2 = NF-e complementar; 3 = NF-e de ajuste; 4 = Devolução de mercadoria.
   VAR cIndfinal       INIT [1]        // Indica operação com consumidor final (0 - Não ; 1 - Consumidor Final)
   VAR cIndpres        INIT [1]        // Indicador de Presença do comprador no estabelecimento comercial no momento da operação.
   VAR cProcemi        INIT [0]        // 0 - emissão de NF-e com aplicativo do contribuinte
   VAR cVerproc        INIT [4.00_B30]
   VAR cRefnfe         INIT []
   VAR cCepe           INIT []  

   // Tag emit
   VAR cXnomee         INIT []
   VAR cXfant          INIT []
   VAR cXlgre          INIT []
   VAR cNroe           INIT []
   VAR cXcple          INIT []
   VAR cXBairroe       INIT []
   VAR cXmune          INIT []
   VAR cUfe            INIT []
   VAR cCepe           INIT []
   VAR cPais           INIT [1058]
   VAR cXpaise         INIT [BRASIL]
   VAR cFonee          INIT []
   VAR cIee            INIT []
   VAR cIme            INIT []
   VAR cCnaee          INIT []
   VAR cCrt            INIT []
  
   // Tag dest
   VAR cCnpjd          INIT []
   VAR cXnomed         INIT []
   VAR cXlgrd          INIT []
   VAR cXcpld          INIT []
   VAR cNrod           INIT []
   VAR cXBairrod       INIT []
   VAR cCmund          INIT []
   VAR cXmund          INIT []
   VAR cUfd            INIT []
   VAR cCepd           INIT []
   VAR cPaisd          INIT [1058]
   VAR cXpaisd         INIT [BRASIL]
   VAR cFoned          INIT []
   VAR cIndie          INIT [1]
   VAR cIed            INIT []
   VAR cEmaild         INIT []
   VAR cAutxml         INIT []

   // Tag produto
   VAR nItem           INIT 1
   VAR cProd           INIT []
   VAR cEan            INIT []
   VAR cXprod          INIT []
   VAR cNcm            INIT []
   VAR cCest           INIT []
   VAR cCfOp           INIT []
   VAR cUcom           INIT []
   VAR cQcom           INIT []
   VAR cVuncom         INIT []
   VAR cVprod          INIT []
   VAR cVfrete         INIT []
   VAR cVseg           INIT []
   VAR cVdesc          INIT []
   VAR cVoutro         INIT []
   VAR cIndtot         INIT [1]

   // Tag impostos
   VAR cVtottrib       INIT []

   // Tag responsável técnico
   VAR cRespcnpj       INIT []
   VAR cRespNome       INIT []
   VAR cRespemail      INIT []
   VAR cRespfone       INIT []

   // Tag informações Fisco / Complementar
   VAR lComplementar   INIT .F.
   VAR nVIcmsSufDest   INIT 0
   VAR nVIcmsSufRemet  INIT 0
   VAR cCodDest        INIT []
   VAR cInfcpl         INIT []
   VAR cUfSaidapais    INIT []
   VAR cXlocexporta    INIT []
   VAR cXlocdespacho   INIT []

   // Tag cobrança
   VAR nVliq           INIT 0 /// verificar que aqui será o valor total da nota talvez não precise deste
   VAR aDupli          INIT {}
   VAR cIndPag         INIT [0]
   VAR cTpag           INIT []
   VAR nVpag           INIT 0

   // Tag transp
   VAR cModFrete       INIT []
   VAR cXnomet         INIT []
   VAR cCnpjt          INIT []
   VAR cIet            INIT []
   VAR cXEndert        INIT []
   VAR cXmunt          INIT []
   VAR cUft            INIT []
   VAR cPlaca          INIT []
   VAR cRntc           INIT []
   VAR nQvol           INIT 0
   VAR cEsp            INIT []
   VAR cMarca          INIT []
   VAR cNvol           INIT []
   VAR nPesol          INIT 0
   VAR nPesob          INIT 0
  
   // Tag total
   VAR nVbc            INIT 0
   VAR nVicms          INIT 0
   VAR nVicmsdeson     INIT 0
   VAR nVfcpufdest     INIT 0
   VAR nVicmsufdest    INIT 0
   VAR nVicmsufremet   INIT 0
   VAR nVfcp           INIT 0
   VAR nVbcST          INIT 0
   VAR nVst            INIT 0
   VAR nVfcpst         INIT 0
   VAR nVfcpstret      INIT 0
   VAR nMonoBas        INIT 0
   VAR nMonoAliq       INIT 0
   VAR nVprodt         INIT 0
   VAR nVFretet        INIT 0
   VAR nVseg           INIT 0
   VAR nDesct          INIT 0
   VAR nVii            INIT 0
   VAR nVipi           INIT 0
   VAR nVipidevol      INIT 0
   VAR nVipist         INIT 0
   VAR nVCofinst       INIT 0
   VAR nVOutrot        INIT 0
   VAR nVnf            INIT 0
   VAR nVtottrib       INIT 0

   // Tag Icms
   VAR cOrig           INIT [0]
   VAR cCsticms        INIT []
   VAR nModbc          INIT 3
   VAR nVbc            INIT 0
   VAR nPicms          INIT 0
   VAR nVlicms         INIT 0
   VAR cModbcst        INIT [3]
   VAR nPmvast         INIT 0
   VAR nVbcst          INIT 0
   VAR nPicmst         INIT 0
   VAR nVicmsst        INIT 0
   VAR nPredbc         INIT 0

   // Tag Ipi
   VAR cCEnq           INIT [999]
   VAR cCstipi         INIT [53]
   VAR nVipi           INIT 0
   VAR nVbcipi         INIT 0
   VAR nPipi           INIT 0

   // Tag Pis/Cofins
   VAR cCstPis         INIT [49]
   VAR cCstCofins      INIT [49]
   VAR lCalcPisCofins  INIT .F.
   VAR nBcpis          INIT 0
   VAR nAlPis          INIT 0
   VAR nAlCofins       INIT 0

   METHOD fCria_Xml()          CONSTRUCTOR
   METHOD fCria_Ide()
   METHOD fCria_Emitente()
   METHOD fCria_Destinatario()
   METHOD fCria_Produto() 
   METHOD fCria_ProdutoIcms()
   METHOD fCria_ProdutoIpi()
   METHOD fCria_ProdutoPisCofins()
*  METHOD fCria_ProdExporta()
*  METHOD fCria_ProdVeiculo()
*  METHOD fCria_ProdMedicamento()
*  METHOD fCria_ProdArmamento()
*  METHOD fCria_ProdCombustivel()
   METHOD fCria_Totais()
   METHOD fCria_Transportadora() 
   METHOD fCria_Cobranca()
   METHOD fCria_Informacoes() 
   METHOD fCria_Responsavel()
   METHOD fCria_Fechamento()
ENDCLASS

METHOD fCria_Xml() CLASS Malc_GeraXml
   ::cId:= GetChaveAcesso(::cNf, ::cCnpj, ::cUf, ::cSerie, ::cModelo, ::cNrdoc)

   ::cXml+= '<NFe xmlns="http://www.portalfiscal.inf.br/nfe">'
   ::cXml+= '<infNFe versao="4.00" Id="NFe' + ::cId + '" >'
Return Self

Function GetChaveAcesso(cNF, cCnpj, cUfEmit, cSerie, cModelo, cNrdoc) // usada em nfe_geraxml e nfe_manual
   Local cKey:= Alltrim(cUfEmit)
         cKey+= SubStr(Dtoc(Date()), 9, 2) + SubStr(Dtoc(Date()), 4, 2)
         cKey+= SoNumeroCnpj(cCnpj)
         cKey+= cModelo + Padl(Alltrim(cSerie), 3, [0])
         cKey+= Padl(cNF, 9, [0])
         cKey+= [1]
         cKey+= Padl(cNrdoc, 8, [0])
Return (cKey + CalculaDigito(cKey, [11]))

METHOD fCria_Ide() CLASS Malc_GeraXml
   Local cNumeroChave:= [], nPosicaoLetra:= nProximaChave:= 1

   ::cXml+= "<ide>"                                                                         // Início da TAG (ide)
          ::cXml+= XmlTag( "cUF"    , ::cUf)                                                // UF do Emitente no caso SP = 35
          ::cXml+= XmlTag( "cNF"    , Padl(Alltrim(::cNrdoc), 8, [0]))                      // Controle da Nota ou número do pedido
          ::cXml+= XmlTag( "natOp"  , RetiraAcento(SubStr(::cNatop, 1, 60)))                // Natureza da Operação
          ::cXml+= XmlTag( "mod"    , ::cModelo)                                            // Modelo do Documento Nfe, Nfce....
          ::cXml+= XmlTag( "serie"  , ::cSerie)                                             // Série 
          ::cXml+= XmlTag( "nNF"    , ::cNf)                                                // Número da Nota Fiscal
          ::cXml+= XmlTag( "dhEmi"  , DateTimeXml(::dDataE, ::cTimeE))                      // Data Emissão Formato yyyy-mm-dd

          If !Empty(::dDataS)
             If ::cModelo # [65]
                ::cXml+= XmlTag( "dhSaiEnt" , DateTimeXml(::dDataS, ::cTimeS))              // Data da Saída da mercadoria
             Endif
          Endif 

          ::cXml+= XmlTag( "tpNF"     , Iif(::cTpnf == 2, [0], [1]))        // Tipo de Emissão da NF  0-entrada / 1-saída
          ::cXml+= XmlTag( "idDest"   , ::cIdest)                           // Identificador de Local de destino da operação (1-Interna;2-Interestadual; 3-Exterior)
          ::cXml+= XmlTag( "cMunFG"   , ::cMunfg)                           // IBGE do Emitente
          ::cXml+= XmlTag( "tpImp"    , If(cModelo == [65], [4], ::cTpimp)) // Tipo de Impressão    1-Retrato / 2-Paisagem (FIXO)
          ::cXml+= XmlTag( "tpEmis"   , cTpemis)                            // Tipo de Emissão      1-Normal  / 2-Contingência(FIXO)
          ::cXml+= XmlTag( "cDV"      , Right(::cId, 1))                    // Dígito da Chave de Acesso
          ::cXml+= XmlTag( "tpAmb"    , ::cAmbiente)                        // Ambiente de Emissão  1-Produção/ 2-Homologação
          ::cXml+= XmlTag( "finNFe"   , ::cFinnfe)                          // 1=NF-e normal; 2=NF-e complementar; 3=NF-e de ajuste; 4=Devolução de mercadoria.

          If ::cAmbiente == [2]
             ::cXml+= XmlTag( "indFinal" , [1])                             // Indica operação com consumidor final (0 - Não ; 1 - Consumidor Final)
          Else
             ::cXml+= XmlTag( "indFinal" , ::cIndfinal)                     // Indica operação com consumidor final (0 - Não ; 1 - Consumidor Final)
          Endif
          
          ::cXml+= XmlTag( "indPres"  , ::cIndpres)                         // 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"  , ::cProcemi)                         // 0 - emissão de NF-e com aplicativo do contribuinte;
                                                                            // 1 - emissão de NF-e avulsa pelo Fisco;
                                                                            // 2 - emissão de NF-e avulsa, pelo contribuinte com seu certificado digital, através do site do Fisco;
                                                                            // 3 - emissão NF-e pelo contribuinte com aplicativo fornecido pelo Fisco.

          ::cXml+= XmlTag( "verProc"  , ::cVerproc)                         // Versão do XML

          If !Empty(::cRefnfe)
             Do While nProximaChave < 14 /// máximo de 14 notas 100
                If !Empty(Substr(fRetiraSinal(::cRefnfe), nPosicaoLetra, 1))
                   cNumeroChave+= Substr(fRetiraSinal(::cRefnfe), nPosicaoLetra, 1)
                Endif
                nPosicaoLetra+= 1
                nProximaChave+= 1
                
                If !Empty(cNumeroChave) .and. Len(cNumeroChave) == 44
                   ::cXml+= "<NFref>"
                          ::cXml+= XmlTag( "refNFe" , fRetiraSinal(Alltrim(RetiraAcento(cNumeroChave))))
                   ::cXml+= "</NFref>"
                   cNumeroChave := []
                   nProximaChave:= 1
                Endif
             Enddo
          Endif
   ::cXml+= "</ide>"
Return (Nil)

METHOD fCria_Emitente() CLASS Malc_GeraXml
   ::cXml+= "<emit>"                                                                      // Início da TAG (emit)
          ::cXml+= XmlTag( "CNPJ" , SoNumeroCnpj(::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" , RetiraAcento(::cXnomee))                          // Razão Social emitente
          Endif

          If !Empty(::cXfant)
             ::cXml+= XmlTag( "xFant" , RetiraAcento(::cXfant))                           // Nome Fantasia Emitente
          Endif

          ::cXml+= "<enderEmit>"
                 ::cXml+= XmlTag( "xLgr"    , RetiraAcento(::cXlgre))                     // Endereço Emitente
                 ::cXml+= XmlTag( "nro"     , ::cNroe)                                    // Número do Endereco do Emitente

                 If !Empty(::cXcple)
                    ::cXml+= XmlTag( "xCpl" , ::cXcple)
                 Endif

                 ::cXml+= XmlTag( "xBairro" , RetiraAcento(::cXBairroe))                  // Bairro do Emitente
                 ::cXml+= XmlTag( "cMun"    , ::cMunfg)                                   // Código IBGE do emitente
                 ::cXml+= XmlTag( "xMun"    , RetiraAcento(::cXmune))                     // Cidade do Emitente
	         ::cXml+= XmlTag( "UF"      , ::cUfE)                                     // UF do Emitente
	         ::cXml+= XmlTag( "CEP"     , SoNumero(::cCepe))                          // CEP do Emitente
	         ::cXml+= XmlTag( "cPais"   , ::cPais)                                    // Código do País emitente
	         ::cXml+= XmlTag( "xPais"   , ::cXpaise)                                  // País Emitente da NF

                 If !Empty(SoNumero(::cFonee))
	            ::cXml+= XmlTag( "fone"    , SoNumero(::cFonee))                      // Telefone do Emitente
                 Endif
          ::cXml+= "</enderEmit>"
          
          ::cXml+= XmlTag( "IE" , SoNumero(::cIee))                                       // Inscrição Estadual do Emitente

          If !Empty(::cIme)                                                               // Não obrigatório
             ::cXml+= XmlTag( "IM" , SoNumero(::cIme))                                    // Inscrição Municipal do Emitente
          Endif

          If !Empty(::cCnaee)                                                             // Não obrigatório
             ::cXml+= XmlTag( "CNAE" , SoNumero(::cCnaee))                                // CNAE do Emitente
          Endif

          ::cXml+= XmlTag( "CRT" , Iif(::cCrt <= 1, [1], ::cCrt))                         // 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)

METHOD fCria_Destinatario() CLASS Malc_GeraXml
   ::cXml+= "<dest>"
          If Len(SoNumeroCnpj(::cCnpjd)) < 14                       // Pessoa Física - Cpf
                ::cXml+= XmlTag( "CPF"  , SoNumeroCnpj(::cCnpjd))
          Else                                                  // Pessoa Juridica
                ::cXml+= XmlTag( "CNPJ" , SoNumeroCnpj(::cCnpjd))
          Endif

          If ::cAmbiente == [2]                                 // Homologação
             ::cXml+= XmlTag( "xNome" , [NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL])
          Else                                                  // Produção
             If ::cUfd == [EX]
                ::cXml+= XmlTag( "idEstrangeiro" , [])
             Endif
             ::cXml+= XmlTag( "xNome" , RetiraAcento(::cXnomed))
          Endif   

          ::cXml+= "<enderDest>"    
                 ::cXml+= XmlTag( "xLgr"    , RetiraAcento(::Xlgrd))
                 ::cXml+= XmlTag( "nro"     , ::cNrod)

                 If !Empty(::cXcpld)
                    ::cXml+= XmlTag( "xCpl" , ::cXcpld)
                 Endif

                 ::cXml+= XmlTag( "xBairro" , RetiraAcento(::cXBairrod))

                 If ::cUfd == [EX]                              // Importação/Exportação
                    ::cXml+= XmlTag( "cMun"  , [9999999])
                    ::cXml+= XmlTag( "xMun"  , [EXTERIOR])
                    ::cXml+= XmlTag( "UF"    , [EX])
                    ::cXml+= XmlTag( "cPais" , ::cPaisd)
                    ::cXml+= XmlTag( "xPais" , ::cXpaisd)
                 Else                                           // Comércio Interno
                    ::cXml+= XmlTag( "cMun"  , ::cCmund)
                    ::cXml+= XmlTag( "xMun"  , RetiraAcento(::cXmund))
                    ::cXml+= XmlTag( "UF"    , ::cUfd)
                    ::cXml+= XmlTag( "CEP"   , SoNumero(::cCepd))
                    ::cXml+= XmlTag( "cPais" , ::cPaisd)
                    ::cXml+= XmlTag( "xPais" , ::cXpaisd)
                 Endif

	         If !Empty(SoNumero(::cFoned))
   		    ::cXml+= XmlTag( "fone" , SoNumero(::cFoned))
                 Endif
          ::cXml+= "</enderDest>"

   	  ::cXml+= XmlTag( "indIEDest" , If(::cModelo == [65] .or. ::cUfd == [EX], "9", ::cIndie))  //   1 = Contribuinte ICMS (informar a IE do destinatário);
                                                                                                    //   2 = Contribuinte isento de Inscrição no cadastro de Contribuintes;
          If (::cUfd # [EX] .or. ::cModelo # [65]) .and. ::cIndie == [1]                            //   9 = Não Contribuinte, que pode ou não possuir Inscrição Estadual no Cadastro de Contribuintes do ICMS.
             ::cXml+= XmlTag( "IE" , SoNumero(::cIed))                                              //   Nota 1: No caso de NFC-e informar indIEDest=9 e não informar a tag IE do destinatário; 
          Endif                                                                                     //   Nota 2: No caso de operação com o Exterior informar indIEDest=9 e não informar a tag IE do destinatário;
                                                                                                    //   Nota 3: No caso de Contribuinte Isento de Inscrição (indIEDest=2), não informar a tag IE do destinatário.
          If !Empty(::cEmaild)
             ::cXml+= XmlTag( "email" , ::cEmaild)
          Endif   
   ::cXml+= "</dest>"
         
   // Contador Responsável
   If !Empty(::cAutxml)
      ::cXml+= '<autXML>'
         If Len(SoNumeroCnpj(::cAutxml)) < 14
            ::cXml+= '<CPF>' + SoNumero(::cAutxml) + '</CPF>'
         Else
            ::cXml+= '<CNPJ>' + SoNumeroCnpj(::cAutxml) + '</CNPJ>'
         Endif
      ::cXml+= '</autXML>'
   Endif
Return (Nil)

METHOD fCria_Produto() CLASS Malc_GeraXml
   ::cXml+= [<det nItem="] + NumberXml( ::nItem, 0 ) + [">]
          ::cXml+= "<prod>"
                 ::cXml+= XmlTag( "cProd"    , ::cProd)

		 If !Empty(::cEan)
                    ::cXml+= XmlTag( "cEAN"  , ::cEan)
                 Else
                    ::cXml+= XmlTag( "cEAN"  , [SEM GTIN])
                 Endif

                 ::cXml+= XmlTag( "xProd"    , AllTrim(RetiraAcento(::cXprod)))
                 ::cXml+= XmlTag( "NCM"      , ::cNcm)

		 If Len(::cNcm) > 8
		    ::cXml+= XmlTag( "EXTIPI" , [0] + Right(::cNcm, 2))    // Excessão de IPI 
		 Endif   

                 If !Empty(::cCest)
                    ::cXml+= XmlTag( "CEST"  , SoNumero(::cCest))
                 Endif

                 ::cXml+= XmlTag( "CFOP"     , SoNumero(::cCfOp))
                 ::cXml+= XmlTag( "uCom"     , ::cUcom)
                 ::cXml+= XmlTag( "qCom"     , ::cQcom, 4)
                 ::cXml+= XmlTag( "vUnCom"   , ::cVuncom)
                 ::cXml+= XmlTag( "vProd"    , ::cVprod, 10, 2)

		 If !Empty(::cEan)
                    ::cXml+= XmlTag( "cEANTrib" , ::cEan)
                 Else
                    ::cXml+= XmlTag( "cEANTrib" , [SEM GTIN])
                 Endif

                 ::cXml+= XmlTag( "uTrib"    , ::cUcom)
                 ::cXml+= XmlTag( "qTrib"    , ::cQcom, 4)
                 ::cXml+= XmlTag( "vUnTrib"  , ::cVuncom)

                 If !Empty(::nFrete)
                    ::cXml+= XmlTag( "vFrete", ::cVfrete)
                 Endif

                 If !Empty(::cVseg)
                    ::cXml+= XmlTag( "vSeg"  , ::cVseg)
                 Endif

                 If !Empty(::cVdesc)
                    ::cXml+= XmlTag( "vDesc" , ::cVdesc)
                 Endif

                 If !Empty(::cVoutro)
                    ::cXml+= XmlTag( "vOutro" , ::cVoutro)
                 Endif
 
                 ::cXml+= XmlTag( "indTot", ::cIndtot ) // Indica se soma produto

                 *::fCria_ProdExporta()
                 *::fCria_ProdVeiculo()
                 *::fCria_ProdMedicamento()
                 *::fCria_ProdArmamento()
                 *::fCria_ProdCombustivel()
          ::cXml+= "</prod>"
           
          ::cXml+= "<imposto>"    // BLOCO M - IMPOSTOS
                 If Val(::cVtottrib) > 0 .and. SubStr(::cCfOp, 2, 3) # [010] // lei transparência
                    ::cXml+= XmlTag("vTotTrib", ::cVtottrib)
                 Endif

                 ::fCria_ProdutoIcms()
                 ::fCria_ProdutoIpi() 
                 ::fCria_ProdutoPisCofins()
          ::cXml+= "</imposto>"
                  
          If Val(::cVtottrib) # 0  // lei transparência informações adicionais do produtos
             ::cXml+= XmlTag( "indTot", [Valor aproximado dos tributos federais, estaduais e municipais: ] + NumberXml(Val(::cVtottrib), 2) + [ Fonte IBPT] )
          Endif
   ::cXml+= "</det>"
Return (Nil)

METHOD fCria_ProdutoIcms() CLASS Malc_GeraXml
*  Informar a modalidade de determinação da base de cálculo do ICMS (Para tributação do ICMS=00): modBC
*  0 - Margem Valor Agregado (%) 
*  1 - Pauta (Valor) 
*  2 - Preço Tabelado Máx. (valor) 
*  3 - valor da operação.								     

   ::cXml+= "<ICMS>"    // BLOCO N - ICMS NORMAL E ST
          Do Case
             Case ::cCsticms == [000]
                  ::cXml+= "<ICMS00>"
                         ::cXml+= XmlTag( "orig"  , ::cOrig)
                         ::cXml+= XmlTag( "CST"   , SubStr(::cCsticms, 2, 2))
                         ::cXml+= XmlTag( "modBC" , [3] )                  // base = valor da operacao
                         ::cXml+= XmlTag( "vBC"   , Str(::nVbc, 15, 2))
                         ::cXml+= XmlTag( "pICMS" , ::nPicms)
                         ::cXml+= XmlTag( "vICMS" , ::nVlicms)
                   ::cXml+= "</ICMS00>"
             Case ::cCsticms == [010]
                   ::cXml+= "<ICMS10>"
                         ::cXml+= XmlTag( "orig"    , ::cOrig)
                         ::cXml+= XmlTag( "CST"     , SubStr(::cCsticms, 2, 2))
                         ::cXml+= XmlTag( "modBC"   , ::nModbc )             // base = valor da operacao
                         ::cXml+= XmlTag( "vBC"     , Str(::nVbc, 15, 2))
                         ::cXml+= XmlTag( "pICMS"   , ::nPicms)
                         ::cXml+= XmlTag( "vICMS"   , ::nVlicms)
                         ::cXml+= XmlTag( "modBCST" , ::cModbcst)
                         ::cXml+= XmlTag( "pMVAST"  , ::nPmvast)
                         ::cXml+= XmlTag( "vBCST"   , ::nVbcst)
                         ::cXml+= XmlTag( "pICMSST" , ::nPicmst)
                         ::cXml+= XmlTag( "vICMSST" , ::nVicmsst)
                   ::cXml+= "</ICMS10>"
             Case ::cCsticms == [020]
                   ::cXml+= "<ICMS20>"
                         ::cXml+= XmlTag( "orig"   , ::cOrig)
                         ::cXml+= XmlTag( "CST"    , SubStr(::cCsticms, 2, 2))
                         ::cXml+= XmlTag( "modBC"  , [3] ) // base = valor da operacao
                         ::cXml+= XmlTag( "pRedBC" , ::nPredbc)
                         ::cXml+= XmlTag( "vBC"    , Str(::nVbc, 15, 2))
                         ::cXml+= XmlTag( "pICMS"  , ::nPicms)
                         ::cXml+= XmlTag( "vICMS"  , ::nVlicms)
                   ::cXml+= "</ICMS20>"
             Case ::cCsticms == [030]
                   ::cXml+= "<ICMS30>"
                         ::cXml+= XmlTag( "orig"     , ::cOrig)
                         ::cXml+= XmlTag( "CST"      , SubStr(::cCsticms, 2, 2))
                         ::cXml+= XmlTag( "modBCST"  , "3" ) // base = valor da operacao
                         ::cXml+= XmlTag( "pMVAST"   , "100.00")
                         ::cXml+= XmlTag( "pRedBCST" , "100.00")
                         ::cXml+= XmlTag( "vBCST"    , ::nVbc)
                         ::cXml+= XmlTag( "pICMSST"  , ::nPicmst)
                         ::cXml+= XmlTag( "vICMSST"  , ::nVlicms)
                   ::cXml+= "</ICMS30>"
             Case ::cCsticms $ [040_041_050_141_241_140_240]
                   ::cXml+= "<ICMS40>"
                         ::cXml+= XmlTag( "orig" , ::cOrig)
                         ::cXml+= XmlTag( "CST"  , SubStr(::cCsticms, 2, 2))
                   ::cXml+= "</ICMS40>"
             Case ::cCsticms == [051]
                   ::cXml+= "<ICMS51>"
                         ::cXml+= XmlTag( "orig" , ::cOrig)
                         ::cXml+= XmlTag( "CST"  , SubStr(::cCsticms, 2, 2))
                   ::cXml+= "</ICMS51>"
             Case ::cCsticms == [060]
                   ::cXml+= "<ICMS60>"
                         ::cXml+= XmlTag( "orig"           , ::cOrig)
                         ::cXml+= XmlTag( "CST"            , "60")
                         ::cXml+= XmlTag( "vBCSTRet"       , "0.00")
                         ::cXml+= XmlTag( "pST"            , "0.0000")
                         ::cXml+= XmlTag( "vICMSSubstituto", "0.00")
                         ::cXml+= XmlTag( "vICMSSTRet"     , "0.00")
                   ::cXml+= "</ICMS60>"
             Case ::cCsticms == [070]
                   ::cXml+= "<ICMS70>"
                         ::cXml+= XmlTag( "orig"    , ::cOrig)
                         ::cXml+= XmlTag( "CST"     , SubStr(::cCsticms, 2, 2))
                         ::cXml+= XmlTag( "modBCST" , "3" )                  // base = valor da operacao
                         ::cXml+= XmlTag( "pRedBC"  , ::nPredbc)
                         ::cXml+= XmlTag( "vBC"     , Str(::nVbc, 15, 2))
                         ::cXml+= XmlTag( "pICMS"   , ::nPicms)
                         ::cXml+= XmlTag( "vICMS"   , ::nVlicms)
                         ::cXml+= XmlTag( "modBCST" , "0")
                         ::cXml+= XmlTag( "pMVAST"  , ::nPmvast)
                         ::cXml+= XmlTag( "vBCST"   , ::nVbcst)
                         ::cXml+= XmlTag( "pICMSST" , ::nPicmst)
                         ::cXml+= XmlTag( "vICMSST" , ::nVicmsst)
                         ::cXml+= XmlTag( "pBCOp"   , "1.00")
                         ::cXml+= XmlTag( "UFST"    , ::cUfd)
                   ::cXml+= "</ICMS70>"
             Case ::cCsticms == [090]
                   ::cXml+= "<ICMS90>"
                         ::cXml+= XmlTag( "orig"    , ::cOrig)
                         ::cXml+= XmlTag( "CST"     , SubStr(::cCsticms, 2, 2))
                         ::cXml+= XmlTag( "modBCST" , "3" ) // base = valor da operacao
                         ::cXml+= XmlTag( "pRedBC"  , ::nPredbc)
                         ::cXml+= XmlTag( "vBC"     , Str(::nVbc, 15, 2))
                         ::cXml+= XmlTag( "pICMS"   , ::nPicms)
                         ::cXml+= XmlTag( "vICMS"   , ::nVlicms)
                   ::cXml+= "</ICMS90>"
             Case ::cCsticms == [101]
                   ::cXml+= "<ICMSSN101>"
                         ::cXml+= XmlTag( "orig"         , ::cOrig)
                         ::cXml+= XmlTag( "CSOSN"        , ::cCsticms)
                         ::cXml+= XmlTag( "<pCredSN>"    , ::nPicms)
                         ::cXml+= XmlTag( "<vCredICMSSN>", ::nVlicms)
                   ::cXml+= "</ICMSSN101>"
             Case ::cCsticms $ [102_103_300_400]
                   ::cXml+= "<ICMSSN102>"
                         ::cXml+= XmlTag( "orig"  , ::cOrig)
                         ::cXml+= XmlTag( "CSOSN" , ::cCsticms)
                   ::cXml+= "</ICMSSN102>"
             Case ::cCsticms == [201]
                   ::cXml+= "<ICMSSN201>"
                         ::cXml+= XmlTag( "orig"  , ::cOrig)
                         ::cXml+= XmlTag( "CSOSN" , ::cCsticms)
                   ::cXml+= "</ICMSSN201>"
             Case ::cCsticms $ [202_203]
                   ::cXml+= "<ICMSSN202>"
                         ::cXml+= XmlTag( "orig"  , ::cOrig)
                         ::cXml+= XmlTag( "CSOSN" , ::cCsticms)
                   ::cXml+= "</ICMSSN202>"
             Case ::cCsticms == [500]
                   ::cXml+= "<ICMSSN500>"
                         ::cXml+= XmlTag( "orig"           , ::cOrig)
                         ::cXml+= XmlTag( "CSOSN"          , ::cCsticms)
                         ::cXml+= XmlTag( "vBCSTRet"       , "0.00")
                         ::cXml+= XmlTag( "pST"            , "0.0000")
                         ::cXml+= XmlTag( "vICMSSubstituto", "0.00")
                         ::cXml+= XmlTag( "vICMSSTRet"     , "0.00")
                         ::cXml+= XmlTag( "pRedBCEfet"     , "0.0000")
                         ::cXml+= XmlTag( "vBCEfet"        , "0.00")
                         ::cXml+= XmlTag( "pICMSEfet"      , "0.0000")
                         ::cXml+= XmlTag( "vICMSEfet"      , "0.00")
                    ::cXml+= "</ICMSSN500>"
             Case ::cCsticms == [900]
                   ::cXml+= "<ICMSSN900>"
                         ::cXml+= XmlTag( "orig"           , ::cOrig)
                         ::cXml+= XmlTag( "CSOSN"          , ::cCsticms)
                        
                         // Verifica se tem valor do ICMS
                         If Val(::nVlicms) # 0
                            ::cXml+= XmlTag( "modBC"   , ::nModbc ) // base = valor da operacao
                            ::cXml+= XmlTag( "vBC"     , Str(::nVbc, 15, 2))
                            ::cXml+= XmlTag( "pICMS"   , ::nPicms)
                            ::cXml+= XmlTag( "vICMS"   , ::nVlicms)
                         Endif
                         
                         // Verifica se tem valor do ICMS ST 
                         If Val(::nVlicms) # 0
                            ::cXml+= XmlTag( "modBCST" , ::cModbcst) 
                            ::cXml+= XmlTag( "vBCST"   , ::nVbcst)
                            ::cXml+= XmlTag( "pICMSST" , ::nPicmst)
                            ::cXml+= XmlTag( "vICMSST" , ::nVicmsst)
                         Endif
                               
                    ::cXml+= "</ICMSSN900>"
          Endcase
   ::cXml+= "</ICMS>"
Return (Nil)

METHOD fCria_ProdutoIpi() CLASS Malc_GeraXml
   If ::nVipi > 0
      ::cXml+= "<IPI>"
             ::cXml+= XmlTag( "cEnq" , ::cCEnq)
             ::cXml+= "<IPITrib>"
                    ::cXml+= XmlTag( "CST"  , ::cCstipi)
                    ::cXml+= XmlTag( "vBC"  , Str(::nVbcipi, 15, 2))
                    ::cXml+= XmlTag( "pIPI" , ::nPipi)
                    ::cXml+= XmlTag( "vIPI" , ::nVipi)
             ::cXml+= "</IPITrib>"			   
      ::cXml+= "</IPI>"   
   Else
      ::cXml+= XmlTag( "cEnq" , "999")
      ::cXml+= "<IPINT>"
             ::cXml+= XmlTag( "CST"  , ::cCstipi)
      ::cXml+= "</IPINT>"
   Endif
Return (Nil)

METHOD fCria_ProdutoPisCofins() CLASS Malc_GeraXml
   If ::cCrt == [1] .or. ::cCrt == [2]
      ::cXml+= "<PIS>"
             ::cXml+= "<PISOutr>"
                    ::cXml+= XmlTag( "CST"       , ::cCstPis)
                    ::cXml+= XmlTag( "qBCProd"   , "0.0000")
		    ::cXml+= XmlTag( "vAliqProd" , "0.0000")
		    ::cXml+= XmlTag( "vPIS"      , "0.00")
             ::cXml+= "</PISOutr>"
      ::cXml+= "</PIS>"

      ::cXml+= "<COFINS>"
             ::cXml+= "<COFINSOutr>"
		  ::cXml+= XmlTag( "CST"       , ::cCstCofins)
		  ::cXml+= XmlTag( "qBCProd"   , "0.0000")
		  ::cXml+= XmlTag( "vAliqProd" , "0.0000")
		  ::cXml+= XmlTag( "vCOFINS"   , "0.00")
	     ::cXml+= "</COFINSOutr>"
      ::cXml+= "</COFINS>"
   Else
      If !::lCalcPisCofins
         ::cXml+= "<PIS>"
                ::cXml+= "<PISAliq>"
                     ::cXml+= XmlTag( "CST"  , ::cCstPis)
                     ::cXml+= XmlTag( "vBC"  , "0.00")
                     ::cXml+= XmlTag( "pPIS" , "0.0000")
                     ::cXml+= XmlTag( "vPIS" , "0.00")
                ::cXml+= "</PISAliq>"
         ::cXml+= "</PIS>"

         ::cXml+= "<COFINS>"
                ::cXml+= "<COFINSAliq>"
                     ::cXml+= XmlTag( "CST"     , ::cCstCofins)
                     ::cXml+= XmlTag( "vBC"     , "0.00")
                     ::cXml+= XmlTag( "pCOFINS" , "0.0000")
                     ::cXml+= XmlTag( "vCOFINS" , "0.00")
                ::cXml+= "</COFINSAliq>"
         ::cXml+= "</COFINS>"
      Else
         ::cXml+= "<PIS>"
                ::cXml+= "<PISAliq>"
                     ::cXml+= XmlTag( "CST"   , ::cCstPis)
                     ::cXml+= XmlTag( "vBC"   , Str(::nBcpis, 15, 2))
                     ::cXml+= XmlTag( "pPIS"  , ::nAlPis)
                     ::cXml+= XmlTag( "vPIS"  , ::nBcpis * (::nAlPis / 100))
                 ::cXml+= "</PISAliq>"
         ::cXml+= "</PIS>"

         ::cXml+= "<COFINS>"
                ::cXml+= "<COFINSAliq>"
                     ::cXml+= XmlTag( "CST"     , ::cCstCofins)
                     ::cXml+= XmlTag( "vBC"     , Str(::nBcpis, 15, 2))
                     ::cXml+= XmlTag( "pCOFINS" , ::nAlCofins)
                     ::cXml+= XmlTag( "vCOFINS" , ::nBcpis * (::nAlCofins / 100))
                ::cXml+= "</COFINSAliq>"
         ::cXml+= "</COFINS>"
      Endif   
   Endif   
Return (Nil)


METHOD fCria_Totais() CLASS Malc_GeraXml
   cXml+= "<total>"
        cXml+= "<ICMSTot>"
             cXml+= XmlTag( "vBC"          , ::nVbc)
             cXml+= XmlTag( "vICMS"        , ::nVicms)
             cXml+= XmlTag( "vICMSDeson"   , ::nVicmsdeson)
             cXml+= XmlTag( "vFCPUFDest"   , ::nVfcpufdest)   // Complementa o Cálculo com a Diferença de ICMS
             cXml+= XmlTag( "vICMSUFDest"  , ::nVicmsufdest)  // Complementa o Cálculo com a Diferença de ICMS
             cXml+= XmlTag( "vICMSUFRemet" , ::nVicmsufremet) // Complementa o Cálculo com a Diferença de ICMS
             cXml+= XmlTag( "vFCP"         , ::nVfcp)         // Campo referente a FCP Para versão 4.0
             cXml+= XmlTag( "vBCST"        , ::nVbcST)
             cXml+= XmlTag( "vST"          , ::nVst)
             cXml+= XmlTag( "vFCPST"       , ::nVfcpst)       // Campo referente a FCP Para versão 4.0
             cXml+= XmlTag( "vFCPSTRet"    , ::nVfcpstret)    // Campo referente a FCP Para versão 4.0

             If ::nMonoBas # 0
                cXml+= XmlTag( "qBCMonoRet"   , ::nMonoBas)
                cXml+= XmlTag( "vICMSMonoRet" , Round(::nMonoBas * ::nMonoAliq, 2))
             Endif

             cXml+= XmlTag( "vProd"        , If(::cFinnfe == [1], '0.00', ::nVprodt))
             cXml+= XmlTag( "vFrete"       , ::nVFretet)
             cXml+= XmlTag( "vSeg"         , ::nVSeg)
             cXml+= XmlTag( "vDesc"        , ::nDesct)
             cXml+= XmlTag( "vII"          , ::nVii)
             cXml+= XmlTag( "vIPI"         , ::nVipi)
             cXml+= XmlTag( "vIPIDevol"    , ::nVipidevol)        
             cXml+= XmlTag( "vPIS"         , ::nVipist)
             cXml+= XmlTag( "vCOFINS"      , ::nVCofinst)
             cXml+= XmlTag( "vOutro"       , ::nVOutrot)
             cXml+= XmlTag( "vNF"          , If(::cFinnfe == [1], '0.00', ::nVnf)) 
             cXml+= XmlTag( "vTotTrib"     , ::nVtottrib)
        cXml+= "</ICMSTot>"
   cXml+= "</total>"
Return (Nil)

METHOD fCria_Transportadora() CLASS Malc_GeraXml
   ::cXml+= "<transp>"
          ::cXml+= XmlTag( "modFrete" , ::cModFrete)
         
          If ::cModFrete # [9]
             ::cXml+= "<transporta>"
                    If !Empty(::cXnomet)
                       If Len(SoNumeroCnpj(::cCnpjt)) < 14            // Pessoa Física - Cpf
                          ::cXml+= XmlTag( "CPF"  , SoNumeroCnpj(::cCnpjt))
       		       Else                                         // Pessoa Juridica - Cnpj
                          ::cXml+= XmlTag( "CNPJ" , SoNumeroCnpj(::cCnpjt))
                       Endif

                       ::cXml+= XmlTag( "xNome" , RetiraAcento(::cXnomet))

                       If !Empty(::cIet)
                          ::cXml+= XmlTag( "IE" , SoNumero(::cIet))
                       Endif

                       If !Empty(::cXEndert)
                          ::cXml+= XmlTag( "xEnder" , RetiraAcento(::cXEndert))
                       Endif

                       If !Empty(::cXmunt)
                          ::cXml+= XmlTag( "xMun" , AllTrim(RetiraAcento(::cXmunt)))
                       Endif

                       If !Empty(::cUft)
                          ::cXml+= XmlTag( "UF" , AllTrim(RetiraAcento(::cUft)))
                       Endif
                    Else   
		       ::cXml+= XmlTag( "xNome" , [o Proprio])
                    Endif
             ::cXml+= "</transporta>"

             If !Empty(fRetiraSinal(::cPlaca))
                ::cXml+= "<veicTransp>"
                       ::cXml+= XmlTag( "placa" , fRetiraSinal(::cPlaca))
                       ::cXml+= XmlTag( "UF"    , ::cUft)

                       If !Empty(::cRntc)
                          ::cXml+= XmlTag( "RNTC" , AllTrim(RetiraAcento(::cRntc)))
                       Endif
                ::cXml+= "</veicTransp>"
             Endif
          Endif   

          // Informações de Volumes
          If !Empty(::nQvol) .or. !Empty(::cEsp) .or. !Empty(::cNvol) .or. !Empty(::nPesol) .or. !Empty(::nPesob)
             ::cXml+= "<vol>"
                    If !Empty(::nQvol)
     		       ::cXml+= XmlTag( "qVol" , ::nQvol, 0)
                    Endif
               
                    If !Empty(::cEsp)
		       ::cXml+= XmlTag( "esp" , RetiraAcento(::cEsp))
                    Endif

                    If !Empty(::cMarca)
                       ::cXml+= XmlTag( "marca" , RetiraAcento(::cMarca))
                    Endif

                    If !Empty(::cNvol)
                       ::cXml+= XmlTag( "nVol" , RetiraAcento(::cNvol))
                    Endif

                    If !Empty(::nPesol)
                       ::cXml+= XmlTag( "pesoL" , ::nPesol, 3)
                    Endif

                    If !Empty(::nPesob)
                       ::cXml+= XmlTag( "pesoB" , ::nPesob, 3)
                    Endif 
             ::cXml+= "</vol>"
           Endif
   ::cXml+= "</transp>"
Return (Nil)

METHOD fCria_Cobranca() CLASS Malc_GeraXml
   Local i

   For i:= 1 to Len(::aDupli)
       If !Empty(::aDupli[i, 1]) .and. !Empty(::aDupli[i, 2])
          If i == 1
             ::cXml+= "<cobr>"
                    ::cXml+= "<fat>"
                           ::cXml+= XmlTag( "nFat"  , ::cNf)
                           ::cXml+= XmlTag( "vOrig" , ::nVliq)
                           ::cXml+= XmlTag( "vLiq"  , ::nVliq)
                    ::cXml+= "</fat>"
          Endif
 
          ::cXml+= "<dup>"
                 ::cXml+= XmlTag( "nDup"  , Strzero(i, 3))
                 ::cXml+= XmlTag( "dVenc" , DateXml(::aDupli[i, 1]))
                 ::cXml+= XmlTag( "vDup"  , ::aDupli[i, 2])
          ::cXml+= "</dup>"
 
          If i == Len(::aDupli)
             ::cXml+= "</cobr>"
          Endif
       Endif
   Next i

   ::cXml+= "<pag>" 
          ::cXml+= "<detPag>" 
                 ::cXml+= XmlTag( "indPag"  , ::cIndPag)        // Indicação da Forma de Pagamento
                 ::cXml+= XmlTag( "tPag"    , ::cTpag)            // Tipo de Pagamento
                 
                 If cIndPag # [90]
                    ::cXml+= XmlTag( "vPag" , ::nVpag)
                 Else
                    ::cXml+= XmlTag( "vPag" , [0])      // Valor do Pagamento
                 Endif
          ::cXml+= "</detPag>" 
   ::cXml+= "</pag>"   
Return (Nil)

METHOD fCria_Informacoes() CLASS Malc_GeraXml
   Local cInfFisc:= []

   ::cXml+= "<infAdic>"
          If ::lComplementar // Informações DIFAL
             If ::nVIcmsSufDest > 0
                cInfFisc+= "DIFAL para UF destino R$ " + NumberXml(::nVIcmsSufDest, 2) + hb_OsNewLine()
             Endif

             If ::nVIcmsSufRemet > 0
                ::ccInfadfisco+= "DIFAL para UF Origem R$ " + NumberXml(::nVIcmsSufRemet, 2) + hb_OsNewLine()
             Endif   

             If !Empty(::cVpis)     // Destaque valor do PIS/COFINS
                cInfFisc+= "Valor de PIS para movimento R$ " + NumberXml(Val(::cVpis), 2) + hb_OsNewLine()
                cInfFisc+= "Valor de COFINS para movimento R$ " + NumberXml(::cVcofins, 2) + hb_OsNewLine()
             Endif
             If ::cUfd # [EX] .and. !Empty(::cCodDest)
 		cInfFisc+= "Cód:" + ::cCodDest + hb_OsNewLine()
             Endif
          Endif

          If !Empty(AllTrim(cInfFisc))
             ::cXml+= XmlTag( "infAdFisco" , RetiraAcento(StrTran(cInfFisc, hb_OsNewLine(), "; ")))
          Endif

          If !Empty(AllTrim(::cInfcpl))
             ::cXml+= XmlTag( "infCpl" , CharRem("°ºª-:\(){}[]`´’'", RetiraAcento(StrTran(::cInfcpl, hb_OsNewLine(), '; '))))
          *  ::cXml+= XmlTag( "infCpl" , RetiraAcento(StrTran(::cInfcpl, hb_OsNewLine(), '; ')))
          Endif
   ::cXml+= "</infAdic>"

   If !Empty(::cUfSaidapais)                  // Exportação
      cXml += "<exporta>"
              cXml += XmlTag( "UFSaidaPais" , ::cUfSaidapais)
              cXml += XmlTag( "xLocExporta" , ::cXlocexporta)
              cXml += XmlTag( "xLocDespacho", ::cXlocdespacho)
      cXml += "</exporta>"
   Endif   
Return (Nil)

METHOD fCria_Responsavel() CLASS Malc_GeraXml
   If !Empty(::cRespNome) .and. !Empty(::cRespcnpj) .and. !Empty(::cRespemail)
      ::cXml+= "<infRespTec>" 
             ::cXml+= XmlTag( "<CNPJ>"     , SoNumeroCnpj(::cRespcnpj))  // CNPJ do Responsável Técnico
             ::cXml+= XmlTag( "<xContato>" , RetiraAcento(::cRespNome))  // Contato do Responsável Técnico
             ::cXml+= XmlTag( "<email>"    , RetiraAcento(::cRespemail)) // E-mail do Responsável Técnico
             ::cXml+= XmlTag( "<fone>"     , fRetiraSinal(::cRespfone))  // Telefone do Responsável Técnico
      ::cXml+= "</infRespTec>" 
   Endif
Return (Nil)

METHOD fCria_Fechamento() CLASS Malc_GeraXml
   cXml+= "</infNFe>"
   cXml+= "</NFe>"
Return (Nil)