;** Gserasa ********************************************************************
;*  Exportacao de dados p/ Serasa                                              *
;*******************************************************************************
;Autor           : Vise Informatica (VISERP)
;Desenvolvido    : 08/04/2013 por Anivel Augusto Rodrigues
;Ultima Alteracao: 12/04/2013 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes
;Ultima Alteracao: 15/04/2013 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes titulos zerados/duplicidade no periodo de emissao
;Ultima Alteracao: 16/04/2013 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes contador de titulos
;Ultima Alteracao: 19/04/2013 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes registros em branco
;Ultima Alteracao: 23/04/2013 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes erro comando
;Ultima Alteracao: 26/04/2013 por Anivel Augusto Rodrigues
;Motivo Alteracao: Inclusao da concilia‡Æo
;Ultima Alteracao: 07/05/2013 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes titulos ate 1 ano atraz
;Ultima Alteracao: 27/05/2013 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes titulos ate 1 ano atraz na concilia‡Æo liquidar
;Ultima Alteracao: 10/06/2013 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes relatorio de erros
;Ultima Alteracao: 11/06/2013 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes relatorio de erros
;Ultima Alteracao: 30/09/2013 por Bruno Carvalho
;Motivo Alteracao: Ajustes CarregarLista(), onde ser  exibido apenas os arquivos SER*.F*
;Ultima Alteracao: 24/10/2013 por Bruno Carvalho
;Motivo Alteracao: Ajustes CarregarLista(), onde ser  exibido os arquivos SER*.*
;Ultima Alteracao: 06/09/2016 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes showdialog                   
;Ultima Alteracao: 24/12/2016 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes showdialog    
;Ultima Alteracao: 03/01/2017 por Rafael Matos
;Motivo Alteracao: Ajustes showdialog MensagemRadioButtons()               
;Ultima Alteracao: 28/03/2019 por Anivel Augusto Rodrigues                           
;Motivo Alteracao: Ajustes drive raiz para privdir()
;Ultima Alteracao: 29/04/2019 por Bruno Carvalho                           
;Motivo Alteracao: Removido um EndIf na proc ConfOpcoes()
;Ultima Alteracao: 29/07/2020 por Anivel Augusto Rodrigues                           
;Motivo Alteracao: Ajustes nvo nome arquivo retorno 
;Ultima Alteracao: 08/09/2020 por Anivel Augusto Rodrigues                           
;Motivo Alteracao: Ajustes execvise fun‡Æo 

;*******************************************************************************
;* Grava detalhes                                                              *
;*******************************************************************************
Proc Grava_Detalhe(Tipo)
Private Tipo

Switch
  Case Tipo="Clientes":
    NR = NRecords("Answer")
    
    View "Answer"                                                         
    Scan
      Barra(NR, RecNo())
      Aguarde("Aguarde, processando clientes "+BARRA_STRING)
     
      If MONTA_STRING([CGC],"N","A",14)="00000000000000"
         Then Loop
      EndIf

      Print File ARQ "01"
      Print File ARQ MONTA_STRING([CGC],"N","A",14) 
      Print File ARQ "01"
      If IsBlank([Data_Cadastro])
         Then Print File ARQ MONTA_STRING(Today(),"DTAMD","DT",08)
              tpclie="2"
         Else Print File ARQ MONTA_STRING([Data_Cadastro],"DTAMD","DT",08)
              If (Today()-[Data_Cadastro])>=365
                 Then tpclie="1"  
                 Else tpclie="2"
              EndIf     
      EndIf   
      If [Inativo]="S" Then tpclie="3" EndIf
      Print File ARQ tpclie
      Print File ARQ Completa("",38," ")
      Print File ARQ Completa("",34," ")
      Print File ARQ Completa("",01," ")
      Print File ARQ Completa("",30," ")
      Print File ARQ "\n"
      nclientes=nclientes+1
    EndScan
    ClearAll
    
    LimpAguarde()
EndSwitch

EndProc

;*******************************************************************************
;* Grava Header                                                                *
;*******************************************************************************
Proc Grava_Header()

Print File ARQ "00"
Print File ARQ Completa("RELATO COMP NEGOCIOS",20," ")
Print File ARQ cnpj_empresa                           
Print File ARQ MONTA_STRING(VSDGDTINI,"DTAMD","DT",08)                           
Print File ARQ MONTA_STRING(VSDGDTFIM,"DTAMD","DT",08)                           
Switch
  Case VSDGPERIODICIDADE=1 : Print File ARQ "D"
  Case VSDGPERIODICIDADE=2 : Print File ARQ "S"
  Case VSDGPERIODICIDADE=3 : Print File ARQ "Q"
  OtherWise                : Print File ARQ "M"
EndSwitch
Print File ARQ Completa(" ",15," ")
Print File ARQ Completa(" ",03," ")
Print File ARQ Completa(" ",29," ")
Print File ARQ "V."
Print File ARQ "01"
Print File ARQ Completa(" ",26," ")
Print File ARQ "\n"

EndProc

;*******************************************************************************
;* Grava trailler                                                              *
;*******************************************************************************
Proc Grava_Trailler()

Print File ARQ "99"
Print File ARQ AlinhM(StrVal(nclientes),11)                           
Print File ARQ Completa(" ",44," ")
Print File ARQ AlinhM(StrVal(ntitulos),11)                           
Print File ARQ Completa(" ",11," ")
Print File ARQ Completa(" ",11," ")
Print File ARQ Completa(" ",10," ")
Print File ARQ Completa(" ",30," ")
Print File ARQ "\n"

EndProc

;*******************************************************************************
;* Rotina p/ selecionar clientes                                               *
;*******************************************************************************
Proc TempoRelacionamento()
LimpAguarde()
ClearAll

