;** RqTRF **********************************************************************
;*  Digitacao de Transferˆncia de Produtos                                     *
;*******************************************************************************
;Autor           : Vise Informatica (VISERP)                        
;Desenvolvido em : 06/07/2016 por Bruno Carvalho             
;Ultima Alteracao: 13/07/2016 por Bruno Carvalho                         
;Motivo Alteracao: Novas implementa‡äes                                                
;Ultima Alteracao: 20/07/2016 por Bruno Carvalho                         
;Motivo Alteracao: Adicionado op‡Æo de "F4" e "F5" p/ escolher forma de visualiza‡Æo por codigo do item ou barra 
;Ultima Alteracao: 01/08/2016 por Bruno Carvalho                         
;Motivo Alteracao: Adicionado campo de observa‡Æo e vari vel LOCALIZACAO_ITEM no FORM
;Ultima Alteracao: 15/08/2016 por Bruno Carvalho                         
;Motivo Alteracao: Adicionado Avaria -> Empresa 0002
;Ultima Alteracao: 30/08/2016 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes mensagem e restri‡äes         
;Ultima Alteracao: 11/11/2016 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes permitir cancelar solicita‡Æo para devolu‡Æo

;*******************************************************************************
;* Rotina para Controlar Chave                                                 *
;*******************************************************************************
Proc CHAVEC()

FACA_DIGITAC  = True
INICIO_PAGINA = True                    

While True
  Moveto "Rqtrf"
  End
  Moveto [Numero do Lancamento]
  LANCTO=[Numero do Lancamento]
     
  If OPCAO_FORM_ESCOLHA="F" Or OPCAO_FORM_ESCOLHA="1"
     Then Down
     Else PgDn PgDn
  EndIf
  Moveto [Numero do Lancamento]

  SetaCorRegistro("Editar")
  While True
  MSGCAMPO=""
  TECLA=""
  AguardaTeclasPadrao() 
  
  If RetVal=-33 
     Then Echo Normal
          Echo Off
          ShowPopup " Fun‡”es " CENTERED
            "[F4] Visualizar a rela‡„o por codigo de ~b~arras" : " Visualizar a rela‡„o por codigo de barras " : "F4",
            "[F5] Visualizar a rela‡„o por codigo do ~i~tem"   : " Visualizar a rela‡„o por codigo do item   " : "F5",
            Separator,
            "~S~air"                        : " Ignorar Op‡äes"                :"CANCELAR"
          EndMenu
          To MenuVar
          Echo Off
          If MenuVar="CANCELAR" or MenuVar="Esc"
             Then Loop
          EndIf
          RetVal=MenuVar
   EndIf
   
   Switch
        Case RetVal="F4": OPCAO_FORM="F"
                          OPCAO_FORM_ESCOLHA="F"
                          Do_it!
                          ClearAll
                          FileWrite PrivDir()+"RQTRF.INI" From GravaExpressao("OPCAO_FORM_ESCOLHA","S",OPCAO_FORM_ESCOLHA)    
                          Abre_Tabelas()
                          QuitLoop
        Case RetVal="F5": OPCAO_FORM="1"
                          OPCAO_FORM_ESCOLHA="1"
                          Do_it!
                          ClearAll
                          FileWrite PrivDir()+"RQTRF.INI" From GravaExpressao("OPCAO_FORM_ESCOLHA","S",OPCAO_FORM_ESCOLHA)
                          Abre_Tabelas()
                          QuitLoop
        Case RetVal=-94 : MsgTeclasPadrao()
        Case RetVal="F3":
             If OPCAO_FORM_ESCOLHA="F" Or OPCAO_FORM_ESCOLHA="1" 
                Then OPCAO_FORM="2"
                Else OPCAO_FORM=OPCAO_FORM_ESCOLHA
             EndIf
             Del                    
             CHAVEC=5
             Return
        Case RetVal="F7" Or RetVal="UP" Or RetVal="PGUP" Or RetVal="HOME":
             Del
             While True
               FACA_DIGITAC  = True
               INICIO_PAGINA = True

               If OPCAO_FORM_ESCOLHA="F" Or OPCAO_FORM_ESCOLHA="1"
                  Then PAGINA("Rqtrf","MR")
                  Else PAGINA("Rqtrf","MT")
               EndIf
               LANCTO=[Numero do Lancamento]
               Switch
                 Case EDITAR="S": 
                      PickForm "2"
                      Echo Normal
                      Echo Off
                      If Checa_Controle([Numero_Controle_Dia])
                         Then CHAVEC=0
                              Controla_EdicaoC()
                         Else UnLockRecord
                      EndIf
                 Case EXCLUIR="S":
                      PickForm "2"
                      Echo Normal
                      Echo Off
                      If [Status]<>""
                         Then Mensagem("N„o ‚ poss¡vel excluir a solicita‡„o com o status de "+[Status]+"!")
                         Else If Checa_Controle([Numero_Controle_Dia]) And Checa_Supervisor()
                                 Then ;---- Processo para CANCELAR o lan‡amento ao inv‚s de excluir ---------------
                                      MSG = "Esta solicita‡„o n„o pode ser excluida, somente CANCELADA.//"+
                                            "Deseja cancelar esta solicita‡„o ?"
                                      ConfGeral(MSG)
                                      If Ok="S"
                                         Then While True
                                                Edita_Memo("Justificativa",08,01,15,76,"Justificativa")
                                                If RetVal
                                                   Then If [Justificativa]=""
                                                           Then Mensagem("Informe uma justificativa para cancelar esta solicita‡„o!")
                                                           Else Controle_Dia_Rqtrf("TRANSFERENCIA")
                                                                [Status]="CANCELADO"
                                                                QuitLoop
                                                        EndIf
                                                   Else QuitLoop
                                                EndIf
                                             EndWhile   
                                      EndIf
                                 ;---- Processo para excluir o lan‡amento --------------
                                 ;Then If [Rqtrf->Lancamento RqCabeca_Rqtrf]<>""
                                 ;        Then MSG = "A Requisi‡„o "+[Rqtrf->Lancamento RqCabeca_Rqtrf]+" foi gerada a partir desta solicita‡„o.//"+
                                 ;                   "A exclus„o deste lan‡amento ir  desfazer esta  requisi‡„o.//"+
                                 ;                   "Deseja realmente excluir esta solicita‡„o de tranferˆncia?"
                                 ;       Else MSG = "Este lan‡amento ainda n„o foi transferido!   //"+
                                 ;                   "Deseja realmente excluir esta solicita‡„o de tranferˆncia?"
                                 ;     EndIf
                                 ;     ConfGeral(MSG)
                                 ;     If Ok="S" 
                                 ;        Then EXCLUSAO_C()
                                 ;        Else UnLockRecord
                                 ;     EndIf
                                 Else UnLockRecord
                              EndIf
                      EndIf
                 OtherWise: QuitLoop
               EndSwitch
               If OPCAO_FORM="2"
                  Then PickForm "2"
                  Else PickForm OPCAO_FORM_ESCOLHA
               EndIf
               SetaPosForm()
             EndWhile
             QuitLoop
        Case Retval="ESC":
             CHAVEC=9
             Del
             Return             
        Case Retval="ENTER": 
             If Numero_Lancamento("","F")
                Then LANCTO = PROXLANCTO_NLANC
                     Release Vars PROXLANCTO_NLANC  
                Else QuitLoop
             EndIf
             PickForm "2"    
             Moveto [Numero do Lancamento]
             If PROXIMO_LANCTO_REG_ACHOU
                Then CHAVEC=0
                     If Checa_Controle([Numero_Controle_Dia])
                        Then Return
                     EndIf
                Else CHAVEC=1
                     OPCAO_FORM=OPCAO_FORM_ESCOLHA
                     Mensagem("N„o ‚ poss¡vel criar solicita‡„o!")         
             EndIf         
             If CHAVEC=1
                Then Del
             EndIf
             If OPCAO_FORM_ESCOLHA="F" Or OPCAO_FORM_ESCOLHA="1"
                Then PickForm OPCAO_FORM_ESCOLHA
             EndIf
             QuitLoop
        EndSwitch
  EndWhile
