;** FT_RQNE ********************************************************************
;*  Complemento p/ Requisi‡Æo de Mercadoria de Nota de Entrada - Transferˆncia *
;*******************************************************************************
;Autor           : Vise Informatica (VISERP)                       
;Desenvolvido em : 06/07/2016 por Bruno Carvalho             
;Ultima Alteracao: 13/07/2016 por Bruno Carvalho                         
;Motivo Alteracao: Novas implementa‡äes                                                                                           
;Ultima Alteracao: 27/12/2017 por Bruno Carvalho                         
;Motivo Alteracao: Ajustes estornar lan‡amentos requisi‡Æo                                                                        
;Ultima Alteracao: 14/03/2019 por Anivel Augusto Rodrigues                           
;Motivo Alteracao: Ajustes Numero_Lancamento("Interno","Locked_Down")

;*******************************************************************************
;* Atualizacao Requisicao                                                      *
;*******************************************************************************
Proc AUX_REQUISICAO()
private estornarnota

If IsAssigned(CHAVEC) And CHAVEC=0 And Not IsAssigned(REG_NOTAEC)
  Then Mensagem("Variavel de sistema REG_NOTAEC n„o localizada!")
       Return False     
EndIf 

NLANCTO = [NotaEC->Numero do Lancamento]       
If CHAVEC=0
   Then 
        DOCTO_CODIGO    = REG_NOTAEC["Codigo do Documento"]
        DOCTO_TIPO      = REG_NOTAEC["Tipo do Documento"]
        DOCTO_SERIE     = REG_NOTAEC["Serie do Documento"]
        DOCTO_NUMERO    = REG_NOTAEC["Numero do Documento"]
        AUX_DATA_TRANSF = REG_NOTAEC["Data de Entrada"]
   Else 
        DOCTO_CODIGO    = [NotaEc->Codigo do Documento]
        DOCTO_TIPO      = [NotaEc->Tipo do Documento  ]
        DOCTO_SERIE     = [NotaEc->Serie do Documento ]
        DOCTO_NUMERO    = [NotaEc->Numero do Documento]
        AUX_DATA_TRANSF = [NotaEc->Data de Entrada    ]
EndIf

Aguarde("Gerando requisi‡„o no estoque")   
CODEMP   = [NotaEC->Codigo da Empresa]
DATA     = AUX_DATA_TRANSF   
NOMDEST  = "RM - NOTA ENTRADA" 
                                       
Moveto "NotaEC"
Moveto [Numero do Lancamento]
LockRecord

Moveto "\\Sistemas\\Estoque\\Requisit"
Moveto [Descricao Requisitante]
Locate NOMDEST
If RetVal
   Then COD_DESTINO = [Codigo do Requisitante]
   Else COD_DESTINO = ""  
EndIf  
               
AUX_SISTEMA_GERADOR=""               
ACHOU_REQ = False
NUMEROL = ""
Moveto "\\Sistemas\\Estoque\\RQCabeca"
Moveto [Lancamento Gerador]
Locate NLANCTO
If RetVal
   Then While True
          If [Lancamento Gerador    ] = NLANCTO         And
             [Codigo do Documento   ] = DOCTO_CODIGO    And  
             [Tipo do Documento     ] = DOCTO_TIPO      And
             [Serie do Documento    ] = DOCTO_SERIE     And
             [Codigo da empresa     ] = CODEMP          And
             [Data de Ocorrencia    ] = DATA            And
             ([Sistema Gerador] = "NE" Or [Sistema Gerador] = "IX" Or [Sistema Gerador] = "NX")
             Then AUX_SISTEMA_GERADOR=[Sistema Gerador]
                  ACHOU_REQ = True
                  NUMEROL = [Numero do Lancamento]
                  
                  For i From 1 To 10
                    Aguarde("Bloqueando registro: "+NUMEROL+" -> "+StrVal(i)+" de 10")
                    If Not IsLockRecord()
                       Then QuitLoop
                    EndIf
                  EndFor     

                  QuitLoop
          EndIf   
          Skip
          If Eot() Then QuitLoop EndIf
          Locate Next NLANCTO
          If Not RetVal
             Then QuitLoop
          EndIf     
        EndWhile
EndIf  
Release Vars CODEMP,DATA

;---- Estorno da Requisi‡Æo p/ Nota de Entrada ---------------------------------
If NUMEROL <> ""
   Then Moveto "\\Sistemas\\Estoque\\RqItem"
        Moveto [Numero do Lancamento]
        Locate NUMEROL
        If RetVal
           Then While [Numero do Lancamento]=NUMEROL
                  CODIGO_ITEM = [Codigo do Item]
                  QTD_ITEM    = [Quantidade]
                  CUSTO_TOTAL = [Custo Total]
                  
                  AUX_ESTOQUE("DEVOLUCAO")
                  
                  Moveto "\\Sistemas\\Estoque\\RqItem"
                  Del
                EndWhile
        EndIf
EndIf