{Ask} {\\Sistemas\\Cadastro\\Destinat}
Moveto [CGC                    ] Check
Moveto [Tipo Pessoa            ] TypeIn "JURIDICA"
Switch
  Case SYS_CODIGO_CLIENTE="0051":
    Moveto [Codigo do Representante] TypeIn "Not 0025, Not 0005, Not 0004"
EndSwitch
Moveto [Inativo                ] Check
Moveto [Data_Cadastro          ] Check
If VSDGPERIODICIDADE<5 
   Then Moveto [Data_Cadastro  ] TypeIn ">=~VSDGDTINI, <=~VSDGDTFIM"
   Else ;;;VSDGPERIODICIDADE sera 5 = primeira vez
EndIf
Do_It!
ClearAll

Grava_Detalhe("Clientes")
Delete "Answer"
    
EndProc

;*******************************************************************************
;* Rotina p/ selecionar titulos                                                *
;*******************************************************************************
Proc Remessa()
LimpAguarde()
ClearAll

;--- Arquivo Texto trabalho ----------------------------------------------------
ARQ     = "\\Sistemas\\Exporta\\Dados\\"+"SERASA.TXT"
ARQ_TEMP="\\Sistemas\\Exporta\\Dados\\SERASA_REMESSA_"
If VSDGPERIODICIDADE<5
   Then ARQ_TEMP=ARQ_TEMP+MONTA_STRING(Format("D13",VSDGDTINI),"N","A",08)+"_"+MONTA_STRING(Format("D13",VSDGDTFIM),"N","A",08)+".TXT"
   Else ARQ_TEMP=ARQ_TEMP+"PRIMEIRA_VEZ"+".TXT"
EndIf
Deleta_Arquivo(ARQ)
Deleta_Arquivo(ARQ_TEMP)

;--- Selecionando titulos emitidos ---------------------------------------------

{Ask} {\\Sistemas\\Cadastro\\Destinat}
Moveto [Codigo                 ] Example "cdcli"
Switch
  Case SYS_CODIGO_CLIENTE="0051":
    Moveto [Codigo do Representante] TypeIn "Not 0025, Not 0005, Not 0004"
EndSwitch
Moveto [Tipo Pessoa            ] TypeIn "JURIDICA"
Moveto [CGC                    ] Check
{Ask} {\\Sistemas\\Ctarec\\Duplic} 
Moveto [Codigo do Destinatario ] Example "cdcli"
Moveto [Codigo da Empresa      ] TypeIn "~VSDGEMPRESA.."
Moveto [Numero do Lancamento   ] Check
Moveto [Numero do Documento    ] Check
Moveto [Data de Emissao        ] Check TypeIn ">=~VSDGDTINI, <=~VSDGDTFIM"
Moveto [Data de Vencimento     ] Check
Moveto [Valor do Documento     ] Check
Moveto [Saldo do Documento     ] Check
If VSDGPERIODICIDADE=5 ; primeira vez
   Then Moveto [Saldo do Documento    ] TypeIn "> 0.01"
Endif

Do_It!
ClearAll
TabelaEM=Cria_Temp(PrivDir())
Rename "Answer" TabelaEM

;--- Selecionando titulos baixados ---------------------------------------------
{Ask} {\\Sistemas\\Ctarec\\Duplic}  
Moveto [Numero do Lancamento   ] Example "nlanc"
Moveto [Codigo da Empresa      ] TypeIn "~VSDGEMPRESA.."
{Ask} {\\Sistemas\\Ctarec\\DupBaixa}       
Moveto [Numero do Lancamento   ] Check Example "nlanc"
Moveto [Sequencia da Baixa     ] TypeIn "Calc Count as nbaixas"
Moveto [Data do Pagamento      ] TypeIn ">=~VSDGDTINI, <=~VSDGDTFIM"
Do_It!
ClearAll

{Ask} {\\Sistemas\\Cadastro\\Destinat} 
Moveto [Codigo                 ] Example "cdcli"
Moveto [CGC                    ] Check
Moveto [Tipo Pessoa            ] TypeIn "JURIDICA"
Switch
  Case SYS_CODIGO_CLIENTE="0051":
    Moveto [Codigo do Representante] TypeIn "Not 0025, Not 0005, Not 0004"
EndSwitch
{Ask} {Answer}  
Moveto [Numero do Lancamento   ] Example "nlanc"
Moveto [nbaixas                ] Check
{Ask} {\\Sistemas\\Ctarec\\Duplic}  
Moveto [Numero do Lancamento   ] Example "nlanc"
Moveto [Codigo do Destinatario ] Example "cdcli"
Moveto [Numero do Documento    ] Check
Moveto [Data de Emissao        ] Check
Moveto [Data de Vencimento     ] Check
Moveto [Valor do Documento     ] Check
Moveto [Saldo do Documento     ] Check
{Ask} {\\Sistemas\\Ctarec\\DupBaixa}       
Moveto [Numero do Lancamento   ] Check Example "nlanc"
Moveto [Sequencia da Baixa     ] Check
Moveto [Tipo da Baixa          ] Check
Moveto [Data do Pagamento      ] Check TypeIn ">=~VSDGDTINI, <=~VSDGDTFIM"
Moveto [Valor do Recebimento   ] Check
Moveto [Valor do Desconto      ] Check
Moveto [Valor do Juros         ] Check
Do_It!
ClearAll
TabelaBX=Cria_Temp(PrivDir())
Rename "Answer" TabelaBX


