;** RestauBL *******************************************************************
;*  Restaura‡ao de (Balan‡os estoque)                                          *
;*******************************************************************************
;Autor           : Vise Informatica (VISERP)
;Desenvolvido    : 26/08/2016 por Anivel Augusto Rodrigues
;Ultima Alteracao: 18/09/2016 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes showdialog                   
;Ultima Alteracao: 05/12/2016 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes showdialog                   
;Ultima Alteracao: 24/02/2017 por Bruno Carvalho
;Motivo Alteracao: Alterado [Data de Entrada] (Campo Inexistente) p/ [Data_Inclusao] e inlcuido NRecords no prcesso do SCAN -> PROCESSA() 
;Ultima Alteracao: 25/02/2017 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes logica AgrupaItens()
;Ultima Alteracao: 08/08/2017 por Bruno Carvalho
;Motivo Alteracao: Adicionado Gera_Log()           
;Ultima Alteracao: 07/06/2018 por Bruno Carvalho
;Motivo Alteracao: Adicionado/ajustado Grava_LogEx()       
;Ultima Alteracao: 01/02/2019 por Bruno Carvalho
;Motivo Alteracao: Ajustes #0423# 
;Ultima Alteracao: 14/03/2019 por Anivel Augusto Rodrigues                           
;Motivo Alteracao: Ajustes Numero_Lancamento("Interno","Locked_Down")
;Ultima Alteracao: 11/04/2019 por Bruno Carvalho
;Motivo Alteracao: Ajustes copiados de #0322# para a empresa #0434#
;Ultima Alteracao: 03/06/2019 por Bruno Carvalho
;Motivo Alteracao: Ajustes p/ verificar a unidade de origem -> Verifica_Arquivo() e add vari vel de travamento PARAM_TRAVA_UNIDADE
;Ultima Alteracao: 05/07/2019 por Bruno Carvalho
;Motivo Alteracao: Permitir utilizar a mesma unidade de origem ao realizar importa‡Æo/exporta‡Æo de dados -> PARAM_TRAVA_UNIDADE=False p/ #0006# e #0029#
 
;*******************************************************************************
;* ROTINA PROCESSA  -> realiza o processamento da Restaura‡ao                  *
;*******************************************************************************
Proc PROCESSA()

If Not IsTable(VSDGDRIVE+"\\Tab_InvC")  Or
   Not IsTable(VSDGDRIVE+"\\Tab_InvI")    
   Then Mensagem("Na Unidade "+VSDGDRIVE+" n„o contem Balan‡os !")
        Return False
EndIf

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

If IsEmpty("Answer")
   Then Mensagem("Per¡odo ou Empresa Informado n„o ‚ o mesmo de origem !")
        Return False
EndIf

AGUARDE("Aguarde, Restaurando Balan‡os")
ClearAll

If IsTable("Tmp_blc")   Then Delete "Tmp_blc"   EndIf
If IsTable("Tmp_bli")   Then Delete "Tmp_bli"   EndIf

Copy Drive+"\\Tab_InvC"   "Tmp_blc"
Copy Drive+"\\Tab_InvI"   "Tmp_bli"
ClearAll

if sys_Codigo_cliente="0322" Or sys_Codigo_cliente="0423" Or sys_Codigo_cliente="0434"
   then AgrupaItens()
endif   

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

NR = NRecords("Tmp_blc")
View nowindow "\\Sistemas\\Cadastro\\Empresas"
View nowindow "Itens"
View nowindow "Tab_InvC"
View nowindow "Tab_InvI"

