;** ExpedOF ********************************************************************
;*  Digitacao de Ordem de Expedicao - Ordem de Faturamento                     *
;*******************************************************************************
;Autor           : Vise Informatica (VISERP)
;Desenvolvido  em: 30/01/2017 por Bruno Carvalho
;Ultima Alteracao: 29/12/2016 por Bruno Carvalho                          
;Motivo Alteracao: Adicionado bloqueio de rotina para usuario nao liberado
;Ultima Alteracao: 24/01/2017 por Bruno Carvalho                          
;Motivo Alteracao: Ajustes liberar OF sem ser faturada                    
;Ultima Alteracao: 27/01/2017 por Anivel Augusto Rodrigues 
;Motivo Alteracao: Ajustes TG_REFERENCIA
;Ultima Alteracao: 30/01/2017 por Anivel Augusto Rodrigues  
;Motivo Alteracao: Ajustes novo fomr e CDBarras()
;Ultima Alteracao: 13/02/2017 por Anivel Augusto Rodrigues  
;Motivo Alteracao: Ajustes item da OE, Ler_CDBarras3()
;Ultima Alteracao: 16/02/2017 por Anivel Augusto Rodrigues  
;Motivo Alteracao: Ajustes poder cancelar expedi‡Æo      
;Ultima Alteracao: 05/04/2017 por Bruno Carvalho     
;Motivo Alteracao: Adicionado Pedido e Nota de Entrada p/ Expedi‡Æo dos Itens
;Ultima Alteracao: 05/04/2017 por Bruno Carvalho  
;Motivo Alteracao: Adicionado op‡Æo "F4" para informar volumes
;Ultima Alteracao: 10/04/2017 por Bruno Carvalho  
;Motivo Alteracao: Ajustes p/ quando unidade do item for KG bloquear unidade acima do permitido, desbloqueio com senha
;Ultima Alteracao: 24/04/2017 por Bruno Carvalho  
;Motivo Alteracao: Ajustes no bloqueio da quantidade se item for KG
;Ultima Alteracao: 26/04/2017 por Bruno Carvalho  
;Motivo Alteracao: Ajustes ao verificar itens do pedido faturado
;Ultima Alteracao: 03/05/2017 por Bruno Carvalho  
;Motivo Alteracao: Ajustes na Tecla="F4" -> Permitir tamb‚m o numero RETVAL equivalente -62
;Ultima Alteracao: 03/05/2017 por Bruno Carvalho  
;Motivo Alteracao: Adicionado PARAM_PEDIDO_POREXPED p/ permitir apenas um pedido por expedi‡Æo
;Ultima Alteracao: 12/05/2017 por Bruno Carvalho  
;Motivo Alteracao: Ajustes #0377# ao editar um item "KG"
;Ultima Alteracao: 24/05/2017 por Bruno Carvalho
;Motivo Alteracao: Adicionado processo p/ buscar c¢digo de barra na "Iten_Bar" -> Codigo_Barras2()    
;Ultima Alteracao: 29/05/2017 por Bruno Carvalho
;Motivo Alteracao: Ajustes ao informar um item do tipo "KG" pelo op‡Æo "F2" 
;Ultima Alteracao: 31/05/2017 por Anivel Augusto Rodrigues  
;Motivo Alteracao: Ajustes bloqueio de OF j  faturada ou com expedi‡Æo definida
;Ultima Alteracao: 02/06/2017 por Bruno Carvalho  
;Motivo Alteracao: Adicionado "Destinat" na proc Carrega_Tabelas() p/ evitar erros saindo aleatoriamente
;Ultima Alteracao: 06/06/2017 por Rafael Matos
;Motivo Alteracao: Ajustes na hora de puxar Pedido, NE, OF ou Documento
;Ultima Alteracao: 06/06/2017 por Bruno Carvalho
;Motivo Alteracao: Carrega_Tabelas(), verifica se ExpedOfC esta vazia para limitar casas decimais 
;Ultima Alteracao: 06/06/2017 por Bruno Carvalho
;Motivo Alteracao: Ajsutes CDBarras() #0377# ao incluir o item pelo codigo de barras, bloqueio se qtd diferente da regra 
;Ultima Alteracao: 16/06/2017 por Bruno Carvalho
;Motivo Alteracao: Adicionado processo p/ incluir itens caso nÆo seja informado pedido, nota de entrada, of ou documento
;Ultima Alteracao: 11/07/2017 por Bruno Carvalho  
;Motivo Alteracao: Adicionado p/ #0345# PARAM_PEDIDO_POREXPED p/ permitir apenas um pedido por expedi‡Æo conforme ‚ feito para o #0388# 
;Ultima Alteracao: 18/10/2017 por Bruno Carvalho  
;Motivo Alteracao: Ajustes PARAM_INCLUI_ITEM ao realizar uma expedi‡Æo de pedido, permitindo faturamento de item fora do pedido
;Ultima Alteracao: 07/06/2018 por Bruno Carvalho
;Motivo Alteracao: Adicionado/ajustado Grava_LogEx() p/ gravar log de erros ao excluir registros
;Ultima Alteracao: 28/06/2018 por Bruno Carvalho
;Motivo Alteracao: Ajustado proc EXCLUSAO p/ nÆo gerar log de itens excluidos quando for excluir a cabe‡a do registro
;Ultima Alteracao: 18/07/2018 por Bruno Carvalho  
;Motivo Alteracao: Adicionado p/ #0419# PARAM_PEDIDO_POREXPED p/ permitir apenas um pedido por expedi‡Æo conforme ‚ feito para o #0388# 
;Ultima Alteracao: 04/09/2018 por Bruno Carvalho  
;Motivo Alteracao: Ajustes no SEQIT CDBarras() ao lan‡ar um item, a sequˆncia nÆo estava sendo criada
;Ultima Alteracao: 28/12/2018 por Anivel Augusto Rodrigues                           
;Motivo Alteracao: Adicionado processos de #0427#
;Ultima Alteracao: 16/01/2019 por Bruno Carvalho                           
;Motivo Alteracao: Adicionado op‡Æo "F7" para usuario escolher a balan‡a "1" ou "2" #0377#, escolha armazenada no privdir do usu rio -> Balanca()
;Ultima Alteracao: 30/05/2019 por Bruno Carvalho
;Motivo Alteracao: Ajustado processo para localizar codbar da proc CDBarras() 
;Ultima Alteracao: 05/06/2019 por Bruno Carvalho
;Motivo Alteracao: Adicionado ABA [Volumes]
;Ultima Alteracao: 05/06/2019 por Bruno Carvalho
;Motivo Alteracao: Alterado e ajustado tabela "ExpedOfC" p/ "ExpedC"

;*******************************************************************************
;* Rotina para Controlar Chave da Ordem de Expedicao                           *
;*******************************************************************************
Proc CHAVEC()
FACA_DIGITAC=True
FACA_CHAVEI =True
INICIO_PAGINA=True

While True
  Moveto "ExpedC"
  Moveto [Numero da OE]
  End
  Moveto [Numero da OE]
  ORDEXP=[Numero da OE]

  If OPCAO_FORM=FORMRELACAO
    Then Down
    Else PgDn 
  EndIf
  Moveto [Numero da OE]

  SetaCorRegistro("Editar")
  While True

  TECLA=""
  AguardaTeclasPadrao()

  Switch
    Case RetVal=-33 : SemFuncoes()
    Case RetVal=-94 : MsgTeclasPadrao()
    Case RetVal="F3":
         If OPCAO_FORM=FORMRELACAO
            Then OPCAO_FORM=FORMMANUTENCAO
            Else OPCAO_FORM=FORMRELACAO
         EndIf
         Del
         CHAVEC=5
         Return
    Case RetVal="F7" Or RetVal="UP" Or RetVal="PGUP" Or RetVal="HOME":
         Del
         While True
           If OPCAO_FORM=FORMRELACAO
              Then PAGINA("ExpedC","MR")
              Else PAGINA("ExpedC","MT")
           EndIf
           INICIO_PAGINA=True
           ORDFAT=[Numero da OE]
           Switch
             Case EDITAR="S":
                  PickForm FORMMANUTENCAO
                  Echo Normal
                  Echo Off
                  If Checa_Controle([Numero_Controle_Dia])
                     Then CHAVEC=0
                          FACA_DIGITAC=True
                          FACA_CHAVEI =True
                          INICIO_PAGINA=True

                          ORDEXP=[Numero da OE]
                          SetaCorRegistro("Padrao")
                          Controla_EdicaoC()
                     Else UnLockRecord
                  EndIf
             Case EXCLUIR="S":
                  PickForm FORMMANUTENCAO
                  Echo Normal
                  Echo Off
                  If Checa_Controle([Numero_Controle_Dia]) And
                     (IsBlank([Codigo da Empresa]) Or Carrega_Parametros())
                     Then If [Situacao da OE]="FATURADO" or [Situacao da OE]="CANCELADA" or [Situacao da OE]="LIBERADA" 
                             Then Mensagem("Esta Ordem de Expedi‡„o n„o pode ser excluida !// J  foi "+[Situacao da OE]+" !")
                                  UnLockRecord
                             Else If Verifica_Sistema_Gerador("EXCLUSAO")
                                     Then If QuerExcluir("")
                                             Then GRAVA_LOG=True
                                                  EXCLUSAO_C()
                                             Else UnLockRecord     
                                          EndIf   
                                     Else UnLockRecord
                                  EndIf
                          EndIf
                     Else UnLockRecord
                  EndIf
             OtherWise: QuitLoop
           EndSwitch
           If OPCAO_FORM=FORMMANUTENCAO
              Then PickForm FORMMANUTENCAO
              Else PickForm FORMRELACAO
           EndIf
           SetaPosForm()
         EndWhile
         QuitLoop
    Case Retval="ESC":
         CHAVEC=9
         Del
         Return
    Case Retval="ENTER":
         If Numero_Lancamento("","6")
            Then ORDEXP = PROXLANCTO_NLANC
                 Release Vars PROXLANCTO_NLANC    
            Else QuitLoop
         EndIf
         PickForm FORMMANUTENCAO
         Moveto [Numero da OE]
         If PROXIMO_LANCTO_REG_ACHOU
            Then CHAVEC=0
                 If Checa_Controle([Numero_Controle_Dia])
                    Then Return
                 EndIf
            Else CHAVEC=1
                 If Checa_Controle(SYS_CONTROLE_DIA)
                    Then Return
                    Else OPCAO_FORM=FORMRELACAO 
                 EndIf
         EndIf  
         If CHAVEC=1
            Then Del
         EndIf
         If OPCAO_FORM=FORMRELACAO
            Then PickForm FORMRELACAO
         EndIf
         QuitLoop
    EndSwitch
  EndWhile
EndWhile

EndProc   ; (ChaveC)

;*******************************************************************************
;* Rotina para Digitacao da Cabeca                                             *
;*******************************************************************************
Proc DIGITAC()
private msgtemp, noetemp, noftemp, nnetemp

Moveto "ExpedC"
If CHAVEC=0
   Then If Not Verifica_Sistema_Gerador("") 
           Then CHAVEC=9
                Return
        EndIf         
EndIf   

If INICIO_PAGINA
   Then If Not IsBlank(SYS_EMPRESA_DEFAULT) And CHAVEC=1
           Then [Codigo da Empresa]=SYS_EMPRESA_DEFAULT
        EndIf
        If Not IsBlank([Codigo da Empresa])
           Then If Not Carrega_Parametros()
                   Then If CHAVEC=1
                           Then Del
                        EndIf
                        CHAVEC=9
                        Return
                EndIf
        EndIf
        If [Situacao da OE]="FATURADO" Or
           [Situacao da OE]="CANCELADA"Or
           [Situacao da OE]="LIBERADA"
           Then MSG_T="Esta Ordem de Expedi‡„o j  foi "+[Situacao da OE]+" !//"
                Mensagem(MSG_T)
                If Not CHECA_SUPERVISOR()
                   Then CHAVEC=9
                        Return
                EndIf
        EndIf
        If Not IsFile(PrivDir()+"log_bal.Txt") And SYS_CODIGO_CLIENTE="0377"
           Then Balanca()
        EndIf