;--- Excluindo titulos emitidos e baixados no periodo --------------------------
{Ask} TypeIn TabelaBX Enter
Moveto [CGC                ] TypeIn "_cgc"
Moveto [Numero do Documento] TypeIn "_ndoc"
{Ask} TypeIn TabelaEM Enter TypeIn "Delete"
Moveto [CGC                ] TypeIn "_cgc"
Moveto [Numero do Documento] TypeIn "_ndoc"
Do_It!
ClearAll



Grava_Header()

;--- Gravando clientes novos ---------------------------------------------------
TempoRelacionamento()

;--- Gravando txt emitidos -----------------------------------------------------
Sort TabelaEM On "Data de Emissao","Numero do Documento"
NR = NRecords(TabelaEM)

View TabelaEM
Scan
  Barra(NR, RecNo())
  Aguarde("Aguarde, processando titulos emitidos "+BARRA_STRING)

  If MONTA_STRING([CGC],"N","A",14)="00000000000000"
     Then Loop
  EndIf
  If [Valor do Documento]<=0.01
     Then Loop
  EndIf
  If IsBlank([Numero do Documento])
     Then Loop
  EndIf

  Print File ARQ "01"
  Print File ARQ MONTA_STRING([CGC],"N","A",14) 
  Print File ARQ "05"
  Print File ARQ Completa("",10," ")
  Print File ARQ MONTA_STRING([Data de Emissao],"DTAMD","DT",08)                           
  Print File ARQ Valor_Str([Valor do Documento],13,02)                           
  Print File ARQ MONTA_STRING([Data de Vencimento],"DTAMD","DT",08)                           
  Print File ARQ Completa("",08," ")
  Print File ARQ "#D"
  Print File ARQ Completa([Numero do Documento],32," ")
  Print File ARQ Completa("",01," ")
  Print File ARQ Completa("",24," ")
  Print File ARQ Completa("",02," ")
  Print File ARQ Completa("",01," ")
  Print File ARQ Completa("",01," ")
  Print File ARQ Completa("",02," ")
  Print File ARQ "\n"
  ntitulos=ntitulos+1
EndScan
ClearAll
LimpAguarde()

;--- Gravando txt baixados -----------------------------------------------------
nlanc="99999999"

Sort TabelaBX On "Numero do Lancamento","Sequencia da Baixa"
NR = NRecords(TabelaBX)

View TabelaBX
Scan
  Barra(NR, RecNo())
  Aguarde("Aguarde, processando titulos baixados "+BARRA_STRING)

  If MONTA_STRING([CGC],"N","A",14)="00000000000000"
     Then Loop
  EndIf
  If IsBlank([Numero do Documento])
     Then Loop
  EndIf

  If VSDGPERIODICIDADE=5 ; primeira vez nÆo gerar baixas
     Then Loop
  EndIf

  If [Numero do Lancamento]<>nlanc
     Then nlanc=[Numero do lancamento]
          
          ndocto=[Numero do Documento]
          ordem =""
          saldo =[Valor do Documento ]
          nbx   =0
  EndIf   

  If [Saldo do Documento]<=0.01 And VSDGPERIODICIDADE=5 ; primeira vez
     Then Loop
  EndIf   

  nbx    =nbx+1
  vrbaixa=([Valor do Recebimento]+[Valor do Desconto])-[Valor do Juros]
  saldo  =saldo-vrbaixa

  Switch
    Case [Tipo da Baixa]="CANCELADO" And 
         [nbaixas]=1 And saldo<=0.01     : Valor=99999999999.99
                                           dtpg =BlankDate()
    OtherWise                            : Valor=vrbaixa
                                           dtpg =[Data do Pagamento ]
  EndSwitch

  Linha1=""
  Linha2=""

  Linha1=       "01"
  Linha1=Linha1+MONTA_STRING([CGC],"N","A",14) 
  Linha1=Linha1+"05"
  Linha1=Linha1+Completa("",10," ")
  Linha1=Linha1+MONTA_STRING([Data de Emissao],"DTAMD","DT",08)                           
  Linha1=Linha1+Valor_Str(valor,13,02)                           
  Linha1=Linha1+MONTA_STRING([Data de Vencimento],"DTAMD","DT",08)                           
  If IsBlank(dtpg)
     Then Linha1=Linha1+Completa("",08," ")
     Else Linha1=Linha1+MONTA_STRING([Data do Pagamento ],"DTAMD","DT",08)
  EndIf
  Linha1=Linha1+"#D"
  Linha1=Linha1+Completa(ndocto+ordem,32," ")
  Linha1=Linha1+Completa("",01," ")
  Linha1=Linha1+Completa("",24," ")
  Linha1=Linha1+Completa("",02," ")
  Linha1=Linha1+Completa("",01," ")
  Linha1=Linha1+Completa("",01," ")
  Linha1=Linha1+Completa("",02," ")
  Linha1=Linha1+"\n"

  If saldo>0.01 
     Then
          ordem  =CHR(64+nbx)
          
          Linha2=       "01"
          Linha2=Linha2+MONTA_STRING([CGC],"N","A",14) 
          Linha2=Linha2+"05"
          Linha2=Linha2+Completa("",10," ")
          Linha2=Linha2+MONTA_STRING([Data de Emissao],"DTAMD","DT",08)                           
          Linha2=Linha2+Valor_Str(saldo,13,02)                           
          Linha2=Linha2+MONTA_STRING([Data de Vencimento],"DTAMD","DT",08)                           
          Linha2=Linha2+Completa("",08," ")
          Linha2=Linha2+"#D"
          Linha2=Linha2+Completa(ndocto+ordem,32," ")
          Linha2=Linha2+Completa("",01," ")
          Linha2=Linha2+Completa("",24," ")
          Linha2=Linha2+Completa("",02," ")
          Linha2=Linha2+Completa("",01," ")
          Linha2=Linha2+Completa("",01," ")
          Linha2=Linha2+Completa("",02," ")
          Linha2=Linha2+"\n"
  EndIf   

  If [Data do Pagamento]>=VSDGDTINI
     Then
          If saldo>0.01
             Then If nbx=[nbaixas]
                     Then If Not IsBlank(Linha2) 
                             Then Print File ARQ Linha2
                                  ntitulos=ntitulos+1
                          EndIf
                  Endif
             Else If nbx=[nbaixas]
                     Then Print File ARQ Linha1
                          ntitulos=ntitulos+1
                  EndIf
          EndIf
  EndIf   

