;** GerOFNFe **************************************************************************
;*  Gera OF p/ emissÆo de NF-e                      Auditoria                         *
;**************************************************************************************
;Autor           : Vise Informatica (VISERP)
;Desenvolvido    : 14/07/2010 por Anivel Augusto Rodrigues
;Ultima Alteracao: 11/08/2010 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Destinacao/Itens
;Ultima Alteracao: 30/08/2010 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Diretorio PrivDir()
;Ultima Alteracao: 19/10/2011 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Limpa CODIGO_USUARIO de origem
;Ultima Alteracao: 19/10/2011 por Bruno Carvalho
;Motivo Alteracao: Ajustes para exigir dados nos campos EMPRESA e DESTIN
;Ultima Alteracao: 30/11/2011 por Bruno Carvalho
;Motivo Alteracao: Altera‡Æo de "ExecVise -> Vexe"
;Ultima Alteracao: 01/02/2012 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes CFOP Item                       
;Ultima Alteracao: 10/04/2012 por Karina Andrade
;Motivo Alteracao: Ajustes CFOP Item  
;Ultima Alteracao: 17/10/2012 por Bruno Carvalho
;Motivo Alteracao: Ajustes p/ limpar campo "ValorINSS"
;Ultima Alteracao: 04/03/2013 por Karina Andrade
;Motivo Alteracao: Ajustes p/ pegar observa‡Æo da destina‡Æo
;Ultima Alteracao: 07/03/2013 por Bruno Carvalho
;Motivo Alteracao: Ajustes Busca_Lookup quando vai puxar a Observa‡Æo da Destina‡Æo
;Ultima Alteracao: 03/04/2013 por Karina Andrade
;Motivo Alteracao: Ajustes CFOP Item
;Ultima Alteracao: 04/04/2013 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes CFOP Item, PEGA_CFOP       
;Ultima Alteracao: 04/04/2013 por Kamila Gomes
;Motivo Alteracao: Ajustes CFOP Item, PEGA_CFOP       
;Ultima Alteracao: 16/04/2013 por Bruno Carvalho
;Motivo Alteracao: Inserido Checa_Estoque() e Estoque() na rotina dos itens
;Ultima Alteracao: 22/04/2013 por Bruno Carvalho
;Motivo Alteracao: Ajustes Transfere_Dados_OF()
;Ultima Alteracao: 06/05/2013 por Karina Andrade
;Motivo Alteracao: Ajustes OPCAO_RED_BCICMS (nÆo estava declarada) 
;Ultima Alteracao: 22/05/2013 por Bruno Carvalho
;Motivo Alteracao: Ajsutes Cria_Ficha()
;Ultima Alteracao: 25/08/2015 por Kamila Gomes 
;Motivo Alteracao: Altera‡Æo no processo dos Numero do Lan‡amento - Numero_Lancamento()
;Ultima Alteracao: 27/05/2016 por Bruno Carvalho 
;Motivo Alteracao: Alterado NUM_LANCTO = PROXLANCTO_NLANC -> Padroniza‡Æo da rotina de Numero_Lancamento()
;Ultima Alteracao: 10/08/2016 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes nova estrutura das tabelas      
;Ultima Alteracao: 06/12/2016 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes showdialog    
;Ultima Alteracao: 02/05/2017 por Rafael Matos
;Motivo Alteracao: Ajustes RegFatCC["Numero da OF"]      
;Ultima Alteracao: 16/06/2017 por Kamila Gomes
;Motivo Alteracao: Ajustes RegClie          
;Ultima Alteracao: 01/08/2016 por Bruno Carvalho
;Motivo Alteracao: Removido ["Numero Nota Original"]
;Ultima Alteracao: 05/08/2017 por Bruno Carvalho
;Motivo Alteracao: Substituido [Valor INSS] -> [Valor TC]
;Ultima Alteracao: 25/09/2017 por Bruno Carvalho
;Motivo Alteracao: Ajustes Checa_MVA() 
;Ultima Alteracao: 16/05/2018 por Bruno Carvalho
;Motivo Alteracao: Ajustes GetRecord "P_Fatura"
;Ultima Alteracao: 16/03/2019 por Anivel Augusto Rodrigues                           
;Motivo Alteracao: Ajustes Numero_Lancamento("Interno","Locked_Down")
;Ultima Alteracao: 24/12/2019 por Bruno Carvalho
;Motivo Alteracao: Adicionado Bib_Proc

;*******************************************************************************
;* Rotina para transferir dados de OF para outra OF                            *
;*******************************************************************************
Proc Transfere_Dados_OF()
ClearAll
AGUARDE("Aguarde, verificando dados em "+VSDGDRIVE)

For wwi From 1 to 5 
 Switch
   Case wwi=1 : id="C" 
   Case wwi=2 : id="H" 
   Case wwi=3 : id="I" 
   Case wwi=4 : id="V" 
   Case wwi=5 : id="D" 
 EndSwitch
 ArqOrig=VSDGDRIVE+"\\"+VSDGEMPRESA+"_"+NDOCTO+id
 
 ARQ=VSDGDRIVEPriv+NDOCTO+id
 If IsTable(ARQ)
    Then Delete ARQ
 EndIf   
 
 Xcopia_Arquivo(ARQOrig+".* "+ARQ+".*")
 Sleep(1000)