EndWhile
EndProc   ; (ChaveC)  
                               
;*******************************************************************************
;* Rotina para Digitacao da Cabeca                                             *
;*******************************************************************************
Proc DIGITAC()

Moveto "Rqtrf"
GetRecord "\\Sistemas\\Estoque\\Itens" [Codigo do Item] To REG_ITEM 
If RetVal
   Then LOCALIZACAO_ITEM = REG_ITEM["Localizacao"]
   Else LOCALIZACAO_ITEM = ""
EndIf
Release Vars REG_ITEM

if [Status]<>""
   then FastMSg("Solicita‡Æo [ "+[Status]+" ] !")
endif   

If [Tipo de Movimento]="D" Or 
   [Tipo de Movimento]="N" Or 
   [Tipo de Movimento]="X" Or 
   [Status]<>""
   Then Moveto [Flag]
   Else Moveto [QuantidadeTrf]
EndIf

While True
  TECLA=" Esc=Retornar  "
  If CHAVEC=0
     Then TECLA=TECLA+"Del=Excluir  "
     Else TECLA=TECLA+"             "
  EndIf
  If [Tipo de Movimento]="T" or [Tipo de Movimento]="A" or [Tipo de Movimento]="D"
     Then TECLA=TECLA+"Alt+F=Fun‡”es  PgDn=Finalizar/Sair  "
     Else TECLA=TECLA+"               PgDn=Finalizar/Sair  "
  EndIf
   
  Prompt TECLA

  MSGCAMPO=Field()
  Switch
    Case Field()="QuantidadeTrf"             : MSGCAMPO="Quantidade a confirmar na opera‡Æo !"
    Case Field()="Flag"                      : MSGCAMPO="Pausa para conferir dados !" 
  EndSwitch
                                
  Wait Field
   Until "F1","ESC","ENTER","DEL","FIELDVIEW","F35","PGDN","F3","F4","F7","F9",-33
 
  If RetVal=-33 and [Status]=""
     Then 
          switch
            case [Tipo de Movimento]="D":
              Echo Normal
              Echo Off
              ShowPopup " Fun‡”es " CENTERED
                "[F3] ~C~ancelar Solicita‡„o"   : " Cancela a Solicita‡„o                        " : "F3",
                "[F7] ~D~evolu‡„o Requisi‡„o"   : " Devolve o Produto para a empresa de destino  " : "F7",
                Separator,
                "~S~air"                        : " Ignorar Op‡äes"                :"CANCELAR"
              EndMenu
              To MenuVar
              Echo Off
              If MenuVar="CANCELAR" or MenuVar="Esc"
                 Then Loop
              EndIf
              RetVal=MenuVar
            
            case [Tipo de Movimento]="A":
              Echo Normal
              Echo Off
              ShowPopup " Fun‡”es " CENTERED
                "[F3] ~C~ancelar Solicita‡„o"   : " Cancela a Solicita‡„o                        " : "F3",
                "[F9] ~T~ransferir o Produto"   : " Transferir o Produto para a empresa informada" : "F9",
                Separator,
                "~S~air"                        : " Ignorar Op‡äes"                :"CANCELAR"
              EndMenu
              To MenuVar
              Echo Off
              If MenuVar="CANCELAR" or MenuVar="Esc"
                 Then Loop
              EndIf
              RetVal=MenuVar
            
            case [Tipo de Movimento]="T":
              Echo Normal
              Echo Off
              ShowPopup " Fun‡”es " CENTERED
                 "[F3] ~C~ancelar Solicita‡„o"   : " Cancela a Solicita‡„o                        " : "F3",
                 "[F4] ~E~stoque Insuficiente"   : " Estoque Insuficiente do Produto              " : "F4",
                 "[F9] ~T~ransferir o Produto"   : " Transferir o Produto para a empresa informada" : "F9",
                 Separator,
                 "~S~air"                        : " Ignorar Op‡äes"                :"CANCELAR"
              EndMenu
              To MenuVar
              Echo Off
              If MenuVar="CANCELAR" or MenuVar="Esc"
                 Then Loop
              EndIf
              RetVal=MenuVar
                           
          endswitch
   EndIf

   Switch
      Case Retval="FIELDVIEW" or Retval="F35":
           EDITFIELD()     
      Case RetVal="F1":
           If Field()="Codigo da EmpresaTrf"
              Then CONSULTAF1()
           EndIf
           
      Case RetVal="F3" : ;CANCELAR
           Switch
             Case [Status]<>""             : FastMsg("Opera‡Æo nÆo permitida, j  "+[Status])      Loop
           
          ;;;Case [Tipo de Movimento]="D"  : FastMsg("Opera‡Æo nÆo permitida, Devolu‡„o!")        Loop
             Case [Tipo de Movimento]="N"  : FastMsg("Opera‡Æo nÆo permitida, Notifica‡„o!")      Loop
             Case [Tipo de Movimento]="X"  : FastMsg("Opera‡Æo nÆo permitida, Caixa!")            Loop
           EndSwitch
                   
           MSG = "Deseja cancelar esta solicita‡„o ?"
           ConfGeral(MSG)
           If Ok="S"
              Then CampoAnt=Field()
                   While True
                     Edita_Memo("Justificativa",08,01,15,76,"Justificativa")
                     If RetVal
                        Then If [Justificativa]=""
                                Then MSG = "Informe uma justificativa para cancelar esta solicita‡„o!"
                                     Mensagem(MSG) 
                                Else [Status]="CANCELADO"

                                     if [Tipo de Movimento]="D"
                                        then Controle_Dia_Rqtrf("DEVOLUCAO")   
                                        else Controle_Dia_Rqtrf("TRANSFERENCIA")
                                     endif      

                                     CHAVEC=9
                                     Return
                             EndIf
                        Else QuitLoop        
                     EndIf
                   EndWhile
                   Moveto Field CampoAnt
           EndIf  
           
      Case RetVal="F4" : ;ESTOQUE INSUFICIENTE
           Switch
             Case [Status]<>""             : FastMsg("Opera‡Æo nÆo permitida, j  "+[Status])      Loop
           
             Case [Tipo de Movimento]="A"  : FastMsg("Opera‡Æo nÆo permitida, Avaria!")           Loop
             Case [Tipo de Movimento]="D"  : FastMsg("Opera‡Æo nÆo permitida, Devolu‡„o!")        Loop
             Case [Tipo de Movimento]="N"  : FastMsg("Opera‡Æo nÆo permitida, Notifica‡„o!")      Loop
             Case [Tipo de Movimento]="X"  : FastMsg("Opera‡Æo nÆo permitida, Caixa!")            Loop
           EndSwitch
              
           MSG = "Deseja informar que este produto esta com estoque insuficiente ?"
           ConfGeral(MSG)
           If Ok="S"
              Then CampoAnt=Field()
                   While True
                     Edita_Memo("Justificativa",08,01,15,76,"Justificativa")
                     If RetVal
                        Then If [Justificativa]=""
                                Then MSG = "Informe uma justificativa para o produto insuficiente!"
                                     Mensagem(MSG) 
                                Else [Status]="INSUFICIENTE"
                                     Controle_Dia_Rqtrf("TRANSFERENCIA")
                                     CHAVEC=9
                                     Return
                             EndIf
                        Else QuitLoop        
                     EndIf
                   EndWhile
                   Moveto Field CampoAnt
           EndIf  
           
      Case RetVal="F7" : ; DEVOLUCAO     
           Switch
             Case [Status]<>""             : FastMsg("Opera‡Æo nÆo permitida, j  "+[Status])      Loop

             Case [Tipo de Movimento]="A"  : FastMsg("Opera‡Æo nÆo permitida, Avaria!")           Loop
             Case [Tipo de Movimento]="N"  : FastMsg("Opera‡Æo nÆo permitida, Notifica‡„o!")      Loop
             Case [Tipo de Movimento]="X"  : FastMsg("Opera‡Æo nÆo permitida, Caixa!")            Loop
             Case [Tipo de Movimento]="T"  : FastMsg("Opera‡Æo nÆo permitida, Transferˆncia!")    Loop
             
           EndSwitch

           MSG = "Deseja realizar a requisi‡„o de devolu‡„o do item "+[Codigo do Item]+"?"
           ConfGeral(MSG)
           If Ok="S"
              Then ;---- Devolu‡äes Realizadas pela Consulta -------------------
                   If [Tipo de Movimento]="D"
                      Then Controle_Dia_Rqtrf("DEVOLUCAO")
                           If REQUISICAO("DEVOLUCAO_CONSULTA")
                              Then [Status]="DEVOLVIDO"
                                   CHAVEC=9
                                   Return
                           EndIf             
                   EndIf
                   ;---- Devolu‡äes Realizadas pela Requsi‡Æo de Mercadoria ----
                   JUSTIFICATIVA   = [Justificativa]
                   [Justificativa] = ""
                   CampoAnt=Field()
                   While True
                     Edita_Memo("Justificativa",08,01,15,76,"Justificativa")
                     If RetVal
                        Then If [Justificativa]=""
                                Then MSG = "Informe uma justificativa para continuar com o processo de devolu‡„o!"
                                     Mensagem(MSG) 
                                Else Controle_Dia_Rqtrf("DEVOLUCAO")
                                     If REQUISICAO("DEVOLUCAO")
                                        Then [Status]="DEVOLVIDO"
                                              If JUSTIFICATIVA <> ""
                                                 Then If [Justificativa] <> ""
                                                         Then [Justificativa] = JUSTIFICATIVA + "\n" + [Justificativa]
                                                         Else [Justificativa] = JUSTIFICATIVA
                                                      EndIf    
                                              EndIf
                                              CHAVEC=9
                                              Return
                                         Else QuitLoop
                                     EndIf   
                                     Release Vars NUMDOC,CODEMP,DATA,NOMDEST,MSG_REQUISICAO,NUMEROL_ORIGEM,NUMEROL,
                                                  COD_DESTINO,ACHOU_REQ,COD_EMP,NOME_EMPRESA,CODIGO_ITEM,QTD_ITEM,
                                                  MES_EST,ANO_EST,WS_TITEM,WS_DITEM,WS_UNI,SEQ_ITEM,SEQ,QTDTOT,TPOP,TPMOV
                             EndIf
                        Else QuitLoop        
                     EndIf
                   EndWhile
                   If JUSTIFICATIVA <> ""
                      Then If [Justificativa] <> ""
                              Then [Justificativa] = JUSTIFICATIVA + "\n" + [Justificativa]
                              Else [Justificativa] = JUSTIFICATIVA
                           EndIf    
                   EndIf
                   Moveto Field CampoAnt
           EndIf             
           
      Case RetVal="F9" : ;TRANSFERIR
           Switch
             Case [Status]<>""             : FastMsg("Opera‡Æo nÆo permitida, j  "+[Status])      Loop
           
             Case [Tipo de Movimento]="D"  : FastMsg("Opera‡Æo nÆo permitida, Devolu‡„o!")        Loop
             Case [Tipo de Movimento]="N"  : FastMsg("Opera‡Æo nÆo permitida, Notifica‡„o!")      Loop
             Case [Tipo de Movimento]="X"  : FastMsg("Opera‡Æo nÆo permitida, Caixa!")            Loop

             Case [QuantidadeTrf]=0 Or 
                  [QuantidadeTrf]=BlankNum()
                                          : 
               Mensagem("N„o h  quantidade a ser transferida para a empresa "+[Codigo da EmpresaTrf]) Loop

             OtherWise                    :
               If Not Transferir_Quantidade() Then Loop EndIf 

           EndSwitch
           CHAVEC=9
           Return

      Case RetVal="PGDN":
           Switch
             Case [Tipo de Movimento]="N"    Or
                  [Tipo de Movimento]="X"    Or
                  [Tipo de Movimento]="D"    Or           
                  [Status]<>""                : CHAVEC=9
                                                QuitLoop
                                                
             Case [QuantidadeTrf]=0 Or 
                  [QuantidadeTrf]=BlankNum()  :
                   
               Mensagem("N„o h  quantidade a ser transferida para a empresa "+[Codigo da EmpresaTrf]) Loop
             
             Otherwise                        :
               If Not Transferir_Quantidade() Then Loop EndIf
                
           EndSwitch
           CHAVEC=9
           Return

      Case Retval="ESC":
           Switch
           Case Field()="QuantidadeTrf": 
                If QuerDesfazer("")
                   Then undo
                        CHAVEC=9
                        QuitLoop
                EndIf
           Case Field()="Flag" : []=""
                                 Switch
                                   Case [Tipo de Movimento]= "N" Or
                                        [Tipo de Movimento]= "X" Or
                                        [Tipo de Movimento]= "D" Or
                                        [Status]<>""              : CHAVEC=9
                                                                    QuitLoop
                                   Otherwise                      : Moveto [QuantidadeTrf]
                                 EndSwitch   
           OtherWise:
                Left
           EndSwitch

      Case Retval="ENTER": 
           If IsBlank([])
              Then If Field()="QuantidadeTrf"     
                      Then Loop
                   EndIf
           EndIf

           Switch
             Case Field()="QuantidadeTrf" :  
                  If []>0              
                     Then Moveto [Flag] 
                  EndIf
            
             Case Field()="Flag"  : []=""
                                    
                                    if [Status]=""                                          and
                                       ([Tipo de Movimento]="A" Or [Tipo de Movimento]="T") and  
                                       Not Transferir_Quantidade() 
                                       then Loop
                                    endif   
                                      
                                    CHAVEC=9
                                    Return
           EndSwitch
                  
      EndSwitch
