;** Restano ********************************************************************
;*  Programa p/ Restauracao de Anos Selecionados                               *
;*******************************************************************************
;Autor: Vise Informatica (VISERP)
;Desenvolvido    : 09/12/2003 por Karen Lauar Nery
;Ultima Alteracao: 21/10/2004 por Anivel Augusto Rodrigues
;Motivo Alteracao: SaveTables
;Ultima Alteracao: 15/08/2007 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Run
;Ultima Alteracao: 02/10/2007 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes UPDATE MOUSE
;Ultima Alteracao: 18/02/2010 por Cleber Alves
;Motivo Alteracao: Inclusao Pecassd
;Ultima Alteracao: 07/01/2013 por Anivel Augusto Rodrigues
;Motivo Alteracao: Inclusao tabela Sdestqt - Estoque p/ terceiros   
;Ultima Alteracao: 04/03/2015 por Bruno Carvalho
;Motivo Alteracao: Ajustes onde foi comentado a exclusÆo do dir.txt
;Ultima Alteracao: 10/11/2015 por Bruno Carvalho
;Motivo Alteracao: Incluido mensagens de aguarde na proc Copiar() 
;Ultima Alteracao: 06/04/2020 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes showdialog   

;*******************************************************************************
; Restaura Sdestq                                                              *
;*******************************************************************************
Proc RESTAUESTOQ()
Private wc

ClearAll
wc=0

MSG_AGUARDE="Aguarde, restaurando saldos Estoque "+VSDGANO

Diretor="\\Sistemas\\Estoque\\"
SetDir "\\Fechano\\" + VSDGANO + "\\Estoque"

Aguarde(MSG_AGUARDE+Barra(3,1))

 
{Ask} {Sdestq} Check
Moveto [Ano Referencia] TypeIn "~VSDGANO.."
Do_It!
ClearAll
If Not IsEmpTy("Answer")
   Then wc=wc+1
        Add_Sub_Rest_Tabela("Answer","Sdestq")
EndIf

If IsTable("Sdestqt")
   Then 
        {Ask} {Sdestqt} Check
        Moveto [Ano Referencia] TypeIn "~VSDGANO.."
        Do_It!
        ClearAll
        If Not IsEmpTy("Answer")
           Then wc=wc+1
                Add_Sub_Rest_Tabela("Answer","Sdestqt")
        EndIf
EndIf

If wc=0
   Then Mensagem("Ano p/ Estoque ainda n„o foi transferido !")
        Return
EndIf

EndProc

;*******************************************************************************
; Restaura Pecassd                                                             *
;*******************************************************************************
Proc RESTAUSALDOP()
ClearAll
MSG_AGUARDE="Aguarde, restaurando saldos Estoque "+VSDGANO

Diretor="\\Sistemas\\Estoque\\"
SetDir "\\Fechano\\" + VSDGANO + "\\Estoque"

Aguarde(MSG_AGUARDE+Barra(3,2))
{Ask} {Pecassd} Check
Moveto [Ano Referencia] TypeIn "~VSDGANO.."
Do_It!
ClearAll

If IsEmpTy("Answer")
   Then Mensagem("Ano p/ Estoque ainda n„o foi transferido !")
        Return
EndIf

ClearAll

Add_Sub_Rest_Tabela("Answer","Pecassd")

EndProc


;*******************************************************************************
; Restaura Saldcont                                                            *
;*******************************************************************************
Proc RESTAUSALDO()
ClearAll
MSG_AGUARDE="Aguarde, restaurando saldos Caixa/Banco "+VSDGANO

Diretor="\\Sistemas\\Ctacor\\"
SetDir "\\Fechano\\" + VSDGANO + "\\Ctacor"

Aguarde(MSG_AGUARDE+Barra(3,3))
{Ask} {Saldcont} Check
Moveto [Ano Referencia] TypeIn "~VSDGANO.."
Do_It!
ClearAll

If IsEmpTy("Answer")
   Then Mensagem("Ano p/ Contas ainda n„o foi transferido !")
        Return
EndIf

ClearAll

Add_Sub_Rest_Tabela("Answer","Saldcont")

EndProc

;*******************************************************************************
;* Rotina Add/Subtract/Reestruct                                               *
;*******************************************************************************
Proc Add_Sub_Rest_Tabela(TABORIG,TABDEST)
Private TABORIG,TABDEST

Add TABORIG Diretor+TABDEST ClearImage
SaveTables

Subtract TABORIG TABDEST ClearImage
SaveTables

{Modify} {Restructure} TypeIn TABDEST Enter Do_It! ClearImage
Delete TABORIG
SAVETABLES
EndProc

;*******************************************************************************
;* Rotina Bloqueia Tabelas da Pasta                                            *
;*******************************************************************************
Proc BloqueiaTabelas(Pasta)
Private MSG, Pasta, i