EndFor

TabelaC =VSDGDRIVEPriv+NDOCTO+"C"
TabelaCC=VSDGDRIVEPriv+NDOCTO+"H"
TabelaI =VSDGDRIVEPriv+NDOCTO+"I"
TabelaV =VSDGDRIVEPriv+NDOCTO+"V"
TabelaD =VSDGDRIVEPriv+NDOCTO+"D"

If Not IsTable(TabelaC) Or
   Not IsTable(TabelaI) Or
   Not IsTable(TabelaV) Or
   Not IsTable(TabelaD) Or
   Not IsTable(TabelaCC)
   Then Mensagem("Na Unidade "+VSDGDRIVE+" n„o contem dados !")
        Return False
EndIf

View NoWindow TabelaC
MSG="Documento p/ emissÆo da NF-e://"
MSG=MSG+Completa("//Documento: "+[Numero Nota Gerada]+"/"+[Serie Nota Gerada],50," ")
MSG=MSG+Completa("//EmissÆo  : "+Format("D13",[Data de Emissao]),50," ")
MSG=MSG+Completa("//Cliente  : "+[Codigo]+"/"+[Razao Social],50," ")
MSG=MSG+Completa("//Valor    : "+LTrim(Format("W12.2,EIC",[Valor Nota Fiscal])),50," ")
MSG=MSG+"// //Confirma restaurar este documento ?"
If Not ConfGeral(MSG)
   Then ClearAll
        Return False
EndIf      

AGUARDE("Aguarde, Restaurando dados de "+VSDGDRIVE)

View NoWindow "\\Sistemas\\Cadastro\\Empresas"
Moveto [Codigo da Empresa]
Locate VSDGEMPRESA2
If RetVal
   Then ATIVEMPR   =[\Sistemas\Cadastro\Empresas->Atividade      ]
        ESTEMPRESA =[\Sistemas\Cadastro\Empresas->Uf Empresa     ]
          TPEMPR   =[\Sistemas\Cadastro\Empresas->Tipo da Empresa]
EndIf
ClearAll

CoEdit NoWindow "FaturaI","FaturaV","FaturaC","FaturaCC",
                "\\Sistemas\\Cadastro\\Destinat",
                "\\Sistemas\\Estoque\\SdEstq",
                TabelaC, TabelaI, TabelaV, TabelaD, TabelaCC

Moveto TabelaD
CopyToArray RegClie

Moveto "\\Sistemas\\Cadastro\\Destinat"
Moveto [Codigo]
Locate RegClie["Codigo"]
If Not RetVal
   Then End
        Down
        RegClie["Chapa"]=SYS_CHAPA_USUARIO
        RegClie["Nome"] =SYS_NOME_USUARIO
        CopyFromArray RegClie 
EndIf

UnLockRecord

Moveto TabelaC
CopyToArray RegCab

Moveto "FaturaC"
While True
  End
  Moveto [Numero da OF]
  If Numero_Lancamento("Interno","Locked_Down")
     Then ORDFAT = PROXLANCTO_NLANC
          Release Vars PROXLANCTO_NLANC
          quitloop
  EndIf    
EndWhile

RegCab["Numero da OF"            ]=ORDFAT
RegCab["Codigo da Destinacao"    ]=""
RegCab["Docto Nota Gerada"       ]=""
RegCab["Serie Nota Gerada"       ]=""
RegCab["Numero Nota Gerada"      ]=""
RegCab["Sistema Gerador"         ]=""
RegCab["Numero Lancamento Cheque"]=""
RegCab["Numero Pedido_Orcamento" ]=""
RegCab["Numero do Pedido"        ]=""
RegCab["Numero do Orcamento"     ]=""
RegCab["Numero_Carregamento"     ]=""
RegCab["Codigo_Usuario"          ]=""
RegCab["Numero_Controle_Dia"     ]=""
RegCab["Valor TC"                ]=BlankNum()
CopyFromArray RegCab


;While True
;  Moveto [Numero da OF]
;  End
;  If Numero_Lancamento("Interno","")
;     Then ORDFAT = PROXLANCTO_NLANC
;          Release Vars PROXLANCTO_NLANC
;  EndIf
;  Locate ORDFAT
;  If Not Retval
;     Then End Down
;          RegCab["Numero da OF"            ]=ORDFAT
;          RegCab["Codigo da Destinacao"    ]=""
;          RegCab["Docto Nota Gerada"       ]=""
;          RegCab["Serie Nota Gerada"       ]=""
;          RegCab["Numero Nota Gerada"      ]=""
;          RegCab["Sistema Gerador"         ]=""
;          RegCab["Numero Lancamento Cheque"]=""
;          RegCab["Numero Pedido_Orcamento" ]=""
;          RegCab["Numero do Pedido"        ]=""
;          RegCab["Numero do Orcamento"     ]=""
;;          RegCab["Numero_Carregamento"     ]=""
;          RegCab["Codigo_Usuario"          ]=""
;          RegCab["Numero_Controle_Dia"     ]=""
;          RegCab["Valor TC"                ]=BlankNum()
;          CopyFromArray RegCab
;          If Not IsLockRecord()
;             Then QuitLoop
;             Else Del
;          EndIf
;  EndIf
;EndWhile

