;** Ft_nfer ********************************************************************
;*  Rela‡Æo de NFe Referenciadas Entradas                                      *
;*******************************************************************************
;Autor           : Vise Informatica (VISERP)
;Desenvolvido    : 16/06/2016 por Anivel Augusto Rodrigues
;Ultima Alteracao: 06/09/2016 por Kamila Gomes
;Motivo Alteracao: Incluido verifica‡Æo VSDGMODELO="1" e VSDGMODELO="4"
;Ultima Alteracao: 17/10/2016 por Heverton Amaral 
;Motivo Alteracao: Corre‡Æo na Inicial() onde locate estava na tabela notaeR incorretamente.
;Ultima Alteracao: 26/12/2016 por Kamila Gomes
;Motivo Alteracao: Ajuste: Verifica‡Æo se NotaER est  vazia
;Ultima Alteracao: 06/03/2017 por Anivel Augusto Rodrigues
;Motivo Alteracao: inclusao emissor do documento               
;Ultima Alteracao: 02/08/2017 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes emissor do documento CT-e          
;Ultima Alteracao: 13/09/2017 por Anivel Augusto Rodrigues
;Motivo Alteracao: inclusao modelo 02 nota fiscal venda a consumidor
;Ultima Alteracao: 23/10/2017 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes confirma‡Æo do documento de terceiros           
;Ultima Alteracao: 31/10/2017 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes msg docto emitidos por terceiros                
;Ultima Alteracao: 06/11/2017 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes showdialog destinatario/remente do documento    
;Ultima Alteracao: 18/12/2017 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes obrigatorio dados do ecf    
;Ultima Alteracao: 09/06/2018 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes emitente do documento, quando proprio=codigo da empresa
;Ultima Alteracao: 18/06/2018 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes tratamento tecla TAB
;Ultima Alteracao: 27/09/2018 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes lockrecord registro original ao finalizar
;Ultima Alteracao: 31/05/2019 por Anivel Augusto Rodrigues
;Motivo Alteracao: InclusÆo do modelo [65] NFC-e
;Ultima Alteracao: 17/09/2019 por Anivel Augusto Rodrigues
;Motivo Alteracao: InclusÆo do modelo [59] CFe    
;Ultima Alteracao: 17/10/2019 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes tamanho serie/subserie showdialog

;*******************************************************************************
;*  Rotina                                                                    *
;*******************************************************************************
Proc SetaIndex(c)
Private c
 IndexNFeRef=NumVal(c)
EndProc

Proc SetaSeq(c)
Private c
 VSD_I_SEQ=AlinhM(StrVal(c),2)
EndProc

Proc PegaSeqIndex(c)
Private c
 SetaSeq(SubStr(Array_NFeRef[c],1,2))
EndProc

Proc Localiza_Registro()
Switch
  Case TabWork="Notaec":
    Moveto "NotaeR"
    Moveto [Numero do Lancamento]
    Locate [NotaeC->Numero do Lancamento],NumVal(VSD_I_SEQ)
EndSwitch
If RetVal
   Then Return True
   Else Return False
EndIf   
EndProc

;*******************************************************************************
;*  Rotina para carregar variaveis                                            *
;*******************************************************************************
Proc CarregaVars()
If Localiza_Registro()
   Then
        VSDGMODELO  =[Modelo_Documento]
        VSDGIND_EMIT=[IND_EMIT        ]
        switch
          case VSDGIND_EMIT="0" : VSDGNOMIND_EMIT="EMISS¶O PRàPRIA - "+[Notaec->Nome Fantasia Empresa]
          case VSDGIND_EMIT="1" : VSDGNOMIND_EMIT="EMITIDO POR TERCEIROS"
          otherwise             : VSDGNOMIND_EMIT=""
        endswitch
        
        Switch
          Case VSDGMODELO="55" Or VSDGMODELO="57" Or VSDGMODELO="65" Or VSDGMODELO="59" Or
               VSDGMODELO="01" Or VSDGMODELO="02" Or VSDGMODELO="04"  :
           VSDGDTDOCTO  =[Data_Documento     ]
           VSDGNNFE     =[Numero_Documento   ] 
           VSDGSERIE    =[Serie_Documento    ]
           VSDGSUBSERIE =[SubSerie_Documento ]
           VSDGCODPART  =[Codigo_Participante]
           VSDGNOMPART  =[Nome_Participante  ]
           VSDGUF       =[UF                 ]
           VSDGCNPJ     =[CNPJ_CPF           ]
           VSDGIE       =[IE                 ]

           If VSDGMODELO="55" Or VSDGMODELO="57" Or VSDGMODELO="65"  Or VSDGMODELO="59"
              Then VSDGCHAVENFE =[Chave_Acesso       ]
           EndIf

          Case VSDGMODELO="2B" Or
               VSDGMODELO="2C" Or
               VSDGMODELO="2D":
           VSDGDTDOCTO  =[Data_Documento     ]
           VSDGNCOO     =[Numero_Documento   ]
           VSDGNECF     =[Numero_ECF         ]
           VSDGSECF     =[Numero_Serie_ECF   ]
        
        EndSwitch
EndIf

If Not IsBlank(VSDGMODELO)
   Then IsLockRecord()
        Return True
   Else Return False
Endif   
EndProc

;*******************************************************************************
;*  Rotina Atualiza Array                                                      *
;*******************************************************************************
Proc AtuaArray(c)
Private c

