;** RqCabeca *******************************************************************
;*  Digitacao de Requisicao de Estoque \/ Verifica Estoque/Explosao Mat.Prima  *
;*******************************************************************************
;Autor           : Vise Informatica (VISERP)
;Desenvolvido em : 23/12/1994 por Anivel Augusto Rodrigues
;Ultima Alteracao: 23/05/2006 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Pegar Custo Medio como Valor Padrao !!
;Ultima Alteracao: 23/05/2007 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Controle Mouse
;Ultima Alteracao: 07/04/2008 por Anivel Augusto Rodrigues
;Motivo Alteracao: Inclusao Codigo de Barras
;Ultima Alteracao: 23/05/2008 por Anivel Augusto Rodrigues
;Motivo Alteracao: Inclusao Controla_Edicao
;Ultima Alteracao: 15/12/2008 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Outras Entradas Alterar Preco de Custo
;Ultima Alteracao: 24/12/2008 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Seta_Sequencia
;Ultima Alteracao: 12/01/2009 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Calculo Showdialog Preco Total
;Ultima Alteracao: 03/03/2010 por Anivel Augusto Rodrigues
;Motivo Alteracao: Inclusao Recalc_Consumo() Tricostura
;Ultima Alteracao: 22/03/2010 por Anivel Augusto Rodrigues
;Motivo Alteracao: AJustes usar ultimo custo atual no item
;Ultima Alteracao: 21/07/2010 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Cria_Ficha() sem msg nova ficha      
;Ultima Alteracao: 23/08/2010 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes INICIO_PAGINA EletroG   
;Ultima Alteracao: 08/11/2010 por Bruno Carvalho
;Motivo Alteracao: Ajuste Rotina C¢digo de Barra             
;Ultima Alteracao: 24/11/2010 por Anivel Augusto Rodrigues
;Motivo Alteracao: Inclusao CHECA_FORMULA()
;Ultima Alteracao: 03/01/2011 por Bruno Carvalho
;Motivo Alteracao: Ajustes Novo Layout de Teclas       
;Ultima Alteracao: 31/01/2011 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Atualizacao Preco de Custo >0
;Ultima Alteracao: 27/04/2011 por Bruno Carvalho
;Motivo Alteracao: Add rotina para verificar senha supervisor ao exlcluir
;Ultima Alteracao: 11/05/2011 por Bruno Carvalho
;Motivo Alteracao: Ajustes para exclusÆo de requisi‡äes
;Ultima Alteracao: 12/05/2011 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes novas fun‡äes para confec‡äes  
;Ultima Alteracao: 21/05/2011 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Paginar/Exclusao()  
;Ultima Alteracao: 23/05/2011 por Bruno Carvalho
;Motivo Alteracao: Ajustes C¢digo de Barras e altera‡Æo de tecla pra ativar CDBAR   
;Ultima Alteracao: 17/06/2011 por Karina Andrade
;Motivo Alteracao: Ajustes TECLAS
;Ultima Alteracao: 30/08/2011 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes CUSTO=0->CUSTO=[Ultimo Custo Total]
;Ultima Alteracao: 24/01/2012 por Bruno Carvalho
;Motivo Alteracao: Add ShowPopup "Movimento" e "Opera‡Æo", InclusÆo "Nome Fantasia 
;                  Empresa Trf" e excluido do form "Nome Fantasia"   
;Ultima Alteracao: 30/01/2012 por Karina Andrade
;Motivo Alteracao: Ajustes Pre‡o de Custo quando E/O acerto de custo, registro locado
;Ultima Alteracao: 27/02/2012 por Karina Andrade
;Motivo Alteracao: Ajustes CD_Barras SYS_CODIGO_CLIENTE="0304"
;Ultima Alteracao: 07/05/2012 por Bruno Carvalho
;Motivo Alteracao: Add Consulta "F5" na digita‡Æo dos itens
;Ultima Alteracao: 10/09/2012 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes CDBarras() nÆo usar imagecsum()
;Ultima Alteracao: 21/09/2012 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes CDBarras() totalizar itens e quantidades
;Ultima Alteracao: 26/09/2012 por Anivel Augusto Rodrigues                           
;Motivo Alteracao: Ajustes bloqueio de registro durante carrega_parametros()        

;*******************************************************************************
;* Rotina para Localizar Registro Cabeca                                       *
;*******************************************************************************
Proc CHAVEC()
CHAVEF=0
INICIO_PAGINA=True
While True
   Moveto [Numero do Lancamento]
   End
   LANCTO=[Numero do Lancamento]

   If OPCAO_FORM="F"
     Then Down
     Else PgDn
   EndIf
   Moveto [Numero do Lancamento]

   SetaCorRegistro("Editar")
   While True
      VCITENS=0

  TECLA=""
  AguardaTeclasPadrao()

    Switch
      Case RetVal=-33 : SemFuncoes()
      Case RetVal=-94 : MsgTeclasPadrao()
      Case RetVal="F3":
           If OPCAO_FORM="F"
              Then OPCAO_FORM="1"
              Else OPCAO_FORM="F"
           EndIf
           Del
           CHAVEC=5
           Return
      Case RetVal="F7" Or RetVal="UP" Or RetVal="PGUP" Or RetVal="HOME":
           Del
           While True
             VCITENS=0
             
             If OPCAO_FORM="F"
                Then PAGINA("RqCabeca","MR")
                Else PAGINA("RqCabeca","MT")
             EndIf 
             LANCTO=[Numero do Lancamento]
             Switch
               Case EDITAR="S":
                    PickForm "1"
                    Echo Normal
                    Echo Off
                    If Checa_Controle([Numero_Controle_Dia])
                       Then CHAVEC=0
                            Controla_EdicaoC()
                       Else UnLockRecord
                    EndIf
               Case EXCLUIR="S":
                    PickForm "1"
                    Echo Normal
                    Echo Off                   
                    If Checa_Controle([Numero_Controle_Dia])
                       Then If QuerExcluir("")
                               Then If Checa_Supervisor()
                                       Then EXCLUSAO("Cabeca")
                                    EndIf        
                            EndIf  
                       Else UnLockRecord           
                    EndIf      
               OtherWise: QuitLoop
             EndSwitch
             If OPCAO_FORM="1"
                Then PickForm "1"
                Else PickForm "F"
             EndIf
             SetaPosForm()
           EndWhile
           QuitLoop
      Case Retval="ESC":
           CHAVEC=9
           Del
           Return
      Case Retval="ENTER":
           If IsBlank([])
              Then If IsBlank(LANCTO)
                      Then LANCTO="1"
                      Else LANCTO=StrVal(NumVal(LANCTO)+1)
                   EndIf
                   []=LANCTO
           EndIf
           []=ALINH()
           LANCTO=[]
           Del
           PickForm "1"
           Locate LANCTO
           If Retval
              Then CHAVEC=0
              Else CHAVEC=1
                   End PgDn
                   Moveto [Numero do Lancamento]
                   []=LANCTO
           EndIf
           If Not IsLockRecord()
              Then Echo Normal
                   Echo Off
                   If (CHAVEC=1 And Checa_Controle(SYS_CONTROLE_DIA)) Or
                      (CHAVEC=0 And Checa_Controle([Numero_Controle_Dia]))
                      Then Return
                   EndIf
           EndIf
           If CHAVEC=1
              Then Del
           EndIf
           If OPCAO_FORM="F"
              Then PickForm "F"
           EndIf
           QuitLoop
      EndSwitch
   EndWhile
EndWhile
EndProc  ; (ChaveC)

;*******************************************************************************
;* Rotina para Digitacao da Cabeca                                             *
;*******************************************************************************
Proc DIGITAC()
If CHAVEC=1
   Then If Not IsBlank(SYS_EMPRESA_DEFAULT) And INICIO_PAGINA
           Then [Codigo da Empresa]=SYS_EMPRESA_DEFAULT
        EndIf
        Moveto [Codigo da Empresa]
        INICIO_PAGINA=False
   Else If Not IsBlank([Codigo da Empresa])
           Then If Not Carrega_Parametros()
                   Then If CHAVEC=1
                           Then Del
                        EndIf
                        CHAVEC=9
                        Return
                EndIf
        EndIf
        Moveto [Requisitante]
EndIf

