;** SDLote *********************************************************************
;*  Digitacao do Saldo do Lote                                                 *
;*******************************************************************************
;Autor           : Vise Informatica (VISERP)                       
;Desenvolvido em : 28/07/2020 por Bruno Carvalho            
;Ultima Alteracao:   /  /     por                            
;Motivo Alteracao: 

;*******************************************************************************
;* Rotina para Localizar Registro                                              *
;*******************************************************************************
Proc CHAVE()
INICIO_PAGINA=True
While True
  Switch
    Case ORDENARPOR="ID" :
      Moveto [Numero do Lancamento]
      Menu {Image} {OrderTable} Enter {IdLote}  
    OtherWise              :
      Moveto [Codigo do Item]
      Menu {Image} {OrderTable} Enter {Codigo do Item}  
  EndSwitch
  End
  If IsBlank([Numero do Lancamento])
     Then LANCTO = 0
     Else Moveto [Numero do Lancamento] LANCTO=ImageCMax()
  EndIf   
  If OPCAO_FORM="1"
    Then Down
    Else CtrlPgDn
  EndIf
  Moveto [Numero do Lancamento]

  SetaCorRegistro("Editar") 
  While True 
    MSGCAMPO=""
    TECLA=""
    AguardaTeclasPadrao()
    
    If RetVal=-33
       Then Echo Normal
            Echo Off
            ShowPopup " Fun‡”es " CENTERED
             "Ordenar por ID            " : " Ordenar por ID do Lote           " : "ORD_ID",
             "Ordenar por codigo do item" : " Ordenar por c¢digo do item       " : "ORD_COD",
             Separator,
             "~C~ancelar                " : " Cancelar a Opera‡„o              " : "CANCELAR"
            EndMenu
            To MenuVar
            Echo Off
  
            If MenuVar="CANCELAR" or MenuVar="Esc"
               Then Loop
            EndIf                                         
            
            Switch
              Case MenuVar="ORD_COD" : ORDENARPOR="CODIGO" 
              Case MenuVar="ORD_ID"  : ORDENARPOR="ID"  
            EndSwitch
            
            FileWrite PrivDir()+"SDLOTE.ini" From GravaExpressao("VSDGORDEM","S",ORDENARPOR)
            RetVal=MenuVar
            
            If MenuVar="ORD_COD" Or MenuVar="ORD_ID" 
               Then QuitLoop
            EndIf
    EndIf
    
    Switch
    Case RetVal="F3": 
         If OPCAO_FORM="1"
            Then OPCAO_FORM="2"
            Else OPCAO_FORM="1"
         EndIf
         Del
         CHAVE=5
         Return             
    Case RetVal=-94 : MsgTeclasPadrao()
    Case RetVal="F7" Or RetVal="UP" Or RetVal="PGUP" Or RetVal="HOME":
          While True
            INICIO_PAGINA=True
            If OPCAO_FORM="1"
               Then PAGINA("SdLote","MR")
               Else PAGINA("SdLote","MT")
            EndIf
            ID=[Numero do Lancamento]
            If EDITAR="S"
               Then PickForm "2"
                    CopyToArray ARRAY_SDLOTE
                    CHAVE=0  
                    Controla_EdicaoC()        
               Else If EXCLUIR="S"
                      Then If [Sistema Gerador]<>"MA"
                              Then Mensagem("ExclusÆo nÆo permitida para registros importados!")
                              Else If [LoteQuantidade]=[LoteSaldo]
                                      Then If QuerExcluir("") And Checa_Supervisor()
                                              Then PickForm "2"
                                                   Del                                   
                                              Else UnLockRecord
                                           EndIf
                                      Else Mensagem("ExclusÆo nÆo permitida para registros com quantidade diferente do saldo!")          
                                   EndIf
                           EndIf
                           UnLockRecord 
                           If OPCAO_FORM="2"
                              Then PickForm "2"
                              Else PickForm "1"
                           EndIf
                      Else QuitLoop
                    EndIf
            EndIf
            SetaPosForm()
          EndWhile
          QuitLoop     
    Case Retval="ESC":
         CHAVE=9
         Del
         Return  
    Case Retval="ENTER":           
         If IsBlank([])
             Then If IsBlank(LANCTO)
                     Then LANCTO = 1
                     Else LANCTO = LANCTO + 1
                  EndIf
                  []=LANCTO
          EndIf
          LANCTO=[]
          Del
          If OPCAO_FORM="1"
             Then PickForm "2"
          Endif 
          Moveto [Numero do Lancamento]
          Locate LANCTO
          If Retval
             Then CHAVE=0
                  If Checa_Controle([Numero_Controle_Dia])
                     Then Return
                  EndIf           
             Else If Checa_Controle(SYS_CONTROLE_DIA)
                    Then CHAVE=1                      
                         End
                         CtrlPgDn
                         If SYS_EMPRESA_DEFAULT<>""
                            Then [Codigo da Empresa]=SYS_EMPRESA_DEFAULT
                         EndIf   
                         [Numero do Lancamento]=LANCTO
                         [Sistema Gerador     ]="MA"
                         Controle_Dia() 
                    Else Return
                  EndIf                       
          EndIf
          If IsLockRecord()
             Then If OPCAO_FORM="1"
                     Then PickForm "1"
                  Endif
                  QuitLoop
          EndIf
          Return  
    EndSwitch
  EndWhile