Array_NFeRef[c]= VSD_I_SEQ+"   "+
                 Format("W02,AL",[Modelo_Documento])+"    "+
                 AlinhM(Format("D13",[Data_Documento]),10)+" "+
                 Format("W10,AL",[Numero_Documento ])

Switch
  Case [Modelo_Documento]="55" Or [Modelo_Documento]="57" Or [Modelo_Documento]="65" Or [Modelo_Documento]="59" Or
       [Modelo_Documento]="01" Or [Modelo_Documento]="02" Or [Modelo_Documento]="04"  :   
    Array_NFeRef[c]=Array_NFeRef[c]+Format("W05,AL",[Serie_Documento])+
                                    Format("W40,AL",[Nome_Participante])
                                    
  Case [Modelo_Documento]="2B" Or 
       [Modelo_Documento]="2C" Or 
       [Modelo_Documento]="2D":   
    Array_NFeRef[c]=Array_NFeRef[c]+Format("W05,AL",[Numero_ECF       ])+
                                    Format("W20,AL",[Numero_Serie_ECF ])
EndSwitch

ArrayElement=c
EndProc

;*******************************************************************************
;*  Rotina para salvar dados                                                  *
;*******************************************************************************
Proc SalvaDados()
Private i,c

[IND_EMIT        ]=VSDGIND_EMIT
Switch
  Case VSDGMODELO="55" Or VSDGMODELO="57" Or VSDGMODELO="65" Or VSDGMODELO="59" Or
       VSDGMODELO="01" Or VSDGMODELO="02" Or VSDGMODELO="04"  :

    [Data_Documento     ]=VSDGDTDOCTO
    [Numero_Documento   ]=VSDGNNFE 
    [Serie_Documento    ]=VSDGSERIE
    [SubSerie_Documento ]=VSDGSUBSERIE
    [Codigo_Participante]=VSDGCODPART
    [Nome_Participante  ]=VSDGNOMPART
    [UF                 ]=VSDGUF
    [CNPJ_CPF           ]=VSDGCNPJ
    [IE                 ]=VSDGIE

    If VSDGMODELO="55" Or VSDGMODELO="57" Or VSDGMODELO="65" Or VSDGMODELO="59"
       Then [Chave_Acesso       ]=VSDGCHAVENFE
    EndIf

  Case VSDGMODELO="2B" Or
       VSDGMODELO="2C" Or
       VSDGMODELO="2D":  
   [Data_Documento     ]=VSDGDTDOCTO
   [Numero_Documento   ]=VSDGNCOO    
   [Numero_ECF         ]=VSDGNECF
   [Numero_Serie_ECF   ]=VSDGSECF
 
EndSwitch
UnLockRecord

AtuaArray(IndexNfeRef)

EndProc

;*******************************************************************************
;*  Rotina para excluir array e registro                                       *
;*******************************************************************************
Proc ExcluiArray()
Private i,n

If QuerExcluir("deste identificador")
   Then 
        If Localiza_Registro()
           Then Del
        EndIf   

        Array_NFeRef[IndexNFeRef]=""

        DynArray Array_NFeRefI[]
        n=0
        For i From 1 To DynArraySize(Array_NFeRef)
          If IsBlank(Array_NFeRef[i]) Then Loop EndIf
          n=n+1
          Array_NFeRefI[n]=Array_NFeRef[i]
        EndFor

        Release Vars Array_NFeRef
        DynArray Array_NFeRef[]
        For i From 1 To DynArraySize(Array_NFeRefI)
          Array_NFeRef[i]=Array_NFeRefI[i]
        EndFor
        Release Vars Array_NFeRefI
        
EndIf

EndProc

;*******************************************************************************
;*  Rotina Atualiza Array                                                      *
;*******************************************************************************
Proc ChecaDados()
Private Ok,c,MSG

MSG="" 
Ok  =True
Switch
  Case VSDGMODELO="01" Or VSDGMODELO="02" Or VSDGMODELO="04" Or 
       VSDGMODELO="55" Or VSDGMODELO="57" Or VSDGMODELO="65" Or VSDGMODELO="59" :

    If IsBlank(VSDGCODPART)
       Then MSG=MSG+"Participante inv lido, a pessoa deve ser cadastrada !//"
    EndIf    
    If IsBlank(VSDGUF) Or Search(VSDGUF,Estados)=0
       Then MSG=MSG+"UF inv lido !//"
    EndIf    
    If VSDGCNPJ="00.000.000/0000-00" Or
       VSDGCNPJ="000.000.000-00" Or
       Not Checa_CGC_CPF_Formatado(VSDGCNPJ) 
       Then ;MSG=MSG+"CNPJ/CPF inv lido !//"
    EndIf
    If Len(VSDGCNPJ)=18
       Then If VSDGIE<>"ISENTO" And VSDGIE<>"NAOCONTRIBUINTE"
               Then Aguarde("Validando IE")
                    If Not Valida_IE(VSDGIE,VSDGUF)
                       Then ;MSG=MSG+"IE inv lido !//" 
                    EndIf
                    LimpAguarde()
            EndIf  
    EndIf
    If IsBlank(VSDGSERIE)
       Then MSG=MSG+"S‚rie inv lida !//"
    EndIf    
    If IsBlank(VSDGNNFE) Or NumVal(VSDGNNFE)=0
       Then MSG=MSG+"N£mero documento inv lido !//" 
    EndIf    
    If VSDGMODELO="55" Or VSDGMODELO="57" Or VSDGMODELO="65" Or VSDGMODELO="59"
       Then If IsBlank(VSDGCHAVENFE) Or Len(VSDGCHAVENFE)<44 
               Then MSG=MSG+"Chave de acesso Inv lida !//"
            EndIf         
    EndIf
                              
  Case VSDGMODELO="2B" Or 
       VSDGMODELO="2C" Or 
       VSDGMODELO="2D":
    If IsBlank(VSDGDTDOCTO)
      Then MSG=MSG+"Data inv lida !//"
    EndIf    
    If IsBlank(VSDGNCOO) Or NumVal(VSDGNCOO)=0
      Then MSG=MSG+"N£mero do COO inv lido !//"
    EndIf    
    If IsBlank(VSDGNECF) Or NumVal(VSDGNECF)=0
      Then MSG=MSG+"N£mero do ECF inv lido !//"
    EndIf    
    If IsBlank(VSDGSECF)
      Then MSG=MSG+"N£mero de s‚rie do ECF inv lido !//"
    EndIf    
    
