;** RestauRQ *******************************************************************
;*  Restaura‡ao de Requisi‡äes                                                 *
;*******************************************************************************
;Autor           : Vise Informatica (VISERP)
;Desenvolvido    : 08/05/2020 por Bruno Carvalho              
;Ultima Alteracao:   /  /     por                             
;Motivo Alteracao: 

;*******************************************************************************
;* ROTINA PROCESSA  -> realiza o processamento da Restaura‡ao                  *
;*******************************************************************************
Proc PROCESSA()

If Not IsTable(VSDGDRIVE+"\\RqCabeca") Or
   Not IsTable(VSDGDRIVE+"\\RqItem")   
   Then Mensagem("Na Unidade "+VSDGDRIVE+" n„o contem Requisi‡äes !")
        Return False
EndIf

If IsTable(VSDGDRIVE+"\\Requisit")
   Then Add VSDGDRIVE+"\\Requisit" "Requisit"
EndIf

{Ask} TypeIn VSDGDRIVE+"\\RqCabeca" Enter Check
Moveto [Codigo da Empresa    ] TypeIn "~VSDGEMPRESA.."
Moveto [Data de Ocorrencia   ] TypeIn ">=~VSDGDTINI,<=~VSDGDTFIM"
Do_It!
ClearAll

If IsEmpty("Answer")
   Then Mensagem("Requisi‡äes nÆo localizadas no periodo informado!")
        Return False
EndIf

AGUARDE("Aguarde, restaurando requisi‡äes")
ClearAll

If IsTable("Tmp_RCab") Then Delete "Tmp_RCab" EndIf
If IsTable("Tmp_RIte") Then Delete "Tmp_RIte" EndIf
If IsTable("Tmp_RItG") Then Delete "Tmp_RItG" EndIf
If IsTable("Tmp_RMat") Then Delete "Tmp_RMat" EndIf

Copy "Answer"           "Tmp_RCab"
Copy Drive+"\\RqItem"   "Tmp_RIte"
Copy Drive+"\\RqItemG"  "Tmp_RItG"
Copy Drive+"\\RqMatPri" "Tmp_RMat"

NregLidos=0
NregGrava=0
NregExist=0
NregInval=0

NR = NRecords("Tmp_RCab")

View "RqCabeca"
View "RqItem"
View "RqItemG"
View "RqMatPri"

View "Tmp_RIte"
View "Tmp_RItG"
View "Tmp_RMat"