While True

      TECLA=" Esc=Retornar  "

      If Field()="Codigo da Empresa"         Or
         Field()="Codigo da Empresa Destino" Or
         Field()="Codigo do Documento"       Or
         Field()="Requisitante"              Or
         Field()="Tipo de Movimento"         Or 
         Field()="Tipo de Operacao"
         Then TECLA=TECLA+"F1=Tabelas  "
      EndIf
      If CHAVEC=0
         Then TECLA=TECLA+"F8/=Itens  Del=Excluir  "
      EndIf

      Prompt TECLA
      SetaCorRegistro("Editando")
      Wait Field
           Until "F1","ESC","ENTER","F8","DEL","FIELDVIEW","F35","DOWN"

      Switch
      Case RetVal="F1":
           If Field()="Codigo da Empresa"         Or
              Field()="Codigo da Empresa Destino" Or
              Field()="Codigo do Documento"       Or
              Field()="Requisitante"
              Then CONSULTAF1()
           EndIf
           
           If Field()="Codigo da Empresa Destino"
              Then Ativa_Lookup()
                   Moveto [Codigo da Empresa]
                   Locate [RqCabeca->Codigo da Empresa Destino]
                   If RetVal
                      Then NOME_FANTASIA_EMP_DEST=[Nome Fantasia Empresa]
                   EndIf
                   KeyPress "Esc"
                   [Nome Fantasia Empresa Trf]=NOME_FANTASIA_EMP_DEST
           EndIf
           
           If Field()="Tipo de Movimento"
              Then Echo Normal
                   Echo Off
              
                   ShowPopup " Tipo de Movimento " @ 5,0
                     "~E~ntrada  " : " Requisi‡„o de Entrada " : "ENTRADA",
                     "~S~a¡da    " : " Requisi‡„o de Sa¡da   " : "SAIDA"
                   EndMenu
                   To OpcaoM

                   Echo off    

                   If OpcaoM<>"Esc" And OpcaoM<>"Cancelar"
                      Then [Tipo de Movimento     ]=SubStr(OpcaoM,1,1)
                           [Descricao do Movimento]=OpcaoM
                   EndIf
           EndIf    
           
           If Field()="Tipo de Operacao" And [Tipo de Movimento]<>"S"
              Then Echo Normal
                   Echo Off
              
                   ShowPopup " Tipo de Operacao " @ 5,16
                     "~D~evolu‡„o     " : " Devolu‡„o     " : "DEVOLUCAO",
                     "~T~ransferˆncia " : " Transferˆncia " : "TRANSFERENCIA",
                     "~P~rodu‡„o      " : " Produ‡„o      " : "PRODUCAO",  
                     "~O~utras        " : " Outras        " : "OUTRAS" 
                   EndMenu
                   To OpcaoO

                   Echo off    

                   If OpcaoO<>"Esc" And OpcaoO<>"Cancelar"
                      Then [Tipo de Operacao     ]=SubStr(OpcaoO,1,1)
                           [Descricao da Operacao]=OpcaoO
                   EndIf
           EndIf
           
           If Field()="Tipo de Operacao" And [Tipo de Movimento]<>"E"
              Then Echo Normal
                   Echo Off
              
                   ShowPopup " Tipo de Operacao " @ 5,16
                     "~C~onsumo       " : " Consumo       " : "CONSUMO",
                     "~D~evolu‡„o     " : " Devolu‡„o     " : "DEVOLUCAO",
                     "~T~ransferˆncia " : " Transferˆncia " : "TRANSFERENCIA",
                     "~O~utras        " : " Outras        " : "OUTRAS"
                   EndMenu
                   To OpcaoO

                   Echo off    

                   If OpcaoO<>"Esc" And OpcaoO<>"Cancelar"
                      Then [Tipo de Operacao     ]=SubStr(OpcaoO,1,1)
                           [Descricao da Operacao]=OpcaoO
                   EndIf
           EndIf              
   
      Case RetVal="F8" Or RetVal="DOWN":
           If CHAVEC=0
              Then CHAVEF=1
                   QuitLoop
           EndIf
      Case Retval="ESC":
           Switch
           Case Field()="Codigo da Empresa":
                If QuerDesfazer("")
                   Then Del
                        CHAVEC=9
                        QuitLoop
                EndIf
           Case Field()="Tipo de Movimento":
                Moveto [Codigo da Empresa  ]
           Case Field()="Tipo de Operacao":
                Moveto [Tipo de Movimento  ]
                
           Case Field()="Codigo da Empresa Destino":
                Moveto [Tipo de Operacao]
           Case Field()="Numero do Documento":
                Moveto [Codigo do Documento]
           Case Field()="Codigo do Documento":
                Moveto [Tipo de Operacao]     
           Case Field()="Requisitante":
                If CHAVEC=0
                   Then If QuerDesfazer("")
                           Then Undo
                                CHAVEC=9
                                QuitLoop
                        EndIf
                   Else Left
                EndIf
           Otherwise:
                Left
           EndSwitch
      Case Retval="FIELDVIEW" or Retval="F35":
           EDITFIELD()
      Case Retval="DEL":
           If CHAVEC=0
              Then If QuerExcluir("desta requisi‡„o")
                      Then If Checa_Supervisor()
                              Then EXCLUSAO("Cabeca")
                                   CHAVEC=9
                                   QuitLoop
                           EndIf        
                   EndIf
           EndIf
      Case Retval="ENTER":
           Switch
           Case Field()="Codigo da Empresa":
                If Not IsBlank([])
                   Then If Not Carrega_Parametros()
                           Then Loop
                        EndIf
                        Moveto [Tipo de Movimento]
                EndIf
           Case Field()="Tipo de Movimento":
                If [] <> "E" And [] <> "S"
                   Then FastMsg("Movimento inv lido !")
                        Loop
                EndIf
                Switch
                  Case []="E" : [Descricao do Movimento]="ENTRADA"
                  Case []="S" : [Descricao do Movimento]="SAIDA"
                EndSwitch  
                Moveto [Tipo de Operacao]
           Case Field()="Tipo de Operacao":
                If [Tipo de Movimento]="E"
                   Then If []<>"D" And 
                           []<>"O" And 
                           []<>"P" And
                           []<>"T" And 
                           []<>"M"
                           Then FastMsg("Opera‡Æo inv lida !")
                                Loop
                        EndIf
                   Else If []<>"C" And 
                           []<>"T" And 
                           []<>"D" And 
                           []<>"O" And 
                           []<>"E" And 
                           []<>"R" And 
                           []<>"V"
                           Then FastMsg("Opera‡Æo inv lida !")
                                Loop
                        EndIf
                EndIf                
                Switch
                  Case []="P" : [Descricao da Operacao]="PRODUCAO"
                  Case []="C" : [Descricao da Operacao]="CONSUMO"
                  Case []="T" : [Descricao da Operacao]="TRANSFERENCIA"
                  Case []="D" : [Descricao da Operacao]="DEVOLUCAO"
                  Case []="O" : [Descricao da Operacao]="OUTRAS"
                EndSwitch                 
                If []="T" And [Tipo de Movimento]="S"
                   Then Moveto [Codigo da Empresa Destino]
                   Else Moveto [Codigo do Documento]
                        [Codigo da Empresa Destino]="" 
                        Resynckey
                EndIf
           Case Field()="Codigo da Empresa Destino":
                If []<>[Codigo da Empresa] And Not IsBlank([])
                   Then Moveto [Codigo do Documento]
                        Resynckey
                   Else FastMsg("Empresa destino inv lida !")
                EndIf
           Case Field()="Codigo do Documento":
                If Not IsBlank([])
                   Then Moveto [Numero do Documento]
                EndIf
           Case Field()="Numero do Documento":
                If IsBlank([]) Then Loop EndIf
                If CHAVEC=1
                   Then Moveto [Data de Ocorrencia]
                   Else Moveto [Requisitante]
                EndIf
           Case Field()="Data de Ocorrencia":
                If IsBlank([])
                   Then []=Today()
                EndIf

                If Not IntervaloData([Data de Ocorrencia])
                   Then Loop
                EndIf

                Moveto [Requisitante]
           Case Field()="Requisitante":
                CHAVEF=0
                QuitLoop
           EndSwitch
      EndSwitch
EndWhile
EndProc   ; (DigitaC)

