;** Usuarios *******************************************************************
;*  Manutencao Cadastro de Usuarios                                            *
;*******************************************************************************
;Autor           : Vise Informatica (VISERP)
;Desenvolvido    : 05/12/1995 por Anivel Augusto Rodrigues
;Ultima Alteracao: 02/06/2005 por Davi Pereira Carrano
;Motivo Alteracao: Nivel de Acesso
;Ultima Alteracao: 15/08/2007 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Run
;Ultima Alteracao: 27/02/2008 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Xcopia("M_*.*")
;Ultima Alteracao: 23/05/2008 por Anivel Augusto Rodrigues
;Motivo Alteracao: Inclusao Controla_Edicao
;Ultima Alteracao: 05/06/2008 por Anivel Augusto Rodrigues
;Motivo Alteracao: Injustes Edicao
;Ultima Alteracao: 27/11/2008 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Senha
;Ultima Alteracao: 08/01/2009 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Senha
;Ultima Alteracao: 29/08/2009 por Anivel Augusto Rodrigues
;Motivo Alteracao: Inclusao Campo Vendedor/Representante/Gerencia
;Ultima Alteracao: 26/11/2009 por Bruno Carvalho
;Motivo Alteracao: Inclusao dos Campos Usuario_Balcao e Empresa
;Ultima Alteracao: 07/12/2009 por Cleber Alves
;Motivo Alteracao: Alteracao no Layout
;Ultima Alteracao: 07/02/2011 por Bruno Carvalho
;Motivo Alteracao: Ajustes Novo Layout de Teclas 
;Ultima Alteracao: 09/05/2011 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Cor Edi‡Æo apos configura‡Æo
;Ultima Alteracao: 30/06/2011 por Bruno Carvalho
;Motivo Alteracao: Adicionado "Inativo" em Nivel de Acesso
;Ultima Alteracao: 03/01/2013 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes CHAVE()                   
;Ultima Alteracao: 04/02/2013 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes SD_Usuario()
;Ultima Alteracao: 15/03/2013 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes quitloop maximo de registros
;Ultima Alteracao: 12/11/2013 por Bruno Carvalho
;Motivo Alteracao: Adicionado rotina para informar conta padrÆo por usu rio "F8"
;Ultima Alteracao: 12/06/2014 por Andrey Fillipe
;Motivo Alteracao: Acrescentado o campo (Codigo da Gerencia)
;Ultima Alteracao: 14/09/2016 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Cod_Empresa poder informar mesmo nÆo senho usuario balcÆo
;Ultima Alteracao: 07/06/2018 por Bruno Carvalho
;Motivo Alteracao: Adicionado/ajustado Grava_LogEx() p/ gravar log de erros ao excluir registros
;Ultima Alteracao: 07/02/2020 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustess [Enter] rodape botoes ok/cancela      

;*******************************************************************************
;* Rotina para Localizar Registro                                              *
;*******************************************************************************
Proc CHAVE()
While True
  SetaCorRegistro("Editar")
  Moveto [Chapa]
  End
  SEQ = [Chapa]
  Down

  While True
    TECLA=""
    AguardaTeclasPadrao()
  
    Switch
    Case RetVal=-33 : SemFuncoes()
    Case RetVal="F3": SemFicha()
    Case RetVal=-94 : MsgTeclasPadrao()
    Case RetVal="F7" Or RetVal="UP" Or RetVal="PGUP" Or RetVal="HOME":
         While True
           PAGINA("Usuarios","MR")
           If EDITAR="S"
              Then CHAVE=0
                   CHAPA=[Chapa]
                   Controla_EdicaoC()
              Else If EXCLUIR="S"
                      Then CHAPA=[Chapa]
                           Exclui_Diretorio(True)
                      Else QuitLoop
                   EndIf
           EndIf
           SetaPosForm()
         EndWhile
         QuitLoop
    Case RetVal="ESC":
         CHAVE=9
         Del
         Return         
    Case RetVal="ENTER":
         If Not Seta_Sequencia(SEQ,True)
            Then Del
                 QuitLoop
         EndIf
         ALINH()
         []=RETOR
         CHAPA=[]
         Del
         Moveto [Chapa]
         Locate CHAPA
         If RetVal
            Then CHAVE=0
            Else CHAVE=1
                 End Down
                 [Chapa]=CHAPA
         EndIf
         If IsLockRecord()
            Then If CHAVE=1 Then Del EndIf
                 QuitLoop
         EndIf
         Return  
    EndSwitch
  EndWhile
