;** Reproces *******************************************************************
;*  Reprocessamento das Movimentacoes                                          *
;*******************************************************************************
;Autor           : Vise Informatica (VISERP)
;Desenvolvido    : 05/12/1995 por Anivel Augusto Rodrigues
;Ultima Alteracao: 02/01/2005 por Anivel Augusto Rodrigues
;Motivo Alteracao: Bloqueio de tabelas
;Ultima Alteracao: 11/03/2010 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Empresa/Conta
;Ultima Alteracao: 04/04/2016 por Anivel /Kamila
;Motivo Alteracao: Ajustes Zera Saldos e transferir p/ proximo mes.
;Ultima Alteracao: 17/05/2016 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Movimentos das Contas da Empresa
;Ultima Alteracao: 06/09/2016 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes showdialog                   
;Ultima Alteracao: 28/12/2016 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes showdialog     
;Ultima Alteracao: 29/12/2016 por Rafael Matos
;Motivo Alteracao: Ajustes MensagemCheckBoxes()               
;Ultima Alteracao: 11/07/2017 por Anivel Augusto Rodrigues
;Motivo Alteracao: inclusao Grava_Logt()
;Ultima Alteracao: 11/07/2017 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes ao transferir saldo para um mˆs inexistente, informando o usu rio se deseja transferir este saldo  
;Ultima Alteracao: 08/08/2017 por Bruno Carvalho
;Motivo Alteracao: Adicionado Gera_Log()
;Ultima Alteracao: 05/03/2018 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes checagem de diferenca de saldo entre meses  

;*******************************************************************************
;* Rotina p/ Verificar se existe movimentacao no mes fechado                   *
;*******************************************************************************
Proc Verifica_Mov()

If IsTable("\\Sistemas\\Ctacor\\"+Dir_Trab+"MovCont")
   Then 
        {Ask} {Conta}
        Moveto [Codigo da Conta  ] Example "CONTA"
        Moveto [Codigo da Empresa] TypeIn "~VSDGEMPRESA.."
        {Ask} TypeIn "\\Sistemas\\Ctacor\\"+Dir_Trab+"MovCont" Enter
        Moveto [Codigo da Conta     ] Check Example "CONTA"
        Do_It!
        ClearAll
        If Not IsEmpty("Answer")
           Then Return False
        EndIf
EndIf

Return True
EndProc    ; (Verifica_Mov)

;*******************************************************************************
;* Rotina p/ Atualizar Saldos                                                  *
;*******************************************************************************
Proc SELECIONA()

MSG_AGUARDE="Aguarde, Processando "+MESANO+" "
Aguarde(MSG_AGUARDE)

ClearAll
{Ask} {Conta} Check
Moveto [Codigo da Empresa] TypeIn "~VSDGEMPRESA.."
Do_It!
ClearAll

View "SaldCont"
Coedit "Answer"
Scan
  Moveto "SaldCont"
  Moveto [Codigo da Conta]
  Locate [Answer->Codigo da Conta], ANO, MES
  If RetVal
     Then [Entradas]=0
          [Saidas  ]=0
          UnLockRecord
  EndIf
  Moveto "Answer"
EndScan
Do_It!
ClearAll

{Ask} {Conta}
Moveto [Codigo da Conta  ] Example "CONTA"
Moveto [Codigo da Empresa] TypeIn "~VSDGEMPRESA.."
{Ask} {MovCont}
Moveto [Codigo da Conta  ] Check Example "CONTA"
Moveto [Codigo da Empresa] Check 
Moveto [Tipo Movimento   ] Check
Moveto [Data             ] Check TypeIn "..~MESANO"
Moveto [Valor            ] TypeIn "Calc Sum As Valor"
Do_It!
ClearAll

If IsEmpty("Answer")
   Then Mensagem("Sem Movimenta‡„o no Mes !")
        Return True
EndIf

