;** Bib_Rat  *******************************************************************
;*  Biblioteca p/rateios plano de contas                                       *
;*******************************************************************************
;Autor           : Vise Informatica (VISERP)
;Desenvolvido    : 22/05/2019 por Anivel Augusto Rodrigues
;Ultima Alteracao: 15/07/2019 por Bruno Carvalho 
;Motivo Alteracao: Novas implementa‡äes de processos
;Ultima Alteracao: 01/10/2019 por Bruno Carvalho 
;Motivo Alteracao: Ajustes na proc RateioPC_Array()  
;Ultima Alteracao: 05/02/2020 por Bruno Carvalho 
;Motivo Alteracao: Ajustes na proc RateioPC_Verifica(), onde foi adicionado em uma regra p/ desprezar a tabela MovCont

;*******************************************************************************
@ 22,28 ?? "Gerando Biblioteca Bib_Rat.Lib"
Style Blink
?? "... "

If IsFile("\\Sistemas\\Ctacor\\Bib_Rat.Lib")
   Then Run NoRefresh "Del \\Sistemas\\Ctacor\\Bib_Rat.Lib>Nul"
EndIf
CreateLib "\\Sistemas\\Ctacor\\Bib_Rat" Size 100

;*******************************************************************************
;* Rateio da Baixa                                                             *
;*******************************************************************************
Proc RateioPC_Opcoes(PARAM)
Private PARAM

Switch
  Case PARAM = "Valor_Documento_Cabeca"  :
       Switch  
         Case SubStr(Upper(Table()),1,3) = "TIT" : RATEIO_VRDOCTO = [Titulos->Valor do Documento]
         Case SubStr(Upper(Table()),1,3) = "DUP" : RATEIO_VRDOCTO = [Duplic->Valor do Documento ]
         Case SubStr(Upper(Table()),1,3) = "MOV" : RATEIO_VRDOCTO = [MovCont->Valor             ]
         OtherWise                               : Mensagem("Tabela nÆo localizada!")
                                                   Return False 
       EndSwitch
  Case PARAM = "Valor_Documento_Baixa"  :
       Switch  
         Case SubStr(Upper(Table()),1,3) = "TIT" : RATEIO_VRDOCTO = VSD_I_Vr_Pagto
         Case SubStr(Upper(Table()),1,3) = "DUP" : RATEIO_VRDOCTO = VSD_I_Vr_Pagto
         Case SubStr(Upper(Table()),1,3) = "MOV" : RATEIO_VRDOCTO = [MovCont->Valor]
         OtherWise                               : Mensagem("Tabela nÆo localizada!")
                                                   Return False 
       EndSwitch       
  Case PARAM = "Titulo"  :
       Switch  
         ;Case SubStr(Upper(Table()),1,3) = "TIT" : TIT = "Rateio do Lan‡amento -> Valor … ratear "+Ltrim(Format("W12.2,EIC",RATEIO_VRDOCTO))
         ;Case SubStr(Upper(Table()),1,3) = "DUP" : TIT = "Rateio do Contas a Receber -> Valor … ratear "+Ltrim(Format("W12.2,EIC",RATEIO_VRDOCTO))
         ;Case SubStr(Upper(Table()),1,3) = "MOV" : TIT = "Rateio Caixa/Banco -> Valor … ratear "+Ltrim(Format("W12.2,EIC",RATEIO_VRDOCTO))
         Case SubStr(Upper(Table()),1,3) = "TIT" : TIT = "Rateio do Lan‡amento - Opera‡Æo de "+OPERACAO_TIT
         Case SubStr(Upper(Table()),1,3) = "DUP" : TIT = "Rateio do Contas a Receber - Opera‡Æo de "+OPERACAO_TIT
         Case SubStr(Upper(Table()),1,3) = "MOV" : TIT = "Rateio Caixa/Banco - Opera‡Æo de "+OPERACAO_TIT
         OtherWise                               : Mensagem("Tabela nÆo localizada!")
                                                   Return False 
       EndSwitch
  Case PARAM="GetRecord" :
       Switch
         Case SubStr(Upper(Table()),1,3) = "TIT" : TABELA_BXRATEIO = "TitRat"
         Case SubStr(Upper(Table()),1,3) = "DUP" : TABELA_BXRATEIO = "DupRat"
         Case SubStr(Upper(Table()),1,3) = "MOV" : TABELA_BXRATEIO = "MovRat"
         OtherWise                               : Mensagem("Tabela nÆo localizada!")
                                                   Return False 
       EndSwitch
  Case PARAM="Tabela_Baixa" : 
       Switch
         Case SubStr(Upper(Table()),1,3) = "TIT" : Moveto "TitBaixa"
         Case SubStr(Upper(Table()),1,3) = "DUP" : Moveto "DupBaixa"
         Case SubStr(Upper(Table()),1,3) = "MOV" : Moveto "Movcont"
         OtherWise                               : Mensagem("Tabela nÆo localizada!")
                                                   Return False 
       EndSwitch
  Case PARAM="Tabela_Cabeca" : 
       Switch
         Case SubStr(Upper(Table()),1,3) = "TIT" : Moveto "Titulos"
         Case SubStr(Upper(Table()),1,3) = "DUP" : Moveto "Duplic"
         Case SubStr(Upper(Table()),1,3) = "MOV" : Moveto "Movcont"
         OtherWise                               : Mensagem("Tabela nÆo localizada!")
                                                   Return False 
       EndSwitch       
  Case PARAM="Sequencia_Baixa" :      
       If TIPO_RATEIO = "Baixa"
          Then Switch
                 Case SubStr(Upper(Table()),1,3) = "TIT" : SEQ = [TitBaixa->Sequencia da Baixa]
                 Case SubStr(Upper(Table()),1,3) = "DUP" : SEQ = [DupBaixa->Sequencia da Baixa]
                 Case SubStr(Upper(Table()),1,3) = "MOV" : SEQ = "0"
                 OtherWise                               : Mensagem("Tabela nÆo localizada!")
                                                           Return False 
               EndSwitch
          Else SEQ = "0"
       EndIf         
  Case PARAM="Tabela_Rateio" : 
       Switch
         Case SubStr(Upper(Table()),1,3) = "TIT" : Moveto "TitRat"
         Case SubStr(Upper(Table()),1,3) = "DUP" : Moveto "DupRat"
         Case SubStr(Upper(Table()),1,3) = "MOV" : Moveto "MovRat"
         OtherWise                               : Mensagem("Tabela nÆo localizada!")
                                                   Return False 
       EndSwitch
;-------------------------------------------------------------------------------
  Case PARAM = "PlConta_Principal_Cabeca"  : 
       Switch  
         Case SubStr(Upper(Table()),1,3) = "TIT" : PL_CONTA_PRINCIPAL = [Titulos->Codigo Plano_Conta]
                                                   PL_CONTA_EMPRESA   = [Titulos->Codigo da Empresa]  
         Case SubStr(Upper(Table()),1,3) = "DUP" : PL_CONTA_PRINCIPAL = [Duplic->Codigo Plano_Conta]
                                                   PL_CONTA_EMPRESA   = [Duplic->Codigo da Empresa]
         Case SubStr(Upper(Table()),1,3) = "MOV" : PL_CONTA_PRINCIPAL = [MovCont->Codigo Plano_Conta]
                                                   PL_CONTA_EMPRESA   = [MovCont->Codigo da Empresa]
         OtherWise                               : Mensagem("Tabela nÆo localizada!")
                                                   Return False
       EndSwitch
       GetRecord_Parametros_PCXBCO()       
  Case PARAM = "PlConta_Principal_Baixa"  :
       Switch  
         Case SubStr(Upper(Table()),1,3) = "TIT" Or   
              SubStr(Upper(Table()),1,3) = "DUP"  : PL_CONTA_PRINCIPAL = VSD_I_PlContas
       EndSwitch       
  Case PARAM = "Seta_Operacao"  :
       Switch  
         Case SubStr(Upper(Table()),1,3) = "TIT" : OPERACAO_ENTSAI = "S"
                                                   OPERACAO_TIT    = "SAIDA"
         Case SubStr(Upper(Table()),1,3) = "DUP" : OPERACAO_ENTSAI = "E"
                                                   OPERACAO_TIT    = "ENTRADA"  
         Case SubStr(Upper(Table()),1,3) = "MOV" : OPERACAO_ENTSAI = [MovCont->Tipo Movimento]
                                                   If OPERACAO_ENTSAI="E"
                                                      Then OPERACAO_TIT = "ENTRADA"
                                                      Else OPERACAO_TIT = "SAIDA"
                                                   EndIf   
         OtherWise                               : Mensagem("Tabela nÆo localizada!")
                                                   Return False
       EndSwitch
  Case PARAM = "Tem_Rateio"  :
       Switch  
         Case SubStr(Upper(Table()),1,3) = "TIT" : TEM_RATEIO = [Titulos->Tem Rateio]
         Case SubStr(Upper(Table()),1,3) = "DUP" : TEM_RATEIO = [Duplic->Tem Rateio ]
         Case SubStr(Upper(Table()),1,3) = "MOV" : TEM_RATEIO = [MovCont->Tem Rateio]
         OtherWise                               : Mensagem("Tabela nÆo localizada!")
                                                   Return False 
       EndSwitch
       
  ;---- Cabe‡a -----------------------------------------------------------------     
  Case PARAM = "Valor_Documento_Cabeca_Juros_Desconto"  :
       Switch  
         Case SubStr(Upper(Table()),1,3) = "TIT" : RATEIO_VRDOCTO_JURDESC = [Titulos->Valor do Documento]-[Titulos->Valor de Juros]+[Titulos->Valor do Desconto]
         Case SubStr(Upper(Table()),1,3) = "DUP" : RATEIO_VRDOCTO_JURDESC = [Duplic->Valor do Documento ]-[Duplic->Valor de Juros]+[Duplic->Valor do Desconto]
         Case SubStr(Upper(Table()),1,3) = "MOV" : RATEIO_VRDOCTO_JURDESC = [MovCont->Valor             ]-[MovCont->Valor do Juros]+[MovCont->Valor do Desconto]
         OtherWise                               : Mensagem("Tabela nÆo localizada!")
                                                   Return False 
       EndSwitch
  Case PARAM = "Valor_Documento_Cabeca_Juros"    :
       Switch  
         Case SubStr(Upper(Table()),1,3) = "TIT" : RATEIO_JUROS = [Titulos->Valor de Juros]  
         Case SubStr(Upper(Table()),1,3) = "DUP" : RATEIO_JUROS = [Duplic->Valor de Juros]
         Case SubStr(Upper(Table()),1,3) = "MOV" : RATEIO_JUROS = [MovCont->Valor do Juros]
         OtherWise                               : Mensagem("Tabela nÆo localizada!")
                                                   Return False 
       EndSwitch
  Case PARAM = "Valor_Documento_Cabeca_Desconto"    : 
       Switch  
         Case SubStr(Upper(Table()),1,3) = "TIT" : RATEIO_DESCONTO = [Titulos->Valor do Desconto]
         Case SubStr(Upper(Table()),1,3) = "DUP" : RATEIO_DESCONTO = [Duplic->Valor do Desconto]
         Case SubStr(Upper(Table()),1,3) = "MOV" : RATEIO_DESCONTO = [MovCont->Valor do Desconto]
         OtherWise                               : Mensagem("Tabela nÆo localizada!")
                                                   Return False 
       EndSwitch  
  
  ;---- Baixas -----------------------------------------------------------------
  Case PARAM = "Valor_Documento_Baixa_Juros_Desconto"  :
       Switch  
         Case SubStr(Upper(Table()),1,3) = "TIT" Or 
              SubStr(Upper(Table()),1,3) = "DUP"  : RATEIO_VRDOCTO_JURDESC = VSD_I_Vr_Pagto - VSD_I_Vr_Juros + VSD_I_Vr_Descto
       EndSwitch
       
  Case PARAM = "Valor_Documento_Baixa_Juros"    :
       Switch  
         Case SubStr(Upper(Table()),1,3) = "TIT" Or  
              SubStr(Upper(Table()),1,3) = "DUP"  : RATEIO_JUROS = VSD_I_Vr_Juros 
       EndSwitch
  Case PARAM = "Valor_Documento_Baixa_Desconto"    : 
       Switch  
         Case SubStr(Upper(Table()),1,3) = "TIT" Or 
              SubStr(Upper(Table()),1,3) = "DUP"  : RATEIO_DESCONTO = VSD_I_Vr_Descto
       EndSwitch 
       
  ;-----------------------------------------------------------------------------
         
  Case PARAM = "Numero_Lancamento"    : 
       Switch  
         Case SubStr(Upper(Table()),1,3) = "TIT" : LANCTO_ROTINA = [Titulos->Numero do Lancamento]
         Case SubStr(Upper(Table()),1,3) = "DUP" : LANCTO_ROTINA = [Duplic->Numero do Lancamento]
         Case SubStr(Upper(Table()),1,3) = "MOV" : LANCTO_ROTINA = [MovCont->Numero do Lancamento]
         OtherWise                               : Mensagem("Tabela nÆo localizada!")
                                                   Return False 
       EndSwitch
  Case PARAM="Verifica_Tabela" : 
       Switch
         Case Search("BAIXA",Upper(Table()))>0    : TIPO_TABELA="Baixa" 
         OtherWise                                : TIPO_TABELA="Cabeca"  
       EndSwitch
EndSwitch

Return True

EndProc ;RateioPC_Opcoes()

;*******************************************************************************
;* Rotina para setar valores dos parametros do caixa/banco                     *
;*******************************************************************************
Proc GetRecord_Parametros_PCXBCO()       

GetRecord "\\Sistemas\\CtaCor\\P_cxbco" PL_CONTA_EMPRESA To REG_PARAM_PLCONTA
If Retval
   Then PL_CONTA_SAIDA_JUROS      = REG_PARAM_PLCONTA["Codigo PlContas_J_APagar"]
        PL_CONTA_SAIDA_DESCONTO   = REG_PARAM_PLCONTA["Codigo PlContas_D_APagar"]
        PL_CONTA_ENTRADA_JUROS    = REG_PARAM_PLCONTA["Codigo PlContas_J_AReceb"]
        PL_CONTA_ENTRADA_DESCONTO = REG_PARAM_PLCONTA["Codigo PlContas_D_Areceb"]
   Else PL_CONTA_SAIDA_JUROS      = ""
        PL_CONTA_SAIDA_DESCONTO   = ""
        PL_CONTA_ENTRADA_JUROS    = ""
        PL_CONTA_ENTRADA_DESCONTO = ""     