EndScan
ClearAll
LimpAguarde()

Grava_Trailler()

Close Printer

;--- Arquivo Texto gerado ------------------------------------------------------
;;cmd="REN "+ARQ+" "+ARQ_TEMP
;;ExecVise(cmd)

FileWrite        PrivDir()+"funcao1.txt"  From  "REN|"+ARQ+"|"+ARQ_TEMP+"\n"
ExecVise(PrivDir()+"funcao1.txt")

COR_MENSAGEM="1"
MSG=    "// Gerado o arquivo: // //["+SubStr(Directory(),1,2)+ARQ_TEMP+"] //"
Mensagem(MSG)
Release Vars COR_MENSAGEM

Delete TABELAEM
Delete TABELABX
Deleta_Arquivo(ARQ)

EndProc

;********************************************************************************
;* CONVERTE VALOR PARA STRING                                                  *
;********************************************************************************
Proc Valor_Str(Valor,Tam,Dec)
Private VrTit,Valor,Tam,Dec,Part1,Part2
VrTit=StrVal(Valor)
If SearchFrom(".",VrTit,1)>0
   Then Part1=SubStr(VrTit,1,SearchFrom(".",VrTit,1)-1)
        Part2=SubStr(VRTit,SearchFrom(".",VrTit,1)+1,Dec)
        Part2=PART2+Fill(0,DEC-Len(Part2))
   Else Part1=VrTit
        Part2=Fill(0,Dec)
EndIf
Vrtit=Part1+Part2
VrTit=Fill("0",Tam-Len(VrTit))+VrTit
Return VrTit
EndProc  ; (Valor_Str)

;******************************************************************************
;*Procedimento responsavel pela montagem do cgc/cpf
;******************************************************************************
Proc MONTA_STRING(MSTRING,NUMALF,OP,TM)
M_NOVO = ""
Switch
   Case NUMALF = "N":
        For I From 1 to Len(MSTRING)
            If (Asc(SubStr(MSTRING,I,1)) >= 48) And
               (Asc(SubStr(MSTRING,I,1)) <= 57)
               Then M_NOVO = M_NOVO + SubStr(MSTRING,I,1)
            EndIf
        EndFor
   Case NUMALF = "A":
        For I From 1 to Len(MSTRING)
            If (Asc(SubStr(MSTRING,I,1)) >= 065) And
               (Asc(SubStr(MSTRING,I,1)) <= 122)
               Then M_NOVO = M_NOVO + SubStr(MSTRING,I,1)
            EndIf
        EndFor
   Case NUMALF = "AN":
        For I From 1 to Len(MSTRING)
            If (Asc(SubStr(MSTRING,I,1)) >= 065) And
               (Asc(SubStr(MSTRING,I,1)) <= 122) Or
               (Asc(SubStr(MSTRING,I,1)) >= 48) And
               (Asc(SubStr(MSTRING,I,1)) <= 57)
               Then M_NOVO = M_NOVO + SubStr(MSTRING,I,1)
            EndIf
        EndFor
   Case NUMALF = "DTAMD":
        M_NOVO=AlinhM(StrVal( Year(MSTRING)),4)+
               AlinhM(StrVal(Month(MSTRING)),2)+
               AlinhM(StrVal(  Day(MSTRING)),2)
        Return M_NOVO        
EndSwitch
If Len(M_NOVO)>TM
   Then M_NOVO=""
EndIf
IF OP="A"
   Then M_NOVO=ALINHM(M_NOVO,TM)
EndIf

Return(M_NOVO)
EndProc ; (Monta_String)



;*******************************************************************************
;* Exporta p/ DBF                                                              *
;*******************************************************************************
Proc Converte()
Private CNV_OK,cc

LimpAguarde()
LimpAguardes()

Aguardes("Aguarde, Preparando concilia‡Æo")

If IsTable("Retorno")
   Then Delete "Retorno"
EndIf

ARQTEMP=PrivDir()+"TEMP.TXT"
Deleta_Arquivo(ARQTEMP)
Sleep 1500
;;Copia_Arquivo(AjustaPasta(VSDGPASTA)+ARQUIVO+" "+ARQTEMP)

FileWrite        PrivDir()+"funcao1.txt"  From  "COP|"+AjustaPasta(VSDGPASTA)+ARQUIVO+"|"+ARQTEMP+"\n"
ExecVise(PrivDir()+"funcao1.txt")

Sleep 1500

If Not IsFile(ARQTEMP)
  Then MSG="N„o foi pos¡vel criar arquivo tempor rio para a tarefa" 
       Mensagem(MSG)
       Return False
EndIf

Copy "Retorno2" "Retorno"
Empty("Retorno")


FileRead ARQTEMP to varinner
Edit "Retorno"
pos=1
While True
  posf=searchFrom("\n",varinner,pos)
  if posf=0 then quitLoop endif
  [Field-1]=substr(varinner,pos,(posf-pos))
  Down
  pos=posf+1
EndWhile
Do_It!
ClearAll
If IsAssigned(varinner) Then release vars varinner  EndIf

CNV_OK=False
View "Retorno"
Scan
  If Search("CONCILIA",[Field-1])>0 And 
     SubStr([Field-1],23,14)=CNPJ_EMPRESA
     Then CNV_OK=True
          QuitLoop
  EndIf