[Codigo da Empresa       ]=VSDGEMPRESA2
[Codigo da Destinacao    ]=VSDGDESTIN
Controle_Dia()

;*** Pega Observa‡Æo da destina‡Æo + OF ****************************************
Moveto [Codigo da Destinacao]
If Busca_Lookup("Codigo da Destinacao",VSDGDESTIN,"")
  Then [Observacao na Nota Fiscal]="*"+REG_BUSCA_LOOKUP["Observacao_Destinacao"]+"* "+[Observacao na Nota Fiscal]
EndIf

;*** Pega UF/Tipo Empresa Controle ***
Moveto [Codigo da Empresa]
If Busca_Lookup("Codigo da Empresa",[FaturaC->Codigo da Empresa],"Empresa: "+[FaturaC->Codigo da Empresa]+" sem UF !")
   Then UF_EMPRESA=REG_BUSCA_LOOKUP["UF Empresa"]
        TPEMPR    =REG_BUSCA_LOOKUP["Tipo da Empresa"]
        ATIVEMPR  =REG_BUSCA_LOOKUP["Atividade"]
        CNPJNF_e  =Tira_CharNum(REG_BUSCA_LOOKUP["CGC Empresa"])
        NOMENF_e  =REG_BUSCA_LOOKUP["Razao Social Empresa"]
   Else UF_EMPRESA="??"
        TPEMPR    ="??"
        ATIVEMPR  ="??"
        CNPJNF_e  ="??"
        NOMENF_e  ="??"
EndIf

;*** Aliquota do Estado ***
Moveto [UF]
If Busca_Lookup("UF",[FaturaC->UF],"")
   Then UF_ALIQUOTA_ICMS         =REG_BUSCA_LOOKUP["Aliquota de ICMS"]
        UF_ALIQUOTA_ICMS_INTERNA =REG_BUSCA_LOOKUP["Aliquota de ICMS_INTERNA"]
   Else UF_ALIQUOTA_ICMS         =BlankNum()
        UF_ALIQUOTA_ICMS_INTERNA =BlankNum()
EndIf

If Busca_Lookup("UF",UF_EMPRESA,"")
   Then UFEMPRESA_ALIQUOTA_ICMS=REG_BUSCA_LOOKUP["Aliquota de ICMS"]
   Else UFEMPRESA_ALIQUOTA_ICMS=BlankNum()
EndIf
                                    

Moveto "FaturaCC"
Moveto [Numero da Of]
Locate ORDFAT
If RetVal
   Then Del
EndIf

Moveto "FaturaI"
Moveto [Numero da Of]
Locate ORDFAT
If RetVal
   Then While True
          Del
          Locate Next ORDFAT
          If Not RetVal
             Then QuitLoop
          EndIf
        EndWhile
EndIf

Moveto "FaturaV"
Moveto [Numero da Of]
Locate ORDFAT
If RetVal
   Then While True
          Del
          Locate Next ORDFAT
          If Not RetVal
             Then QuitLoop
          EndIf
        EndWhile
EndIf