If ([NotaEC->Tipo de Operacao]="A" Or [NotaEC->Tipo de Operacao]="I") or
   TIPO_REQUISICAO = "DEVOLUCAO"   
   Then 
        if ACHOU_REQ
          then 
               Moveto "\\Sistemas\\Estoque\\RqCabeca"
               Del
        endif         
        Return True
endif

Moveto "\\Sistemas\\Estoque\\RQCabeca"
Moveto [Numero do Lancamento]
If NUMEROL = ""
   Then 

        While True
          End
          Moveto [Numero do Lancamento]
          If Numero_Lancamento("Interno","Locked_Down")
             Then NUMEROL = PROXLANCTO_NLANC
                  Release Vars PROXLANCTO_NLANC
                  quitloop
          EndIf    
        EndWhile


       ;While True
       ;  End
       ;  If Numero_Lancamento("Interno","")
       ;     Then NUMEROL = PROXLANCTO_NLANC
       ;          Release Vars PROXLANCTO_NLANC 
       ;  EndIf
       ;  Down
       ;  [Numero do Lancamento]=NUMEROL
       ;  If Not IsLockRecord()
       ;     Then QuitLoop
       ;     Else Del
       ;  EndIf
       ;EndWhile
EndIf     
Aguarde("Gerando requisi‡„o no estoque")
                                                                  
If Not ACHOU_REQ        
   Then Moveto "NotaEC"
        GetRecord "\\Sistemas\\Cadastro\\Empresas" AUX_EMP_DESTINO To REG_EMPTRF
        If RetVal
           Then NOME_EMPRESA = REG_EMPTRF["Nome Fantasia Empresa"]
           Else NOME_EMPRESA = ""
        EndIf   
        
        ;---- Cabe‡a -----------------------------------------------------------
        Moveto "\\Sistemas\\Estoque\\RqCabeca"
        [Codigo da Empresa ]=[NotaEC->Codigo da Empresa]
        [Data de Ocorrencia]=AUX_DATA_TRANSF          
        [Tipo de Movimento     ]="S"
        [Descricao do Movimento]="SAIDA"
        [Tipo de Operacao      ]="T"
        [Descricao da Operacao ]="TRANSFERENCIA"
        [Codigo do Documento   ]=[NotaEc->Codigo do Documento]
        [Tipo do Documento     ]=[NotaEc->Tipo do Documento]
        [Serie do Documento    ]=[NotaEc->Serie do Documento]
        [Numero do Documento   ]=[NotaEc->Numero do Documento]
        [Lancamento Gerador    ]=NLANCTO
        [Requisitante          ]=COD_DESTINO
        [Descricao Requisitante]=NOMDEST
        [Sistema Gerador       ]="NE"
        [Lancamento Gerador    ]=NLANCTO
        [Codigo                ]=AUX_EMP_DESTINO
        [Nome Fantasia EmitDest]=NOME_EMPRESA
        Controle_Dia()
        SaveTables                                          
   Else ;---- Cabe‡a - Atualizando Dados ---------------------------------------
        Moveto "\\Sistemas\\Estoque\\RqCabeca"
        [Codigo do Documento   ] = [NotaEc->Codigo do Documento]
        [Tipo do Documento     ] = [NotaEc->Tipo do Documento]
        [Serie do Documento    ] = [NotaEc->Serie do Documento]
        [Numero do Documento   ] = [NotaEc->Numero do Documento]
        [Data de Ocorrencia    ] = [NotaEc->Data de Entrada]
        If Isassigned(AUX_SISTEMA_GERADOR) And AUX_SISTEMA_GERADOR="IX"
           Then [Sistema Gerador] = "NX"
        EndIf
        Controle_Dia()
        SaveTables
EndIf

;---- Itens --------------------------------------------------------------------
Aguarde("Aguarde, inserindo item na requisi‡ao ")

Moveto "NOTAEI"
Moveto [Numero do Lancamento]
Locate NLANCTO
If RetVal
   Then AUX_CONTA_ITENS = 0 
        DynArray AUX_ITENS[]
        While [Numero do Lancamento] = NLANCTO
          AUX_CONTA_ITENS = AUX_CONTA_ITENS + 1
          AUX_ITENS[AUX_CONTA_ITENS] = [Sequencia do Lancamento]
          Skip
          If Eot() Then QuitLoop EndIf
        EndWhile
   Else Mensagem("N„o h  itens correspondente ao lan‡amento "+NLANCTO+"!")
        Return False
EndIf
AUX_CONTADOR = DynArraySize(AUX_ITENS) 
    