;*******************************************************************************
;* Rotina para Localizar Registro Item                                         *
;*******************************************************************************
Proc CHAVEI()
While True
  Moveto "Rqitem"
  Moveto [Sequencia do Lancamento]  VCITENS =ImageCCount()
  Moveto [Custo Total            ]  TOTVALOR=ImageCSum()
  Moveto [Quantidade             ]  QUANTTOT=ImageCSum()

  Moveto "Rqcabeca"
  [Valor Total     ]=TOTVALOR
  [Quantidade Total]=QUANTTOT

  Moveto "Rqitem"
  Moveto [Sequencia do Lancamento]
  End
  ITEM = [Sequencia do Lancamento]
  Down
  Moveto [Sequencia do Lancamento]
  Seta_Sequencia(ITEM,False)
  If IsLockRecord()
     Then Del
          Loop
  EndIf
                 
  Opcao_Ver=False
  SetaCorRegistro("Editar")
  While true
        Moveto "Rqitem"
        Moveto [Sequencia do Lancamento]

        Prompt " Esc=Retornar  F3=Ver Ficha  F7=Paginar  Alt+F=Fun‡”es  PgDn=Finalizar  "
                     
        Wait Field
             Until "ESC","ENTER","F3","F4","F7","HOME","UP","PGUP","PGDN","F2","F5","F9",-33

        If RetVal=-33
           Then Echo Normal
                Echo Off
                ShowPopup " Fun‡”es " CENTERED
                  "F4  ~R~ecalcular consumo  " : " Recalcular consumo conforme F¢rmula atual" : "F4",
                  "F5  C~o~nsulta            " : " Consultar Tabela Pre‡o                   " : "F5",
                  "F9  ~A~tiva CDBarras      " : " Ativa Leitura Codigo de Barras           " : "F9",
                  "~C~ancelar                " : " Cancelar a Opera‡„o                      " : "CANCELAR"
                EndMenu
                To MenuVar
                echo off
                If MenuVar="CANCELAR" or MenuVar="Esc"
                   Then Loop
                EndIf

                RetVal=MenuVar
        EndIf

        Switch
        Case Retval="F9" Or Retval="F2":
             Del
             CDBarras()
             QuitLoop
        Case RetVal="F3":
             Del
             Moveto [Sequencia do Lancamento]
             If RecordStatus("New")
                Then MENSAGEM("Sem Item p/ ver !")
                     QuitLoop
             EndIf
             Opcao_Ver=True
             CHAVEI=0
             Home
             ITEM=[Sequencia do Lancamento]
             Inicia_Registro()
             DigitaI()
             QuitLoop
        Case Retval="F4":
             Del
             Recalc_Consumo()
             QuitLoop
        Case Retval="F5":
        TABANT=Table()
        
        If [RqCabeca->Tipo de Movimento]="S" And
           [RqCabeca->Tipo de Operacao ]="T"
           Then COD_EMPRESA=[RqCabeca->Codigo da Empresa Destino]
           Else COD_EMPRESA=[RqCabeca->Codigo da Empresa]
        EndIf         
        VSDGEMPRESA=COD_EMPRESA
        Del
        Moveto "RqCabeca"
        UnLockRecord
        KeyPress "F7"
        IsLockRecord()
        OP_INSERT_ITEM=True

        Play "SW_CONSR"
        
        Moveto "RqCabeca"
        Moveto [Numero do Lancamento]
        Locate LANCTO
        KeyPress "F7"
        
        IsLockRecord()
        Moveto "RqItem"        
                       
       If Sw_Item_Pesquisado="" Then QuitLoop EndIf
       
        While True
          Moveto [Sequencia do Lancamento]
          End
          NITEM = [Sequencia do Lancamento]
          Down
          Moveto [Sequencia do Lancamento]
          Seta_Sequencia(NITEM,False)
          If IsLockRecord()
             Then Del
                  Loop
          EndIf
          QuitLoop
         EndWhile           
         If Not Seta_Sequencia(NITEM,True)
            Then Del
                 QuitLoop
         EndIf

         SEQIT=[Sequencia do Lancamento]
         CHAVEI=1
         [Numero do Lancamento   ]=LANCTO
         [Sequencia do Lancamento]=SEQIT
         [Codigo do Item         ]=Sw_Item_Pesquisado
         Item_Ins_Consulta=True
           
         ITEM = [Sequencia do Lancamento]

         Return
                      
        Case RetVal="PGDN":   
             Del
             Moveto [Sequencia do Lancamento]
             If RecordStatus("New")=True
                Then MENSAGEM("O Lancamento deve ter pelo menos 1(um) Item Ok !")
                     QuitLoop
             EndIf
             CHAVEI=9
             CHAVEF=8
             Return
        Case Retval="ESC":
             Del
             Moveto [Sequencia do Lancamento]
             If RecordStatus("New")=True
                Then CHAVEF=9
                Else CHAVEF=8 
             EndIf
             CHAVEI=9 
             Return
        Case RetVal="F7" Or RetVal="UP" Or RetVal="PGUP" Or RetVal="HOME":
             Del
             While True
               Moveto [Sequencia do Lancamento]  VCITENS =ImageCCount()
               Moveto [Custo Total            ]  TOTVALOR=ImageCSum()
               Moveto [Quantidade             ]  QUANTTOT=ImageCSum()

               Moveto "Rqcabeca"
               [Valor Total     ]=TOTVALOR
               [Quantidade Total]=QUANTTOT
               Moveto "Rqitem"
               Moveto [Sequencia do Lancamento]

               PAGINA("RqItem","MR")
               ITEM = [Sequencia do Lancamento]
               If EDITAR="S"
                  Then CHAVEI=0
                       Controla_EdicaoI()
                  Else If EXCLUIR="S"
                          Then If QuerExcluir("")
                                  Then If Checa_Supervisor()
                                          Then EXCLUSAO("Item")
                                               Moveto "RqItem"
                                       EndIf
                                  Else UnLockRecord
                               EndIf
                          Else QuitLoop
                       EndIf
               EndIf
               SetaPosForm()
             EndWhile
             QuitLoop
        Case Retval="ENTER":
             If Not Seta_Sequencia(ITEM,True)
                Then Del
                     QuitLoop
             EndIf
             ITEM=[]
             Del
             Locate LANCTO,ITEM
             If Retval
                Then CHAVEI=0
                Else CHAVEI=1
                     End Down
                     [Numero do Lancamento   ] = LANCTO
                     [Sequencia do Lancamento] = ITEM
                     Locate LANCTO,ITEM
             EndIf
             Return
        EndSwitch
  EndWhile
EndWhile
EndProc    ; (ChaveI)

;*******************************************************************************
;* Rotina de Digitacao Dados do Item                                           *
;*******************************************************************************
Proc Item_Dialog(Disparo,Campo,Evento,Elemento)
Private JANELA, WinArray5
TECLA=" Esc=Retornar  "
MSG_CAMPO=""
Temp=True

If INICIO_DIALOG
   Then If CHAVEI=0
           Then Campo="I_Quantidade"
           Else Campo="I_Codigo_Item"
        EndIf
        INICIO_DIALOG=False
EndIf