EndWhile
EndProc  ; (Chave)

;*******************************************************************************
;* Rotina para digitacao das informacoes                                       *
;*******************************************************************************
Proc DIGITA()
Moveto [Nome]
While True

      TECLA=" Esc=Retornar  "
      If CHAVE=0
         Then TECLA=TECLA+"Del=Excluir  F3=Senha  PgDn=Finalizar  "
      EndIf
      If [Nivel de Acesso]="P" Or [Nivel de Acesso]="E"
         Then TECLA=TECLA+"F4=Configurar  "
      EndIf
      
      If Field()="Nivel de Acesso" Or
         Field()="Codigo_Representante"   
         Then TECLA=TECLA+"F1=Tabela "
      EndIf
      If Field()="Cod_Empresa"  
         Then TECLA=TECLA+"F1=Tabela "
      EndIf     
      MSGCAMPO=""
      Prompt TECLA            

      If Field()="Tipo_Controle_Dia"
         Then MSGCAMPO="Controle do Dia  I=Individual  G=Geral"
      EndIf
      If Field()="Codigo_Representante"
         Then MSGCAMPO="Se usu rio ‚ Vendedor/Representante? Balcao e consulta apenas p/ este codigo, verificar op‡äes dispon¡veis !"
      EndIf
      If Field()="Codigo da Gerencia"
         Then MSGCAMPO="Se usu rio pertence a uma gerˆncia de Vendedor/Representante? Consultas apenas desta gerˆncia, verificar op‡äes dispon¡veis !"
      EndIf      
      If Field()="Usuario_Balcao"
         Then MSGCAMPO="Usu rio BalcÆo? Sim ou NÆo?"
      EndIf
      If Field()="Conta Padrao"
         Then MSGCAMPO="Conta Padr„o para Usu rio"
      EndIf
      If Field()="Cod_Empresa"
         Then MSGCAMPO="Se for Usu rio BalcÆo, Informe a Empresa?"
      EndIf

      Wait Field
           MESSAGE MSGCAMPO
           Until "ESC","ENTER","DEL","FIELDVIEW","F35","F3","F4","F1","PGDN"
      Switch
      Case RetVal="F1":
           If Field()="Codigo_Representante" Or Field()="Cod_Empresa" Or Field()="Codigo da Gerencia" Or Field()="Conta Padrao"
              Then ConsultaF1()
           EndIf   
           
           If Field()="Nivel de Acesso"
              Then ShowPopup " N¡veis de acesso " CENTERED
                    "~C~ompleto  " : " Acesso a todas rotinas do sistema sem direito de supervisor"           : "COMPLETO",
                    "~P~articular" : " Acesso as rotinas selecionadas do sistema sem direito de supervisor"   : "PARTICULAR",
                    "~S~upervisor" : " Acesso a todas rotinas do Sistema com todos direitos"                  : "SUPERVISOR",
                    "~E~special"   : " Acesso as rotinas selecionadas do sistema com direito de supervisor"   : "ESPECIAL",
                    Separator, 
                    "~I~nativo"    : " Usu rio inativo, acesso bloqueado"                                     : "INATIVO"
                   EndMenu
                    To MenuVar
                   echo off

                   If MenuVar="Esc"
                       Then Left
                            Loop
                   EndIf
                   []=SubStr(MenuVar,1,1)
                   If ([]<>"P" And []<>"E") And CHAVE=0
                      Then If DirExists("\\Sistemas\\Usuarios\\"+CHAPA)<>0
                              Then Exclui_Diretorio(False)
                           EndIf
                   EndIf
                   Moveto [Nome]
                   CHAVE=0
                   Loop
           EndIf

      Case RetVal="F4":
           If CHAVE=0 And
              ([Nivel de Acesso]="P" Or [Nivel de Acesso]="E")
              Then Diretorio="\\Sistemas\\Usuarios\\"+[Chapa]
                   If DirExists(Diretorio)=0
                      Then Cria_Pasta(Diretorio)
                           XCopia_Arquivo("M_*.* "+Diretorio)
                   EndIf
                   Do_it!
                   ClearAll

                   SetDir Diretorio
                   Play "\\Sistemas\\Cadastro\\CfgUser"
                   SetDir "\\Sistemas\\Cadastro"

                   Coedit "Usuarios"
                   PickForm "F"
                   Moveto [Chapa]
                   Locate CHAPA
                   Moveto [Nome]
                   SetaCorRegistro("Editar")

           EndIf
      Case RetVal="F3":
           If CHAVE=0
              Then NovaSenha()
                   Moveto [Nome]
           Endif
      Case RetVal="PGDN" And CHAVE=0:
           If IsBlank([Senha])
              Then MSG="N„o foi informado a senha para este Usuario !  //"
                   MSG=MSG+"Por favor pressione a tecla F3 para cadastra-la. "
                   Mensagem(MSG)
              Else CHAVE=9
                   QuitLoop
           EndIf
      Case RetVal="ESC":   
           Switch
               Case Field()="Nome" :
                    If QuerDesfazer("")
                       Then If CHAVE=1
                              Then Del
                              Else Undo
                            EndIf
                            CHAVE=9
                            QuitLoop
                    EndIf
               Case Field()="Usuario_Balcao"    :
                    Moveto [Nome]
               Case Field()="Codigo_Representante" :               
                    If Not IsBlank([Cod_Empresa])
                       Then Moveto [Cod_Empresa]
                       Else Moveto [Usuario_Balcao]
                    EndIf  
            OtherWise : Left
           EndSwitch
      Case Retval="FIELDVIEW" or Retval="F35":
           EDITFIELD()
      Case RetVal="DEL" And CHAVE=0:
           If Exclui_Diretorio(True)
              Then CHAVE=9
                   QuitLoop
           EndIf
      Case RetVal="ENTER":
           Switch
              Case Field()="Cod_Empresa" :
                   IF [Usuario_Balcao]="S" and Isblank([]) 
                      Then Fastmsg("Valor inv lido !")
                           Loop               
                   EndIF
                   Right
              
              Case Field()="Codigo_Representante" :
                   Right

              Case Field()="Codigo da Gerencia" : 
                   Right

              Case Field()="Conta Padrao" :
                   Right

              Case Field()="Nivel de Acesso":
                   If Not IsBlank([])
                      Then Moveto [Nome]
                           CHAVE=0
                           Loop
                   EndIf
                   Fastmsg("Valor inv lido !")
                   
              Otherwise:
                   If IsBlank([])
                      Then Fastmsg("Valor inv lido !")
                           Loop               
                   EndIf
                   Right
          EndSwitch
      EndSwitch