NR = NRecords("Answer")
View "SaldCont"
CoEdit "Answer"
Scan
    Barra(NR, RecNo())
    Aguarde(MSG_AGUARDE+BARRA_STRING)

    MESREF = AlinhM(StrVal(Month([Data])),2)
    ANOREF = StrVal(Year([Data]))

    Moveto "SaldCont"
    Moveto [Codigo da Conta]
    Locate [Answer->Codigo da Conta],ANOREF,MESREF
    If Not RetVal
       Then End Down
            [Codigo da Conta]=[Answer->Codigo da Conta]
            [Ano Referencia ]=ANOREF
            [Mes Referencia ]=MESREF
    EndIf
    If [Answer->Tipo Movimento]="E"
       Then [Entradas]=[Entradas]+[Answer->Valor]
       Else [Saidas  ]=[Saidas  ]+[Answer->Valor]
    EndIf
    Moveto "Answer"
EndScan
Do_It!
ClearAll


;---- Verifica Saldo Inicial do mˆs referente e o Saldo Final do mˆs anterior
If NumVal(MES) = 1
   Then ANO_ANTERIOR = AlinhM(StrVal(NumVal(ANO) - 1),4)
        MES_ANTERIOR = "12" 
   Else ANO_ANTERIOR = AlinhM(StrVal(ANO),4)
        MES_ANTERIOR = AlinhM(StrVal(NumVal(MES) - 1),2)
EndIf   
 
AGUARDE("Aguarde, verifica‡Æo de saldos")
{Ask} {Conta}
Moveto [Codigo da Conta   ] Check typein "_conta"
Moveto [Codigo da Empresa ]       TypeIn "~VSDGEMPRESA.."
Moveto [Descricao da Conta] Check 
{Ask} {SaldCont}
Moveto [Codigo da Conta  ]       typein "_conta"
Moveto [Ano Referencia   ]       TypeIn ANO_ANTERIOR
Moveto [Mes Referencia   ]       TypeIn MES_ANTERIOR
moveto [Saldo Inicial    ] TypeIn "_sdi"
moveto [Entradas         ] TypeIn "_ent"
moveto [Saidas           ] TypeIn "_sai, calc ((_sdi+_ent)-_sai) As Saldo Final"
Do_It!
ClearAll

{Ask} {SaldCont} 
Moveto [Codigo da Conta    ] TypeIn "_Conta"
Moveto [Ano Referencia     ] TypeIn "~ANO"
Moveto [Mes Referencia     ] TypeIn "~MES"
moveto [Saldo Inicial      ] Check TypeIn "_Saldo"
{Ask} {Answer} Check
Moveto [Codigo da Conta    ]       TypeIn "_Conta"
Moveto [Saldo Final        ]       TypeIn "Not _Saldo"
Do_it!  
ClearAll

If Not IsEmpty("Answer")
   Then 
        Tabela_ERRO_CONTA=Cria_Temp(PrivDir())
        Copy "\\Base\\Sistemas\\CtaCor\\RM_REPRO" Tabela_ERRO_CONTA
        Empty(Tabela_ERRO_CONTA)

        View Tabela_ERRO_CONTA 
        Coedit "Answer"
        Scan
          MSG_ERRO = "Saldo inicial de "+MES+"."+ANO+" com "+Ltrim(Format("W12.2,EIC",[Saldo Inicial]))+
                     " difere do saldo final de "+MES_ANTERIOR+"."+ANO_ANTERIOR+" com "+LTrim(Format("W12.2,EIC",[Saldo Final]))
                     
          moveto Tabela_ERRO_CONTA
          end
          down
          [Codigo da Conta   ]=[Answer->Codigo da Conta   ]
          [Descricao da Conta]=[Answer->Descricao da Conta]
          [MSG_Erro          ]=MSG_ERRO

          moveto "Answer"
        EndScan
        Do_It!               
        ClearAll

        If Not IsEmpty(Tabela_ERRO_CONTA)
           Then MSG=""
                MSG=MSG+"O Sistema detectou inconsistˆncia de dados !// //"
                MSG=MSG+"Saldos incompat¡veis.// //"
                MSG=MSG+"Corrija o problema para obter o MELHOR controle !// //"
                MSG=MSG+" 1-Use o Extrato das Contas para verificar a inconsistˆncia !// //"
                MSG=MSG+"Ser  gerado um relat¢rio da inconsistˆncia !"
                Mensagem(MSG)

                DISPOSITIVO()
                LimpaRodape(0)
                If OK<>""
                   Then
                        AGUARDE("Aguarde, gerando relat¢rio")

                        IMPRIREL(Tabela_ERRO_CONTA,"R")
                EndIf
        EndIf
        Delete Tabela_ERRO_CONTA