For i From 1 to DynArraySize(Array_Tabelas)
  If IsTable(Pasta+Array_Tabelas[i])
     Then Lock Pasta+Array_Tabelas[i] FL
          If Not RetVal
             Then MSG="O usu rio "+Upper(ErrorUser())+" esta usando o Sistema !// //"
                  MSG=MSG+Completa("- Contact -lo para liberar o Sistema;",40," ")+"//"
                  MSG=MSG+Completa("- Esta rotina ser  abortado.",40," ")+"// //"
                  MSG=MSG+"Execute esta rotina novamente para que//"
                  MSG=MSG+"a mesma seja concluida corretamente !"
                  Mensagem(MSG)
                  Return False
          EndIf
  EndIf
EndFor

Return True
EndProc

;*******************************************************************************
;* Rotina Desbloqueia Tabelas da Pasta                                         *
;*******************************************************************************
Proc DesbloqueiaTabelas(Pasta)
Private Pasta, i

For i From 1 to DynArraySize(Array_Tabelas)
  If IsTable(Pasta+Array_Tabelas[i])
     Then UnLock Pasta+Array_Tabelas[i] FL
  EndIf
EndFor

EndProc

;*******************************************************************************
;* Rotina Monta Lista de Tabelas a Processar                                   *
;*******************************************************************************
Proc ListadeTabelas()
Private i
If IsAssigned(Array_Tabelas)
   Then Release Vars Array_Tabelas
EndIf
DynArray Array_Tabelas[]

{Tools} {Info} {Inventory} {Tables} TypeIn CaminhoOrigem Enter ClearImage

If IsEmpty("List")
   Then Return
EndIf

View "List"
Scan
  Array_Tabelas[Recno()]=[List->Name]
EndScan
ClearImage

EndProc

;*******************************************************************************
;* Rotina para Criar Diretorios                                                *
;*******************************************************************************
Proc CriaDirModulo(Modulo,ANOMES)
If DirExists(DRIVE+"\\Sistemas\\"+Modulo+"\\Fechames")=0
   Then Cria_Pasta(DRIVE+"\\Sistemas\\"+Modulo+"\\Fechames")
EndIf
If DirExists(DRIVE+"\\Sistemas\\"+Modulo+"\\Fechames\\"+ANOMES)=0
   Then Cria_Pasta(DRIVE+"\\Sistemas\\"+Modulo+"\\Fechames\\"+ANOMES)
EndIf
EndProc

;*******************************************************************************
;* Copia o Ano Fechado                                                         *
;*******************************************************************************
Proc Copiar()

DRIVE=Substr(Directory(),1,1)+":"
For wis From 1 to wc
  Aguarde("Aguarde, Checando "+Modulos[wis]+" - "+VSDGANO)

  CaminhoOrigem=DRIVE+"\\Fechano\\"+VSDGANO+"\\"+Modulos[wis]
  If DirExists(CaminhoOrigem)=0 Then Loop EndIf

  For i From 1 to 12
    ANO_MES=VSDGANO+"_"+AlinhM(StrVal(NumVal(i)),2)
    CaminhoOrigem=DRIVE+"\\Fechano\\"+VSDGANO+"\\"+Modulos[wis]+"\\"+ANO_MES
    If DirExists(CaminhoOrigem)=0 Then Loop EndIf

    MSG_AGUARDE="Aguarde, Restaurando "+Modulos[wis]+" - "+ANO_MES
    Aguarde(MSG_AGUARDE)

    CriaDirModulo(Modulos[wis],ANO_MES)
    CaminhoDestino=DRIVE+"\\Sistemas\\"+Modulos[wis]+"\\Fechames\\"+ANO_MES

    ListadeTabelas()
    Aguarde("Aguarde, bloqueando "+CaminhoOrigem)
    If (BloqueiaTabelas(CaminhoDestino)) And
       (BloqueiaTabelas(CaminhoOrigem))
       Then NR=DynArraySize(Array_Tabelas)
            For wi From 1 To NR
              Barra(NR, wi)
              Aguarde(MSG_AGUARDE+BARRA_STRING)

              TABDEST=CaminhoDestino+"\\"+Array_Tabelas[wi]
              TABORIG=CaminhoOrigem+"\\"+Array_Tabelas[wi]

              If Not IsTable(TABDEST)
                 Then Create TABDEST Like TABORIG
                      {Tools} {Copy} {JustFamily} TypeIn TABORIG Enter TypeIn TABDEST Enter {Replace}
                      Delete "Struct"
              EndIf
              Add TABORIG TABDEST ClearImage
              SubTract TABDEST TABORIG ClearImage
              {Modify} {Restructure} TypeIn TABDEST Enter Do_It! ClearImage
              Delete TABORIG
              SAVETABLES
            EndFor
    EndIf
    Aguarde("Aguarde, desbloqueando "+CaminhoDestino)
    DesbloqueiaTabelas(CaminhoDestino)
    Aguarde("Aguarde, desbloqueando "+CaminhoOrigem)
    DesbloqueiaTabelas(CaminhoOrigem)
    If Not Tem_Tabelas(CaminhoOrigem)
       Then Aguarde("Aguarde, deletando registros temporarios "+CaminhoOrigem)
            Deleta_Arvore(CaminhoOrigem)
    EndIf
  EndFor
  
  CaminhoOrigem=DRIVE+"\\Fechano\\"+VSDGANO+"\\"+Modulos[wis]
  If ChecaDiretorios(CaminhoOrigem)=0
     Then Aguarde("Aguarde, deletando registros temporarios do modulo "+Modulos[wis])
          Deleta_Pasta(CaminhoOrigem)
  EndIf
