;** LogSys *********************************************************************
;* Log de Usuarios                                                             *
;*******************************************************************************
;Autor           : Vise Informatica (VISERP)
;Desenvolvido    : 22/11/2005 por Anivel Augusto Rodrigues
;Ultima Alteracao: 16/04/2007 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Datas
;Ultima Alteracao: 14/12/2016 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes showdialog     
;Ultima Alteracao: 03/01/2017 por Rafael Matos
;Motivo Alteracao: Ajustes showdialog MensagemRadioButtons()              
;Ultima Alteracao: 11/07/2017 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes logica e layout relatorio
;Ultima Alteracao: 18/12/2017 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes extensÆo arquivo rois.r -> rois.log
;Ultima Alteracao: 30/06/2018 por Bruno Carvalho
;Motivo Alteracao: Adicionadao op‡Æo para mostrar logs de apenas processos exclu¡dos
;Ultima Alteracao: 19/07/2018 por Bruno Carvalho
;Motivo Alteracao: Faz a verifica‡Æo se arquivo "rois" existe
;Ultima Alteracao: 31/08/2018 por Bruno Carvalho
;Motivo Alteracao: Adicionado op‡Æo 6 p/ exibir "Processo com Problemas"
;Ultima Alteracao: 14/09/2018 por Bruno Carvalho
;Motivo Alteracao: Adicionado proc Verifica_Data() p/ verificar data de log e otimizar processos
;Ultima Alteracao: 11/01/2019 por Bruno Carvalho
;Motivo Alteracao: Alterado a cria‡Æo do arquivo ROIS p/ ser gerado apenas em seu mˆs atual em que os registros sÆo processados 

;*******************************************************************************
;* Pega Dados                                                                  *
;*******************************************************************************
Proc Verifica_Data(PARAM_DATA,PARAM_HORA)
Private PARAM_DATA,PARAM_HORA,dtlog,hrlog

If Type(DateVal(PARAM_DATA))="D"  
   Then dtlog=DateVal(PARAM_DATA)
        hrlog=SubStr(PARAM_HORA,1,5)
        If (dtlog<VSDGDTINI) Or (dtlog=VSDGDTINI And hrlog<VSDGHRINI) Or
           (dtlog>VSDGDTFIM) Or (dtlog=VSDGDTFIM And hrlog>VSDGHRFIM)
           Then Return False
        EndIf  
EnDIf
 
Return True

EndProc ;Verifica_Data()

;*******************************************************************************
;* Pega Dados                                                                  *
;*******************************************************************************
Proc Pega_Dados()
Private ii

DATA    = ""
HORA    = ""
CHAPA   = "" 
NOME    = ""
ESTACAO = ""
SCRIPT  = ""
LERRO   = ""
LPOSI   = ""
LPROC   = ""
LCODE   = ""
LUSER   = ""
LMSG    = ""

DELIMITADOR = ";"

For ii From 1 To 12
  PosI = Search(DELIMITADOR,TEXTO)
  If PosI>0 And ii<>12
     Then LINHA = Ltrim(Rtrim(SubStr(TEXTO,1,PosI-1)))
          Switch
            Case ii=1  : DATA    = LINHA
                         If Len(DATA)=9 Then DATA="0"+DATA EndIf
                         If Len(DATA)=10
                            Then DATA = SubStr(DATA,1,2)+"."+SubStr(DATA,4,2)+"."+SubStr(DATA,7,4)
                         EndIf   
            Case ii=2  : HORA    = LINHA
            Case ii=3  : CHAPA   = LINHA 
            Case ii=4  : NOME    = LINHA
            Case ii=5  : ESTACAO = LINHA
            Case ii=6  : SCRIPT  = LINHA 
            Case ii=7  : LERRO   = LINHA
            Case ii=8  : LPOSI   = LINHA
            Case ii=9  : LPROC   = LINHA
            Case ii=10 : LCODE   = LINHA
            Case ii=11 : LUSER   = LINHA
          EndSwitch
          TEXTO = SubStr(TEXTO,PosI+1,Len(TEXTO))             
  EndIf
  
  If ii=2 
     Then If Not Verifica_Data(DATA,HORA)
             Then Return False  
           EnDIf
  EndIf 
  
  If ii=12
     Then LMSG = Ltrim(Rtrim(TEXTO))
  EndIf
Endfor     