EndScan
ClearAll

If Not CNV_OK
   Then MSG="O Arquivo [ "+ARQUIVO+" ] // //"
        MSG=MSG+"N„o se refere a retorno Serasa concilia‡Æo ou // //empresa difere do seu cnpj "+CNPJ_EMPRESA+", verificar !"
        Mensagem(MSG)
EndIf

Return CNV_OK
EndProc

;************************************
;* ROTINA PARA Ler/Gravacao Opcao   *
;************************************
Proc ConfOpcoes(Opcao)
Private Opcao

Switch
  Case Opcao="Ler":
       If IsFile(PrivDir()+"gserasa.ini")
          Then LeiaINI(PrivDir()+"gserasa.ini","VSDGPASTA.S.c:")
       EndIf
       If Not IsAssigned(VSDGPASTA)    Then VSDGPASTA="\\Sistemas\\Exporta\\Dados\\Serasa\\" endif
  Case Opcao="Gravar":
       FileWrite PrivDir()+"gserasa.ini" From GravaExpressao("VSDGPASTA","S",AjustaPasta(VSDGPASTA))
EndSwitch
EndProc ;

;*******************************************************************************
;* Carregar Lista                                                              *
;*******************************************************************************
Proc PegaNomeArquivo(indice)
Private indice

Return  RTrim(SubStr(Array_Registro[Indice],25,100))
EndProc

;*******************************************************************************
;* Carregar Lista                                                              *
;*******************************************************************************
Proc AjustaPasta(s)
Private s,ns,i

ns=""
For i From 1 to Len(s)
 If SubStr(s,i,1)=Chr(92)
    Then ns=ns+Chr(92)
 EndIf
 ns=ns+SubStr(s,i,1)
EndFor
Return ns
EndProc

;*******************************************************************************
;* Carregar Lista                                                              *
;*******************************************************************************
Proc CarregarLista()

ARQUIVO  =""
DynArray Array_Registro[]

Wcs=0
Lista_DiretorioD(VSDGPASTA,"R.*RELATO.CONCILIACAO*","D")

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]=SubStr(ELINHA,1,Len(ELINHA)-1)
          EndWhile
          CancelEdit

          QuitLoop
  EndIf
EndFor
ArrayElement=1
EndProc

;*******************************************************************************
;* Rotina ShowDialog para Imprimir em arquivo                                  *
;*******************************************************************************
Proc SD_Arquivo(Disparo,Campo,Evento,Elemento)
Private Disparo,Campo,Evento,Elemento

Temp=True
TECLA    =""
MSG_CAMPO=""

If Disparo="OPEN"
   Then AoCriarShowDialog()
        Campo="TG_ARQUIVOS"
EndIf

If Disparo="UPDATE"
   Then Switch
          Case Campo="TG_CONFIG" : Play "SETPASTA"
                                   CarregarLista()
                                   Campo="TG_ARQUIVOS"
          OtherWise              : Return Temp
        EndSwitch  
EndIf

If Disparo="EVENT" And Evento["Type"]="KEY" Then
   Temp=False
   Switch
     Case Evento["KeyCode"] =  27:
          Temp=False
          Switch
            Case Campo="TG_ARQUIVOS"           : Campo="NO"
            Case Campo="TG_CONFIG"             : Campo="TG_ARQUIVOS"
            Case Campo="YES" Or Campo="ARQ_NO" : Campo="TG_ARQUIVOS"
          EndSwitch
     Case Evento["KeyCode"] = -83 And Campo="TG_ARQUIVOS":
          ARQDEL=ControlValue("TG_ARQUIVOS")
          ConfGeral("Confirma a exclus„o do arquivo "+ARQUIVO+" ?")
          If Ok="S"
             Then ARQUIVO=PegaNomeArquivo(ArrayElement)
                 ;ExecVise("DELT "+AjustaPasta(VSDGPASTA)+ARQUIVO)

                  FileWrite        PrivDir()+"funcao1.txt"  From  "DELT|"+AjustaPasta(VSDGPASTA)+ARQUIVO+"\n"
                  ExecVise(PrivDir()+"funcao1.txt")

                  Array_Registro[ArrayElement]=""

                  DynArray Array_RegistroI[]
                  c=0
                  For i From 1 To DynArraySize(Array_Registro)
                    If IsBlank(Array_Registro[i]) Then Loop EndIf
                    c=c+1
                    Array_RegistroI[c]=Array_Registro[i]
                  EndFor

                  Release Vars Array_Registro
                  DynArray Array_Registro[]
                  For i From 1 To DynArraySize(Array_RegistroI)
                    Array_Registro[i]=Array_RegistroI[i]
                  EndFor
                  Release Vars Array_RegistroI
          EndIf
     Case Evento["KeyCode"] = 13:
          Temp=False
          If Checa_TAG()
             Then Switch
                    Case Campo="TG_ARQUIVOS"    : Campo="YES"
                         ARQUIVO=ControlValue("TG_ARQUIVOS")
                    Case Campo="TG_CONFIG"      : 
                         Play "SETPASTA"
                         CarregarLista()
                         Campo="TG_ARQUIVOS"
                  EndSwitch
          EndIf
   EndSwitch
EndIf
Switch
  Case Campo="TG_ARQUIVOS":
       MSG_CAMPO="Selecione o arquivo se desejado !"
       TECLA=""+"=Selecionar  Del=Excluir  "
EndSwitch

Monta_Prompt(MSG_CAMPO,TECLA)
Return Temp
EndProc


;*******************************************************************************
;* Rotina ShowDialog para Imprimir em arquivo                                  *
;*******************************************************************************
Proc Seleciona_Arquivo()