EndFor

CaminhoOrigem=DRIVE+"\\Fechano\\"+VSDGANO
If ChecaDiretorios(CaminhoOrigem)=0
   Then Aguarde("Aguarde, deletando registros temporarios de "+VSDGANO)
        Deleta_Pasta(CaminhoOrigem)
EndIf

LimpAguarde()

EndProc; (Copiar)

;*******************************************************************************
; Rotina Checa Diretorios                                                      *
;*******************************************************************************
Proc ChecaDiretorios(Pasta)
ClearAll
np=0
np=Lista_Diretorio(Pasta)
Release Vars Array_Lista_Diretorios
Return np
EndProc    ; (MontaDiretorios)

;*******************************************************************************
; Rotina Procura Diretorios                                                    *
;*******************************************************************************
Proc MontaDiretorios()
ClearAll
Aguarde("Aguarde, Verificando Pastas")
DynArray Diretorio[]
DynArray Modulos[]
DynArray Array_Diretorios[]

Lista_Diretorio(SubStr(Directory(),1,2)+"\\Fechano\\"+VSDGANO)
wc=0
While wc<DynArraySize(Array_Lista_Diretorios)
  wc=wc+1
  Array_Diretorios[wc]=Format("W3,AR",wc)+": "+Array_Lista_Diretorios[wc]
  Diretorio[wc]="\\FechAno\\"+VSDGANO+"\\"+Array_Lista_Diretorios[wc]
  Modulos[wc]  =Array_Lista_Diretorios[wc]
EndWhile
Release Vars Array_Lista_Diretorios
EndProc    ; (MontaDiretorios)

;*******************************************************************************
; Rotina Procura Diretorios                                                    *
;*******************************************************************************
Proc MontaAnos()
ClearAll
Aguarde("Aguarde, Verificando Anos Fechados")
DynArray Anos[]

;---- Em 04.03.2015, por erros em meia duzia de clientes, talvez algo com o EXECVISE e a exclusÆo da fun‡Æo do Windows ----- 
;Deleta_Arquivo(PrivDir()+"Dir.txt")

Lista_Diretorio(SubStr(Directory(),1,2)+"\\Fechano")
wc=0
While wc<DynArraySize(Array_Lista_Diretorios)
  wc=wc+1
  Anos[wc]=Array_Lista_Diretorios[wc]
EndWhile
Release Vars Array_Lista_Diretorios
EndProc    ; (MontaAnos)

;*******************************************************************************
;* Modulos do Ano selecionado (mes 1 ao 12)                                      *
;*******************************************************************************
Proc Lista_Modulos()

wis=1
While wis<= wc

  Aguarde("Aguarde, Verificando "+Modulos[wis]+"-"+VSDGANO)

  Caminho=Diretorio[wis]
  If DirExists(Caminho)=1
    Then
      MES="01"
      Array_Modulos[wis]=Modulos[wis]+Fill("_",12-Len(Modulos[wis]))+"Ý"
       While True
          Caminho1=Caminho+"\\"+VSDGANO+"_"+MES
          If DirExists(Caminho1)=1
             Then Array_Modulos[wis]=Array_Modulos[wis]+"OkÝ"
             Else Array_Modulos[wis]=Array_Modulos[wis]+"__Ý"
          EndIf
          If MES="12"
             Then MES="01"
                  QuitLoop
             Else MES=AlinhM(StrVal(NumVal(MES)+1),2)
          EndIf
      EndWhile
  EndIf
  wis=wis+1

EndWhile
EndProc ; (Lista_Modulos)