TEXTO=      Completa(Format("D13",DATA),10," ")+" "
TEXTO=TEXTO+Format("W8",HORA)+" "
TEXTO=TEXTO+Completa(Format("W4",CHAPA)+" "+Format("W15",NOME),15," ")+" "
TEXTO=TEXTO+Completa(ESTACAO,12," ")+" "
TEXTO=TEXTO+Completa(SCRIPT,30," ")+" "
TEXTO=TEXTO+Format("W10",LERRO)+" "
TEXTO=TEXTO+Format("W10",LPOSI)+" "
TEXTO=TEXTO+Format("W10",LPROC)+" "
TEXTO=TEXTO+Format("W10",StrVal(LCODE))+" "
TEXTO=TEXTO+Format("W10",LUSER)+" "
TEXTO=TEXTO+LMSG

Return True
          
EndProc ;Pega_Dados   

;*******************************************************************************
;* Rotina p/ Setar Diretorio Fechames                                          *
;*******************************************************************************
Proc Ler_Arquivo_MesAno()
Private pos, Dir_Trab_MSG

While True
  MM  =NumVal(SubStr(Dir_Trab,pos+14,2))
  AAAA=NumVal(SubStr(Dir_Trab,pos+09,4))

  If Dir_Trab_CMM>0
     Then If MM=12
             Then MM=1
                  AAAA=AAAA+1
             Else MM=MM+1
          EndIf
          Dir_Trab="Fechames\\"+AlinhM(StrVal(AAAA),4)+"_"+AlinhM(StrVal(MM),2)+"\\"
  EndIf

  Dir_Trab_CMM=Dir_Trab_CMM+1
  Barra(Dir_Trab_NMM, Dir_Trab_CMM)

  If Dir_Trab>Dir_Trab_Fim
     Then Dir_Trab=""
          Dir_Trab_MSG="Atual [EM ABERTO]"
     Else Dir_Trab_MSG=AlinhM(StrVal(MM),2)+"/"+AlinhM(StrVal(AAAA),4)+Spaces(10)
  EndIf
  Aguarde("Filtrando pasta "+Dir_Trab_MSG+" "+BARRA_STRING)
  If DirExists(Dir_Trab_Fixo+Dir_Trab)>0 or
     DirExists(Upper(Dir_Trab_Fixo+Dir_Trab))>0
     Then QuitLoop
  EndIf
EndWhile

Return True

EndProc    ;  (Ler_Arquivo_MesAno)

;*******************************************************************************
;* Importa dados TXT -> DB                                                     *
;*******************************************************************************
Proc Importa()
Private ArqTxt,LOG_MES_INI,LOG_ANO_INI,LOG_MES_FIM,LOG_ANO_FIM,varinner,CONTA_MES,
        AUX_DIA_INI,AUX_DIA_FIM,TXT_MES,TXT_ANO,ArqTxt,Pos,Cont,TEXTO,DATA,HORA,pos,posf

ARQ=PrivDir()+"tmplog"
If IsTable(ARQ)
   Then Delete ARQ
EndIf
Copy "\\Base\\Sistemas\\Cadastro\\Rm_LogDt" ARQ

Aguarde("Aguarde, preparando dados")
Empty(ARQ)
If IsAssigned(varinner) Then release vars varinner  EndIf

LOG_MES_INI = NumVal(AlinhM(Strval(NumVal(StrVal(Month(VSDGDTINI)))),2))        ;10 
LOG_ANO_INI = NumVal(SubStr(StrVal(Year(VSDGDTINI)),3,2))                       ;18
 
LOG_MES_FIM = NumVal(AlinhM(Strval(NumVal(StrVal(Month(VSDGDTFIM)))),2))        ;01      
LOG_ANO_FIM = NumVal(SubStr(StrVal(Year(VSDGDTFIM)),3,2))                       ;19

Switch
  Case LOG_MES_FIM-LOG_MES_INI = 0 And LOG_ANO_FIM - LOG_ANO_INI = 0 : CONTA_MES = 1                                  ;Mes e Ano iguais
  Case LOG_MES_FIM-LOG_MES_INI = 0 And LOG_ANO_FIM - LOG_ANO_INI >= 1: CONTA_MES = 12  * (LOG_ANO_FIM - LOG_ANO_INI)  ;Mes Igual, Ano Diferente
  Case LOG_MES_FIM-LOG_MES_INI > 0 And LOG_ANO_FIM - LOG_ANO_INI = 0 : CONTA_MES = (LOG_MES_FIM-LOG_MES_INI)+1        ;Mes Diferente, Ano Igual
  Case LOG_MES_FIM-LOG_MES_INI < 0 And LOG_ANO_FIM - LOG_ANO_INI > 0 :                                                
       CONTA_MES = 12 - LOG_MES_INI + LOG_MES_FIM + 1
  Case LOG_MES_FIM-LOG_MES_INI > 0 And LOG_ANO_FIM - LOG_ANO_INI > 0 :                                                ;Mes e Ano maior
       CONTA_MES = (12 - LOG_MES_INI)+1
       For io From 1 To (LOG_ANO_FIM-LOG_ANO_INI)
         If io<>LOG_ANO_FIM-LOG_ANO_INI
            Then CONTA_MES = CONTA_MES + 12
            Else CONTA_MES = CONTA_MES + LOG_ANO_FIM 
         EndIf 
       EndFor                                                              