EndIf

EndProc ;GetRecord_Parametros_PCXBCO()

;*******************************************************************************
;* Rotina Verifica se h  plano de conta automatico nos parametros              *
;*******************************************************************************
Proc Verifica_Plano_Conta_Automatico()
Private TEMP,MSG,PLCONTA_AUX

TEMP = False
MSG  = ""
Switch
  Case OPERACAO_ENTSAI = "E" And PL_CONTA_SAIDA_JUROS = ""    And PL_CONTA_SAIDA_DESCONTO = ""   : MSG = "NAO_GERA_AUTOMATICO"
  Case OPERACAO_ENTSAI = "S" And PL_CONTA_ENTRADA_JUROS  = "" And PL_CONTA_ENTRADA_DESCONTO = "" : MSG = "NAO_GERA_AUTOMATICO"
  Case PL_CONTA_SAIDA_JUROS <> ""      And
       PL_CONTA_SAIDA_DESCONTO <> ""   And
       PL_CONTA_ENTRADA_JUROS  <> ""   And
       PL_CONTA_ENTRADA_DESCONTO <> ""   : For i From 1 To 4
                                             Switch
                                               Case i = 1 : PLCONTA_AUX = PL_CONTA_SAIDA_JUROS
                                               Case i = 2 : PLCONTA_AUX = PL_CONTA_SAIDA_DESCONTO 
                                               Case i = 3 : PLCONTA_AUX = PL_CONTA_ENTRADA_JUROS
                                               Case i = 4 : PLCONTA_AUX = PL_CONTA_ENTRADA_DESCONTO
                                             EndSwitch  
                                             GetRecord "\\Sistemas\\Ctacor\\PlContas" PLCONTA_AUX To REG_PLCONTA
                                             If Not RetVal
                                                Then Switch
                                                       Case i = 1 Or 
                                                            i = 2 : MSG = MSG + Completa("Plano de conta de saida "+PLCONTA_AUX+" informado nos parƒmetros do",70," ")+"//"
                                                                    MSG = MSG + Completa("caixa/banco nÆo foi localizado no cadastro de plano de conta!",70," ")+"////"
                                                       Case i = 3 Or
                                                            i = 4 : MSG = MSG + Completa("Plano de conta de entrada "+PLCONTA_AUX+" informado nos parƒmetros do",70," ")+"//"
                                                                    MSG = MSG + Completa("caixa/banco nÆo foi localizado no cadastro de plano de conta!",70," ")+"////"
                                                     EndSwitch   
                                             EndIf   
                                             If MSG<>"" Then QuitLoop EndIf
                                           Endfor
  Case OPERACAO_ENTSAI = "E" And
       (PL_CONTA_SAIDA_JUROS = "" Or PL_CONTA_SAIDA_DESCONTO = "") : 
                                           MSG = MSG + Completa("O Sistema detectou inconsistˆncia de dados no parƒmetro caixa/banco!",70," ")+"////"
                                           MSG = MSG + Completa("PLANO DE CONTA SAIDA",70," ")+"//"         
                                           MSG = MSG + Completa("   JUROS ... "+PL_CONTA_SAIDA_JUROS,70," ")+"//"
                                           MSG = MSG + Completa("DESCONTO ... "+PL_CONTA_SAIDA_DESCONTO,70," ")+"////"
                                           MSG = MSG + Completa("Um ou mais plano de conta nÆo foi informado neste parƒmetro!",70," ")+"////"

  Case OPERACAO_ENTSAI = "S" And
       (PL_CONTA_ENTRADA_JUROS  = "" Or PL_CONTA_ENTRADA_DESCONTO = "") : 
                                           MSG = MSG + Completa("O Sistema detectou inconsistˆncia de dados no parƒmetro caixa/banco!",70," ")+"////"
                                           MSG = MSG + Completa("PLANO DE CONTA ENTRADA",70," ")+"//"
                                           MSG = MSG + Completa("   JUROS ... "+PL_CONTA_ENTRADA_JUROS,70," ")+"//"
                                           MSG = MSG + Completa("DESCONTO ... "+PL_CONTA_ENTRADA_DESCONTO,70," ")+"////"
                                           MSG = MSG + Completa("Um ou mais plano de conta nÆo foi informado neste parƒmetro!",70," ")+"////"
EndSwitch

If MSG<>""
   Then If MSG <> "NAO_GERA_AUTOMATICO"
           Then Mensagem(MSG+"Verificar!")
        EndIf    
   Else TEMP=True
EndIf   

Return TEMP

EndProc ;Verifica_Plano_Conta_Automatico()

;*******************************************************************************
;* Rotina Verifica Valor do Rateio                                             *
;*******************************************************************************
Proc RateioPC_Atualiza()
Private RATEIO_BAIXA,Conta_Array,ii,SEQ,PLANO_CONTA_COD,PLANO_CONTA_DES,CENTRO_CUSTO_COD,CENTRO_CUSTO_DES,PORC,VALOR,
        VERIFICA_VALOR,TEMP,SEQ_BAIXA

TEMP = False

TIPO_RATEIO = "Baixa"
RateioPC_Opcoes("Sequencia_Baixa")
SEQ_BAIXA = StrVal(SEQ)

RateioPC_Opcoes("Tabela_Rateio")
Moveto [Numero do Lancamento]
Locate LANCTO_ROTINA,SEQ_BAIXA
If Not Retval
   Then Home 
        Locate LANCTO_ROTINA,"0"
        If RetVal
           Then RateioPC_Opcoes("Valor_Documento_Cabeca")
                RATEIO_CABECA_VRDOCTO = RATEIO_VRDOCTO
                RateioPC_Opcoes("Valor_Documento_Baixa")
                DynArray RATEIO_BAIXA[] 
                Conta_Array = 0
                While [Numero do Lancamento] = LANCTO_ROTINA And [Sequencia da Baixa  ] = "0"
                  If IsBlank([Porcentagem])
                     Then PORC = [Valor]*100 / RATEIO_CABECA_VRDOCTO
                     Else PORC = [Porcentagem] 
                  EndIf    
                  RATEIO_BAIXA_VRDOCTO = RATEIO_VRDOCTO * PORC /100  
                  
                  Conta_Array = Conta_Array + 1
                  RATEIO_BAIXA[Conta_Array] = Format("W5",[Sequencia do Rateio])+
                                              Format("W13",[Codigo Plano_Conta])+
                                              Format("W45",[Descricao Plano_Conta])+
                                              Format("W7",[Codigo CCusto])+
                                              Format("W25",[Descricao CCusto])+
                                              Format("W10.2",[Porcentagem])+
                                              Format("W13.2",RATEIO_BAIXA_VRDOCTO)
                  Skip
                  If Eot() Then QuitLoop EndIf
                EndWhile
        
                RateioPC_Opcoes("Valor_Documento_Baixa")
                RateioPC_Opcoes("Tabela_Rateio")
                End 
                VERIFICA_VALOR = 0
                For ii From 1 To DynArraySize(RATEIO_BAIXA)
                  SEQ              = Ltrim(Rtrim(SubStr(RATEIO_BAIXA[ii],001,05)))
                  PLANO_CONTA_COD  = Rtrim(SubStr(RATEIO_BAIXA[ii],006,13))
                  PLANO_CONTA_DES  = Rtrim(SubStr(RATEIO_BAIXA[ii],019,45))
                  CENTRO_CUSTO_COD = Rtrim(SubStr(RATEIO_BAIXA[ii],064,07))
                  CENTRO_CUSTO_DES = Rtrim(SubStr(RATEIO_BAIXA[ii],071,25))
                  PORC             = Ltrim(Rtrim(SubStr(RATEIO_BAIXA[ii],096,10)))
                  VALOR            = Ltrim(Rtrim(SubStr(RATEIO_BAIXA[ii],106,13)))
                  
                  If SEQ<>""   Then SEQ   = NumVal(SEQ)   Else SEQ=0   EndIf
                  If PORC<>""  Then PORC  = NumVal(PORC)  Else PORC=0  EndIf 
                  If VALOR<>"" Then VALOR = NumVal(VALOR) Else VALOR=0 EndIf
                
                  If PORC = 0  Then PORC  = BlankNum() EndIf 
                  If VALOR = 0 Then VALOR = BlankNum() EndIf
                
                  VERIFICA_VALOR   = VERIFICA_VALOR + VALOR
                  If DynArraySize(RATEIO_BAIXA) = ii
                     Then If RATEIO_VRDOCTO - VERIFICA_VALOR < 0
                             Then VALOR = VALOR - (VERIFICA_VALOR - RATEIO_VRDOCTO)
                          EndIf
                  EndIf
                  Down
                  [Numero do Lancamento ]=LANCTO_ROTINA
                  [Sequencia da Baixa   ]=SEQ_BAIXA
                  [Sequencia do Rateio  ]=SEQ
                  [Codigo Plano_Conta   ]=PLANO_CONTA_COD
                  [Descricao Plano_Conta]=PLANO_CONTA_DES
                  [Codigo CCusto        ]=CENTRO_CUSTO_COD
                  [Descricao CCusto     ]=CENTRO_CUSTO_DES
                  [Porcentagem          ]=PORC
                  [Valor                ]=VALOR
                  UnLockRecord
                EndFor
                TEMP = True
        EndIf
EndIf
RateioPC_Opcoes("Tabela_Baixa")

Return TEMP

EndProc ;RateioPC_Atualiza()

;*******************************************************************************
;* Rotina Verifica Valor do Rateio                                             *
;*******************************************************************************
Proc RateioPC_Verifica(PARAM)
private PARAM,ntable, pcbranco, ccbranco, rateio, baixa, Msg,MSG_RATEIO,CONTA_ARRAY,ACHOU_RATEIO             

;Vari vel de controle p/ verificar existˆncia de juros ou desconto -> ACHOU_DESCONTO_JUROS
ntable=table() 

RATEIO_PAI=False
ACHOU_DESCONTO_JUROS = 1
If PARAM = "Cabeca"
   Then RateioPC_Opcoes("Valor_Documento_Cabeca_Juros")
        RateioPC_Opcoes("Valor_Documento_Cabeca_Desconto")
   Else RateioPC_Opcoes("PlConta_Principal_Baixa")  
        RateioPC_Opcoes("Valor_Documento_Baixa_Juros")
        RateioPC_Opcoes("Valor_Documento_Baixa_Desconto")
        
        RateioPC_Opcoes("GetRecord")
        GetRecord TABELA_BXRATEIO LANCTO_ROTINA,"0",1 To REG_RATEIO
        If RetVal
           Then RATEIO_PAI=True
        EndIf   
EndIf
If RATEIO_JUROS > 0 Or RATEIO_DESCONTO > 0
   Then ACHOU_DESCONTO_JUROS = 2
EndIf  

pcbranco     = 0
ccbranco     = 0
rateio       = 0
baixa        = 0
achouplconta = false
CONTA_ARRAY  = 0

If PARAM <> "Baixa"
   Then RateioPC_Opcoes("Valor_Documento_Cabeca")
        If SubStr(Upper(Table()),1,3) = "TIT" Or SubStr(Upper(Table()),1,3) = "DUP" 
           Then RateioPC_Opcoes("Tabela_Baixa")
                Scan for Not IsBlank([Sequencia da Baixa])
                   if [Tipo da Baixa]<>"NORMAL"
                      then baixa=baixa+ (([Valor do Pagamento]+[Valor do Desconto])-[Valor do Juros])
                   endif
                EndScan
        EndIf
   Else RateioPC_Opcoes("Valor_Documento_Baixa")
        If RATEIO_PAI
           Then CONTA_ARRAY_PLCONTA = 0
                DynArray ARRAY_PLCONTA[] 
        EndIf  
EndIf

If Not IsAssigned(ARRAY_BXRATEIO) Or DynArraySize(ARRAY_BXRATEIO)=0
   Then Release Vars ARRAY_BXRATEIO
        DynArray ARRAY_BXRATEIO[]
        FAZ_ARRAY=True
   Else FAZ_ARRAY=False
EndIf     

ACHOU_RATEIO=False
RateioPC_Opcoes("Tabela_Rateio")
Moveto [Numero do Lancamento]
If PARAM = "Baixa"
   Then Locate LANCTO_ROTINA,SEQ_BAIXA
   Else SEQ_BAIXA = "0"
        Locate LANCTO_ROTINA,SEQ_BAIXA
EndIf

If Retval
   Then While [Numero do Lancamento] = LANCTO_ROTINA And 
              [Sequencia da Baixa  ] = SEQ_BAIXA
          If Not ACHOU_RATEIO Then ACHOU_RATEIO = True EndIf
          If IsbLank([Codigo Plano_Conta ]) 
             then pcbranco = pcbranco + 1   
          EndIf 
          If IsbLank([Codigo CCusto ]) 
             then ccbranco = ccbranco + 1
          EndIf
          GetRecord "\\Sistemas\\Ctacor\\PlContas" [Codigo Plano_Conta] To REG_TIPOENTSAI
          If (PL_CONTA_PRINCIPAL=[Codigo Plano_Conta] And OPERACAO_ENTSAI = REG_TIPOENTSAI["TipoEntradaSaida"]) Or
             OPERACAO_ENTSAI=REG_TIPOENTSAI["TipoEntradaSaida"]
             Then rateio= rateio+[Valor]
             Else rateio= rateio+([Valor]*-1)
          EndIf
          If [Valor]>0
             Then CONTA_ARRAY = CONTA_ARRAY + 1
                  If FAZ_ARRAY
                     Then ARRAY_BXRATEIO[CONTA_ARRAY] = Format("W3,AL",StrVal(CONTA_ARRAY))+Spaces(1)+
                                                        Format("W13",[Codigo Plano_Conta])+Spaces(1)+
                                                        Format("W16",Ltrim([Descricao Plano_Conta]))+Spaces(1)+
                                                        Format("W7",[Codigo CCusto])+Spaces(1)+
                                                        Format("W12",Ltrim([Descricao CCusto]))+Spaces(1)+
                                                        Format("W7.2",[Porcentagem]) 
                  EndIf
          EndIf
             
          If PL_CONTA_PRINCIPAL = [Codigo Plano_Conta]
             Then achouplconta = true
             Else If Not RATEIO_PAI
                     Then If CONTA_ARRAY>1 And ACHOU_DESCONTO_JUROS=1 And SubStr(Upper(Table()),1,3) <> "MOV"
                             Then ACHOU_DESCONTO_JUROS=-1
                          EndIf                          
                          If CONTA_ARRAY>1 And ACHOU_DESCONTO_JUROS=2
                             Then ACHOU_DESCONTO_JUROS=3
                          EndIf
                     Else ;NÆo verifica se h  juros ou desconto se encontrado plano de conta na cabe‡a
                          ACHOU_DESCONTO_JUROS=0
                  EndIf
          EndIf
          If RATEIO_PAI And PARAM="Baixa"
             Then CONTA_ARRAY_PLCONTA = CONTA_ARRAY_PLCONTA + 1 
                  ARRAY_PLCONTA[CONTA_ARRAY_PLCONTA] = [Codigo Plano_Conta]
          EndIf
          Skip
          If Eot() Then QuitLoop EndIf
          Locate Next LANCTO_ROTINA,SEQ_BAIXA
          If Not RetVal Then QuitLoop EndIf
        EndWhile
