SEGUE exemplo de uso da SEFAZCLASS , partindo do principio que o XML esta tudo OK
***************************************************************************************
* MODULO DE ASSINATURA , TRANSMISSAO, AUTORIZACAO, RETORNO E IMPRESSAO
***************************************************************************************
ThisNFE:oProgressbar1:Set(,60)
ThisNFE:oLabel5:SetText("Assinando NF-e ")
********* ASSINATURA VIA SEFAZCLASS **********************************************************************************************************
SELE CERTIFICADO
IF !DBSEEK(rtrim(hwg_GetComputerName()))
hwg_MsgInfo("Computador sem o CERTIFICADO DIGITAL instalado"+ HB_EOL()+"A Operação não poderá ser efetuada")
SELE NOTAFE
ThisNFE:oOwnerbutton4:DISABLE()
RETURN NIL
endif
SELE NOTAFE
cTxtXml:=M->cXml
oSefaz := SefazClass():New()
oSefaz:cUF := FLAG->n_xUF
oSefaz:cAmbiente := FLAG->n_tpAmb
oSefaz:cCertificado := TRIM(CERTIFICADO->NOMCERT)
// oSefaz:cVersao := '3.10'
ThisNFE:oProgressbar1:Set(,80)
ThisNFE:oLabel5:SetText("Aguardando Retorno ")
**********************************************************************************************************************************************
IF hlusuario( ) # "DEMONTRACAO"
oSefaz:NFEloteenvia( cTxtXml )
ENDIF
IF RDDSETDEFAULT() == "LETO"
Leto_MemoWrite( cPrefixo + ".xml", oSefaz:cXmlDocumento )
ELSE
hb_MemoWrit( cPrefixo + ".xml", oSefaz:cXmlDocumento )
ENDIF
// hb_MemoWrit( cPrefixo + "_1_documento.xml", oSefaz:cXmlDocumento )
// hb_MemoWrit( cPrefixo + "_2_Envio.xml", oSefaz:cXmlEnvio )
// hb_MemoWrit( cPrefixo + "_3_Soap.xml", oSefaz:cXmlSoap )
// hb_MemoWrit( cPrefixo + "_4_Retorno.xml", oSefaz:cXmlRetorno )
// hb_MemoWrit( cPrefixo + "_5_Protocolo.xml", oSefaz:cXmlProtocolo )
// hb_MemoWrit( cPrefixo + "_6_Recibo.xml", oSefaz:cXmlRecibo )
// hb_MemoWrit( cPrefixo + "_7_Autorizado.xml", oSefaz:cXmlAutorizado )
// hwg_MsgInfo( "Status: " + oSefaz:cStatus + hb_Eol() + oSefaz:cMotivo )
IF ! oSefaz:cStatus $ "100,101,150,301,302"
ThisNFE:oLabel5:SetText(oSefaz:cMotivo)
hwg_MsgInfo(oSefaz:cStatus + oSefaz:cMotivo)
ELSE
ThisNFE:oLabel5:SetText(oSefaz:cStatus + oSefaz:cMotivo)
SELE NOTAFE
IF RLOCK()
NOTAFE->FL_SITUAC := XmlNode(oSefaz:cXmlRetorno, "cStat")
NOTAFE->FL_MOTIVO := XmlNode(oSefaz:cXmlRetorno, "xMotivo")
NOTAFE->b_dhEmi := XmlNode(M->cXml, "dhEmi")
DBUNLOCK()
ENDIF
ThisNFE:oProgressbar1:Set(,90)
ThisNFE:oLabel5:SetText("Gerando DANFE em PDF ")
oSpedDa := hbNfeDaGeral():New()
IF RDDSETDEFAULT() == "LETO"
Leto_MemoWrite( cPrefixo + ".xml", oSefaz:cXmlAutorizado )
oSpedDa:ToPdf( oSefaz:cXmlAutorizado, cPrefixo + ".PDF" )
ELSE
hb_MemoWrit( cPrefixo + ".xml", oSefaz:cXmlAutorizado )
oSpedDa:ToPdf( oSefaz:cXmlAutorizado, cPrefixo + ".PDF" )
ENDIF
ThisNFE:oProgressbar1:Set(,100)
ThisNFE:oLabel5:SetText("NF-e Concluida com sucesso ")
// hwg_MsgInfo(cPrefixo + ".PDF")
*
* ---> ENVIA EMAIL DA NOTA FISCAL AUTOMATICAMENTE SE TIVER EMAIL NO CADASTRO
*
IF EMAIL_VALIDO(LOWER(NOTAFE->e_eMAIL))
IF .NOT. EMPTY(NOTAFE->e_eMAIL)
cFrom := "sgcnfe@gmail.com"
cPassword := "suasenha"
cTo := LOWER(NOTAFE->e_eMAIL)
cHost := "google"
cSubject := "SGC - NOTA FISCAL ELETRONICA NF-E"
cBody := "emitida por: " + HB_EOL() +;
FLAG->n_xFant+ HB_EOL() +;
FLAG->n_xNome+ HB_EOL() +;
"CPF/CNPJ: " + FLAG->n_CNPJ + HB_EOL() +;
"NOTA FISCAL ELETRONICA Nr. " + NOTAFE->b_serie + "/" + NOTAFE->b_nNF + HB_EOL() + HB_EOL() +;
"para: " + HB_EOL() + ;
RTRIM(NOTAFE->e_xNome) + HB_EOL() +;
"CPF/CNPJ: " + RTRIM(NOTAFE->e_CNPJ) + HB_EOL() +;
"VALOR: R$ " + LTRIM(STR(NOTAFE->w_vNF,14,2)) + HB_EOL()+ HB_EOL() +;
"chave acesso: " + substr(NOTAFE->a_Id,4,44) + HB_EOL()+ HB_EOL() +;
"Obs: E-mail enviado automaticamente por SGC-SISTEMA DE GESTAO DE COMERCIO, nao responda."
aFilesAttch := {cPrefixo + ".xml",cPrefixo + ".PDF"}
Email_Envia( cFrom, cPassword, cTo, cHost, aFilesAttch, cBody, cSubject )
ENDIF
ENDIF
*
* ---> ABRE O PDF PARA IMPRESSAO ATRAVEZ DO PROGRAMA PADRAO
*
WAPI_ShellExecute( NIL, "OPEN", cPrefixo + ".PDF" ,"",NIL,5 )
ENDIF
// NFEITENS->( DBCLOSEAREA() )
// FILEDELETE(cArquivoNFEItem)
return nil
Acho que a maior dificuldade é criar o XML que nada mais é que uma tira de TAGs que vou montando
M->cXml := '<NFe xmlns="http://www.portalfiscal.inf.br/nfe">'
M->cXml += '<infNFe Id="'+ NOTAFE->a_Id + '" versao="4.00">'
M->cXml += '<ide>'
M->cXml += '<cUF>' +NOTAFE->b_cUF +'</cUF>'
M->cXml += '<cNF>' +NOTAFE->b_cNF +'</cNF>'
IF NOTAFE->b_finNFe = "4"
M->cXml += '<natOp>DEVOLUCAO DE COMPRA P/ COMERCIALIZACAO</natOp>'
ELSE
M->cXml += '<natOp>' +RTRIM(NOTAFE->b_natOp) +'</natOp>'
ENDIF
// M->cXml += '<indPag>' +Mb_indPag +'</indPag>' && 0-A VISTA 1-A PRAZO 2-OUTROS
M->cXml += '<mod>' +NOTAFE->b_mod +'</mod>'
M->cXml += '<serie>' +ALLTRIM(STR(VAL(NOTAFE->b_serie))) +'</serie>'
M->cXml += '<nNF>' +ALLTRIM(STR(VAL(NOTAFE->b_nNF))) +'</nNF>'
M->cXml += '<dhEmi>' +DateTimeXml(M->DAT_HOJE,TIME() ,FLAG->n_xUF,.T. ) +'</dhEmi>'
M->cXml += '<tpNF>' +NOTAFE->b_tpNF +'</tpNF>' && 0-ENTRADA 1-SAIDA
M->cXml += '<idDest>' +NOTAFE->b_idDest +'</idDest>' && id de destino da operacao 1=interna 2=interestadual 3=exterior
M->cXml += '<cMunFG>' +NOTAFE->b_cMunFG +'</cMunFG>'
M->cXml += '<tpImp>' +NOTAFE->b_tpImp +'</tpImp>' && formato impressao 1-normal retrato 2-normal paisagem
M->cXml += '<tpEmis>' +NOTAFE->b_tpEmis +'</tpEmis>' && tipo emissao 1-emissao normal
M->cXml += '<cDV>' +NOTAFE->b_cDV +'</cDV>'
M->cXml += '<tpAmb>' +NOTAFE->b_tpAmb +'</tpAmb>' && TIPO DE AMBIENTE 1-PRODUCAO 2-DESENVOLVIMENTO
M->cXml += '<finNFe>' +NOTAFE->b_finNFe +'</finNFe>' && finalidade da emissao 1-normal 2-complementar 3-ajuste 4-devolucao
M->cXml += '<indFinal>' +NOTAFE->b_indFinal +'</indFinal>' && operacao com consumidor final 0-normal 1-consumidor final
M->cXml += '<indPres>' +SUBSTR(aINDPRES[nCombo1],1,1) +'</indPres>' && indicador de presenca do comprador 1-operacao presencial
M->cXml += '<procEmi>' +NOTAFE->b_procEmi +'</procEmi>' && processo de emissao da NFe 3-app fornecido pelo fisco
M->cXml += '<verProc>' +ALLTRIM(NOTAFE->b_verProc) +'</verProc>'
IF NOTAFE->b_finNFe = "4"
M->cXml += '<NFref>'
M->cXml += '<refNFe>' +CHAVE_refNFe +'</refNFe>'
M->cXml += '</NFref>'
ENDIF
M->cXml += '</ide>'
*************************************************************************************************************************
M->cXml += '<emit>'
IF LEN(NOTAFE->c_CNPJ) > 11
M->cXml += '<CNPJ>' +ALLTRIM(NOTAFE->c_CNPJ) +'</CNPJ>'
ELSE
M->cXml += '<CPF>' +ALLTRIM(NOTAFE->c_CNPJ) +'</CPF>'
ENDIF
M->cXml += '<xNome>' +rtrim(TIRACENTO(NOTAFE->c_xNome)) +'</xNome>'
M->cXml += '<xFant>' +RTRIM(TIRACENTO(NOTAFE->c_xFant)) +'</xFant>'
M->cXml += '<enderEmit>'
M->cXml += '<xLgr>' +rtrim(TIRACENTO(NOTAFE->c_xLgr)) +'</xLgr>'
M->cXml += '<nro>' +rtrim(NOTAFE->c_nro) +'</nro>'
if NOTAFE->c_xCpl <> space(60)
M->cXml += '<xCpl>' +rtrim(NOTAFE->c_xCpl) +'</xCpl>'
endif
M->cXml += '<xBairro>' +rtrim(NOTAFE->c_xBairro) +'</xBairro>'
M->cXml += '<cMun>' +NOTAFE->c_cMun +'</cMun>'
M->cXml += '<xMun>' +rtrim(NOTAFE->c_xMun) +'</xMun>'
M->cXml += '<UF>' +NOTAFE->c_UF +'</UF>'
M->cXml += '<CEP>' +NOTAFE->c_CEP +'</CEP>'
M->cXml += '<cPais>' +NOTAFE->c_cPais +'</cPais>'
M->cXml += '<xPais>' +rtrim(NOTAFE->c_xPais) +'</xPais>'
M->cXml += '<fone>' +rtrim(NOTAFE->c_fone) +'</fone>'
M->cXml += '</enderEmit>'
IF FLAG->n_IE <> SPACE(14)
M->cXml += '<IE>' +rtrim(NOTAFE->c_IE) +'</IE>'
ENDIF
*** IF FLAG->n_IM <> SPACE(15)
*** M->cXml += '<IM>' +rtrim(NOTAFE->c_IM) +'</IM>'
*** M->cXml += '<CNAE>' +NOTAFE->c_CNAE +'</CNAE>'
*** ENDIF
M->cXml += '<CRT>' +NOTAFE->c_CRT +'</CRT>'
M->cXml += '</emit>'
*************************************************************************************************************************
M->cXml += '<dest>'
IF LEN(ALLTRIM(NOTAFE->e_CNPJ)) > 11
M->cXml += '<CNPJ>' +ALLTRIM(NOTAFE->e_CNPJ) +'</CNPJ>'
ELSE
M->cXml += '<CPF>' +ALLTRIM(NOTAFE->e_CNPJ) +'</CPF>'
ENDIF
M->cXml += '<xNome>' +rtrim(TIRACENTO(NOTAFE->e_xNome)) +'</xNome>'
M->cXml += '<enderDest>'
M->cXml += '<xLgr>' +rtrim(TIRACENTO(NOTAFE->e_xLgr)) +'</xLgr>'
M->cXml += '<nro>' +rtrim(NOTAFE->e_nro) +'</nro>'
IF NOTAFE->e_xCpl # SPACE(60)
M->cXml += '<xCpl>' +rtrim(NOTAFE->e_xCpl) +'</xCpl>'
ENDIF
M->cXml += '<xBairro>' +rtrim(NOTAFE->e_xBairr) +'</xBairro>'
M->cXml += '<cMun>' +rtrim(NOTAFE->e_cMun) +'</cMun>'
M->cXml += '<xMun>' +rtrim(NOTAFE->e_xMun) +'</xMun>'
M->cXml += '<UF>' +NOTAFE->e_UF +'</UF>'
M->cXml += '<CEP>' +NOTAFE->e_CEP +'</CEP>'
M->cXml += '<cPais>' +NOTAFE->e_cPais +'</cPais>'
M->cXml += '<xPais>' +rtrim(NOTAFE->e_xPais) +'</xPais>'
IF NOTAFE->e_fone <> SPACE(14)
M->cXml += '<fone>' +rtrim(NOTAFE->e_fone) +'</fone>'
ENDIF
M->cXml += '</enderDest>'
M->cXml += '<indIEDest>'+NOTAFE->e_indIE +'</indIEDest>'
IF NOTAFE->e_indIE = "1"
M->cXml += '<IE>' +rtrim(NOTAFE->e_IE) +'</IE>'
endif
if NOTAFE->e_ISUF <> space(9)
M->cXml += '<ISUF>' +rtrim(NOTAFE->e_ISUF) +'</ISUF>'
endif
if NOTAFE->e_IM <> space(15)
M->cXml += '<IM>' +rtrim(NOTAFE->e_IM) +'</IM>'
endif
if NOTAFE->e_eMAIL <> space(60)
M->cXml += '<email>' +rtrim(NOTAFE->e_eMAIL) +'</email>'
endif
M->cXml += '</dest>'
ou tem uma forma de fazer bem mais pratica usando o XMLTAG() da SEFAZCLASS
*************************************
STATIC FUNCTION IDENTIFICACAO( )
*************************************
MEMVAR->b_cUF :=FLAG->n_cUF
MEMVAR->b_dhEmi :=substr(strzero(YEAR(M->DAT_HOJE),4,0),3,2)+strzero(MONTH(M->DAT_HOJE),2,0)
MEMVAR->c_CNPJ :=FLAG->n_CNPJ
MEMVAR->b_mod :='99'
MEMVAR->b_serie :=FLAG->n_serie
MEMVAR->b_nNF :=FLAG->n_serie + PEDIDOS->NUMNOT
MEMVAR->b_tpEmis :='1'
MEMVAR->b_cNF :=FLAG->n_cNF
MEMVAR->a_Id := MEMVAR->b_cUF+MEMVAR->b_dhEmi+MEMVAR->c_CNPJ+MEMVAR->b_mod+MEMVAR->b_serie+MEMVAR->b_nNF+MEMVAR->b_tpEmis+MEMVAR->b_cNF
MEMVAR->b_cDV :=CalculaDigito( MEMVAR->a_Id, "11" )
MEMVAR->a_Id +=MEMVAR->b_cDV
M->cXml := '<NFe xmlns="http://www.portalfiscal.inf.br/nfe">'
M->cXml += '<infNFe versao="4.00" Id="NFe'+ MEMVAR->a_Id + '">'
M->cXml += '<ide>'
M->cXml += XmlTag( 'cUF', FLAG->n_cUF )
M->cXml += XmlTag( 'cNF', FLAG->n_cNF )
M->cXml += XmlTag( 'natOp', 'TRANSFERENCIA PARA FILIAL' )
M->cXml += XmlTag( 'mod', '55' )
M->cXml += XmlTag( 'serie', ALLTRIM(STR(VAL(FLAG->n_serie))) )
M->cXml += XmlTag( 'nNF', ALLTRIM(STR(VAL(MEMVAR->b_nNF ))) )
M->cXml += XmlTag( 'dhEmi', DateTimeXml(M->DAT_HOJE,TIME() ,FLAG->n_xUF,.T. ) )
M->cXml += XmlTag( 'tpNF', '1' )
M->cXml += XmlTag( 'idDest', '1' )
M->cXml += XmlTag( 'cMunFG', FLAG->n_cMun )
M->cXml += XmlTag( 'tpImp', '1' )
M->cXml += XmlTag( 'tpEmis', '1' )
M->cXml += XmlTag( 'cDV', MEMVAR->b_cDV )
M->cXml += XmlTag( 'tpAmb', FLAG->n_tpAmb )
M->cXml += XmlTag( 'finNFe', '1' )
M->cXml += XmlTag( 'indFinal', '1' )
M->cXml += XmlTag( 'indPres', '1' )
M->cXml += XmlTag( 'procEmi', '0' )
M->cXml += XmlTag( 'verProc', 'SGC 4.00' )
M->cXml += '</ide>'
RETURN M->cXml
*************************************
STATIC FUNCTION EMITENTE( )
*************************************
M->cXml := '<emit>'
M->cXml += XmlTag( 'CNPJ', ALLTRIM(FLAG->n_CNPJ) )
M->cXml += XmlTag( 'xNome', rtrim(TIRACENTO(FLAG->n_xNome)) )
M->cXml += XmlTag( 'xFant', RTRIM(TIRACENTO(FLAG->n_xFant)) )
M->cXml += '<enderEmit>'
M->cXml += XmlTag( 'xLgr', rtrim(TIRACENTO(FLAG->n_xLgr)) )
M->cXml += XmlTag( 'nro', rtrim(FLAG->n_nro) )
M->cXml += XmlTag( 'xCpl', rtrim(FLAG->n_xCpl) )
M->cXml += XmlTag( 'xBairro', rtrim(FLAG->n_xBairro) )
M->cXml += XmlTag( 'cMun', FLAG->n_cMun )
M->cXml += XmlTag( 'xMun', rtrim(FLAG->n_xMun) )
M->cXml += XmlTag( 'UF', FLAG->n_xUF )
M->cXml += XmlTag( 'CEP', FLAG->n_CEP )
M->cXml += XmlTag( 'cPais', FLAG->n_cPais )
M->cXml += XmlTag( 'xPais', rtrim(FLAG->n_xPais) )
M->cXml += XmlTag( 'fone', rtrim(FLAG->n_fone) )
M->cXml += '</enderEmit>'
M->cXml += XmlTag( 'IE', rtrim(FLAG->n_IE) )
M->cXml += XmlTag( 'CRT', FLAG->n_CRT )
M->cXml += '</emit>'
RETURN M->cXml
*************************************
STATIC FUNCTION DESTINATARIO( )
*************************************
DBSELECTAREA("CLIENTES")
Ordsetfocus(1)
M->cXml := ''
IF DBSEEK(PEDIDOS->UCLIENTE)
M->cXml := '<dest>'
M->cXml += XmlTag( 'CNPJ', ALLTRIM(CLIENTES->CPFCGC) )
M->cXml += XmlTag( 'xNome', rtrim(TIRACENTO(CLIENTES->NRAZ_SOC)) )
M->cXml += '<enderDest>'
M->cXml += XmlTag( 'xLgr', rtrim(TIRACENTO(CLIENTES->ENDER)) )
M->cXml += XmlTag( 'nro', rtrim(STR(CLIENTES->NUMERO,9,0)) )
M->cXml += XmlTag( 'xCpl', rtrim(CLIENTES->COMPLEM) )
M->cXml += XmlTag( 'xBairro', rtrim(CLIENTES->BAIR) )
M->cXml += XmlTag( 'cMun', rtrim(CLIENTES->CODMUN) )
M->cXml += XmlTag( 'xMun', rtrim(CLIENTES->CIDADE) )
M->cXml += XmlTag( 'UF', CLIENTES->UF )
M->cXml += XmlTag( 'CEP', SoNumeros( CLIENTES->CEP ) )
M->cXml += XmlTag( 'cPais', CLIENTES->CODPAIS )
M->cXml += XmlTag( 'xPais', rtrim(CLIENTES->PAIS) )
M->cXml += XmlTag( 'fone', rtrim(CLIENTES->FONE) )
M->cXml += '</enderDest>'
M->cXml += XmlTag( 'indIEDest', CLIENTES->ISENTO )
M->cXml += XmlTag( 'IE', rtrim(CLIENTES->INSEST) )
M->cXml += XmlTag( 'ISUF', rtrim(CLIENTES->SUFRAMA) )
M->cXml += XmlTag( 'IM', rtrim(CLIENTES->INSMUN) )
M->cXml += XmlTag( 'email', rtrim(CLIENTES->EMAIL) )
M->cXml += '</dest>'
ENDIF
DBSELECTAREA("PEDIDOS")
RETURN M->cXml