ConfOpcoes("Ler")
CarregarLista()

DynArray Array_Arquivos[]
ARQUIVO  =""
Tipo_Ext =".XXX"

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

While True

 ShowDialog "Importar/Conciliar retorno Serasa [RELATO]" Proc "SD_Arquivo"
   Trigger "OPEN","ARRIVE","UPDATE","SELECT"
    Key "ENTER","ESC",-152,-31,-32,-25,-20,-49,-83,
      -104, -105, -106, -107, -108, -109, -110, -111, -112, -113, -139, -140    
     @ 03,12   Height 20 Width 78

    @ 01,01 ?? "Caminho padrÆo para arquivos de retorno:"
    @ 02,02 ?? VSDGPASTA
    PaintCanvas Attribute 121 02,01,02,73

    Label  @ 04,00 "~L~ista de arquivos"  For "TG_ARQUIVOS"
    PickDynArray @05,01 Height 10 width 73
     Columns 1
      Array_Registro
       Tag "TG_ARQUIVOS"
        To ArrayElement

    Pushbutton @ 16,25 width 11 "~O~k"         OK     Default Value "Ok" Tag "YES"        To BottonValue
    Pushbutton @ 16,38 width 11 "~C~ancela"    CANCEL                    Tag "NO"         To BottonValue
    Pushbutton @ 16,61 width 14 "Con~f~igurar"                           Tag "TG_CONFIG"  To BottonValue

 EndDialog
 If Not Retval
    Then Return False
 EndIf

 If DynArraySize(Array_Registro)=0
    Then Mensagem("NÆo existe arquivo selecionado !")
         Loop
 EndIf

 ARQUIVO=PegaNomeArquivo(ArrayElement)
 If IsBlank(ARQUIVO)
    Then Mensagem("Nome do arquivo a ler inv lido !")
         Loop
 EndIf

 If Not Converte()
    Then Return False
 EndIf   

 Return True
 
EndWhile

EndProc


;********************************************************************************
;* CONVERTE VALOR PARA STRING                                                  *
;********************************************************************************
Proc Conciliacao()
Private linha, posi, s, titulo, cgc, codclie, achou_cliente, wc, ii

If Not Seleciona_Arquivo()
   Then Return
EndIf   

;--- Arquivo Texto trabalho ----------------------------------------------------
ARQ_ERRO= "\\Sistemas\\Exporta\\Dados\\"+"SERASA.ERR"
ARQ     = "\\Sistemas\\Exporta\\Dados\\"+"SERASAC.TXT"
ARQ_TEMP="\\Sistemas\\Exporta\\Dados\\SERASA_CONCILIADO_"+
         MONTA_STRING(Format("D13",VSDGDTINI),"N","A",08)+"_"+MONTA_STRING(Format("D13",VSDGDTFIM),"N","A",08)+".TXT"

Deleta_Arquivo(ARQ_ERRO)
Deleta_Arquivo(ARQ)
Deleta_Arquivo(ARQ_TEMP)

LimpAguarde()
LimpAguardes()

conciliadook=true

NR = NRecords("Retorno")

view "\\Sistemas\\Cadastro\\Destinat"
View "Duplic"
View "Dupbaixa"
View "Retorno"
Scan
  Barra(NR, RecNo())
  Aguarde("Aguarde, processando concilia‡Æo "+BARRA_STRING)

  Linha=[Field-1]
  
  If Substr(linha,01,02)="00"
     Then s=substr(linha,45,8)
          dtfinal=DateVal(SubStr(s,7,2)+"."+SubStr(s,5,2)+"."+SubStr(s,1,4))

          Print File ARQ Linha+"\n"
          Loop
  Endif   
  If Substr(linha,17,02)<>"05"
     Then Print File ARQ Linha+"\n"
          Loop
  Endif   

  cgc=SubStr(linha,03,14)
  cgc=SubStr(cgc,01,02)+"."+
      SubStr(cgc,03,03)+"."+
      SubStr(cgc,06,03)+"/"+
      SubStr(cgc,09,04)+"-"+
      SubStr(cgc,13,02)