EndWhile

EndProc  ;DIGITAC()

;*******************************************************************************
;* Rotina p/ Transferir Dados                                                  *
;*******************************************************************************
Proc Transferir_Quantidade()
      
if [Status]<>""                                          or
   ([Tipo de Movimento]<>"A" And [Tipo de Movimento]<>"T")
   then return false
endif
      
Switch
  Case [Quantidade]  > [QuantidadeTrf] : AUX_MSG = Completa("Quantidade a transferir ‚ MENOR que a quantidade pedida.",65," ")+"//"
  Case [Quantidade]  < [QuantidadeTrf] : AUX_MSG = Completa("Quantidade a transferir ‚ MAIOR que a quantidade pedida.",65," ")+"//"
  OtherWise                            : AUX_MSG = ""
EndSwitch    

COR_MENSAGEM="ALERTA"
MSG = AUX_MSG + "Deseja continuar a transferir esta quantidade para a empresa "+[Codigo da EmpresaTrf]+"?"
ConfGeral(MSG)
If Ok = "S"
  Then Controle_Dia_Rqtrf("TRANSFERENCIA")
  
       If REQUISICAO("TRANSFERENCIA")
          Then If AUX_MSG<>""
                  Then While True
                         Edita_Memo("Justificativa",08,01,15,76,"Justificativa")
                         If RetVal
                            Then If [Justificativa]=""
                                    Then Mensagem(Completa("Informe uma justificativa para continuar com a transferˆncia  do",64," ")+"//"+
                                                  Completa("produto que est  com a quantidade pedida diferente da quantidade",64," ")+"//"+
                                                  Completa("a ser transferida!",64," "))
                                    Else [Status]="TRANSFERIDO"
                                          Mensagem("Processo TRANSFERIDO!")
                                          QuitLoop
                                 EndIf
                            Else QuitLoop
                         EndIf
                       EndWhile
                  Else [Status]="TRANSFERIDO"
                       Mensagem("Processo TRANSFERIDO!")
               EndIf   
       EndIf
       Release Vars NUMDOC,CODEMP,DATA,NOMDEST,MSG_REQUISICAO,NUMEROL_ORIGEM,
                    NUMEROL,COD_DESTINO,ACHOU_REQ,COD_EMP,NOME_EMPRESA,CODIGO_ITEM,QTD_ITEM,MES_EST,ANO_EST,
                    WS_TITEM,WS_DITEM,WS_UNI,SEQ_ITEM,SEQ,QTDTOT,TPOP,TPMOV