If Opcao_Ver=True Then Campo="I_Seq" EndIf
If Disparo="EVENT" And DynArraySize(Evento)>0 And Evento["Type"]="KEY" Then
   Switch
      Case Opcao_Ver=True:
           Temp=False
           Switch
             Case Evento["KeyCode"] =  27:
                  CancelDialog
             OtherWise:
               Mover_Reg=True
               Switch
                 Case Evento["KeyCode"] = -71:
                      If AtFirst()
                         Then Mover_Reg=False Beep
                         Else Home
                      EndIf
                 Case Evento["KeyCode"] = -79:
                      If AtLast()
                         Then Mover_Reg=False Beep
                         Else End
                      EndIf
                 Case Evento["KeyCode"] = -73:
                      If AtFirst()
                         Then Mover_Reg=False Beep
                         Else Up
                      EndIf
                 Case Evento["KeyCode"] = -81:
                      If AtLast()
                         Then Mover_Reg=False Beep
                         Else Down
                      EndIf
               EndSwitch
               If Mover_Reg=True
                  Then ITEM=[Sequencia do Lancamento]
                       Inicia_Registro()
               EndIf
           EndSwitch
       Case Evento["KeyCode"] = 9 Or
            Evento["KeyCode"] = -15:
            Temp=False
       Case (Evento["KeyCode"] = -6 Or Evento["KeyCode"] = -147):
            If CHAVEI=0
               Then If QuerExcluir("")
                       Then CHAVEI=8
                            CancelDialog
                    EndIf
            EndIf
       Case Evento["KeyCode"] = -59:
            If Campo="I_Codigo_Item" Or
               Campo="I_CCusto"
               Then
                    Dynarray WinArray5[]
                    Window Handle Dialog to JANELA
                    Window GetAttributes JANELA To WinArray5
                    WinArray5["FLOATING"]=False
                    Window SetAttributes JANELA From WinArray5

                    If Campo="I_Codigo_Item" Then Moveto [Codigo do Item ] EndIf
                    If Campo="I_CCusto"      Then Moveto [Codigo CCusto  ] EndIf

                    ConsultaF1()
                    Window Select JANELA
                    WinArray5["FLOATING"]=True
                    Window SetAttributes JANELA From WinArray5

                    echo Normal
                    echo off

                    If Campo="I_Codigo_Item"
                       Then VSD_I_Codigo_Item    =[Codigo do Item    ]
                            VSD_I_Descricao_Item =[Descricao do Item ]
                            VSD_I_Tipo_Item      =[Tipo do Item      ]
                            VSD_I_UN_Item        =[Unidade Interna   ]
                            Campo="I_Codigo_Item"
                    EndIf

                    If Campo="I_CCusto"
                       Then VSD_I_CCusto          =[Codigo CCusto   ]
                            VSD_I_Descricao_CCusto=LTrim([Descricao CCusto])
                            Campo="I_CCusto"
                    Endif

                    Moveto "Rqitem"
                    RefreshDialog
           EndIf
           Temp=False
      Case Evento["KeyCode"] = 27:
           Switch
             Case Campo="I_Codigo_Item":
                  If QuerDesfazer("")
                     Then CHAVEI=9
                          Del
                          CancelDialog
                  EndIf
             Case Campo="I_Quantidade":
                  If CHAVEI=1
                     Then Campo="I_Codigo_Item"
                     Else If QuerDesfazer("")
                             Then CHAVEI=9
                                  CopyFromArray RegItem
                                  CancelDialog
                          EndIf
                  Endif
             Case Campo="I_Custo_Unitario":
                  Campo="I_Quantidade"
             Case Campo="I_CCusto":
                  Campo="I_Custo_Unitario"
             Case Campo="I_Flag":
                  Campo="I_CCusto"
           EndSwitch
           Temp=False
      Case Evento["KeyCode"] = 13:
           Switch
             Case Campo="I_Codigo_Item":
                  VSD_I_Codigo_Item=ControlValue("I_Codigo_Item")
                  If Not IsBlank(VSD_I_Codigo_Item)
                     Then Moveto [Codigo do Item]
                          Ativa_Lookup()
                          If Len(ControlValue("I_Codigo_Item"))<=10
                             Then Moveto [Codigo do Item]
                                  Locate ALINHM(ControlValue("I_Codigo_Item"),10)
                             Else Moveto [Codigo de Barras]
                                  Locate IndexOrder by "cod_barras" ControlValue("I_Codigo_Item")
                          EndIf

                          If RetVal
                             Then VSD_I_Codigo_Item   =[Codigo do Item   ]
                                  If [Inativo]="S"
                                     Then Mensagem("Este item: //"+[Codigo do Item]+"//"+[Descricao do Item]+"// // esta inativo !")
                                          KeyPress "ESC"
                                     Else KeyPress "ESC"
                                          [Codigo do Item]=VSD_I_Codigo_Item
                                          Registro_Item("Ler")
                                          RefreshDialog

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

                                          Moveto "SdEstq"
                                          Moveto [Codigo da Empresa]

                                          If [RqCabeca->Tipo de Movimento]="S" And
                                             [RqCabeca->Tipo de Operacao ]="T"
                                             Then Locate [RqCabeca->Codigo da Empresa Destino],
                                                         [RqItem->Codigo do Item], ANO, MES
                                                  If Not RetVal
                                                     Then If Not Cria_Ficha([RqCabeca->Codigo da Empresa Destino],[RqItem->Codigo do Item],False)
                                                             Then Moveto "RqItem"
                                                                  Temp=False
                                                                  Return TEMP
                                                          EndIf
                                                  EndIf
                                          EndIf

                                          Locate [RqCabeca->Codigo da Empresa],
                                                 [RqItem->Codigo do Item], ANO, MES
                                          If Not RetVal
                                             Then If Not Cria_Ficha([RqCabeca->Codigo da Empresa],[RqItem->Codigo do Item],False)
                                                     Then Moveto "RqItem"
                                                          Temp=False
                                                          Return TEMP
                                                  EndIf
                                          EndIf

                                          CUSTOMEDIO=[Custo Total Atual]/[Saldo Atual]
                                          If CUSTOMEDIO=0 Or IsBlank(CUSTOMEDIO)
                                            Then CUSTOMEDIO=[Ultimo Custo Atual]
                                          EndIf  

                                          If [RqCabeca->Tipo de Operacao ]="P" Or
                                             [RqCabeca->Tipo de Operacao ]="E" Or
                                             [RqCabeca->Tipo de Operacao ]="R"
                                             Then CUSTOMEDIO=[Preco de Custo]
                                          EndIf

                                          Moveto "RqItem"
                                          [Custo Unitario]    =NDecimal(CUSTOMEDIO,5)
                                          VSD_I_Custo_Unitario=NDecimal(CUSTOMEDIO,5)
                                          Moveto [Quantidade]

                                          Campo="I_Quantidade"
                                  EndIf
                             Else Mensagem("Item n„o Cadastrado !")
                                  VSD_I_Codigo_Item   =""
                                  VSD_I_Descricao_Item=""
                                  VSD_I_UN_Item       =""
                                  VSD_I_CF_Item       =""
                                  VSD_I_CST_Item      =""
                                  VSD_I_Tipo_Item     =""
                                  KeyPress "ESC"
                          EndIf
                          Echo Off
                  EndIf
             Case Campo="I_Quantidade":
                  VSD_I_Quantidade=ControlValue("I_Quantidade")
                  [Quantidade]=VSD_I_Quantidade
                  If CHECA_ESTOQUE() And CHECA_FORMULA()
                     Then Campo="I_Custo_Unitario"
                  EndIf
             Case Campo="I_Custo_Unitario":
                  VSD_I_Custo_Unitario=ControlValue("I_Custo_Unitario")
                  If VSD_I_Quantidade>0
                     Then VSD_I_Custo_Total=VSD_I_Quantidade*VSD_I_Custo_Unitario
                     Else If VSD_I_Custo_Unitario>0
                             Then VSD_I_Custo_Total=VSD_I_Custo_Unitario
                          EndIf
                  EndIf                                           
                  Campo="I_CCusto"
             Case Campo="I_CCusto"             :
                  VSD_I_CCusto=ControlValue("I_CCusto")
                  If Not IsBlank(VSD_I_CCusto)
                     Then Moveto [Codigo CCusto]
                          Ativa_Lookup()
                          Moveto [Codigo CCusto]
                          Locate VSD_I_CCusto
                          If RetVal
                             Then If [Tipo de Conta] <> "A"
                                     Then Msg = "Tipo de Conta deve ser Analitica ! // //"
                                          Msg = Msg + "Uma Conta pode ser Analitica ou Sintetica.//"
                                          Msg = Msg + "    Um lancamento pode ser efetuado somente em uma conta //"
                                          Msg = Msg + "Analitica. Verifique no Cadastro Centros de Custos a classificacao //"
                                          Msg = Msg + "do Tipo de Conta."
                                          Mensagem(Msg)
                                          VSD_I_CCusto          =""
                                          VSD_I_Descricao_CCusto=""
                                          KeyPress "ESC"
                                     Else VSD_I_CCusto          =[Codigo CCusto]
                                          VSD_I_Descricao_CCusto=LTrim([Descricao CCusto])
                                          KeyPress "ESC"
                                          [Codigo CCusto]       =VSD_I_CCusto
                                          Campo="I_Flag"
                                  Endif
                             Else Mensagem("Centro de Custo n„o Cadastrado !")
                                  VSD_I_CCusto          =""
                                  VSD_I_Descricao_CCusto=""
                                  KeyPress "ESC"
                          EndIf
                          Echo Off
                     Else VSD_I_Descricao_CCusto=""
                          Campo="I_Flag"
                  EndIf
             Case Campo="I_Flag"  : AcceptDialog

           EndSwitch
           RefreshDialog Registro_Item("Gravar")
           Temp=False
   EndSwitch
EndIf
SelectControl Campo
TECLA=" Esc=Retornar  "
If Campo="I_Codigo_Item" Or
   Campo="I_CCusto"
   Then TECLA=TECLA+"F1=Tabelas  "