EndIf    

LimpAguarde()

Return True
EndProc

;*******************************************************************************
; SaldoCont                                                                    *
;*******************************************************************************
Proc ATUALIZASALDOS()
ClearAll
MESREF=MES
ANOREF=ANO
If MESREF="12"
   Then MESREF="01"
        ANOREF=StrVal(NumVal(ANOREF)+1)
        ALINHM(ANOREF,4)
        ANOREF=NVR
   Else MESREF=StrVal(NumVal(MESREF)+1)
        ALINHM(MESREF,2)
        MESREF=NVR
EndIf

MSG_AGUARDE="Aguarde, Transferindo saldos de "+MESANO+"->"+MESREF+"."+ANOREF

{Ask} {Conta}
Moveto [Codigo da Conta  ] Example "CONTA"
Moveto [Codigo da Empresa] TypeIn "~VSDGEMPRESA.."
{Ask} {Saldcont} Check
Moveto [Codigo da Conta] Example "CONTA"
Moveto [Ano Referencia ] TypeIn "~ANO"
Moveto [Mes Referencia ] TypeIn "~MES"
Do_It!
ClearAll

If IsEmpty("Answer")
   Then Mensagem("Mˆs sem saldos p/ transferir !")
        Return
EndIf

NR=NRecords("Answer")
View "SaldCont"
CoEdit "Answer"
Scan
   Aguarde(MSG_AGUARDE+Barra(NR,RecNo()))
   If RecordStatus("New")
      Then QuitLoop
   EndIf

   Moveto "\\Sistemas\\CtaCor\\SaldCont"
   Moveto [Codigo da Conta]
   Locate [Answer->Codigo da Conta],ANOREF,MESREF
   If Not RetVal
      Then End Down
           [Codigo da Conta]=[Answer->Codigo da Conta]
           [Ano Referencia ]=ANOREF
           [Mes Referencia ]=MESREF
   EndIf
   [Saldo Inicial]=([Answer->Saldo Inicial]+[Answer->Entradas])-[Answer->Saidas]

   Moveto "Answer"
EndScan
Do_It!
ClearAll

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 uma//"
                  MSG=MSG+"rotina do sistema que atualiza o Caixa/Banco !// //"
                  MSG=MSG+Completa("- Contact -lo para liberar esta rotina;",40," ")+"//"
                  MSG=MSG+Completa("- Este reprocessamento ser  abortado.",40," ")+"//"
                  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()
If IsAssigned(Array_Tabelas)
   Then Release Vars Array_Tabelas
EndIf
DynArray Array_Tabelas[]

Array_Tabelas[01]="Conta"
Array_Tabelas[02]="MovCont"
Array_Tabelas[03]="SaldCont"

EndProc

;*******************************************************************************
;* Rotina para gerar o log de registro por usu rio                             *
;*******************************************************************************
Proc Gera_Log()          

AUX_OPCAO = ""
If CheckTG_OPTRANSF[1]
    Then AUX_OPCAO="Saldo Reprocessou/Transferiu: "
    Else AUX_OPCAO="Saldo so Reprocessamento    : "