EndIf       

Return True
EndProc ;Transferir_Quantidade()

;*******************************************************************************
;* Controle de Dia                                                            *
;*******************************************************************************
Proc Controle_Dia_Rqtrf(PARAM)
Private PARAM

If Not IsAssigned(SYS_CHAPA_USUARIO)    Then SYS_CHAPA_USUARIO=""     EndIf
If Not IsAssigned(SYS_CONTROLE_DIA)     Then SYS_CONTROLE_DIA=""      EndIf
If Not IsAssigned(SYS_CONTROLE_DIA_MOD) Then SYS_CONTROLE_DIA_MOD=""  EndIf

If SYS_CONTROLE_DIA_MOD <> ""
   Then Switch
          Case PARAM = "TRANSFERENCIA" :
               [Codigo_UsuarioTrf     ] = SYS_CHAPA_USUARIO
               [Data_Trf              ] = Today()
               [Hora_Trf              ] = Time()
               [Numero_Controle_DiaTrf] = SYS_CONTROLE_DIA_MOD
          Case PARAM = "DEVOLUCAO" :
               [Codigo_Usuario_Devolucao ] = SYS_CHAPA_USUARIO
               [Data_Devolucao           ] = Today()
               [Hora_Devolucao           ] = Time()
               [Numero_Controle_Devolucao] = SYS_CONTROLE_DIA_MOD
        EndSwitch
   Else Switch
          Case PARAM = "TRANSFERENCIA" :        
               [Codigo_UsuarioTrf     ] = SYS_CHAPA_USUARIO
               [Data_Trf              ] = Today()
               [Hora_Trf              ] = Time()
               [Numero_Controle_DiaTrf] = SYS_CONTROLE_DIA
          Case PARAM = "DEVOLUCAO" :
               [Codigo_Usuario_Devolucao ] = SYS_CHAPA_USUARIO
               [Data_Devolucao           ] = Today()
               [Hora_Devolucao           ] = Time()
               [Numero_Controle_Devolucao] = SYS_CONTROLE_DIA
        EndSwitch       