EndSwitch
If Not IsBlank(MSG)
  Then Mensagem(MSG)
       Ok=False                               
EndIf    

If Ok
   Then SalvaDados()
EndIf    

Return Ok
EndProc

;*******************************************************************************
;* Rotina                                                                      *
;*******************************************************************************
Proc SD_Dialog(Disparo,Campo,Evento,Elemento)
Private Disparo,Campo,Evento,Elemento

TECLA=""
MSG_CAMPO=""
Temp=True

If INICIO_DIALOG
   Then INICIO_DIALOG=False
        Switch
          Case SD=1: Campo="TG_NFES"
            Dynarray WinArray5[]
            Window Handle Dialog to JANELA
            Window GetAttributes JANELA To WinArray5

          Case SD=2: Campo="TG_IND_EMIT"
            Dynarray WinArray52[]
            Window Handle Dialog to JANELA2
            Window GetAttributes JANELA2 To WinArray52

        EndSwitch
EndIf

If Disparo="EVENT" And Evento["Type"]="KEY" Then
   Switch
     Case Evento["KeyCode"] = 9 Or
          Evento["KeyCode"] = -15:
          Temp=False

     Case Evento["KeyCode"] = -59 :
          If Campo="TG_CODPART"     
             Then 
                  ECHO OFF
                  
                  WinArray5["FLOATING"]=False
                  Window SetAttributes JANELA From WinArray5

                  WinArray52["FLOATING"]=False
                  Window SetAttributes JANELA2 From WinArray52

                  Moveto [Codigo_Participante]  
                  If ConsultaF1()
                     Then Switch
                            Case Campo="TG_CODPART":               
                                 VSDGCODPART=Reg_ConsultaF1["Codigo"]
                                 If Reg_ConsultaF1["Nome Fantasia EmitDest"]<>"DIVERSOS"
                                    Then VSDGNOMPART=Reg_ConsultaF1["Razao Social"]
                                         VSDGUF     =Reg_ConsultaF1["UF"]
                                         VSDGCNPJ   =Reg_ConsultaF1["CGC"]
                                         VSDGIE     =Reg_ConsultaF1["IE"]
                                 EndIf
                          EndSwitch        
                  EndIf                          
     
                  Window Select JANELA
                  WinArray5["FLOATING"]=True
                  Window SetAttributes JANELA From WinArray5

                  Window Select JANELA2
                  WinArray52["FLOATING"]=True
                  Window SetAttributes JANELA2 From WinArray52

                  echo Normal
                  echo off

          EndIf 
          
     Case Evento["KeyCode"] =  27:
          Temp=False
          Switch
            Case SD=1:
              Switch 
						    Case Campo="TG_NFES"           : Campo="YES"
                Case Campo="YES" Or Campo="NO" : Campo="TG_NFES"
              EndSwitch

            Case SD=2: 
              Switch 
                Case VSDGMODELO="2B" Or VSDGMODELO="2C" Or VSDGMODELO="2D" :
                  Switch 
                    Case Campo="TG_IND_EMIT"       : CancelDialog
                    Case Campo="TG_NCOO"           : Campo="TG_IND_EMIT"
                    Case Campo="TG_NECF"           : Campo="TG_NCOO"
                    Case Campo="TG_SECF"           : Campo="TG_NECF"
                    Case Campo="TG_DTDOCTO"        : Campo="TG_SECF"
                    Case Campo="TG_FLAG"           : Campo="TG_DTDOCTO"
                  EndSwitch 

                Case VSDGMODELO="01" Or VSDGMODELO="02" Or VSDGMODELO="04" Or
                     VSDGMODELO="55" Or VSDGMODELO="57" Or VSDGMODELO="65" Or VSDGMODELO="59" :
                  Switch 
                    Case Campo="TG_IND_EMIT"       : CancelDialog
      			        Case Campo="TG_NNFE"           : Campo="TG_IND_EMIT"
      					    Case Campo="TG_SERIE"          : Campo="TG_NNFE"
      					    Case Campo="TG_SUBSERIE"       : Campo="TG_SERIE"
                    Case Campo="TG_DTDOCTO"        : Campo="TG_SUBSERIE"
                    Case Campo="TG_CODPART"        : Campo="TG_DTDOCTO"

                    Case Campo="TG_NOMPART"        : Campo="TG_CODPART"
                    Case Campo="TG_UF"             : Campo="TG_NOMPART"
                    Case Campo="TG_CNPJ"           : Campo="TG_UF"
                    Case Campo="TG_IE"             : Campo="TG_CNPJ"

                    Case Campo="TG_FLAG"           : 
                         If VSDGMODELO="55" Or VSDGMODELO="57" Or VSDGMODELO="65" Or VSDGMODELO="59" 
                            Then Campo="TG_CHAVENFE"
                            Else Campo="TG_IE"
                         EndIf   
                    Case Campo="TG_CHAVENFE"       : Campo="TG_IE"
                  EndSwitch 

              EndSwitch 
          EndSwitch

       Case Evento["KeyCode"]=-60 And DynArraySize(Array_NFeRef)>0:
            Campo="TG_NFES"

       Case Evento["KeyCode"] = -83 And Campo="TG_NFES":
            If DynArraySize(Array_NFeRef)>0
               Then SetaIndex(ArrayElement)
                    PegaSeqIndex(IndexNFeRef)
                    ExcluiArray()
            EndIf
       Case Evento["KeyCode"] =-82 And Campo="TG_NFES":
            Temp=False
            CHAMA=False
            NFeRef()

       Case Evento["KeyCode"] = 13:
          Temp=False

          If Checa_TAG()
             Then Switch
                    Case Campo="TG_IND_EMIT"       : 
                         VSDGIND_EMIT=ControlValue("TG_IND_EMIT")
                         switch
                           case VSDGIND_EMIT="0" : VSDGNOMIND_EMIT="EMISS¶O PRàPRIA - "+[Notaec->Nome Fantasia Empresa]

                           case VSDGIND_EMIT="1" : VSDGNOMIND_EMIT="EMITIDO POR TERCEIROS"

                           otherwise             : fastmsg("Valor inv lido")

                         endswitch
                         If Not IsBlank(VSDGIND_EMIT)
                            Then 
                                 Switch 
                                  Case VSDGMODELO="01" Or VSDGMODELO="02" Or VSDGMODELO="04" Or
                                       VSDGMODELO="55" Or VSDGMODELO="57" Or VSDGMODELO="65" Or VSDGMODELO="59":
                                       Campo="TG_NNFE"
                                  Case VSDGMODELO="2B" Or VSDGMODELO="2C" Or VSDGMODELO="2D" :
                                       Campo="TG_NCOO"
                                EndSwitch 
                         EndIf                                         
             
                    Case Campo="TG_DTDOCTO"       : 
                         VSDGDTDOCTO=ControlValue("TG_DTDOCTO")
                         If Not IsBlank(VSDGDTDOCTO)
                            Then Switch 
                                   Case VSDGMODELO="2B" Or VSDGMODELO="2C" Or VSDGMODELO="2D" :
                                        Campo="TG_FLAG"
                                   OtherWise:
                                        Campo="TG_CODPART"            
                                 EndSwitch  
                         EndIf             
                                                     
                    Case Campo="TG_NNFE"       : 
                         VSDGNNFE=ControlValue("TG_NNFE")
                         If Not IsBlank(VSDGNNFE)
                            Then VSDGNNFE=AlinhM(VSDGNNFE,9) 
                                 Campo="TG_SERIE"
                         EndIf                       
                    Case Campo="TG_SERIE"      :  
                         VSDGSERIE=ControlValue("TG_SERIE")
                         Campo="TG_SUBSERIE"
                    Case Campo="TG_SUBSERIE"   : Campo="TG_DTDOCTO"
                         VSDGSUBSERIE=ControlValue("TG_SUBSERIE")
                         Switch
                            Case VSDGIND_EMIT="0" : 
                                 GetRecord "\\Sistemas\\Vendas\\NotaC" [NotaeC->Codigo da Empresa],SubStr(VSDGNNFE,4,6),VSDGSERIE To REG_NFE
                                 If RetVal
                                    Then VSDGDTDOCTO  = REG_NFE["Data de Emissao" ]
                                         VSDGSUBSERIE = ""                       
                                         If VSDGMODELO="55" Or VSDGMODELO="57" Or VSDGMODELO="65" Or VSDGMODELO="59"
                                            Then VSDGCHAVENFE = REG_NFE["Chave_Acesso_NFe"] 
                                         EndIf
                                         VSDGCODPART  = REG_NFE["Codigo da Empresa"]
                                         
                                         GetRecord "\\Sistemas\\Cadastro\\Destinat" VSDGCODPART To REG_NFE
                                         If RetVal
                                            Then VSDGNOMPART  = REG_NFE["Razao Social"]
                                                 VSDGUF       = REG_NFE["UF"          ]
                                                 VSDGCNPJ     = REG_NFE["CGC"         ]
                                                 VSDGIE       = REG_NFE["IE"          ]
                                         EndIf
                                         Campo="TG_FLAG"
                                 EndIf

                            Case VSDGIND_EMIT="1" : 
                                 JanelaNotaEC  =AbrirTabela("\\Sistemas\\Estoque\\NotaEC","AddRO",1,0,1,15)
                                 Window Select JanelaNotaEC

                                 Moveto [Numero do Documento]
                                 Locate Pattern ".."+strval(NumVal(VSDGNNFE))
                                 While true
                                   If RetVal 
                                      Then If [Serie do Documento   ]=VSDGSERIE         And 
                                              [SubSerie do Documento]=VSDGSUBSERIE      
                                              Then 
                                                   MSG="//"
                                                   MSG=MSG+format("W60,AL","Documento: "+[Tipo do Documento    ]+"/" + 
                                                                                         [Numero do Documento  ]+", "+
                                                                                         [Serie do Documento   ]+" " +
                                                                                         [SubSerie do Documento]+
                                                                           ", EmissÆo: "+Format("D13",[Data de Emissao]))+"// //" 
                                                   MSG=MSG+format("W60,AL","   Pessoa: "+[Razao Social  ]+" - "+[Codigo])+"//" 
                                                   MSG=MSG+format("W60,AL","           "+[UF]+" - "+[CGC])              +"//" 
                                                   MSG=MSG+format("W60,AL","           "+[Chave_Acesso_NFe])            +"//"
                                                   MSG=MSG+"Confirma este documento ?"
                                                   if confgeral(MSG)
                                                      then
                                                           VSDGDTDOCTO  = [Data de Emissao       ]
                                                           VSDGSUBSERIE = [SubSerie do Documento ]                       
                                                           If VSDGMODELO="55" Or VSDGMODELO="57" Or VSDGMODELO="65" Or VSDGMODELO="59"
                                                              Then VSDGCHAVENFE = [Chave_Acesso_NFe] 
                                                           EndIf
                                                           
                                                           VSDGCODPART  = [Codigo                ]
                                                           GetRecord "\\Sistemas\\Cadastro\\Destinat" VSDGCODPART To REG_NFE
                                                           If RetVal
                                                              Then VSDGNOMPART  = REG_NFE["Razao Social"]
                                                                   VSDGUF       = REG_NFE["UF"          ]
                                                                   VSDGCNPJ     = REG_NFE["CGC"         ]
                                                                   VSDGIE       = REG_NFE["IE"          ]
                                                           EndIf
               
                                                           Campo="TG_FLAG"
                                                           QuitLoop
                                                   endif
                                           EndIf        
                                      Else QuitLoop
                                   EndIf
                                   Skip
                                   if eot() then quitloop endif
                                   Locate Next Pattern ".."+strval(NumVal(VSDGNNFE))
                                  
                                 EndWhile
                                 Do_It!
                                 Window Select JanelaNotaEC    ClearImage
                                 
                                 Moveto "\\Sistemas\\Estoque\\Notaer"
                                 CoEditKey
                         EndSwitch  
                         
                    Case Campo="TG_CODPART"      : 
                         VSDGCODPART=AlinhM(ControlValue("TG_CODPART"),4)
                         
                         GetRecord "\\Sistemas\\Cadastro\\Destinat" VSDGCODPART To REG_NFE
                         If RetVal
                            Then VSDGNOMPART  = REG_NFE["Razao Social"]
                                 VSDGUF       = REG_NFE["UF"          ]
                                 VSDGCNPJ     = REG_NFE["CGC"         ]
                                 VSDGIE       = REG_NFE["IE"          ]

                                 If VSDGMODELO="01" Or
                                    VSDGMODELO="02" Or
                                    VSDGMODELO="04" 
                                    Then Campo="TG_FLAG"
                                    Else Campo="TG_CHAVENFE"
                                 EndIf

                            else Mensagem("Participante nÆo cadastrado !")
                                 Campo="TG_NOMPART"
                         EndIf
                         
                    Case Campo="TG_NOMPART"     : 
                         VSDGNOMPART=ControlValue("TG_NOMPART")
                         Campo="TG_UF"
                    Case Campo="TG_UF"          : 
                         VSDGUF=ControlValue("TG_UF")
                         Campo="TG_CNPJ"
                    Case Campo="TG_CNPJ"        : 
                         VSDGCNPJ=ControlValue("TG_CNPJ")
                         Campo="TG_IE"
                    Case Campo="TG_IE"          : 
                         VSDGIE=ControlValue("TG_IE")

                         If VSDGMODELO="01" Or
                            VSDGMODELO="02" Or
                            VSDGMODELO="04" 
                            Then Campo="TG_FLAG"
                            Else Campo="TG_CHAVENFE"
                         EndIf

                    Case Campo="TG_FLAG"        : 
                         If ChecaDados()
                            Then AcceptDialog
                            Else If VSDGMODELO="2B" Or VSDGMODELO="2C" Or VSDGMODELO="2D" 
                                    Then Campo="TG_NCOO"
                                    Else Campo="TG_NNFE"
                                 EndIf   
                         EndIf

                    Case Campo="TG_CHAVENFE"   :
                         VSDGCHAVENFE=ControlValue("TG_CHAVENFE")
                         If ChecaDados()
                            Then Campo="TG_FLAG"
                            Else Campo="TG_CHAVENFE"
                         EndIf
                         
                    Case Campo="TG_NCOO"       :  
                         VSDGNCOO=ControlValue("TG_NCOO")
                         If Not IsBlank(VSDGNCOO)
                            Then VSDGNCOO=AlinhM(StrVal(NumVal(VSDGNCOO)),6)
                                 Campo="TG_NECF"
                         EndIf   
                    Case Campo="TG_NECF"       :
                         VSDGNECF=ControlValue("TG_NECF")
                         If Not IsBlank(VSDGNECF)
                            Then
                                 If VSDGIND_EMIT="0"
                                    then
                                         VSDGNECF=AlinhM(StrVal(NumVal(VSDGNECF)),2)
                                         {TableAdd} {\\Sistemas\\Vendas\\Opaf_Ecf}
                                         Moveto [Numero ECF]
                                         Locate VSDGNECF
                                         If RetVal 
                                            Then VSDGSECF = [Numero de Serie]   
                                                 Campo="TG_DTDOCTO"
                                            Else Campo="TG_SECF"
                                         EndIf
                                         Do_It!
                                         Moveto "\\Sistemas\\Vendas\\Opaf_Ecf"  ClearImage
                                        
                                         Moveto "NotaeR"
                                         CoEditKey
                                    Else     
                                         Campo="TG_SECF"
                                 endif
                         EndIf   
                    Case Campo="TG_SECF"       :
                         VSDGSECF=ControlValue("TG_SECF")
                         If Not IsBlank(VSDGSECF)
                            Then Campo="TG_DTDOCTO"
                         EndIf

                    Case Campo="TG_NFES" And
                         DynArraySize(Array_NFeRef)>0:
                         CHAMA=True
                         NFeRef()

                  EndSwitch
          EndIf
   EndSwitch