View nowindow "Tmp_bli"
CoEdit nowindow "Tmp_blc"
Scan
  Barra(NR, RecNo())
  Aguarde("Aguarde, Importando Balan‡os "+BARRA_STRING)

  NregLidos=NregLidos+1

  NUMEROL_ORIGINAL=[Numero do Lancamento]
  CopyToArray RegCab

  Moveto "Tab_InvC"
  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
 ;  Moveto [Numero do Lancamento]
 ;  If Numero_Lancamento("Interno","")
 ;     Then NUMEROL = PROXLANCTO_NLANC
 ;          Release Vars PROXLANCTO_NLANC
 ;  EndIf
 ;  Down
 ;  [Numero do Lancamento]=NUMEROL
 ;  If Not IsLockRecord()
 ;     Then QuitLoop
 ;  EndIf
 ;EndWhile

  getrecord "\\Sistemas\\Cadastro\\Empresas" RegCab["Codigo da Empresa"] to regempresas 
  If Not retval
     Then NregInval=NregInval+1
          MSG=    "Empresa n„o cadastrado !// //"
          MSG=MSG+"Balan‡o: "+RegCab["Numero do Lancamento"]
          MSG=MSG+"   Empresa: "+RegCab["Codigo da Empresa"]+"// //"
          MSG=MSG+"Lan‡amento inv lido, n„o ser  importado !"
          Mensagem(MSG)

          Moveto "Tmp_blc"
          Loop
  EndIf

  NregGrava=NregGrava+1
  RegCab["Numero do Lancamento"] = NUMEROL
  RegCab["Situacao"            ] = "ABERTO"
  CopyFromDynArray RegCab
  UnLockRecord

  ;;***** Itens do Balanco *****
  Moveto "Tmp_bli"
  Moveto [Numero do Lancamento]
  Locate NUMEROL_ORIGINAL
  While [Numero do Lancamento]=NUMEROL_ORIGINAL
    CopyToDynArray RegItem
    
    Moveto "Tab_InvI"
    Moveto [Numero do Lancamento]
    End
    Down

    RegItem["Numero do Lancamento"]    =NUMEROL
    RegItem["Codigo da Empresa"]       =RegCab["Codigo da Empresa"]
    
    If Not IsBlank(RegItem["Codigo do Item"])
       Then getrecord "Itens" RegItem["Codigo do Item"] to regitens
            If Not retval
               Then RegItem["Codigo do Item"]=""
                    RegItem["Lookup_Item"   ]=""
            EndIf  
    EndIf
    CopyFromDynArray RegItem
    UnLockrecord

    Moveto "Tmp_bli"
    Skip
    If EOT() Then QuitLoop EndIf
  EndWhile

  Moveto "Tmp_blc"
EndScan
Do_It!
ClearAll
IMPNFE=True
Return True
EndProc

;*******************************************************************************
;* ROTINA                                                                      *
;*******************************************************************************
Proc AgrupaItens()
private nlanc, seq, regtabela, codigoitem, codigobar, txred, newqtd     

if sys_Codigo_cliente<>"0322" And sys_Codigo_cliente<>"0423" And sys_Codigo_cliente<>"0434" 
   then return
Endif
if substr(Directory(),1,2)<>"V:" 
   then return
Endif

{Ask} TypeIn "Tmp_bli" Enter 
Moveto [Numero do Lancamento ] Check
Moveto [Codigo da Empresa    ] Check
Moveto [Data_Inclusao        ] Check
Moveto [Codigo Fornecedor    ] Check
Moveto [Custo Unitario       ] TypeIn "_cunit, Calc (_qtde*_cunit) as CustoTotal"
Moveto [Quantidade           ] TypeIn "_qtde, Calc Sum as Quantidade"
Do_It!
ClearAll

Empty("Tmp_bli")

txred=40

nlanc="****"
seq  =0 

NR = NRecords("Answer")

View NOWINDOW "Itens"
Moveto [Codigo Fornecedor]
OrderTable {cdforndescr}
Home