EndIf

EndProc ;Controle_Dia_Rqtrf()   

;*******************************************************************************
;* Atualizacao Requisicao                                                      *
;*******************************************************************************
Proc REQUISICAO(PARAM)
Private PARAM

TIPO_REQUISICAO = PARAM
 
If PARAM = "DEVOLUCAO" Or PARAM = "DEVOLUCAO_CONSULTA"
   Then NUMDOC = AlinhM(StrVal(Day([Rqtrf->Data_Devolucao])),2)+AlinhM(StrVal(Month([Rqtrf->Data_Devolucao])),2)+
                 AlinhM(StrVal(Year([Rqtrf->Data_Devolucao])),4)
   Else NUMDOC = AlinhM(StrVal(Day([Rqtrf->Data_Trf])),2)+AlinhM(StrVal(Month([Rqtrf->Data_Trf])),2)+
                 AlinhM(StrVal(Year([Rqtrf->Data_Trf])),4)
EndIf

If PARAM = "DEVOLUCAO" Or PARAM = "DEVOLUCAO_CONSULTA"
   Then If Not IsBlank([Rqtrf->Lancamento Rq_Rqtrf_Devol])
           Then Mensagem("Requisi‡„o de devolu‡„o j  realizada!")
                Return False
        EndIf
        If [Tipo de Movimento]<>"D" And IsBlank([Rqtrf->Lancamento RqCabeca_Rqtrf])
           Then Mensagem("N„o h  uma requisi‡„o neste la‡amento para realizar a devolu‡„o!")
                Return False
        EndIf       
EndIf

;---- Verifica existˆncia da Requisi‡Æo ----------------------------------------
If [Tipo de Movimento]<>"D"
   Then NUMEROL_ORIGEM = [Rqtrf->Lancamento RqCabeca_Rqtrf]
   Else NUMEROL_ORIGEM = ""   
EndIf   
If NUMEROL_ORIGEM<>""
   Then GetRecord "\\Sistemas\\Estoque\\RqCabeca" NUMEROL_ORIGEM To REG_RQCABECA
        If Not Retval
           Then MSG_REQUISICAO=Completa("Requisi‡„o de Estoque N. "+NUMEROL_ORIGEM+" n„o localizada !",58," ")+"////"
                If PARAM = "DEVOLUCAO" Or PARAM = "DEVOLUCAO_CONSULTA"
                   Then MSG_REQUISICAO=MSG_REQUISICAO+Completa("Este lan‡amento n„o ocorrer  devolu‡„o!",58," ")+"////"
                   Else MSG_REQUISICAO=MSG_REQUISICAO+Completa("Este lan‡amento n„o ser  corrigido no Estoque !",58," ")+"////"
                EndIf
                MSG_REQUISICAO=MSG_REQUISICAO+Completa("Motivos:",58," ")+"//"
                MSG_REQUISICAO=MSG_REQUISICAO+Completa(" - Fechamento Mensal do Estoque efetuado;",58," ")+"//"
                MSG_REQUISICAO=MSG_REQUISICAO+Completa(" - Empresa da requisi‡„o n„o corresponde;",58," ")+"//"
                MSG_REQUISICAO=MSG_REQUISICAO+Completa(" - Algum erro ocorrido no momento deste Lan‡amento.",58," ")
                Mensagem(MSG_REQUISICAO)
                Return False
        EndIf        
EndIf
      
If PARAM = "DEVOLUCAO"  
   Then Aguarde("Gerando requisi‡„o de devolu‡„o no estoque")
        CODEMP   = [Rqtrf->Codigo da EmpresaTrf] 
        DATA     = [Rqtrf->Data_Devolucao]
        If [Tipo de Movimento]="A"
           Then NOMDEST  = "RM - DEVOL AVARIA"
           Else NOMDEST  = "RM - DEVOLUCAO REQ" 
        EndIf   
   Else Aguarde("Gerando requisi‡„o no estoque")   
        CODEMP   = [Rqtrf->Codigo da Empresa]
        If PARAM = "DEVOLUCAO_CONSULTA"
           Then DATA    = [Rqtrf->Data_Devolucao]
                If [Tipo de Movimento]="A"
                   Then NOMDEST  = "RM - DEVOL AVARIA"
                   Else NOMDEST  = "RM - DEVOLUCAO REQ"
                EndIf
           Else DATA    = [Rqtrf->Data_Trf]
                If [Tipo de Movimento]="A"
                   Then NOMDEST = "RM - AVARIA"
                   Else NOMDEST = "RM - REQUISICAO" 
                EndIf
        EndIf      