EndIf

RefreshDialog
SelectControl Campo
TECLA=" Esc=Retornar  "

Switch
  Case Campo="TG_IND_EMIT"     : MSGCAMPO="Emissor: 0-EmissÆo pr¢pria  1-Emitido por Terceiros"
  Case Campo="TG_DTDOCTO"      : MSGCAMPO="Informe a data do documento"
  Case Campo="TG_NNFE"         : MSGCAMPO="Informe o n£mero do documento"
  Case Campo="TG_SERIE"        : MSGCAMPO="Informe a s‚rie do documento"
  Case Campo="TG_SUBSERIE"     : MSGCAMPO="Informe a subs‚rie do documento"
  Case Campo="TG_CODPART"      : MSGCAMPO="Informe o c¢digo do Destinat rio/Remetente do documento"
                                 TECLA=TECLA+"F1=Tabelas  "

  Case Campo="TG_CHAVENFE"     : MSGCAMPO="Informe a chave de acesso do documento"
  Case Campo="TG_FLAG"         : MSGCAMPO="."

  Case Campo="TG_NCOO"         : MSGCAMPO="Informe o n£mero do cupom fiscal"
  Case Campo="TG_NECF"         : MSGCAMPO="Informe a n£mero do ECF emissor do cupom"
  Case Campo="TG_NECF"         : MSGCAMPO="Informe a n£mero de s‚rie do ECF emissor do cupom"

  Case Campo="TG_NFES"  : MSGCAMPO="NF-eïs "
       TECLA=TECLA+"Ins=Inserir  "
       If DynArraySize(Array_NFeRef)>0
          Then TECLA=TECLA+"Del=Excluir  Enter=Editar  "+Chr(25)+Chr(24)+"=Selecionar  "
       EndIf

  Case Campo="YES"             : MSGCAMPO="Fechar janela  [Enter]"