EndSwitch   

If Not IsAssigned(CONTA_MES)
   Then Mensagem("Ocorreu um erro durante o processo de inicializa‡Æo do sistema!")
        Return
EndIf  

For ii From 1 To CONTA_MES
  Switch
    Case ii = 1 : 
         TXT_MES = AlinhM(Strval(NumVal(StrVal(Month(VSDGDTINI)))),2)
         TXT_ANO = SubStr(StrVal(Year(VSDGDTINI)),3,2)
         
         AUX_DIA_INI = VSDGDTINI
         AUX_DIA_FIM = Ultimo_Dia(TXT_MES+"20"+TXT_ANO)
    Case ii = CONTA_MES : 
         TXT_MES = AlinhM(Strval(NumVal(StrVal(Month(VSDGDTFIM)))),2)
         TXT_ANO = SubStr(StrVal(Year(VSDGDTFIM)),3,2)
         
         AUX_DIA_INI = Primeiro_Dia(TXT_MES+"20"+TXT_ANO)  
         AUX_DIA_FIM = VSDGDTFIM
    OtherWise :
         AUX_DIA_FIM = AUX_DIA_FIM + 10
          
         TXT_MES = AlinhM(Strval(NumVal(StrVal(Month(AUX_DIA_FIM)))),2)
         TXT_ANO = SubStr(StrVal(Year(AUX_DIA_FIM)),3,2)
         
         AUX_DIA_INI = Primeiro_Dia(TXT_MES+"20"+TXT_ANO)  
         AUX_DIA_FIM = Ultimo_Dia(TXT_MES+"20"+TXT_ANO)
  EndSwitch
  
  If VSDGOPCAO=6
     Then ;lgerXXXX sendo XXXX mˆs e ano
          ArqTxt  = SubStr(Directory(),1,2)+"\\Sistemas\\Cadastro\\lger"+TXT_MES+TXT_ANO+".log"
     Else ;roisXXXX sendo XXXX mˆs e ano
          ArqTxt  = SubStr(Directory(),1,2)+"\\Sistemas\\Cadastro\\rois"+TXT_MES+TXT_ANO+".log"
  EndIf
  
  If Isfile(ArqTxt)
     Then FileRead ArqTxt to varinner
          Edit ARQ
          pos  = 1
          Cont = 0
          
          While True
            Cont = Cont + 1
            Aguarde("Aguarde, montando base de log "+StrVal(Cont))
            
            posf=searchFrom("\n",varinner,pos)
            if posf=0 then quitLoop endif
            
            TEXTO = substr(varinner,pos,(posf-pos))
            If VSDGOPCAO=6
                Then If Not Pega_Dados()  
                        Then TEXTO = ""
                     EndIf   
            EndIf    
            
            If TEXTO <> ""
               Then DATA=SubStr(TEXTO,1,10)                                             If Len(DATA)=9 Then DATA = "0"+DATA EndIf
                    DATA=SubStr(DATA,1,2)+"."+LTrim(SubStr(DATA,4,2))+"."+SubStr(DATA,7,4)
                    HORA=SubStr(TEXTO,12,5)
                    If Verifica_Data(DATA,HORA)
                       Then If [Text] <> ""
                               Then End
                                    If [Text] <> ""
                                       Then Down
                                    EndIf    
                            EndIf
                            If [Text]<>""
                               Then Mensagem("Erro ao ajustar a base de log")
                               Else [Text]=TEXTO
                                    [Data]=DateVal(Ltrim(DATA))
                            EndIf    
                            Down
                    EnDIf 
            EndIf
            pos=posf+1
          EndWhile
          Do_It! 
          ClearAll
  EndIf
EndFor  

If IsTable(ARQ) And Not IsEmpty(ARQ)
   Then Sort ARQ On "Data"
        ClearAll
EndIf
If IsAssigned(varinner) Then release vars varinner  EndIf

Endproc

;*******************************************************************************
;* Rotina Converte DB                                                          *
;*******************************************************************************
Proc Converte()
ClearAll

Importa()

Barra(2, 1)
Aguarde("Convertendo log's")

NR = NRecords(ARQ)