EndWhile
EndProc  ; (Digita)

;*******************************************************************************
;* Rotina exclusao do diretorio do usuario                                     *
;*******************************************************************************
Proc Exclui_Diretorio(Checa)
Private Checa
If Checa
   Then If QuerExcluir("deste usu rio")
           Then Grava_LogEx("Usuario")
                Del
           Else UnLockRecord
                Return False
        EndIf
EndIf
If Not IsBlank(CHAPA)
   Then If DirExists("\\Sistemas\\Usuarios\\"+CHAPA)<>0
           Then Deleta_Arvore(Substr(Directory(),1,2)+"\\Sistemas\\Usuarios\\"+CHAPA)
        EndIf
EndIf
Return True
EndProc   ; (Exclui_Diretorio)

;*******************************************************************************
;* Rotina                                                                      *
;*******************************************************************************
Proc SD_Usuario(Disparo,Campo,Evento,Elemento)
Temp=True
TECLA    =""
MSG_CAMPO=""
If Disparo="EVENT" And Evento["Type"]="KEY" Then
   Switch
     Case Evento["KeyCode"] =  27:
          Temp=False
          Switch
            Case Campo="TG_SENHA1"        : Campo="NO"
            Case Campo="TG_SENHA2"        : Campo="TG_SENHA1"
            Case Campo="YES" Or Campo="NO": Campo="TG_SENHA1"
          EndSwitch
     Case Evento["KeyCode"] = 13:
          Temp=False
          If Checa_TAG()
             Then Switch
                    Case Campo="TG_SENHA1"      : Campo="TG_SENHA2"
                         VSDGSENHA1 =ControlValue("TG_SENHA1")
                    Case Campo="TG_SENHA2"      : Campo="YES"
                         VSDGSENHA2 =ControlValue("TG_SENHA2")
                  EndSwitch
          EndIf
          RefreshDialog
   EndSwitch