EndSwitch

MontaRodapeSD(MSGCAMPO, TECLA)

RefreshDialog

Return TEMP
EndProc  ; (Sd_Dialog)

;*******************************************************************************
;*  Rotina para dados da NF-e                                                 *
;*******************************************************************************
Proc NFeRef()
Private Titdocto, nl2, nl3, nl4, c, tmj

While True
  If CHAMA
     Then Registro="Existe"
          SetaIndex(ArrayElement)
          PegaSeqIndex(IndexNFeRef)
     Else Registro="Novo" 
          
          SetaIndex(0)
          SetaSeq(0)
          For c From 1 To DynArraySize(Array_NFeRef)
            SetaIndex(c)
            PegaSeqIndex(c)
          EndFor
          SetaIndex(IndexNFeRef+1)
          SetaSeq(NumVal(VSD_I_SEQ)+1)
          
          Echo Normal
          Echo Off
          ShowPopup " Modelo do Documento " CENTERED
           "1- [55] NF-e   , Nota fiscal eletr“nica                   ":" Nota fiscal eletr“nica                        ":"55",
           "2- [01] NF     , Nota fiscal                              ":" Nota fiscal modelos 1 e 1-A                   ":"01",
           "9- [65] NFC-e  , Nota fiscal venda a consumidor eletr“nica":" Nota fiscal venda a consumidor eletr“nica     ":"65",
           "8- [02] NFC    , Nota fiscal venda a consumidor           ":" Nota fiscal modelo 2                          ":"02",
           "3- [04] NFPR   , Nota fiscal produtor rural               ":" Nota fiscal produtor rural                    ":"04",
           "4- [57] CT-e   , Conhecimento de Transporte eletr“nico    ":" Conhecimento de Transporte eletr“nico         ":"57",
           "5- [2B] ECF-MR , Cupom Fiscal ECF-MR                      ":" Cupom Fiscal emitido por Maquina registradora ":"2B",
           "6- [2C] ECF-PDV, Cupom Fiscal ECF-PDV                     ":" Cupom Fiscal emitido por PDV                  ":"2C",
           "7- [2D] ECF-IF , Cupom Fiscal ECF-IF                      ":" Cupom Fiscal emitido por impressora fiscal    ":"2D",
           "A- [59] CFe-SAT, Cupom Fiscal eletr“nico -SAT             ":" Cupom Fiscal eletr“nico - SAT                 ":"59",
           "~C~ancelar                                                ":" Cancelar a Opera‡„o                           ":"CANCELAR"
          EndMenu
          To MenuVar
          Echo Off
          
          If MenuVar="CANCELAR" or MenuVar="Esc"
             Then QuitLoop
          EndIf
          If MenuVar="02"
             Then Mensagem("Modelo s¢ disponivel NF-e 4.0")
                  QuitLoop
          EndIf                                         
                                                   
          VSDGMODELO=MenuVar

          If Not Localiza_Registro()
             Then End Down
                  Switch
                    Case TabWork="Notaec":
                      [Numero do Lancamento       ]=[Notaec->Numero do Lancamento     ]
                  EndSwitch
                  [Sequencia do Lancamento       ]=NumVal(VSD_I_SEQ)
                  [Modelo_Documento]=VSDGMODELO
                  UnLockRecord
          EndIf
  EndIf
  If Not CarregaVars()
     Then QuitLoop
  EndIf

  Switch
    Case VSDGMODELO="55":  TitDocto = "[55] NF-e, Nota fiscal eletr“nica"
    Case VSDGMODELO="01":  TitDocto = "[01] NF  , Nota fiscal modelos 1 e 1-A"
    Case VSDGMODELO="02":  TitDocto = "[02] NFC , Nota fiscal modelo 2 venda a consumidor"
    Case VSDGMODELO="04":  TitDocto = "[04] NFPR, Nota fiscal produtor rural"
    Case VSDGMODELO="57":  TitDocto = "[57] CT-e, Conhecimento de Transporte eletr“nico"
    Case VSDGMODELO="2B":  TitDocto = "[2B] ECF-MR , Cupom Fiscal ECF-MR"
    Case VSDGMODELO="2C":  TitDocto = "[2C] ECF-PDV, Cupom Fiscal ECF-PDV"
    Case VSDGMODELO="2D":  TitDocto = "[2D] ECF-IF , Cupom Fiscal ECF-IF"
    Case VSDGMODELO="65":  TitDocto = "[65] NFC-e , Nota fiscal venda a consumidor eletr“nica"
    Case VSDGMODELO="59":  TitDocto = "[59] CFe-SAT, Cupom Fiscal eletr“nico - SAT"
  EndSwitch
  
  Switch
    Case VSDGMODELO="55" Or VSDGMODELO="57" Or VSDGMODELO="65" Or VSDGMODELO="59":
      nl2  = 3
      nl3  = 12
      nl4  = 9
      tmj  = 13
      nldt = 32
      lflag = 10

    Case VSDGMODELO="01" Or VSDGMODELO="02" Or VSDGMODELO="04":
      nl2  = 3
      nl3  = 12
      nl4  = 14
      tmj  = 11
      nldt = 32
      lflag = 8
      
    Case VSDGMODELO="2B" Or VSDGMODELO="2C" Or VSDGMODELO="2D":
      nl2  = 12
      nl3  = 3
      nl4  = 14
      tmj  = 7
      nldt = 44 
      lflag = 4
      
  EndSwitch

  SD=2
  INICIO_DIALOG=True
  Mouse Hide 
              
  ShowDialog "Documento referenciado [    ]" Proc "SD_Dialog"
  Trigger "OPEN"
  Key "ENTER","ESC","F1","TAB","ReverseTab"
   @ 07,05   Height tmj Width 67
  
    Accept @ -01,42 Width 4 "A2" Tag "I_Seq" To VSD_I_SEQ
  
    @ 00,01 ?? TitDocto
    PaintCanvas Attribute 46 00, 00, 00, 64

    Label  @ 01   ,00 "Indicador do Emitente deste Documento"  For "TG_IND_EMIT"
    Accept @ 02   ,01 Width 04 "A01"  Picture "0,1" Tag "TG_IND_EMIT" To VSDGIND_EMIT
    Accept @ 02   ,04 Width 60 "A60"  Picture "!*!" Tag "TG_NOMIND_EMIT" To VSDGNOMIND_EMIT
    
    Label  @ nl2  ,00 "N§ Documento"  For "TG_NNFE"
    Accept @ nl2+1,01 Width 12 "A9"  Picture "#*#" Tag "TG_NNFE" To VSDGNNFE

    Label  @ nl2  ,14 "S‚rie"  For "TG_SERIE"
    Accept @ nl2+1,15 Width 06 "A4"  Picture "!*!" Tag "TG_SERIE" To VSDGSERIE
  
    Label  @ nl2  ,22 "SubS‚rie"  For "TG_SUBSERIE"
    Accept @ nl2+1,23 Width 08 "A4"  Picture "!*!" Tag "TG_SUBSERIE" To VSDGSUBSERIE
    
    Label  @ 03   ,nldt "Dt.Documento" For "TG_DTDOCTO"
    Accept @ 04   ,nldt+1 Width 13 "D" picture "#[#];.##;.##[##]" Tag "TG_DTDOCTO" to VSDGDTDOCTO
            
    Label  @ nl2+2,00 "Emitente do documento" For "TG_CODPART"
    Accept @ nl2+3,01 Width 07 "A4"  picture "!*!" Tag "TG_CODPART" to VSDGCODPART
    Accept @ nl2+3,08 Width 28 "A20" picture "!*!" Tag "TG_NOMPART" to VSDGNOMPART

    Label  @ nl2+2,37 "UF"  For "TG_UF"
    Accept @ nl2+3,38 Width 05 "A2"  Picture "&&" Tag "TG_UF" To VSDGUF
  
    Label  @ nl2+4,00 "CNPJ/CPF"  For "TG_CNPJ"
    Accept @ nl2+5,01  Width 21 "A18" picture "##[.]###.###/####-##,###.###.###-##" Tag "TG_CNPJ" to VSDGCNPJ
  
    Label  @ nl2+4,23 "IE"  For "TG_IE"
    Accept @ nl2+5,24  Width 18 "A15" picture "ISENTO,!*!" Tag "TG_IE" to VSDGIE   
  
  
    Label  @ nl4  ,00 "Chave de acesso"  For "TG_CHAVENFE"
    Accept @ nl4+1,01 Width 47 "A44"  Picture "#*#" Tag "TG_CHAVENFE" To VSDGCHAVENFE


    Label  @ nl3  ,00 "N§ COO"  For "TG_NCOO"
    Accept @ nl3+1,01 Width 09 "A6"  Picture "#*#" Tag "TG_NCOO" To VSDGNCOO
  
    Label  @ nl3  ,11 "N§ ECF"  For "TG_NECF"
    Accept @ nl3+1,12 Width 06 "A3"  Picture "#*#" Tag "TG_NECF" To VSDGNECF
  
    Label  @ nl3  ,19 "N§ S‚rie ECF"  For "TG_SECF"
    Accept @ nl3+1,20 Width 23 "A20"  Picture "!*!" Tag "TG_SECF" To VSDGSECF
  
    Accept @ lflag,61  Width 3  "A1" picture "!*!" Tag "TG_FLAG" to VSDGFLAG 
  
  EndDialog
  If Not RetVal
     Then Switch
            Case Registro="Existe" : Undo
                                     UnLockRecord
            Case Registro="Novo"   : Del
          EndSwitch
             
  EndIf   
  Mouse Show

  QuitLoop