EndIf

If CHAVEC=0 Or Not INICIO_PAGINA
   Then Carrega_Parametros()
        Return
   Else Moveto [Codigo da Empresa]
EndIf    

FACA_CHAVEI=True
INICIO_PAGINA=False

While True
  
  TECLA=" Esc=Retornar  "
  If Field()="Codigo da Empresa"   Or       
     Field()="Numero da OF"        Or
     Field()="Numero do Pedido"    Or
     Field()="Numero da NE"        Or
     Field()="Codigo do Documento" Or      
     Field()="Codigo"         
     Then TECLA=TECLA + "F1=Tabelas  "
  EndIf
  TECLA=TECLA+"F8=Observa‡„o  "
  
  MSGCAMPO=Field()
  If Field()="Razao Social"
     Then MSGCAMPO="Observa‡Æo"
  EndIf   
  
  If Field()="Flag" Then MSGCAMPO="Enter=Prosseguir" EndIf

  Prompt TECLA
  Wait Field
       Until "F1","ESC","ENTER","DEL","FIELDVIEW","F8","F35"
  
  Switch
  Case RetVal="F1":
       If Field()="Codigo da Empresa"   Or
          Field()="Numero da OF"        Or
          Field()="Numero do Pedido"    Or
          Field()="Numero da NE"        Or
          Field()="Codigo do Documento" Or              
          Field()="Codigo"         
          Then CONSULTAF1()
        EndIf
  Case Retval="F8":
       CampoAnterior=Field()
       Edita_Memo("Observacao",10,01,13,76,"Observa‡”es")
       Moveto Field CampoAnterior
  Case Retval="FIELDVIEW" or Retval="F35":
       EDITFIELD()
  Case Retval="DEL":
       If CHAVEC=0
          Then If Verifica_Sistema_Gerador("EXCLUSAO")
                  Then If QuerExcluir("")
                          Then GRAVA_LOG=True
                               EXCLUSAO_C()
                               CHAVEC=9
                               QuitLoop
                       EndIf
               EndIf
       EndIf
  Case Retval="ESC":
       Switch
       Case Field()="Codigo da Empresa"  :   
            If QuerDesfazer("")
               Then EXCLUSAO_C()
                    CHAVEC=9
                    QuitLoop
            Endif      
       Case Field()="Numero do Pedido"   : Moveto [Codigo da Empresa]   
       Case Field()="Numero da OF"       : If [Numero da OF]=""
                                              Then Moveto [Numero do Pedido]
                                              Else Moveto [Codigo da Empresa]
                                           EndIf                                    
       Case Field()="Numero da NE"       : If [Numero da OF]=""
                                              Then Moveto [Numero da OF]
                                              Else Moveto [Codigo da Empresa]
                                           EndIf   
       Case Field()="Codigo do Documento": If [Numero da NE]=""
                                              Then Moveto [Numero da NE]
                                              Else Moveto [Codigo da Empresa]
                                           EndIf   
       Case Field()="Numero do Documento": Moveto [Codigo do Documento]
       Case Field()="Flag":
            If CHAVEC=1
               Then If [Numero da OF]<>""
                       Then Moveto [Numero da OF]
                       Else Moveto [Codigo do Documento]
                    EndIf   
               Else If QuerDesfazer("")
                       Then Undo
                            CHAVEC=9
                            QuitLoop
                    EndIf
            EndIf
       Case Field()="Codigo"      : If [Numero da OF]<>""
                                       Then Moveto [Numero da OF]
                                       Else Moveto [Codigo do Documento]
                                    EndIf
       Case Field()="Razao Social": Moveto [Codigo]
       OtherWise                  : Left
       EndSwitch       
  Case Retval="ENTER":
       Switch
       Case Field()="Codigo da Empresa":
            If IsBlank([]) 
               Then If Not IsBlank(SYS_EMPRESA_DEFAULT)
                       Then [Codigo da Empresa]=SYS_EMPRESA_DEFAULT
                    EndIf
            EndIf
            If IsBlank([]) Then Loop EndIf 
            If Not IsBlank([Codigo da Empresa])
               Then If Not Carrega_Parametros()
                       Then Loop
                    EndIf
            EndIf
            
            Switch     
             Case [Numero do Pedido]<>""    : Moveto [Numero do Pedido]  
             Case [Numero da OF]<>""        : Moveto [Numero da OF]                            
             Case [Numero da NE]<>""        : Moveto [Numero da NE]
             Case [Codigo do Documento]<>"" : Moveto [Codigo do Documento]
             OtherWise                      : Moveto [Numero do Pedido]  
            EndSwitch
            
       Case Field()="Numero do Pedido" :
            If Not IsBlank([])
               Then [Codigo do Documento]=""
                    [Tipo do Documento  ]=""
                    [Serie do Documento ]=""
                    [Numero do Documento]=""
                    [Numero da OF       ]=""
                    [Numero da NE       ]=""
                    If CHAVEC=1
                       Then ACHOU_OE="" 
                            NPED = [Numero do Pedido]
                            Moveto "ExpedC"
                            UnLockRecord
                            FormKey
                            Moveto [Numero do Pedido]
                            Locate NPED
                            If RetVal
                               Then While True
                                      If ORDEXP<>[Numero da OE] and [Situacao da OE]<>"CANCELADA"
                                         Then ACHOU_OE=[Numero da OE]
                                              QuitLoop
                                      EndIf
                                      Skip
                                      If Eot() Then QuitLoop EndIf
                                      Locate Next NPED
                                      If Not RetVal
                                         Then QuitLoop
                                      EndIf   
                                    EndWhile
                            EndIf                                       
                            Moveto "ExpedC"
                            Moveto [Numero da OE]
                            Locate ORDEXP
                            FormKey
                            IsLockRecord()
                            Moveto [Numero do Pedido]
                            If ACHOU_OE<>""
                               Then If PARAM_PEDIDO_POREXPED
                                       Then Mensagem("Pedido "+[Numero do Pedido]+" foi localizado na Expedi‡„o "+ACHOU_OE+"!")
                                            Loop
                                       Else ConfGeral("Pedido "+[Numero do Pedido]+" foi localizado na Expedi‡„o "+ACHOU_OE+"! Deseja Continuar?")
                                            If OK<>"S"
                                               Then Loop
                                            EndIf
                                    EndIf             
                            EndIf   
                            GetRecord "\\Sistemas\\Vendas\\PedidoC" [Numero do Pedido] To REG_PEDIDO
                            If RetVal
                               Then If [Codigo da Empresa] <> REG_PEDIDO["Codigo da Empresa"]
                                       Then Mensagem("Empresa "+[Codigo da Empresa]+" difere da empresa do Pedido "+REG_PEDIDO["Codigo da Empresa"]+"!")
                                            Loop
                                    EndIf   
                               Else Mensagem("Pedido "+[Numero do Pedido]+" inv lido! ")  
                                    Loop
                            EndIf
                            
                            If REG_PEDIDO["Situacao do Pedido"]<>"ABERTO"
                               Then Mensagem("Pedido "+REG_PEDIDO["Situacao do Pedido"]+"!")
                                    Loop
                            Endif   
                            
                            [Codigo                ]=REG_PEDIDO["Codigo"]
                            [Nome Fantasia EmitDest]=REG_PEDIDO["Nome Fantasia EmitDest"]
                            Release Vars REG_PEDIDO
                    EndIf
                    QuitLoop
               Else Moveto [Numero da OF]      
            EndIf          
       Case Field()="Numero da OF":
            If Not IsBlank([])
               Then [Codigo do Documento]=""
                    [Tipo do Documento  ]=""
                    [Serie do Documento ]=""
                    [Numero do Documento]=""
                    [Numero do Pedido   ]=""
                    [Numero da NE       ]=""
                    If CHAVEC=1
                       Then GetRecord "\\Sistemas\\Vendas\\FaturaC" [Numero da OF] To REG_FATURA
                            If RetVal
                               Then If [Codigo da Empresa] <> REG_FATURA["Codigo da Empresa"]
                                       Then Mensagem("Empresa "+[Codigo da Empresa]+" difere da empresa da fatura "+REG_FATURA["Codigo da Empresa"]+"!")
                                            Loop
                                    EndIf   
                                    if REG_FATURA["Numero Nota Gerada"]<>""
                                       Then msgtemp=        "OF j  Faturada !// //"
                                            msgtemp=msgtemp+Format("W30,AL","Documento: "+REG_FATURA["Docto Nota Gerada"]+"/"+
                                                                          REG_FATURA["Numero Nota Gerada"]+"/"+
                                                                          REG_FATURA["Serie Nota Gerada" ])+"// //"
                                            msgtemp=msgtemp+Format("W30,AL","Expedi‡Æo: "+REG_FATURA["Origem da Expedicao"]+"/"+
                                                                          REG_FATURA["Numero da Expedicao"])
                                            Mensagem(msgtemp)
                                            Loop
                                       else
                                            if REG_FATURA["Numero da Expedicao"]<>""
                                               Then msgtemp=        "OF com Expedi‡Æo j  definida !// //"
                                                    msgtemp=msgtemp+Foramt("W30,AL","Expedi‡Æo: "+REG_FATURA["Origem da Expedicao"]+"/"+
                                                                                  REG_FATURA["Numero da Expedicao"])
                                                    Mensagem(msgtemp)
                                                    Loop
                                            EndIf   
                                    EndIf   
                                    
                               Else Mensagem("Ordem de Faturamento "+[Numero da OF]+" inv lida! ")  
                                    Loop
                            EndIf
                            
                            [Codigo                ]=REG_FATURA["Codigo"]
                            [Nome Fantasia EmitDest]=REG_FATURA["Nome Fantasia EmitDest"]
                            Release Vars REG_FATURA
                            
                            noetemp=[Numero da OE]
                            noftemp=[Numero da OF]
                            msgtemp=""
                            
                            UnLockRecord
                            Moveto [Numero da OF]
                            Locate noftemp
                            if retval
                               then
                                    While [Numero da OF]=noftemp
                                    
                                      if [Situacao da OE]<>"CANCELADA" and [Numero da OE]<>noetemp
                                          then msgtemp=        "OF "+noftemp+" informada j  utilizada !// //"
                                               msgtemp=msgtemp+"Expedi‡Æo: "+[Numero da OE]+" - "+[Situacao da OE]
                                               quitloop
                                      endif
                                      skip
                                      if eot() then quitloop endif
                                      
                                      locate next noftemp
                                      If Not Retval Then QuitLoop EndIF                                      
                                    endwhile
                            endif

                            moveto [Numero da OE]
                            Locate noetemp
                            if not retval
                               then CHAVEC=9
                                    Return
                               else
                                    moveto [Numero da OF]
                                    If IsLockRecord()
                                       then CHAVEC=9
                                            Return
                                       else
                                            if msgtemp<>""
                                               then Mensagem(msgtemp)
                                                    Loop
                                            endif
                                    endif
                            endif
                    EndIf

                    QuitLoop
               Else Moveto [Numero da NE]      
            EndIf
       Case Field()="Numero da NE":
          If Not IsBlank([])
               Then [Codigo do Documento]=""
                    [Tipo do Documento  ]=""
                    [Serie do Documento ]=""
                    [Numero do Documento]=""
                    [Numero do Pedido   ]=""
                    [Numero da OF       ]=""
                    If CHAVEC=1
                       Then GetRecord "\\Sistemas\\Estoque\\NotaEC" [Numero da NE] To REG_NOTAENTRADA
                            If RetVal
                               Then If [Codigo da Empresa] <> REG_NOTAENTRADA["Codigo da Empresa"]
                                       Then Mensagem("Empresa "+[Codigo da Empresa]+" difere da empresa da nota de entrada "+REG_NOTAENTRADA["Codigo da Empresa"]+"!")
                                            Loop
                                    EndIf   
                               Else Mensagem("Nota de Entrada "+[Numero da NE]+" inv lida! ")  
                                    Loop
                            EndIf
                            [Codigo                ]=REG_NOTAENTRADA["Codigo"]
                            [Nome Fantasia EmitDest]=REG_NOTAENTRADA["Nome Fantasia EmitDest"]
                            Release Vars REG_NOTAENTRADA
                            
                            noetemp=[Numero da OE]
                            nnetemp=[Numero da NE]
                            msgtemp=""
                            
                            UnLockRecord
                            Moveto [Numero da NE]
                            Locate nnetemp
                            if retval
                               then
                                    While [Numero da NE]=nnetemp
                                    
                                      If [Situacao da OE]<>"CANCELADA" and [Numero da OE]<>noetemp
                                          Then msgtemp=        "NE "+nnetemp+" informada j  utilizada !// //"
                                               msgtemp=msgtemp+"Expedi‡Æo: "+[Numero da OE]+" - "+[Situacao da OE]
                                               quitloop
                                      Endif
                                      skip
                                      If eot() then quitloop endif
                                      locate next nnetemp
                                      If Not Retval Then QuitLoop EndIF                                      
                                    EndWhile
                            EndIf

                            moveto [Numero da OE]
                            Locate noetemp
                            if not retval
                               then CHAVEC=9
                                    Return
                               else
                                    moveto [Numero da NE]
                                    If IsLockRecord()
                                       then CHAVEC=9
                                            Return
                                       else
                                            if msgtemp<>""
                                               then Mensagem(msgtemp)
                                                    Loop
                                            endif
                                    endif
                            endif
                    EndIf
                    QuitLoop
               Else Moveto [Codigo do Documento]                                                                                                                                                                   
            EndIf            
       Case Field()="Codigo do Documento":
               If IsBlank([])  
                  Then [Tipo do Documento  ]=""
                       [Serie do Documento ]=""
                       [Numero do Documento]=""
                      ;FastMsg("Codigo do Documento Inv lido!")
                       Sequencia=0
                       Moveto [Codigo]
                  Else Moveto [Numero do Documento]
               EndIf               
          Case Field()="Numero do Documento": 
               If Not IsBlank([]) 
                  Then If Len([Numero do Documento])<>6 Then [Numero do Documento]=AlinhM([Numero do Documento],6) EndIf
                       GetRecord "\\Sistemas\\Vendas\\NotaC" [Codigo da Empresa],[Numero do Documento],[Serie do Documento] To REG_NOTAC
                       If Not RetVal
                          Then Release Vars REG_NOTAC
                               FastMsg("Numero do Documento n„o localizado!")
                               Loop
                          Else If REG_NOTAC["Situacao"]="C" 
                                  Then  Mensagem("Situa‡Æo do Documento: CANCELADO !")
                                        Loop
                                       
                               EndIF        
                               [Codigo                ]=REG_NOTAC["Codigo"]
                               [Nome Fantasia EmitDest]=REG_NOTAC["Nome Fantasia EmitDest"]
                               Release Vars REG_NOTAC    
                               noetemp=[Numero da OE]
                               ndctemp=[Numero do Documento]
                               sdctemp=[Serie do Documento ]
                               msgtemp=""
                               
                               UnLockRecord
                               Moveto [Numero do documento]
                               Locate ndctemp
                               if retval
                                  then
                                       While [Numero do Documento]=ndctemp
                                         If [Serie do Documento]=sdctemp and [Situacao da OE]<>"CANCELADA" and [Numero da OE]<>noetemp
                                             Then msgtemp=        "Documento "+ndctemp+" informado j  utilizado !// //"
                                                  msgtemp=msgtemp+"Expedi‡Æo: "+[Numero da OE]+" - "+[Situacao da OE]
                                                  quitloop
                                         Endif
                                         skip
                                         If eot() then quitloop endif
                                         
                                         locate next ndctemp
                                         If Not Retval Then QuitLoop EndIF
                                       EndWhile
                               EndIf
                               
                               moveto [Numero da OE]
                               Locate noetemp
                               if not retval
                                  then CHAVEC=9
                                       Return
                                  else
                                       moveto [Numero do Documento]
                                       If IsLockRecord()
                                          then CHAVEC=9
                                               Return
                                          else
                                               if msgtemp<>""
                                                  then Mensagem(msgtemp)
                                                       Loop
                                               endif
                                       endif
                               endif
                       EndIf  
                       QuitLoop
                  Else Mensagem("Numero do Documento Invalido !")                                                                                                                                                     
               EndIf            
       Case Field()="Flag"  : QuitLoop                           
       Case Field()="Codigo":
            If Not IsBlank([])
               Then QuitLoop
            EndIf   
       ;Case Field()="Razao Social":
       ;     QuitLoop
       OtherWise:
            Right
       EndSwitch
  EndSwitch