EndIf

Switch
  Case Campo="TG_SENHA1":
       MSG_CAMPO="Informe a nova senha do usu rio"
  Case Campo="TG_SENHA2":
       MSG_CAMPO="Confirme a nova senha do usu rio"
  Case Campo="NO" :
       MSG_CAMPO="[Enter]=Cancelar/Retornar !"
  Case Campo="YES":
       MSG_CAMPO="[Enter]=Confirmar Dados/Entrar !"
EndSwitch

SelectControl Campo

ExibeRodapeSD(MSG_CAMPO)
ExibeRodape(2,"Esc=Retornar  Enter=Avan‡ar  "+TECLA)
RefreshDialog

Return Temp
EndProc  ; (Sd_Usuario)

;*******************************************************************************
;* Rotina                                                                      *
;*******************************************************************************
Proc SD_ContaPadrao(Disparo,Campo,Evento,Elemento)
Temp=True
TECLA    =""
MSG_CAMPO=""

If Disparo="EVENT" And Evento["Type"]="KEY" Then
   Switch
     Case Evento["KeyCode"] = -59: 
          If Campo="TG_CONTA1"            
             Then Dynarray WinArray5[]
                  Window Handle Dialog to JANELA
                  Window GetAttributes JANELA To WinArray5
                  WinArray5["FLOATING"]=False
                  Window SetAttributes JANELA From WinArray5
                  
                  If Campo="TG_CONTA1" 
                     Then Moveto [Conta Padrao]  
                  EndIf
                                   
                  If ConsultaF1()
                     Then If Campo="TG_CONTA1"
                             Then VSDGCONTA = ControlValue("TG_CONTA1")
                                  VSDGCONTA    = [Conta Padrao]
                                  GetRecord "\\Sistemas\\Ctacor\\Conta" VSDGCONTA To DynArray CONT
                                  If RetVal  
                                     Then VSDGNOMCONTA=CONT["Descricao da Conta"]
                                  EndIf
                                  Campo="YES"
                          EndIf        
                     Else Campo="TG_CONTA1"
                  EndIf
                  
                  Window Select JANELA
                  WinArray5["FLOATING"]=True
                  Window SetAttributes JANELA From WinArray5

                  Echo Normal
                  Echo off                  
                     
                  RefreshDialog
         EndIf
         Temp=False
     Case Evento["KeyCode"] =  27: 
          Temp=False
          Switch
            Case Campo="TG_CONTA1"          : Campo="NO"
            Case Campo="YES" Or Campo="NO" : Campo="TG_CONTA1"
          EndSwitch
     Case Evento["KeyCode"] = 13: 
          Temp=False
          If Checa_TAG()
             Then Switch
                     Case Campo="TG_CONTA1" : Campo="YES"
                          VSDGCONTA = ControlValue("TG_CONTA1")
                          If Not IsBlank(VSDGCONTA)
                             Then VSDGCONTA=AlinhM(VSDGCONTA,4)
                          EndIf   
                     Case Campo="YES" : AcceptDialog     
                  EndSwitch
          EnDIf
          RefreshDialog   
   EndSwitch
EndIf

SelectControl Campo
RefreshDialog

Return Temp
EndProc  ; SD_ContaPadrao()

;*******************************************************************************
;* Rotina Monta Janela Digitacao De Senha/Vencida                              *
;*******************************************************************************
Proc NovaSenha()
Private wii,senhaok

MSG="Para sua maior seguran‡a, observe nossa(s) recomenda‡”es:       // //"
MSG=MSG+"- Evite utilizar sempre a mesma senha.                      //"
MSG=MSG+"- Procure utilizar os 6 caracteres dispon¡veis em sua senha.//"
MSG=MSG+"- Evite utililzar mais de 2 caracters iguais consecutivos.  //"
Mensagem(MSG)

VSDGSENHA=[Senha]