EndIf
Switch
  Case Campo="I_Seq":
       MSGCAMPO="Sequencia"
  Case Campo="I_Codigo_Item":
       MSGCAMPO="Codigo do Item"
  Case Campo="I_Descricao_Item":
       MSGCAMPO="Descri‡„o do Item"
  Case Campo="I_Tipo_Item":
       MSGCAMPO="Tipo do Item"
  Case Campo="I_Quantidade":
       MSGCAMPO="Quantidade"
  Case Campo="I_UN_Item":
       MSGCAMPO="Unidade Fiscal"
  Case Campo="I_Custo_Unitario":
       MSGCAMPO="Custo Unitario"
  Case Campo="I_Custo_Total":
       MSGCAMPO="Custo Total"
  Case Campo="I_CCusto":
       MSGCAMPO="Centro de Custo"
  OtherWise:
       MSGCAMPO=""
EndSwitch

If CHAVEI=0
    Then TECLA=TECLA+"Ctrl+Del=Excluir  "
EndIf

If Opcao_Ver=True
   Then TECLA=" Esc=Retornar  Home/End/PgDn/PgUp=Paginar  "
EndIf

@ 24,0 ?? TECLA+Spaces(80-Len(TECLA))
PaintCanvas Attribute 31 24,0,24,79
Message(MSGCAMPO)
Mouse Hide
RefreshDialog
Return TEMP
EndProc  ; (Item_Dialog)

;*******************************************************************************
;* Rotina para Iniciar Registro                                                *
;*******************************************************************************
Proc Inicia_Registro()
INICIO_DIALOG=True
Moveto [Sequencia do Lancamento]
Locate [RqCabeca->Numero do Lancamento],ITEM
CopyToArray RegItem

Echo Normal
Echo Off

QUANTANT = [Quantidade ]
CUSTOANT = Round([Custo Total],2)
Registro_Item("Ler")

EndProc ; (Inicia_Registro)

;*******************************************************************************
;* Rotina para Digitacao Item                                                  *
;*******************************************************************************
Proc DIGITAI()
Showdialog "Dados do Item [     ]" Proc "Item_Dialog"
   Trigger "OPEN","ARRIVE"
    Key "F1","TAB","ReverseTab","ENTER","ESC","F4","ClearArea","HOME","END","PGDN","PGUP"
     @ 12,08 height 08 width 63

   Accept @ -01,35 Width 5 "A2" Tag "I_Seq" To VSD_I_SEQ

   Label  @ 00,01 "Codigo Item" For "I_Codigo_Item"
   Accept @ 01,01 Width 13 "A25" picture "!*!" Tag "I_Codigo_Item" to VSD_I_Codigo_Item
   Label  @ 00,15 "Descricao Item" For "I_Descricao_Item"
   Accept @ 01,15 Width 33 "A30" picture "!*!" Tag "I_Descricao_Item" to VSD_I_Descricao_Item
   Label  @ 00,49 "TI" For "I_Tipo_Item"
   Accept @ 01,49 Width 04 "A1" picture "&" Tag "I_Tipo_Item" to VSD_I_Tipo_Item

   Label  @ 02,01 "Quantidade" For "I_Quantidade"
   Accept @ 03,01 Width 13 "N" picture "#*#.[###]" Tag "I_Quantidade" to VSD_I_Quantidade
   Label  @ 02,15 "UN" For "I_UN_Item"
   Accept @ 03,15 Width 05 "A2" picture "!*!" Tag "I_UN_Item" to VSD_I_UN_Item
   Label  @ 02,21 "Ct.Unitario" For "I_Custo_Unitario"
   Accept @ 03,21 Width 12 "N" picture "#*#.[#####]" Tag "I_Custo_Unitario" to VSD_I_Custo_Unitario
   Label  @ 02,34 "Ct.Total" For "I_Custo_Total"
   Accept @ 03,34 Width 12 "$" picture "#*#.[##]" Tag "I_Custo_Total" to VSD_I_Custo_Total

   Label  @ 04,00 "Centro Custo" For "I_CCusto"
   Accept @ 05,01 Width 10 "A7" picture "###.###" Tag "I_CCusto" to VSD_I_CCusto
   Accept @ 05,11 Width 31 "A25" picture "!*!" Tag "I_Descricao_CCusto" to VSD_I_Descricao_CCusto
   Accept @ 05,43 Width 1 "A1" picture "!*!" Tag "I_Flag" to VSD_I_Flag

Enddialog
Mouse Show
If RetVal
   Then Finaliza_Registro(True)
   Else Finaliza_Registro(False)
EndIf
EndProc  ;  (DigitaI)

;*******************************************************************************
;* Rotina para Finalizar o Registro                                            *
;*******************************************************************************
Proc Finaliza_Registro(ok)
Private ok
If Ok
   Then Registro_Item("Gravar")
   Else If CHAVEI=8
           Then CopyFromArray RegItem
                Exclusao("Item")
        EndIf
EndIf
EndProc   ; (Finaliza_Registro)

;*******************************************************************************
;* Rotina para Gravacao/Leitura do Item                                        *
;*******************************************************************************
Proc Registro_Item(Funcao_Registro)
Private Funcao_Registro
Switch
  Case Funcao_Registro="Gravar":
       [Codigo da Empresa    ]=[Rqcabeca->Codigo da Empresa]
       [Codigo do Item       ]=VSD_I_Codigo_Item
       [Descricao do Item    ]=VSD_I_Descricao_Item
       [Tipo do Item         ]=VSD_I_Tipo_Item

       [Quantidade           ]=VSD_I_Quantidade
       [Unidade Interna      ]=VSD_I_UN_Item
       [Custo Unitario       ]=VSD_I_Custo_Unitario
       [Custo Total          ]=Round(VSD_I_Custo_Total,2)

       [Codigo CCusto        ]=VSD_I_CCusto
       [Descricao CCusto     ]=VSD_I_Descricao_CCusto

  Case Funcao_Registro="Ler":
       VSD_I_Seq                    =[Sequencia do Lancamento   ]

       VSD_I_Tipo_Item              =[Tipo do Item              ]
       VSD_I_Codigo_Item            =[Codigo do Item            ]
       VSD_I_Descricao_Item         =[Descricao do Item         ]

       VSD_I_Quantidade             =[Quantidade                ]
       VSD_I_UN_Item                =[Unidade Interna           ]
       VSD_I_Custo_Unitario         =[Custo Unitario            ]
       VSD_I_Custo_Total            =Round([Custo Total               ],2)

       VSD_I_CCusto                 =[Codigo CCusto             ]
       VSD_I_Descricao_CCusto       =[Descricao CCusto          ]

EndSwitch
EndProc  ; (Registro_Item)

;*******************************************************************************
;* Exclusao de Itens                                                           *
;*******************************************************************************
Proc EXCLUSAO(TIPO)
Private TIPO
Switch
Case TIPO="Cabeca":
     Moveto "RqItem"
     While RecordStatus("New")=False
           ITEM=[Sequencia do Lancamento]
           ESTOQUE("Exclusao")
           If [RqCabeca->Tipo de Movimento]="E" And
              [RqCabeca->Tipo de Operacao ]="P"
              Then EXCLUIMAT()
           Endif
           Moveto "RqItem"
           Del
     EndWhile
     Moveto "RqCabeca"
     Del
Case TIPO="Item":
     ESTOQUE("Exclusao")
     If [RqCabeca->Tipo de Movimento]="E" And
        [RqCabeca->Tipo de Operacao ]="P"
        Then EXCLUIMAT()
     Endif
     Moveto "RqItem"
     Del
EndSwitch
EndProc  ; (Exclusao)

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

COD_EMPRESA=[RqCabeca->Codigo da Empresa]
TPMOV      =[RqCabeca->Tipo de Movimento]

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