EndWhile

EndProc

;*******************************************************************************
;* Rotina para Digitacao das Informacoes                                       *
;*******************************************************************************
Proc DIGITA()

Carrega_Variaveis()
If [Codigo da Empresa]="" 
   Then Moveto [Codigo da Empresa]
   Else Moveto [Codigo do Item]
EndIf    

If INICIO_PAGINA
   Then LOTE_QUANTIDADE = [LoteQuantidade]
EndIf  

Switch
  Case CHAVE=0 :
       Moveto [Flag]
  ;Case ([Sistema Gerador]="MA" And CHAVE=0 And [LoteQuantidade]<>[LoteSaldo]) Or [Sistema Gerador]<>"MA" :
  ;     Moveto [Flag]
  ;Case [Sistema Gerador]="MA" And CHAVE=0 :
  ;     Moveto [LoteNumero]             
EndSwitch

INICIO_PAGINA=False

While True
  TECLA=" Esc=Retornar  "
  If CHAVE=0
     Then TECLA=TECLA+"Del=Excluir  "
     Else TECLA=TECLA+"             "
  EndIf
  TECLA=TECLA+"PgDn  "                                            

  If Field()="Codigo do Documento"
     Then Monta_Opcoes("Codigo do Documento","")
  EndIf
 
  If Field()="Codigo da Empresa"      
     Then Monta_Opcoes("Empresas","")     
  EndIf
  
  Prompt TECLA

  MSGCAMPO=Field()
  Switch
    Case Field()="LoteDataValidade"     : MSGCAMPO = "Data de Validade do Lote"
    Case Field()="Numero do Lancamento" : MSGCAMPO = "Numero do Lancamento do Lote"
    Case Field()="LoteNumero"           : MSGCAMPO = "Numero do Lote"
    Case Field()="LoteQuantidade"       : MSGCAMPO = "Quantidade do Lote"
    Case Field()="LoteSaldo"            : MSGCAMPO = "Saldo do Lote"
    Case Field()="LoteDataFabricacao"   : MSGCAMPO = "Data de Fabrica‡Æo do Lote"
    Case Field()="Chave_Acesso_NFe"     : MSGCAMPO = "Chave de Acesso NFE"
    Case Field()="Flag"                 : MSGCAMPO = "[Enter] = Prosseguir" 
  EndSwitch
  
  If Field()="Codigo da Empresa"        Or
     Field()="Codigo do Documento"      Or
     Field()="Codigo"
     Then MSGCAMPO=MSGCAMPO+", [F1]Consultar tabela"
  EndIf
    
  SetaCorRegistro("Editando")
  
  Wait Field
       Until "F1","ESC","ENTER","DEL","FIELDVIEW","F35","PGDN","F6","F8",-33,"F9","F7",-66
  
  Switch
  Case Retval="FIELDVIEW" or Retval="F35":
       EDITFIELD()
  Case RetVal="F1":
       If Field()="Codigo" Or 
          Field()="Codigo do Item"
          Then CONSULTAF1()
       EndIf

       If Field()="Codigo do Documento"
          Then Seleciona_Opcoes("Codigo do Documento","NE")
       EndIf 
        
       If Field()="Codigo da Empresa"         
          Then Seleciona_Opcoes("Empresas","CR")
       Endif  
  Case Retval="DEL":
       If [Sistema Gerador]<>"MA"
          Then Mensagem("ExclusÆo nÆo permitida para registros importados!") 
          Else If CHAVE=0 
                  Then If [LoteQuantidade]=[LoteSaldo]
                          Then If QuerExcluir("")
                                  Then Grava_LogEx("SdLote")
                                       DEL
                                       QuitLoop
                               EndIf
                          Else Mensagem("ExclusÆo nÆo permitida para registros com quantidade diferente do saldo!")
                       EndIf       
               EndIf
       EndIf
  Case Retval="ESC":
       Switch
         Case Field()="Codigo da Empresa" Or Field()="Flag" Or (Field()="LoteNumero" And CHAVE=0): 
              If Field()="Flag" 
                 Then CHAVE=9
                      QuitLoop
                 Else If QuerDesfazer("")
                         Then If CHAVE=1
                                 Then DEL
                              EndIf
                              CHAVE=9
                              QuitLoop
                      EndIf
              EndIf
         Case Field()="Codigo do Item"      : Moveto [Codigo da Empresa]
         Case Field()="LoteNumero"          : Moveto [Codigo do Item]   
         Case Field()="LoteDataFabricacao"  : Moveto [LoteNumero]
         Case Field()="LoteDataValidade"    : Moveto [LoteDataFabricacao]
         Case Field()="Codigo do Documento" : Moveto [LoteDataValidade]
        ;Case Field()="Tipo do Documento"   : Moveto []
        ;Case Field()="Serie do Documento"  : Moveto []
         Case Field()="Numero do Documento" : Moveto [Codigo do Documento]
         Case Field()="Chave_Acesso_NFe"    : Moveto [Codigo do Documento]
         Case Field()="Data de Entrada"     : Moveto [Codigo do Documento]
         Case Field()="Codigo"              : Moveto [Data de Entrada]
         Case Field()="LoteQuantidade"      : Moveto [Codigo]                            
         OtherWise:
              Left
       EndSwitch
  Case Retval="ENTER":
       If IsBlank([])
          Then If Field()="Codigo da Empresa"   Or
                  Field()="Codigo do Item"      Or
                  Field()="Codigo do Documento" Or
                  Field()="Numero do Documento" Or
                  Field()="Codigo"              Or
                  Field()="LoteNumero"          Or            
                  Field()="LoteDataFabricacao"  Or
                  Field()="LoteDataValidade"    Or
                  Field()="LoteQuantidade"      
                  Then Loop
             EndIf
             Switch
               Case Field()="Chave_Acesso_NFe" : FastMSg("Informe Chave de Acesso, OBRIGATORIO!")
                                                 Loop
             EndSwitch 
       EndIf    
       Switch       
         Case Field()="Codigo da Empresa" :
            If Not Checa_Opcoes("Empresas",[])
               Then Mensagem("Empresa inv lida !")
                    Loop     
               Else Carrega_Variaveis()
                    Moveto [Codigo do Item]     
            EndIf
         Case Field()="Codigo do Item" :
              If Not IsBlank([])
                 Then Carrega_Variaveis()
                      Moveto [LoteNumero]     
              EndIf
         Case Field()="LoteNumero"          : 
              If CHAVE=1
                 Then MSG = ""
                      CopyToArray REGISTRO
                      PickForm "1"
                      Home
                      Moveto [Codigo do Item]
                      Locate REGISTRO["Codigo do Item"]
                      If RetVal
                         Then While [Codigo do Item] = REGISTRO["Codigo do Item"]
                                If [Codigo da Empresa] = REGISTRO["Codigo da Empresa"] And
                                   [LoteNumero] = REGISTRO["LoteNumero"] And
                                   [Numero do Lancamento] <> REGISTRO["Numero do Lancamento"]
                                   Then MSG = "Item "+[Codigo do Item]+" referente ao lote "+[LoteNumero]+" foi localizado no lan‡amento "+StrVal([Numero do Lancamento])+"!"
                                        QuitLoop
                                EndIf
                                Skip
                                If Eot() Then QuitLoop EndIf
                                Locate Next REGISTRO["Codigo do Item"] 
                                If Not Retval Then QuitLoop EndIf
                              Endwhile
                      EndIf
                      Moveto [Numero do Lancamento]
                      Locate REGISTRO["Numero do Lancamento"]
                      PickForm "2"
                      Moveto Field "LoteNumero"
                      If MSG<>""
                         Then Mensagem(MSG)
                         Else Moveto [LoteDataFabricacao]
                      EndIf
                 Else Moveto [LoteDataFabricacao]        
              EndIf
         Case Field()="LoteDataFabricacao"  : Moveto [LoteDataValidade]
         Case Field()="LoteDataValidade"    : Moveto [Codigo do Documento]
         Case Field()="Codigo do Documento" :
              If Not Checa_Opcoes("Codigo do Documento",[])
                 Then [Tipo do Documento    ]=""
                      [Serie do Documento   ]=""
                      [SubSerie do Documento]=""
                      [Numero do Documento  ]=""
                      Mensagem("Codigo do Documento Inv lido !")
                      Loop
              EndIf  
              Switch
                Case [Codigo do Documento]="CT-E" Or
                     [Codigo do Documento]="NF-E" Or
                     [Codigo do Documento]="NFE0" Or
                     [Codigo do Documento]="NFE1" Or
                     [Codigo do Documento]="NFE2" Or
                     [Codigo do Documento]="NFE3" Or
                     [Codigo do Documento]="NFE9" Or
                     [Codigo do Documento]="NFAE" Or
                     [Codigo do Documento]="NFCE": Moveto [Chave_Acesso_NFe  ]
                OtherWise                        : Moveto [Serie do Documento]
              EndSwitch     
        ;Case Field()="Tipo do Documento"        : 
        ;Case Field()="Serie do Documento"       :
         Case Field()="Numero do Documento"      : Moveto [Data de Entrada]
         Case Field()="Chave_Acesso_NFe":
              Switch
                Case [Codigo do Documento]="CT-E" Or
                     [Codigo do Documento]="NF-E" Or
                     [Codigo do Documento]="NFE0" Or
                     [Codigo do Documento]="NFE1" Or
                     [Codigo do Documento]="NFE2" Or
                     [Codigo do Documento]="NFE3" Or
                     [Codigo do Documento]="NFAE" Or
                     [Codigo do Documento]="NFE9" Or
                     [Codigo do Documento]="NFCE":
                     If Len([Chave_Acesso_NFe])<44
                        Then Mensagem("A Chave de Acesso deve possuir 44 digitos! // //Corrigir !")
                             Loop
                     EndIf
                     [Numero do Documento]=StrVal(NumVal(SubStr([Chave_Acesso_NFe],26,09)))
                     If Len([Numero do Documento])<6
                        Then [Numero do Documento]=AlinhM([Numero do Documento],6)
                     EndIf
                     [Serie do Documento ]=StrVal(NumVal(SubStr([Chave_Acesso_NFe],23,03)))
                     Moveto [Data de Entrada]
                Case [Codigo do Documento]="NFAE" :
                     If Len([Chave_Acesso_NFe])<44
                        Then Mensagem("A Chave de Acesso deve possuir 44 digitos! // //Corrigir !")
                             Loop
                     EndIf   
                     Moveto [Serie do Documento]
                OtherWise:
                     If SubStr([Codigo do Documento],1,2)="CT"   
                        Then Moveto [Serie do Documento]
                        Else If CHAVE=1
                                Then Moveto [Serie do Documento]   
                             EndIf
                     EndIf
              EndSwitch
         Case Field()="Data de Entrada"          :
              If IsBlank([]) Then []=Today() EndIf
              Moveto [Codigo]
         Case Field()="Codigo"          :
              If CHAVE=1
                 Then If Cliente_Inativo()
                         Then Loop
                      EndIf   
              EndIf
              Moveto [LoteQuantidade]
         Case Field()="LoteQuantidade"  :
              If CHAVE=1
                 Then [LoteSaldo] = [LoteQuantidade] 
                      UnLockRecord
                 Else If LOTE_QUANTIDADE=[LoteSaldo] And LOTE_QUANTIDADE<>[LoteQuantidade]
                         Then [LoteSaldo] = [LoteQuantidade]
                              UnLockRecord 
                      EndIf     
              EndIf
              CHAVE=0
              Quitloop
         Case Field()="Flag"            :
              Quitloop     
         OtherWise                      : 
              Right
       EndSwitch
  EndSwitch