Moveto TabelaI
Scan
  CopyToArray RegIt
  Moveto "FaturaI"
  End Down
  RegIt["Numero da OF"]=ORDFAT
  
  CopyFromArray RegIt
  [Codigo do Item     ]=""
  [Codigo do Item     ]=RegIt["Codigo do Item"]

  CONT_NEG = 1
  Atualiza = False
  If AUALIZA_ESTOQUE="S"
     Then CONT_NEG = 0
          Atualiza=True
          If Not Checa_Estoque()
             Then MSG=    Completa("Item: "+[Codigo do Item]+" - "+SubStr([Descricao do Item ],1,30),60," ")+"////"
                  
                  Linha1=Chr(179)+"   Quantidade"+Chr(179)+"      Estoque"+Chr(179)+"     Falta em"+Chr(179)
                  Linha2=Chr(179)+"       pedida"+Chr(179)+"        atual"+Chr(179)+"      estoque"+Chr(179)
                  Linha3=Chr(179)+Format("W13.3,EICB",[Quantidade])+
                         Chr(179)+Format("W13.3,EICB",SALDOATUAL  )+
                         Chr(179)+Format("W13.3,EICB",NOVOSALDO*-1)+Chr(179)         
        
                  MSG=MSG+Linha1+"//"
                  MSG=MSG+Linha2+"//"
                  MSG=MSG+Linha3+"// //"       
        
                  Release Vars ItemRef, ItemCodFor, Linha1, Linha2, Linha3
        
                  If PARAM_BLOQUEIA_NEG="S"
                     Then Atualiza=False
                          Moveto "FaturaI"
                          Del
                          MSG=MSG+"Item n„o pode ser faturado por saldo insuficiente !//"
                          MSG=MSG+"Deseja Continuar ?"
                          ConfGeral(MSG)
                          If OK<>"S"
                             Then ;** Implementado em 16/04/13 solicitado por Karina ***
                                  QuitLoop
                          EndIf    
        
                     Else CONT_NEG = CONT_NEG + 1
                          MSG=MSG+"Item com saldo insuficiente !"
                          Mensagem(MSG)
                  EndIf
        
                  Echo Normal
                  Echo Off 
 
             Else CONT_NEG = CONT_NEG + 1     
          EndIf  
  EndIf
  
  If Atualiza
     Then Moveto "FaturaI"
          Switch
            Case (TPEMPR="SIMPLES NACIONAL" Or TPEMPR="SIMPLES NAC. ESRB"):
                 Switch
                   Case (Search("MOSTR",[FaturaC->Descricao da Destinacao])>0  Or
                         Search("DEVOL",[FaturaC->Descricao da Destinacao])>0  Or
                         Search("BRIND",[FaturaC->Descricao da Destinacao])>0) And
                         SYS_CLIENTE_CONFEC<>"":
                         [CSOSN]="400"

                   Case ([FaturaC->Tipo Movimento Estoque]="S" And
                         (Search("VEND",[FaturaC->Descricao da Destinacao])>0 And
                          [FaturaC->Tipo Pessoa]="FISICA") )
                          Or 
                        ( [FaturaC->Tipo Movimento Estoque]="E" Or
                          Search("VEND",[FaturaC->Descricao da Destinacao])=0 Or
                          [FaturaC->Tipo Pessoa]="FISICA" ):  
                         Switch
                           Case [CSOSN]="101": [CSOSN]="102" 
                           Case [CSOSN]="201": [CSOSN]="202" 
                         EndSwitch

                 EndSwitch
                 VSD_I_CSOSN=SubStr([Tipo Tributacao],1,1)+[CSOSN]

                 Switch
                   Case [CSOSN]="101" Or [CSOSN]="900":
                        [ICMS_CREDSN_Aliquota]=ALIQUOTA_CREDITO_ICMS_NOSN
                         If OPCAO_RED_BCICMS="1"
                            Then [Aliquota Reduzida BCICMS]=BlankNum()
                         EndIf
                        [MVA                 ]=BlankNum()
                        [ICMS_ST_Aliquota    ]=BlankNum()

                   Case [CSOSN]="201":
                        [ICMS_CREDSN_Aliquota]=ALIQUOTA_CREDITO_ICMS_NOSN
                         If OPCAO_RED_BCICMS="1"
                            Then [Aliquota Reduzida BCICMS]=BlankNum()
                         EndIf
                         [ICMS_ST_Aliquota]=UF_ALIQUOTA_ICMS_INTERNA
                         Checa_MVA("FATURA",[Tributacao de ICMS],[Codigo MVA])

                   Case [CSOSN]="202" Or [CSOSN]="203":
                        [ICMS_CREDSN_Aliquota]=BlankNum()
                         If OPCAO_RED_BCICMS="1"
                            Then [Aliquota Reduzida BCICMS]=BlankNum()
                         EndIf
                         [ICMS_ST_Aliquota]=UF_ALIQUOTA_ICMS_INTERNA
                         Checa_MVA("FATURA",[Tributacao de ICMS],[Codigo MVA])

                   Case [CSOSN]="500" And Search("DEVOL",[FaturaC->Descricao da Destinacao])>0 And [FaturaC->Tipo Movimento Estoque]="E": 
                        [ICMS_CREDSN_Aliquota]=BlankNum()
                         If OPCAO_RED_BCICMS="1"
                            Then [Aliquota Reduzida BCICMS]=BlankNum()
                         EndIf
                         [ICMS_ST_Aliquota]=UF_ALIQUOTA_ICMS_INTERNA
                         Checa_MVA("FATURA",[Tributacao de ICMS],[Codigo MVA])

                   OtherWise:                          
                        [ICMS_CREDSN_Aliquota]=BlankNum()
                        [MVA                 ]=BlankNum()
                        [ICMS_ST_Aliquota    ]=BlankNum()                  
                 EndSwitch

                 [Tributacao de Icms      ]=Pega_TipoTributacao("CSOSN",[CSOSN])
                 [Aliquota Reduzida BCICMS]=BlankNum()
                 [Aliquota de ICMS        ]=BlankNum()                         

            OtherWise:
                 TribCST=SubStr([Tipo Tributacao],2,2)
                 Switch
                   Case (TribCST="00" And TRIB_ICMS="D" And UF_ALIQUOTA_ICMS>0) Or
                        (TribCST="10" And TRIB_ICMS="D" And UF_ALIQUOTA_ICMS>0) Or
                        (TribCST="20" And TRIB_ICMS="D" And UF_ALIQUOTA_ICMS>0) Or
                        (TribCST="70" And TRIB_ICMS="D" And UF_ALIQUOTA_ICMS>0):
                        [Aliquota de ICMS  ]=UF_ALIQUOTA_ICMS
                         If OPCAO_RED_BCICMS="1"
                            Then [Aliquota Reduzida BCICMS]=BlankNum()
                         EndIf
        
                   Case (TribCST="10" And TRIB_ICMS="S" And UF_ALIQUOTA_ICMS>0) Or
                        (TribCST="70" And TRIB_ICMS="S" And UF_ALIQUOTA_ICMS>0):
                        [Aliquota de ICMS  ]=UF_ALIQUOTA_ICMS
                         If OPCAO_RED_BCICMS="1"
                            Then [Aliquota Reduzida BCICMS]=BlankNum()
                         EndIf
        
                   Case (TribCST="00" Or TribCST="10" Or TribCST="20" Or TribCST="70") And
                        TRIB_ICMS<>"D" And TRIB_ICMS<>"S":
                        [Tributacao de Icms]=TRIB_ICMS
                        [Aliquota de ICMS  ]=BlankNum()
                        Switch
                         Case [Tributacao de Icms]="O": [Tipo Tributacao]=SubStr([Tipo Tributacao],1,1)+"90"                
                         Case [Tributacao de Icms]="I": [Tipo Tributacao]=SubStr([Tipo Tributacao],1,1)+"40"                                
                         Case [Tributacao de Icms]="N": [Tipo Tributacao]=SubStr([Tipo Tributacao],1,1)+"41"                                
        							 EndSwitch
                 EndSwitch
                 VSD_I_CST_Item=[Tipo Tributacao]

                 [CSOSN               ]="900"
                 [ICMS_CREDSN_Aliquota]=BlankNum()

                 Switch
                   Case (TribCST="10" Or TribCST="30" Or TribCST="70"):
                        [ICMS_ST_Aliquota]=UF_ALIQUOTA_ICMS_INTERNA
                        Checa_MVA("FATURA",[Tributacao de ICMS],[Codigo MVA])
                   Case TribCST="60" And Search("DEVOL",[FaturaC->Descricao da Destinacao])>0 And [FaturaC->Tipo Movimento Estoque]="E":
                        [ICMS_ST_Aliquota]=UF_ALIQUOTA_ICMS_INTERNA
                        Checa_MVA("FATURA",[Tributacao de ICMS],[Codigo MVA])
                   OtherWise:     
                        [MVA             ]=BlankNum()
                        [ICMS_ST_Aliquota]=BlankNum()
                 EndSwitch

                 [Tributacao de ISSQN     ]="N"
                 [Aliquota de ISSQN       ]=BlankNum()
         EndSwitch
         
         ;* Seta Variaveis PegaCFOP
         Checa_CFOP      =[FaturaC->Tipo Movimento Estoque]
         CFO_C           =[FaturaC->CFO      ]
         CFOP_TPITEM     =[Tipo do Item      ]
         CFOP_TRIBICMS   =[Tributacao de ICMS]
         CFOP_TPTRIB     =[Tipo Tributacao   ]
         CFOP_EMPRESA    =[FaturaC->Codigo da Empresa ]
         CFOP_ATIVEMPRESA=ATIVEMPR
        
         Play "\\Sistemas\\Exporta\\PegaCFOP"        
         [CFO            ]=CFO_C
         [Tipo Tributacao]=CFOP_TPTRIB
        
         If [Tipo do Item]="C" ; Servi‡o
            Then If SYS_CODIGO_CLIENTE="0296"
                    Then [ISSQN_Municipio]=3122306
                         [ISSQN_UF       ]="MG"
                         Switch
                           Case Substr([FaturaC->CFO],1,1)="5" : [CFO]="5933"
                           Case Substr([FaturaC->CFO],1,1)="6" : [CFO]="6933"
                         EndSwitch  
                 EndIf
         EndIf
        
         If Search("VENDA",[FaturaC->Descricao da Destinacao])=0 And [FaturaC->Tipo Movimento Estoque]<>"S"
            Then [PIS_CST        ]  ="99"
                 [PIS_ALIQUOTA   ]=BlankNum() 
                 [COFINS_CST     ]  ="99"
                 [COFINS_ALIQUOTA]=BlankNum() 
         EndIf   
          
         ESTOQUE()
  EndIf    
  Moveto TabelaI 