CoEdit "Tmp_RCab"
Scan
  Barra(NR, RecNo())
  Aguarde("Aguarde, importando requisi‡äes "+BARRA_STRING)

  NregLidos=NregLidos+1
  
  NUMEROL_ORIGINAL=[Numero do Lancamento]
  CopyToArray RegCab
  
  If RegCab["Codigo"]<>""
     Then GetRecord "\\Sistemas\\Cadastro\\Destinat" RegCab["Codigo"] To Reg_Busca_Lookup 
          If Not Retval
             Then NregInval=NregInval+1
                  MSG=    "Emitente/Destinat rio n„o cadastrado !// //"
                  MSG=MSG+"Requisi‡Æo: "+NUMEROL_ORIGINAL
                  MSG=MSG+"   Codigo: "+RegCab["Codigo"]+"// //"
                  MSG=MSG+"Lan‡amento inv lido, n„o ser  importado !"
                  Mensagem(MSG)
                  Loop
          EndIf
  EndIf
  
  ;---- Verifica Duplicidade ---------------------------------------------------
  ;Fica invi vel a verifica‡Æo apenas pelo numero do lan‡amento original da requisi‡Æo
  ;pois o usu rio pode apagar a requisi‡Æo e re-lan‡ar em um novo numero de lan‡amento
  ;Moveto "RqCabeca"
  ;Moveto [Sistema Gerador]
  ;Locate IndexOrder By "Ind01" "IM",NUMEROL_ORIGINAL
  ;If RetVal
  ;   then NregExist=NregExist+1
  ;        Moveto "Tmp_RCab"
  ;        Loop
  ;EndIf
  
  Moveto "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

  NregGrava = NregGrava+1
  
  RegCab["Numero do Lancamento"] = NUMEROL
  RegCab["Numero_Controle_Dia" ] = ""
  RegCab["Sistema Gerador"     ] = "IM"
  RegCab["Lancamento Gerador"  ] = NUMEROL_ORIGINAL
  RegCab["Numero do Corte"     ] = ""

  If Not IsBlank(RegCab["Requisitante"])
     Then GetRecord "\\Sistemas\\Estoque\\Requisit" RegCab["Requisitante"] To Reg_Busca_Lookup
          If Not Retval
             Then RegCab["Requisitante"]=""
                  RegCab["Descricao Requisitante"]=""
          EndIf
  EndIf
  If Not IsBlank(RegCab["Codigo da Empresa"])
     Then GetRecord "\\Sistemas\\Cadastro\\Empresas" RegCab["Codigo da Empresa"] To Reg_Busca_Lookup
          If Not Retval
             Then RegCab["Codigo da Empresa"    ]=""
                  RegCab["Nome Fantasia Empresa"]=""
          EndIf
  EndIf
  CopyFromDynArray RegCab
  UnLockRecord
  
  For ty From 1 To 3
    Switch 
      Case ty=1 : Moveto "Tmp_RIte"    ;Itens 
      Case ty=2 : Moveto "Tmp_RItG"    ;Itens de Grade
      Case ty=3 : Moveto "Tmp_RMat"    ;RqMatPri
    EndSwitch
    
    Moveto [Numero do Lancamento]
    Locate NUMEROL_ORIGINAL
    While [Numero do Lancamento]=NUMEROL_ORIGINAL
      CopyToDynArray RegItem
  
      RegItem["Codigo da Empresa"]        = RegCab["Codigo da Empresa"]
      RegItem["Numero do Lancamento"]     = NUMEROL
    
      If Not IsBlank(RegItem["Codigo do Item"])
         Then GetRecord "\\Sistemas\\Estoque\\Itens" RegItem["Codigo do Item"] To Reg_Busca_Lookup
              If Not Retval
                 Then Mensagem("Item "+RegItem["Codigo do Item"]+" da requisi‡Æo "+NUMEROL+" nÆo foi localizado no cadastro de itens!")
                      RegItem["Codigo do Item"]=""
              EndIf  
      EndIf
  
      Switch 
        Case ty=1 : Moveto "RqItem"    
        Case ty=2 : Moveto "RqItemG"  
        Case ty=3 : Moveto "RqMatPri" 
      EndSwitch
    
      Moveto [Numero do Lancamento]
      End Down
    
      CopyFromDynArray RegItem
      UnLockrecord
    
      Switch 
        Case ty=1 : Moveto "Tmp_RIte"    ;Itens 
        Case ty=2 : Moveto "Tmp_RItG"    ;Itens de Grade
        Case ty=3 : Moveto "Tmp_RMat"    ;RqMatPri
      EndSwitch
      Skip
      If EOT() Then QuitLoop EndIf
    EndWhile
  EndFor

  Moveto "Tmp_RCab"
EndScan
Do_It!
ClearAll
IMPRQ=True
Return True

EndProc

;*******************************************************************************
;* ROTINA PARA DELETAR ARQUIVOS                                                *
;*******************************************************************************
Proc Deleta_Arquivos()

Deleta_Arquivo(VSDGDRIVE+"\\RqCabeca.*")
Deleta_Arquivo(VSDGDRIVE+"\\RqItem.*")
Deleta_Arquivo(VSDGDRIVE+"\\RqItemG.*")
Deleta_Arquivo(VSDGDRIVE+"\\RqMatPri.*")
Deleta_Arquivo(VSDGDRIVE+"\\Requisit.*")
Sleep 2000 

