;** FT_RQNC ********************************************************************
;*  Complemento p/ Requisi‡Æo de Mercadoria de Devolu‡Æo no Faturamento        *
;*******************************************************************************
;Autor           : Vise Informatica (VISERP)                       
;Desenvolvido em : 06/03/2017 por Bruno Carvalho             
;Ultima Alteracao: 17/10/2017 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes chamado notac                     
;Ultima Alteracao: 16/03/2019 por Anivel Augusto Rodrigues                           
;Motivo Alteracao: Ajustes Numero_Lancamento("Interno","Locked_Down")

;*******************************************************************************
;* Atualizacao Requisicao                                                      *
;*******************************************************************************
Proc GERA_REQUISICAO()

;Vari vel de Controle de Tabela -> TAB_Ref    "FT_DESF"

If Search("NOT",Upper(TAB_Ref))>0
   Then If IsAssigned(CHAVEC) And CHAVEC=0 And Not IsAssigned(REG_NOTAC)
           Then Mensagem("Variavel de sistema REG_NOTAC n„o localizada!")
                Return False     
        EndIf
        NLANCTO = [NotaC->Numero da OF]       
        If CHAVEC=0
           Then AUX_COD_EMP     = REG_NOTAC["Codigo da Empresa"]
                DOCTO_CODIGO    = REG_NOTAC["Codigo do Documento"]
                DOCTO_SERIE     = REG_NOTAC["Serie do Documento"]
                DOCTO_NUMERO    = REG_NOTAC["Numero do Documento"]
                DOCTO_TIPO      = REG_NOTAC["Tipo do Documento"]
                AUX_DATA_TRANSF = REG_NOTAC["Data de Emissao"]
           Else AUX_COD_EMP     = [NotaC->Codigo da Empresa]
                DOCTO_CODIGO    = [NotaC->Codigo do Documento]
                DOCTO_SERIE     = [NotaC->Serie do Documento]
                DOCTO_NUMERO    = [NotaC->Numero do Documento]
                DOCTO_TIPO      = [Tipo do Documento]
                AUX_DATA_TRANSF = [NotaC->Data de Emissao]
        EndIf                                            
        CODEMP   = [NotaC->Codigo da Empresa]
   Else If IsAssigned(CHAVEC) And CHAVEC=0 And Not IsAssigned(REG_FATURAC)
           Then Mensagem("Variavel de sistema REG_FATURAC n„o localizada!")
                Return False     
        EndIf
        NLANCTO = [FaturaC->Numero da OF]       
        CODEMP  = [FaturaC->Codigo da Empresa]
        If CHAVEC=0
           Then AUX_COD_EMP     = REG_FATURAC["Codigo da Empresa"]
                DOCTO_CODIGO    = REG_FATURAC["Docto Nota Gerada"]
                DOCTO_SERIE     = REG_FATURAC["Serie Nota Gerada"]
                DOCTO_NUMERO    = REG_FATURAC["Numero Nota Gerada"]
                AUX_DATA_TRANSF = REG_FATURAC["Data de Emissao"]
           Else AUX_COD_EMP     = [FaturaC->Codigo da Empresa]
                DOCTO_CODIGO    = [FaturaC->Docto Nota Gerada]
                DOCTO_SERIE     = [FaturaC->Serie Nota Gerada]
                DOCTO_NUMERO    = [FaturaC->Numero Nota Gerada]
                AUX_DATA_TRANSF = [FaturaC->Data de Emissao]
        EndIf
        GetRecord "\\Sistemas\\Vendas\\NotaC" AUX_COD_EMP,DOCTO_NUMERO,DOCTO_SERIE TO REG_NOTAC 
        If RetVal
           Then DOCTO_TIPO = REG_NOTAC["Tipo do Documento"]
           Else Mensagem("Nota "+AUX_COD_EMP+" "+DOCTO_NUMERO+" "+DOCTO_SERIE+" referente ao numero de faturamento "+
                NLANCTO+"//n„o foi localizado!")
                Return False
        EndIf
EndIf   

Aguarde("Gerando requisi‡„o no estoque")
DATA     = AUX_DATA_TRANSF   
NOMDEST  = "FT - DEVOLUCAO" 
        