EndIf

;Obrigatoriamente dever  ter todos os rateios do pai cadastrado nas baixas
RATEIO_PLCONTA_PAI_BAIXA=False
If RATEIO_PAI And PARAM="Baixa" And CONTA_ARRAY_PLCONTA>0
   Then RateioPC_Opcoes("Tabela_Rateio")
        Moveto [Numero do Lancamento]
        Locate LANCTO_ROTINA,"0"
        If RetVal
           Then CONTA_PLCONTA1 = 0
                CONTA_PLCONTA2 = 0
                While [Numero do Lancamento] = LANCTO_ROTINA And
                      [Sequencia da Baixa  ] = "0"
                  CONTA_PLCONTA2 = CONTA_PLCONTA2 + 1
                  For ii From 1 To DynArraySize(ARRAY_PLCONTA)
                    If ARRAY_PLCONTA[ii] = [Codigo Plano_Conta]
                       Then ARRAY_PLCONTA[ii]=""
                            CONTA_PLCONTA1 = CONTA_PLCONTA1 + 1 
                            QuitLoop
                    EndIf   
                  Endfor
                  Skip
                  If Eot() Then QuitLoop EndIf      
                EndWhile
                If CONTA_PLCONTA1=CONTA_PLCONTA2
                   Then RATEIO_PLCONTA_PAI_BAIXA=True
                EndIf          
        EndIf        
EndIf

Msg = ""
Switch
  Case RATEIO_PAI And PARAM="Baixa" And Not RATEIO_PLCONTA_PAI_BAIXA And CONTA_ARRAY>0 :
               MSG = MSG + Completa("O Sistema detectou inconsistˆncia de dados, referente aos rateios!",68," ")+"////"
               MSG = MSG + Completa("H   plano  de  contas informado no rateio deste lan‡amento que nÆo",68," ")+"//"
               MSG = MSG + Completa("foram localizados nos rateios da baixa!",68," ")+"////"
               MSG = MSG + Completa("Para  prosseguir  com a inclusÆo de rateios na baixa, ser  preciso",68," ")+"//"
               MSG = MSG + Completa("constar  todos  os  planos de contas que foram inseridos no rateio",68," ")+"//"
               MSG = MSG + Completa("deste lan‡amento!",68," ")+"////"
  Case achouplconta And ACHOU_DESCONTO_JUROS=2 And (SubStr(Upper(Table()),1,3) = "MOV" Or PARAM = "Baixa") :
               MSG = MSG + Completa("O Sistema detectou inconsistˆncia de dados, referente aos rateios!",68," ")+"////"
               MSG = MSG + Completa("Foi  localizado valor de juros/desconto informado neste lan‡amento",68," ")+"//"
               MSG = MSG + Completa("e nÆo foi localizado um plano de conta referente … este valor!",68," ")+"////"
  Case achouplconta And ACHOU_DESCONTO_JUROS<0 And (SubStr(Upper(Table()),1,3) = "MOV" Or PARAM = "Baixa") : 
               MSG = MSG + Completa("O Sistema detectou inconsistˆncia de dados, referente aos rateios!",68," ")+"////"
               MSG = MSG + Completa("Foi localizado plano de conta de juros/desconto informado no rateio",68," ")+"//"
               MSG = MSG + Completa("e neste lan‡amento nÆo foi localizado valor de juros ou desconto.",68," ")+"////"    
  Case not achouplconta And CONTA_ARRAY>0 And SubStr(Upper(Table()),1,3) = "MOV" : ;** Verifica se utiliza Plano de Conta Principal apenas na MovCont
               MSG = MSG + Completa("Plano de conta principal "+PL_CONTA_PRINCIPAL+" nÆo foi localizado",68," ")+"//"
               MSG = MSG + Completa("na rela‡Æo do rateio!",68," ")+"////"
  Case DynArraySize(ARRAY_BXRATEIO)=1 : ;Bloqueia quando ‚ informado apenas um plano de contas *Cabe‡a e Baixas 
       MSG = MSG + Completa("Informe mais de um plano de contas para prosseguir!",68," ")+"////"
  Case PARAM = "Baixa" : 
       If CONTA_ARRAY>0 And (rateio=0 Or (Format("W12.2",rateio) <> Format("W12.2",RATEIO_VRDOCTO))) 
          Then MSG = MSG + Completa("Valor do Rateio: "+format("W12.2,EIC",rateio),68," ")+"//"
               MSG = MSG + Completa(" Valor da Baixa: "+format("W12.2,EIC",RATEIO_VRDOCTO),68," ")+"//"
               MSG = MSG + Completa("Valor Diferen‡a: "+format("W12.2,EIC",rateio-RATEIO_VRDOCTO),68," ")+"////"
               MSG = MSG + Completa("Valor da Baixa difere do Valor do Rateio!",68," ")+"////"
               MSG = MSG + Completa("Se a diferen‡a nÆo for ajustada, os rateios deverÆo ser excluidos.",68," ")+"////"    
       EndIf
  
  OtherWise : 
       If (DynArraySize(ARRAY_BXRATEIO)>0 And rateio=0) Or (DynArraySize(ARRAY_BXRATEIO)>0 And Format("W12.2",rateio) <> Format("W12.2",RATEIO_VRDOCTO-baixa)) 
          Then MSG = MSG + Completa("Valor do Rateio: "+format("W12.2,EIC",rateio),68," ")+"//"
               MSG = MSG + Completa("Valor do Titulo: "+format("W12.2,EIC",RATEIO_VRDOCTO-baixa),68," ")+"//"
               MSG = MSG + Completa("Valor Diferen‡a: "+format("W12.2,EIC",rateio-(RATEIO_VRDOCTO-baixa)),68," ")+"////"
               If SubStr(Upper(Table()),1,3) = "MOV"
                  Then MSG = MSG + Completa("Valor do Titulo difere do Valor do Rateio!",68," ")+"////"
                  Else MSG = MSG + Completa("Valor do Titulo difere do Valor do Rateio, deduzindo baixa CANCELADA",68," ")+"//"
                       MSG = MSG + Completa("E DEVOLU€¶O.",68," ")+"//"
               EndIf
               MSG = MSG + Completa("Se a diferen‡a nÆo for ajustada, os rateios deverÆo ser excluidos.",68," ")+"////"
       EndIf
endSwitch

If pcbranco>0 
   Then Msg = Msg + "Existem rateios sem Plano de contas!//"
EndIf
             
moveto ntable

If CONTA_ARRAY=0 And msg=""
   Then If PARAM = "Baixa"
           Then If VSD_I_Tem_Rateio="S"  
                   Then COR_MENSAGEM="ALERTA" 
                        RATEIO_MSG =              Completa("Foi identificado que a baixa esta com a op‡Æo de utilizar o",63," ")+"//"
                        RATEIO_MSG = RATEIO_MSG + Completa("rateio, no entanto, nÆo h  rateio lan‡ado.",63," ")+"//"
                        RATEIO_MSG = RATEIO_MSG + Completa("Esta baixa utilizar  rateio?",59," ")   
                        If ConfGeral(RATEIO_MSG)
                           Then Release Vars COR_MENSAGEM,RATEIO_MSG
                                Return False
                           Else UTILIZA_RAT_BAIXA   = "N"
                                VSD_I_Tem_Rateio    = "N"
                                RateioPC_Opcoes("Tabela_Baixa")
                                [Tem Rateio] = VSD_I_Tem_Rateio
                                UnLockRecord 
                                VSD_I_Tem_Rateio_SN = ""     
                        EndIf   
                EndIf   
           Else RateioPC_Opcoes("Tem_Rateio")
                If TEM_RATEIO="S"
                   Then COR_MENSAGEM="ALERTA"
                        RATEIO_MSG =              Completa("Foi identificado que este titulo esta com a op‡Æo de utilizar o",63," ")+"//"
                        RATEIO_MSG = RATEIO_MSG + Completa("rateio, no entanto, nÆo h  rateio lan‡ado.",63," ")+"//"
                        RATEIO_MSG = RATEIO_MSG + Completa("Este t¡tulo utilizar  rateio?",59," ")
                        If ConfGeral(RATEIO_MSG)
                           Then Release Vars COR_MENSAGEM,RATEIO_MSG
                                Return False
                           Else UTILIZA_RAT_CABECA = "N"
                                TEM_RATEIO         = "N"     
                                [Tem Rateio]       = TEM_RATEIO
                        EndIf
                Endif
        EndIf
        Release Vars COR_MENSAGEM,RATEIO_MSG
   Else If PARAM = "Baixa" And msg="" And DynArraySize(ARRAY_BXRATEIO)>0
           Then VSD_I_Tem_Rateio="S"
                VSD_I_Tem_Rateio_SN = "SIM"
           Else If ACHOU_RATEIO And msg="" 
                   Then If PARAM = "Baixa" 
                           Then If VSD_I_Tem_Rateio<>"S"
                                   Then MSG =       Completa("Foi identificado que a baixa NAO esta com a op‡Æo de utilizar",61," ")+"//"
                                        MSG = MSG + Completa("o rateio, no entanto, h  rateio lan‡ado.",61," ")+"////" 
                                EndIf
                           Else RateioPC_Opcoes("Tem_Rateio") 
                                If TEM_RATEIO<>"S"
                                   Then MSG =       Completa("Foi identificado que o titulo NAO esta com a op‡Æo de utilizar",61," ")+"//"
                                        MSG = MSG + Completa("o rateio, no entanto, h  rateio lan‡ado.",61," ")+"////" 
                                EndIf
                         EndIf 
                EndIf      
        EndIf      
EndIf                
If msg<>""
   Then Mensagem(Msg+ "Verificar!")
        Release Vars COR_MENSAGEM
        Return False
   Else Return True
EndIf              

EndProc

;*******************************************************************************
;* Cria primeiro rateio quando registro novo                                   *
;*******************************************************************************
Proc RateioPC_PrimeiroRateio(PARAM)
Private PARAM,PLCONTA_JUROS,PLCONTA_DESCONTO

If Not IsAssigned(PARAM_RATEIO_PAI) Then PARAM_RATEIO_PAI = False EndIf
SEQ_RATEIO = 0

If PARAM="CABECA"
   Then RateioPC_Opcoes("Valor_Documento_Cabeca_Juros_Desconto")
        RateioPC_Opcoes("Valor_Documento_Cabeca_Juros")
        RateioPC_Opcoes("Valor_Documento_Cabeca_Desconto")
   Else If PARAM_RATEIO_PAI
           Then ;---- Adiciona o rateio do pai nas baixas proporcionalmente ----
                RateioPC_Opcoes("Valor_Documento_Cabeca_Juros_Desconto")
                VR_DOCTO = RATEIO_VRDOCTO_JURDESC
                
                DynArray RAT_PAI[]
                CONT_RAT_PAI = 0
                
                RateioPC_Opcoes("Sequencia_Baixa")
                ;SEQ_BAIXA = StrVal(SEQ)

                RateioPC_Opcoes("Tabela_Rateio")
                Moveto [Numero do Lancamento]
                Locate LANCTO_ROTINA,"0"
                If RetVal
                   Then While [Numero do Lancamento] = LANCTO_ROTINA And [Sequencia da Baixa] = "0"
                          CONT_RAT_PAI = CONT_RAT_PAI + 1
                          RAT_PAI[CONT_RAT_PAI] = [Sequencia do Rateio]
                          Skip
                          If Eot() Then QuitLoop EndIf
                        EndWhile
                EndIf     
        EndIf
        RateioPC_Opcoes("PlConta_Principal_Baixa")                              ;Seta PL_CONTA_PRINCIPAL
        RateioPC_Opcoes("Valor_Documento_Baixa_Juros_Desconto")
        RateioPC_Opcoes("Valor_Documento_Baixa_Juros")
        RateioPC_Opcoes("Valor_Documento_Baixa_Desconto")
EndIf        

If OPERACAO_ENTSAI="S"
   Then PLCONTA_JUROS    = PL_CONTA_ENTRADA_JUROS
        PLCONTA_DESCONTO = PL_CONTA_ENTRADA_DESCONTO 
   Else PLCONTA_JUROS    = PL_CONTA_SAIDA_JUROS 
        PLCONTA_DESCONTO = PL_CONTA_SAIDA_DESCONTO
EndIf