View ARQ
EditKey
SetHighLight Current Record 23 Field 31
Scan
  Barra(NR, RecNo())
  Aguarde("Aguarde, Processando "+BARRA_STRING)

  If IsBlank([Text]) Then Loop EndIf
  oplog=SubStr([Text],55,1)
  
  Switch
    Case VSDGOPCAO=1 : If oplog<>">" Then Limpa_Text() Loop EndIf
    Case VSDGOPCAO=2 : If oplog<>"!" Then Limpa_Text() Loop EndIf
    Case VSDGOPCAO=3 : If oplog<>"#" Then Limpa_Text() Loop EndIf
    Case VSDGOPCAO=4 : If oplog<>"#" Then Limpa_Text() Loop EndIf
    Case VSDGOPCAO=5 : If Upper(SubStr([Text],67,4))<>"EXCL" Then Limpa_Text() Loop EndIf
  EndSwitch
  
  Switch
    Case VSDGOPCAO=3: uslog=SubStr([Text],76,4)
    OtherWise       : uslog=SubStr([Text],21,4)
  EndSwitch

  If Not IsBlank(VSDGCHAPA)
     Then If uslog<>VSDGCHAPA Then Limpa_Text() Loop EndIf
  EndIf
  
  s=SubStr([Text],1,10)
  s=SubStr(s,4,2)+"/"+LTrim(SubStr(s,1,2))+"/"+SubStr(s,7,4)
  dtlog=DateVal(s)
  
;;dtlog=DateVal(LTrim(SubStr([Text],1,10)))
  hrlog=SubStr([Text],12,5)
  If dtlog<VSDGDTINI Then Limpa_Text() Loop EndIf
  If dtlog=VSDGDTINI And hrlog<VSDGHRINI Then Limpa_Text() Loop EndIf
  If dtlog>VSDGDTFIM Then Limpa_Text() Loop EndIf
  If dtlog=VSDGDTFIM And hrlog>VSDGHRFIM Then Limpa_Text() Loop EndIf

EndScan
Do_It!
ClearAll

{Ask} TypeIn ARQ Enter TypeIn "Fast Delete"
Moveto [Text] TypeIn "Blank"
Do_It!
ClearAll

LimpAguarde()
EndProc

Proc Limpa_Text()
[Text]=""
EndProc

;*******************************************************************************
;* Rotina                                                                      *
;*******************************************************************************
Proc SD_Dialog(Disparo,Campo,Evento,Elemento)
Temp=True
MSG_CAMPO=""
TECLA=""
If Disparo="OPEN"  Then AoCriarShowDialog() EndIf
If Disparo="EVENT" And Evento["Type"]="KEY" Then
   Switch
     Case Evento["KeyCode"] = 9: Temp=False
     Case Evento["KeyCode"] = -59: Dialog_F1()
     Case Evento["KeyCode"] =  27:
          Temp=False
          Switch
            Case Campo="TG_CHAPA"         : Campo="NO"
            Case Campo="TG_DTINI"         : Campo="TG_CHAPA"
            Case Campo="TG_HRINI"         : Campo="TG_DTINI"
            Case Campo="TG_DTFIM"         : Campo="TG_HRINI"
            Case Campo="TG_HRFIM"         : Campo="TG_DTFIM"
            Case Campo="TG_OPCOES"        : Campo="TG_HRFIM"
            Case Campo="YES" Or Campo="NO": Campo="TG_CHAPA"
          EndSwitch
     Case (Evento["KeyCode"] <= -104 And Evento["KeyCode"] >= -113) Or
           Evento["KeyCode"]  = -139 Or  Evento["KeyCode"]  = -140:
           SYS_TECLA_ACIONADA=Evento["KeyCode"]
           Seta_Tecla_Acionada()
           CancelDialog
     Case Evento["KeyCode"] = 13:
          Temp=False
          If Checa_TAG()
             Then Switch
                    Case Campo="TG_CHAPA"    : Campo="TG_DTINI"
                    Case Campo="TG_DTINI"    : Campo="TG_HRINI"
                    Case Campo="TG_HRINI"    : Campo="TG_DTFIM"
                    Case Campo="TG_DTFIM"    : Campo="TG_HRFIM"
                    Case Campo="TG_HRFIM"    : Campo="TG_OPCOES"
                    Case Campo="TG_OPCOES"   : Campo="YES"
                  EndSwitch
          EndIf
          RefreshDialog
   EndSwitch
EndIf
Switch
  Case Campo=""             : MSG_CAMPO=""
  Case Campo="TG_OPCOES"    : MensagemRadioButtons()
Endswitch

Monta_Prompt(MSG_CAMPO,TECLA)
Return Temp
EndProc

