Olá Pessoal!
Também desenvolvo em clipper/harbour e compartilho com vocês os mesmos sentimentos. Cabe ressaltar a grandiosidade do projeto ACBrMonitor, que é uma mão na roda. O tempo é curto e há muita informação a respeito da NFe, porém, é nos fóruns que podemos sanar nossas dúvidas e trocar conhecimento. Estou a duas semanas trabalhando diretamente na integração dos meus sistemas com a NFe. Até agora consegui realizar os principais procedimentos: assinar, validar, enviar, cancelar, inutilizar e imprimir o Danfe das NFe's, isso com a ajuda do ACBrNFeMonitor. A rotina que estou usando está aí, usem e alterem de acordo com as necessidades de vocês. Vamos trocar informações.
Um grande abraço!
PS.: Este exemplo é usado para empresa optante do Simples Nacional, logo, não há cálculo de imposto.
* --...................................................................................-- *
Function GeraArqACBr()
Local cBase := BaseDeDados()
#define _SHOW_PERCENT 5
#define _SMALL_BLOCK 4096
#define _DEFAULT_BLOCK 8192
#define _LARGE_BLOCK 16384
Local1:= Chr(13) + Chr(10)
Local2:= 0
if Nota->gerada = "S"
Msginfo( "A Nota Fiscal Eletônica ID Número"+ QUEBRA + idDaNFe + QUEBRA + "JÁ FOI GERADA","NFe")
Return
endif
nfeEmpresa:=RemoverAcentos(Decripta(Alltrim(Config->Nome)))
xEndereco:=Decripta(Alltrim(Config->END1))
EmpEndereco:=""
EmpoNumero:=""
for k=1 to Len(xEndereco)
xVar:=Substr(xEndereco,k,1)
if xVar = ","
EmpNumero:=Substr(xEndereco,k+1,Len(xEndereco)-k)
exit
else
EmpEndereco:=EmpEndereco+xVar
endif
next
codMunEmpresa:="4318705" // SAO LEOPOLDO - RS
nfeEmpresa:=RemoverAcentos(Decripta(Alltrim(Config->Nome)))
MunEmpresa:=RemoverAcentos(Decripta(Alltrim(Config->Mun1)))
endEmepresa:=RemoverAcentos(alltrim(EmpEndereco))
cepEmpresa:=StrTiraPictureXml ( Decripta(Alltrim(Config->Cep1)), "-" )
FoneEmpresa:=Decripta(Alltrim(Config->Fone))
numLogradoro:=Alltrim(EmpNumero)
BairroEmpresa:=Decripta(Alltrim(Config->Bairro))
UfEmpresa:= Decripta(Alltrim(Config->Est1))
InscEmpresa:=Decripta(Alltrim(Config->Insc))
// Arquivo que gerencia a numeração de Lotes da NFe
// 08/08/2009
lotenfe=cBase+"lotenfe"
if !File((cBase)+"lotenfe.dbf")
m:= {{"NUMERO", "N", 10, 0}}
dbcreate((cBase)+"lotenfe.dbf",m)
Use (lotenfe) Alias lotenfe New Shared Via DRIVER
lotenfe->(DBAppend())
endif
if Select("lotenfe") = 0
Use (lotenfe) Alias lotenfe New Shared Via DRIVER
endif
do while .t.
if Flock()
oLoteNFE := Alltrim(Transform(lotenfe->numero+1,"@ 999999"))
lotenfe->numero:=lotenfe->numero+1
lotenfe->(DBCommit())
lotenfe->(dbUnlock())
lotenfe->(DBCloseArea())
exit
else
msgInfo("Aguarde a liberação do arquivo gestor da numeração de Lotes das NFe's!","A t e n ç ã o")
endif
enddo
Local3:="C:\ACBrNFeMonitor\ENTNFE.TXT"
nhandle:= fcreate(Local3, Local2)
//fwrite(nhandle, ;
//'NFE.CriarNFe("' + Local1)
fwrite(nhandle, ;
'NFE.CriarEnviarNFe("' + Local1)
fwrite(nhandle, ;
"[Identificacao]" + Local1)
fwrite(nhandle, ;
"NaturezaOperacao="+Alltrim(Sefcod->Nome) + Local1)
fwrite(nhandle, ;
"Modelo="+ModeloNFE + Local1)
fwrite(nhandle, ;
"Serie=0" + Local1)
fwrite(nhandle, ;
"Codigo="+Alltrim(str(nota->num_nfe)) + Local1)
fwrite(nhandle, ;
"Numero="+Alltrim(str(nota->num_nfe)) + Local1)
fwrite(nhandle, ;
"Emissao="+dtoc(nota->dtEmis) + Local1)
fwrite(nhandle, ;
"Saida="+dtoc(nota->dtEmis) + Local1)
fwrite(nhandle, ;
"Tipo=1" + Local1)
fwrite(nhandle, ;
"FormaPag="+idPgto + Local1)
fwrite(nhandle, ;
"Finalidade=1" + Local1)
// Dados do Emitente
fwrite(nhandle, ;
"[Emitente]" + Local1)
fwrite(nhandle, ;
"CNPJ="+CNPJNFE + Local1)
fwrite(nhandle, ;
"IE="+InscEmpresa + Local1)
fwrite(nhandle, ;
"Razao="+nfeEmpresa+ Local1)
fwrite(nhandle, ;
"Fantasia=" + Local1)
fwrite(nhandle, ;
"Fone=" +FoneEmpresa+ Local1)
fwrite(nhandle, ;
"CEP=" +cepEmpresa+ Local1)
fwrite(nhandle, ;
"Logradouro=" +EmpEndereco+ Local1)
fwrite(nhandle, ;
"Numero="+numLogradoro+ Local1)
fwrite(nhandle, ;
"Complemento=" + Local1)
fwrite(nhandle, ;
"Bairro=" +BairroEmpresa+ Local1)
fwrite(nhandle, ;
"CidadeCod="+codMunEmpresa + Local1)
fwrite(nhandle, ;
"Cidade="+MunEmpresa + Local1)
fwrite(nhandle, ;
"UF="+UfEmpresa + Local1)
// Dados do destinatário
fwrite(nhandle, ;
"[Destinatario]" + Local1)
fwrite(nhandle, ;
"CNPJ="+ClienteTxtCGC + Local1)
fwrite(nhandle, ;
"IE="+Alltrim(Clientes->Insc)+ Local1)
fwrite(nhandle, ;
"NomeRazao="+StrTiraPictureXml ( Alltrim(Clientes->Nome), "&" ) + Local1)
fwrite(nhandle, ;
"Fantasia=" + Local1)
fwrite(nhandle, ;
"Fone=" +Alltrim(Clientes->Fone)+ Local1)
fwrite(nhandle, ;
"CEP=" +Substr(Clientes->cep1,1,5)+Substr(Clientes->cep1,7,3)+ Local1)
fwrite(nhandle, ;
"Logradouro=" +Alltrim(Clientes->End1)+ Local1)
fwrite(nhandle, ;
"Numero="+Transform(Strzero(Val(Alltrim(Clientes->numero)),6),"@!")+Local1)
fwrite(nhandle, ;
"Complemento=" + Local1)
if !Empty(Clientes->Bairro)
fwrite(nhandle, ;
"Bairro=" +Alltrim(Clientes->Bairro)+ Local1)
else
fwrite(nhandle, ;
"Bairro=BAIRRO" + Local1)
endif
fwrite(nhandle, ;
"CidadeCod="+Clientes->codIBGE + Local1)
fwrite(nhandle, ;
"Cidade="+Alltrim(Clientes->Mun1) + Local1)
fwrite(nhandle, ;
"UF="+Alltrim(Clientes->Est1) + Local1)
sele Nota
wcont:= 1
clo:=1
clas:=1
basei:=0.0
baseitotal:=0.0
ttlimposto:=0.0
base_subst:=0.0
isento:=0.0
vlicms:=0.0
vltticms=0.0
totger:= 0.0
totger2:= 0.0
desconto:= wdesco:= 0.0
pr:=.t.
ultClasse:="00"
CLA_FISCAL:="Clas.Fiscal "
aBaseICMS:=oValorBASE:=oValorDoICMS:=0.00
do while (wcont < 18)
if (wcont > 9)
wcar:= Str(wcont, 2, 0)
else
wcar:= Str(wcont, 1, 0)
endif
xInfe:=Transform(strzero(wCont,2),"@!")
wc:= "codpro" + wcar
wq:= "quanti" + wcar
wp:= "precou" + wcar
wd:= "descon" + wcar
wi:= "prod" + wcar
wl:= "lote" + wcar
sele Nota
c:= SubStr(&wc, 1, 2) + SubStr(&wc, 3, 3) + ;
SubStr(&wc, 6, 1)
cod:= &wc
if (Val(cod) = 0)
if !pr
ali:=Transform(al_anterior, "@! 99%")
baseitotal:=(baseitotal+basei)
ttlimposto:=(ttlimposto+vlicms)
bcalculo:=Transform(basei, "@! 999,999.99")
wv_impo:=Transform(vlicms, "@! 99,999.99")
c12:=strzero(clo,2)
bs:="BS"+C12
&BS:="BASE ICMS "+ALI+" "+bcalculo+" Vlr.Imposto R$ "+wv_impo
basei:=vlicms:=0.0
store .t. to pr
endif
wcont:=20 && wcont+1
//lin:=lin+1
//@ lin, 70 SAY " "
loop
endif
wdesc:= &wi
sele Produtos
seek cod
if cod = "999999"
cClaFiscal := ultClasse
if Substr(wcodope,1,1) = "6"
if Estado = "SC" .or. Estado = "PR" .or. Estado = "SP";
.or. Estado = "RJ" .or. Estado = "MG"
store 12 to wicms
else
Store 7 to wicms
endif
else
store 17 to wicms
endif
store "01" to wtributo
store "S" to base_reduzida
store "UN" to unidade
else
if Substr(wcodope,1,1) = "6"
if Estado = "SC" .or. Estado = "PR" .or. Estado = "SP";
.or. Estado = "RJ" .or. Estado = "MG"
store 12 to wicms
else
Store 7 to wicms
endif
else
store icms to wicms
endif
store s_tribut to wtributo
store bcreduz to base_reduzida
store unid to unidade
cClaFiscal:=classefis
if cClaFiscal <> ultClasse
sele Clasfis
locate for codigo = cClaFiscal
if Found()
CLA_FISCAL:=CLA_FISCAL+cClaFiscal+"-"+Alltrim(Clasfis->DESCRICAO)+" "
endif
ultClasse:=cClaFiscal
sele Produtos
endif
endif
if wcodope = "5.915" .or. wcodope = "5.916" ;
.or. wcodope = "6.915" .or. wcodope = "6.916" && remessa p/conserto
store 0 to wicms
baseitotal:=0.00
ttlimposto:=0.00
endif
sele Nota
if !pr
if al_anterior <> wicms
ali:=Transform(al_anterior, "@! 99%")
bcalculo:=Transform(basei, "@! 999,999.99")
wv_impo:=Transform(vlicms, "@! 99,999.99")
clo:=clo+1
basei:=vlicms:=0.0
endif
endif
sele Nota
if &wp > 0
unicdesc:= &wp * ((100 - &wd) / 100)
pretot2:= &wq * &wp
pretot:= unicdesc * &wq
totger:= totger + pretot
totger2:= totger2 + pretot2
if wtributo <> "FF" .and. wtributo <> "II" && Tributaveis
if Substr(wcodope,1,1) = "6" && Fora do Estado
basei:=(basei+(pretot))
vlbase:=(pretot)
else && "5.102" Dentro do Estado -> redu‡„o p/12% (Tabela)
if base_reduzida = "S"
basei:=Round(basei+(pretot*70.589/100),2) &&(Tabela)
vlbase:=Round(pretot*70.589/100,2)
Tabela:="S"
else
basei:=(basei+(pretot)) && -> s/ Redu‡„o (Fora da Tabela)
vlbase:=(pretot)
Tabela:="N"
endif
endif
vlicms:=Round(vlicms+(vlBASE*wicms/100),2)
vltticms:=(vltticms+vlicms)
else
if wtributo = "FF" && Substituicao Tributaria
base_subst:=(base_subst + pretot)
elseif wtributo = "II" && Isentos
isento:=(isento + pretot)
endif
endif
descItem:=(pretot2 - pretot)
vCod:=Alltrim(Str(Val(cod)))
if Empty(unidade)
unidade:="MIL"
endif
if !Empty(&wl)
LoteItem := " Lote: "+&wl
else
LoteItem := " "
endif
// Dados do ítem[xxx]
fwrite(nhandle, ;
"[Produto0"+xInfe+"]" + Local1)
fwrite(nhandle, ;
"CFOP=" +Substr(Nota->codope,1,1)+Substr(Nota->codope,3,3) + Local1)
fwrite(nhandle, ;
"Codigo=" +cod+"-"+wCar + Local1)
fwrite(nhandle, ;
"Descricao=" +Alltrim(wDesc)+LoteItem + Local1)
fwrite(nhandle, ;
"Unidade=" +unidade + Local1)
fwrite(nhandle, ;
"Quantidade=" +TRANSFORM(&wq,"@! 99999999.9999") + Local1)
fwrite(nhandle, ;
"ValorUnitario=" +ALLTRIM(TRANSFORM(&wp,"@ 999999999999.99")) + Local1)
fwrite(nhandle, ;
"ValorTotal=" +ALLTRIM(TRANSFORM(pretot,"@ 999999999999.99")) + Local1)
fwrite(nhandle, ;
"ValorDesconto=" +ALLTRIM(TRANSFORM(descItem,"@ 99999999999999.99")) + Local1)
// Dados do icms[xxx]
ValorIcmsItem := 0.00 //ALLTRIM(TRANSFORM((pretot*wicms)/100,"@! 9999999999"))
fwrite(nhandle, ;
"[ICMS0"+xInfe+"]" + Local1)
fwrite(nhandle, ;
"CST=41" + Local1)
fwrite(nhandle, ;
"Aliquota=0" + Local1)
fwrite(nhandle, ;
"ValorBase=0" + Local1)
/*
// Dados PIS EPP - Simples Nacional
fwrite(nhandle, ;
"[PIS0"+xInfe+"]" + Local1)
fwrite(nhandle, ;
"CST=99" + Local1)
fwrite(nhandle, ;
"ValorBase=0" + Local1)
fwrite(nhandle, ;
"Aliquota=0" + Local1)
fwrite(nhandle, ;
"Valor=0" + Local1)
fwrite(nhandle, ;
"Quantidade=0" + Local1)
// Dados COFINS EPP - Simples Nacional
fwrite(nhandle, ;
"[COFINS0"+xInfe+"]" + Local1)
fwrite(nhandle, ;
"CST=99" + Local1)
fwrite(nhandle, ;
"ValorBase=0" + Local1)
fwrite(nhandle, ;
"Aliquota=0" + Local1)
fwrite(nhandle, ;
"Valor=0" + Local1)
fwrite(nhandle, ;
"Quantidade=0" + Local1)
*/
baseitotal:=(baseitotal+basei)
ttlimposto:=(ttlimposto+vlicms)
al_anterior:=wicms
store .f. to pr
endif
wcont:= wcont + 1
coluna:=7
sele Nota
if wcont > 17
if !pr
ali:=Transform(al_anterior, "@! 99%")
baseitotal:=(baseitotal+basei)
ttlimposto:=(ttlimposto+vlicms)
bcalculo:=Transform(basei, "@! 999,999.99")
wv_impo:=Transform(vlicms, "@! 99,999.99")
basei:=vlicms:=0.0
endif
wcont:=20 && wcont+1
loop
endif
enddo
oValorBase:=aBaseICMS:=oValorDoICMS:=0
fwrite(nhandle, ;
"[Total]" + Local1)
fwrite(nhandle, ;
"ValorBase="+ALLTRIM(TRANSFORM((oValorBase),"@! 999999999999.99")) + Local1)
fwrite(nhandle, ;
"BaseICMS="+ALLTRIM(TRANSFORM((aBaseICMS),"@! 999999999999.99")) + Local1)
fwrite(nhandle, ;
"ValorICMS="+ALLTRIM(TRANSFORM((oValorDoICMS),"@! 999999999999.99")) + Local1)
fwrite(nhandle, ;
"ValorProduto="+ALLTRIM(TRANSFORM((totger+Nota->descont),"@! 999999999999.99")) + Local1)
fwrite(nhandle, ;
"ValorNota="+ALLTRIM(TRANSFORM((totger+Nota->Frete),"@! 999999999999.99")) + Local1)
if Nota->descont > 0
fwrite(nhandle, ;
"ValorDesconto="+ALLTRIM(TRANSFORM((Nota->descont),"@! 999999999999.99")) + Local1)
endif
if Nota->frete > 0
fwrite(nhandle, ;
"ValorFrete="+ALLTRIM(TRANSFORM((Nota->Frete),"@! 999999999999.99")) + Local1)
endif
Sele Transp
// Dados da Transportadora
fwrite(nhandle, ;
"[Transportador]" + Local1)
fwrite(nhandle, ;
"FretePorConta=1" + Local1)
fwrite(nhandle, ;
"CnpjCpf="+Transp->cgc+ Local1)
fwrite(nhandle, ;
"NomeRazao="+ Alltrim(Transp->Nombres)+ Local1)
fwrite(nhandle, ;
"IE=" + Local1)
fwrite(nhandle, ;
"Endereco="+ Alltrim(transp->Calle)+ Local1)
fwrite(nhandle, ;
"Cidade="+ Alltrim(transp->Cidade)+ Local1)
fwrite(nhandle, ;
"UF="+ Alltrim(transp->Est1)+ Local1)
if !Empty(nota->placa)
fwrite(nhandle, ;
"Placa="+ Alltrim(nota->placa)+ Local1)
fwrite(nhandle, ;
"UFPlaca="+ Alltrim(nota->Ufplaca) + Local1)
endif
// Dados do Volume
fwrite(nhandle, ;
"[Volume001]" + Local1)
if Nota->qtd > 0
fwrite(nhandle, ;
"Quantidade="+ALLTRIM(TRANSFORM((Nota->qtd),"@!999999")) + Local1)
else
fwrite(nhandle, ;
"Quantidade=" + Local1)
endif
fwrite(nhandle, ;
"Especie="+Alltrim(Nota->Especie_v) + Local1)
if Nota->pLiquido > 0
fwrite(nhandle, ;
"PesoLiquido="+ALLTRIM(TRANSFORM((Nota->pLiquido),"@! 999999.999")) + Local1)
else
fwrite(nhandle, ;
"PesoLiquido=" + Local1)
endif
if Nota->pBruto > 0
fwrite(nhandle, ;
"PesoBruto="+ALLTRIM(TRANSFORM((Nota->pBruto),"@! 999999.999")) + Local1)
else
fwrite(nhandle, ;
"PesoBruto=" + Local1)
endif
sele Receber
set filter to Nota = Nota->numnota
go top
ttlDpl:=0
wpri:=.t.
cTitulos:=0
do while .not. eof()
if Receber->nota <> Nota->numnota .or. Deleted()
dbskip()
loop
endif
// Dados da Fatura
fwrite(nhandle, ;
"[Duplicata0"+Transform(strzero(Receber->parcela,2),"@!")+"]" + Local1)
fwrite(nhandle, ;
"Numero=" +Transform(strzero(Receber->nota),"@!")+Transform(strzero(Receber->parcela,2),"@!")+ Local1)
fwrite(nhandle, ;
"DataVencimento=" +dtoc(Receber->dtVen)+ Local1)
fwrite(nhandle, ;
"Valor=" +ALLTRIM(TRANSFORM((Receber->valor),"@! 999999999999.99"))+ Local1)
dbskip()
enddo
if Clientes->EPP = "S"
dadosNfe1:= "Documento emitido por Empresa optante do Simples Nacional"
dadosNfe2:= "Nao gera direito a CREDITO de ISS e IPI."
else
dadosNfe1:= "Permite o aproveitamento do CREDITO de ICMS no Valor de R$ "+Alltrim(Transform( ( (totger+Nota->frete)*cAli_Icms )/100,"@E 99,999,999.99"))
dadosNfe2:= "correspondente a aliquota de "+Transform(cAli_Icms,"99.99%")+" Cfme. ART.23 DA LC 123/2006."
endif
fwrite(nhandle, ;
"[DadosAdicionais]" + Local1)
fwrite(nhandle, ;
'Complemento='+dadosNfe1+'. '+dadosNfe2+if(!Empty(nota->dd1),';'+alltrim(nota->dd1),"")+if(!Empty(nota->dd2),';'+alltrim(nota->dd2),"")+if(!Empty(nota->dd3),';'+alltrim(nota->dd3),"")+'",'+oLoteNFE+',0)'+ Local1 )
fclose(nhandle)
*-----------------------
Sele Nota
Nota->(Rlock())
Nota->gerada := "S"
Nota->(dbUnlock())
Nota->(dbCommit())
*-----------------------
NContador:= 1
nPb1 := 1
DEFINE WINDOW OSIT AT 140 , 235 WIDTH 580 HEIGHT 80 title "ENVIANDO DADOS PARA SEFAZ, AGUARDE..." ICON 'ICONE01' ;
NOMAXIMIZE NOSYSMENU ON INIT Contador()
DEFINE PROGRESSBAR PB1
ROW 15 ;COL 10 ;WIDTH 550 ;HEIGHT 20 ;RANGEMIN 1 ;RANGEMAX 100
VALUE 0 ;VISIBLE .F. ;FORECOLOR {255,0,0}
END PROGRESSBAR
END WINDOW
Osit.center
Osit.activate
if File("C:\ACBrNFeMonitor\"+Nota->id_nfe+"-nfe.xml")
CopiarArquivo("C:\ACBrNFeMonitor\"+Nota->id_nfe+"-nfe.xml" , subPastaNFe( Substr(dtoc(Date()),7,4)+Substr(dtoc(Date()),4,2) )+"\"+Nota->id_nfe+"-nfe.xml")
IMPRIMEDANFE ( "C:\ACBrNFeMonitor\"+Nota->id_nfe+"-nfe.xml", 1 )
GRAVARETORNONFE()
endif
Return
*---------------------------------------------------------------------------------------------------------------------*
FUNCTION SubPastaNFe(oMes)
*---------------------------------------------------------------------------------------------------------------------*
Local Local1:= Chr(13) + Chr(10)
Local Local2:= 0
Private cfile :="nfe\"+(oMes)+"\Pasta.ok"
Private aPasta:="nfe\"+(oMes)
if !File(cfile)
createfolder("nfe\" + oMes)
nhandle:= fcreate(cfile , Local2)
fwrite(nhandle, ;
Encripta("Pasta criada em "+ dtoc(date())) + Local1)
fclose(nhandle)
endif
return(aPasta)