For i from 1 to 2
  Moveto "SdEstq"
  Moveto [Codigo da Empresa]
  Locate COD_EMPRESA, [RqItem->Codigo do Item], ANO, MES
  If not RetVal
     Then Cria_Ficha(COD_EMPRESA,[RqItem->Codigo do Item],False)
  EndIf   
                 
  While True
    If IsLockRecord()  
       Then Loop
    EndIf     
               
    Switch
    Case OPER="Exclusao":
         If TPMOV="E"
            Then [Saldo Atual      ]=NDecimal([Saldo Atual]-[RqItem->Quantidade],3)
                 [Custo Total Atual]=NDecimal([Custo Total Atual]-[RqItem->Custo Total],2)
            Else [Saldo Atual      ]=NDecimal([Saldo Atual]+[RqItem->Quantidade],3)
                 [Custo Total Atual]=NDecimal([Custo Total Atual]+[RqItem->Custo Total],2)
         EndIf
    Case OPER="IncAlt":
         If TPMOV="E"
            Then [Saldo Atual      ]=NDecimal(([Saldo Atual]-QUANTANT)+[RqItem->Quantidade],3)
                 [Custo Total Atual]=NDecimal(([Custo Total Atual]-CUSTOANT)+[RqItem->Custo Total],2)
            Else [Saldo Atual      ]=NDecimal(([Saldo Atual]+QUANTANT)-[RqItem->Quantidade],3)
                 [Custo Total Atual]=NDecimal(([Custo Total Atual]+CUSTOANT)-[RqItem->Custo Total],2)
         EndIf

         If [RqCabeca->Data de Ocorrencia]>=[Data do Preco de Custo] And
            [RqCabeca->Tipo de Movimento]="E"                        And
            [RqCabeca->Tipo de Operacao ]="O"                        And
            [RqItem->Custo Unitario]>0                               And             
            [RqItem->Custo Unitario]<>[Preco de Custo]               And
            [RqItem->Quantidade]=BlankNum() Or [RqItem->Quantidade]=0 
            Then If ([Custo Total Atual]/[Saldo Atual])>0
                     Then [Data do Preco de Custo]=[RqCabeca->Data de Ocorrencia]
                          [Preco de Custo        ]=NDecimal([Custo Total Atual]/[Saldo Atual],5)
                  EndIf 
         EndIf
         
         If [RqCabeca->Data de Ocorrencia]>=[Data do Preco de Custo] And
            [RqCabeca->Tipo de Movimento]="E" And
            ([RqCabeca->Tipo de Operacao ]="P" Or [RqCabeca->Tipo de Operacao ]="O") And
            [RqItem->Custo Unitario]>0 And             
            [RqItem->Custo Unitario]<>[Preco de Custo] And
            [RqItem->Quantidade]>0 
            Then MSG="O Custo Unit rio informado neste Item, // "+
                     "difere da Ficha de Estoque !// //"+
                     "Custo Informado = "+Format("W12.5,EIC",[RqItem->Custo Unitario])+"//"+
                     "Custo da Ficha  = "+Format("W12.5,EIC",[Preco de Custo        ])+"// //"+
                     "Deseja Atualizar o Custo da Ficha a partir deste Lan‡amento ?"
                 ConfGeral(MSG)
                 If OK="S"
                    Then [Data do Preco de Custo]=[RqCabeca->Data de Ocorrencia ]
                         [Preco de Custo        ]=[RqItem->Custo Unitario       ]
                 EndIf
         EndIf
         
         
    EndSwitch
    If ([Custo Total Atual]/[Saldo Atual])>0
       Then [Ultimo Custo Atual]=NDecimal([Custo Total Atual]/[Saldo Atual],5)
    EndIf
    UnLockRecord

    QuitLoop
  EndWhile

  If OPER="IncAlt" And TPMOV="S"
     Then While True
            Moveto "EstqPrm"
            Moveto [Codigo da Empresa]
            Locate COD_EMPRESA, [RqItem->Codigo do Item]
            If Not RetVal
               Then End Down
                    [Codigo da Empresa   ]=COD_EMPRESA
                    [Codigo do Item      ]=[RqItem->Codigo do Item]
                    If IsLockRecord()
                       Then Del
                       Else UnLockrecord
                    EndIf
                    Loop
            EndIf
            If IsLockRecord()
               Then Loop
            EndIf
            If [RqCabeca->Data de Ocorrencia]>[Data da Ultima Saida]
               Then [Data da Ultima Saida]=[RqCabeca->Data de Ocorrencia]
            EndIf
            UnLockRecord

            QuitLoop
          EndWhile       
  EndIf

  If [RqCabeca->Tipo de Movimento]="S" And
     [RqCabeca->Tipo de Operacao ]="T"
     Then COD_EMPRESA=[RqCabeca->Codigo da Empresa Destino]
          If TPMOV="E"
             Then TPMOV="S"
             Else TPMOV="E"
          EndIf
     Else QuitLoop
  EndIf

EndFor
Moveto "RqItem"
EndProc  ; (Estoque)

;*******************************************************************************
;* Verifica Formula de Materia Prima                                           *
;*******************************************************************************
Proc FORMULA()

Moveto "\\Sistemas\\Producao\\FormulaC"
Moveto [Codigo do Produto]
Locate [\Sistemas\Estoque\RqItem->Codigo do Item],"",""
If Not RetVal
  Then Mensagem("NÆo existe f¢rmula cadastrada para este item !//Verificar")
       Moveto "RqItem"
       Return
EndIf

If [Baixa_Automatica]="N"
   Then Moveto "RqItem"
        Return
EndIf

Moveto "\\Sistemas\\Producao\\FormulaI"
Moveto [Codigo do Produto]
Locate [\Sistemas\Estoque\RqItem->Codigo do Item],"",""
If RetVal
   Then While [Codigo do Produto]=[\Sistemas\Estoque\RqItem->Codigo do Item]
          If Not IsBlank([Codigo do Material]) And [Item_Baixa_Automatica]="S"
             Then Moveto "RqMatPri"
                  Moveto [Numero do Lancamento]
                  Locate LANCTO,ITEM,[\Sistemas\Producao\FormulaI->Sequencia]
                  If Not RetVal
                     Then End Down
                          [Numero do Lancamento   ]=LANCTO
                          [Sequencia do Item      ]=ITEM
                          [Sequencia Materia Prima]=[\Sistemas\Producao\FormulaI->Sequencia]
                  Endif
                  [Codigo da Empresa  ]=[RqCabeca->Codigo da Empresa]
                  [Codigo do Item     ]=[\Sistemas\Producao\FormulaI->Codigo do Material]
                  ESTOQUEMAT("VOLTA")
                  UNIDADE=([RqItem->Quantidade]/[\Sistemas\Producao\Formulac->Quantidade Produzida])
                  [Quantidade         ]=NDecimal(UNIDADE*[\Sistemas\Producao\FormulaI->Quantidade],3)
                  [Custo Unitario     ]=CUSTOMEDIO_MATPRIMA
                  [Custo Total        ]=Round([Quantidade]*[Custo Unitario],2)
                  [Codigo CCusto      ]=[\Sistemas\Estoque\RqItem->Codigo CCusto]
                  ESTOQUEMAT("BAIXA")
                  UnLockRecord
                  Moveto "\\Sistemas\\Producao\\FormulaI"
          EndIf
          Skip
          If EOT() Then QuitLoop EndIf
        EndWhile
   Else Mensagem("NÆo existe itens a consumir na f¢rmula deste item !//Verificar !")
EndIf
Moveto "RqItem"
EndProc  ;  (Formula)

;*******************************************************************************
;* Rotina p/ Checagem de Formula                                              **
;*******************************************************************************
Proc CHECA_FORMULA()
Private OkFormula

If [RqCabeca->Tipo de Movimento]="E" And
   [RqCabeca->Tipo de Operacao ]="P" And
   PARAM_EXPLODE_MATPRIMA       ="S"
   Then OkFormula=True
   Else Return True
EndIf

MSG=""
Moveto "\\Sistemas\\Producao\\FormulaC"
Moveto [Codigo do Produto]
Locate [\Sistemas\Estoque\RqItem->Codigo do Item],"",""
If Not RetVal
   Then MSG="NÆo existe f¢rmula cadastrada para este item !"
        OkFormula=False
   Else If [Baixa_Automatica]="S"
           Then Moveto "\\Sistemas\\Producao\\FormulaI"
                Moveto [Codigo do Produto]
                Locate [\Sistemas\Estoque\RqItem->Codigo do Item],"",""
                If Not RetVal
                   Then MSG="NÆo existe itens a consumir na f¢rmula deste item !"
                        OkFormula=False
                EndIf
        EndIf
EndIf

Moveto "RqItem"
If Not OkFormula
   Then Mensagem(MSG+"//Verificar !")
EndIf

Return OkFormula
EndProc   ; (Checa_Estoque)

;*******************************************************************************
;* Rotina Baixa Materia Prima                                                  *
;*******************************************************************************
Proc ESTOQUEMAT(OPERACAO)
Private OPERACAO
MES=ALINHM(StrVal(Month([RqCabeca->Data de Ocorrencia])),2)
ANO=ALINHM(StrVal(Year([RqCabeca->Data de Ocorrencia])),4)

Moveto "SdEstq"
Moveto [Codigo da Empresa]
Locate [RqCabeca->Codigo da Empresa],
       [RqMatPri->Codigo do Item], ANO, MES
If Not RetVal
   Then Cria_Ficha([RqCabeca->Codigo da Empresa],[RqMatPri->Codigo do Item],False)