EndIf

MSG =  AUX_OPCAO+"Empresa "+VSDGEMPRESA +", Mes/Ano "+VSDGMESANO
Grava_Logt("#","ReprCcor",MSG)  

EndProc ;Gera_Log() 

;*******************************************************************************
;* 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_EMPRESA"       : Campo="NO"
            Case Campo="TG_MESANO"        : Campo="TG_EMPRESA"
            Case Campo="TG_OPTRANSF"      : Campo="TG_MESANO"
            Case Campo="YES" Or Campo="NO": Campo="TG_EMPRESA"
          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_EMPRESA" : Campo = "TG_MESANO"
                    Case Campo = "TG_MESANO"  : Campo = "TG_OPTRANSF"
                    Case Campo="TG_OPTRANSF": Campo="YES"
                  EndSwitch
          EndIf
          RefreshDialog
   EndSwitch
EndIf
Switch
  Case Campo="TG_OPTRANSF":
     MensagemCheckBoxes()
EndSwitch
Monta_Prompt(MSG_CAMPO,TECLA)
Return Temp
EndProc

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

VSDGEMPRESA = ""
VSDGMESANO  = ""

Array TG_OPTRANSF[1]
TG_OPTRANSF[1]="Transferir para o pr¢ximo Mˆs"

Array CheckTG_OPTRANSF[ArraySize(TG_OPTRANSF)]
CheckTG_OPTRANSF[1]=False

While True

  ShowDialog "Reprocessamento das Movimenta‡”es" Proc "SD_Dialog"
  Trigger "OPEN","ARRIVE"
  Key "F1","ENTER","ESC","TAB",
      -104, -105, -106, -107, -108, -109, -110, -111, -112, -113, -139, -140  
     @ 07,12   Height 09 Width 72

     Label  @ 00,00 "Empresa"  For "TG_EMPRESA"
     Accept @ 01,01 Width 07 "A4"  Picture "[&,#][#*#]" Tag "TG_EMPRESA"    To VSDGEMPRESA
     Accept @ 01,09 Width 25 "A20" Picture "!*!" Tag "TG_NOMEMPRESA" To VSDGNOMEMP

     Label  @ 02,00 "Mˆs/Ano Referente"  For "TG_MESANO"
     Accept @ 03,01 Width 10 "A07"  Picture "##;.####" Tag "TG_MESANO"  To VSDGMESANO

     Label  @ 00,35 "Saldos das Contas"  For "TG_OPTRANSF"
     CheckBoxes @ 01,35 Height 1 Width 34 Tag "TG_OPTRANSF"
     TG_OPTRANSF[1] to CheckTG_OPTRANSF[1]

     Pushbutton @ 05,22 width 11 "~O~k"      OK     Default Value "Ok" Tag "YES" To BottonValue
     Pushbutton @ 05,36 width 11 "~C~ancela" CANCEL                    Tag "NO"  To BottonValue

  EndDialog
  If Not RetVal Then QuitLoop EndIf

  MES = SubStr(VSDGMESANO,1,2)
  ANO = SubStr(VSDGMESANO,4,4)
  If NumVal(ANO) < 2000
     Then MESANO = MES+"."+SubStr(ANO,3,2)
     Else MESANO = MES+"."+ANO
  EndIf
  If NumVal(MES) = 12
     Then MESREF = "01"
          ANOREF = NumVal(ANO)+1
          ANOREF = AlinhM(StrVal(ANOREF),4)
     Else MESREF = NumVal(MES)+1
          MESREF = AlinhM(StrVal(MESREF),2)
          ANOREF = ANO
  Endif
  
  If NumVal(MES) > 12 Or NumVal(MES) = 0
     Then MENSAGEM("Mˆs Inv lido!")
          Loop
  EndIf