For i From 1 To 2
  Switch
    Case i = 1 : PLCONTA_AUX = PL_CONTA_PRINCIPAL
                 VR_AUX      = RATEIO_VRDOCTO_JURDESC
    Case i = 2 : Switch
                   Case RATEIO_DESCONTO > 0 : VR_AUX = RATEIO_DESCONTO
                                              PLCONTA_AUX = PLCONTA_DESCONTO
                   Case RATEIO_JUROS > 0    : VR_AUX = RATEIO_JUROS
                                              PLCONTA_AUX = PLCONTA_JUROS
                   OtherWise                : QuitLoop
                 EndSwitch
                 If PLCONTA_AUX = "" Then QuitLoop EndIf
  EndSwitch
  
  If PARAM="CABECA"
     Then SEQ_BAIXA = 0
     Else If not IsAssigned(SEQ_BAIXA) Then SEQ_BAIXA = [Sequencia da Baixa] EndIf
  EndIf
  
  ;Caso encontrar rateio no pai, ser  rateado na baixa, senÆo ser  criado um lan‡amento com o plano de conta
  ;informado na baixa, levando em considera‡Æo juros e desconto que j  tem o seu plano de conta espec¡fico. 
  If PARAM_RATEIO_PAI
     Then PARAM_RATEIO_PAI = False
          If DynArraySize(RAT_PAI)>0
             Then ANT_VR_AUX   = VR_AUX
                  CONTA_VR_AUX = 0
                  RateioPC_Opcoes("GetRecord")
                  For ii From 1 To DynArraySize(RAT_PAI)
                    SEQ_RATEIO = RAT_PAI[ii]
                    GetRecord TABELA_BXRATEIO LANCTO_ROTINA,"0",SEQ_RATEIO To REG_RATEIO
                    If RetVal
                       Then PLCONTA_AUX    = REG_RATEIO["Codigo Plano_Conta"]
                            PLCONTA_AUX_VR = REG_RATEIO["Valor"]
                            
                            PLCONTA_AUX_VR = PLCONTA_AUX_VR * 100 / VR_DOCTO
                            VR_AUX         = Round(PLCONTA_AUX_VR * ANT_VR_AUX / 100,2)
                            
                            If DynArraySize(RAT_PAI)=ii
                               Then VR_AUX       = ANT_VR_AUX - CONTA_VR_AUX 
                               Else CONTA_VR_AUX = CONTA_VR_AUX + VR_AUX  
                            EndIf
                            Adiciona_Rateio()
                    EndIf   
                  Endfor
             Else SEQ_RATEIO = SEQ_RATEIO + 1
                  Adiciona_Rateio()     
          EndIf    
     Else SEQ_RATEIO = SEQ_RATEIO + 1
          Adiciona_Rateio()           
  EndIf
  
  Release Vars PLCONTA_AUX,VR_AUX
EndFor  
             
EndProc ;RateioPC_PrimeiroRateio()

;*******************************************************************************
;* Adiciona Rateio                                                             *
;*******************************************************************************
Proc Adiciona_Rateio()
Private DESCRICAO_PLCONTA

GetRecord "\\Sistemas\\Ctacor\\PlContas" PLCONTA_AUX To REG_PLCONTA
If RetVal
   Then DESCRICAO_PLCONTA = REG_PLCONTA["Descricao Plano_Conta"]
   Else Mensagem("Plano de Conta "+PLCONTA_AUX+" nÆo foi localizado!")
        DESCRICAO_PLCONTA = ""
        PLCONTA_AUX = ""
EndIf        
VSDGPLCONTAS    = PLCONTA_AUX 
VSDGNOMPLCONTAS = DESCRICAO_PLCONTA
VSDGCCUSTO      = ""
VSDGNOMCUST     = ""
VSDG_PORC       = BlankNum()
VSDG_VALOR      = VR_AUX

RateioPC_Rateio("Adicao",SEQ_RATEIO)

EndProc ;Adiciona_Rateio()

;*******************************************************************************
;* Atualizacao Conta Corrente                                                  *
;*******************************************************************************
Proc RateioPC_MovCont(PARAM)
Private PARAM,Conta_Array_MovRat,Array_Rateio_MovRat,ANT_TAB  

Switch
  Case PARAM = "Adicao" :
       Conta_Array_MovRat = 0
       Dynarray Array_Rateio_MovRat[]
      
       RateioPC_Opcoes("Tabela_Rateio")
       Moveto [Numero do Lancamento]
       Locate LANCTO_ROTINA,SEQ_BAIXA
       If RetVal
         Then While [Numero do Lancamento] = LANCTO_ROTINA And 
                    [Sequencia da Baixa  ] = SEQ_BAIXA
             
              Conta_Array_MovRat = Conta_Array_MovRat + 1
              Array_Rateio_MovRat[Conta_Array_MovRat] = Format("W6",LANCTO_RATEIO)+
                                                        Format("W6","0")+
                                                        Format("W6",[Sequencia do Rateio])+
                                                        Format("W13",[Codigo Plano_Conta])+
                                                        Format("W48",[Descricao Plano_Conta])+
                                                        Format("W7",[Codigo CCusto])+
                                                        Format("W25",[Descricao CCusto])+
                                                        Format("W10.2",[Porcentagem])+
                                                        Format("W12.2",[Valor])
             
                Skip
                If Eot() Then QuitLoop EndIf
                Locate Next LANCTO_ROTINA,SEQ_BAIXA
                If Not RetVal Then QuitLoop EndIf    
              EndWhile
       EndIf
       RateioPC_Opcoes("Tabela_Baixa")               
      
       If DynArraySize(Array_Rateio_MovRat)>0
         Then ANT_TAB = Table()
              Moveto "\\Sistemas\\CtaCor\\MovRat"
              Moveto [Numero do Lancamento]
              Locate LANCTO_RATEIO
              If RetVal
                 Then While [Numero do Lancamento]=LANCTO_RATEIO
                        Del
                      EndWhile   
              EndIf
              End Down
              For ui From 1 To DynArraySize(Array_Rateio_MovRat)
                [Numero do Lancamento ] = LANCTO_RATEIO
                [Sequencia da Baixa   ] = Ltrim(Rtrim(SubStr(Array_Rateio_MovRat[ui],7,6)))
                [Sequencia do Rateio  ] = NumVal(Ltrim(Rtrim(SubStr(Array_Rateio_MovRat[ui],13,6))))
                [Codigo Plano_Conta   ] = Ltrim(Rtrim(SubStr(Array_Rateio_MovRat[ui],19,13)))
                [Descricao Plano_Conta] = Ltrim(Rtrim(SubStr(Array_Rateio_MovRat[ui],32,48)))
                [Codigo CCusto        ] = Ltrim(Rtrim(SubStr(Array_Rateio_MovRat[ui],80,7)))
                [Descricao CCusto     ] = Ltrim(Rtrim(SubStr(Array_Rateio_MovRat[ui],87,25)))
                If Ltrim(Rtrim(SubStr(Array_Rateio_MovRat[ui],112,10)))<>""
                   Then [Porcentagem] = NumVal(Ltrim(Rtrim(SubStr(Array_Rateio_MovRat[ui],112,10)))) 
                EndIf
                If Ltrim(Rtrim(SubStr(Array_Rateio_MovRat[ui],122,12)))<>""
                   Then [Valor] = NumVal(Ltrim(Rtrim(SubStr(Array_Rateio_MovRat[ui],122,12)))) 
                EndIf
                If ui <> DynArraySize(Array_Rateio_MovRat) Then Down EndIf   
              EndFor
              UnLockRecord
              Moveto ANT_TAB
              Moveto [Sequencia da Baixa]
              Locate SEQ_BAIXA
       EndIf       
       
   Case PARAM = "Exclusao" : 
        RateioPC_Opcoes("Tabela_Baixa")
        LANCTO_MOVRAT = [Lancamento Conta Corrente]
        If Not IsBlank(LANCTO_MOVRAT) And TIPO_RATEIO="Baixa"
           Then GetRecord "\\Sistemas\\CtaCor\\MovRat" LANCTO_MOVRAT To REG_MOVRAT
                If RetVal
                   Then ANT_TAB = Table()
                        Moveto "\\Sistemas\\CtaCor\\MovRat"
                        Moveto [Numero do Lancamento]
                        Locate LANCTO_MOVRAT
                        If RetVal
                           Then While [Numero do Lancamento]=LANCTO_MOVRAT
                                  Del
                                EndWhile   
                        EndIf
                        Moveto ANT_TAB
                        Moveto [Sequencia da Baixa]
                        Locate SEQ_BAIXA
                EndIf
        EndIf 
EndSwitch        

Release Vars Conta_Array_MovRat,Array_Rateio_MovRat,ANT_TAB

EndProc ;RateioPC_MovCont()

;*******************************************************************************
;* Rateio da Baixa                                                             *
;*******************************************************************************
Proc RateioPC_Rateio(PARAM,REGISTRO)                       
Private PARAM,ANT_TAB,ANT_FIE,AUX_ARRAY_BXRATEIO,CONTAARRAY,REGISTRO,Exclui_Registro

ANT_TAB = Table()
ANT_FIE = Field()

If PARAM = "Exclusao"
   Then If RateioPC_Opcoes("Tabela_Rateio")
           Then Moveto [Numero do Lancamento]
                If REGISTRO<>""
                   Then Locate LANCTO_ROTINA,StrVal(SEQ_BAIXA),NumVal(REGISTRO)
                        If ReTval Then Del EndIf
                        If SubStr(Upper(Table()),1,3) <> "MOV" Then RateioPC_MovCont("Exclusao") EndIf   
                   Else Locate LANCTO_ROTINA,StrVal(SEQ_BAIXA)
                        If ReTval 
                           Then While [Numero do Lancamento] = LANCTO_ROTINA
                                      [Sequencia da Baixa]   = StrVal(SEQ_BAIXA)
                                  Del
                                  Home
                                  Locate Next LANCTO_ROTINA,StrVal(SEQ_BAIXA)
                                  If Not RetVal Then QuitLoop EndIf
                                EndWhile
                        EndIf
                EndIf
        EndIf               
EndIf