EndWhile

EndProc

;*******************************************************************************
;* Rotina para Digitacao da Cabeca                                             *
;*******************************************************************************
Proc Cliente_Inativo()

If Isblank([Codigo])
   Then Return False
EndIf   

GetRecord "\\Sistemas\\Cadastro\\Destinat" [Codigo] To CLIE_INATIVO 
If RetVal
   Then If CLIE_INATIVO["Inativo"]="S"
           Then Switch
                  Case CLIE_INATIVO["Tipo"]="F" : Mensagem("Fornecedor Inativo!") 
                  Case CLIE_INATIVO["Tipo"]="C" : Mensagem("Cliente Inativo!")
                  OtherWise                     : Mensagem("Cadasro Inativo!")            
                EndSwitch
                Return True     
        EndIf  
EndIf

Return False

EndProc ;Cliente_Inativo()

;*******************************************************************************
;* Rotina para Carregar Vari veis                                             *
;*******************************************************************************
Proc Carrega_Variaveis()

EMPRESA_DESCRICAO = ""
ITEM_DESCRICAO    = ""
If Not IsBlank([Codigo da Empresa])
   Then GetRecord "\\Sistemas\\Cadastro\\Empresas" [Codigo da Empresa] To REG_EMPRESA
        EMPRESA_DESCRICAO = REG_EMPRESA["Nome Fantasia Empresa"]