SEQ     = 0
QTDTOT  = 0
For ki From 1 To AUX_CONTADOR
  GetRecord "\\Sistemas\\Estoque\\NotaEi" NLANCTO,AUX_ITENS[ki] To REG_NOTAEI
  If RetVal
     Then CODIGO_ITEM = REG_NOTAEI["Codigo do Item"]
          QTD_ITEM    = REG_NOTAEI["Quantidade Convertida"]       ;Quantidade Convertida
          QTDTOT      = QTDTOT + QTD_ITEM                         ;Totalizar Cabe‡a
          
          CUSTOMEDIO  = REG_NOTAEI["Custo Medio Unitario"]        ;Custo Medio do Item
          QTD_TOTAL   = REG_NOTAEI["Quantidade"]                  ;Quantidade do Item
          
          CUSTO_TOTAL = CUSTOMEDIO * QTD_TOTAL                    ;Custo Total do Item 
          
     Else Mensagem("Sequˆncia "+StrVal(AUX_ITENS[ki])+" n„o localizado no lan‡amento "+NLANCTO+"!")
          Return False      
  EndIf
  
  GetRecord "\\Sistemas\\Estoque\\Itens" CODIGO_ITEM To REG_ITEM 
  If RetVal
     Then WS_TITEM = REG_ITEM["Tipo do Item"]
          WS_DITEM = REG_ITEM["Descricao do Item"]
          WS_UNI   = REG_ITEM["Unidade Interna"]
     Else WS_TITEM = ""
          WS_DITEM = ""
          WS_UNI   = ""
  EndIf

  Moveto "\\Sistemas\\Estoque\\RqItem"
  SEQ = SEQ + 1
  End Down
  [Numero do Lancamento   ]=NUMEROL
  [Sequencia do Lancamento]=SEQ
  [Codigo da Empresa      ]=AUX_EMP_DESTINO
  [Tipo do Item           ]=WS_TITEM
  [Codigo do Item         ]=CODIGO_ITEM
  [Descricao do Item      ]=WS_DITEM
  [Unidade Interna        ]=WS_UNI
  [Quantidade             ]=QTD_ITEM
  [Custo Total            ]=CUSTO_TOTAL
  [Custo Unitario         ]=NDecimal([Custo Total]/[Quantidade],5)
  UnLockrecord
  
  Moveto "\\Sistemas\\Estoque\\RqItem"
  Moveto [Numero do Lancamento]
  Locate NUMEROL, SEQ          
  AUX_ESTOQUE("")
EndFor
    
;---- Complementos da Cabe‡a ---------------------------------------------------
Moveto "\\Sistemas\\Estoque\\RqCabeca"
Moveto [Numero do Lancamento]
Locate NUMEROL
If RetVal 
   Then [Quantidade Total      ]=QTDTOT
EndIf
UnLockrecord

Moveto "NotaEC"
UnLockRecord
FormKey

LimpAguarde()

Return True

EndProc ;AUX_REQUISICAO()

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

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

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

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

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

Return True

EndProc  ;

;*******************************************************************************
;* Entrada e Saida de Estoque                                                  *
;*******************************************************************************
Proc AUX_ESTOQUE(PARAM)
Private PARAM

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

TPOP  = "T"
TPMOV = "S"

If PARAM = "DEVOLUCAO"
   Then COD_EMPRESA = AUX_EMP_DESTINO
   Else COD_EMPRESA = [NotaEC->Codigo da Empresa]   
EndIf

DATA = AUX_DATA_TRANSF
MES  = AlinhM(StrVal(Month(AUX_DATA_TRANSF)),2)
ANO  = StrVal(Year(AUX_DATA_TRANSF))

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

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

EndProc ;AUX_ESTOQUE()

;*******************************************************************************
;* Rotina Principal                                                            *
;*******************************************************************************
If Not IsAssigned(SYS_CODIGO_CLIENTE) Then SYS_CODIGO_CLIENTE = ""   EndIf
If Not IsAssigned(AUX_EMP_DESTINO)    Then AUX_EMP_DESTINO = "0003"  EndIf

;Foi passado como parƒmetro 0003 na empresa de destino quando a rotina for NOTAE.  
;AUX_EMP_DESTINO = "0003"

If SYS_CODIGO_CLIENTE <> "0294"
   Then Return False 
EndIf

;---- Tipo de Requisi‡Æo -------------------------------------------------------
;TIPO_REQUISICAO = "DEVOLUCAO"
;TIPO_REQUISICAO = "TRANSFERENCIA"

If AUX_REQUISICAO()
   Then RETORNO_FT_NE = True
   Else RETORNO_FT_NE = False
EndIf
Moveto "NotaEC"

Release Procs AUX_REQUISICAO,AUX_ESTOQUE,AUX_CRIA_FICHA
Release Vars AUX_EMP_DESTINO,AUX_DATA_TRANSF,REG_NOTAEC,CODEMP,DATA,NOMDEST,MSG_REQUISICAO,REG_ITEM,
             NUMEROL,COD_DESTINO,ACHOU_REQ,COD_EMP,NOME_EMPRESA,CODIGO_ITEM,QTD_ITEM,MES_EST,ANO_EST,
             WS_TITEM,WS_DITEM,WS_UNI,SEQ_ITEM,SEQ,QTDTOT,TPOP,TPMOV