Switch 
  Case PARAM = "Exclusao" And REGISTRO>0 :
       Release Vars ARRAY_BXRATEIO
       DynArray ARRAY_BXRATEIO[]
       
       If RateioPC_Opcoes("Tabela_Rateio")
          Then CONTA_ARRAY = 0
               VR_ARRAY    = BlankNum()
               Home
               Moveto [Numero do Lancamento]
               Locate LANCTO_ROTINA,StrVal(SEQ_BAIXA)
               If Retval
                  Then While [Numero do Lancamento] = LANCTO_ROTINA 
                             [Sequencia da Baixa] = StrVal(SEQ_BAIXA)
                       
                       GetRecord "\\Sistemas\\Ctacor\\PlContas" [Codigo Plano_Conta] To REG_TIPOENTSAI
                       
                       CONTA_ARRAY = CONTA_ARRAY + 1
                       ARRAY_BXRATEIO[CONTA_ARRAY] = Format("W3,AL",StrVal(CONTA_ARRAY))+Spaces(1)+
                                                     Format("W13",[Codigo Plano_Conta])+Spaces(1)+
                                                     Format("W16",Ltrim([Descricao Plano_Conta]))+Spaces(1)+
                                                     Format("W7",[Codigo CCusto])+Spaces(1)+
                                                     Format("W12",Ltrim([Descricao CCusto]))+Spaces(1)+
                                                     Format("W7.2",[Porcentagem])
                                                     
                       If (PL_CONTA_PRINCIPAL=[Codigo Plano_Conta] And OPERACAO_ENTSAI = REG_TIPOENTSAI["TipoEntradaSaida"]) Or
                          OPERACAO_ENTSAI=REG_TIPOENTSAI["TipoEntradaSaida"]
                          Then ARRAY_BXRATEIO[CONTA_ARRAY] = ARRAY_BXRATEIO[CONTA_ARRAY] + Format("W10.2,EIC,S+",[Valor])
                               VR_ARRAY = VR_ARRAY + [Valor]
                          Else ARRAY_BXRATEIO[CONTA_ARRAY] = ARRAY_BXRATEIO[CONTA_ARRAY] + Format("W10.2,EIC,S+",[Valor]*-1)
                               VR_ARRAY = VR_ARRAY + ([Valor]*-1)
                       EndIf
                       
                       [Sequencia do Rateio] = CONTA_ARRAY                              
                       Skip
                       If Eot() Then QuitLoop EndIf
                       Locate Next LANCTO_ROTINA,StrVal(SEQ_BAIXA)
                       If Not RetVal Then QuitLoop EndIf
                       EndWhile
                       UnLockRecord
               EndIf 
               POSD=0
               If VR_ARRAY=0 
                  Then VR_ARRAY = BlankNum()
                  Else VR_ARRAY = Ltrim(Rtrim(Format("W10.2,EIC",VR_ARRAY)))
                       POSD     = 12-Len(VR_ARRAY)
               EndIf
       EndIf      
  Case PARAM = "Adicao" : 
       VSDGNOMPLCONTAS = ""
       VSDGNOMCUST     = ""
       
       GetRecord "\\Sistemas\\Ctacor\\PlContas" VSDGPLCONTAS To REG_PLCONTAS
       If RetVal Then VSDGNOMPLCONTAS = LTrim(REG_PLCONTAS["Descricao Plano_Conta"]) EndIf
       GetRecord "\\Sistemas\\Ctacor\\CCusto" VSDGCCUSTO To REG_CCUSTO
       If RetVal Then VSDGNOMCUST = LTrim(REG_CCUSTO["Descricao CCusto"]) EndIf
       
       If RateioPC_Opcoes("Tabela_Rateio")
          Then Moveto [Numero do Lancamento]
               Locate LANCTO_ROTINA,StrVal(SEQ_BAIXA),REGISTRO
               If ReTval
                  Then Del 
               EndIf
               End Down
               [Numero do Lancamento ] = LANCTO_ROTINA
               [Sequencia da Baixa   ] = StrVal(SEQ_BAIXA)
               [Sequencia do Rateio  ] = REGISTRO
               [Codigo Plano_Conta   ] = VSDGPLCONTAS
               [Descricao Plano_Conta] = VSDGNOMPLCONTAS
               [Codigo CCusto        ] = VSDGCCUSTO
               [Descricao CCusto     ] = VSDGNOMCUST
               [Porcentagem          ] = VSDG_PORC
               [Valor                ] = VSDG_VALOR
               UnLockRecord
               
               Release Vars ARRAY_BXRATEIO
               DynArray ARRAY_BXRATEIO[]
               CONTA_ARRAY = 0
               VR_ARRAY    = BlankNum() 
               
               RateioPC_Opcoes("Tabela_Rateio")
               Moveto [Numero do Lancamento]
               Locate LANCTO_ROTINA,StrVal(SEQ_BAIXA)
               If Retval
                   Then While [Numero do Lancamento] = LANCTO_ROTINA 
                              [Sequencia da Baixa] = StrVal(SEQ_BAIXA)
                          
                          GetRecord "\\Sistemas\\Ctacor\\PlContas" [Codigo Plano_Conta] To REG_TIPOENTSAI
                          
                          CONTA_ARRAY = CONTA_ARRAY + 1
                          ARRAY_BXRATEIO[CONTA_ARRAY] = Format("W3,AL",StrVal(CONTA_ARRAY))+Spaces(1)+
                                                        Format("W13",[Codigo Plano_Conta])+Spaces(1)+
                                                        Format("W16",Ltrim([Descricao Plano_Conta]))+Spaces(1)+
                                                        Format("W7",[Codigo CCusto])+Spaces(1)+
                                                        Format("W12",Ltrim([Descricao CCusto]))+Spaces(1)+
                                                        Format("W7.2",[Porcentagem])      
                                                          
                          If (PL_CONTA_PRINCIPAL=[Codigo Plano_Conta] And OPERACAO_ENTSAI = REG_TIPOENTSAI["TipoEntradaSaida"]) Or
                             OPERACAO_ENTSAI=REG_TIPOENTSAI["TipoEntradaSaida"]
                             Then ARRAY_BXRATEIO[CONTA_ARRAY] = ARRAY_BXRATEIO[CONTA_ARRAY] + Format("W10.2,EIC,S+",[Valor])
                                  VR_ARRAY = VR_ARRAY + [Valor]
                             Else ARRAY_BXRATEIO[CONTA_ARRAY] = ARRAY_BXRATEIO[CONTA_ARRAY] + Format("W10.2,EIC,S+",[Valor]*-1)
                                  VR_ARRAY = VR_ARRAY + ([Valor]*-1)
                          EndIf          
                          Skip
                          If Eot() Then QuitLoop EndIf
                          Locate Next LANCTO_ROTINA,StrVal(SEQ_BAIXA)
                          If Not RetVal Then QuitLoop EndIf
                        EndWhile
                        UnLockRecord
               EndIf      
               POSD=0
               If VR_ARRAY=0 
                  Then VR_ARRAY = BlankNum()
                  Else VR_ARRAY = Ltrim(Rtrim(Format("W10.2,EIC",VR_ARRAY)))
                       POSD     = 12-Len(VR_ARRAY)
               EndIf
       EndIf
  Case PARAM="Carrega" And Registro>0 : 
       If RateioPC_Opcoes("GetRecord")
          Then GetRecord TABELA_BXRATEIO LANCTO_ROTINA,StrVal(SEQ_BAIXA),REGISTRO To REG_BXRATEIO
               If Retval
                  Then CHAVEB = 0
                       VSDGPLCONTAS    = REG_BXRATEIO["Codigo Plano_Conta"]
                       VSDGNOMPLCONTAS = Ltrim(REG_BXRATEIO["Descricao Plano_Conta"])
                       VSDGCCUSTO      = REG_BXRATEIO["Codigo CCusto"]
                       VSDGNOMCUST     = Ltrim(REG_BXRATEIO["Descricao CCusto"])
                       VSDG_PORC       = REG_BXRATEIO["Porcentagem"]
                       VSDG_VALOR      = REG_BXRATEIO["Valor"]
                       TEMP = True
                  Else CHAVEB = 1
                       TEMP = False    
               EndIf
          Else CHAVEB = 1
               TEMP = False    
       EndIf        
       Release Vars TABELA_BXRATEIO,REG_BXRATEIO
       Moveto ANT_TAB
       Moveto Field ANT_FIE
       Return TEMP
  Case PARAM = "Carrega" :
       If RateioPC_Opcoes("Tabela_Rateio")
          Then Moveto [Numero do Lancamento]
               Locate LANCTO_ROTINA,SEQ_BAIXA
               If RetVal
                  Then While [Numero do Lancamento] = LANCTO_ROTINA And
                             [Sequencia da Baixa  ] = SEQ_BAIXA
                             
                             GetRecord "\\Sistemas\\Ctacor\\PlContas" [Codigo Plano_Conta] To REG_TIPOENTSAI                         
       
                             CONTA_ARRAY = CONTA_ARRAY + 1
                             ARRAY_BXRATEIO[CONTA_ARRAY] = Format("W3,AL",[Sequencia do Rateio])+Spaces(1)+
                                                           Format("W13",[Codigo Plano_Conta])+Spaces(1)+
                                                           Format("W16",Ltrim([Descricao Plano_Conta]))+Spaces(1)+
                                                           Format("W7",[Codigo CCusto])+Spaces(1)+
                                                           Format("W12",Ltrim([Descricao CCusto]))+Spaces(1)+
                                                           Format("W7.2",[Porcentagem])
                                                       
                             If (PL_CONTA_PRINCIPAL=[Codigo Plano_Conta] And OPERACAO_ENTSAI = REG_TIPOENTSAI["TipoEntradaSaida"]) Or
                                OPERACAO_ENTSAI=REG_TIPOENTSAI["TipoEntradaSaida"]
                                Then ARRAY_BXRATEIO[CONTA_ARRAY] = ARRAY_BXRATEIO[CONTA_ARRAY] + Format("W10.2,EIC,S+",[Valor])
                                     VR_ARRAY = VR_ARRAY + [Valor]
                                Else ARRAY_BXRATEIO[CONTA_ARRAY] = ARRAY_BXRATEIO[CONTA_ARRAY] + Format("W10.2,EIC,S+",[Valor]*-1)
                                     VR_ARRAY = VR_ARRAY + ([Valor]*-1)
                             EndIf
                             Skip
                             If Eot() Then QuitLoop EndIf
                             Locate Next LANCTO_ROTINA,StrVal(SEQ_BAIXA)
                             If Not RetVal Then QuitLoop EndIf
                       EndWhile 
                       POSD=0
                       If VR_ARRAY=0 
                          Then VR_ARRAY = BlankNum()
                          Else VR_ARRAY = Ltrim(Rtrim(Format("W10.2,EIC",VR_ARRAY)))
                               POSD     = 12-Len(VR_ARRAY)
                       EndIf
               EndIf
       EndIf
EndSwitch

VSD_SEQ         = BlankNum() 
VSDGPLCONTAS    = ""
VSDGNOMPLCONTAS = ""
VSDGCCUSTO      = ""
VSDGNOMCUST     = ""
VSDG_PORC       = BlankNum()
VSDG_VALOR      = BlankNum()

Moveto ANT_TAB
Moveto Field ANT_FIE

Release Vars PARAM,ANT_TAB,ANT_FIE,AUX_ARRAY_BXRATEIO,CONTAARRAY,REGISTRO,Exclui_Registro
Return True

EndProc

;*******************************************************************************
;* Verifica Utiliza‡Æo do Rateio                                               *
;*******************************************************************************
Proc RateioPC_Verifica_Utilizacao(PARAM)   
Private PARAM,COR_MENSAGEM         

If Not IsAssigneD(UTILIZA_RAT_CABECA) And Not IsAssigned(UTILIZA_RAT_BAIXA)
   Then Return
EndIf

Switch
  Case PARAM = "CABECA" :
       If UTILIZA_RAT_CABECA<>"" And UTILIZA_RAT_CABECA<>"N" And [Tem Rateio]<>UTILIZA_RAT_CABECA
          Then COR_MENSAGEM="ALERTA"
               If ConfGeral("Este t¡tulo esta com a op‡Æo de utilizar o rateio.//"+
                            "Deseja realmente alterar este t¡tulo para nÆo utilizar o rateio?")
                  Then SEQ_BAIXA = "0"
                       RateioPC_Rateio("Exclusao","")
                       [Tem Rateio] = "N"
                       UTILIZA_RAT_CABECA = "N"
                  Else [Tem Rateio] = UTILIZA_RAT_CABECA
               EndIf     
               Release Vars COR_MENSAGEM
          Else If UTILIZA_RAT_CABECA="N" And [Tem Rateio]="S" Then UTILIZA_RAT_CABECA="S" EndIf
       EndIf
  Case PARAM = "BAIXA" :
       If UTILIZA_RAT_BAIXA<>"" And UTILIZA_RAT_BAIXA<>"N" And VSD_I_Tem_Rateio<>UTILIZA_RAT_BAIXA
          Then COR_MENSAGEM="ALERTA"
               If ConfGeral("Esta baixa esta com a op‡Æo de utilizar o rateio.//"+
                           "Deseja realmente alterar esta baixa para nÆo utilizar o rateio?")
                  Then SEQ_BAIXA = [Sequencia da Baixa]
                       RateioPC_Rateio("Exclusao","")
                       VSD_I_Tem_Rateio    = "N" 
                       VSD_I_Tem_Rateio_SN = "NAO"
                       UTILIZA_RAT_BAIXA   = VSD_I_Tem_Rateio
                  Else VSD_I_Tem_Rateio    = UTILIZA_RAT_BAIXA
                       Switch
                         Case VSD_I_Tem_Rateio = "S" : VSD_I_Tem_Rateio_SN = "SIM"
                         Case VSD_I_Tem_Rateio = "N" : VSD_I_Tem_Rateio_SN = "NAO"
                         OtherWise                   : VSD_I_Tem_Rateio_SN = ""
                       EndSwitch
                       UTILIZA_RAT_BAIXA   = VSD_I_Tem_Rateio
               EndIf     
               Release Vars COR_MENSAGEM
          Else If UTILIZA_RAT_BAIXA="N" And VSD_I_Tem_Rateio="S" Then UTILIZA_RAT_BAIXA="S" EndIf
       EndIf          
EndSwitch

EndProc ;RateioPC_Verifica_Utilizacao()

;*******************************************************************************
;* Cria Array Rateio *Titulos no Contas a Pagar                                *
;*******************************************************************************
Proc RateioPC_Array(PARAM,CONT)
Private PARAM,CONT

Switch
  Case PARAM = "Cria_Array" : 
       DynArray ArrayRateio[]
                                         
       RateioPC_Opcoes("Tabela_Rateio")
       Moveto [Numero do Lancamento]
       Locate LANCTO_ROTINA,"0"
       If Retval
          Then n=0
               While [Numero do Lancamento] = LANCTO_ROTINA 
                     [Sequencia da Baixa] = "0"
                  n=n+1
                  ArrayRateio[n]=
                  Format("W5,AL",[Sequencia do Rateio])+" "+
                  Format("W13,AL",([Codigo Plano_Conta]))+" "+
                  Format("W7,AL",([Codigo CCusto]))+" "+
                  Format("W5,AL",[Porcentagem])+" "+
                  Format("W12.2,AL",[Valor])
           
                  Skip
                  If Eot() Then QuitLoop EndIf
                  Locate Next LANCTO_ROTINA,"0"
                  If Not RetVal Then QuitLoop EndIf
                EndWhile
       EndIf
  OtherWise : 
       If CONT>1 And IsAssigned(ArrayRateio) And DynArraySize(ArrayRateio)>0
          Then RateioPC_Opcoes("Tabela_Rateio")                                        
               For ii From 1 To DynArraySize(ArrayRateio)
                   End Down Down
                   [Numero do Lancamento ]=LANCTO_ROTINA
                   [Sequencia da Baixa   ]="0"
                   [Sequencia do Rateio  ]=NumVal(SubStr(ArrayRateio[ii],1,5))
                   [Codigo Plano_Conta   ]=RTrim(SubStr(ArrayRateio[ii],7,13))
                   [Codigo CCusto        ]=RTrim(SubStr(ArrayRateio[ii],21,7))
                   If Ltrim(Rtrim(SubStr(ArrayRateio[ii],29,5)))<>""
                      Then [Porcentagem  ]=NumVal(SubStr(ArrayRateio[ii],29,5)) 
                   EndIf
                   If Ltrim(Rtrim(SubStr(ArrayRateio[ii],35,15)))<>""
                      Then [Valor        ]=NumVal(SubStr(ArrayRateio[ii],35,15)) 
                   EndIf
                   [Descricao Plano_Conta]=LTrim([Descricao Plano_Conta])
                   [Descricao CCusto     ]=LTrim([Descricao CCusto])
               EndFor
       Endif
EndSwitch

EndProc ;RateioPC_Array()

;*******************************************************************************
;* Ajusta Valores                                                              *
;*******************************************************************************                          
Proc RateioPC_Ajusta_Valor(param)
private param,ii

If Search(".",param) > 0
   Then For ii From 1 To Len(param)
          if SubStr(param,ii,1)="."
             Then param = SubStr(param,1,ii-1)+SubStr(param,ii+1,Len(param))
                  ii = 1
          EndIf                                  
        Endfor
EndIf

If Search(",",param) > 0
   Then For ii From 1 To Len(param)
          if SubStr(param,ii,1)=","
             Then param = SubStr(param,1,ii-1)+"."+SubStr(param,ii+1,Len(param))
                  ii = 1
          EndIf                                  
        Endfor
EndIf

Return param
                            
EndProc ;Proc RateioPC_Ajusta_Valor()

;*******************************************************************************
;* Re-Faz o plano de conta automaticamente                                     *
;*******************************************************************************    
Proc Calcular_PlConta_Automatico()  
Private ANT_TAB 

If SubStr(Upper(Table()),1,3)="MOV" Or Search("BAIXA",Upper(Table()))>0
   Then 
   Else Return
EndIf   

ANT_TAB = Table()

If DynArraySize(ARRAY_BXRATEIO)>0
   Then MSG =       Completa("Neste lan‡amento foi encontrado um ou mais plano de contas informado.",70," ")+"////"
        MSG = MSG + Completa("Se  prosseguir, os planos de contas informados neste lan‡amento serÆo",70," ")+"//"
        MSG = MSG + Completa("excluidos  e  serÆo  adicionados  automaticamente os planos de contas",70," ")+"//"
        MSG = MSG + Completa("conforme parƒmetro do caixa/banco e o plano de conta principal.      ",70," ")+"//"
        MSG = MSG + Completa("Deseja realmente prosseguir com essa solicita‡Æo?",70," ")
        If Not ConfGeral(MSG)
           Then Return False
        EndIf     
EndIf 