EndWhile

EndProc  ;(DigitaC)

;*******************************************************************************
;* Rotina para Localizar Item                                                  *
;*******************************************************************************
Proc ChaveI()   

FACA_CHAVEV = False

Moveto "ExpedC"
SetaCorRegistro("Padrao")

Moveto "ExpedOfI"
;---- Sequencia p/ inclusÆo de itens -------------------------------------------
If CHAVEC=0                     And
   IsBlank([ExpedC->Numero do Pedido   ]) And
   IsBlank([ExpedC->Numero da OF       ]) And
   IsBlank([ExpedC->Numero da NE       ]) And
   IsBlank([ExpedC->Codigo do Documento])
   Then End
        Sequencia = [Item da OE]
        If IsBlank(Sequencia)
           Then Sequencia = 0
        EndIF   
EndIf   

While True
  Calc_Itens()

  Moveto [Item da OE]
  End
  Down

  SetaCorRegistro("Editar")
  While True
    TECLA=" PgDn=Finalizar  "
    MSGCAMPO=""
    AguardaTeclasPadraoIt2()

    If RetVal=-33
       Then Echo Normal
            Echo Off
            ShowPopup " Fun‡”es " CENTERED
              "F2  ~A~tiva lan‡amentos   " : " Ativa lan‡amentos                              " : "F2",
              "F4  ~V~olume              " : " Volume                                         " : "F4",
              "F5  ~R~ecarregar OF/Nota  " : " Recarregar itens da OF/Nota                    " : "F5",
              "F6  ~I~mprimir            " : " Imprimir Rela‡„o de Itens                      " : "F6",
              "F7  ~B~alan‡a             " : " Altera a Balan‡a                               " : "F7",
              "F8  ~O~serva‡äes          " : " Observa‡äess                                   " : "F8",
              "F11 ~L~iberar Ordem       " : " Ordem de Expedi‡„o LIBERADA                    " : "F11",
              "F12 Ca~n~celar Ordem      " : " Ordem de Expedi‡„o CANCELADA                   " : "F12",
              Separator,
              "~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 = -115 Or RetVal = -116:
         Del
         FACA_CHAVEV = True
         CHAVEI      = 9
         Return    
    Case RetVal="F1":
         If Field()="Codigo do Item"         
            Then CONSULTAF1()
         endif
    Case Retval="F2":
         Del
         CDBarras()
         QuitLoop   
    Case Retval="F4" Or RetVal=-62:
         Del
         FACA_CHAVEV=True
         CHAVEI     = 9
         Return
    Case Retval="F5":
         Del
         Carrega_Itens()
         QuitLoop
    Case RetVal="F6" :
         Del
         If IMPRIME()
            Then FACA_CHAVEI =False
                 FACA_DIGITAC=False
                 CHAVEI=9
                 Return
                 Quitloop
            Else Quitloop 
         EndIf
    Case Retval="F7":
         Del
         If SYS_CODIGO_CLIENTE<>"0377"
            Then Mensagem("NÆo ‚ poss¡vel acessar essa fun‡Æo.//Verificar com o Suporte T‚cnico VISE INFORMATICA!")
            Else Balanca()
         EndIf
         QuitLoop
    Case Retval="F8":
         Del
         Observacao()
         QuitLoop   

    Case Retval="F11" or retval=-133:
         Del
         If RecordStatus("New")=True
            Then MENSAGEM("A Ordem de Expedi‡„o deve ter pelo menos 1(um) Item Ok !")
                 QuitLoop
         EndIf
         LIBERA_OE = True
         If Not Usuario()
            Then Release Vars LIBERA_OE
                 QuitLoop
         EndIf
         
         Release Vars LIBERA_OE
         Moveto "ExpedC"
         [ExpedC->Situacao da OE]="LIBERADO"
         
         If SYS_CODIGO_CLIENTE="0377"
            Then Controle_Dia_Liberacao()
         EndIf   
         [Data_Liberacao]=Today()
         [Hora_Liberacao]=Time()
         
         Moveto "ExpedOFI"
         FACA_CHAVEI =False
         FACA_DIGITAC=False
         CHAVEI=9
         Return
         
    Case Retval="F12" or retval=-134:
         Del
         If RecordStatus("New")=True
            Then MENSAGEM("A Ordem de Expedi‡„o deve ter pelo menos 1(um) Item Ok !")
                 QuitLoop
         EndIf
         
         If not ConfGeral("Confirma CANCELAR esta Ordem de Expedi‡Æo ?")
            then QuitLoop
         endif   
         
         Moveto "ExpedC"
         [ExpedC->Situacao da OE]="CANCELADA"
         [Data_Liberacao]=Today()
         [Hora_Liberacao]=Time()
         
         Moveto "ExpedOFI"
         FACA_CHAVEI =False
         FACA_DIGITAC=False
         CHAVEI=9
         Return
         
    Case Retval="PGDN":
         Del
         If RecordStatus("New")=True
            Then MENSAGEM("A Ordem de Expedi‡„o deve ter pelo menos 1(um) Item Ok !")
                 Loop
         EndIf
         FACA_CHAVEV =False
         FACA_CHAVEI =False
         FACA_DIGITAC=False
         CHAVEI=9
         Return
    Case RetVal="F7" Or RetVal="UP" Or RetVal="PGUP" Or RetVal="HOME": 
         While True
           PAGINA("ExpedOfI","MR")
           If EDITAR="S"
              Then CHAVEI=0
                   switch
                     case TECLAPAGINA="ENTER" and sys_Codigo_Cliente="0377" :                                                                                                                                       
                        ;Processo comentado em 11/05/2017, pois Karina informou que toda altera‡Æo quando KG ‚ 
                        ;parar ser blooqueada independente do valor infomado.
                        Faz_Processo=True        
                        If [Quantidade_OF]>0 And [Unidade Fiscal]="KG"
                           Then If Not Usuario()
                                   Then Faz_Processo=False   
                                EndIf   
                        EndIf                         
                        If Faz_Processo And Ler_CDBarras3(22,00)
                           Then If [Unidade Fiscal]="KG" 
                                   Then If ([Quantidade_OF]>0 And Dados_QTD-([Quantidade_OF]+[Quantidade_Expedida])>1) Or 
                                           ([Quantidade_OF]>0 And Dados_QTD-([Quantidade_OF]+[Quantidade_Expedida])<-1)
                                           Then ConfGeral(Completa("Quantidade excede o limite permitido!",60," ")+"//"+
                                                          Completa("Continuar a informar a quantidade "+Strval(Dados_QTD)+" para o item "+[Codigo do Item]+"?",60," "))
                                                If Ok<>"S"                                                          
                                                   Then Faz_Processo=False
                                                EndIf 
                                        EndIf
                                EndIf
                                If Faz_Processo
                                   Then [Quantidade_Expedida ]=[Quantidade_Expedida]+Dados_QTD
              								          Acerta_Item()
                                        Calc_Itens()
                           
                                        unlockrecord
                                   Else QuitLoop     
                                EndIf        
                        endif   
                     otherwise                      :
                       fastmsg("Edi‡„o n„o permitida !")
                   endswitch
              
              Else If EXCLUIR="S" And [Quantidade_OF]<=0
                      Then If QuerExcluir("")
                              Then CHAVEI=8
                                   GRAVA_LOG=True
                                   EXCLUSAO_I()
                                   Release Vars GRAVA_LOG
                                   Calc_Itens()
                              Else UnLockRecord
                           EndIf
                      Else QuitLoop
                   EndIf
           EndIf
           SetaPosForm()
         EndWhile
         QuitLoop
         
    Case Retval="ESC":  
         Del
         If RecordStatus("New")=True
            Then If QuerExcluir("")
                    Then FACA_CHAVEV =False
                         FACA_CHAVEI =False
                         FACA_DIGITAC=False
                         CHAVEC=8
                    Else Loop
                 EndIf         
         EndIf   
         CHAVEI=9
         Return
         
   Case Retval="ENTER": 
        [Item da OE]=blanknum()
        
    EndSwitch
  EndWhile                  