EndScan

If CONT_NEG = 0 
   Then 
        Moveto "FaturaC"
        Moveto [Numero da OF]
        Locate ORDFAT
        If RetVal
           Then Del
        EndIf   
   Else 
        Moveto TabelaCC
        Scan
          CopyToArray RegFatCC
          
          Moveto "FaturaCC"
          End
          Down
          RegFatCC["Numero da OF"]=ORDFAT
          CopyFromArray RegFatCC
          UnLockRecord
        
          Moveto TabelaCC
        EndScan
        
        Moveto TabelaV
        Scan
          CopyToArray RegVen
          
          Moveto "FaturaV"
          End
          Down
          RegVen["Numero da OF"]=ORDFAT
          CopyFromArray RegVen
          UnLockRecord
        
          Moveto TabelaV
        EndScan
EndIf
             
Do_It!
ClearAll

Delete TabelaC
Delete TabelaI
Delete TabelaV
Delete TabelaD
Delete TabelaCC

ExecVise("DELF "+VSDGDRIVE+"\\ "+VSDGEMPRESA+"_"+NDOCTO+"*.*")

Limpaguarde()

Return True
EndProc  ; (Transfere_Dados_Nota)

;*******************************************************************************
;* Rotina Atualizacao do Estoque (Inclusao, Alteracao e Exclusao)             **
;*******************************************************************************
Proc Estoque()    
                                               