RateioPC_Opcoes("Verifica_Tabela") 
If TIPO_TABELA="Cabeca" 
   Then SEQ_BAIXA = "0"
        RateioPC_Rateio("Exclusao","")
        [Tem Rateio] = "N"
        
        Release Vars ARRAY_BXRATEIO
        DynArray ARRAY_BXRATEIO[]
        
        ;Adiciona Automaticamente
        RateioPC("ADICIONA_RATEIO_CABECA")
        If DynArraySize(ARRAY_BXRATEIO)>0
           Then [Tem Rateio] = "S"
        EndIf    
   Else SEQ_BAIXA = [Sequencia da Baixa]
        For i From 1 To DynArraySize(ARRAY_BXRATEIO) 
          RateioPC_Rateio("Exclusao",strval(i))
        EndFor
        VSD_I_Tem_Rateio = "N"
        
        Release Vars ARRAY_BXRATEIO
        DynArray ARRAY_BXRATEIO[]
        
        RateioPC_Opcoes("GetRecord")
        GetRecord TABELA_BXRATEIO LANCTO_ROTINA,"0",1 To REG_BXRATEIO
        If Retval
           Then PARAM_RATEIO_PAI=True
           Else PARAM_RATEIO_PAI=False
        EndIf              
        RateioPC("ADICIONA_RATEIO_BAIXA")
        If DynArraySize(ARRAY_BXRATEIO)>0
           Then VSD_I_Tem_Rateio = "S"
        EndIf         
EndIf   

Moveto ANT_TAB
Return true

EndProc ;Calcular_PlConta_Automatico()

;*******************************************************************************
;* Rateio Autom tico                                                           *
;*******************************************************************************
Proc Rateio_Baixa_Automatica(PARAM)
Private RATEIO_PAI,LANCTO_ROTINA,BXCXAUTO_PLCONTA,BXCXAUTO_EMPRESA,BXCXAUTO_PLCONTA_JUROS,BXCXAUTO_PLCONTA_DESCONTO,
        BXCXAUTO_VR_JUROS,BXCXAUTO_VR_DESCONTO,VR_DOCTO,SEQ_BAIXA,VR_BAIXA,VR_BAIXA_JUROS,VR_BAIXA_DESCONTO

;Setando parƒmetros p/ plano de contas automatico 
If PARAM="Seta_Valores"
   Then Switch
          Case RATEIO_BAIXA_AUTOMATICA="DUP"        : BXCXAUTO_EMPRESA = [Duplic->Codigo da Empresa]
          Case RATEIO_BAIXA_AUTOMATICA="DUP_CTACOR" : BXCXAUTO_EMPRESA = [\Sistemas\CtaRec\Duplic->Codigo da Empresa ] 
          Case RATEIO_BAIXA_AUTOMATICA="TIT"        : BXCXAUTO_EMPRESA = [Titulos->Codigo da Empresa]
          Case RATEIO_BAIXA_AUTOMATICA="TIT_CTACOR" : BXCXAUTO_EMPRESA = [\Sistemas\CtaPag\Titulos->Codigo da Empresa]
        EndSwitch
        If AUX_EMPRESA<>BXCXAUTO_EMPRESA
           Then AUX_EMPRESA = BXCXAUTO_EMPRESA
                PL_CONTA_EMPRESA = AUX_EMPRESA
                GetRecord_Parametros_PCXBCO()
                
                Switch
                  Case SubStr(RATEIO_BAIXA_AUTOMATICA,1,3)="DUP" : BXCXAUTO_PLCONTA_JUROS    = PL_CONTA_SAIDA_JUROS
                                                                   BXCXAUTO_PLCONTA_DESCONTO = PL_CONTA_SAIDA_DESCONTO
                  Case SubStr(RATEIO_BAIXA_AUTOMATICA,1,3)="TIT" : BXCXAUTO_PLCONTA_JUROS    = PL_CONTA_ENTRADA_JUROS
                                                                   BXCXAUTO_PLCONTA_DESCONTO = PL_CONTA_ENTRADA_DESCONTO
                EndSwitch
                If BXCXAUTO_PLCONTA_JUROS <> "" And BXCXAUTO_PLCONTA_DESCONTO <> ""
                   Then RATEIO_AUTOMATICO = True 
                   Else RATEIO_AUTOMATICO = False
                EndIf    
        EndIf
        Return
EndIf

Switch
  Case RATEIO_BAIXA_AUTOMATICA="DUP" Or RATEIO_BAIXA_AUTOMATICA="DUP_CTACOR" : 
                                       LANCTO_ROTINA             = [\Sistemas\CtaRec\DupBaixa->Numero do Lancamento]
                                       BXCXAUTO_PLCONTA          = [\Sistemas\CtaRec\DupBaixa->Codigo Plano_Conta  ]
                                       BXCXAUTO_PLCONTA_JUROS    = PL_CONTA_SAIDA_JUROS
                                       BXCXAUTO_PLCONTA_DESCONTO = PL_CONTA_SAIDA_DESCONTO
                                       BXCXAUTO_VR_JUROS         = [\Sistemas\CtaRec\DupBaixa->Valor do Juros      ]
                                       BXCXAUTO_VR_DESCONTO      = [\Sistemas\CtaRec\DupBaixa->Valor do Desconto]
                                       VR_DOCTO                  = [\Sistemas\CtaRec\Duplic->Valor do Documento    ]-
                                                                   [\Sistemas\CtaRec\Duplic->Valor de Juros        ]+
                                                                   [\Sistemas\CtaRec\Duplic->Valor do Desconto     ]
                                       SEQ_BAIXA                 = StrVal([\Sistemas\CtaRec\DupBaixa->Sequencia da Baixa])
                                       VR_BAIXA                  = [\Sistemas\CtaRec\DupBaixa->Valor do Recebimento]-
                                                                   [\Sistemas\CtaRec\DupBaixa->Valor do Juros      ]+
                                                                   [\Sistemas\CtaRec\DupBaixa->Valor do Desconto   ]
                                       VR_BAIXA_JUROS            = [\Sistemas\CtaRec\DupBaixa->Valor do Juros      ]
                                       VR_BAIXA_DESCONTO         = [\Sistemas\CtaRec\DupBaixa->Valor do Desconto   ]
                                       Switch
                                         Case RATEIO_BAIXA_AUTOMATICA="DUP_CTACOR" : BXCXAUTO_EMPRESA = [\Sistemas\CtaRec\Duplic->Codigo da Empresa ]
                                         Case RATEIO_BAIXA_AUTOMATICA="DUP"        : BXCXAUTO_EMPRESA = [Duplic->Codigo da Empresa ]
                                       EndSwitch
  Case RATEIO_BAIXA_AUTOMATICA="TIT" Or RATEIO_BAIXA_AUTOMATICA="TIT_CTACOR" :
                                       LANCTO_ROTINA             = [\Sistemas\CtaPag\TitBaixa->Numero do Lancamento]
                                       BXCXAUTO_PLCONTA          = [\Sistemas\CtaPag\TitBaixa->Codigo Plano_Conta  ]
                                       BXCXAUTO_PLCONTA_JUROS    = PL_CONTA_ENTRADA_JUROS
                                       BXCXAUTO_PLCONTA_DESCONTO = PL_CONTA_ENTRADA_DESCONTO
                                       BXCXAUTO_VR_JUROS         = [\Sistemas\CtaPag\TitBaixa->Valor do Juros      ]
                                       BXCXAUTO_VR_DESCONTO      = [\Sistemas\CtaPag\TitBaixa->Valor do Desconto   ]
                                       VR_DOCTO                  = [\Sistemas\CtaPag\Titulos->Valor do Documento   ]-
                                                                   [\Sistemas\CtaPag\Titulos->Valor de Juros       ]+
                                                                   [\Sistemas\CtaPag\Titulos->Valor do Desconto    ]
                                       SEQ_BAIXA                 = StrVal([\Sistemas\CtaPag\TitBaixa->Sequencia da Baixa])
                                       VR_BAIXA                  = [\Sistemas\CtaPag\TitBaixa->Valor do Pagamento  ]-
                                                                   [\Sistemas\CtaPag\TitBaixa->Valor do Juros      ]+
                                                                   [\Sistemas\CtaPag\TitBaixa->Valor do Desconto   ]
                                       VR_BAIXA_JUROS            = [\Sistemas\CtaPag\TitBaixa->Valor do Juros      ]
                                       VR_BAIXA_DESCONTO         = [\Sistemas\CtaPag\TitBaixa->Valor do Desconto   ]
                                       Switch
                                         Case RATEIO_BAIXA_AUTOMATICA="TIT_CTACOR" : BXCXAUTO_EMPRESA = [\Sistemas\CtaPag\Titulos->Codigo da Empresa] 
                                         Case RATEIO_BAIXA_AUTOMATICA="TIT"        : BXCXAUTO_EMPRESA = [Titulos->Codigo da Empresa]
                                      EndSwitch
 OtherWise                           : Return
EndSwitch

If RATEIO_AUTOMATICO And BXCXAUTO_PLCONTA<>"" And (BXCXAUTO_VR_JUROS>0 Or BXCXAUTO_VR_DESCONTO>0)
   Then
   Else Return
EndIf

RATEIO_PAI=False
Switch
  Case RATEIO_BAIXA_AUTOMATICA="DUP"        : GetRecord "DupRat" LANCTO_ROTINA,"0",1 To REG_RATEIO
  Case RATEIO_BAIXA_AUTOMATICA="DUP_CTACOR" : GetRecord "\\Sistemas\\CtaRec\\DupRat" LANCTO_ROTINA,"0",1 To REG_RATEIO  
  Case RATEIO_BAIXA_AUTOMATICA="TIT"        : GetRecord "TitRat" LANCTO_ROTINA,"0",1 To REG_RATEIO
  Case RATEIO_BAIXA_AUTOMATICA="TIT_CTACOR" : GetRecord "\\Sistemas\\CtaPag\\TitRat" LANCTO_ROTINA,"0",1 To REG_RATEIO 
EndSwitch
If RetVal
   Then RATEIO_PAI=True
EnDIf

;---- Adiciona o rateio do pai nas baixas proporcionalmente ----
If RATEIO_PAI
   Then DynArray RAT_PAI[]
        CONT_RAT_PAI = 0
        Switch 
          Case RATEIO_BAIXA_AUTOMATICA="DUP"        : Moveto "DupRat"
          Case RATEIO_BAIXA_AUTOMATICA="DUP_CTACOR" : Moveto "\\Sistemas\\CtaRec\\DupRat"
          Case RATEIO_BAIXA_AUTOMATICA="TIT"        : Moveto "TitRat"
          Case RATEIO_BAIXA_AUTOMATICA="TIT_CTACOR" : Moveto "\\Sistemas\\CtaPag\\TitRat"
        EndSwitch
        Moveto [Numero do Lancamento]
        Locate LANCTO_ROTINA,"0"
        If RetVal
           Then While [Numero do Lancamento] = LANCTO_ROTINA And [Sequencia da Baixa] = "0"
                  CONT_RAT_PAI = CONT_RAT_PAI + 1
                  RAT_PAI[CONT_RAT_PAI] = [Sequencia do Rateio]
                  Skip
                  If Eot() Then QuitLoop EndIf
                EndWhile
        EndIf    
EndIf

SEQ_RATEIO=0
For ty From 1 To 2
  If ty=1
     Then AUX_PLCONTA = BXCXAUTO_PLCONTA
          VR_AUX      = VR_BAIXA
     Else  Switch
           Case VR_BAIXA_JUROS > 0    : AUX_PLCONTA = BXCXAUTO_PLCONTA_JUROS
                                        VR_AUX      = VR_BAIXA_JUROS
           Case VR_BAIXA_DESCONTO > 0 : AUX_PLCONTA = BXCXAUTO_PLCONTA_DESCONTO
                                        VR_AUX      = VR_BAIXA_DESCONTO
         EndSwitch 
  EndIf
  
  Switch
    Case PARAM="MovRat"                   :
         LANCTO_AUX = NLANCMC
         SEQ_BAIXA  = "0"
    Case PARAM="DupRat" Or PARAM="TitRat" :  
         LANCTO_AUX = LANCTO_ROTINA
  EndSwitch
  
  ;Caso encontrar rateio no pai, ser  rateado na baixa, senÆo ser  criado um lan‡amento com o plano de conta
  ;informado na baixa, levando em considera‡Æo juros e desconto que j  tem o seu plano de conta espec¡fico. 
  If RATEIO_PAI And ty=1
     Then If DynArraySize(RAT_PAI)>0
             Then ANT_VR_AUX   = VR_AUX
                  CONTA_VR_AUX = 0
                  For ii From 1 To DynArraySize(RAT_PAI)
                    SEQ_RATEIO = RAT_PAI[ii]
                    Switch
                      Case RATEIO_BAIXA_AUTOMATICA="DUP"        : GetRecord "DupRat" LANCTO_ROTINA,"0",SEQ_RATEIO To REG_RATEIO
                      Case RATEIO_BAIXA_AUTOMATICA="DUP_CTACOR" : GetRecord "\\Sistemas\\CtaRec\\DupRat"  LANCTO_ROTINA,"0",SEQ_RATEIO To REG_RATEIO 
                      Case RATEIO_BAIXA_AUTOMATICA="TIT"        : GetRecord "TitRat" LANCTO_ROTINA,"0",SEQ_RATEIO To REG_RATEIO
                      Case RATEIO_BAIXA_AUTOMATICA="TIT_CTACOR" : GetRecord "\\Sistemas\\CtaPag\\TitRat"  LANCTO_ROTINA,"0",SEQ_RATEIO To REG_RATEIO
                    EndSwitch
                    If RetVal
                       Then PLCONTA_AUX    = REG_RATEIO["Codigo Plano_Conta"]
                            PLCONTA_AUX_VR = REG_RATEIO["Valor"]
                            
                            GetRecord "\\Sistemas\\Ctacor\\PlContas" PLCONTA_AUX To REG_PLCONTA
                          
                            PLCONTA_AUX_VR = PLCONTA_AUX_VR * 100 / VR_DOCTO
                            VR_AUX         = Round(PLCONTA_AUX_VR * ANT_VR_AUX / 100,2)
                          
                            If DynArraySize(RAT_PAI)=ii
                               Then VR_AUX       = ANT_VR_AUX - CONTA_VR_AUX 
                               Else CONTA_VR_AUX = CONTA_VR_AUX + VR_AUX  
                            EndIf
                            
                            Adiciona_Rateio_BxCxAuto(PARAM)
                    EndIf   
                  Endfor
                  If PARAM="DupRat" Or PARAM="TitRat" 
                     Then Switch
                            Case PARAM="DupRat" : Switch
                                                    Case RATEIO_BAIXA_AUTOMATICA="DUP"        : Moveto "DupBaixa"
                                                    Case RATEIO_BAIXA_AUTOMATICA="DUP_CTACOR" : Moveto "\\Sistemas\\CtaRec\\DupBaixa"
                                                  EndSwitch 
                            Case PARAM="TitRat" : Switch
                                                    Case RATEIO_BAIXA_AUTOMATICA="TIT"        : Moveto "TitBaixa"
                                                    Case RATEIO_BAIXA_AUTOMATICA="TIT_CTACOR" : Moveto "\\Sistemas\\CtaPag\\TitBaixa"
                                                  EndSwitch
                          EndSwitch   
                          [Tem Rateio] = "S"
                  EndIf                          
          EndIf
     Else GetRecord "\\Sistemas\\Ctacor\\PlContas" AUX_PLCONTA To REG_PLCONTA
          SEQ_RATEIO = SEQ_RATEIO + 1
          
          Adiciona_Rateio_BxCxAuto(PARAM)
          If ty = 1
             Then If PARAM="DupRat" Or PARAM="TitRat" 
                     Then Switch
                            Case PARAM="DupRat" : Switch
                                                    Case RATEIO_BAIXA_AUTOMATICA="DUP"        : Moveto "DupBaixa"
                                                    Case RATEIO_BAIXA_AUTOMATICA="DUP_CTACOR" : Moveto "\\Sistemas\\CtaRec\\DupBaixa"
                                                  EndSwitch 
                            Case PARAM="TitRat" : Switch
                                                    Case RATEIO_BAIXA_AUTOMATICA="TIT"        : Moveto "TitBaixa"
                                                    Case RATEIO_BAIXA_AUTOMATICA="TIT_CTACOR" : Moveto "\\Sistemas\\CtaPag\\TitBaixa"
                                                  EndSwitch
                          EndSwitch
                          [Tem Rateio] = "S"
                  EndIf         
          EndIf                
  EndIf