EndIf 

Moveto "Rqtrf"
UnLockRecord 
FormKey

Moveto "\\Sistemas\\Estoque\\Requisit"
Moveto [Descricao Requisitante]
Locate NOMDEST
If RetVal
   Then COD_DESTINO = [Codigo do Requisitante]
   Else COD_DESTINO = ""  
EndIf  

ACHOU_REQ = False
NUMEROL = ""
Moveto "\\Sistemas\\Estoque\\RQCabeca"
Moveto [Numero do Documento]
Locate NUMDOC
If RetVal
   Then While True
          If [Sistema Gerador       ] = "RM"    And 
             [Codigo da empresa     ] = CODEMP  And
             [Data de Ocorrencia    ] = DATA    And   
             [Descricao Requisitante] = NOMDEST 
             Then ACHOU_REQ = True
                  NUMEROL = [Numero do Lancamento]
                  QuitLoop
          EndIf
          Skip
          If Eot() Then QuitLoop EndIf
          Locate Next NUMDOC
          If Not RetVal
             Then QuitLoop
          EndIf     
        EndWhile
EndIf  
Release Vars CODEMP,DATA
        
Moveto "\\Sistemas\\Estoque\\RQCabeca"
Moveto [Numero do Lancamento]
If NUMEROL = ""
   Then While True
          End
          If Numero_Lancamento("Interno","")
             Then NUMEROL = PROXLANCTO_NLANC
                  Release Vars PROXLANCTO_NLANC 
          EndIf
          Down
          [Numero do Lancamento]=NUMEROL
          If Not IsLockRecord()
             Then QuitLoop
             Else Del
          EndIf
        EndWhile
   Else For i From 1 To 10
          Aguarde("Bloqueando registro: "+NUMEROL+" -> "+StrVal(i)+" de 10")
          If Not IsLockRecord()
             Then QuitLoop
          EndIf
        EndFor     
EndIf     
Aguarde("Gerando requisi‡„o no estoque")
                                                                  
If Not ACHOU_REQ        
   Then Moveto "Rqtrf"
        [Lancamento RqCabeca_Rqtrf]="" 
   
        If PARAM = "DEVOLUCAO" 
           Then COD_EMP = [Rqtrf->Codigo da Empresa]
           Else COD_EMP = [Rqtrf->Codigo da EmpresaTrf]
        EndIf 
           
        GetRecord "\\Sistemas\\Cadastro\\Empresas" COD_EMP To REG_EMPTRF
        If RetVal
           Then NOME_EMPRESA = REG_EMPTRF["Nome Fantasia Empresa"]
           Else NOME_EMPRESA = ""
        EndIf   
        
        ;---- Cabe‡a -----------------------------------------------------------
        Moveto "\\Sistemas\\Estoque\\RqCabeca"
        If PARAM = "DEVOLUCAO"  
           Then [Codigo da Empresa ]=[Rqtrf->Codigo da EmpresaTrf]
                [Data de Ocorrencia]=[Rqtrf->Data_Devolucao]
           Else [Codigo da Empresa ]=[Rqtrf->Codigo da Empresa]
                If PARAM = "DEVOLUCAO_CONSULTA"
                   Then [Data de Ocorrencia]=[Rqtrf->Data_Devolucao] 
                   Else [Data de Ocorrencia]=[Rqtrf->Data_Trf]
                EndIf
        EndIf          
        [Tipo de Movimento     ]="S"
        [Descricao do Movimento]="SAIDA"
        [Tipo de Operacao      ]="T"
        [Descricao da Operacao ]="TRANSFERENCIA"
        [Codigo do Documento   ]="REQ"   
        [Numero do Documento   ]=NUMDOC
        [Requisitante          ]=COD_DESTINO
        [Descricao Requisitante]=NOMDEST
        [Numero do Corte       ]=""
        [Sistema Gerador       ]="RM"
        [Lancamento Gerador    ]=""
        [Codigo                ]=COD_EMP
        [Nome Fantasia EmitDest]=NOME_EMPRESA
        Controle_Dia()
        SaveTables
EndIf

;---- Itens --------------------------------------------------------------------
Aguarde("Aguarde, inserindo item na requisi‡ao ")
  
SEQ         = 0
QTDTOT      = 0
MES_EST     = AlinhM(StrVal(Month([RqCabeca->Data de Ocorrencia])),2)
ANO_EST     = StrVal(Year([RqCabeca->Data de Ocorrencia]))
CODIGO_ITEM = [Rqtrf->Codigo do Item]
QTD_ITEM    = [Rqtrf->QuantidadeTrf]
SEQ_ITEM    = 0                              ;Posi‡Æo do Item no Lan‡amento se Localizado
QTDTOT      = QTD_ITEM                       ;Totalizador do RqCabe‡a

Moveto "\\Sistemas\\Estoque\\RqItem"
Moveto [Numero do Lancamento]
Locate NUMEROL
If RetVal
   Then While NUMEROL = [Numero do Lancamento]
          If [Codigo do Item] = CODIGO_ITEM
             Then SEQ_ITEM = [Sequencia do Lancamento] 
          EndIf
          QTDTOT = QTDTOT + [Quantidade] 
          SEQ    = [Sequencia do Lancamento]
          Skip
          If Eot() Then QuitLoop EndIf
        EndWhile 
EndIf       

GetRecord "\\Sistemas\\Estoque\\Itens" CODIGO_ITEM To REG_ITEM 
If RetVal
   Then WS_TITEM = REG_ITEM["Tipo do Item"]
        WS_DITEM = REG_ITEM["Descricao do Item"]
        WS_UNI   = REG_ITEM["Unidade Interna"]
   Else WS_TITEM = ""
        WS_DITEM = ""
        WS_UNI   = ""
EndIf