EndIf
If Not IsBlank([Codigo do Item])
   Then GetRecord "\\Sistemas\\Estoque\\Itens" [Codigo do Item] To REG_ITEM
        ITEM_DESCRICAO = REG_ITEM["Descricao do ITem"]
EndIf

EndProc ;Carrega_Variaveis()

;*******************************************************************************
;* Rotina para controlar Edicao do registro                                    *
;*******************************************************************************
Proc Controla_EdicaoC()
DIGITA()
              
Moveto "SdLote"
If RecordStatus("Locked") Then UnLockRecord EndIf         
If OPCAO_FORM="1"
   Then PickForm "1"
   Else PickForm "2"
EndIf
If RecordStatus("Locked") Then UnLockRecord EndIf         
EndProc

;*******************************************************************************
;* Rotina p/ Carregar Parƒmetros do Cliente                                    *
;*******************************************************************************
Proc Carrega_Parametros_Cliente()

If IsFile(PrivDir()+"SDLOTE.ini")
   Then LeiaINI(PrivDir()+"SDLOTE.ini","VSDGORDEM.S.1")
        Switch
          Case VSDGORDEM="CODIGO" : ORDENARPOR="CODIGO"
          Case VSDGORDEM="ID"     : ORDENARPOR="ID"
        EndSwitch   
   Else ORDENARPOR="ID"      
EndIf

EndProc ;Carrega_Parametros_Cliente()

;*******************************************************************************
;* Rotina Principal                                                            *
;*******************************************************************************
AutoLib="\\Sistemas\\Cadastro\\Bibliot,\\Sistemas\\Cadastro\\Bib_Show,\\Sistemas\\Cadastro\\Bib_Proc"
Sys_Valor()

If Not IsAssigned(SYS_EMPRESA_DEFAULT) Then SYS_EMPRESA_DEFAULT="0001" EndIf
If Not IsAssigned(SYS_CONTROLE_DIA)    Then SYS_CONTROLE_DIA=""        EndIf 
                   
Carrega_Parametros_Cliente()

CoEdit "SdLote"
PickForm "1"
OPCAO_FORM="1"

While True
  CHAVE()
  If CHAVE=9
     Then QuitLoop
  EndIf
  If CHAVE=5
     Then If OPCAO_FORM="1"
             Then PickForm "1"
             Else PickForm "2"
          EndIf
          Loop
  EndIf
  Controla_EdicaoC()
EndWhile
Do_It!
ClearAll

Release Vars All
Release Procs All