;If SubStr(Upper(Table()),1,3)="FAT"
;   Then Moveto "FaturaC"
;        Moveto [Numero da OF]
;        LockRecord
;EndIf        
                  
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       ] = "FT"               
             Then AUX_SISTEMA_GERADOR=[Sistema Gerador]
                  ACHOU_REQ = True
                  NUMEROL = [Numero do Lancamento]
                  QuitLoop
          EndIf   
          Skip
          If Eot() Then QuitLoop EndIf
          Locate Next NLANCTO
          If Not RetVal
             Then QuitLoop
          EndIf     
        EndWhile
EndIf  
Release Vars DATA

;---- Estorno da Requisi‡Æo p/ o Faturamento/Nota ------------------------------
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 TIPO_REQUISICAO = "DEVOLUCAO"
    Then Moveto "\\Sistemas\\Estoque\\RqCabeca"
         If [Numero do Lancamento]=NUMEROL Then Del EndIf 
         Return True
EndIf
             
Moveto "\\Sistemas\\Estoque\\RQCabeca"
While True
  End
  Moveto [Numero do Lancamento]
  If Numero_Lancamento("Interno","Locked_Down")
     Then NUMEROL = PROXLANCTO_NLANC
          Release Vars PROXLANCTO_NLANC
          quitloop
  EndIf    
EndWhile

;Moveto [Numero do Lancamento]
;If NUMEROL = ""
;   Then While True
;          End
;          If Numero_Lancamento("Interno","")
;             Then NUMEROL = PROXLANCTO_NLANC
;                  Release Vars PROXLANCTO_NLANC 
;          EndIf
;          Down
;          [Numero do Lancamento]=NUMEROL
;          If Not IsLockRecord()
;             Then QuitLoop
;             Else Del
;          EndIf
;        EndWhile
;   Else For i From 1 To 10
;          Aguarde("Bloqueando registro: "+NUMEROL+" -> "+StrVal(i)+" de 10")
;          If Not IsLockRecord()
;             Then QuitLoop
;          EndIf
;        EndFor     
;EndIf
     
Aguarde("Gerando requisi‡„o no estoque")
                                                                  
If Not ACHOU_REQ        
   Then Moveto TAB_Ref  
        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     ]=AUX_COD_EMP
        [Codigo do Documento   ]=DOCTO_CODIGO
        [Serie do Documento    ]=DOCTO_SERIE
        [Numero do Documento   ]=DOCTO_NUMERO
        [Tipo do Documento     ]=DOCTO_TIPO
        [Data de Ocorrencia    ]=AUX_DATA_TRANSF          
        [Tipo de Movimento     ]="S"
        [Descricao do Movimento]="SAIDA"
        [Tipo de Operacao      ]="T"
        [Descricao da Operacao ]="TRANSFERENCIA"
        [Lancamento Gerador    ]=NLANCTO
        [Requisitante          ]=COD_DESTINO
        [Descricao Requisitante]=NOMDEST
        [Sistema Gerador       ]="FT"
        [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   ] = DOCTO_CODIGO
        [Tipo do Documento     ] = DOCTO_TIPO 
        [Serie do Documento    ] = DOCTO_SERIE
        [Numero do Documento   ] = DOCTO_NUMERO
        If Search("NOT",Upper(TAB_Ref))>0
           Then [Codigo do Documento   ] = [NotaC->Codigo do Documento  ]
                [Tipo do Documento     ] = DOCTO_TIPO 
                [Serie do Documento    ] = [NotaC->Serie do Documento   ]
                [Numero do Documento   ] = [NotaC->Numero do Documento  ]
                [Data de Ocorrencia    ] = [NotaC->Data de Emissao      ]
           Else 
                [Codigo do Documento   ] = [FaturaC->Docto Nota Gerada  ]
                [Tipo do Documento     ] = DOCTO_TIPO 
                [Serie do Documento    ] = [FaturaC->Serie Nota Gerada  ]
                [Numero do Documento   ] = [FaturaC->Numero Nota Gerada ]
                [Data de Ocorrencia    ] = [FaturaC->Data de Emissao    ]
        EnDIf
        Controle_Dia()
        SaveTables
EndIf

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