VSDGSENHA1=""
VSDGSENHA2=""
While True
  Show_Janela=2
  ShowDialog "Alterar a senha do usu rio" Proc "SD_Usuario"
    Trigger "OPEN","ARRIVE"
      Key "ENTER","ESC"
       @ 07,22   Height 09 Width 37

       Label  @ 1,00 "Nova senha: " for "TG_SENHA1"
       Accept @ 1,23 Width 9 "A6" picture "@*@" hidden Tag "TG_SENHA1" to VSDGSENHA1

       Label  @ 3,00 "Confirmar nova senha: " for "TG_SENHA2"
       Accept @ 3,23 Width 9 "A6" picture "@*@" hidden Tag "TG_SENHA2" to VSDGSENHA2

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

  Enddialog
  If Not RetVal
     Then Return False
  EndIf

  If (VSDGSENHA1<>VSDGSENHA2) Or
     IsBlank(VSDGSENHA1) or
     IsBlank(VSDGSENHA2)
     Then MENSAGEM("A nova senha e a senha confirmada n„o conferem !// //Digite-as novamente !")
          Loop
  EndIf

  ENCRIPTASENHA(VSDGSENHA1)

  [Senha        ]=SENHAENC
  [Data da Senha]=Today()+60
  Return True

EndWhile
EndProc ; (NovaSenha)

;*******************************************************************************
;* Rotina para cadastrar conta padrÆo por usu rio                              *
;*******************************************************************************
Proc ContaPadrao()
Private VSDGCONTAANT

If Not IsBlank([Conta Padrao])
   Then VSDGCONTA    = [Conta Padrao]
        VSDGCONTAANT = VSDGCONTA 
        GetRecord "\\Sistemas\\Ctacor\\Conta" VSDGCONTA To DynArray CONT
        If RetVal  
           Then VSDGNOMCONTA=CONT["Descricao da Conta"]
           Else VSDGNOMCONTA=""
        EndIf
   Else VSDGCONTA    = ""
        VSDGNOMCONTA = ""
        VSDGCONTAANT = ""
EndIf   
While True
  ShowDialog "Conta padr„o do usu rio" Proc "SD_ContaPadrao"
    Trigger "OPEN","ARRIVE"
      Key "ENTER","ESC","F1"
       @ 07,22   Height 07 Width 40

       Label  @ 00,00 "Conta"  For "TG_CONTA1"
       Accept @ 01,01 Width 07 "A4"  Picture "#*#" Tag "TG_CONTA1"    To VSDGCONTA
       Accept @ 01,09 Width 28 "A25" Picture "!*!" Tag "TG_NOMCONTA" To VSDGNOMCONTA

       Pushbutton @ 03,08 width 11 "~O~k"      OK     Default Value "Ok" Tag "YES" To BottonValue
       Pushbutton @ 03,20 width 11 "~C~ancela" CANCEL                    Tag "NO"  To BottonValue

  Enddialog
  If Not RetVal
     Then Return False
  EndIf

  If VSDGCONTAANT <> "" And VSDGCONTAANT <> VSDGCONTA
     Then If VSDGCONTA=""
             Then ConfGeral("Deseja realmente apagar a conta armazenada ?")                                          
             Else ConfGeral("Deseja realmente alterar a conta anterior "+VSDGCONTAANT+" para a//conta informada "+VSDGCONTA+" ?")
          EndIf
          If OK<>"S"
             Then VSDGCONTA=VSDGCONTAANT
                  GetRecord "\\Sistemas\\Ctacor\\Conta" VSDGCONTA To DynArray CONT
                  If RetVal  
                     Then VSDGNOMCONTA=CONT["Descricao da Conta"]
                     Else VSDGNOMCONTA=""
                  EndIf
                  RefreshDialog
                  Loop
         EndIf
  EndIf
  [Conta Padrao]=VSDGCONTA
  UnLockrecord  
  Return True
EndWhile


EndProc ;ContaPadrao()

;*******************************************************************************
;* Rotina para controlar Edicao do registro                                    *
;*******************************************************************************
Proc Controla_EdicaoC()
DIGITA()
If RecordStatus("Locked") Then UnLockRecord EndIf         
Endproc

;*******************************************************************************
;* Rotina Principal                                                            *
;*******************************************************************************
AutoLib="\\Sistemas\\Cadastro\\Bibliot,\\Sistemas\\Cadastro\\Bib_Show"
                     
If Checa_Supervisor()
   Then CoEdit "Usuarios"
        PickForm "F"
        While True
           CHAVE()
           If CHAVE=9
              Then QuitLoop
           EndIf
           Controla_EdicaoC()
        EndWhile
        Do_It!
        ClearAll
EndIf
Release Vars All
Release Procs All