;;posi=search("#D",linha)
;;titulo=rtrim(substr(linha,posi+2,20))

  titok =false
  titulo=rtrim(substr(linha,19,10))
  For ii From 1 to 2
    Switch
      Case ii=1 : posi=search("/",titulo)
      Case ii=2 : posi=search("-",titulo)
    EndSwitch
    If posi>0
       Then titulo=substr(titulo,1,posi+1)
            titok =true 
            quitloop
    Endif
  EndFor

  s=substr(linha,29,8)
  dtemis=DateVal(SubStr(s,7,2)+"."+SubStr(s,5,2)+"."+SubStr(s,1,4))

  dtpg  =BlankDate()

  ACHOU_CLIENTE=False
  Moveto "\\Sistemas\\Cadastro\\Destinat"
  Moveto [CGC]
  Locate cgc
  If RetVal
     Then While True
            If [Tipo]="C" And [Inativo]<>"S"
               Then ACHOU_CLIENTE=True
                    Quitloop
               Else Skip
                    If EOT() Then QuitLoop EndIf
                    Locate Next cgc    
                    If Not RetVal
                       Then QuitLoop  
                    EndIf
             EndIf                          
          EndWhile
  EndIf

  If ACHOU_CLIENTE
     Then codclie=[Codigo]
     Else Grava_Erro("PESSOA NAO LOCALIZADA NO CADASTRO")
          Loop
  Endif   

  titok=false
  Moveto "Duplic"
  Moveto [Numero do Documento]
  Locate titulo
  While True
    If Not retVal
       Then QuitLoop
       Else Switch
              Case ACHOU_CLIENTE:          
                If [Codigo do Destinatario]=codclie And [Data de Emissao]=dtemis
                   Then titok=true
                        QuitLoop
                Endif
              OtherWise:
                If [Data de Emissao]=dtemis
                   Then titok=true
                        QuitLoop
                Endif
            EndSwitch
               
            Skip
            If EOT() Then QuitLoop EndIf
            
            Locate Next titulo 
            If Not RetVal
               Then QuitLoop  
            EndIf
    Endif
  EndWhile

  If not titOk
     Then Grava_Erro("TITULO NAO LOCALIZADA NA COBRANCA")
          Loop
     Else
          saldo=[Duplic->Valor do Documento]
     
          Moveto "Dupbaixa"
          Moveto [Numero do Lancamento]
          Locate [Duplic->Numero do Lancamento] 
          If retVal
             Then While [Numero do Lancamento]=[Duplic->Numero do Lancamento]
             
                    If [Data do Pagamento]<=dtfinal
                       Then
                            vrbaixa=([Valor do Recebimento]+[Valor do Desconto])-[Valor do Juros]
                            saldo  =saldo-vrbaixa
                       
                            dtpg=[Data do pagamento]
                    EndIf   
             
                    Skip
                    If EOT() Then QuitLoop Endif
                  EndWhile
             Else If [Duplic->Data de Emissao]<VSDGDTINI
                     Then dtpg=dtfinal   
                          saldo=0
                  EndIf                
          Endif

          If IsBlank(dtpg) and saldo<=0.01
             Then Grava_Erro("TITULO LIQUIDADO, BAIXA NAO LOCALIZADA NA COBRANCA")
                  Loop
          EndIf    

          If saldo>0.01
             Then dtpg=BlankDate()
          Endif   
  Endif
  
  Grava_Conciliacao()

  Moveto "Retorno"
EndScan
ClearAll

LimpAguarde()
LimpAguardes()

If Not conciliadook
   Then 
        MSG=    "Foram detectados erros nesta concilia‡Æo !        //"
        MSG=MSG+"Verificar relatorios de erros !                   // //"
        Mensagem(MSG)

        DISPOSITIVO()
        If OK<>"" 
           Then
                Tabela_ERRO=Cria_Temp(PrivDir())
                Copy "\\Base\\Sistemas\\Estoque\\RM_tx160" Tabela_ERRO
        
                {Tools} {ExportImport} {Import} {ASCII} {AppendDelimited} TypeIn ARQ_ERRO Enter
                TypeIn Tabela_ERRO Enter ClearAll
                OPCAOPAG="Todas"
                IMPRIREL(Tabela_ERRO,"1")
        
                Delete Tabela_ERRO
        
                MSG=MSG+"  * Caso queira gerar a remessa desta concilia‡Æo,//"
                MSG=MSG+"    os titulos com erros passaram a  constar  como//"
                MSG=MSG+"    liquidados;                                   //"
                MSG=MSG+"  * Caso contrario a concilia‡Æo nÆo ser   gerada,//"
                MSG=MSG+"    corrija os erros e gere novamente.            // //"
                MSG=MSG+"Deseja gerar o arquivo conciliado assim mesmo ?"
                If ConfGeral(MSG)
                   Then conciliadook=true
                EndIf   
        EndIf   
EndIf   

If Not conciliadook
   Then
        MSG="NÆo foi gerado o arquivo de concilia‡Æo !" 
   Else
        ;--- Arquivo Texto gerado ------------------------------------------------------
       ;cmd="REN "+ARQ+" "+ARQ_TEMP
       ;ExecVise(cmd)

        FileWrite        PrivDir()+"funcao1.txt"  From  "REN|"+ARQ+"|"+ARQ_TEMP+"\n"
        ExecVise(PrivDir()+"funcao1.txt")

        MSG="Gerado o arquivo da concilia‡Æo: // //["+SubStr(Directory(),1,2)+ARQ_TEMP+"] //"
EndIf

COR_MENSAGEM="1"
Mensagem(MSG)
Release Vars COR_MENSAGEM

Close Printer

Delete "Retorno"
Deleta_Arquivo(ARQ)
Deleta_Arquivo(ARQ_ERRO)

Clearall
EndProc


;*******************************************************************************
;* Rotina grava registro conciliacao                                           *
;*******************************************************************************
Proc Grava_Conciliacao()
Linha=SubStr(Linha,01,57)
If IsBlank(dtpg)
   Then Linha=Linha+"        "                           
   Else Linha=Linha+MONTA_STRING(dtpg,"DTAMD","DT",08)                           
Endif
Linha=Linha+SubStr(Linha,66,70)
     
Print File ARQ Linha+"\n"
EndProc


;*******************************************************************************
;* Rotina grava registro conciliacao c/ erro                                   *
;*******************************************************************************
Proc Grava_Erro(erro)
Private erro,s

conciliadook=false

dtpg=dtfinal 
Grava_Conciliacao()

s= "\""+"Pessoa "+Completa(cgc   ,20," ")+
    "Docto "+Completa(titulo,20," ")+
  "Emissao "+  Format("D13",dtemis )+
  erro+"\""+"\n"

FileWrite Append ARQ_ERRO From s

Moveto "Retorno"
EndProc

