Autorizar NFE:
oSefaz := SefazClass():New()
oSefaz:NfeLoteEnvia( cXml, "1", "SP", "nomecertificado", "1" )
hb_MemoWrit( "NFE-Autorizado.xml", oSefaz:cXmlAutorizado )
Autorizar CTE:
oSefaz := SefazClass():New()
oSefaz:CteLoteEnvia( cXml, "1", "SP", "nomecertificado", "1" )
hb_MemoWrit( "CTE-Autorizado.xml", oSefaz:cXmlAutorizado )
Autorizar MDFE:
oSefaz := SefazClass():New()
oSefaz:MDFeLoteEnvia( cXml, "1", "SP", "nomecertificado", "1" )
hb_MemoWrit( "MDFE-Autorizado.xml", oSefaz:cXmlAutorizado )
Carta de Correção NFE:
oSefaz := SefazClass():New()
pSefaz:NfeEventoCce( "chave", cXml, "nomecertificado", "1" )
hb_MemoWrit( "NFE-Carta-Autorizado.xml", oSefz:cXmlAutorizado )
Cancelamento:
oSefaz := SefazClass():New()
oSefaz:NfeEventoCancela( "chave", cXml, "nomecertificado", "1" )
hb_MemoWrit( "NFE-Cancelamento-Autorizado.xml", oSefaz:cXmlAutorizado )
E se precisar dos "arquivos temporários", ou configurar antes de começar, ou configuração detalhada, ou algo mais, só olhar o que tem disponÃvel.
CREATE CLASS SefazClass
/* configuração */
VAR cProjeto INIT WS_PROJETO_NFE /* Modificada conforme método */
VAR cAmbiente INIT WS_AMBIENTE_PRODUCAO
VAR cVersao INIT "3.10" /* Modificada conforme método */
VAR cScan INIT "N" /* Indicar se for SCAN/SVAN, ainda não testado */
VAR cUF INIT "SP" /* Modificada conforme método */
VAR cCertificado INIT "" /* Nome do certificado */
VAR cIndSinc INIT INDSINC_RETORNA_RECIBO /* Poucas UFs opção de protocolo */
VAR nTempoEspera INIT 7 /* intervalo entre envia lote e consulta recibo */
VAR cUFTimeZone INIT "SP" /* Para DateTimeXml() Obrigatório definir UF default */
/* XMLs de cada etapa */
VAR cXmlDados INIT "" /* usado pra criar/complementar XML do documento */
VAR cXmlRetorno INIT "Erro Desconhecido" /* Retorno do webservice e/ou rotina */
VAR cXmlRecibo INIT "" /* XML recibo (obtido no envio do lote) */
VAR cXmlProtocolo INIT "" /* XML protocolo (obtido no consulta recibo e/ou envio de outros docs) */
VAR cXmlAutorizado INIT "" /* XML autorizado, caso tudo ocorra sem problemas */
VAR cStatus INIT "" /* Status obtido da resposta final da Fazenda */
VAR cRecibo INIT "" /* Número do recibo */
VAR cMotivo INIT "" /* Motivo constante no Recibo */
/* uso interno */
VAR cVersaoXml INIT "" /* Apenas versão usada no XML */
VAR cServico INIT "" /* Operação existente no webservice */
VAR cSoapAction INIT "" /* Ação solicitada ao webservice */
VAR cWebService INIT "" /* Endereço de webservice */
VAR cXmlSoap INIT "" /* XML completo enviado pra Sefaz, incluindo informações do envelope */
Exemplo:
oSefaz := SefazClass():New()
oSefaz:cCertificado := "nomecertificado"
oSefaz:cAmbiente := "1"
oSefaz:cUF := "SP"
oSefaz:NfeLoteEnvia( cXml )
IF oSefaz:cStatus $ "100,102"
hb_MemoWrit( "XmlAutorizado.xml", oSefaz:cXmlAutorizado )
MsgExclamation( iif( oSefaz:cStatus == "100", ""Nota autorizada", "Nota Denegada" )
ELSE
hb_MemoWrit( "XmlDados.xml", oSefaz:cXmlDados )
hb_MemoWrit( "XmlRetorno.xml", oSefaz:cXmlRetorno )
hb_MemoWrit( "XmlProtocolo.xml", oSefaz:cXmlProtocolo )
hb_MwmoWrit( cServico", oSefaz:cServico )
hb_MemoWrit( "WebService", oSefaz:cWebService )
hb_MemoWrit( "SoapAction", oSefaz:cSoapAction )
hb_MemoWrit( "XmlSoap", oSefaz:cXmlSoap )
IF .NOT. Empty( oSefaz:cMotivo )
MsgExclamation( "Problema " + oSefaz:cMotivo )
ELSE
MsgExclamation( "Erro " + oSefaz:cXmlRetorno )
ENDIF
ENDIF
Não existe arquivo, cada um grava o que quiser, aonde quiser, com o nome que quiser, do jeito que quiser.
Para o aplicativo Harbour, para a classe, para a assinatura, e para a Fazenda, tudo é string.
Arquivo temporário serve apenas pra transferir entre aplicativos, ou para nós resolvermos algum problema tendo os detalhes do que aconteceu.
Se quiser alterar alguma coisa ou adicionar alguma coisa na classe: um exemplo com Herança, alterando o NfeLoteEnvia() pra gravar arquivos
PROCEDURE Main
oSefaz := MySefazClass():New()
oSefaz:NfeLoteEnvia( "NumeroNota", cXml, "1", "SP", "nomecertificado", "1" )
RETURN
CREATE MySefazClass INHERIT SefazClass
METHOD NfeLoteEnvia( cNumeroNota, ... )
END CLASS
METHOD NfeLoteEnvia( cNumeroNota, ... ) CLASS Sefazclass
::SUPER:NfeLoteEnvia( ... ) // aqui chama o método original
IF ::cStatus $ "100,102"
hb_MemoWrit( "NFE-" + cNumeroNota + "-Autorizado.xml", ::cXmlAutorizado )
ELSE
hb_MemoWrit( "NFE-" + cNumeroNota + "-Dados.xml", ::cXmlDados )
hb_MemoWrit( "NFE-" + cNumeroNota + "-Retorno.xml", ::cXmlRetorno )
hb_MemoWrit( "NFE-" + cNumeroNota + "-Protocolo.xml", ::cXmlProtocolo )
hb_MwmoWrit( "NFE-" + cNumeroNota + "-Servico", ::cServico )
hb_MemoWrit( "NFE-" + cNumeroNota + "-WebService", ::cWebService )
hb_MemoWrit( "NFE-" + cNumeroNota + "-SoapAction", ::cSoapAction )
hb_MemoWrit( "NFE-" + cNumeroNota + "-Soap", ::cXmlSoap )
ENDIF
RETURN ::cXmlRetorno
Nota: editado depois pra corrigir exemplo de herança.