Os termos NFe, XML, etc estão em alta e pauta.
Para tanto o que não faltam são utilitarios que facilitem o trabalho arduo de assinatura, validação, envio e retorno de informações para nossos sistemas.
Eu sempre apostei no trabalho do pessoal envolvido no ACBr e suas infinidades de funções.
Este projeto conta tambe´m com uma ferramenta para o desenvolvedor que auxilia o intercambio com Nota Fiscal Eletronica através do ACBrNFe Monitor.
Para ajudar os amigos a implementa-lo em seus sistemas bolei estas funções para uso com Fivewin.
Não tive a oportunidade de testar entre o monitor e o SEFAZ, mas testei entre o sistema e o monitor:
#include "fivewin.ch"
/////////////////////////////////////////////////////////////////////////////
//
// ACBR - Funcoes Compativeis com Monitor ACBr NFe
//
// Autor: Jose Carlos da Rocha
// Data: 24/03/2009
// Email: irochinha@itelefonica.com.br
// MSN: fivolution@hotmail.com
// Linguagem: xBase
// Prefixo: ACBR_NFE_
// Plataformas: DOS, Windows
// Requerimentos: Harbour/xHarbour( Para uso com Clipper eliminar Prefixo )
//
/////////////////////////////////////////////////////////////////////////////
function ACBR_NFE_StatusServico()
cCmd := ""
ACBR_NFE_Comando( "NFE.StatusServico", ["]+cCmd+["] )
MyWait(2)
retorno := ACBR_NFE_Retorno()
return retorno
function ACBR_NFE_AssinarNFe( cXML )
cCmd := iif(cXML=nil,"",cXML)
ACBR_NFE_Comando( "ECF.AssinarNFe", ["]+cCmd+["] )
MyWait(2)
retorno := ACBR_NFE_Retorno()
return retorno
function ACBR_NFE_ValidarNFe( cXML )
cCmd := iif(cXML=nil,"",cXML)
ACBR_NFE_Comando( "ECF.ValidarNFe", ["]+cCmd+["] )
MyWait(2)
retorno := ACBR_NFE_Retorno()
return retorno
function ACBR_NFE_ConsultarNFe( cNFe )
cCmd := iif(cNFe=nil,"",cNFe)
ACBR_NFE_Comando( "ECF.ConsultarNFe", ["]+cCmd+["] )
MyWait(2)
retorno := ACBR_NFE_Retorno()
return retorno
function ACBR_NFE_CancelarNFe( cNFe )
cCmd := iif(cNFe=nil,"",cNFe)
ACBR_NFE_Comando( "ECF.CancelarNFe", ["]+cCmd+["] )
MyWait(2)
retorno := ACBR_NFE_Retorno()
return retorno
function ACBR_NFE_ImprimirDANFe( cXML )
cCmd := iif(cXML=nil,"",cXML)
ACBR_NFE_Comando( "ECF.ImprimirDANFe", ["]+cCmd+["] )
MyWait(2)
retorno := ACBR_NFE_Retorno()
return retorno
function ACBR_NFE_InutilizarNFe( cCNPJ, cJustificativa, nAno, nModelo, nSerie, nNumInicial, nNumFinal )
cCNPJ := iif(cCNPJ=nil,"XXXXXXXXXXXXXX",cCNPJ)
cJustificativa := iif(cJustificativa=nil,"TESTE NFE",cJustificativa)
nAno := str( nAno )
nModelo := str( nModelo )
nSerie := str( nSerie )
nNumInicial := str( nNumInicial )
nNumFinal := str( nNumfinal )
cCmd := ["]+cCNPJ+[","]+cJustificativa+[",]+nAno+[,]+nModelo+[,]+nSerie+[,]+nNumInicial+[,]+nNumFinal
ACBR_NFE_Comando( "ECF.InutilizarNFe", cCmd )
MyWait(2)
retorno := ACBR_NFE_Retorno()
return retorno
function ACBR_NFE_EnviarNFe( cArquivo, nLote, nAssina, nImprime )
nLote := str( nLote )
nAssina := str( nAssina )
nImprime := str( nImprime )
cCmd := ["]+cArquivo+[",]+nLote+[,]+nAssina+[,]+nImprime
ACBR_NFE_Comando( "ECF.EnviarNFe", cCmd )
MyWait(2)
retorno := ACBR_NFE_Retorno()
return retorno
function ACBR_NFE_Comando( cIndice, cDados )
local ret_line := "chr(13)+chr(10)"
cPath := cFilePath( GetModuleFileName( GetInstance() ) )
cDirDoMonitor := VerifyINI( "ACBrNFe", "REMESSA" , cPath+"\REM", cPath+"ACBrNFe.ini", .f. )
if ! MsgYesNo( "Continua salvando em "+alltrim(cDirDoMonitor)+"?" )
cDirDoMonitor := cGetDir("Salvar NFE na pasta",cDirDoMonitor) + "\"
endif
cDirDoMonitor := VerifyINI( "ACBrNFe", "REMESSA" , cPath+"\REM", cPath+"ACBrNFe.ini", .t. )
errfile := "ENT.CMD"
cDados := iif(ValType(cDados)#"C","",cDados)
errhandle := FCREATE(errfile)
cBuffer := cIndice + iif( len( cDados )=0,"()","(" + cDados + ")")
FWRITE(errhandle,cBuffer+&ret_line.)
FCLOSE(errhandle)
//
FERASE( cDirDoMonitor+"\ENTNFE.TXT" )
FERASE( cDirDoMonitor+"\SAINFE.TXT" )
MyWait(2)
if !file(cDirDoMonitor+"\Monitor.exe")
MsgStop( "Monitor da ACBRNFe nao encontrado em "+cDirDoMonitor )
return .t.
endif
MyCopyFile( "ENT.CMD", cDirDoMonitor+"\ENT.CMD" )
MyWait(2)
FRENAME( cDirDoMonitor+"\ENT.CMD",cDirDoMonitor+"\ENTNFE.TXT" )
MyWait(3)
return .t.
function ACBR_NFE_Retorno(lMostra)
_vezes_ := 5
cPath := cFilePath( GetModuleFileName( GetInstance() ) )
cDirDoMonitor := VerifyINI( "ACBrNFe", "REMESSA" , cPath+"\REM", cPath+"ACBrNFe.ini", .f. )
do while _vezes_>0
// Verifica se o arquivo Status.txt existe.
// Este arquivo que contém o estado de execução do comando
// enviado.
if file( cDirDoMonitor+"\SAINFE.TXT" ) //.and. freadstr( cDirDoMonitor+"\Status.txt" ) <> "0"
cECFLOG := memoread( cDirDoMonitor+"\SAINFE.TXT" )
if "ERRO" $ Upper(cECFLOG)
//MsgStop( cECFLOG )
//return StrTran( cECFLOG, "ERRO:", "" )
endif
if "OK" $ Upper(cECFLOG)
return StrTran( cECFLOG, "OK:", "" )
else
MsgStop( cECFLOG )
endif
endif
MyWait(1)
_vezes_--
enddo
return ""
function VerifyINI( _section_, _entry_, _var_, _inifile_, _grava_ )
oIni := TIni():New( _inifile_ )
if _grava_ = .t.
oIni:Set( _section_, _entry_, _var_ )
endif
return oIni:Get( _section_, _entry_, _var_, _var_ )
Para auxiliar, disponibilizei um arquivo contendo o monitor e seus arquivos em:
NFe Monitor
Boa sorte.