EndIf
While True
  If IsLockRecord()
     Then Loop
  EndIf
  If OPERACAO = "BAIXA"
     Then [Saldo Atual             ]=NDecimal([Saldo Atual      ]-[RqMatPri->Quantidade ],3)
          [Custo Total Atual       ]=NDecimal([Custo Total Atual]-[RqMatPri->Custo Total],2)
     Else [Saldo Atual             ]=NDecimal([Saldo Atual      ]+[RqMatPri->Quantidade ],3)
          [Custo Total Atual       ]=NDecimal([Custo Total Atual]+[RqMatPri->Custo Total],2)
  EndIf
  If ([Custo Total Atual]/[Saldo Atual])>0
     Then [Ultimo Custo Atual]=NDecimal([Custo Total Atual]/[Saldo Atual],5)
  EndIf
  CUSTOMEDIO_MATPRIMA=NDecimal([Custo Total Atual]/[Saldo Atual],5)
  If CUSTOMEDIO_MATPRIMA=0 Or IsBlank(CUSTOMEDIO_MATPRIMA)
     Then CUSTOMEDIO_MATPRIMA=[Ultimo Custo Atual]
  EndIf                  
  
  UnLockRecord

  QuitLoop
EndWhile

If OPERACAO="BAIXA"
   Then While True
          Moveto "EstqPrm"
          Moveto [Codigo da Empresa]
          Locate [RqCabeca->Codigo da Empresa], [RqMatPri->Codigo do Item]
          If Not RetVal
             Then End Down
                  [Codigo da Empresa   ]=[RqCabeca->Codigo da Empresa]
                  [Codigo do Item      ]=[RqMatPri->Codigo do Item   ]
                  UnLockRecord
                  Loop
          EndIf
          If IsLockRecord()
             Then Loop
          EndIf
          If [RqCabeca->Data de Ocorrencia]>[Data da Ultima Saida]
             Then [Data da Ultima Saida]=[RqCabeca->Data de Ocorrencia]
          EndIf
          UnLockRecord

          QuitLoop
        EndWhile
EndIf

Moveto "RqMatPri"
EndProc  ;  (EstoqueMat)

;*******************************************************************************
;* Rotina para exclusao de materia prima                                       *
;*******************************************************************************
Proc EXCLUIMAT()
Moveto "RqMatPri"
Moveto [Numero do Lancamento]
Locate LANCTO,ITEM
While [Numero do Lancamento ]=LANCTO And [Sequencia do Item]=ITEM
   ESTOQUEMAT("VOLTA")
   Del
EndWhile
EndProc   ; (ExcluiMat)

;*******************************************************************************
;* Rotina p/ Checagem de Estoque Negativo                                     **
;*******************************************************************************
Proc CHECA_ESTOQUE()
Private NOVOSALDO

If [RqCabeca->Tipo de Movimento]="E"
   Then Return True
Endif
MES=ALINHM(StrVal(Month([RqCabeca->Data de Ocorrencia])),2)
ANO=ALINHM(StrVal(Year([RqCabeca->Data de Ocorrencia])),4)

Moveto "SdEstq"
Moveto [Codigo da Empresa]
Locate [Rqcabeca->Codigo da Empresa],
       [Rqitem->Codigo do Item], ANO, MES
If Not RetVal
   Then Cria_Ficha([RqCabeca->Codigo da Empresa],[RqItem->Codigo do Item],False)
EndIf

NOVOSALDO=-1
Switch
  Case CHAVEI=1:
       NOVOSALDO=NDecimal([Saldo Atual]-[RqItem->Quantidade],3)
  Case CHAVEI=0:
       NOVOSALDO=NDecimal((([Saldo Atual]+QUANTANT)-[RqItem->Quantidade]),3)
EndSwitch
UnLockRecord
                
Moveto "RqItem"
If NOVOSALDO>=0
   Then Return True
   Else Mensagem("Estoque Insuficiente em "+Ltrim(StrVal(Format("W11.3,EIC",NOVOSALDO)))+", Verificar !")
        If PARAM_BLOQUEIA_NEG="S"
           Then Return False
           Else Return True
        EndIf
EndIf
EndProc   ; (Checa_Estoque)

;*******************************************************************************
;* 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

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 "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 "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  ; (Cria_Ficha)

;*******************************************************************************
;* Rotina para Carregar Parametros                                             *
;*******************************************************************************
Proc Carrega_Parametros()
Private Result

If IsEmpty("P_Requis")
   Then Mensagem("N„o esta Configurado os Parametros para Digita‡„o !")
        Result=False
   Else 
        UnLockRecord
        KeyPress "F7"
        While True
          If Not IsLockRecord()
             Then QuitLoop
          EndIf
        EndWhile

        Moveto "P_Requis"
        Moveto [Codigo_Empresa]
        Locate [RqCabeca->Codigo da Empresa]
        If Not RetVal
           Then Mensagem("Parametros n„o Cadastrado para esta Empresa !")
                Result=False
           Else     
                PARAM_EMPRESA         = [Codigo_Empresa           ]
                PARAM_BLOQUEIA_NEG    = [Bloqueia_Estoque_Negativo]
                PARAM_EXPLODE_MATPRIMA= [Explosao_Materia_Prima   ]

                Result=True
        EndIf
EndIf

Moveto "RqCabeca"
KeyPress "F7"

Return Result
EndProc ; (Carrega_Parametros)

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

If Disparo="OPEN"
   Then INICIO_DIALOG=False
        Campo="TG_CODIGO"
EndIf        

If Disparo="EVENT" And Evento["Type"]="KEY" Then
   Switch
     Case Evento["KeyCode"] = 27:
          Temp=False
          Switch
            Case Campo="TG_QTD"            :
                 CancelDialog
            Case Campo="TG_CODIGO"         : Campo="TG_QTD"
          EndSwitch
      Case Evento["KeyCode"] = 13:
           Temp=False
           Switch
             Case Campo="TG_QTD"           : 
								Dados_QTD=ControlValue("TG_QTD")
                If Dados_QTD>1000
                   Then Mensagem("Quantidade Inv lida !")
                   Else Campo="TG_CODIGO"
                EndIf
             Case Campo="TG_CODIGO"        : 
                Dados_Item=ControlValue("TG_CODIGO")
								AcceptDialog
           EndSwitch
   EndSwitch
EndIf
RefreshDialog
Monta_Prompt(MSG_CAMPO,TECLA)
Return Temp
EndProc
            
;*******************************************************************************
;* Rotina para Leitura do Codigo de Barras                                     *
;*******************************************************************************
Proc CDBarras()

Moveto [Sequencia do Lancamento]  VCITENS =ImageCCount()
Moveto [Custo Total            ]  TOTVALOR=ImageCSum()
Moveto [Quantidade             ]  QUANTTOT=ImageCSum()