EndFor      

EndProc ;Rateio_Baixa_Automatica()

;*******************************************************************************
; Adiciona Rateio Baixa Automatica                                             *
;*******************************************************************************
Proc Adiciona_Rateio_BxCxAuto(PARAM)

Switch
 Case PARAM="MovRat"                    : Moveto "\\Sistemas\\CtaCor\\MovRat" End Down
 Case PARAM="DupRat" Or PARAM="TitRat"  : Switch
                                            Case PARAM="DupRat" : Switch
                                                                    Case RATEIO_BAIXA_AUTOMATICA="DUP"        : Moveto PARAM                        End Down
                                                                    Case RATEIO_BAIXA_AUTOMATICA="DUP_CTACOR" : Moveto "\\Sistemas\\CtaRec\\DupRat" End Down
                                                                  EndSwitch 
                                            Case PARAM="TitRat" : Switch
                                                                    Case RATEIO_BAIXA_AUTOMATICA="TIT"        : Moveto PARAM                          End Down
                                                                    Case RATEIO_BAIXA_AUTOMATICA="TIT_CTACOR" : Moveto "\\Sistemas\\CtaPag\\TitRat" End Down
                                                                  EndSwitch
                                          EndSwitch
EndSwitch
[Numero do Lancamento  ] = LANCTO_AUX
[Sequencia da Baixa    ] = SEQ_BAIXA
[Sequencia do Rateio   ] = SEQ_RATEIO
[Codigo Plano_Conta    ] = Rtrim(Ltrim(REG_PLCONTA["Codigo Plano_Conta"   ]))
[Descricao Plano_Conta ] = Rtrim(Ltrim(REG_PLCONTA["Descricao Plano_Conta"])) 
[Valor                 ] = VR_AUX
UnLockRecord
 
EndProc ;Adiciona_Rateio_BxCxAuto()
                           
;*******************************************************************************
;* Controle do ShowDialog                                                      *
;*******************************************************************************
Proc RateioPC_SDDialog(Disparo,Campo,Evento,Elemento)         
Private Disparo,Campo,Evento,Elemento,JANELAR,WinArray6,SEQ,FAZ_PROCESSO

Temp      = True
MSG_CAMPO = ""                                               
TECLA     = ""
               
If SubStr(Upper(Table()),1,3) = "MOV" Or Search("BAIXA",Upper(Table()))>0 
   Then TECLA = "Ctrl+Del=Excluir  ALT+F=Fun‡äes  PgDn=Finalizar"
   Else TECLA = "Ctrl+Del=Excluir                 PgDn=Finalizar"
EndIf                    
                                     
If INICIO_DIALOG
   Then Campo = "TG_SEQ"
        INICIO_DIALOG=False
EndIf     

If Disparo="OPEN" Then AoCriarShowDialog() EndIf
If Disparo="EVENT" And Evento["Type"]="KEY" Then
   Switch
     Case Evento["KeyCode"] =   9 : Temp=False
     
     
     Case Evento["KeyCode"] = -33 : If SubStr(Upper(Table()),1,3) = "MOV" Or Search("BAIXA",Upper(Table()))>0
                                       Then ShowPopup " Utilit rios " @ 09,22
                                                 "[F3] ~P~lano de Conta Autom tico" : "" : "F3"
                                             EndMenu
                                             To MenuVar
                                             If MenuVar="F3"
                                                Then Calcular_PlConta_Automatico()
                                             EndIf
                                    EndIf
     Case Evento["KeyCode"] = -61 : Calcular_PlConta_Automatico()
     Case Evento["KeyCode"] = -59 :
            Temp=False
            If Campo="BX_PLCONTAS" Or
               Campo="BX_CCUSTO"
               Then TAB_AUX = Table()
                    If RateioPC_Opcoes("Tabela_Rateio") 
                       Then RateioPC_Opcoes("Sequencia_Baixa")
                            
                            Moveto [Sequencia do Rateio]
                            Locate NumVal(VSD_SEQ)
                            If Not RetVal
                               Then End Down
                                    [Numero do Lancamento ] = LANCTO_ROTINA
                                    [Sequencia da Baixa   ] = StrVal(SEQ_BAIXA)
                                    [Sequencia do Rateio  ] = NumVal(VSD_SEQ) 
                            EndIf
                            
                            Dynarray WinArray6[]
                            Window Handle Dialog to JANELAR
                            Window GetAttributes JANELAR To WinArray6
                            WinArray6["FLOATING"]=False
                            Window SetAttributes JANELAR From WinArray6
                            
                            If Campo="BX_PLCONTAS"  Then Moveto [Codigo Plano_Conta] EndIf
                            If Campo="BX_CCUSTO"    Then Moveto [Codigo CCusto     ] EndIf
                            
                            If ConsultaF1()       
                               Then FAZ_PROCESSO = True 
                               Else FAZ_PROCESSO = False
                            EndIf                
        
                            Window Select JANELAR
                            WinArray6["FLOATING"]=True
                            Window SetAttributes JANELAR From WinArray6
        
                            Echo Normal
                            Echo Off
        
                            If FAZ_PROCESSO And Campo="BX_PLCONTAS"
                               Then VSDGPLCONTAS    = [Codigo Plano_Conta]
                                    VSDGNOMPLCONTAS = LTrim([Descricao Plano_Conta])
                           EndIf
                           If FAZ_PROCESSO And Campo="BX_CCUSTO"
                               Then VSDGCCUSTO  =[Codigo CCusto   ]
                                    VSDGNOMCUST = LTrim([Descricao CCusto])
                           EndIf
                           
                           RateioPC_Opcoes("Tabela_Baixa")
                           If SubStr(Upper(Table()),1,3) <> "MOV"
                              Then Moveto [Sequencia da Baixa]
                                   Locate SEQ
                                   Echo Normal
                                   Echo Off      
                           EndIf        
                           
                           Release Vars SEQ,FAZ_PROCESSO,WinArray6,JANELAR
                   EndIf
                   Moveto TAB_AUX
           EndIf
     Case Evento["KeyCode"] = "PGDN" Or  Evento["KeyCode"] = -81 : 
          Switch
            Case Campo = "TG_SEQ" And IsBlank(VSD_SEQ) : CancelDialog     
            Case Campo = "TG_BXRATEIO"                 : CancelDialog 
          EndSwitch
     Case Evento["KeyCode"] =  27 :
          Temp=False
          Switch
            Case Campo="TG_SEQ"       : If NumVal(VSD_SEQ)> 0 
                                           Then If ISAssigned(CHAVEB) 
                                                   Then If CHAVEB = 1 
                                                           Then RateioPC_Rateio("Exclusao",NumVal(NumVal(VSD_SEQ))) 
                                                        EndIf
                                                EndIf
                                        EndIf
                                        CancelDialog
            Case Campo="BX_PLCONTAS"  : Campo="TG_SEQ" 
            Case Campo="BX_CCUSTO"    : Campo="BX_PLCONTAS"
            Case Campo="TG_PORC"      : Campo="BX_CCUSTO"
            Case Campo="TG_VALOR"     : Campo="TG_PORC"
            Case Campo="TG_BXRATEIO"  : Campo="TG_SEQ"
          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"] =-147:
            Exclui_Registro=False 
            If DynArraySize(ARRAY_BXRATEIO)>0
               Then If Campo<>"TG_BXRATEIO" And (VSDGPLCONTAS <> "" Or VSDGCCUSTO <> "" Or 
                       VSDG_PORC <> BlankNum() Or VSDG_VALOR <> BlankNum()) 
                       Then EXCLUI_SEQ = VSD_SEQ
                            If NumVal(SubStr(ARRAY_BXRATEIO[NumVal(ArrayElement)],1,3)) = NumVal(ArrayElement)
                               Then Exclui_Registro=True
                            EndIf   
                       Else If Campo="TG_BXRATEIO" And DynArraySize(ARRAY_BXRATEIO) > 0
                               Then EXCLUI_SEQ = ArrayElement
                                    Exclui_Registro=True
                            EndIf
                    EndIf  
                    If Exclui_Registro And DynArraySize(ARRAY_BXRATEIO)>0
                       Then If ConfGeral("Deseja excluir o o rateio referente a sequˆncia "+StrVal(EXCLUI_SEQ)+"?")
                               Then RateioPC_Rateio("Exclusao",NumVal(EXCLUI_SEQ)) 
                                    If Campo<>"TG_BXRATEIO" Then Campo = "TG_SEQ" EndIf
                            EndIF   
                    EndIf   
          EndIf           
     Case Evento["KeyCode"] = 13:
          Temp=False
          If Checa_TAG()
             Then Switch
                    Case Campo="TG_SEQ"       : Campo="BX_PLCONTAS"    
                         VSD_SEQ = ControlValue("TG_SEQ")
                         VSDGPLCONTAS    = ""
                         VSDGNOMPLCONTAS = ""
                         VSDGCCUSTO      = ""
                         VSDGNOMCUST     = ""
                         VSDG_PORC       = BlankNum()
                         VSDG_VALOR      = BlankNum()
                         If IsBlank(VSD_SEQ)
                            Then Campo="TG_BXRATEIO"
                            Else If (NumVal(VSD_SEQ) > DynArraySize(ARRAY_BXRATEIO) + 1) Or NumVal(VSD_SEQ) = 0
                                    Then FastMsg("A proxima sequˆncia deve ser "+StrVal(DynArraySize(ARRAY_BXRATEIO)+1))
                                         Campo="TG_SEQ"
                                    Else RateioPC_Rateio("Carrega",NumVal(VSD_SEQ))     
                                 EnDIf   
                         EndIf                       
                    Case Campo="BX_PLCONTAS"  : Campo="BX_CCUSTO"
                         VSDGPLCONTAS = ControlValue("BX_PLCONTAS")
                         Switch
                           Case VSDGPLCONTAS = "" : VSDGNOMPLCONTAS=""
                                                    FastMsg("Informe o Plano de Conta!")
                                                    Campo="BX_PLCONTAS"
                           OtherWise              : GetRecord "\\Sistemas\\Ctacor\\PlContas" VSDGPLCONTAS To REG_PLCONTAS
                                                    If Not RetVal
                                                       Then Campo="BX_PLCONTAS"
                                                            VSDGNOMPLCONTAS = ""
                                                            FastMsg("Conta do Plano n„o cadastrado !")
                                                       Else VSDGNOMPLCONTAS = LTrim(REG_PLCONTAS["Descricao Plano_Conta"])
                                                            CodPlacon = [Codigo Plano_Conta]
                                                            Switch
                                                              Case REG_PLCONTAS["Tipo de Conta"] <> "A" : 
                                                                   VSDGNOMPLCONTAS = ""
                                                                   Msg = "Tipo de Conta deve ser Analitica ! // //"
                                                                   Msg = Msg + "Uma Conta pode ser Analitica ou Sintetica.//"
                                                                   Msg = Msg + "   Um lancamento pode ser efetuado somente em uma conta //"
                                                                   Msg = Msg + "Analitica. Verifique no Cadastro Plano de Contas a classificacao //"
                                                                   Msg = Msg + "do Tipo de Conta."
                                                                   Mensagem(Msg)
                                                                   Campo="BX_PLCONTAS"
                                                              Case OPERACAO_ENTSAI <> REG_PLCONTAS["TipoEntradaSaida"]                        And
                                                                   (SubStr(Upper(Table()),1,3) = "DUP" Or SubStr(Upper(Table()),1,3) = "TIT") And
                                                                   Search("BAIXA",Upper(Table()))=0                                             :
                                                                   ;Somente na cabe‡a da Duplic ou Titulos 
                                                                   If REG_PLCONTAS["TipoEntradaSaida"]="E"
                                                                      Then TIPO_AUX = "ENTRADA"
                                                                      Else TIPO_AUX = "SAIDA"
                                                                   EndIf
                                                                   VSDGNOMPLCONTAS = ""
                                                                   Msg = "Plano de Contas: "+Ltrim(Ltrim(VSDGPLCONTAS)+" "+Rtrim(VSDGNOMPLCONTAS))+" ‚ do tipo "+TIPO_AUX+"!"
                                                                   Mensagem(Msg)
                                                                   Campo="BX_PLCONTAS"
                                                            EndSwitch
                                                    EndIf
                         EndSwitch   
                    Case Campo="BX_CCUSTO"    : Campo="TG_PORC"
                         VSDGCCUSTO = ControlValue("BX_CCUSTO")
                         Switch
                           Case VSDGCCUSTO = "" : VSDGNOMCUST=""
                           OtherWise            : GetRecord "\\Sistemas\\Ctacor\\CCusto" VSDGCCUSTO To REG_CCUSTO
                                                  If Not RetVal
                                                     Then Campo="BX_CCUSTO"
                                                          VSDGNOMCUST = ""
                                                          FastMsg("Centro de Custo n„o cadastrado !")
                                                     Else VSDGNOMCUST = LTrim(REG_CCUSTO["Descricao CCusto"])
                                                          If REG_CCUSTO["Tipo de Conta"] <> "A"
                                                             Then Msg = "Tipo de Conta deve ser Analitica ! // //"
                                                                  Msg = Msg + "Uma Conta pode ser Analitica ou Sintetica.//"
                                                                  Msg = Msg + "    Um lancamento pode ser efetuado somente em uma conta //"
                                                                  Msg = Msg + "Analitica. Verifique no Cadastro Centros de Custos a classificacao //"
                                                                  Msg = Msg + "do Tipo de Conta."
                                                                  Mensagem(Msg)
                                                                  Campo="BX_CCUSTO"
                                                          Endif
                                                  EndIf    
                         EndSwitch
                    Case Campo="TG_PORC"      : Campo="TG_VALOR"
                         VSDG_PORC = ControlValue("TG_PORC")
                         If VSDG_PORC>0
                            Then VSDG_VALOR = Round((RATEIO_VRDOCTO*VSDG_PORC)/100,2)
                         EndIf   
                    Case Campo="TG_VALOR"     : Campo="TG_SEQ"
                         VSDG_VALOR = ControlValue("TG_VALOR")
                         RateioPC_Rateio("Adicao",NumVal(VSD_SEQ))
                         RefreshDialog                          
                                                                   
                    Case Campo="TG_BXRATEIO"  :
                         If DynArraySize(ARRAY_BXRATEIO)>0
                            Then Indice = ControlValue("TG_BXRATEIO")
                                 VSD_SEQ         = Indice
                                 VSDGPLCONTAS    = Ltrim(Rtrim(SubStr(ARRAY_BXRATEIO[Indice],05,13)))
                                 VSDGNOMPLCONTAS = ""
                                 VSDGCCUSTO      = Ltrim(Rtrim(SubStr(ARRAY_BXRATEIO[Indice],36,07)))
                                 VSDGNOMCUST     = ""
                                 VSDG_PORC       = Ltrim(Rtrim(SubStr(ARRAY_BXRATEIO[Indice],57,07)))
                                 VSDG_VALOR      = Ltrim(Rtrim(SubStr(ARRAY_BXRATEIO[Indice],65,10)))
                                 
                                 VSDG_PORC       = NumVal(VSDG_PORC)
                                 VSDG_VALOR      = NumVal(RateioPC_Ajusta_Valor(VSDG_VALOR))
                                 
                                 If Not VSDG_PORC>0  Then VSDG_PORC = BlankNum()  EndIf
                                 If Not VSDG_VALOR>0 Then VSDG_VALOR = BlankNum() EndIf 
                                 
                                 GetRecord "\\Sistemas\\Ctacor\\PlContas" VSDGPLCONTAS To REG_PLCONTAS
                                 If RetVal Then VSDGNOMPLCONTAS = LTrim(REG_PLCONTAS["Descricao Plano_Conta"]) EndIf
                                 GetRecord "\\Sistemas\\Ctacor\\CCusto" VSDGCCUSTO To REG_CCUSTO
                                 If RetVal Then VSDGNOMCUST = LTrim(REG_CCUSTO["Descricao CCusto"]) EndIf
                                 
                                 Campo="BX_PLCONTAS"
                            Else AcceptDialog
                         EndIf                          
                  EndSwitch
          EndIf
          RefreshDialog
   EndSwitch
