Muito bom esse tópico.
Que tal enriquecê-lo ainda mais com o MDF-e ?
Vou deixar aqui o meu caminho das pedras...
o .prg inicial de como tentar fazer um mdfe pelo acbrmonitor plus.
==============================================================
detectando quando é outro estado
if confirma('NFE foi emitida. Deseja imprimir agora')="S"
if cliente->estcli # vem(ontem->uf)
Msginfo('ATENÇÃO ! Notas emitidas para outro estado entregues por você ou transportadora tem que acompanhar a MDF-e.')
if confirma('Deseja emitir o MDF-e') = "S"
emitir_mdfe(totnf)
else
Tecle(6039) // Se necessário emita-o pelo F8-MDFe
end
end
==============================================================
//----------->
Function emitir_mdfe(totnf)
acbrinsta := acbrnfeinsta()
if !fornec->(loc("!empty(tara)"))
Tecle(6030) // hb_ansitooem('Não existe proprietário e/ou motorista cadastrado.'))
return nil
end
na_janela(maxrow(),1,'Confeccionando Mdf-e....',NIL,8)
TEcle(6031) // hb_ansitooem('Entre com o código do fornecedor proprietário do veículo.'))
fornec_tran := ESCOMER('FORNEC','NOME','CODFOR')
fornec->(dbseek(fornec_tran))
if empty(fornec->tara) .or. empty(fornec->placa)
Tecle(6032) //hb_ansitooem('Fornecedor inválido. Ajuste o fornecedor proprietário e
return nil
end
TEcle(6033) //hb_ansitooem('Entre com o código do fornecedor MOTORISTA.'))
fornec_moto := ESCOMER('FORNEC','NOME','CODFOR')
peso_tot_car := 0
valor_tot_nfe := totnf
vortadado := pededado('Peso Total..: ',peso_tot_car,'@e 99,999.99','.t.','Valor Total.: ',valor_tot_nfe,'@e 99,999.99','.t.')
peso_tot_car := vortadado[1]
valor_tot_nfe := vortadado[2]
if lastkey() = 27
Tecle(6022) // abortado
return nil
end
if mdfe_nfe()
tecle('Emitido com sucesso.')
//apendanot("MDFE")
else
tecle(hb_ansitooem('Falha na emissão do MDF-e'))
end
fechajanela()
return nil
==============================================================
Function mdfe_nfe()
local fll := ''
local formar := subs(vem(ontem->codcidad),1,2) + subs(dtoc(hoje),9) + subs(dtoc(hoje),4,2)+sohnumero(vem(ontem->cgc))+'58'+'000'+strzero(paramet->mdrvyct,9)+'1'+strzero(paramet->mdrvyct,8)
local ritorna
local ondestava := select()
/*
22
16
04
73883381000178
58
000
000000001
1
00000001
*/
m_chave_nfe := curdrive()+':'+curdirx()+'nfe\envresp.txt\'+formar + '-mdfe.xml'
fll+='<?xml version="1.0" encoding="UTF-8"?>'
fll+='<MDFe xmlns="http://www.portalfiscal.inf.br/mdfe">'
fll+='<infMDFe Id="MDFe' + formar + validignfe(formar,2,9) + '" versao="1.00">'
fll+='<ide>'
fll+='<cUF>'+subs(vem(ontem->codcidad),1,2)+'</cUF>'
fll+='<tpAmb>' + if(stoq2000ehdos = 0 , '2' , '1') + '</tpAmb>'
fll+='<tpEmit>2</tpEmit>'
fll+='<mod>58</mod>'
fll+='<serie>0</serie>'
fll+='<nMDF>'+ltri(str(paramet->mdrvyct))+'</nMDF>'
fll+='<cMDF>'+strzero(paramet->mdrvyct,8)+'</cMDF>'
fll+='<cDV>'+validignfe(formar,2,9)+'</cDV>'
fll+='<modal>1</modal>'
fll+='<dhEmi>'+ subs(dtoc(hoje),7) + '-' + subs(dtoc(hoje),4,2) + '-' + subs(dtoc(hoje),1,2) +'T' + time()+'</dhEmi>'
fll+='<tpEmis>1</tpEmis>'
fll+='<procEmi>0</procEmi>'
fll+='<verProc>1.00</verProc>'
fll+='<UFIni>'+vem(ontem->uf)+'</UFIni>'
fll+='<UFFim>'+cliente->estcli+'</UFFim>'
fll+='<infMunCarrega>'
fll+='<cMunCarrega>'+vem(ontem->codcidad)+'</cMunCarrega>'
fll+='<xMunCarrega>'+trim(vem(ontem->cidad))+'</xMunCarrega>'
fll+='</infMunCarrega>'
fll+='</ide>'
fll+='<emit>'
fll+='<CNPJ>'+vem(ontem->cgc)+'</CNPJ>'
fll+='<IE>'+vem(ontem->iest)+'</IE>'
fll+='<xNome>'+trim(vem(ontem->razsoc))+'</xNome>'
fll+='<enderEmit>'
fll+='<xLgr>'+trim(vem(ontem->ender))+'</xLgr>'
fll+='<nro>'+trim(vem(ontem->numero))+'</nro>'
fll+='<xBairro>'+trim(vem(ontem->bairro))+'</xBairro>'
fll+='<cMun>'+vem(ontem->codcidad)+'</cMun>'
fll+='<xMun>'+trim(vem(ontem->cidad))+'</xMun>'
fll+='<UF>'+vem(ontem->uf)+'</UF>'
fll+='<CEP>'+vem(ontem->cep)+'</CEP>'
fll+='<fone>'+trim(vem(ontem->telef))+'</fone>'
fll+='</enderEmit>'
fll+='</emit>'
fll+='<infModal versaoModal="1.00">'
fll+='<rodo>'
fll+='<veicTracao>'
fornec->(dbseek(fornec_tran))
fll+='<cInt>'+substitui('-','',fornec->placa)+'</cInt>'
fll+='<placa>'+substitui('-','',fornec->placa)+'</placa>'
fll+='<tara>'+ltri(str(fornec->tara))+'</tara>'
fll+='<capKG>'+ltri(str(fornec->capkg))+'</capKG>'
fll+='<capM3>'+trim(fornec->capm3)+'</capM3>'
fll+='<prop>'
fll+='<CPF>'+sohnumero(fornec->cgcfor)+'</CPF>'
fll+='<RNTRC>'+trim(fornec->rntrc)+'</RNTRC>'
fll+='<xNome>'+trim(fornec->nome)+'</xNome>'
fll+='<IE>'+trim(fornec->iesfor)+'</IE>'
fll+='<UF>'+trim(fornec->uffor)+'</UF>'
fll+='<tpProp>2</tpProp>'
fll+='</prop>'
fornec->(dbseek(fornec_moto))
fll+='<condutor>'
fll+='<xNome>'+trim(fornec->nome)+'</xNome>'
fll+='<CPF>'+sohnumero(fornec->cgcfor)+'</CPF>'
fll+='</condutor>'
fll+='<tpRod>01</tpRod>'
fll+='<tpCar>02</tpCar>'
fll+='<UF>'+trim(fornec->uffor)+'</UF>'
fll+='</veicTracao>'
fll+='</rodo>'
fll+='</infModal>'
fll+='<infDoc>'
fll+='<infMunDescarga>'
fll+='<cMunDescarga>'+cliente->codcity+'</cMunDescarga>'
fll+='<xMunDescarga>'+semacento(trim(cliente->cidcli))+'</xMunDescarga>'
fll+='<infNFe>'
fll+='<chNFe>'+extraichave(a_chave_nfe,'\',.t.)+'</chNFe>'
fll+='</infNFe>'
fll+='</infMunDescarga>'
fll+='</infDoc>'
fll+='<tot>'
fll+='<qNFe>1</qNFe>'
fll+='<vCarga>'+ltrim(transform(valor_tot_nfe,'99999999999.99'))+'</vCarga>'
fll+='<cUnid>01</cUnid>'
fll+='<qCarga>'+ltrim(transform(peso_tot_car,'99999999999.99'))+'</qCarga>'
fll+='</tot>'
fll+='</infMDFe>'
fll+='</MDFe>'
mymemow(m_chave_nfe,fll)
if assinamdfe() .and. validamdfe() .and. enviamdfe()
dbselectar('hisnot')
adireg(0)
repassa(1,'CODM' , '00001')
repassa(1,'NOMECOM' , 'MDF-e')
repassa(1,'QTDE' , 1)
repassa(1,'PRECO' , 0.01)
repassa(1,'FORNEC' , paramet->nclibalc)
repassa(1,'NFISC' , strzero(paramet->mdrvyct,8))
repassa(1,'VLRCOM' , 0.01)
repassa(1,'VENDEDOR' , ovendedor)
repassa(1,'DTCOMP' , hoje)
repassa(1,'PUNIT' , 0.01)
repassa(1,'QTDENF' , 1)
repassa(1,'NFISCNF' , strzero(paramet->mdrvyct,8))
repassa(1,'NOT_TEF' , 'A')
repassa(1,'NFCANCEL' , 'N')
repassa(1,'ENTSAI' , 'C')
repassa(1,'TEXTCFOP' , 'MDF-e')
repassa(1,'CHAVE_NFE', m_chave_nfe)
Tecle(6035) // mdfe emitido com sucesso
if confirma('Deseja imprimir agora.') = "S"
oquedamfe := GETADO(3,'123','Como Imprimir-->:' , {'1-Impressora' , '2-Visualizar' , '3-Sair' })
if oquedamfe == '1'
minport := ''
os_ssa := cacaimp()
if empty(minport)
Tecle(6022) //'ImpressÆo abortada.')
end
ncopy := my_wget({'Quantas','C¢pias','?'},'99','.t.','Entrar n£mero C¢pias',2)
if imprimemfe(minport,ncopy)
Tecle(6036) // 'NFE foi impressa.')
else
Tecle(154) // "Problemas com a impressora. Utilize opção PDF ao imprimir novamente.")
end
Tecle(6037) // 'Para reimpressão menu Estoque/ Opção B-Histórico Notas / posicione-se sobre a NFE / pressione F5-Imprimir DANFE.')
elseif oquedamfe == '2'
IF !impmfepdf(a_chave_nfe)
Tecle(6023) //'Problemas ao visualizar o PDF.')
else
arqpdf := subs(a_chave_nfe,1,at('-nfe.xml',a_chave_nfe)-1) //+'.pdf'
if !file('nfe\envresp.txt\'+extraichave(arqpdf,'\')+'.pdf')
arqpdf := arqpdf+'-nfe.pdf'
else
arqpdf := arqpdf+'.pdf'
end
arqpdfsub := 'nfe\envresp.txt\'+extraichave(arqpdf,'\')
m_chave_antes_pdf := m_chave_nfe
m_chave_nfe := arqpdfsub
TEcle(184) // Visualizando por PDF vc poderá enviar por e-mail bla blaba
execdos('start '+m_chave_nfe)
m_chave_nfe := m_chave_antes_pdf
end
END
end
ritorna := .t.
else
ritorna := .f.
end
sele paramet
repassa(1,'mdrvyct',mdrvyct+1)
dbselectar(ondestava)
return ritorna
*--------------->
//------------>
Function validamdfe()
na_janela(maxrow(),1,'Validando o MDF-e.',NIL,8)
aguarda(1)
memowrit("nfe\entnfe.tmp",'MDFE.VALIDARMDFE("'+m_chave_nfe+'")')
if !comandanfe()
fechajanela()
return .f.
end
fechajanela()
return .t.
//------------------------->
Function assinamdfe()
na_janela(maxrow(),1,'Assinando o MDF-e.',NIL,8)
aguarda(1)
memowrit("nfe\entnfe.tmp",'MDFE.ASSINARMDFE("'+m_chave_nfe+'")')
if !comandanfe()
fechajanela()
return .f.
end
fechajanela()
return .t.
//----------->
Function enviamdfe()
na_janela(maxrow(),1,'Tentando enviar o MDF-e ao FISCO.',NIL,8)
aguarda(1)
memowrit("nfe\entnfe.tmp",'MDFE.ENVIARMDFE("'+m_chave_nfe+'",1,0,0)')
if !comandanfe()
fechajanela()
return .f.
end
fechajanela()
return .t.
//------------------------->
Function imprimemfe(minport,ncopy)
if ncopy = 0
Tecle(6038) // 'Abortado. C¢pias = 0.')
return .t.
end
if !file(m_chave_nfe) .and. file('nfe\envresp.txt\'+a_chave_nfe+'-mdfe.xml')
a_chave_nfe := curdrive()+':\'+curdir()+'\nfe\envresp.txt\'+a_chave_nfe+'-mdfe.xml'
end
arqpdf := subs(m_chave_nfe,1,at('-mdfe.xml',m_chave_nfe)-1) //+'.pdf'
if !file('nfe\envresp.txt\'+extraichave(arqpdf,'\')+'.pdf')
arqpdf := arqpdf+'-mdfe.pdf'
else
arqpdf := arqpdf+'.pdf'
end
arqpdfsub := 'nfe\envresp.txt\'+extraichave(arqpdf,'\')
if ! file(m_chave_nfe) //file(a_chave_nfe)
if file(arqpdfsub)
Tecle('Arquivo XML nao encontrado.')
if confirma(6040) = "S" //'Deseja visualizar o PDF para poder imprimir pelo Editor de PDF')="S"
execdos('start '+arqpdfsub)
return .t.
End
end
end
na_janela(maxrow(),1,'Imprimindo o MDF-e.',NIL,8)
aguarda(1)
memowrit("nfe\entnfe.tmp",'MDFE.IMPRIMIRDAMDFE("'+a_chave_nfe+'","'+minport+'",'+ltri(str(ncopy))+')')
if !comandanfe()
fechajanela()
return .f.
end
fechajanela()
if !file('nfe\envresp.txt\'+extraichave(m_chave_nfe,'\',.t.)+'.pdf')
impmfepdf(m_chave_nfe)
end
return .t.
//------------------------->
Function impmfepdf(o_arq_pdf)
local arqpdftest,arqtestpdf
acbrinsta := acbrnfeinsta()
arqpdftest := subs(o_arq_pdf,1,at('-mdfe.xml',o_arq_pdf)-1)+'.pdf'
arqtestpdf := subs(o_arq_pdf,1,at('-mdfe.xml',o_arq_pdf)-1)+'-mdfe.pdf'
if !file(o_arq_pdf)
//Tecle(153) // 'NFE deve ser impressa na estação que tem o certificado.')
//Tecle(hb_ansitooem('Porém faça uma tentativa.'))
end
if !testafile(arqpdftest) .or. !testafile(arqtestpdf)
limpa()
Tecle(6039) //'Arquivo .PDF do MDFE está aberto. Feche-o.')
retu .f.
end
na_janela(maxrow(),1,'Imprimindo o PDF do MDFE.',NIL,8)
aguarda(1)
memowrit("nfe\entnfe.tmp",'NFe.ImprimirDAMDFEPDF("'+o_arq_pdf+'")')
if !comandanfe()
fechajanela()
return .f.
end
fechajanela()
return .t.
Bom.... eu já até consegui fazer bastante coisa. Consegui emitir o mdf-e
Mas na hora de encerrar é que tá o perigo....