While True
   
  Moveto "Rqitem"
  End
  Down

  If Not Ler_CDBarras(22,00)
     Then Return False
  EndIf

  ITOK=True 

  If Len(Dados_Item)>0
     Then CODIT=Dados_Item

         While True
          ITOk =True

          Moveto [Codigo do Item]
          Ativa_Lookup()
          Switch
            Case SYS_CODIGO_CLIENTE="0304":
                  Moveto [Codigo de Barras]
                  Locate IndexOrder by "cod_barras" CODIT
            OtherWise:        
                  If Len(CODIT)<=10
                    Then Moveto [Codigo do Item]
                         Locate ALINHM(CODIT,10)
                    Else Moveto [Codigo de Barras]
                         Locate IndexOrder by "cod_barras" CODIT
                  EndIf        
          EndSwitch       

          
          
          If RetVal
             Then VSD_I_Codigo_Item   =[Codigo do Item   ]
                  If [Inativo]="S"
                     Then Mensagem("Este item: //"+[Codigo do Item]+"//"+[Descricao do Item]+"// // esta inativo !")
                          ITOK=False
                  EndIf
             Else Mensagem("Item n„o Cadastrado !")
                  ITOK=False
          EndIf
          KeyPress "ESC"

          Del
          If Not ITOK
             Then QuitLoop
          EndIf

          Moveto [Codigo do Item]
          Locate VSD_I_Codigo_Item
          If RetVal
             Then CHAVEI=0
                  ITEM  =[Sequencia do Lancamento]
                  Inicia_Registro()

                  TOTVALOR=TOTVALOR-[Custo Total   ]
                  QUANTTOT=QUANTTOT-[Quantidade    ]

             Else CHAVEI=1

                  While True
                    Moveto [Sequencia do Lancamento]
                    End
                    ITEM = [Sequencia do Lancamento]
                    Down
                    Moveto [Sequencia do Lancamento]
                    Seta_Sequencia(ITEM,False)
                    If IsLockRecord()
                       Then Del
                            Loop
                    EndIf
                    QuitLoop
                  EndWhile

                  ITEM  =[Sequencia do Lancamento]
                  [Codigo do Item]=VSD_I_Codigo_Item
                  Inicia_Registro()

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

                  Moveto "SdEstq"
                  Moveto [Codigo da Empresa]

                  If [RqCabeca->Tipo de Movimento]="S" And
                     [RqCabeca->Tipo de Operacao ]="T"
                     Then Locate [RqCabeca->Codigo da Empresa Destino],
                                 [RqItem->Codigo do Item], ANO, MES
                          If Not RetVal
                             Then If Not Cria_Ficha([RqCabeca->Codigo da Empresa Destino],[RqItem->Codigo do Item],False)
                                     Then Moveto "RqItem"
                                          Del
                                          QuitLoop
                                  EndIf
                          EndIf
                  EndIf

                  Locate [RqCabeca->Codigo da Empresa],
                         [RqItem->Codigo do Item], ANO, MES
                  If Not RetVal
                     Then If Not Cria_Ficha([RqCabeca->Codigo da Empresa],[RqItem->Codigo do Item],False)
                             Then Moveto "RqItem"
                                  Del
                                  QuitLoop
                          EndIf
                  EndIf

                  CUSTOMEDIO=[Custo Total Atual]/[Saldo Atual]
                  If CUSTOMEDIO=0 Or IsBlank(CUSTOMEDIO)
                     Then CUSTOMEDIO=[Ultimo Custo Atual]
                  EndIf
                  If [RqCabeca->Tipo de Operacao ]="P" Or
                     [RqCabeca->Tipo de Operacao ]="E" Or
                     [RqCabeca->Tipo de Operacao ]="R"
                     Then CUSTOMEDIO=[Preco de Custo]
                  EndIf

                  Moveto "RqItem"
                  VSD_I_Custo_Unitario=NDecimal(CUSTOMEDIO,5)
          EndIf
          VSD_I_Quantidade =VSD_I_Quantidade+Dados_QTD
          If Not CHECA_ESTOQUE() And Not CHECA_FORMULA()
             Then If CHAVEI=1
                     Then Del
                          Loop
                     Else UnLockRecord
                          QuitLoop
                  EndIf
          EndIf
          VSD_I_Custo_Total=VSD_I_Quantidade*VSD_I_Custo_Unitario
          Moveto [Quantidade]
          Registro_Item("Gravar")

          If CHAVEI=1
             Then VCITENS =VCITENS +1
          EndIf   
          TOTVALOR=TOTVALOR+[Custo Total   ]
          QUANTTOT=QUANTTOT+[Quantidade    ]

          UnlockRecord

          ESTOQUE("IncAlt")
          If [RqCabeca->Tipo de Movimento]="E" And
             [RqCabeca->Tipo de Operacao] ="P" And
             PARAM_EXPLODE_MATPRIMA="S"
             Then EXCLUIMAT()
                  FORMULA()
          Endif
          UnlockRecord
          
          Moveto "Rqcabeca"
          [Valor Total     ]=TOTVALOR
          [Quantidade Total]=QUANTTOT
        
          Moveto "RqItem"

          QuitLoop
         EndWhile
  EndIf
EndWhile

EndProc

;*******************************************************************************
;* Rotina para Recalcular consumo da formula                                   *
;*******************************************************************************
Proc Recalc_Consumo()
Private Ok

ok=False
If [RqCabeca->Tipo de Movimento]="E" And
   [RqCabeca->Tipo de Operacao] ="P" And
   PARAM_EXPLODE_MATPRIMA="S"
   Then ok=True
EndIf

If Not ok
   Then Mensagem("Tipo de movimento e opera‡„o inv lida, para recalculo !")
        Return
EndIf        

If Not ConfGeral("Confirma recalculo de consumo conforme f¢rmula atual ?")
   Then Return
EndIf        

NR = NImageRecords()
Scan

 Barra(NR, RecNo())
 Aguarde("Aguarde, recalculo "+BARRA_STRING)

 CHAVEI=0
 ITEM  =[Sequencia do Lancamento]
 EXCLUIMAT()
 FORMULA()
 
 Moveto "RqItem"
EndScan

Mensagem("Processo finalizado !")
EndProc

;*******************************************************************************
;* Rotina para controlar Edicao do registro                                    *
;*******************************************************************************
Proc Controla_EdicaoI()
INICIA_REGISTRO()
DIGITAI()
If CHAVEI=1 Or CHAVEI=0
   Then ESTOQUE("IncAlt")
        If [RqCabeca->Tipo de Movimento]="E" And
           [RqCabeca->Tipo de Operacao] ="P" And
           PARAM_EXPLODE_MATPRIMA="S"
           Then EXCLUIMAT()
                FORMULA()
        Endif
        UnlockRecord
        Moveto "RqItem"
EndIf
SetaCorRegistro("Padrao")
EndProc
 
;*******************************************************************************
;* Rotina para controlar Edicao do registro                                    *
;*******************************************************************************
Proc Controla_EdicaoC()
While True
  DIGITAC()
  If CHAVEC=9 Then QuitLoop EndIf
  If CHAVEC=1 Then Controle_Dia() EndIf
  SetaCorRegistro("Padrao")
  Moveto "RqItem"
  While True
    CHAVEI()          
    If CHAVEI=9 Then QuitLoop EndIf
    Controla_EdicaoI()
  EndWhile                          
  Moveto "RqCabeca"
  If CHAVEF=8 Then QuitLoop EndIf
EndWhile
If RecordStatus("Locked") Then UnLockRecord EndIf         
If OPCAO_FORM="F"
   Then PickForm "F"
EndIf
EndProc

;*******************************************************************************
;* Rotina Principal                                                            *
;*******************************************************************************
AutoLib="\\Sistemas\\Cadastro\\Bibliot,\\Sistemas\\Cadastro\\Bib_Show"
If Not IsAssigned(SYS_EMPRESA_DEFAULT) Then SYS_EMPRESA_DEFAULT=""   EndIf
If Not IsAssigned(SYS_CHAPA_USUARIO)   Then SYS_CHAPA_USUARIO=""     EndIf
If Not IsAssigned(SYS_NIVEL_USUARIO)   Then SYS_NIVEL_USUARIO ="S"   EndIf
If Not IsAssigned(SYS_NOME_USUARIO)    Then SYS_NOME_USUARIO  ="S"   EndIf
If Not IsAssigned(SYS_CODIGO_CLIENTE)  Then SYS_CODIGO_CLIENTE=""    EndIf
If Not IsAssigned(SYS_CONTROLE_DIA)    Then SYS_CONTROLE_DIA=""      EndIf

View NOWINDOW "Itens"
View NOWINDOW "SdEstq"
View NOWINDOW "EstqPrm"
View NoWindow "P_Requis"
CoEdit NoWindow "RqCabeca"
          
;************** Rotina para tratar o erro de tabela locada ********************
If ErrorCode()=4
   Then Do_It!
        ClearAll
        Release Vars All
        Release Procs All
        return             
EndIf

PickForm "1"
Moveto "\\Sistemas\\Producao\\FormulaC" SetHighLight Current Record 51 Field 51
Moveto "\\Sistemas\\Producao\\FormulaI" SetHighLight Current Record 51 Field 51
Moveto "RqMatPri" SetHighLight Current Record 51 Field 51
Moveto "SdEstq"   SetHighLight Current Record 51 Field 51
Moveto "EstqPrm"  SetHighLight Current Record 51 Field 51

Moveto "RqCabeca"
PickForm "F"
If NRecords("Rqcabeca")>1
   Then Home
        If IsBlank([Numero do Lancamento])
           Then Echo Normal
                Echo Off
                MSG="Existe registro com Erro !// //"
                MSG=MSG+"Verificar numero lan‡amento em branco !// //"
                MSG=MSG+"Excluir o lan‡amento e verificar a origem do mesmo !"
                Mensagem(MSG)
        EndIf
EndIf
                   
OPCAO_FORM="F"
While True
  CHAVEC()
  If CHAVEC=9 Then QuitLoop EndIf
  If CHAVEC=5
     Then If OPCAO_FORM="F"
             Then PickForm "F"
             Else PickForm "1"
          EndIf
          Loop
  EndIf
  Controla_EdicaoC()
EndWhile
Do_It!
ClearAll
Release Vars All
Release Procs All