EndIf

Switch
  Case Campo="TG_SEQ"       : MSG_CAMPO = "Sequencia do Rateio"    
  Case Campo="BX_PLCONTAS"  : MSG_CAMPO = "Plano de Conta" 
  Case Campo="BX_CCUSTO"    : MSG_CAMPO = "Centro de Custo"
  Case Campo="TG_PORC"      : MSG_CAMPO = "Porcentagem"
  Case Campo="TG_VALOR"     : MSG_CAMPO = "Valor"
  Case Campo="TG_BXRATEIO"  : MSG_CAMPO = "Lista de Rateio(s)"
EndSwitch  

If Campo="BX_PLCONTAS" Or Campo="BX_CCUSTO"
   Then MSGCAMPO=MSGCAMPO+", [F1]Consultar tabela"
EndIf

Monta_Prompt(MSG_CAMPO,TECLA)
Return Temp

EndProc ;RateioPC_SDDialog()

;*******************************************************************************
;* Edi‡Æo do recebimento da Ordem de Compra                                    *
;*******************************************************************************
Proc RateioPC_Digita(TIPO_RATEIO)
Private RATEIO_ANT_TAB,RATEIO_ANT_FIE 

INICIO_DIALOG  = True
RATEIO_ANT_TAB = Table()
RATEIO_ANT_FIE = Field()
VR_ARRAY       = BlankNum()
POSD           = 0

DynArray ARRAY_BXRATEIO[]
CONTA_ARRAY = 0

Switch
  Case TIPO_RATEIO = "Baixa" : RateioPC_Opcoes("Valor_Documento_Baixa_Juros_Desconto")
                               RateioPC_Opcoes("Valor_Documento_Baixa")
                               VALOR_OPERACAO = RATEIO_VRDOCTO_JURDESC
                               If RATEIO_VRDOCTO<=0 ;Or CHAVEI=1
                                  Then Return
                               EndIf                                  
                               ;TIT = "Rateio da Baixa [    ] Valor … ratear "+Ltrim(Format("W12.2,EIC",RATEIO_VRDOCTO))
                               RateioPC_Opcoes("Titulo")
                               POS_TIT = (5+Len(StrVal(RATEIO_VRDOCTO)))*-1
                               SEQ_BAIXA = [Sequencia da Baixa]
                               RateioPC_Rateio("Carrega","")
                               Dynarray WinArray7[]
                               Window Handle Dialog to JANELAB
                               Window GetAttributes JANELAB To WinArray7
                               WinArray7["FLOATING"]=False
                               Window SetAttributes JANELAB From WinArray7
  OtherWise                  : RateioPC_Opcoes("Valor_Documento_Cabeca")
                               VALOR_OPERACAO = RATEIO_VRDOCTO
                               If RATEIO_VRDOCTO<=0
                                  Then Return
                               EndIf
                               POS_TIT = 80  
                               RateioPC_Opcoes("Titulo")
                               SEQ_BAIXA = "0"
                               RateioPC_Rateio("Carrega","")   
EndSwitch   

While True
  ShowDialog TIT Proc "RateioPC_SDDialog"
  Trigger "OPEN","ARRIVE"
  Key "F1","ENTER","ESC","F9",-67,-83,
      -104, -105, -106, -107, -108, -109, -110, -111, -112, -113, -139, -140,-147,-81, -33, "F3", -61
       @ 07,10   Height 16 Width 79
       
       Accept @ -01,44+POS_TIT Width 4 "A2" Tag "I_Seq" To SEQ_BAIXA
    
       Label  @ 00,00 "Seq" for "TG_SEQ"
       Accept @ 01,01 Width 4 "A7" Picture "#*#" Tag "TG_SEQ" to VSD_SEQ
    
       Label  @ 00,05 "Plano de Conta" for "BX_PLCONTAS"
       Accept @ 01,06 Width 16 "A13" Picture "!*!" Tag "BX_PLCONTAS" to VSDGPLCONTAS
       Accept @ 01,20 Width 32 "A30" Picture "!*!" Tag "BX_NOMPLCONTAS" to VSDGNOMPLCONTAS
  
       Label  @ 02,05 "Centro de Custo" for "BX_CCUSTO"
       Accept @ 03,06 Width 16 "A13" Picture "###.###" Tag "BX_CCUSTO" to VSDGCCUSTO
       Accept @ 03,20 Width 32 "A25" Picture "!*!" Tag "BX_NOMCUST" to VSDGNOMCUST
       
       Label  @ 02,53 "%" for "TG_PORC"
       Accept @ 03,53 Width 8 "N" Picture "#*#.[####]" Tag "TG_PORC" to VSDG_PORC
  
       Label  @ 02,62 "Valor" for "TG_VALOR"
       Accept @ 03,62 Width 13 "$" Picture "#*#.[##]" Tag "TG_VALOR" to VSDG_VALOR
      
       Frame Single From 04,00 to 13,76
       @ 04,01 ?? " Rateios "
       @ 05,01 ?? "Seq  Plano Conta                    Centro Custo             %       Valor"
  
       PickDynArray @06,01 Height 4 width 75
         Columns 1
          ARRAY_BXRATEIO
           Tag "TG_BXRATEIO"
            To ARRAYELEMENT    
       
       @ 10,63 ?? Format("W12,AR",VR_ARRAY)
       @ 11,42 ?? "Valor do Lan‡amento: "+Format("W12,AR",Format("W12.2,EIC",RATEIO_VRDOCTO))
       @ 12,42 ?? "Valor da Opera‡Æo..: "+Format("W12,AR",Format("W12.2,EIC",VALOR_OPERACAO))
       
       PaintCanvas Attribute 26 11,0,11,76
       PaintCanvas Attribute 26 12,0,12,76
                        
       EndDialog
       
       If RateioPC_Verifica(TIPO_RATEIO)
          Then QuitLoop
          Else INICIO_DIALOG=True     
       EndIf   
EndWhile     

If TIPO_RATEIO = "Baixa"
   Then Window Select JANELAB
        WinArray7["FLOATING"]=True
        Window SetAttributes JANELAB From WinArray7

        Echo Normal
        Echo Off

        RateioPC_Opcoes("Tabela_Baixa")
        Moveto [Sequencia da Baixa]
        Locate SEQ_BAIXA
        
        RateioPC_MovCont("Exclusao")
        
        LANCTO_RATEIO = [Lancamento Conta Corrente]
        RateioPC_MovCont("Adicao")
        
   Else RateioPC_Opcoes("Tabela_Cabeca")
        Moveto RATEIO_ANT_TAB
        Moveto Field RATEIO_ANT_FIE 
EndIf

Release Vars TIPO_RATEIO,RATEIO_ANT_TAB,RATEIO_ANT_FIE,ARRAYELEMENT,ARRAY_BXRATEIO,VSDGFLAG,VSDGFLAG2,indice,JANELAB,WinArray7,SEQ_BAIXA             
  
EndProc ;RateioPC_Digita()

;*******************************************************************************
;* Rotina Principal                                                            *
;*******************************************************************************
proc RateioPC(tp)
private tp

PARAM_FT_RAT = tp

If Not IsAssigned(TIPO_RATEIO) Then TIPO_RATEIO  = "" EndIf 
RateioPC_Opcoes("Numero_Lancamento")

;Rotina para setar o tipo de movimento, se ‚ entrada ou saida
RateioPC_Opcoes("Seta_Operacao")
RateioPC_Opcoes("PlConta_Principal_Cabeca")
Switch
  Case PARAM_FT_RAT = "DIGITA_RATEIO_CABECA"       : RateioPC_Digita("Cabeca")

  Case PARAM_FT_RAT = "DIGITA_RATEIO_BAIXA"        : RateioPC_Digita("Baixa")

  Case PARAM_FT_RAT = "RATEIO_EXCLUSAO"            : RateioPC_Rateio("Exclusao","")

  Case PARAM_FT_RAT = "VERIFICA_RATEIO_CABECA"     : If RateioPC_Verifica("Cabeca")
                                                        Then PARAM_FT_RAT = "1"
                                                        Else PARAM_FT_RAT = "0"
                                                     EndIf

  Case PARAM_FT_RAT = "VERIFICA_RATEIO_BAIXA"      : If RateioPC_Verifica("Baixa")
                                                        Then PARAM_FT_RAT = "1"
                                                        Else PARAM_FT_RAT = "0"
                                                     EndIf

  Case PARAM_FT_RAT = "VERIFICA_UTILIZACAO_RATEIO" : RateioPC_Verifica_Utilizacao("BAIXA")

  Case PARAM_FT_RAT = "ARRAY_CRIA_RATEIO"          : RateioPC_Array("Cria_Array","")

  Case PARAM_FT_RAT = "ARRAY_RATEIO"               : RateioPC_Array("",i)

  Case PARAM_FT_RAT = "RATEIO_MOVCONT_EXCLUSAO"    : RateioPC_MovCont("Exclusao")

  Case PARAM_FT_RAT = "RATEIO_MOVCONT_ADICAO"      : RateioPC_MovCont("Adicao")

  Case PARAM_FT_RAT = "ATUALIZA RATEIO DA BAIXA"   : If RateioPC_Atualiza()
                                                        Then PARAM_FT_RAT = "1"
                                                        Else PARAM_FT_RAT = "0"
                                                     EndIf    
  Case PARAM_FT_RAT = "ADICIONA_RATEIO_CABECA"     : If Verifica_Plano_Conta_Automatico()
                                                        Then RateioPC_PrimeiroRateio("CABECA")
                                                     EndIf
  Case PARAM_FT_RAT = "ADICIONA_RATEIO_BAIXA"      : If Verifica_Plano_Conta_Automatico()
                                                        Then RateioPC_PrimeiroRateio("BAIXA")
                                                     EndIf                               
  Case PARAM_FT_RAT = "PLANO_CONTA_AUTOMATICO"     : If Verifica_Plano_Conta_Automatico()
                                                        Then PARAM_FT_RAT = "1"
                                                        Else PARAM_FT_RAT = "0"
                                                     EndIf
EndSwitch

EndProc

;******************************************************************************
;* Monta Procedures                                                           *
;******************************************************************************
WriteLib "\\Sistemas\\Ctacor\\Bib_Rat"
         RateioPC,
         RateioPC_Digita, RateioPC_SDDialog, RateioPC_Opcoes, RateioPC_Verifica,
         RateioPC_Verifica_Utilizacao, RateioPC_Array, RateioPC_Rateio, RateioPC_Atualiza,
         RateioPC_MovCont, RateioPC_Ajusta_Valor,RateioPC_PrimeiroRateio,Verifica_Plano_Conta_Automatico,
         Calcular_PlConta_Automatico,Adiciona_Rateio,GetRecord_Parametros_PCXBCO,
         Rateio_Baixa_Automatica,Adiciona_Rateio_BxCxAuto