;;If Not Verifica_Usuario() Then Loop EndIf

  VSDGDTINI = DateVal("01."+MES+"."+ANO)
  If (NumVal(Mes)+1)=13
     Then VSDGDTFIM = DateVal("01.01"+"."+StrVal(NumVal(ANO)+1))-1
     Else VSDGDTFIM = DateVal("01."+AlinhM(StrVal(NumVal(MES)+1),2)+"."+ANO)-1
  EndIf
  
  DataOk=True
  Switch
    Case NumVal(ANO)=Year(Today()) And NumVal(MES)>Month(Today()) : DataOk=False
    Case NumVal(ANO)>Year(Today())                                : DataOk=False
  EndSwitch
  If Not DataOk
     Then Mensagem("O Mes/Ano "+VSDGMESANO+" informado maior que da data atual "+Format("D13",Today())+" !")
          Loop
  EndIf        
  If CheckTG_OPTRANSF[1] And NumVal(ANO)=Year(Today()) And NumVal(MES)=Month(Today())
     Then MSG=    "O novo Mes/Ano "+MESREF+"."+ANOREF+" informado maior que da data atual "+Format("D13",Today())+" !// //"
          MSG=MSG+"Voce esta encerrando o mes de "+VSDGMESANO+". // //"
          MSG=MSG+"Deseja transferir o saldo do estoque de "+VSDGMESANO+" para "+MESREF+"."+ANOREF+" ?"
          If Not ConfGeral_N(MSG)
             Then Mensagem("Opera‡„o Cancelada !")
                  Loop
          EndIf   
  EndIf   

  ;-----------------------------------------------------------------------------
  Aguarde("Aguarde, Checando dados")
  PROCESSAR_DADOS=True
  Monta_Dir_Trab(VSDGDTINI,VSDGDTFIM)
  While Novo_Dir_Trab()
    If Not IsBlank(Dir_Trab)
       Then If Not Verifica_Mov()
               Then PROCESSAR_DADOS=False
                    QuitLoop
            EndIf
    EndIf
  EndWhile
  If Not PROCESSAR_DADOS
     Then MSG=   "Existem movimenta‡”es fechadas://"
          Msg=MSG+"Caixa/Bamco - "+Dir_Trab+"// //"
          MSG=MSG+"Esta rotina s¢ deve ser executada p/ movimenta‡”es em \"ABERTO\". // //"
          MSG=MSG+"Verificar !"
          Mensagem(MSG)
          Loop
  EndIf
  ;-----------------------------------------------------------------------------

  Gera_Log()
  ListadeTabelas()
  If (BloqueiaTabelas("\\Sistemas\\Ctacor\\"))
     Then 
          if CheckTG_OPTRANSF[1]
             then MSG="Caixa/Banco Reprocessou/Transferiu: "
             else MSG="Caixa/Banco s¢ Reprocessamento    : "
          endif
          MSG=MSG+" Empresa "+VSDGEMPRESA+", Mes/Ano "+VSDGMESANO
          Grava_Logt("#","ReprCxBc",MSG)
          
          If SELECIONA()
             Then If CheckTG_OPTRANSF[1]
                     Then AtualizaSaldos()
                  EndIf

                  LimpAguarde()
                  MSG=""
                  MSG=MSG+"Fim de Opera‡„o !"
                  If CheckTG_OPTRANSF[1]
                     Then MSG=MSG+"// //Transferido saldos de "+MESANO+" p/ "+MESREF+"."+ANOREF+".// //"
                          MSG=MSG+"Caso j  tenha Entradas ou Saidas em "+MESREF+"."+ANOREF+",//"
                          MSG=MSG+"reprocessar as Entradas/Saidas de "+MESREF+"."+ANOREF+"."
                  EndIf
                  MENSAGEM(MSG)
          EndIf
  EndIf
  DesbloqueiaTabelas("\\Sistemas\\Ctacor\\")

EndWhile
ClearAll
Release Vars All
Release Procs All