CUSTO=BlankNum()
If RegCab["Atualiza Estoque"]<>"S" Or
   IsBlank(RegIt["Codigo do Item"]) Or
   RegIt["Tipo do Item"]="C" Or RegIt["Tipo do Item"]="D" Or RegIt["Tipo do Item"]="F" Or
   RegIt["Tipo do Item"]="G" Or RegIt["Tipo do Item"]="H" Or RegIt["Tipo do Item"]="I"
   Then Return
EndIf

;---- Processo p/ utiliza‡Æo de REGRA ------------------------------------------
Verifica_Emissao_Saida(RegCab["Data de Saida"])
Switch
  Case REGRA_DATA_ESTOQUE = "Antiga" : AUX_DATA = RegCab["Data de Saida"]
                                       If IsBlank(AUX_DATA) Then AUX_DATA=RegCab["Data de Emissao"] EndIf
  OtherWise                          : AUX_DATA = RegCab["Data de Emissao"]
EndSwitch
;-------------------------------------------------------------------------------
MES_EST = AlinhM(StrVal(Month(AUX_DATA)),2)
ANO_EST = StrVal(Year(AUX_DATA))

While True
 Moveto "\\Sistemas\\Estoque\\SdEstq"
 Locate RegCab["Codigo da Empresa"],
        RegIt["Codigo do Item"], ANO_EST, MES_EST
 If Not RetVal
    Then If Not Cria_Ficha(RegCab["Codigo da Empresa"],RegIt["Codigo do Item"],False)
            Then Moveto "FaturaI"
                 Return False
            Else Loop
         EndIf
 EndIf
 While IsLockRecord() EndWhile
 QuitLoop
EndWhile

CUSTO=NDecimal([Custo Total Atual]/[Saldo Atual],5)
If CUSTO=0 Or IsBlank(CUSTO)
   Then CUSTO=[Ultimo Custo Atual]
EndIf

Switch
  Case RegCab["Tipo Movimento Estoque"]="E":
       [Saldo Atual      ] = NDecimal([Saldo Atual]+RegIt["Quantidade"],3)
       [Custo Total Atual] = NDecimal([Custo Total Atual]+NDecimal((CUSTO*RegIt["Quantidade"]),2),2)
  Case RegCab["Tipo Movimento Estoque"]="S":
       [Saldo Atual      ] = NDecimal([Saldo Atual]-RegIt["Quantidade"],3)
       [Custo Total Atual] = NDecimal([Custo Total Atual]-NDecimal((CUSTO*RegIt["Quantidade"]),2),2)
EndSwitch
If ([Custo Total Atual]/[Saldo Atual])>0
   Then [Ultimo Custo Atual]=NDecimal([Custo Total Atual]/[Saldo Atual],5)
EndIf
UnLockRecord

Moveto "FaturaI"
[Custo Medio Unitario]=CUSTO
EndProc   ; (Estoque)

;*******************************************************************************
;* Rotina p/ Checagem de Estoque Negativo                                     **
;*******************************************************************************
Proc Checa_Estoque()
Private AUX_DATA,ItemRef, ItemCodFor

ULTIMO_CTENTRADA=0

SALDOATUAL=BlankNum()

If RegCab["Atualiza Estoque"]<>"S" Or
   RegCab["Tipo Movimento Estoque"]="E" Or
   IsBlank(RegIt["Codigo do Item"]) Or
   RegIt["Tipo do Item"]="C" Or RegIt["Tipo do Item"]="D" Or RegIt["Tipo do Item"]="F" Or
   RegIt["Tipo do Item"]="G" Or RegIt["Tipo do Item"]="H" Or RegIt["Tipo do Item"]="I"
   Then Moveto TabelaI
        Return True
EndIf

;---- Processo p/ utiliza‡Æo de REGRA ------------------------------------------
Verifica_Emissao_Saida(RegCab["Data de Saida"])
Switch
  Case REGRA_DATA_ESTOQUE = "Antiga" : AUX_DATA = RegCab["Data de Saida"]
                                       If IsBlank(AUX_DATA) Then AUX_DATA=RegCab["Data de Emissao"] EndIf
  OtherWise                          : AUX_DATA = RegCab["Data de Emissao"]
EndSwitch
;-------------------------------------------------------------------------------
MES_EST = AlinhM(StrVal(Month(AUX_DATA)),2)
ANO_EST = StrVal(Year(AUX_DATA))

While True
  Moveto "\\Sistemas\\Estoque\\SdEstq"
  Locate RegCab["Codigo da Empresa"],RegIt["Codigo do Item"], ANO_EST, MES_EST
  If Not RetVal
     Then If Not Cria_Ficha(RegCab["Codigo da Empresa"],RegIt["Codigo do Item"],False)
             Then Moveto TabelaI
                  Return False
             Else Loop
          EndIf
  EndIf
;;;  While IsLockRecord() EndWhile
  QuitLoop
EndWhile

SALDOATUAL=[Saldo Atual]
If IsBlank(SALDOATUAL)
   Then SALDOATUAL=0
EndIf

NOVOSALDO            = -1
NOVOSALDO            = NDecimal([Saldo Atual]-RegIt["Quantidade"],3)
VSD_I_Custo_Unitario = NDecimal(([Custo Total Atual]/[Saldo Atual]),5)