;*******************************************************************************
;* ROTINA PRINCIPAL                                                            *
;*******************************************************************************
AutoLib="\\Sistemas\\Cadastro\\Bib_Show,\\Sistemas\\Cadastro\\Bibliot"
LimpAguarde()

VSDGCHAPA=""
VSDGDTINI=BlankDate()
VSDGDTFIM=Today()
VSDGHRINI=""
VSDGHRFIM=""

While True

  ShowDialog "Log de Usu rios" Proc "SD_Dialog"
  Trigger "OPEN","ARRIVE"
  Key "F1","ENTER","ESC","TAB",
      -104, -105, -106, -107, -108, -109, -110, -111, -112, -113, -139, -140  
   @ 05,12   Height 19 Width 72

    Label  @ 00,00 "Usu rio" For "TG_CHAPA"
    Accept @ 01,01 Width 07 "A4"  Picture "#*#" Tag "TG_CHAPA" To VSDGCHAPA
    Accept @ 01,09 Width 25 "A30" Picture "!*!" Tag "TG_CHAPA" To VSDGNOMCHAPA

    Label  @ 02,00 "Per¡odo Referente" For "TG_DTINI"
    Label  @ 03,04 " de" For "TG_DTINI"
    Accept @ 03,09 Width 13 "D"  Picture "#[#];.##;.##[##]" Tag "TG_DTINI" To VSDGDTINI
    Label  @ 03,22 "as" For "TG_DTINI"
    Accept @ 03,26 Width 08 "A5"  Picture "##:##" Tag "TG_HRINI" To VSDGHRINI
    Label  @ 04,04 "at‚" For "TG_DTFIM"
    Accept @ 04,09 Width 13 "D"  Picture "#[#];.##;.##[##]" Tag "TG_DTFIM" To VSDGDTFIM
    Label  @ 04,22 "as" For "TG_DTFIM"
    Accept @ 04,26 Width 08 "A5"  Picture "##:##" Tag "TG_HRFIM" To VSDGHRFIM

    Label  @ 06,00 "Op‡”es de opera‡”es " For "TG_OPCOES"
    RadioButtons @ 07,00 Height 7 Width 46
      "~1~ Rotinas Menu    ",
      "~2~ Controladas     ",
      "~3~ Supervisionadas/Usu rio selecionado",
      "~4~ Supervisionadas/por outro Usu rio",
      "~5~ Processo de Exclusäes",
      "~6~ Processos interrompidos",
      "~7~ Todas"
        Tag "TG_OPCOES"
        To VSDGOPCAO
        
    Pushbutton @ 15,22 width 11 "~O~k"      OK     Default Value "Ok" Tag "YES" To BottonValue
    Pushbutton @ 15,36 width 11 "~C~ancela" CANCEL                    Tag "NO"  To BottonValue

  EndDialog
  If Not RetVal Then QuitLoop EndIf

  If IsBlank(VSDGDTINI)
     Then Mensagem("Data Inicial Invalida !")
          Loop
  EndIf

  If IsBlank(VSDGDTFIM)
     Then Mensagem("Data Final Invalida !")
          Loop
  EndIf

  Switch
    Case VSDGOPCAO=1: VSDGNOMOPCOES="Rotinas Menu"
    Case VSDGOPCAO=2: VSDGNOMOPCOES="Controladas"
    Case VSDGOPCAO=3: VSDGNOMOPCOES="Supervisionadas/Usuario selecionado"
    Case VSDGOPCAO=4: VSDGNOMOPCOES="Supervisionadas/por outro Usuario"
    Case VSDGOPCAO=5: VSDGNOMOPCOES="Processo de Exclusäes"
    Case VSDGOPCAO=6: VSDGNOMOPCOES="Processo com Problemas"
    Case VSDGOPCAO=7: VSDGNOMOPCOES="Todas"
  EndSwitch

  DISPOSITIVO()
  If OK=""  Then Loop EndIf

  AGUARDE("Aguarde, gerando o relat¢rio")

  Converte()
  If IsEmpty(ARQ)
     Then MENSAGEM("N„o existem registros a processar")
          Loop
  EndIf

  Impressao_Orientacao="Paisagem"
  If VSDGOPCAO=6
     Then CopyReport "\\Base\\Sistemas\\Cadastro\\Rm_LogDt" "2" ARQ "R" 
     Else CopyReport "\\Base\\Sistemas\\Cadastro\\Rm_LogDt" "R" ARQ "R"
  EndIf   
  IMPRIREL(ARQ,"R")

  Delete ARQ

EndWhile
ClearAll
Release Vars All
Release Procs All