EndWhile  
SD=1
Campo="TG_NFES"
Mouse Show

EndProc    ; (Vencimento)


;*******************************************************************************
;*  Rotina para a Tela Principal                                                *
;*******************************************************************************
Proc Inicial()
Private c

Message("")
Echo Normal
Echo Off

Mouse Show

If IsAssigned(Array_NFeRef)
   Then Release Vars Array_NFeRef
EndIf
DynArray Array_NFeRef[]

;**** Carrega notas referenciadas da OF ****************************

IndexNFeRef=0

If not IsEmpty("NotaeR") 
   Then Switch
          Case TabWork="Notaec":
            Moveto "NotaeR"
            Moveto [Numero do Lancamento]
            Locate [Notaec->Numero do Lancamento]
        EndSwitch
        
        While True
          Switch
            Case TabWork="Notaec":
              If [Numero do Lancamento]<>[Notaec->Numero do Lancamento]
                 Then QuitLoop
              EndIf   
          EndSwitch
          If [Sequencia do Lancamento   ]>0
             Then SetaSeq([Sequencia do Lancamento])
                  IndexNFeRef=IndexNFeRef+1
                  AtuaArray(IndexNFeRef)
          EndIf
          
          Skip
          If EOT() Then QuitLoop EndIf
        EndWhile