If VSD_I_Custo_Unitario=0 Or IsBlank(VSD_I_Custo_Unitario)
   Then VSD_I_Custo_Unitario=[Ultimo Custo Atual]
EndIf

ULTIMO_CTENTRADA    = NDecimal([Preco de Custo],2)

UnLockRecord

Moveto TabelaI
If NOVOSALDO>=0
   Then Return True
   Else ItemRef   =""
        ItemCodFor=""
        Moveto [Codigo do Item]
     
        MSG=    "Estoque Insuficiente em "+LTrim(StrVal(Format("W11.3,EIC",NOVOSALDO)))+", Verificar !// //"
        MSG=MSG+Completa("Item: "+[Codigo do Item]+" - "+SubStr([Descricao do Item ],1,30),60," ")+"//"

        Release Vars ItemRef, ItemCodFor

        Mensagem(MSG)
        
        If PARAM_BLOQUEIA_NEG="S"
           Then Return False
           Else Return True
        EndIf
EndIf
EndProc    ; (Checa_Estoque)

;*******************************************************************************
;* Rotina para carregar lista de arquivos                                      *
;*******************************************************************************
Proc CarregarLista()
Wcs=0
Lista_DiretorioF(VSDGDRIVE+"\\",VSDGEMPRESA+"_*C.DB")
Sleep 1000

DynArray Array_Registro[]
For i from 1 to 7
  If Not IsFile(PrivDir()+"Dir.Txt")
     Then Sleep(1000)
          Loop
     Else Editor Open PrivDir()+"Dir.Txt"
          If ErrorCode()=27
             Then Sleep 1000
                  Loop
          EndIf

          While True
            Extrair_Linha()
            If IsBlank(ELinha) Then QuitLoop EndIf
            wcs=wcs+1
            Array_Registro[wcs] = Completa(SubStr(ELINHA,1,Len(ELINHA)-1),12," ")+"  "
          EndWhile
          CancelEdit

          QuitLoop
  EndIf
EndFor

Endproc

;*******************************************************************************
;* Rotina para Criar Ficha do Estoque e Parametros                             *
;*******************************************************************************
Proc Cria_Ficha(ESTQ_EMPRESA,ESTQ_ITEM,ESTQ_CONFIRMA)
Private AUX_DATA,ESTQ_EMPRESA, ESTQ_ITEM, ESTQ_CONFIRMA, ESTQ_ANO, ESTQ_MES, MSG
         
;---- Processo p/ utiliza‡Æo de REGRA ------------------------------------------
Verifica_Emissao_Saida([FaturaC->Data de Emissao])
Switch
  Case REGRA_DATA_ESTOQUE = "Antiga" : AUX_DATA = [FaturaC->Data de Saida  ]
                                       If IsBlank(AUX_DATA) Then AUX_DATA=[FaturaC->Data de Emissao] EndIf
  OtherWise                          : AUX_DATA = [FaturaC->Data de Emissao]
EndSwitch
;-------------------------------------------------------------------------------
ESTQ_MES = AlinhM(StrVal(Month(AUX_DATA)),2)
ESTQ_ANO = StrVal(Year(AUX_DATA))

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
EndIf

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  ; (Cria_Ficha)

;*******************************************************************************
;* 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_EMPRESA2"      : Campo="TG_EMPRESA"
            Case Campo="TG_DESTIN"        : Campo="TG_EMPRESA2"
            Case Campo="TG_DRIVES"        : Campo="TG_DESTIN"
            Case Campo="TG_Registro"      : Campo="TG_DRIVES"
            Case Campo="YES" Or Campo="NO": Campo="TG_EMPRESA"
          EndSwitch
     Case Evento["KeyCode"] = 32 And Campo="TG_Registro":
          Temp=False
          If SubStr(Array_Registro[ControlValue("TG_Registro")],14,1)=" "
             Then Array_Registro[ControlValue("TG_Registro")]=SubStr(Array_Registro[ControlValue("TG_Registro")],1,13)+"X"
             Else Array_Registro[ControlValue("TG_Registro")]=SubStr(Array_Registro[ControlValue("TG_Registro")],1,13)+" "
          EndIf
     Case Evento["KeyCode"] = 13:
          Temp=False
          If Checa_TAG()
             Then Switch
                    Case Campo="TG_EMPRESA"  : 
                         If Not IsBlank(VSDGEMPRESA)
                            Then Campo="TG_EMPRESA2"
                            Else VSDGNOMEMP=""
                         EndIf 
                    Case Campo="TG_EMPRESA2" :
                         If Not IsBlank(VSDGEMPRESA2)
                            Then Campo="TG_DESTIN"
                            Else VSDGNOMEMP2=""
                         EndIf                     
                    Case Campo="TG_DESTIN"   : 
                         If Not IsBlank(VSDGDESTIN)
                            Then Campo="TG_DRIVES"
                            Else VSDGNOMDESTIN=""
                         EndIf      
                    Case Campo="TG_DRIVES"   : Campo="TG_Registro"
                         VSDGDRIVE=ControlValue("TG_DRIVES")
                          CarregarLista()
                          If DynArraySize(Array_Registro)>0
                             Then Campo="TG_Registro"
                             Else Mensagem(VSDGDRIVE+" n„o tem arquivos p/ importa‡„o !")
                                  Campo="TG_EMPRESA"
                          EndIf
                    Case Campo="TG_Registro": Campo="YES"
                  EndSwitch
          EndIf
   EndSwitch