;*******************************************************************************
;* Rotina                                                                      *
;*******************************************************************************
Proc SD_Dialog(Disparo,Campo,Evento,Elemento)
Temp=True
TECLA    =""
MSG_CAMPO=""
If Disparo="OPEN"  Then AoCriarShowDialog() EndIf
If Disparo="EVENT" And Evento["Type"]="KEY" Then
   Switch
     Case Evento["KeyCode"] = -59: Dialog_F1()
     Case Evento["KeyCode"] =  27:
          Temp=False
          Switch
            Case Campo="TG_EMPRESA"       : Campo="NO"
            Case Campo="TG_FINALIDADE"    : Campo="TG_EMPRESA"
            Case Campo="TG_PERIODICIDADE" : Campo="TG_FINALIDADE"
            Case Campo="TG_DTINI"         : Campo="TG_PERIODICIDADE"
            Case Campo="TG_DTFIM"         : Campo="TG_DTINI"
            Case Campo="YES" Or Campo="NO": Campo="TG_EMPRESA"
          EndSwitch
     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"] = 13:
          Temp=False
          If Checa_TAG()
             Then Switch
                    Case Campo="TG_EMPRESA"    :
                         If IsBlank(VSDGEMPRESA)
                            Then Mensagem("Empresa Invalida !")
                            Else Campo="TG_FINALIDADE"
                         EndIf
                    Case Campo="TG_FINALIDADE"      :
                         VSDGFINAL=ControlValue("TG_FINALIDADE")
                         Switch   
                           Case VSDGFINAL=1 : Campo="TG_PERIODICIDADE"
                           OtherWise        : Campo="YES"
                                              VSDGDTINI  =Today()-365
                                              VSDGDTFIM  =Today()    
                                              VSDGPERIODICIDADE=4
                         EndSwitch   
                    Case Campo="TG_PERIODICIDADE"      :
                         VSDGPERIODICIDADE=ControlValue("TG_PERIODICIDADE")
                         Switch   
                           Case VSDGPERIODICIDADE=5 :
                                              Campo="YES"
                                              VSDGDTINI  =Today()-365
                                              VSDGDTFIM  =Today()    
                           OtherWise:         Campo="TG_DTINI"                   
                         EndSwitch   
                    Case Campo="TG_DTINI"      :
                         If VSDGDTINI=BlankDate()
                            Then Mensagem("Data Inicial Invalida !")
                            Else Campo="TG_DTFIM"
                         EndIf
                    Case Campo="TG_DTFIM"      : Campo="YES"
                  EndSwitch
          EndIf
          RefreshDialog
   EndSwitch
EndIf
Switch
  Case Campo="TG_EMPRESA":  MSG_CAMPO="Informe uma Empresa"
  Case Campo="TG_DTINI"  :  MSG_CAMPO="Informe a Data Inicial"
  Case Campo="TG_FINALIDADE" Or
       Campo="TG_PERIODICIDADE":
       MensagemRadioButtons()
EndSwitch
Monta_Prompt(MSG_CAMPO,TECLA)
Return Temp
EndProc

;*******************************************************************************
;* ROTINA PRINCIPAL                                                            *
;*******************************************************************************
AutoLib="\\Sistemas\\Cadastro\\Bib_Show,\\Sistemas\\Cadastro\\Bibliot"

LimpAguarde()
VSDGEMPRESA=""
VSDGDTINI  =BlankDate()
VSDGDTFIM  =BlankDate()

While True
  ShowDialog "Remessa/Concilia‡Æo RELATO/SERASA" Proc "SD_Dialog"
  Trigger "OPEN","ARRIVE"
  Key "F1","ENTER","ESC",
      -104, -105, -106, -107, -108, -109, -110, -111, -112, -113, -139, -140
   @ 03,18   Height 17 Width 72

    Label  @ 00,00 "Empresa"  For "TG_EMPRESA"
    Accept @ 1,01 Width 07 "A4"  Picture "[&,#][#*#]" Tag "TG_EMPRESA" To VSDGEMPRESA
    Accept @ 1,09 Width 25 "A20" Picture "!*!" Tag "TG_NOMEMP" To VSDGNOMEMP

    Label @ 02,00 "Op‡Æo " For "TG_FINALIDADE"
    RadioButtons @ 03,01 Height 3 Width 33
      "~R~emessa (periodicidade)",
      "~C~oncilia‡Æo (mensal)"
        Tag "TG_FINALIDADE"
        To VSDGFINAL

    Label @ 06,00 "Periodicidade " For "TG_PERIODICIDADE"
    RadioButtons @ 07,00 Height 5 Width 15
      "~D~i rio",
      "~S~emanal",
      "~Q~uinzenal",
      "~M~ensal",
      "~1~¦ vez"
        Tag "TG_PERIODICIDADE"
        To VSDGPERIODICIDADE

    Label  @ 00,35 "Per¡odo Referente de" For "TG_DTINI"
    Accept @ 01,38 Width 13 "D"  Picture "#[#];.##;.##[##]" Tag "TG_DTINI" To VSDGDTINI
    Label  @ 01,51 "at‚" For "TG_DTFIM"
    Accept @ 01,56 Width 13 "D"  Picture "#[#];.##;.##[##]" Tag "TG_DTFIM" To VSDGDTFIM

    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)
     Then Mensagem("Selecione uma empresa !")
          Loop
  EndIf
  If VSDGDTFIM=BlankDate() Or
     VSDGDTINI=BlankDate()
     Then Mensagem("Data Invalida !")
          Loop
  EndIf
        
  View "\\Sistemas\\Cadastro\\Empresas"
  Moveto [Codigo da Empresa]
  Locate VSDGEMPRESA
  If Not RetVal
     Then MENSAGEM("Empresa n„o Cadastrada")
          ClearAll
          Loop
     Else CNPJ_EMPRESA=MONTA_STRING([CGC Empresa],"N","A",14)
  EndIf
  ClearAll

  nclientes=0
  ntitulos =0
  Switch
    Case VSDGFINAL=1 : Remessa()
    Case VSDGFINAL=2 : Conciliacao()
  EndSwitch

EndWhile
ClearAll
Release Vars All
Release Procs All
