Soma os XML's NFe e NFCe, Zipa e manda para contabilidade. Fiquei procrastinando para fazer...
Mas tem clientes que até hoje não sabem zipar arquivos e anexar emails com outlook e cia.
Se fizer tudo de vez, como fica as atualizações ?
#include 'hwgui.ch'
**************
FUNCTION NFXML
**************
*
*
LOCAL oDlg, oFont, cTitulo:='XML de NF Emitidas',oBrw, cPhantom := "", oTo, cTo := Space(70)
LOCAL nMes := month(date()) - 1
LOCAL cAno := str(year(date()),4), cAnoMes := ""
LOCAL dIni, dFim, cUF, xCol
LOCAL aNFeXML, aNFCeXML
LOCAL cMascara := ""
LOCAL oImgEMAIL := hbitmap():AddResource( 'EMAIL' )
LOCAL oImgZIP := hbitmap():AddResource( 'IMG_ZIP' )
PREPARE FONT oFont NAME "MS Sans Serif" WIDTH 0 HEIGHT -16
INIT DIALOG oDlg CLIPPER TITLE cTitulo Font oFont AT 0,0 SIZE 300,200 STYLE DS_CENTER + WS_VISIBLE + WS_SYSMENU
@ 005,035 say 'Informe o Mês:' size 120,20
@ 120,030 get oMes Var nMes picture '99' valid {||nMes >= 1 .and. nMes <= 12} size 30,25
@ 005,065 say 'Informe o Ano:' size 120,20
@ 120,060 get oAno Var cAno picture '9999' size 50,25
@ 010,120 get oPhantom VAR cPhantom size 0,0
@ 200,020 Button oBt Caption 'Cancelar' Size 90,30 ON CLICK {||hwg_EndDialog()}
@ 200,100 Button oBt Caption 'Confirmar' Size 90,30 ON CLICK {||lOk:=.t.,hwg_EndDialog()}
Add status to oDlg parts 300
oDlg:Activate()
AbreDb('empresa.dbf','em',.t.)
cIBGECod := em->CodCidIBGE
cFantasia := em->empresa
FechaDb('em')
AbreDb('contador.dbf','cd',.t.)
cTo := Lower(cd->email)
FechaDb('cd')
cUF := SubStr(cIBGECod,1,2)
dIni := bom(ctod('01/'+str(nMes,2)+'/'+cAno))
dFim := eom(ctod('01/'+str(nMes,2)+'/'+cAno))
cAnoMes := hb_DToC(dIni,'YYMM')
cMascara := cUF + cAnoMes
aNFeXML := hb_DirScan( cPathNFeXML , cMascara + "*-nfe.xml" )
aNFCeXML := hb_DirScan( cPathNFCeXML , cMascara + "*-nfe.xml" )
IF Empty(aNFeXML)
hwg_msginfo("Não encontrado os arquivos NFe XML")
aNFeXML := {{"","","","",""}}
ENDIF
IF Empty(aNFCeXML)
hwg_msginfo("Não encontrado os arquivos NFCe XML")
aNFCeXML := {{"","","","",""}}
ENDIF
PREPARE FONT oFont NAME "MS Sans Serif" WIDTH 0 HEIGHT -14
PREPARE FONT oFontBrw NAME "Courire New" WIDTH 0 HEIGHT -16
INIT DIALOG oDlg CLIPPER TITLE cTitulo Font oFont AT 10,10 SIZE 1280,700 NOEXITESC STYLE DS_CENTER + WS_SYSMENU
@ 100,10 Browse oBrwNFe ARRAY of oDlg FONT oFontBrw Size 1100,280
Hwg_CreateArList( oBrwNFe, aNFeXML )
//oBrw:bOther := {|oBrw, msg, wParam, lParam| fKeyDownP(oBrw, msg, wParam, lParam, @lEsc,'eq')}
oBrwNFe:acolumns[1]:heading := "NFe XML"
oBrwNFe:acolumns[1]:length := 60
oBrwNFe:acolumns[1]:picture := '@R 99999999999999999999999999 99999999 9 99999999 9'
oBrwNFe:acolumns[2]:heading := "Tamanho"
oBrwNFe:acolumns[2]:length := 07
oBrwNFe:acolumns[2]:picture := '999,999'
oBrwNFe:acolumns[3]:heading := "Data"
oBrwNFe:acolumns[3]:length := 08
oBrwNFe:acolumns[3]:picture := '@E'
oBrwNFe:acolumns[4]:heading := "Hora"
oBrwNFe:acolumns[4]:length := 08
oBrwNFe:acolumns[4]:picture := '@!'
oBrwNFe:acolumns[5]:heading := "Attrib"
oBrwNFe:acolumns[5]:length := 06
oBrwNFe:acolumns[5]:picture := '@!'
@ 100,320 Browse oBrwNFCe ARRAY of oDlg FONT oFontBrw Size 1100,280
Hwg_CreateArList( oBrwNFCe, aNFCeXML )
//oBrw:bOther := {|oBrw, msg, wParam, lParam| fKeyDownP(oBrw, msg, wParam, lParam, @lEsc,'eq')}
oBrwNFCe:acolumns[1]:heading := "NFCe XML"
oBrwNFCe:acolumns[1]:length := 60
oBrwNFCe:acolumns[1]:picture := '@R 99999999999999999999999999 99999999 9 99999999 9'
oBrwNFCe:acolumns[2]:heading := "Tamanho"
oBrwNFCe:acolumns[2]:length := 07
oBrwNFCe:acolumns[2]:picture := '999,999'
oBrwNFCe:acolumns[3]:heading := "Data"
oBrwNFCe:acolumns[3]:length := 08
oBrwNFCe:acolumns[3]:picture := '@E'
oBrwNFCe:acolumns[4]:heading := "Hora"
oBrwNFCe:acolumns[4]:length := 08
oBrwNFCe:acolumns[4]:picture := '@!'
oBrwNFCe:acolumns[5]:heading := "Attrib"
oBrwNFCe:acolumns[5]:length := 06
oBrwNFCe:acolumns[5]:picture := '@!'
Add status to oDlg parts 230,230,100,0
oDlg:bActivate := {|| XMLTotais(oDlg,dIni,dFim,aNFeXML,aNFCeXML) }
@ 100,620 say "Email Contabilidade:" size 200,25
@ 320,610 get oTO VAR cTO size 500,25 STYLE ES_LOWERCASE + ES_AUTOHSCROLL
@ 010,005 OwnerButton oZip OF oDlg Size 68,68 ON CLICK {||ZipXML(dIni,aNFeXML,aNFCeXML) } FLAT BITMAP oImgZIP FROM RESOURCE TRANSPARENT COORDINATES 0,0,68,68 TOOLTIP "Compactar XML"
@ 010,100 OwnerButton oEmailZip OF oDlg Size 68,68 ON CLICK {||Enviar_ZipXML(dIni,oDlg) } FLAT BITMAP oImgEmail FROM RESOURCE TRANSPARENT COORDINATES 0,0,68,68 TOOLTIP "Enviar XML"
oDlg:Activate()
RETURN NIL
**************************************
FUNCTION ZipXML(dIni,aNFeXML,aNFCeXML)
**************************************
*
*
LOCAL cAnoMes := hb_DToC(dIni,'MM_YYYY'), aXML:={}, nX
LOCAL cNFeZip := hb_DirBase() + "\NFe_XML_"+cAnoMes+".zip"
LOCAL cNFCeZip := hb_DirBase() + "\NFCe_XML_"+cAnoMes+".zip"
FOR nX := 1 TO Len(aNFeXML)
AAdd(aXML,cPathNFeXML + aNFeXML[nX][1])
NEXT
IF hb_vfExists(cNFeZip)
IF hb_vfErase(cNFeZip) == 0
Else
hwg_msginfo("Falha apagando arquivo: " + cNFeZip)
RETURN .F.
ENDIF
ENDIF
oBar := HProgressBar():NewBox( "Compactando NFe, "+lTrim(Str(1,9))+" De "+lTrim(Str(Len(aNFeXML),9))+" Arquivo(s)",,,350,,)
hb_ZipFile(cNFeZip, aXML,,{||oBar:Step()})
oBar:Close()
aXML := {}
FOR nX := 1 TO Len(aNFCeXML)
AAdd(aXML,cPathNFCeXML + aNFCeXML[nX][1])
NEXT
IF hb_vfExists(cNFCeZip)
IF hb_vfErase(cNFCeZip) == 0
Else
hwg_msginfo("Falha apagando arquivo: " + cNFCeZip)
RETURN .F.
ENDIF
ENDIF
oBar := HProgressBar():NewBox( "Compactando NFCe, "+lTrim(Str(1,9))+" De "+lTrim(Str(Len(aNFCeXML),9))+" Arquivo(s)",,,350,,)
hb_ZipFile(cNFCeZip, aXML,,{||oBar:Step()})
oBar:Close()
*********************************
FUNCTION Enviar_ZIPXML(dIni,oDlg)
*********************************
*
*
LOCAL aFiles:={}, cAnoMes := hb_DToC(dIni,'MM_YYYY')
LOCAL cHost, lRet := .F., nPort, lSTARTTLS := .F.
LOCAL cNFeZip := hb_DirBase() + "\NFe_XML_"+cAnoMes+".zip"
LOCAL cNFCeZip := hb_DirBase() + "\NFCe_XML_"+cAnoMes+".zip"
IF hb_vfExists(cNFeZip)
aFiles := {cNFeZip}
Else
Hwg_MsgInfo("Não encontrado XML's da(s) NFe(s).")
ENDIF
IF hb_vfExists(cNFeZip) .and. hb_vfExists(cNFCeZip)
aFiles := {cNFeZip,cNFCeZip}
Else
Hwg_MsgInfo("Não encontrado XML's da(s) NFCe(s).")
ENDIF
cSubject := "XML Mês " + cAnoMes
cBody := "XML das Notas Fiscais." // + hb_eol() + "Não responda esse email."
cTo := "xyz@gmail.com"
cFrom := "sxxxxxx@gmail.com"
cHost := "smtp.gmail.com"
nPort := 465
cPassword := "XXXXXXXXXXXXXX"
xCC := ""
xBCC := ""
lRet := tip_MailSend( ;
cHost, ;
nPort, ; //iif( lSTARTTLS, 587, 465 ), ;
cFrom, ;
cTo, ;
xCC /* CC */, ;
xBCC /* BCC */, ;
cBody , ;
cSubJect , ;
aFiles /* attachment */, ;
cFrom, ;
cPassword, ;
"", ;
NIL /* nPriority */, ;
NIL /* lRead */, ;
.T. /* lTrace */, ;
.F., /*lPopAuth */ ;
NIL /* lNoAuth */, ;
NIL /* nTimeOut */, ;
NIL /* cReplyTo */, ;
nPort == 465) //! lSTARTTLS )
If lRet
hwg_Msginfo("Email enviado." + hb_eol() + "Assunto: " + cSubject+hb_eol() + "Endereço: "+cTo)
Else
hwg_Msgexclamation("Falha enviando email via TIP_MAILSEND")
EndIf
RETURN lRet
***************************************************
FUNCTION XMLTotais(oDlg,dIni,dFim,aNFeXML,aNFCeXML)
***************************************************
*
*
LOCAL nX, aXML := {}, nIgnorada := 0
LOCAL nTotalNFe := 0, nTotalNFCe := 0
LOCAL nValorProdNFCe := 0, nValorProdNFe := 0
oBar := HProgressBar():NewBox( "Processando, "+lTrim(Str(0,9))+" De "+lTrim(Str(Len(aNFeXML),9))+" Registro(s)",,,400,, 10, Len(aNFeXML), )
FOR nX := 1 TO Len(aNFeXML)
AAdd(aXML,cPathNFeXML + aNFeXML[nX][1])
NEXT
For nX := 1 To Len( aXML )
oBar:Step("Processando, "+lTrim(Str(nX,9))+" De "+lTrim(Str(Len(aNFeXml),9))+" Registro(s)")
cFile := aXML[nX]
cFile := Hb_MemoRead( cFile )
cBloco := XmlNode( cFile , "ide" ) //Data
dhEmi := hb_ctod(substr(XmlNode( cBloco , "dhEmi" ),1,10),"yyyy-mm-dd") //<dhEmi>2019-01-31T08:47:58-03:00</dhEmi>
cNF := XmlNode( cBloco , "nNF" ) //
if dhEmi >= dIni .and. dhEmi <= dFim
else
loop
endif
cBloco := XmlNode( cFile , "infProt" ) //Autorizada ?
cMotivo := XmlNode( cBloco , "xMotivo" )
if upper(substr(cMotivo,1,16)) == "AUTORIZADO O USO"
else
//rodape(oDlg,4, "Ignor.: " + strzero(++nIgnorada,6) + " " + aXml[nX] )
loop
endif
cBloco := XmlNode( cFile , "total" ) //Para somar os valores totais da notas
nValorTag := XmlNode( cBloco , "vProd" )
nValorProdNFe += Val( nValorTag )
nValorTag := XmlNode( cBloco , "vNF" )
nTotalNFe += Val( nValorTag )
Next
oBar:Close()
aXML := {}
oBar := HProgressBar():NewBox( "Processando, "+lTrim(Str(0,9))+" De "+lTrim(Str(Len(aNFCeXml),9))+" Registro(s)",,,400,, 10, Len(aNFCeXML), )
FOR nX := 1 TO Len(aNFCeXML)
AAdd(aXML,cPathNFCeXML + aNFCeXML[nX][1])
NEXT
For nX := 1 To Len( aXML )
oBar:Step("Processando, "+lTrim(Str(nX,9))+" De "+lTrim(Str(Len(aNFCeXml),9))+" Registro(s)")
cFile := aXML[nX]
cFile := Hb_MemoRead( cFile )
cBloco := XmlNode( cFile , "ide" ) //Data
dhEmi := hb_ctod(substr(XmlNode( cBloco , "dhEmi" ),1,10),"yyyy-mm-dd") //<dhEmi>2019-01-31T08:47:58-03:00</dhEmi>
cNF := XmlNode( cBloco , "nNF" ) //
if dhEmi >= dIni .and. dhEmi <= dFim
else
loop
endif
cBloco := XmlNode( cFile , "infProt" ) //Autorizada ?
cMotivo := XmlNode( cBloco , "xMotivo" )
if upper(substr(cMotivo,1,16)) == "AUTORIZADO O USO"
else
//rodape(oDlg,4, "Ignor.: " + strzero(++nIgnorada,6) + " " + aXml[nX] )
loop
endif
cBloco := XmlNode( cFile , "total" ) //Para somar os valores totais da notas
nValorTag := XmlNode( cBloco , "vProd" )
nValorProdNFCe += Val( nValorTag )
nValorTag := XmlNode( cBloco , "vNF" )
nTotalNFCe += Val( nValorTag )
Next
oBar:Close()
Rodape(oDlg,1,"Qtd NFe: " + Transform( Len(aNFeXML),"999,999") + " Total: " + Transform( nTotalNFe ,"@e 99999,999.99") )
Rodape(oDlg,2,"Qtd NFCe: " + Transform( Len(aNFCeXML),"999,999") + " Total: " + Transform( nTotalNFCe ,"@e 99999,999.99") )
Rodape(oDlg,3,"Mês: " + Str(Month(dIni),2)+'/'+Str(Year(dIni),4) )
RETURN Nil
Saudações,
Itamar M. Lins Jr.