EndProc ;Deleta_Arquivos()

;*******************************************************************************
;* Rotina para Verificar o Nome do Arquivo                                     *
;*******************************************************************************          
Proc Verifica_Arquivo()
Private Array_Arquivo,wcs,ELinha,MSG

Aguarde("Aguarde, verificando o arquivo")          
          
;ARQ_ARJ="PT_NFE_"+CODEMP+"_"+
;        AlinhM(StrVal(Year(VSDGDTREF)),4) +
;        AlinhM(StrVal(Month(VSDGDTREF)),2)+
;        AlinhM(StrVal(Day(VSDGDTREF)),2)  +
;        ".ARJ"          
          
DynArray Array_Arquivo[]

Wcs=0
If IsFile(PrivDir()+"Dir.Txt")
   Then Deleta_Arquivo(PrivDir()+"Dir.Txt")
EndIf

Lista_DiretorioF(VSDGDRIVE+"\\","PT*.ARJ")

If Not IsFile(PrivDir()+"Dir.Txt")
   Then Sleep(1000)
        Return False
   Else Editor Open PrivDir()+"Dir.Txt"
        If ErrorCode()=27
           Then Sleep 1000
                Return False
        EndIf
        wcs=0
        While True
          Extrair_Linha()
          If IsBlank(ELinha) Then QuitLoop EndIf
          wcs=wcs+1
          Array_Arquivo[wcs] = Completa(SubStr(ELINHA,1,Len(ELINHA)-1),40," ")+" "
        EndWhile
        CancelEdit
EndIf     

ARQ_ARJ = ""
If DynArraySize(Array_Arquivo)=0
   Then Mensagem("Arquivo de importa‡Æo nÆo foi localizado!") 
        Return False
   Else MSG = ""
        For wi From 1 To DynArraySize(Array_Arquivo)
          If Upper(SubStr(Array_Arquivo[wi],1,2))="PT"   And
             Upper(SubStr(Array_Arquivo[wi],5,2))="RQ"   And
             Upper(SubStr(Array_Arquivo[wi],8,4))=CODEMP And
             Upper(SubStr(Array_Arquivo[wi],13,4))=AlinhM(StrVal(Year(VSDGDTREF)),4)  And
             Upper(SubStr(Array_Arquivo[wi],17,2))=AlinhM(StrVal(Month(VSDGDTREF)),2) And
             Upper(SubStr(Array_Arquivo[wi],19,2))=AlinhM(StrVal(Day(VSDGDTREF)),2)
             Then ARQ_ARJ = Array_Arquivo[wi]
                  If PARAM_TRAVA_UNIDADE
                     Then If Upper(SubStr(Array_Arquivo[wi],4,1)) = SubStr(Upper(Directory()),1,1)
                             Then MSG = "NÆo ‚ poss¡vel importar o arquivo na unidade de origem!"
                             Else MSG = ""           
                          EndIf
                     Else QuitLoop     
                  EndIf
          EndIf
        EndFor
        If MSG<>""
           Then Mensagem(MSG)
                Return False
        EndIf   
        Release Vars Array_Arquivo,MSG
        If ARQ_ARJ=""
           Then Mensagem("Arquivo de importa‡Æo nÆo foi localizado!")
                Return False
        EndIf
EndIf

Return True                  
                  
EndProc ;Verifica_Arquivo()                