If SEQ_ITEM <> 0
   Then ;---- Apenas p/ RQTRF que pode ter v rios itens lan‡ados no mesmo dia -----
        Moveto "\\Sistemas\\Estoque\\RqItem"
        Moveto [Numero do Lancamento]
        Locate NUMEROL,SEQ_ITEM
        If Not Retval
           Then Mensagem("Item da sequencia "+StrVal(SEQ_ITEM)+" n„o localizado na requisi‡„o "+NUMEROL+"!")
                Moveto "Rqtrf"
                FormKey
                Return False                
           Else [Quantidade] = [Quantidade] + QTD_ITEM     
        EndIf   
   Else Moveto "\\Sistemas\\Estoque\\RqItem"
        SEQ      = SEQ + 1
        SEQ_ITEM = SEQ
        End Down
        [Numero do Lancamento       ]=NUMEROL
        [Sequencia do Lancamento    ]=SEQ
        If PARAM = "DEVOLUCAO"
           Then [Codigo da Empresa  ]=[Rqtrf->Codigo da Empresa]
           Else [Codigo da Empresa  ]=[Rqtrf->Codigo da EmpresaTrf]
        EndIf
        [Tipo do Item               ]=WS_TITEM
        [Codigo do Item             ]=CODIGO_ITEM
        [Descricao do Item          ]=WS_DITEM
        [Unidade Interna            ]=WS_UNI
        [Quantidade                 ]=QTD_ITEM
        SaveTables
EndIf      
UnLockrecord

Moveto "\\Sistemas\\Estoque\\RqItem"
Moveto [Numero do Lancamento]
Locate NUMEROL, SEQ_ITEM
ESTOQUE()

Moveto "\\Sistemas\\Estoque\\RqItem"
[Custo Unitario             ]=CUSTOMEDIO
[Custo Total                ]=NDecimal([Quantidade]*CUSTOMEDIO,2)
UnLockrecord
    
;---- Complementos da Cabe‡a ---------------------------------------------------
Moveto "\\Sistemas\\Estoque\\RqCabeca"
Moveto [Numero do Lancamento]
Locate NUMEROL
If RetVal 
   Then [Quantidade Total      ]=QTDTOT
        UnLockRecord
EndIf
Release Vars REG_ITEM

Moveto "Rqtrf"
If PARAM = "DEVOLUCAO" Or PARAM = "DEVOLUCAO_CONSULTA"
   Then [Lancamento Rq_Rqtrf_Devol]=NUMEROL 
   Else [Lancamento RQCabeca_Rqtrf]=NUMEROL
EndIf        
SaveTables                  
UnLockRecord
FormKey

LimpAguarde()

Return True

EndProc ;REQUISICAO()

;*******************************************************************************
;* Rotina para Criar Ficha do Estoque e Parametros                             *
;*******************************************************************************
Proc CRIA_FICHA(ESTQ_EMPRESA,ESTQ_ITEM,ESTQ_CONFIRMA)
Private ESTQ_EMPRESA,ESTQ_ITEM,ESTQ_CONFIRMA,ESTQ_ANO,ESTQ_MES,i

ESTQ_MES=ALINHM(StrVal(Month([RqCabeca->Data de Ocorrencia])),2)
ESTQ_ANO=ALINHM(StrVal(Year([RqCabeca->Data de Ocorrencia])),4)

MSG="N„o foi encontrada a ficha de estoque referente a "+ESTQ_MES+"/"+ESTQ_ANO+" !// //"
MSG=MSG+Format("W08,AL","Empresa")   +"| "+Format("W11,AL","Item")   +"//"
MSG=MSG+Format("W08,AL",ESTQ_EMPRESA)+"| "+Format("W11,AL",ESTQ_ITEM)+"//"
MSG=MSG+"Observacoes:                                                           //"
MSG=MSG+"1. Talvez n„o foi executada a transferˆncia de saldos do mˆs anterior; //"
If ESTQ_CONFIRMA
   Then MSG=MSG+"2. Se for criada agora o saldo inicial deste item ser  igual a 0.      //"
        MSG=MSG+"// "
        MSG=MSG+"Deseja cria-la agora ?"
        ConfGeral(MSG)
        If OK="N"
           Then Return False
        EndIf
   Else MSG=MSG+"2. A ficha do item ser  criada com o saldo inicial igual a 0.          //"
        Mensagem(MSG)
EndIf

Moveto "\\Sistemas\\Estoque\\EstqPrm"
While True
  Moveto [Codigo da Empresa]
  Locate ESTQ_EMPRESA, ESTQ_ITEM
  If Not RetVal
     Then End Down
          [Codigo da Empresa   ]=ESTQ_EMPRESA
          [Codigo do Item      ]=ESTQ_ITEM
          If IsLockRecord()
             Then Del
             Else UnLockRecord
          EndIf
          Loop
  EndIf                 
  QuitLoop
EndWhile

Moveto "\\Sistemas\\Estoque\\SdEstq"
While True
  Moveto [Codigo da Empresa]
  Locate ESTQ_EMPRESA, ESTQ_ITEM, ESTQ_ANO, ESTQ_MES
  If Not RetVal
     Then End Down
          [Codigo da Empresa   ]=ESTQ_EMPRESA
          [Codigo do Item      ]=ESTQ_ITEM
          [Ano Referencia      ]=ESTQ_ANO
          [Mes Referencia      ]=ESTQ_MES
          If IsLockRecord()
             Then Del
             Else UnLockRecord
          EndIf
          Loop
  EndIf
  QuitLoop
EndWhile

Return True

EndProc  ;

;*******************************************************************************
;* Entrada e Saida de Estoque                                                  *
;*******************************************************************************
Proc ESTOQUE()
Private wi

If WS_TITEM="C" Or WS_TITEM="D" Or WS_TITEM="G" Or
   WS_TITEM="H" Or WS_TITEM="I"
   Then Return
EndIf

TPOP  = "T"
TPMOV = "S"