If Search("NOT",Upper(TAB_Ref))>0
   Then Moveto "NotaI"
        Moveto [Codigo da Empresa]
        Locate AUX_COD_EMP,DOCTO_NUMERO,DOCTO_SERIE
        If RetVal
           Then AUX_CONTA_ITENS = 0 
                DynArray AUX_ITENS[]
                While [Codigo da Empresa  ] = AUX_COD_EMP  and
                      [Numero do Documento] = DOCTO_NUMERO and
                      [Serie do Documento ] = DOCTO_SERIE
                  AUX_CONTA_ITENS = AUX_CONTA_ITENS + 1
                  AUX_ITENS[AUX_CONTA_ITENS] = [Item do Documento]
                  Skip
                  If Eot() Then QuitLoop EndIf
                EndWhile
           Else Mensagem("N„o h  itens correspondente a nota "+AUX_COD_EMP+" "+DOCTO_NUMERO+" "+DOCTO_SERIE+"!")
                Return False
        EndIf
   Else Moveto "FaturaI"
        Moveto [Numero da OF]
        Locate NLANCTO
        If RetVal
           Then AUX_CONTA_ITENS = 0 
                DynArray AUX_ITENS[]
                While [Numero da OF] = NLANCTO
                  AUX_CONTA_ITENS = AUX_CONTA_ITENS + 1
                  AUX_ITENS[AUX_CONTA_ITENS] = [Item da OF]
                  Skip
                  If Eot() Then QuitLoop EndIf
                EndWhile
           Else Mensagem("N„o h  itens correspondente ao lan‡amento "+NLANCTO+"!")
                Return False
        EndIf
EndIf
AUX_CONTADOR = DynArraySize(AUX_ITENS) 
    
SEQ     = 0
QTDTOT  = 0
For ki From 1 To AUX_CONTADOR
  If Search("NOT",Upper(TAB_Ref))>0
     Then AUX_LANCTO  = AUX_COD_EMP+" "+DOCTO_NUMERO+" "+DOCTO_SERIE
          GetRecord "\\Sistemas\\Vendas\\NotaI" AUX_COD_EMP,DOCTO_NUMERO,DOCTO_SERIE,AUX_ITENS[ki] To REG_FATURAI
     Else AUX_LANCTO = NLANCTO
          GetRecord "\\Sistemas\\Vendas\\FaturaI" NLANCTO,AUX_ITENS[ki] To REG_FATURAI
  EndIf
  If RetVal
     Then CODIGO_ITEM = REG_FATURAI["Codigo do Item"]
          QTD_ITEM    = REG_FATURAI["Quantidade"]  
          QTDTOT      = QTDTOT + QTD_ITEM          
          
          CUSTOMEDIO  = REG_FATURAI["Custo Medio Unitario"] 
          QTD_TOTAL   = REG_FATURAI["Quantidade"]           
          
          CUSTO_TOTAL = CUSTOMEDIO * QTD_TOTAL
     Else Mensagem("Sequˆncia "+StrVal(AUX_ITENS[ki])+" n„o localizado no lan‡amento "+AUX_LANCTO+"!")
          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 TAB_Ref
;UnLockRecord
;FormKey

;LimpAguarde()

Return True

EndProc ;GERA_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,REG_RQCABECA

MSG="N„o foi encontrada a ficha de estoque referente a "+MES+"/"+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, ANO, MES
  If Not RetVal
     Then End Down
          [Codigo da Empresa   ]=ESTQ_EMPRESA
          [Codigo do Item      ]=ESTQ_ITEM
          [Ano Referencia      ]=ANO
          [Mes Referencia      ]=MES
          If IsLockRecord()
             Then Del
             Else UnLockRecord
          EndIf
          Loop
  EndIf
  QuitLoop
EndWhile

Return True

EndProc  ;AUX_CRIA_FICHA

;*******************************************************************************
;* 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 If Search("NOT",Upper(TAB_Ref))>0
           Then COD_EMPRESA = [NotaC->Codigo da Empresa]
           Else COD_EMPRESA = [FaturaC->Codigo da Empresa]
        EndIf      
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 If Search("NOT",Upper(TAB_Ref))>0
                     Then COD_EMPRESA = [NotaC->Codigo da Empresa]
                     Else COD_EMPRESA = [FaturaC->Codigo da Empresa]
                  EndIf     
             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

Switch  
  Case SYS_CODIGO_CLIENTE = "0294" : AUX_EMP_DESTINO="0003"
  OtherWise                        : Return
EndSwitch  

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

GERA_REQUISICAO()

Release Procs GERA_REQUISICAO,AUX_ESTOQUE,AUX_CRIA_FICHA
Release Vars AUX_EMP_DESTINO,AUX_DATA_TRANSF,REG_FATURAC,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,COD_EMP,REG_NOTAC