;*******************************************************************************
;* Rotina                                                                      *
;*******************************************************************************
Proc SD_Dialog(Disparo,Campo,Evento,Elemento)
Temp=True
MSG_CAMPO=""
TECLA    =""
If Disparo="OPEN"  Then AoCriarShowDialog() EndIf
If Disparo="EVENT" And Evento["Type"]="KEY" Then
   Switch
     Case Evento["KeyCode"] =   9: Temp=False
     Case Evento["KeyCode"] = -59: Dialog_F1()
     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_EMPRESA"       : Campo="NO" 
            Case Campo="TG_DTINI"         : Campo="TG_EMPRESA"
            Case Campo="TG_DTFIM"         : Campo="TG_DTINI"
            Case Campo="TG_DTREF"         : Campo="TG_DTFIM" 
            Case Campo="TG_DRIVES"        : Campo="TG_DTREF"
            Case Campo="YES" Or Campo="NO": Campo="TG_EMPRESA"
          EndSwitch
     Case Evento["KeyCode"] = 13:
          Temp=False
          If Checa_TAG()
             Then Switch                                                                       
                    Case Campo="TG_EMPRESA" : Campo="TG_DTINI"
                    Case Campo="TG_DTINI"   :
                         If Isblank(VSDGDTINI)
                            Then Mensagem("Data inicial invalida !")
                                 Campo="TG_DTINI"
                            Else Campo="TG_DTFIM"
                         EndIf
                    Case Campo="TG_DTFIM"   :
                         If IsBlank(VSDGDTFIM) or
                            VSDGDTFIM<VSDGDTINI
                            Then Mensagem("Data final invalida !")
                            Else Campo="TG_DTREF"
                         EndIf
                    Case Campo="TG_DTREF"   : Campo="TG_DRIVES"
                    Case Campo="TG_DRIVES"   :
                         VSDGDRIVE=ControlValue("TG_DRIVES")
                         Campo="YES"
                  EndSwitch
          EndIf
   EndSwitch
EndIf
Switch
  Case Campo="TG_DTREF" :
       MSG_CAMPO="Informe a data da Transa‡„o"
  Case Campo="TG_EMPRESA":
       MSG_CAMPO="Informe uma Empresa"
  Case Campo="TG_DTINI":
       MSG_CAMPO="Informe a data inicial"
  Case Campo="TG_DRIVES":
       MSG_CAMPO="Selecione o drive desejado !"
       TECLA=Chr(27)+""+Chr(26)+"=Selecionar  "
EndSwitch
Monta_Prompt(MSG_CAMPO,TECLA)
Return Temp
EndProc

;*******************************************************************************
;* ROTINA PRINCIPAL                                                            *
;*******************************************************************************
AutoLib="\\Sistemas\\Cadastro\\Bib_Show,\\Sistemas\\Cadastro\\Bibliot"
LimpAguarde()
SYS_VALOR()

If SYS_CODIGO_CLIENTE = "0006" Or
   SYS_CODIGO_CLIENTE = "0029" Or
   SYS_CODIGO_CLIENTE = "0266"
   Then PARAM_TRAVA_UNIDADE = False
   Else PARAM_TRAVA_UNIDADE = True
EndIf
VSDGEMPRESA         = ""
VSDGDTINI           = BlankDate()
VSDGDTFIM           = Today()-1
VSDGDTREF           = BlankDate()

DynArray Array_Drives[]
SysInfo Drives To Array_Drives
VSDGDRIVE=SubStr(Directory(),1,2)