If TIPO_REQUISICAO = "DEVOLUCAO"
   Then COD_EMPRESA = [Rqtrf->Codigo da EmpresaTrf]
        DATA = [Rqtrf->Data_Devolucao]
        MES  = AlinhM(StrVal(Month([Rqtrf->Data_Devolucao])),2)
        ANO  = StrVal(Year([Rqtrf->Data_Devolucao]))
   Else COD_EMPRESA = [Rqtrf->Codigo da Empresa]
        If PARAM = "DEVOLUCAO_CONSULTA"
           Then DATA = [Rqtrf->Data_Devolucao]
                MES  = AlinhM(StrVal(Month([Rqtrf->Data_Devolucao])),2)
                ANO  = StrVal(Year([Rqtrf->Data_Devolucao]))
           Else DATA = [Rqtrf->Data_Trf]
                MES  = AlinhM(StrVal(Month([Rqtrf->Data_Trf])),2)
                ANO  = StrVal(Year([Rqtrf->Data_Trf]))
        EndIf
EndIf

For wi From 1 To 2
  Moveto "\\Sistemas\\Estoque\\SdEstq"
  Moveto [Codigo da Empresa]
  Locate COD_EMPRESA, CODIGO_ITEM, ANO, MES
  If Not RetVal
     Then CRIA_FICHA(COD_EMPRESA,CODIGO_ITEM,False)
  EndIf   
           
  While True
    If IsLockRecord()   
       Then Loop
    EndIf                     
  
    CUSTOMEDIO=[Custo Total Atual]/[Saldo Atual]
    If CUSTOMEDIO=0 Or IsBlank(CUSTOMEDIO)
       Then CUSTOMEDIO=[Ultimo Custo Atual]
    EndIf
  
    If TPMOV="E"
       Then [Saldo Atual      ]=NDecimal([Saldo Atual]+QTD_ITEM,3)
            [Custo Total Atual]=NDecimal([Custo Total Atual]+(QTD_ITEM*CUSTOMEDIO),2)
       Else [Saldo Atual      ]=NDecimal([Saldo Atual]-QTD_ITEM,3)
            [Custo Total Atual]=NDecimal([Custo Total Atual]-(QTD_ITEM*CUSTOMEDIO),2)
    EndIf
    UnLockRecord
    QuitLoop
  EndWhile

  If TPMOV="S"
     Then While True
            Moveto "\\Sistemas\\Estoque\\EstqPrm"
            Moveto [Codigo da Empresa]
            Locate COD_EMPRESA, CODIGO_ITEM
            If Not RetVal
               Then End Down
                    [Codigo da Empresa   ]=COD_EMPRESA
                    [Codigo do Item      ]=CODIGO_ITEM
                    If IsLockRecord()
                       Then Del
                       Else UnLockrecord
                    EndIf
                    Loop
            EndIf
            If IsLockRecord()
               Then Loop
            EndIf
            If DATA > [Data da Ultima Saida]
               Then [Data da Ultima Saida]=DATA
            EndIf
            UnLockRecord
            QuitLoop
          EndWhile       
  EndIf
  
  If TPOP = "T"
     Then If TIPO_REQUISICAO = "DEVOLUCAO"
             Then COD_EMPRESA = [Rqtrf->Codigo da Empresa]
             Else COD_EMPRESA = [Rqtrf->Codigo da EmpresaTrf]
          EndIf   
          If TPMOV="E"
             Then TPMOV="S"
             Else TPMOV="E"
          EndIf
     Else QuitLoop
  EndIf
EndFor

EndProc ;ESTOQUE()

;*******************************************************************************
;* Exclusao da Cabeca                                                          *
;*******************************************************************************
Proc EXCLUSAO_C()

Moveto "Rqtrf"
Del   

EndProc  ;EXCLUSAO_C()

;*******************************************************************************
;* Rotina para controlar Edicao do registro                                    *
;*******************************************************************************
Proc Controla_EdicaoC()

While FACA_DIGITAC
  MSGCAMPO = ""
  DIGITAC()
  If CHAVEC=9 Then QuitLoop EndIf
EndWhile

If RecordStatus("Locked") Then UnLockRecord EndIf
If OPCAO_FORM_ESCOLHA="F" Or OPCAO_FORM_ESCOLHA="1" Then PickForm OPCAO_FORM_ESCOLHA EndIf

EndProc ;Controla_EdicaoC()

;*******************************************************************************
;* Rotina p/ Abrir Tabelas                                                     *
;*******************************************************************************
Proc Abre_Tabelas()

OPCAO_FORM = OPCAO_FORM_ESCOLHA

View NOWINDOW "\\Sistemas\\Estoque\\Requisit"
View NOWINDOW "\\Sistemas\\Estoque\\RqCabeca"
View NOWINDOW "\\Sistemas\\Estoque\\Rqitem"
View NOWINDOW "\\Sistemas\\Estoque\\EstqPrm"
View NOWINDOW "\\Sistemas\\Estoque\\SdEstq"

CoEdit "Rqtrf"
PickForm OPCAO_FORM_ESCOLHA

EndProc ;Abre_Tabelas()

;*******************************************************************************
;* Rotina Principal                                                            *
;*******************************************************************************
AutoLib="\\Sistemas\\Cadastro\\Bibliot,\\Sistemas\\Cadastro\\Bib_Show"
If Not IsAssigned(SYS_CONTROLE_DIA)    Then SYS_CONTROLE_DIA=""    EndIf
SYS_VALOR()

Switch
  Case Upper(Substr(Directory(),1,1))="N" : ROTINA_LIBERADA = True
  Case SYS_CODIGO_CLIENTE="0294"          : ROTINA_LIBERADA = True
  OtherWise                               : ROTINA_LIBERADA = False
EndSwitch  

If Not ROTINA_LIBERADA
   Then Mensagem("Rotina indispon¡vel !//Verificar com o Suporte VISE !")
        Return
EndIf          

LeiaINI(PrivDir()+"RQTRF.INI","OPCAO_FORM_ESCOLHA.S.null")
If Not IsAssigned(OPCAO_FORM_ESCOLHA) Or OPCAO_FORM_ESCOLHA="" Or OPCAO_FORM_ESCOLHA="2"
   Then OPCAO_FORM_ESCOLHA="F"
EndIf   

Abre_Tabelas()

While True
  CHAVEC()
  If CHAVEC=9 Then QuitLoop EndIf
  If CHAVEC=5
     Then OPCAO_FORM_ESCOLHA = "2"
          PickForm "2"
          Loop
  EndIf
  Controla_EdicaoC()
EndWhile
Do_It!
ClearAll

Release Vars All
Release Procs All