EndWhile
EndProc   ; (ChaveI)

;*******************************************************************************
;* Rotina p/ gerenciar as balan‡as                                             *
;*******************************************************************************
Proc Balanca()

If SYS_CODIGO_CLIENTE<>"0377"
   Then Return True
EndIf
                 
Echo Normal
Echo Off
ShowPopup " Balan‡a " CENTERED
  "~1~ Balan‡a 1  " : " Definir Balan‡a: 1 " : "BAL1",
  "~2~ Balan‡a 2  " : " Definir Balan‡a: 2 " : "BAL2",
  Separator,
  "~C~ancelar     " : " Cancelar a Opera‡„o" : "Cancelar" 
EndMenu
To Opcaoc
Echo Off

If OPCAOC="Cancelar" or OPCAOC="Esc"
   Then Return False
   Else log_bal=PrivDir()+"log_bal.Txt"
        If IsFile(log_bal)
           Then Deleta_Arquivo(log_bal)
        EndIf
        MSG = ""
        Switch
          Case OPCAOC = "BAL1" : MSG = "Balan‡a 1 definida com sucesso!"
                                 FileWrite PrivDir()+"log_bal.txt" From GravaExpressao("BALANCA","S","1")
          Case OPCAOC = "BAL2" : MSG = "Balan‡a 2 definida com sucesso!"
                                 FileWrite PrivDir()+"log_bal.txt" From GravaExpressao("BALANCA","S","2")
        EndSwitch
        If MSG <> "" Then FastMsg(MSG) EndIf
EndIf
Return True

EndProc ;Balanca()

;*******************************************************************************
;* Rotina de Dialogo da Referencia                                             *
;*******************************************************************************
Proc Usuario()
Private TEMP

If Not Isassigned(LIBERA_OE) Then LIBERA_OE=False EndIf 

If SYS_CODIGO_CLIENTE<>"0377"
   Then Return True
EndIf   

TEMP           = False
VSDGSENHA      = ""
VSDGUSUARIO    = "" 
VSDGNOMUSUARIO = ""

While True
  ShowDialog "Permiss„o para Libera‡„o" Proc "SD_DialogUsuario"
  Trigger "OPEN","ARRIVE"
  Key "F1","ENTER","ESC","TAB",
    -104, -105, -106, -107, -108, -109, -110, -111, -112, -113, -139, -140,-68
    @ 09,14 height 04 width 52
     
    Label  @ 00,00 "Usu rio" for "TG_USUARIO"
    Accept @ 01,01 Width 7 "A4" picture "#*#" Tag "TG_USUARIO" to VSDGUSUARIO
    Accept @ 01,06 Width 33 "A30" picture "#*#" Tag "TG_NOMUSUARIO" to VSDGNOMUSUARIO

    Label  @ 00,39 "Senha" for "TG_SENHA"
    Accept @ 01,40 Width 9 "A6" picture "@*@" hidden Tag "TG_SENHA" to VSDGSENHA

  EndDialog
  If Not RetVal Then QuitLoop EndIf

  Switch
    Case IsBlank(VSDGUSUARIO) : Mensagem("Informe o Usu rio!")
                                Loop
    Case IsBlank(VSDGSENHA) :   Mensagem("Informe a senha do usu rio "+VSDGUSUARIO+"!")
                                Loop
  EndSwitch
  
  If Not IsBlank(VSDGSENHA)
     Then GetRecord "\\Sistemas\\Cadastro\\Usuarios" VSDGUSUARIO To REG_USUARIO
          If Not RetVal
             Then Mensagem("Usu rio/Senha incorreto!")
                  Loop
             Else If Not IsAssigned(LIBERA_OE) Or Not LIBERA_OE  
                     Then If REG_USUARIO["Nivel de Acesso"]<>"S" And REG_USUARIO["Nivel de Acesso"]<>"E"
                             Then Mensagem("Usu rio n„o ‚ supervisor!")
                                  Loop
                          EndIf        
                  EndIf   
          EndIf
          ENCRIPTASENHA(VSDGSENHA)
          If REG_USUARIO["Senha"]<>SENHAENC
             Then MENSAGEM("Senha Inv lida !")
                  Loop
          EndIf
  EndIf
  TEMP = True
  QuitLoop
EndWhile  
  
Return TEMP  
  
EndProc ;Usuario()

;*******************************************************************************
;* Controle de Dia                                                            *
;*******************************************************************************
Proc Controle_Dia_Liberacao()
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 [Codigo_Usuario     ] = VSDGUSUARIO
        [Data_Inclusao      ] = Today()
        [Hora_Inclusao      ] = Time()
        [Numero_Controle_Dia] = SYS_CONTROLE_DIA_MOD
   Else [Codigo_Usuario     ] = VSDGUSUARIO
        [Data_Inclusao      ] = Today()
        [Hora_Inclusao      ] = Time()
        [Numero_Controle_Dia] = SYS_CONTROLE_DIA
EndIf

EndProc ;Controle_Dia_Liberacao()   

;*******************************************************************************
;* Rotina                                                                      *
;*******************************************************************************
Proc SD_DialogUsuario(Disparo,Campo,Evento,Elemento)

Temp=True
TECLA    =""
MSGCAMPO=""

If Disparo="OPEN"  Then AoCriarShowDialog() EndIf
If Disparo="EVENT" And Evento["Type"]="KEY" Then
   Switch
     Case Evento["KeyCode"] =   9: Temp=False
     Case (Evento["KeyCode"] <= -104 And Evento["KeyCode"] >= -113) Or
           Evento["KeyCode"]  = -139 Or  Evento["KeyCode"]  = -140:
           SYS_TECLA_ACIONADA=Evento["KeyCode"]
           Seta_Tecla_Acionada()
           CancelDialog
     Case Evento["KeyCode"] =  27:
          Temp=False
          Switch
             Case Campo="TG_USUARIO"        : CancelDialog
             Case Campo="TG_SENHA"          : Campo="TG_USUARIO"   
          EndSwitch
     Case Evento["KeyCode"] = 13:
          Temp=False
          Switch
             Case Campo="TG_USUARIO"       : 
                  VSDGUSUARIO=ControlValue("TG_USUARIO")
                  If Not IsBlank(VSDGUSUARIO)
                     Then VSDGUSUARIO=AlinhM(VSDGUSUARIO,4)
                          If Verifica_Usuario(VSDGUSUARIO)
                             Then Campo="TG_SENHA"
                             Else Mensagem(MSG)
                                  VSDGUSUARIO="" 
                                  VSDGNOMUSUARIO=""
                          EndIf     
                  EndIf       
             Case Campo="TG_SENHA"         :
                  VSDGSENHA=ControlValue("TG_SENHA")
                  VERIFICA_SENHA=True
                  If Not IsAssigned(REG_USUARIO)
                      Then GetRecord "\\Sistemas\\Cadastro\\Usuarios" VSDGUSUARIO To REG_USUARIO
                           If Not RetVal
                              Then FastMsg("Usu rio nÆo cadastrado !")
                                   VERIFICA_SENHA=False
                           EndIf
                  EndIf
                  If VERIFICA_SENHA And Not IsBlank(VSDGSENHA)
                     Then ENCRIPTASENHA(VSDGSENHA)
                          If REG_USUARIO["Senha"]<>SENHAENC
                             Then FastMsg("Senha inv lida !")
                             Else AcceptDialog
                          EndIf
                     Else FastMsg("Informe a senha !")
                  EndIf								  
           EndSwitch
   EndSwitch 
EndIf

Switch
 Case Campo="TG_SENHA"   : MSGCAMPO="Informe a senha do usu rio"                           
 Case Campo="TG_USUARIO" : MSGCAMPO="Informe o Usu rio"     
EndSwitch
                                    
Monta_Prompt(MSGCAMPO,TECLA)
Return Temp

EndProc ;SD_DialogUsuario()

;*******************************************************************************
;* Rotina p/ Verficar Usuario                                                  *
;*******************************************************************************
Proc Verifica_Usuario(USUARIO)
Private EMPRESA,USUARIO
                      
MSG="Usu rio "+VSDGUSUARIO+" n„o cadastrado!"
GetRecord "\\Sistemas\\Cadastro\\Usuarios" USUARIO To REG_USUARIO
If RetVal
   Then VSDGNOMUSUARIO = REG_USUARIO["Nome"]
   Else Return False    
EndIf

Release Vars EMPRESA,USUARIO
Return True

EndProc ;Verifica_Usuario()

;*******************************************************************************
;* Rotina de Dialogo da Referencia                                             *
;*******************************************************************************
Proc Observacao()
private tabela, campo

tabela=table()
campo = field()

MOveto "ExpedC"
Moveto [Observacao]

Edita_Memo("Observacao",10,01,13,76,"Observa‡”es")

moveto tabela
moveto field campo

endproc

;*******************************************************************************
;* Rotina de Impressao                                                         *
;*******************************************************************************
Proc IMPRIME()
Private OPCAOC

Moveto "ExpedC"
Echo Normal
Echo Off
ShowPopup " Impress„o " CENTERED
  "Quantidade da O~F~/Expedi‡„o       " : " Imprime Rela‡„o de Itens da OF/Expedi‡„o        " : "IRP",
  "Quantidade ~P~endente da OF        " : " Imprime Rela‡„o de Itens Pendentes da Expedi‡„o " : "IRPP",
  Separator,
  "~C~ancelar                         " : " Cancelar a Opera‡„o                             " : "Cancelar" 
EndMenu
To Opcaoc
echo off

If OPCAOC="Cancelar" or OPCAOC="Esc"
   Then Return false
EndIf

If Opcaoc="IRP"
   Then Opcaoc="IRPMS"
        
         Do_It!
         Dispositivo()
         If OK=""
            Then CoEditKey
                 Return False
         EndIf
      
         If Opcaoc="IRPMS"  Then Play(PARAM_EXPED_E_IMP_SIMPLES) EndIf
EndIf

If Opcaoc="IRPP" 
   Then Opcaoc="IRPPMS"
        
         Do_It!
         Dispositivo()
         If OK=""
            Then CoEditKey
                 Return False
         EndIf
     
         If Opcaoc="IRPPMS"  Then Play(PARAM_EXPED_P_IMP_SIMPLES) EndIf
EndIf
Do_It!
ClearAll

Carrega_Tabelas()

Return True

EndProc ;Imprime

;*******************************************************************************
;* Rotina para Digita Item                                                     *
;*******************************************************************************
Proc DigitaI()
Moveto [Quantidade_Expedida]
While True

      TECLA=" Esc=Retornar  "

      If CHAVEI=0
         Then TECLA=TECLA+"Del=Excluir  "
      EndIf
      MSGCAMPO=Field()

      Prompt TECLA

      Wait Field
           Until "ESC","ENTER","DEL","FIELDVIEW","F35"

      Switch
      Case Retval="ESC":
           If Field()="Quantidade_Expedida"
              Then If QuerDesfazer("")
                      Then If CHAVEI=1
                              Then Del
                              Else Undo
                           EndIf
                           QuitLoop
                   EndIf
              Else Left                           
           EndIf
      Case Retval="ENTER": 
           If Field() = "Quantidade_Expedida"
              Then If [Quantidade_Expedida]>1000
                      then Mensagem("Quantidade Inv lida !")
                           Loop
                   EndIf
                   [Quantidade_Diferenca]=[Quantidade_Expedida]-[Quantidade_OF]
                   If [Quantidade_Diferenca]=0
                      Then [Quantidade_Diferenca]=BlankNum()
                   EndIf
                   If [Quantidade_Diferenca]>0
                      Then [Quantidade_Fora_OF]=[Quantidade_Diferenca]
                      Else [Quantidade_Fora_OF]=BlankNum()
                   EndIf
                   If [Quantidade_Expedida]=0
                      Then [Quantidade_Expedida]=BlankNum()
                   EndIf
									 UnLockRecord
                   QuitLoop
              Else Right
           EndIf
      Case Retval="FIELDVIEW" or Retval="F35":
           EDITFIELD()
      Case Retval="DEL":
           If CHAVEI=0 And [Quantidade_OF]<=0
              Then If QuerExcluir("")
                      Then DEL
                           QuitLoop
                   EndIf
           EndIf
      EndSwitch