View NOWINDOW "Tmp_bli"
Coedit NOWINDOW "Answer"
scan
  Barra(NR, RecNo())
  Aguarde("Aguarde, Ajustando Dados "+BARRA_STRING)
          
  if [Numero do Lancamento]<>nlanc
     then nlanc=[Numero do Lancamento]
          seq=0
  endif

  moveto "Itens"
  moveto [Codigo Fornecedor]
  Locate IndexOrder by "cdforndescr" [Answer->Codigo Fornecedor]
  if retval
     then codigoitem=[Codigo do Item  ]
     else codigoitem=""      
  endif   
  
  seq = seq + 1
  moveto "Tmp_bli"
  end
  down
  [Numero do Lancamento ]=[Answer->Numero do Lancamento]
  [Sequencia            ]=seq
  [Codigo da Empresa    ]=[Answer->Codigo da Empresa   ]
  [Data_Inclusao        ]=[Answer->Data_Inclusao       ]

  if codigoitem<>""
     then 
          [Lookup_Item           ]=codigoitem
          [Codigo do Item        ]=codigoitem
          [Codigo_Item_Fornecedor]=codigoitem
     else 
          [Descricao do Item]="??? "+[Answer->Codigo Fornecedor]
  endif
            
  [Quantidade           ]=[Answer->Quantidade          ]
  [Custo Unitario       ]=NDecimal([Answer->CustoTotal]/[Answer->Quantidade],5)

  if txred>0
     then [Quantidade   ]=round([Quantidade]- (([Quantidade]*txred)/100),0)
  endif
  
  moveto "Answer"
endscan
do_it!
clearAll 

EndProc ;AgrupaItens

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

Deleta_Arquivo(VSDGDRIVE+"\\Tab_InvC.*")
Deleta_Arquivo(VSDGDRIVE+"\\Tab_InvI.*")
Sleep 2000 

EndProc ;Deleta_Arquivos()

;*******************************************************************************
;* Rotina para gerar o log de registro por usu rio                             *
;*******************************************************************************
Proc Gera_Log()          
;---- Gravando LOG ---------------------------------------------------
If VSDGDTINI<>BlankDate()
   Then AUX_DATA = ", periodo de "+StrVal(VSDGDTINI)+" ate "+StrVal(VSDGDTFIM)
   Else AUX_DATA = ", periodo ate "+StrVal(VSDGDTFIM)
EndIf   

If VSDGDTREF<>BlankDate()
   Then AUX_DTREF = ", data de transa‡„o em "+StrVal(VSDGDTREF)
   Else AUX_DTREF = ""
EndIf

Grava_LogEx("Estoque RestauBL")

EndProc ;Gera_Log()   

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

Aguarde("Aguarde, verificando o arquivo")          
          
;ARQ_ARJ="PT_BLE_"+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))="BL"   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 Not IsAssigned(SYS_CODIGO_CLIENTE)  Then SYS_CODIGO_CLIENTE=""  EndIf

If SYS_CODIGO_CLIENTE = "0006" Or
   SYS_CODIGO_CLIENTE = "0006"
   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 Balan‡os [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
  IMPNFE=False
  
  SetDir "\\Sistemas\\Estoque"
  
  Deleta_Arquivos()
  
  If VSDGEMPRESA="" 
    Then CODEMP="0000" 
    Else CODEMP=VSDGEMPRESA
  EndIf
  
  If Not Verifica_Arquivo()
     Then Loop 
  EndIf
  
  Gera_Log()
  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("W9,EIC",NregLidos)
          MSG=MSG+"//Registros Gravados     : "+Format("W9,EIC",NregGrava)
        ;;MSG=MSG+"//Registros j  Existentes: "+Format("W9,EIC",NregExist)
          MSG=MSG+"//Registros Inv lidos    : "+Format("W9,EIC",NregInval)
          MSG=MSG+"// //NÆo esque‡a de conferir o Balan‡o !"
          Mensagem(MSG)

  EndIf
  Deleta_Arquivos()
  LimpAguarde()
  
  If IMPNFE
     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 conferir o Balan‡o !"
     Else MSG="Opera‡„o Cancelada !"
  EndIf   
  Mensagem(MSG)

  If IsTable("Tmp_blc")  Then Delete "Tmp_blc"   EndIf
  If IsTable("Tmp_bli")  Then Delete "Tmp_bli"   EndIf
  LimpAguarde()
  
EndWhile
ClearAll
Release Vars All
Release Procs All
