A pedido do meu amigo Rubens aki do fórum em outro tópico estou compartilhando a maneira q estou fazendo, primeiramente tb quero dedicar agradecimentos ao Daniel q tão solidariamente cedeu a comunidade a rotina de montagem do XML a partir da consulta da chave, q tanto nos foi útil, mas de um tempo pra cá parou de funcionar, pode ser q com ajustes volte a funcionar, mas uma coisa é fato, o governo pode alterar isso a qualquer momento tendo q ter muita manutenção a rotina.
Agora existe uma forma de baixar o XML via webservices do governo através do certificado digital, isto é feito manifestando a NFe e posteriormente efetuando-se o download.
Resolvi adotar essa metodologia devido a maioria dos clientes já trabalhar com NFe ou NFCe ou seja, tem o certificado então basta configurar para manifestar e fazer o download.
A lógica q montei foi a seguinte, na entrada de notas, informou a chave da NFe sinal q quero dar entrada na mesma e estou de posse dela, então logicamente a operação foi confirmada.
O q eu faço é tentar baixar o XML, caso não de certo e o retorno dessa tentativa seja q existe NFe pra chave informada e a situação dessa nota é AUTORIZADA e o tipo é SAIDA (ou seja, saiu do emitente e será efetuada entrada no destinatario), eu manifesto ela como Confirmação da Operação e após isso já é possível o Download após algum tempo.
A rotina então ficou desta forma:
********************************************************************************
STATIC FUNCTION Entrada_Aux_DFe( cChave )
LOCAL cChave_CNPJ, cChave_AnoMes, cArqXML, cPathDown
cArqXML := cChave + '-nfe.xml'
cChave_CNPJ := SUBSTR(cChave,07,14)
cChave_AnoMes := '20'+SUBSTR(cChave,03,04)
cPathDown := oACBrNFe:cDirDoMonitor + 'RESPOSTA\' +cChave_CNPJ+ '\NFe\' +cChave_AnoMes+ '\Down\'
IF DFe_BaixaXML( cChave )
IF File( cPathDown+cArqXML ) // BAIXOU
FileMove( cPathDown+cArqXML, CurDirSys()+'XML\'+cArqXML)
ELSE // NAO BAIXOU // MANIFESTA COMO CONFIRMACAO DA OPERACAO
IF DFe_Manifestar(cChave, 2) // 1 Ciencia 2 Confirmação 3 Desconhecimento 4 Operacao nao realizada
Alert('NFe nao havia sido manifestada!;Aguardar pelo menos 5 min para baixar XML;Em caso de duvida entrar em contato com o suporte', aOk, vcamarelo)
ELSE
Alert('NFe nao havia sido manifestada!;Falha ao manifestar NFe;Solicite XML ao fornecedor ou em caso de duvida contactar o suporte', aOk, vcamarelo)
ENDIF
ENDIF
ENDIF
RETURN NIL
********************************************************************************
STATIC FUNCTION DFe_BaixaXML( cChave )
LOCAl aParametros, lRet := .F.
aParametros := {}
aadd( aParametros, xUFTocUF( cUserUF ) )
aadd( aParametros, cCNPJUser )
aadd( aParametros, cChave )
oACBrNFe:CriaReq( 'NFe.DistribuicaoDFePorChaveNFe', aParametros ) // NFe.DistribuicaoDFePorChaveNFe("50", "03891241000166", "41100300903403000170550100000780201030797370")
lRet := (oACBrNFe:cStatus == '138') // tem NFe pra chave em questao
IF lRet ; lRet := (ASCAN(oACBrNFe:aRetorno, 'TPAMB=1')>0) ; ENDIF // Emitida em Ambiente de Autorizacao
IF lRet ; lRet := (ASCAN(oACBrNFe:aRetorno, 'TPNF=1')>0) ; ENDIF // Tipo da Nota de Saida do Emitente
IF lRet ; lRet := (ASCAN(oACBrNFe:aRetorno, 'CSITNFE=1')>0); ENDIF // Situação AUTORIZADA
RETURN lRet
********************************************************************************
STATIC FUNCTION DFe_Manifestar(cChave, nTipo) // 1 Ciencia 2 Confirmação 3 Desconhecimento 4 Operacao nao realizada
LOCAL cLin := '', lOk := .F.
IF nTipo >0 .and. nTipo <=4
cLin += '[EVENTO]' + CRLF
cLin += 'idLote=1' + CRLF
cLin += '[EVENTO001]' + CRLF
cLin += 'chNFe=' + cChave + CRLF
cLin += 'cOrgao=91' + CRLF
cLin += 'CNPJ=' + cCNPJUser + CRLF
cLin += 'dhEvento=' + DTOC(date())+' '+Time()+ CRLF
cLin += 'tpEvento=' + IIF( nTipo == 1, '210210', IIF( nTipo == 2, '210200', IIF( nTipo == 3, '210220', '210240')))+CRLF
cLin += 'nSeqEvento=1' + CRLF
cLin += 'versaoEvento=' + pub_NFeVersao + CRLF
cLin += 'descEvento=' + IIF( nTipo == 1, 'Ciencia da Operacao', ;
IIF( nTipo == 2, 'Confirmacao da Operacao', ;
IIF( nTipo == 3, 'Desconhecimento da Operacao', 'Operacao nao realizada')))+CRLF
ENDIF
IF !EMPTY(cLin)
oACBrNFe:CriaReq( 'NFe.EnviarEvento', cLin)
lOk := (ASCAN(oACBrNFe:aRetorno, 'CSTAT=135')>0) // ok
ENDIF
RETURN lOk
Observações: O comando NFe.DistribuicaoDFePorChaveNFe, verifica a situação da NFe e caso ela tenha sido manifestada faz automaticamente o download do XML, caso não traz o resumo da NFe apenas, sendo necessário manifestar para posterior download.
Qdo é feito o download o ACBr cria o XML dentro da pasta de resposta das solicitações criando uma SUBPASTa com o nome igual ao CNPJ do emitente da NFe, dentro dessa pasta tem outra chamada NFe e depois outra com o Ano e Mes da emissao dessa NFe, depois outra chamada Down e ai sim vem o XML