EndWhile
EndProc   ; (DigitaI)

;*******************************************************************************
;* Rotina para digita‡Æo do Volume                                             *
;*******************************************************************************
Proc DIGITAV()

Moveto "ExpedC"
Moveto [Numero Ordem de Volumes]
SetaCorRegistro("Editar")

While True
  TECLA=" Esc=Retornar  "

  MSGCAMPO=Field()
  AguardaTeclasPadraoIt2()

  If RetVal=-33
     Then Echo Normal
          Echo Off
          ShowPopup " Fun‡”es " CENTERED
            "F3  ~C~alcular Volumes    " : " Calcular Volumes   " : "F3",
            Separator,
            "~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 = -115 Or RetVal = -116 Or Retval="PGDN":
       FACA_CHAVEV = False
       CHAVEV      = 9
       Return
  Case RetVal = "F3" : CALC_VOLUMES("EXPED_OF")
  Case Retval="ESC"  :
       If Field()="Numero Ordem de Volumes"
          Then If QuerDesfazer("")
                  Then CHAVEV=9
                       FACA_CHAVEV=False
                       Undo
                       QuitLoop
               EndIf
          Else Left
       EndIf
  Case Retval="ENTER" : Right
       If Field() = "Situacao do Pedido"
          Then CHAVEV=9
               FACA_CHAVEV=False
               QuitLoop
       EndIf
  Case Retval="FIELDVIEW" Or Retval="F35":
       EDITFIELD()
  EndSwitch
EndWhile

EndProc ;DIGITAV()

;*******************************************************************************
;* Rotina para Digitacao dos Precos                                            *
;*******************************************************************************
Proc Editar()
Home
Moveto [Quantidade_Expedida]

While True

      TECLA=" Del=Excluir   (Use as Teclas p/ mover)"
      MSGCAMPO=Field()

      VRANT=[Quantidade_Expedida]

      Prompt TECLA

      Wait Field
           Until "ESC","ENTER","DEL","FIELDVIEW","F35","UP","DOWN","PGUP","PGDN","HOME","END","DEL","RIGHT","LEFT"

      Switch
      Case Retval="ESC":
           QuitLoop
      Case Retval="FIELDVIEW" or Retval="F35":
           EDITFIELD()
      Case Retval="DEL" And [Quantidade_OF]<=0:
           If QuerExcluir("")
              Then DEL
                   Calc_Itens()
                   If RecordStatus("New")
                      Then QuitLoop
                   EndIf
           EndIf
      OtherWise:
           TECLAPRESS=RetVal

           If [Quantidade_Expedida]<>VRANT
              Then [Quantidade_Expedida ]= [Quantidade_Expedida]+Dados_QTD
									 Acerta_Item()
                   Calc_Itens()
           EndIf      

           If TECLAPRESS="LEFT" And Field()="Quantidade_Expedida"
              Then Loop
           EndIf
           If (TECLAPRESS="ENTER" or  TECLAPRESS="RIGHT") And Field()="Quantidade_Expedida"
              Then Down
                   Moveto [Quantidade_Expedida]
              Else KeyPress TECLAPRESS
            EndIf
            If RecordStatus("New")
               Then Del
                    QuitLoop
            EndIf
      EndSwitch
EndWhile

EndProc ; (Editar)

;*******************************************************************************
;* Rotina para Leitura do Codigo de Barras                                     *
;*******************************************************************************
Proc CDBarras()
Private REG_P_FATURA,cc           
 