EndIf

Estados="AC,AL,AM,AP,BA,CE,DF,ES,EX,GO,MA,MG,MS,MT,PA,PB,PE,PI,PR,RJ,RN,RO,RR,RS,SC,SE,SP,TO"

SD=1
INICIO_DIALOG=True
ArrayElement=1
ShowDialog "Rela‡Æo de documentos referˆnciados" Proc "SD_Dialog"
  Trigger "OPEN"
     Key "ENTER","ESC","F2","DEL","INS"
   @ 06,03 Height 12 Width 71

    PickDynArray @ 01,01 Height 06 width 66
     Columns 1
      Array_NFeRef
       Tag "TG_NFES"
        To ArrayElement

    Label @ 00,01 "Seq Modelo Identificador"  For "TG_NFES"
                  ;99123499123
    Pushbutton @ 08,57 width 11 "~F~echar"       OK     Default Value "Ok" Tag "YES"          To BottonValue

  EndDialog
  Mouse Show

EndProc  ;(Inicial)

;*******************************************************************************
;****** Rotina Principal *********
;*******************************************************************************

TabWork=Table()

ncampo=Field()
UnLockRecord
FormKey
SaveTables



Moveto TabWork

Inicial()

Moveto TabWork
FormKey
Resynckey

Moveto Field ncampo
while IsLockRecord() endwhile

Release vars Array_NFeRef,SD,CHAMA,INICIO_DIALOG,Estados,
             VSD_I_SEQ,VSDGMODELO,VSDGDTDOCTO,VSDGCHAVENFE,VSDGUF,
             VSDGCNPJ,VSDGIE,VSDGSERIE,VSDGSUBSERIE,VSDGNNFE,VSDGNECF,VSDGSECF,VSDGNCOO,
             VSDGCODPART,VSDGNOMPART,VSDGFLAG,VSDGIND_EMIT,VSDGNOMIND_EMIT,
             ncampo,Registro,IndexNfeRef,
             Janela, WinArray5,  
             Janela2, WinArray52,TabWork  

Release procs Inical, SD_Dialog, NFeRef, SalvaDados, ExcluiArray, CarregaVars, AtuaArray, ChecaDados,
              SetaIndex, SetaSeq, PegaSeqIndex, Localiza_Registro