;*******************************************************************************
;* Modulos do Ano selecionado (mes 1 ao 12)                                      *
;*******************************************************************************
Proc Modulos()

  OP_SHOW="M"
  Lista_Modulos()
  While True

  ShowDialog "Situa‡„o do ano "+VSDGANO+" fechado" Proc "SD_Dialog"
  Trigger "OPEN","ARRIVE"
  Key "F1","ENTER","ESC","TAB",
      -104, -105, -106, -107, -108, -109, -110, -111, -112, -113, -139, -140  
   @ 01,01 Height 19 Width 55

    Label @ 00,01 "             ______________ Meses ______________  "  For "TG_MODULOS"
    Label @ 01,01 "M¢dulos     Ý 1Ý 2Ý 3Ý 4Ý 5Ý 6Ý 7Ý 8Ý 9Ý10Ý11Ý12Ý "  For "TG_MODULOS"

    PickDynArray @2,01 Height 12 width 51
     Columns 1
      Array_Modulos
       Tag "TG_MODULOS"
        To VSDGMODULOS

    Pushbutton @ 15,12 width 13 "~O~k"      OK     Default Value "Ok" Tag "YES" To BottonValue
    Pushbutton @ 15,26 width 13 "~C~ancela" CANCEL                    Tag "NO"  To BottonValue

  EndDialog
  If Not RetVal             Then QuitLoop EndIf
  If Not Verifica_Usuario() Then QuitLoop EndIf

  If ISTABLE("\\Fechano\\"+VSDGANO+"\\Estoque\\Sdestq")
     Then RESTAUESTOQ()
  Endif

  If ISTABLE("\\Fechano\\"+VSDGANO+"\\Estoque\\Pecassd")
     Then RESTAUSALDOP()
  Endif
 
  If ISTABLE("\\Fechano\\"+VSDGANO+"\\Ctacor\\Saldcont")
     Then RESTAUSALDO()
  Endif

  SetDir "\\Sistemas\\Cadastro"
  Copiar()

  MENSAGEM("Fim de Opera‡„o !")
  Return
EndWhile

EndProc ;(Modulos)

;*******************************************************************************
;* Rotina                                                                      *
;*******************************************************************************
Proc SD_Dialog(Disparo,Campo,Evento,Elemento)
Temp=True
TECLA    =""
MSG_CAMPO=""
If Disparo="OPEN"  Then AoCriarShowDialog() EndIf
If Disparo="UPDATE"
   Then Temp=True
        VSDGDIRETORIOS=ControlValue("TG_DIRETORIOS")
        Return Temp
EndIf


If Disparo="EVENT" And Evento["Type"]="KEY" Then
   Switch
     Case Evento["KeyCode"] = -59: Dialog_F1()
     Case Evento["KeyCode"] =  27:
          Temp=False
          Switch
            Case Campo="TG_DIRETORIOS"    : Campo="NO"
            Case Campo="TG_MODULOS"       : CancelDialog
            Case Campo="YES" Or Campo="NO":
                If OP_SHOW="M"
                   Then Campo="TG_MODULOS"
                   Else Campo="TG_DIRETORIOS"
                EndIf
          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_DIRETORIOS": Campo="YES"
                        VSDGDIRETORIOS=ControlValue("TG_DIRETORIOS")
                    Case Campo="TG_MODULOS"  : Campo="YES"
                  EndSwitch
          EndIf
          RefreshDialog
   EndSwitch
EndIf

Switch
  Case Campo="TG_ANO":
    MSG_CAMPO="Ano a ser restaurado"
EndSwitch
Monta_Prompt(MSG_CAMPO,TECLA)
Return Temp
EndProc ;

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

While True
  MontaAnos()

  VSDGANO=""

  OP_SHOW="F"
  ShowDialog "Restaura‡„o Anual" Proc "SD_Dialog"
  Trigger "OPEN","ARRIVE","UPDATE"
  MOUSE "DOWN"
  Key "F1","ENTER","ESC",
      -104, -105, -106, -107, -108, -109, -110, -111, -112, -113, -139, -140  
   @ 04,17   Height 19 Width 75

    PickDynArray @2,01 Height 12 width 69
     Columns 7
      Anos
       Tag "TG_DIRETORIOS"
        To ArrayElement
    Label @ 01,00 "Anos Fechados"  For "TG_DIRETORIOS"

    Pushbutton @ 15,24 width 11 "~O~k"      OK     Default Value "Ok" Tag "YES" To BottonValue
    Pushbutton @ 15,38 width 11 "~C~ancela" CANCEL                    Tag "NO"  To BottonValue

  EndDialog
  If Not RetVal Then QuitLoop EndIf
  If DynArraySize(Anos)<1
     Then Mensagem("Sem Ano p/ Restaurar !")
          Loop
  EndIf
  VSDGANO=Anos[VSDGDIRETORIOS]

  MontaDiretorios()

  DynArray Array_Modulos[]
  Modulos()

  LimpAguarde()

EndWhile
ClearAll
Release Vars All
Release Procs All