While True
  Moveto [Quantidade_Expedida]
  
  switch
    case sys_Codigo_Cliente="0377"  :
      If Not Ler_CDBarras2(22,00)
         Then Return False
      EndIf

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

  endswitch

  CODIT=Dados_Item      

  ITOK  =True
  INCLUI=False  
  
  Moveto "\\Sistemas\\Estoque\\Itens"
  Moveto [Codigo de Barras]
  Locate IndexOrder by "cod_barras" CODIT
  If Not Retval
     Then If Codigo_Barras2(Dados_Item,"")
             Then CODIT = CODIGO_BARRA2
             Else ;Ser  o pr¢prio c¢digo do item 
          EndIf
          Moveto [Codigo do Item]
          Locate CODIT
  EndIf
  
  If RetVal And ITOK
     Then CopyToArray REG_BUSCA_LOOKUP
          CODIT=[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
  
  Moveto "ExpedOfI"
  If Not ITOK
     Then Loop
  EndIf

  CODITANT=CODIT

  If Dados_QTD > 0
     Then ITOK=False
          Moveto [Codigo do Item]
          Locate CODIT
          If Not RetVal
             Then 
                  If Not IsBlank([ExpedC->Numero do Pedido])    Or
                     Not IsBlank([ExpedC->Numero da OF])        Or
                     Not IsBlank([ExpedC->Numero da NE])        Or
                     Not IsBlank([ExpedC->Numero do Documento])
                     Then If PARAM_INCLUI_ITEM="S" And IsBlank([ExpedC->Numero do Pedido])
                             Then End 
                                  SEQIT = [Item da OE]
                                  If Isblank(SEQIT)
                                     Then SEQIT = 1
                                     Else SEQIT = SEQIT + 1
                                  EndIf
                                  Down
                                  [Item da OE    ]=SEQIT
                                  [Codigo do Item]=CODIT
                                  ITOK=True
                                  INCLUI=True
                          endif  
                     Else End 
                          SEQIT = [Item da OE]
                          If Isblank(SEQIT)
                             Then SEQIT = 1
                             Else SEQIT = SEQIT + 1
                          EndIf      
                          Down
                          [Item da OE    ]=SEQIT
                          [Codigo do Item]=CODIT
                          ITOK=True 
                          
                    EndIf        
             Else ITOK=True
                  If IsBlank([Quantidade_OF]) And PARAM_INCLUI_ITEM="S"
                     Then INCLUI=True
                  EndIf  
          EndIf
     Else
          ITOK=False
          Moveto [Codigo do Item]
          Locate CODIT
          If Not RetVal
             Then Mensagem("O item: //"+[Codigo do Item]+"//"+[Descricao do Item]+"// // nÆo existe nesta expedi‡Æo !")
             Else ITOK=True
          EndIf
  EndIf

  If Not IsBlank([ExpedC->Numero do Pedido])    Or
     Not IsBlank([ExpedC->Numero da OF])        Or
     Not IsBlank([ExpedC->Numero da NE])        Or
     Not IsBlank([ExpedC->Numero do Documento]) 
     Then qtdeDif=[Quantidade_Diferenca]*-1
          If qtdeDif<0
            Then qtdeMsg=Dados_QTD
            Else qtdeMsg=Dados_QTD-qtdeDif
          EndIf
          
          If [Unidade Fiscal]="KG" And sys_Codigo_Cliente="0377"
             Then MSG =""
                  If ([Quantidade_OF]>0 And Dados_QTD-([Quantidade_OF]+[Quantidade_Expedida])>1) Or (Dados_QTD-([Quantidade_OF]+[Quantidade_Expedida])<-1)
                     Then MSG = "Quantidade excede o limite permitido!"  
                  EndIf
                  If MSG<>"" 
                     Then Mensagem(MSG)
                          If Not Usuario() 
                             Then Loop
                          EndIf
                  EndIf 
                  ;Foi pedido em 08/06 por Marco Antonio #0377# p/ que nÆo bloqueasse a quantidade no codigo de barras, apenas se extrapolar a quantidade permitida.
          EndIf
          
          IF ITOK And Dados_QTD>qtdeDif 
          Then If PARAM_ALTERA_QTDE="N" And INCLUI=False
                 Then MSG="Item: "+REG_BUSCA_LOOKUP["Referencia"]+" - "+REG_BUSCA_LOOKUP["Descricao do Item"]+" - "+CODIT+"// //"
                      MSG=MSG+"Informado "+StrVal(qtdeMsg)+" "+REG_BUSCA_LOOKUP["Unidade Fiscal"]
                      MSG=MSG+" a mais que a quantidade da OF !// //"
                      If [Quantidade_Diferenca]>=0 or [Quantidade_Diferenca]=BlankNum()
                       Then Mensagem(MSG+"InclusÆo bloqueada!")
                            Loop 
                       Else If ConfGeral(MSG+"Deseja incluir somente quantidade da OF?")
                             Then Dados_QTD=qtdeDif   
                             Else Loop
                            EndIf 
                      EndIf      
               EndIf 
         EndIf
  EndIf
  
  Switch
    Case ITOK:
      Switch
        Case IsBlank([Quantidade_Expedida]) And Dados_QTD<0:
             MSG="Item: "+REG_BUSCA_LOOKUP["Referencia"]+" - "+REG_BUSCA_LOOKUP["Descricao do Item"]+" - "+CODITANT+"// //"
             MSG=MSG+"nÆo existe quantidade a ser deduzida !"
             Mensagem(MSG)

        Case Dados_QTD<0 And [Quantidade_Expedida   ]<=(Dados_QTD*-1) And ISBlank([Quantidade_OF]):
             ConfGeral("A quantidade a ser deduzida ["+StrVal(Dados_QTD*-1)
                       +"]// ‚ igual ou maior "
                       +"a quantidade j  expedida ["+StrVal([Quantidade_Expedida])+"]. // //"
                       +"Deseja exluir o item "+CODIT+"?")
                       If OK="S" Then del EndIf

        Case Dados_QTD<0 And [Quantidade_Expedida   ]<(Dados_QTD*-1) And not ISBlank([Quantidade_OF]):
             ConfGeral("A quantidade a ser deduzida ["+StrVal(Dados_QTD*-1)
                       +"]// ‚ maior "
                       +"a quantidade j  expedida ["+StrVal([Quantidade_Expedida])+"]. // //"
                       +"Deseja zerar o item "+CODIT+"?")
                       If OK="S" 
                          Then 
                               [Quantidade_Expedida ]= 0
                               Acerta_Item()
                            
                               Calc_Itens()
                               Moveto [Codigo do Item]
                               Locate CODIT
                       EndIf
        OtherWise:         
             [Quantidade_Expedida ]= [Quantidade_Expedida]+Dados_QTD
             Acerta_Item()
          
             Calc_Itens()
             Moveto [Codigo do Item]
             Locate CODIT

      EndSwitch       
    Case Not ITOK: 
      OK="S"
      If (Not IsBlank([ExpedC->Numero do Pedido])     Or
          Not IsBlank([ExpedC->Numero da OF])         Or
          Not IsBlank([ExpedC->Numero da NE])         Or
          Not IsBlank([ExpedC->Numero do Documento])) And Dados_QTD>0
          Then MSG="Nesta expedi‡„o de OF n„o tem o item informado !// //"
               MSG=MSG+"Item: "+REG_BUSCA_LOOKUP["Referencia"]+" - "+REG_BUSCA_LOOKUP["Descricao do Item"]+" - "+CODIT+"// //"
               If PARAM_INCLUI_ITEM="S"
                  Then MSG=MSG+"Confirma a inclus„o deste item assim mesmo ?"
                	     ConfGeral(MSG)
                       If OK="S"
                         Then End 
                              SEQIT = [Item da OE]
                              If Isblank(SEQIT)
                                 Then SEQIT = 1
                                 Else SEQIT = SEQIT + 1
                              EndIf
                              Down
                              [Item da OE          ] = SEQIT
                              [Codigo do Item      ] = CODIT
                              [Quantidade_Expedida ] = [Quantidade_Expedida]+Dados_QTD
                              Acerta_Item()
                      
                              Calc_Itens()
                              Moveto [Codigo do Item]
                              Locate CODIT
                       EndIf
                  Else MSG=MSG+"InclusÆo bloqueada !"
                       Mensagem(MSG)
               EndIf
       EndIf  
  EndSwitch
EndWhile

EndProc

;*******************************************************************************
;* Rotina para Calculos                                                        *
;*******************************************************************************
Proc Acerta_Item()
[Quantidade_Diferenca]=[Quantidade_Expedida]-[Quantidade_OF]

If [Quantidade_Diferenca]=0
  Then [Quantidade_Diferenca]=BlankNum()
EndIf
If [Quantidade_Diferenca]>0
   Then [Quantidade_Fora_OF]=[Quantidade_Diferenca]
   Else [Quantidade_Fora_OF]=BlankNum()
EndIf
If [Quantidade_Expedida]=0
  Then [Quantidade_Expedida]=BlankNum()
EndIf
If IsBlank([ExpedC->Numero do Pedido])    And
   IsBlank([ExpedC->Numero da OF])        And
   IsBlank([ExpedC->Numero da NE])        And
   IsBlank([ExpedC->Numero do Documento])
   Then [Quantidade_Diferenca  ]=BlankNum()
        [Quantidade_Fora_OF]=BlankNum()
Endif   

UnLockRecord
EndProc ;CDBarras()

;*******************************************************************************
;* Rotina para Calculos                                                        *
;*******************************************************************************
Proc Calc_Itens()

Moveto "ExpedOfI"
Moveto [Quantidade_Fora_OF  ] VSQTDFP =ImageCSum()
Moveto [Quantidade_OF       ] VSQTDP  =ImageCSum()
Moveto [Quantidade_Expedida ] VSQTDE  =ImageCSum()

VSQTDD=VSQTDE-VSQTDP  

If VSQTDP =0 Then VSQTDP =BlankNum() EndIf
If VSQTDFP=0 Then VSQTDFP=BlankNum() EndIf
If VSQTDE =0 Then VSQTDE =BlankNum() EndIf

Moveto "ExpedC"
[Quantidade_OF       ]=VSQTDP
[Quantidade_Expedida ]=VSQTDE
[Quantidade_Diferenca]=VSQTDD
[Quantidade_Fora_OF  ]=VSQTDFP

Moveto "ExpedOfI"
EndProc   ; (ChaveCdBar)

;*******************************************************************************
;* Rotina para Entrada Rapida por Codigo de Barras                             *
;*******************************************************************************
Proc ChaveCdBar()
Moveto "ExpedOfI"
FACA_DIGITAF=True
Return

EndProc   ; (ChaveCdBar)

;*******************************************************************************
;* Exclusao da Cabeca                                                          *
;*******************************************************************************
Proc Verifica_Sistema_Gerador(PARAM)

If [Sistema Gerador]<>"" And [Sistema Gerador]<>SISTEMA_GERADOR
   Then MSG = Completa("Este lan‡amento pertence a rotina:",68," ")+"////"
        Switch
          Case [ExpedC->Sistema Gerador] = "IC" : MSG = MSG + Completa("FATURAMENTO > EXPEDICAO > 18. ORDEM DE EXPEDICAO - PEDIDO     ",68," ")
          Case [ExpedC->Sistema Gerador] = "IQ" : MSG = MSG + Completa("FATURAMENTO > EXPEDICAO > 17. ORDEM DE EXPEDICAO - ETIQUETA   ",68," ")
          Case [ExpedC->Sistema Gerador] = "IV" : MSG = MSG + Completa("FATURAMENTO > EXPEDICAO > 22. ORDEM DE EXPEDICAO - VARIA€åES  ",68," ")
         ;Case [ExpedC->Sistema Gerador] = "OF" : MSG = MSG + Completa("FATURAMENTO > EXPEDICAO > 21. ORDEM DE EXPEDICAO - FATURAMENTO",68," ")
          Case [ExpedC->Sistema Gerador] = "I3" : MSG = MSG + Completa("FATURAMENTO > EXPEDICAO > ??. ORDEM DE EXPEDICAO",68," ") 
        EndSwitch
        If PARAM = "EXCLUSAO"
           Then MSG = MSG + "////"
                MSG = MSG + Completa("NÆo ‚ poss¡vel a exclusÆo deste registro!",68," ")
        EndIf
        Mensagem(MSG)
        CHAVEC=9
        Return False
EndIf

Return True

EndProc ;Verifica_Sistema_Gerador() 

;*******************************************************************************
;* Exclusao da Cabeca                                                          *
;*******************************************************************************
Proc EXCLUSAO_C()
If Not Isassigned(GRAVA_LOG) Then GRAVA_LOG=False EndIf

Moveto "ExpedOfI"
While RecordStatus("New")=False
  EXCLUSAO_I()
EndWhile
Moveto "ExpedC"
If GRAVA_LOG Then Grava_LogEx("ExpedOfC") EndIf
Del
EndProc   ; (Exclusao_C)

;*******************************************************************************
;* Exclusao do Item                                                            *
;*******************************************************************************
Proc EXCLUSAO_I()
Private ANT_GRAVA_LOG

If Not Isassigned(GRAVA_LOG) Then GRAVA_LOG=False EndIf
;NÆo vai ocorrer LOG de itens exclu¡dos se cabe‡a for exclu¡da
ANT_GRAVA_LOG = GRAVA_LOG
GRAVA_LOG     = False

Moveto "ExpedOfI"
CODIT=[Codigo do Item]
GRAVA_LOG = ANT_GRAVA_LOG
If GRAVA_LOG Then Grava_LogEx("Item da ExpedOF") EndIf
Del
EndProc  ; (Exclusao_I)

;*******************************************************************************
;* Rotina para Carregar OF                                                     *
;*******************************************************************************
Proc Carrega_Itens()
Private codite, seq, seqitem, novoitem

If CHAVEC=0                                 And
   IsBlank([ExpedC->Numero do Pedido   ]) And
   IsBlank([ExpedC->Numero da OF       ]) And
   IsBlank([ExpedC->Numero da NE       ]) And
   IsBlank([ExpedC->Codigo do Documento])
   Then FastMsg("Fun‡„o inv lida!") 
        Return   
EndIf   

Moveto "ExpedOfI"
If RecordStatus("New")=True
   Then Del
   Else Scan
          [Quantidade_OF]=BlankNum()
        EndScan
EndIf        
                         
seq=900

Switch
  Case [ExpedC->Numero do Pedido]<>"" :
       UnLockRecord
       
       Moveto "ExpedC"
       UnLockRecord
       FormKey

       {TableAdd} {PedidoI}   
  
       FAZ_ROTINA = False
       CONT_ITEM_PEDIDO = 0
       DynArray REG_ITEM_PEDIDO[]
  
       Moveto "PedidoI"
       Moveto [Numero do Pedido]
       Locate [ExpedC->Numero do Pedido]
       If RetVal
          Then FAZ_ROTINA=True
               While [Numero do Pedido]=[ExpedC->Numero do Pedido]
                 CONT_ITEM_PEDIDO = CONT_ITEM_PEDIDO + 1
                 REG_ITEM_PEDIDO[CONT_ITEM_PEDIDO] = AlinhM(StrVal([Item do Pedido]),5)+Format("W10",[Codigo do Item])+Format("W12.2",[Quantidade])
                 If CONT_ITEM_PEDIDO > 900
                    Then Mensagem("N„o foi poss¡vel continuar com o processo.//Pedido com mais de 900 Itens!")
                         FAZ_ROTINA = False
                         QuitLoop
                 EndIf    
                 Skip
                 If EOT() Then QuitLoop Endif
               EndWhile
               
               If CONT_ITEM_PEDIDO=0 
                  Then Mensagem("N„o foi localizado itens neste pedido!")
                       FAZ_ROTINA = False
               EndIf   
                   
       EndIf
       
       Moveto "PedidoI" ClearImage
               
       Moveto "ExpedC"
       IsLockRecord()
               
       FormKey
       Moveto "ExpedOfI"
       If IsBlank([Referencia]) And IsBlank([Descricao do Item]) Then Del EndIf
       
       If FAZ_ROTINA
          Then For at From 1 To DynArraySize(REG_ITEM_PEDIDO)
                 AUX_SEQ  = NumVal(SubStr(REG_ITEM_PEDIDO[at],1,5))
                 AUX_ITEM = SubStr(REG_ITEM_PEDIDO[at],6,10)
                 AUX_QTD  = NumVal(SubStr(REG_ITEM_PEDIDO[at],16,12))
                
                 msg = ""
                 novoitem=false
                 GetRecord "\\Sistemas\\Vendas\\PedidoI" [ExpedC->Numero do Pedido],AUX_SEQ To REG_PEDI
                 If RetVal
                    Then If IsBlank(REG_PEDI["Quantidade Faturada"]) Or REG_PEDI["Quantidade Faturada"]>=0
                           Then SDPED=REG_PEDI["Quantidade"]-REG_PEDI["Quantidade Faturada"]
                                If SDPED>0
                                   Then novoitem=true
                                EndIf
                         EndIf
                    Else msg = "Item "+AUX_ITEM+" n„o localizado no pedido "+[ExpedC->Numero do Pedido]+"!"     
                 EndIf
    
                 If novoitem
                    Then Moveto "ExpedOfI"
                         Moveto [Item da OE]
                         Locate AUX_SEQ
                         
                         if retval
                            then if [Codigo do Item]<>[Codigo do Item]
                                    then 
                                         seqitem =seq
                                         seq=seq+1
                                    else 
                                         novoitem=false
                                 endif
                            else 
                                 seqitem =AUX_SEQ             
                         endif
                 EndIf
                 
                 If novoitem
                    Then GetRecord "\\Sistemas\\Estoque\\Itens" AUX_ITEM To REG_ITEM
                         End 
                         If Not Isblank([Item da OE]) Then Down EndIf
                         [Item da OE       ]=seqitem
                         [Codigo do Item   ]=AUX_ITEM
                         [Referencia       ]=REG_ITEM["Referencia"]
                 Endif
                 if msg="" And SDPED>0 
                    Then [Quantidade_OF    ]=[Quantidade_OF    ]+SDPED
                         UnLockRecord    
                    Else If msg<>"" Then mensagem(msg) EndIf
                 Endif       
               Endfor
       EndIf
       Moveto "ExpedC"               
       [Documento Referente] = "PED /"+[ExpedC->Numero do Pedido]
       UnLockRecord
        
       Moveto "ExpedOfI"

  Case [ExpedC->Numero da OF]<>""     :
       Moveto "FaturaI"
       Moveto [Numero da OF]
       Locate [ExpedC->Numero da OF]
       If Not RetVal
          Then Moveto "ExpedOfI"
               Return
       EndIf
       
       While [Numero da OF]=[ExpedC->Numero da OF]

         novoitem=true
    
         Moveto "ExpedOfI"
         moveto [Item da OE       ]
         locate [FaturaI->Item da OF]
         if retval
            then 
                 if [Codigo do Item]<>[Codigo do Item]
                    then 
                         seqitem =seq
                         seq=seq+1
                    else 
                         novoitem=false
                 endif
            else 
                 seqitem =[FaturaI->Item da OF]             
         endif
         
         if novoitem
            then
                 GetRecord "\\Sistemas\\Estoque\\Itens" [FaturaI->Codigo do Item] To REG_ITEM
                  
                 End Down
                 [Item da OE       ]=seqitem
                 [Codigo do Item   ]=[FaturaI->Codigo do Item]
                 [Referencia       ]=REG_ITEM["Referencia"]
         endif
         [Quantidade_OF    ]=[Quantidade_OF    ]+[FaturaI->Quantidade    ]
         UnLockRecord
       
         Moveto "FaturaI"
               Skip
         If EOT() Then QuitLoop Endif
       EndWhile
       Moveto "ExpedC"               
       [Documento Referente] = "OF  /"+[ExpedC->Numero da OF]
       UnLockRecord 
       
       Moveto "ExpedOfI"
       
  Case [ExpedC->Numero da NE]<>""     :
       UnLockRecord
       
       Moveto "ExpedC"
       UnLockRecord
       FormKey

       {TableAdd} {\\Sistemas\\Estoque\\NotaEi}   
  
       FAZ_ROTINA = False
       CONT_ITEM_NOTAE = 0
       DynArray REG_ITEM_NOTAE[]
  
       Moveto "\\Sistemas\\Estoque\\NotaEi"
       Moveto [Numero do Lancamento]
       Locate [ExpedC->Numero da NE]
       If RetVal
          Then FAZ_ROTINA=True
               While [Numero do Lancamento]=[ExpedC->Numero da NE]
                 CONT_ITEM_NOTAE = CONT_ITEM_NOTAE + 1
                 REG_ITEM_NOTAE[CONT_ITEM_NOTAE] = AlinhM(StrVal([Sequencia do Lancamento]),5)+Format("W10",[Codigo do Item])+Format("W12.2",[Quantidade])
                 If CONT_ITEM_NOTAE > 900
                    Then Mensagem("N„o foi poss¡vel continuar com o processo.//Nota de Entrada com mais de 900 Itens!")
                         FAZ_ROTINA = False
                         QuitLoop
                 EndIf    
                 Skip
                 If EOT() Then QuitLoop Endif
               EndWhile
               
               If CONT_ITEM_NOTAE=0 
                  Then Mensagem("N„o foi localizado itens nesta nota de entrada!")
                       FAZ_ROTINA = False
               EndIf   
                   
       EndIf
       
       Moveto "\\Sistemas\\Estoque\\NotaEi" ClearImage
               
       Moveto "ExpedC"
       IsLockRecord()
               
       FormKey
       Moveto "ExpedOfI"
       If IsBlank([Referencia]) And IsBlank([Descricao do Item]) Then Del EndIf
       
       If FAZ_ROTINA
          Then For at From 1 To DynArraySize(REG_ITEM_NOTAE)
                 AUX_SEQ  = NumVal(SubStr(REG_ITEM_NOTAE[at],1,5))
                 AUX_ITEM = SubStr(REG_ITEM_NOTAE[at],6,10)
                 AUX_QTD  = NumVal(SubStr(REG_ITEM_NOTAE[at],16,12))
                 
                 novoitem=true
    
                 Moveto "ExpedOfI"
                 Moveto [Item da OE]
                 Locate AUX_SEQ
                 
                 if retval
                    then if [Codigo do Item]<>[Codigo do Item]
                            then 
                                 seqitem =seq
                                 seq=seq+1
                            else 
                                 novoitem=false
                         endif
                    else 
                         seqitem =AUX_SEQ             
                 endif
                 
                 if novoitem
                    then GetRecord "\\Sistemas\\Estoque\\Itens" AUX_ITEM To REG_ITEM
                         End 
                         If Not Isblank([Item da OE]) Then Down EndIf
                         [Item da OE       ]=seqitem
                         [Codigo do Item   ]=AUX_ITEM
                         [Referencia       ]=REG_ITEM["Referencia"]
                 endif
                  
                 [Quantidade_OF    ]=[Quantidade_OF    ]+AUX_QTD
                 UnLockRecord  
               Endfor
       EndIf               
       Moveto "ExpedC"               
       [Documento Referente] = "NE  /"+[ExpedC->Numero da NE]
       UnLockRecord
        
       Moveto "ExpedOfI"
  OtherWise                             :
       Moveto "NotaI"
       Moveto [Codigo da Empresa]
       Locate [ExpedC->Codigo da Empresa],[ExpedC->Numero do Documento],[ExpedC->Serie do Documento]
       If Not RetVal
          Then Moveto "ExpedOfI"
               Return
       EndIf
       
       While [Codigo da Empresa  ]=[ExpedC->Codigo da Empresa  ] And
             [Numero do Documento]=[ExpedC->Numero do Documento] And
             [Serie do Documento ]=[ExpedC->Serie do Documento ]
       
         novoitem=true
       
         Moveto "ExpedOfI"
         moveto [Item da OE       ]
         locate [NotaI->Item do Documento]
         if retval
            then 
                 if [Codigo do Item]<>[NotaI->Codigo do Item]
                    then 
                         seqitem =seq
                         seq=seq+1
                    else 
                         novoitem=false
                 endif
            else 
                 seqitem =[NotaI->Item do Documento]             
         endif
         
         if novoitem
            then
                 GetRecord "\\Sistemas\\Estoque\\Itens" [NotaI->Codigo do Item] To REG_ITEM
                  
                 End Down
                 [Item da OE       ]=seqitem
                 [Codigo do Item   ]=[NotaI->Codigo do Item]
                 [Referencia       ]=REG_ITEM["Referencia"]
         endif
          
         [Quantidade_OF    ]=[Quantidade_OF    ]+[NotaI->Quantidade    ]
         UnLockRecord
        
         Moveto "NotaI"

         Skip
         If EOT() Then QuitLoop Endif
       EndWhile
       
       Moveto "ExpedC"
       If Not Isblank([Serie do Documento])
          Then SERIE = "-" + [Serie do Documento]
          Else SERIE = ""
       EndIf
       Moveto "ExpedC"               
       [Documento Referente] = Format("W4",[Codigo do Documento])+"/"+[Numero do Documento]+SERIE
       UnLockRecord
       
       Moveto "ExpedOfI"       
EndSwitch

Moveto "ExpedOfI"
Scan
  Acerta_Item()   
EndScan
Calc_Itens()

Switch
  Case [ExpedC->Numero da OF]<>""     : GetRecord "FaturaC" [ExpedC->Numero da OF] To REG_OF
  Case [ExpedC->Numero do Pedido]<>"" : GetRecord "PedidoC" [ExpedC->Numero do Pedido] To REG_OF
  Case [ExpedC->Numero da NE]<>""     : GetRecord "\\Sistemas\\Estoque\\NotaEC" [ExpedC->Numero da NE] To REG_OF
  OtherWise                             :
       GetRecord "NotaC" [ExpedC->Codigo da Empresa],[ExpedC->Numero do Documento],[ExpedC->Serie do Documento] To REG_OF
EndSwitch   

Moveto "ExpedOfI"
UnLockRecord

Moveto "ExpedC" SetaCorRegistro("Padrao")
If [Codigo da Empresa      ]<>REG_OF["Codigo da Empresa"]       Then [Codigo da Empresa      ]=REG_OF["Codigo da Empresa"]       EndIf
If [Nome Fantasia Empresa  ]<>REG_OF["Nome Fantasia Empresa"]   Then [Nome Fantasia Empresa  ]=REG_OF["Nome Fantasia Empresa"]   EndIf
If [Codigo                 ]<>REG_OF["Codigo"]                  Then [Codigo                 ]=REG_OF["Codigo"]                  EndIf
If [Razao Social           ]<>REG_OF["Razao Social"]            Then [Razao Social           ]=REG_OF["Razao Social"]            EndIf
If [Codigo do Representante]<>REG_OF["Codigo do Representante"] Then [Codigo do Representante]=REG_OF["Codigo do Representante"] EndIf
If [Nome Fantasia Represent]<>REG_OF["Nome Fantasia Represent"] Then [Nome Fantasia Represent]=REG_OF["Nome Fantasia Represent"] EndIf
UnLockRecord

Moveto "ExpedOfI"

EndProc ; (Carrega_OF)

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

PARAM_EXPED_E_IMP_SIMPLES = "OEF_100"
PARAM_EXPED_P_IMP_SIMPLES = "OEF_P100"

switch
  case sys_Codigo_cliente="0377" : PARAM_ALTERA_QTDE = "S"
  otherwise                      : PARAM_ALTERA_QTDE = "N"
endswitch

PARAM_INCLUI_ITEM = "N"
If Not IsBlank([ExpedC->Numero do Pedido])
   Then GetRecord "\\Sistemas\\Vendas\\PedidoC" [ExpedC->Numero do Pedido] To REG_PEDIDO
        If RetVal
           Then GetRecord "\\Sistemas\\Vendas\\P_Pedido" REG_PEDIDO["Codigo da Empresa"] To REG_P_PEDIDO
                If RetVal
                   Then PARAM_INCLUI_ITEM = REG_P_PEDIDO["Inclui_Item_Expedic"]
                EndIf
        EndIf          
EndIf   

Return True
EndProc ; (Carrega_Parametros)

;*******************************************************************************
;* Rotina para Carregar Tabelas                                                *
;*******************************************************************************
Proc Closed Carrega_Tabelas()
UseVars AutoLib, ErrorProc, FORMMANUTENCAO  
               
View NoWindow "\\Sistemas\\Cadastro\\Destinat"
CoEdit NoWindow "ExpedC"
If Not IsEmpty("ExpedC")
   Then If FORMMANUTENCAO="4"
           Then Moveto [Quantidade_OF       ] Menu {Image} {Format} Enter {Fixed} {3}
                Moveto [Quantidade_Expedida ] Menu {Image} {Format} Enter {Fixed} {3}
                Moveto [Quantidade_Diferenca] Menu {Image} {Format} Enter {Fixed} {3}
        EndIf
EndIf

;************** Rotina para tratar o erro de tabela locada ********************
If ErrorCode()=4
   Then Do_It!
        ClearAll

        Release Vars All
        Release Procs All
        return false
EndIf

PickForm FORMMANUTENCAO
Moveto "\\Sistemas\\Estoque\\Itens" SetaCorRegistro("Invisivel")
Moveto "FaturaI"                    SetHighLight Current Record 119 Field 119
Moveto "ExpedOFI" 

if FORMMANUTENCAO="4"
   then
        Moveto [Quantidade_OF       ] Menu {Image} {Format} Enter {Fixed} {3}
        Moveto [Quantidade_Expedida ] Menu {Image} {Format} Enter {Fixed} {3}
        Moveto [Quantidade_Diferenca] Menu {Image} {Format} Enter {Fixed} {3}
endif

Moveto "ExpedC"

Return True
EndProc   ; (Carrega_Tabelas)

;*******************************************************************************
;* Rotina para Verificar se Conteudo do Campo e Numero V lido                  *
;*******************************************************************************
Proc E_NumeroValidoV(Valor)
Private Valor,c,p,r      

If Len(Valor)=0
   Then Return False
EndIf

p=0
r=0

For c From 1 to Len(Valor)
 If SubStr(Valor,c,1)<"0" Or SubStr(Valor,c,1)>"9"
    Then If SubStr(Valor,c,1)=","
            Then p=p+1
            Else If SubStr(Valor,c,1)="-"  
                    Then r=r+1
                    Else Return False
                 EndIf   
         EndIf
 EndIf
EndFor

If p>1 or r>1
   Then Return False
EndIf

If r=1 And SubStr(Valor,1,1)<>"-"
   Then Return False
EndIf

p=searchfrom(",",valor,1)
If p>0
   Then If p=Len(Valor) Or
           p<(Len(Valor)-3)
           Then Return False
        EndIf
EndIf

Return True
EndProc

;*******************************************************************************
;* Rotina para Verificar se Conteudo do Campo e Numero V lido                  *
;*******************************************************************************
Proc Cnv_NumeroV(Valor)
Private Valor,c,s      

s=""
For c From 1 to Len(Valor)
  switch
    case substr(valor,c,1)="," : s=s+"."
    case substr(valor,c,1)="." : s=s+","
    otherwise                  : s=s+substr(valor,c,1) 
  endswitch
endfor

return numval(s)
EndProc



;*******************************************************************************
;* Rotina Dialog Leitura_Codigo_Barras                                         *
;*******************************************************************************
Proc SD_DialogLerCodBarra3(Disparo,Campo,Evento,Elemento)
Temp=True
MSGCAMPO=""
TECLA="// Esc=Retornar "
If Not IsAssigned(PARAM_QTD_CDBAR) Then PARAM_QTD_CDBAR="" EndIf
If Disparo="OPEN"
   Then INICIO_DIALOG=False
        Campo="TG_CODIGO"

        Dynarray WinArray_CDBarras[]
        Window handle Dialog To WinCDBarras
        Window GetAttributes WinCDBarras To WinArray_CDBarras
        WinArray_CDBarras["HASSHADOW"] = False
        WinArray_CDBarras["HASFRAME" ] = False
        Window SetAttributes WinCDBarras From WinArray_CDBarras

        Release vars WinCDBarras, WinArray_CDBarras 

EndIf        

If Disparo="EVENT" And Evento["Type"]="KEY" Then
   Switch
     Case Evento["KeyCode"] = 27:
          Temp=False
          Switch
             Case Campo="TG_CODIGO"         : CancelDialog   
          EndSwitch
      Case Evento["KeyCode"] = 13:
           Temp=False
           Switch
             Case Campo="TG_CODIGO"        : 
                Dados_Item=ControlValue("TG_CODIGO")
								AcceptDialog
           EndSwitch
   EndSwitch
EndIf
RefreshDialog

Switch
 Case Campo="TG_CODIGO"        : 
   MSGCAMPO=" Informe s¢ a [Quantidade]"
EndSwitch

Monta_Prompt(MSGCAMPO,TECLA)
Return Temp
EndProc

;*******************************************************************************
;* Rotina para Leitura do Codigo de Barras                                     *
;*******************************************************************************
Proc Ler_CDBarras3(l,c)
Private l,c,Pos, pesotxt, s, msg

While True                  
  INICIO_DIALOG=True
  
  Echo Normal
  Echo Off

  Dados_Item=""
  Dados_QTD =1

  ShowDialog "Informe a Quantidade" Proc "SD_DialogLerCodBarra3"
  Trigger "OPEN","ARRIVE"
  Key "ESC","ENTER"
   @ l,c Height 03 Width 82
    
    Label  @ 00,00 " Quantidade -> "  For "TG_CODIGO"
    Accept @ 00,16 Width 19 "A33" Tag "TG_CODIGO" To Dados_Item
    
  EndDialog

  Mouse Show
  If Not RetVal
     Then Return False
  EndIf

  If Dados_Item<>"" and Not E_NumeroValido(Dados_Item)
     Then Mensagem("Quantidade invalida !")
          Loop
     else
     
          if Dados_Item=""
             then pesotxt=substr(Directory(),1,2)+"\\Sistemas\\Vendas\\Balanca\\Pesos.txt"
                  If IsFile(PrivDir()+"log_bal.Txt")
                     Then LeiaINI(PrivDir()+"log_bal.txt","BALANCA.S.1")
                          Switch                
                            Case BALANCA="1" : pesotxt=substr(Directory(),1,2)+"\\Sistemas\\Vendas\\Balanca\\Pesos.txt"
                            Case BALANCA="2" : pesotxt=substr(Directory(),1,2)+"\\Sistemas\\Vendas\\Balanca\\Pesos2.txt"
                          EndSwitch   
                  EndIf
  
                  if not isFile(pesotxt)
                     then msg=    "Erro balan‡a [Arquivo] !// //"
                          msg=msg+"Tente novamente, se persistir://"
                          msg=msg+"- Verificar cabo,                   //"
                          msg=msg+"- Verificar programa de comunica‡Æo://"
                          msg=msg+"-   Programa em execu‡Æo,           //"
                          msg=msg+"-   Porta serial,                   //"
                          msg=msg+"-   Arquivo txt (Pesos.TXT) na rede."
                          Mensagem(Msg)
                          loop
                  endif   
                  
                  FileRead  pesotxt to conteudodoarquivo
                  Filewrite pesotxt from ""
                  
                  s=substr(conteudodoarquivo,1,len(conteudodoarquivo)-1)
                  If Not E_NumeroValidoV(s)
                     Then Mensagem("Erro balan‡a [Peso] !// //Tente novamente, se persistir, verificar peso na balan‡a.")
                          Loop
                  endif        
                  
                  Dados_QTD =Cnv_NumeroV(s)
            Else
                  Dados_QTD =NumVal(Dados_Item)
         EndIf
  EndIf            

  Echo Off

  If RetVal="ESC"
     Then Return False
     Else Return True                
  EndIf

EndWhile

EndProc ; Ler_CDBarras3()

;*******************************************************************************
;* Rotina para Leitura do Codigo de Barras                                     *
;*******************************************************************************
Proc Ler_CDBarras2(l,c)
Private l,c,Pos, pesotxt, s, msg

If Not IsAssigned(PARAM_QTD_CDBAR) Then PARAM_QTD_CDBAR="" EndIf

While True                  
      INICIO_DIALOG=True
      
      Echo Normal
      Echo Off

      Dados_Item=""
      Dados_QTD =1

      ShowDialog "Lendo C¢digo de Barras" Proc "SD_DialogLerCodBarra"
      Trigger "OPEN","ARRIVE"
      Key "ESC","ENTER"
       @ l,c Height 03 Width 82
        
        Label  @ 00,00 " Lendo Codigo de Barras -> "  For "TG_CODIGO"
        Accept @ 00,28 Width 36 "A33" Tag "TG_CODIGO" To Dados_Item
        
      EndDialog

      Mouse Show
      If Not RetVal
         Then Return False
      EndIf

      If Len(Dados_Item)=0
         Then Loop
      EndIf

      Past=SearchFrom("*",Dados_Item,1)
      
      switch
        case sys_Codigo_Cliente="0377"  :
          If Past>0 And Not E_NumeroValido(SubStr(Dados_Item,1,Past-1))
             Then Mensagem("Quantidade invalida !")
                  Loop
             else
             
                  if Past=0
                     then pesotxt=substr(Directory(),1,2)+"\\Sistemas\\Vendas\\Balanca\\Pesos.txt"
                          If IsFile(PrivDir()+"log_bal.Txt")
                             Then LeiaINI(PrivDir()+"log_bal.txt","BALANCA.S.1")
                                  Switch                
                                    Case BALANCA="1" : pesotxt=substr(Directory(),1,2)+"\\Sistemas\\Vendas\\Balanca\\Pesos.txt"
                                    Case BALANCA="2" : pesotxt=substr(Directory(),1,2)+"\\Sistemas\\Vendas\\Balanca\\Pesos2.txt"
                                  EndSwitch   
                          EndIf
                     
                          if not isFile(pesotxt)
                             then msg=    "Erro balan‡a [Arquivo] !// //"
                                  msg=msg+"Tente novamente, se persistir://"
                                  msg=msg+"- Verificar cabo,                   //"
                                  msg=msg+"- Verificar programa de comunica‡Æo://"
                                  msg=msg+"-   Programa em execu‡Æo,           //"
                                  msg=msg+"-   Porta serial,                   //"
                                  msg=msg+"-   Arquivo txt (Pesos.TXT) na rede."
                                  Mensagem(Msg)
                                  loop
                          endif   
                          
                          
                          FileRead  pesotxt to conteudodoarquivo
                          Filewrite pesotxt from ""
                          
                          s=substr(conteudodoarquivo,1,len(conteudodoarquivo)-1)
                          If Not E_NumeroValidoV(s)
                             Then Mensagem("Erro balan‡a [Peso] !// //Tente novamente, se persistir, verificar peso na balan‡a.")
                                  Loop
                          endif        
                          
                          Dados_QTD =Cnv_NumeroV(s)
                  endif
          EndIf                
        
        otherwise:
          If Past>0 And Not E_NumeroValido(SubStr(Dados_Item,1,Past-1))
             Then Mensagem("Quantidade invalida !")                                                                                      
                  Loop
          endif   
      endswitch

      If Past>0                                                                                                    
        Then If PARAM_QTD_CDBAR<>"N"
                Then
                  Dados_QTD=NumVal(SubStr(Dados_Item,1,Past-1))
                  Dados_Item=RTrim(SubStr(Dados_Item,Past+1,30))
                Else 
                  Mensagem("Fun‡ao [Quantidade]*[C¢digo] nÆo permitida!")
             EndIf
      EndIf            

      Echo Off
 
      If RetVal="ESC"
         Then Return False
         Else Return True                
      EndIf

EndWhile

EndProc ; Ler_CDBarras()

;*******************************************************************************
;* Rotina para controlar Edicao do registro                                    *
;*******************************************************************************
Proc Controla_EdicaoI()
DIGITAI()
Calc_Itens()
EndProc

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

While FACA_DIGITAC
  DIGITAC()
  If CHAVEC=9 Then QuitLoop EndIf
  If CHAVEC=1
     Then Controle_Dia()
          [Situacao da OE ]="EM ABERTO"
          [Sistema Gerador] = "OF"
          Carrega_Itens()
  EndIf
  While FACA_CHAVEI
    While True
      CHAVEI()
      If CHAVEI=9 Then QuitLoop EndIf
      Controla_EdicaoI()
    EndWhile
    While FACA_CHAVEV
      DIGITAV()
      If CHAVEV=9 Then QuitLoop EndIf
    EndWhile
  EndWhile
EndWhile
Moveto "ExpedC" 
If CHAVEC=8 Then EXCLUSAO_C() EndIf

If RecordStatus("Locked") Then UnLockRecord EndIf         
If OPCAO_FORM=FORMRELACAO
   Then PickForm FORMRELACAO
EndIf

SaveTables
EndProc

;*******************************************************************************
;* Rotina Principal Emissao Nota Fiscal ou Romaneio                            *
;*******************************************************************************
AutoLib="\\Sistemas\\Cadastro\\Bibliot,\\Sistemas\\Cadastro\\Bib_Show,"+
        "\\Sistemas\\Vendas\\Bib_Bal,\\Sistemas\\Cadastro\\Bib_Bloq,\\Sistemas\\Vendas\\Bib_Vend"

SYS_VALOR()
If Not IsAssigned(SYS_EMPRESA_DEFAULT) Then SYS_EMPRESA_DEFAULT=""  EndIf
If Not IsAssigned(SYS_CODIGO_CLIENTE)  Then SYS_CODIGO_CLIENTE=""   EndIf
If Not IsAssigned(SYS_CLIENTE_CONFEC)  Then SYS_CLIENTE_CONFEC=""   EndIf
If Not IsAssigned(SYS_NOME_USUARIO)    Then SYS_NOME_USUARIO=""     EndIf
If Not IsAssigned(SYS_CONTROLE_DIA)    Then SYS_CONTROLE_DIA  =""   EndIf
If Not IsAssigned(NOMEMPRESA)          Then NOMEMPRESA=""           EndIf

;***** Verificar se o Cliente tem acesso a esta rotina *****
If Bloqueia_Rotina("P_EXPEDOF")
   Then Return
EndIf   
;***********************************************************

SISTEMA_GERADOR       = "OF"        
PARAM_PEDIDO_POREXPED = False
FORMRELACAO           = "6"
FORMMANUTENCAO        = "7"
            
switch                       
  Case SYS_CODIGO_CLIENTE="0345" Or
       SYS_CODIGO_CLIENTE="0388" Or
       SYS_CODIGO_CLIENTE="0427" Or
       SYS_CODIGO_CLIENTE="0419"  : PARAM_PEDIDO_POREXPED = True
  Case SYS_CODIGO_CLIENTE="0377"  : FORMRELACAO   ="6"
                                    FORMMANUTENCAO="8"   
EndSwitch

If Not Carrega_Tabelas()
   Then Return
EndIf   

Moveto "\\Sistemas\\Estoque\\Itens" SetaCorRegistro("Invisivel")  
Moveto "FaturaI"  SetaCorRegistro("Invisivel")
Moveto "NotaI"    SetaCorRegistro("Invisivel")

moveto "ExpedC"
PickForm FORMRELACAO
OPCAO_FORM = FORMRELACAO

While True
  CHAVEC()
  If CHAVEC=9 Then QuitLoop EndIf
  If CHAVEC=5
     Then If OPCAO_FORM=FORMRELACAO
             Then PickForm FORMRELACAO
             Else PickForm FORMMANUTENCAO
          EndIf
          Loop
  EndIf
  Controla_EdicaoC()
EndWhile
Do_It!
ClearAll
Release Vars All
Release Procs All