While True
  ShowDialog "Importa‡„o de Requisi‡äes [Estoque]" Proc "SD_Dialog"
  Trigger "OPEN","ARRIVE"
  Key "F1","ENTER","ESC","TAB",
      -104, -105, -106, -107, -108, -109, -110, -111, -112, -113, -139, -140  
   @ 05,12   Height 11 Width 72
   
    Label  @ 00,00 "Empresa"  For "TG_EMPRESA"
    Accept @ 01,01 Width 07 "A4"  Picture "[&,#][#*#]" Tag "TG_EMPRESA" To VSDGEMPRESA
    Accept @ 01,09 Width 25 "A20" Picture "!*!" Tag "TG_NOMEMP" To VSDGNOMEMP

    Label  @ 02,00 "Per¡odo Referente de" For "TG_DTINI"
    Accept @ 03,03 Width 13 "D"  Picture "#[#];.##;.##[##]" Tag "TG_DTINI" To VSDGDTINI
    Label  @ 03,16 "at‚" For "TG_DTFIM"
    Accept @ 03,21 Width 13 "D"  Picture "#[#];.##;.##[##]" Tag "TG_DTFIM" To VSDGDTFIM

    Label  @ 04,00 "Data Transa‡„o" For "TG_DTREF"
    Accept @ 05,03 Width 13 "D"  Picture "#[#];.##;.##[##]" Tag "TG_DTREF" To VSDGDTREF

    Label  @ 00,35 "Drives:" For "TG_DRIVES"
    PickDynArrayIndex @ 01,36 Height 4 width 33
     Columns 7
      Array_Drives
       Tag "TG_DRIVES"
        To VSDGDRIVE

    Pushbutton @ 07,22 width 11 "~O~k"      OK     Default Value "Ok" Tag "YES" To BottonValue
    Pushbutton @ 07,36 width 11 "~C~ancela" CANCEL                    Tag "NO"  To BottonValue

  EndDialog
  DRIVE=VSDGDRIVE
  If Not RetVal Then QuitLoop EndIf
  IMPRQ=False
  
  SetDir "\\Sistemas\\Estoque"
  
  Deleta_Arquivos()
  
  If VSDGEMPRESA="" 
    Then CODEMP="0000" 
    Else CODEMP=VSDGEMPRESA
  EndIf

  If Not Verifica_Arquivo()
     Then Loop 
  EndIf
  
  Aguarde("Aguarde, descompactando o arquivo "+ARQ_ARJ)
  FileWrite PrivDir()+"funcmd.txt" From "CMD|"+"c:\\vise\\Varj.exe e -y "+VSDGDRIVE+"\\"+ARQ_ARJ+" "+VSDGDRIVE+"\\"+"\n"        
  ExecVisecf(PrivDir()+"funcmd.txt","")
  Sleep 3000
  
  If Processa()
     Then MSG="Opera‡ao Finalizada.//"
          MSG=MSG+"//Registros Lidos        : "+Format("W5,EIC",NregLidos)
          MSG=MSG+"//Registros Gravados     : "+Format("W5,EIC",NregGrava)
          MSG=MSG+"//Registros j  Existentes: "+Format("W5,EIC",NregExist)
          MSG=MSG+"//Registros Inv lidos    : "+Format("W5,EIC",NregInval)
          MSG=MSG+"// //NÆo esque‡a de Reprocessar o Estoque !"
          Mensagem(MSG)

  EndIf
  Deleta_Arquivos()
  LimpAguarde()
  
  If IMPRQ
     Then ARQ_IMP=VSDGDRIVE+"\\IMPORTADO_"+
                  Substr(ARQ_ARJ,1,20)+"_"+
                  Substr(Time(),1,2)  +
                  Substr(Time(),4,2)  +
                  Substr(Time(),7,2)  +
                  ".ARJ"
  
          Aguarde("Aguarde, renomeando arquivo importado")
          ExecVise("REN "+VSDGDRIVE+"\\"+ARQ_ARJ+" \""+ARQ_IMP+"\"")
          Sleep 1000     
          
          MSG="Opera‡ao Finalizada.// //"
          MSG=MSG+"NÆo esque‡a de Reprocessar o Estoque !"
     Else MSG="Opera‡„o Cancelada !"
  EndIf   
  Mensagem(MSG)

  If IsTable("Tmp_RCab") Then Delete "Tmp_RCab"  EndIf
  If IsTable("Tmp_RIte") Then Delete "Tmp_RIte"  EndIf
  If IsTable("Tmp_RItG") Then Delete "Tmp_RItG"  EndIf
  If IsTable("Tmp_RMat") Then Delete "Tmp_RMat"  EndIf
  LimpAguarde()
EndWhile
ClearAll
Release Vars All
Release Procs All