EndIf
Switch
  Case Campo="TG_EMPRESA" Or Campo="TG_EMPRESA2":
     MSG_CAMPO="Informe a Empresa"
  Case Campo="TG_Registro":
     MSG_CAMPO="Selecione o arquivo"
     TECLA="Barra de Espa‡o=Marca/Desmarca  "
EndSwitch

Monta_Prompt(MSG_CAMPO,TECLA)
Return Temp
EndProc


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

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

VSDGEMPRESA =""
VSDGNOMEMP  =""
VSDGEMPRESA2=""
VSDGNOMEMP2 =""
VSDGDESTIN  =""
 
DynArray Array_Drives[]
SysInfo Drives To Array_Drives
VSDGDRIVE=SubStr(Directory(),1,2)
;VSDGDRIVE    ="N:"
VSDGDRIVEPriv=PrivDir()

DynArray Array_Registro[]

While True

  ShowDialog "Importa‡„o de documento p/ emissÆo NF-e" Proc "SD_Dialog"
  Trigger "OPEN","ARRIVE"
  Key "F1","ENTER","ESC",32,
      -104, -105, -106, -107, -108, -109, -110, -111, -112, -113, -139, -140  
   @ 05,12   Height 17 Width 72

    Label  @ 00,00 "Empresa Origem"  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 "Empresa Destino"  For "TG_EMPRESA2"
    Accept @ 03,01 Width 07 "A4"  Picture "[&,#][#*#]" Tag "TG_EMPRESA2" To VSDGEMPRESA2
    Accept @ 03,09 Width 25 "A20" Picture "!*!" Tag "TG_NOMEMP2" To VSDGNOMEMP2

    Label  @ 04,01 "Destinacao"  For "TG_DESTIN"
    Accept @ 05,02 Width 06 "A3"  Picture "#*#" Tag "TG_DESTIN"    To VSDGDESTIN
    Accept @ 05,09 Width 25 "A30" Picture "!*!" Tag "TG_NOMDESTIN" To VSDGNOMDESTIN

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

    Label  @ 06,35 "Lista:" For "TG_Registro"
    PickDynArray @7,36 Height 05 width 33
     Columns 1
      Array_Registro
       Tag "TG_Registro"
        To ArrayElement

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

  EndDialog
  If Not RetVal Then QuitLoop EndIf
  
  If IsBlank(VSDGEMPRESA) Or
     IsBlank(VSDGEMPRESA2)
     Then Mensagem("Informe a Empresa Origem/Destino !")
          Loop
  EndIf        
  If IsBlank(VSDGDESTIN)
     Then Mensagem("Informe a Destina‡„o !")
          Loop
  EndIf        
  
  CONT_NEG=False
  GetRecord "\\Sistemas\\Vendas\\P_Fatura" VSDGEMPRESA To REG_PFATURA
  If Not RetVal
     Then Mensagem("Parametros n„o Cadastrado para esta Empresa !")
          Loop
     Else PARAM_BLOQUEIA_NEG=REG_PFATURA["Bloqueia_Estoque_Negativo"]
  EndIf    
  ClearImage
  
  View NoWindow "Destin"
  Moveto [Codigo da Destinacao]
  Locate VSDGDESTIN
  If Not RetVal
     Then Mensagem("Destina‡„o n„o Localizada !")
          Loop
     Else AUALIZA_ESTOQUE            = [Atualiza Estoque      ]
          ALIQUOTA_CREDITO_ICMS_NOSN = [Aliquota CredICMS NOSN]
          CALCULO_NF_AUTOMATICO      = [Calcula_Nota          ]
          TRIB_ICMS                  = [Tributacao de ICMS    ]
          OPCAO_RED_BCICMS           = [Sem Reducao BCICMS    ] 
          If [ICMS Aliquota do Estado]<>"S"
             Then UF_ALIQUOTA_ICMS   = [Aliquota de ICMS]
             Else UF_ALIQUOTA_ICMS   = BlankNum()
          EndIf
  EndIf    
  ClearImage
  
  wcs=0
  For wc from 1 to DynArraySize(Array_Registro)
    If SubStr(Array_Registro[wc],14,1)<>"X"
       Then Loop
    EndIf
    wcs=wcs+1
    NDOCTO=SubStr(Array_Registro[wc],6,6)
    Transfere_Dados_OF()
  EndFor
  
  If wcs=0
    Then MSG="Voce n„o selecionou qual(is) arquivo(s) p/ Importa‡„o !// //"
         MSG=MSG+"Observe como selecionar o arquivo desejado !// //"
         MSG=MSG+"Verifique !"
         Mensagem(MSG)
    Else If CONT_NEG <> 0
            Then MENSAGEM("Opera‡„o Finalizada !// //Gerado nova(s) OF(s), verificar !")
            Else MENSAGEM("Opera‡„o Cancelada !")   
         EndIf   
  EndIf
  CarregarLista()
  
EndWhile
ClearAll
Release Vars All
Release Procs All
