Identificador de Regra
TES-606ACTPM01
Módulo: TES - Tesouraria
Finalidade: O objetivo desse identificador é permitir o cálculo das atualizações dos contratos de aplicação diretamente através de regra, oferecendo uma forma alternativa à embarcada no ERP por meio da tela F606ACT.
Características: Existe uma hierarquia de execução da regra, na qual o campo de regra de cálculo do contrato de aplicação tem prioridade sobre a regra ligada ao identificador. Sendo assim, se existir regra informada no cadastro do identificador e regra ligada no cadastro do contrato, a regra do contrato será a executada, pois tem prioridade sobre a ligada ao identificador.
Na regra constam todos os campos das tabelas Financeiro-Aplicação\Captação Recursos - Cadastro (E606CCR) e Financeiro-Cálculo Contratos Aplicação\Captação Recursos (E606CAC), porém nenhum campo retornará alteração para o sistema. A partir desses dados é possível buscar qualquer informação relacionada ao contrato, tais como itens do cálculo do contrato, impostos incidentes etc.
Uma lista com os registros das atualizações também está disponível na regra através de um ponteiro de memória. Essa lista possui campos da tabela Financeiro-Aplicação\Captação Recursos-Atualização Diária (E606ACD), além de alguns campos que são utilizados na guia Cálculo da tela F606ACT. A lista de campos está detalhada abaixo, na tabela de variáveis disponíveis na regra.
A lista de atualizações chega na regra sem nenhum registro e deverá ser alimentada de acordo com o cálculo a ser realizado e os campos disponíveis, para retornar à rotina as atualizações e impostos conforme necessidade do cliente.
ListaRegraPrimeiro(CcrNLista, A_S_N);
ListaRegraProximo(CcrNLista, A_S_N);
ListaRegraAnterior(CcrNLista, A_S_N);
ListaRegraUltimo(CcrNLista, A_S_N);
ListaRegraInicio(CcrNLista, A_S_N);
ListaRegrafim(CcrNLista, A_S_N);
ListaRegraObterValorAlfa(CcrNLista, "TipPre", aTipPre, A_S_N);
ListaRegraObterValorNumero(CcrNLista, "SeqPre", aSeqPre, A_S_N);
ListaRegraObterValorData(CcrNLista, "DatPre", aDatPre, A_S_N);
ListaRegraProcurarAfa(CcrNLista, "TipPre", aTipPre, A_S_N);
ListaRegraProcurarNumero(CcrNLista, "SeqPre", aSeqPre, A_S_N);
ListaRegraProcurarData(CcrNLista, "DatPre", aDatPre, A_S_N);
ListaRegraProcurarRegistro(CcrNLista, A_S_N);
ListaRegraTotalLinhas(CcrNLista, VenATotalLinha);
ListaRegraAddValorLinhaAlfa(CcrNLista, 'TipPre', aTipPre, A_S_N);
ListaRegraAddValorLinhaNumero(CcrNLista, 'SeqPre', aSeqPre, A_S_N);
ListaRegraAddValorLinhaData(CcrNLista, 'DatPre', aDatPre, A_S_N);
ListaRegraInicializarProcurar(CcrNLista, A_S_N);
ListaRegraAddProcurarAlfa(CcrNLista, 'TipPre', aTipPre, A_S_N);
ListaRegraAddProcurarNumero(CcrNLista, 'SeqPre', aSeqPre, A_S_N);
ListaRegraAddProcurarData(CcrNLista, 'DatPre', aDatPre, A_S_N);
ListaRegraNovaLinha(CcrNLista);
ListaRegraSalvarLinha(CcrNLista);
ListaRegraExcluirLinha(CcrNLista);
ListaRegraSalvarLista(CcrNLista, "C:
ListaRegraEmInclusao(CcrNLista, A_S_N);
ListaRegraPosicaoAtual(CcrNLista, VenMPosicaoAtual);
ListaRegraPodeExcluir(CcrNLista, A_S_N);
ListaRegraPodeAlterar(CcrNLista, A_S_N);
ListaRegraPodeIncluir(CcrNLista, A_S_N);
ListaRegraProcurarProximo(CcrNLista, A_S_N);
ListaRegraProcurarAnterior(CcrNLista, A_S_N);
ListaRegraIrPara(CcrNLista, 3, A_S_N);
ListaRegraAlterarLinhaAlfa(CcrNLista, 'TipPre', aTipPre, A_S_N);
ListaRegraAlterarLinhaNumero(CcrNLista, 'SeqPre', aSeqPre, A_S_N);
ListaRegraAlterarLinhaData(CcrNLista, 'DatPre', aDatPre, A_S_N).
Tela: F606ACT
Nome | Tipo | Observações | Retorna Valor |
---|---|---|---|
VarDDatBas | Data | Receberá a data base para cálculo das atualizações. | N |
VarDDatRes | Data | Caso a regra seja chamada pela tela de resgate, receberá a data de resgate. | N |
VarNVlrRes | Número | Caso a regra seja chamada pela tela de resgate, receberá o valor do resgate. | N |
CcrNLista | Número | Endereço da lista em memória (ver tabela abaixo). | S |
Nome | Tipo | Observações |
---|---|---|
TipPar | Alfa | Caracter A, R, C, I ou O conforme tipo de atualização (verificar legenda após tabela) |
VctCal | Data | Data da atualização do cálculo |
HisCal | Alfa | Histórico apresentado em tela (gravado no movimento se houver) |
VlrCalDia | Número | Valor da atualização por dia |
VlrCal | Número | Valor da atualização no período |
UltDia | Número | Indicativo se trata-se de atualização para último dia do período/competência para geração de movimentação (0 ou 1) |
VlrSal | Número | Valor do saldo após atualização |
VlrCalCot | Número | Valor atualizado por cota |
VlrInd | Número | Valor do índice |
SeqCal | Número | Sequencia do calculo de atualização |
IrrCom | Número | Come cotas da atualização |
DiaAni | Número | Indicativo se trata-se de atualização de dia do aniversário para geração de movimentação (0 ou 1) |
VlrBas | Número | Valor base da atualização |
DatBas | Data | Data base da atualização |
CotInd | Número | Índice das cotas |
VlrPtr | Número | Valor patrimonial |
QtdCot | Número | Quantidade de cotas |
VlrRent | Número | Rentabilidade do fundo |
Legenda do campo TIPPAR:
- A - Atualizações - Atualizações/Provisões diárias da aplicação;
- R - Rendimentos - Se tiver um resgate;
- C - Valorização da cota - Atualizações das cotas a partir da Data Base;
- I - IR - Atualização de IR;
- O - IOF - Atualização de IOF.
Exemplo de regra com o cálculo das atualizações:
As regras abaixo são exemplos e não fazem parte do produto padrão. Cada cliente deve adequar a regra conforme sua necessidade.
@ *********************** Declarações ************************************** @
@ Lista de atualizações a serem pagas @
Definir Numero CcrNLista;
@ Variável global utilizada para verificar se a execução dos métodos ocorreu com sucesso @
Definir Alfa A_S_N;
@ Data base para a atualização do cálculo @
Definir Data VarDDatBas;
@ Variáveis globais @
Definir Numero nCodEmp; @ Empresa do contrato @
Definir Numero nQtdAtuGeradas; @ Quantidade de atualizações do contrato @
Definir Data dUltAtu; @ data até onde foi realizada a última atualização @
Definir Numero nVlrSal; @ Valor do saldo do montante a cada atualização @
Definir Numero nDiaAtu; @ Dia... @
Definir Numero nMesAtu; @ Mês... @
Definir Numero nAnoAtu; @ e Ano temporários para cálculo @
Definir Data dCalAtu; @ Data da atualização atual @
Definir Numero nAtuDia; @ Valor da atualização por dia @
Definir Numero nAtuAcu; @ Valor acumulado das atualizações @
Definir Numero nVlrAtu; @ Valor da atualização no período @
Definir Alfa aTipPar; @ Tipo de cálculo a ser inserido @
Definir Alfa aHisCal; @ Histórico do cálculo a ser inserido @
@ Cursores e listas @
Definir Lista lis_ItemCalculo; @ Lista dos itens de cálculo do contrato @
Definir Lista lis_Atualizacoes; @ Lista que guarda as atualizações do contrato @
Definir Lista lis_Tributacao; @ Lista que guarda as tributações do contrato @
@ Funções @
Definir Funcao Inicializar();
Definir Funcao InicializarListas();
Definir Funcao GerarAtualizacoes();
Definir Funcao InserirAtualizacaoLista();
Definir Funcao InserirImpostosLista();
Definir Funcao Finalizar();
@ *********************** Implementações ************************************** @
@ Método principal @
Inicializar();
GerarAtualizacoes();
Finalizar();
@ Inicializar lista de sequências de cálculo do contrato, lista de atualizações e de tributações @
Funcao InicializarListas(); {
lis_ItemCalculo.DefinirCampos();
lis_ItemCalculo.AdicionarCampo("SEQCAL", Numero); @ Sequência do cálculo @
lis_ItemCalculo.AdicionarCampo("TIPCAL", Alfa); @ Tipo do cálculo (V-Valor, D-Índice, P-Percentual (taxa fixa), H-Hora) @
lis_ItemCalculo.AdicionarCampo("CODMOE", Alfa); @ Moeda/Índice do cálculo caso seja do tipo "D" @
lis_ItemCalculo.AdicionarCampo("VALPER", Numero); @ Valor/Percentual conforme tipo @
lis_ItemCalculo.EfetivarCampos();
lis_Atualizacoes.DefinirCampos();
lis_Atualizacoes.AdicionarCampo("SEQCAL", Numero); @ Sequência do cálculo @
lis_Atualizacoes.AdicionarCampo("TIPPAR", Alfa); @ Indica o tipo do registro @
@ A - Atualizações - Atualizações diárias da aplicação - Provisões - Baseados na Data base @
@ R - Rendimentos - Se tiver um resgate (Data de resgate) @
@ C - Valorização da cota - Se tiver cota vai ser usado - Atualizações das cotas - Baseados na Data Base @
@ I - IR \ @
@ O - IOF --> Gerados com base na E606PBT, acessando a tabela de impostos E049TTR para verificar aliquotas e isensões @
lis_Atualizacoes.AdicionarCampo("VCTCAL", Data); @ Data do cálculo @
lis_Atualizacoes.AdicionarCampo("DIACAL", Numero); @ Dia... @
lis_Atualizacoes.AdicionarCampo("MESCAL", Numero); @ Mês... @
lis_Atualizacoes.AdicionarCampo("ANOCAL", Numero); @ E ano do cálculo @
lis_Atualizacoes.AdicionarCampo("HISCAL", Alfa); @ Descrição do cálculo @
lis_Atualizacoes.AdicionarCampo("ULTDIA", Numero); @ Último dia útil do mês / 0 - Falso, 1 - Verdadeiro @
lis_Atualizacoes.EfetivarCampos();
lis_Tributacao.DefinirCampos();
lis_Tributacao.AdicionarCampo("CODIMP", Alfa); @ Código do imposto @
lis_Tributacao.AdicionarCampo("TIPTRI", Numero); @ 1 - Tabela progressiva (Valor), 2 - Tabela Regressiva (Dias), 3 - Percentual Fixo @
lis_Tributacao.EfetivarCampos();
}
Funcao GerarAtualizacoes(); {
Definir Numero nCotAtu; @ Cotação do índice da data atual de atualização @
Definir Alfa aCodMoe; @ Código da moeda @
Definir Numero nTemCalculo; @ Variável para controlar looping de cálculos para cada atualização @
Definir Numero nTemAtualizacao; @ Variável para controlar looping das atualizações a serem geradas @
Definir Numero nQtdDia; @ Quantidade de dias úteis do período @
Definir Numero nVlrLoc; @ Guarda localmente o valor do saldo aplicado @
Definir Numero nJrsLoc; @ Variável local para guardar os juros calculados em cada passagem da repetição do cálculo @
Definir Data dDatAnt; @ Guarda última data base utilizada @
nQtdAtuGeradas = 0;
nTemAtualizacao = lis_Atualizacoes.Primeiro();
@ Inicializa cotações para atualizações com indice @
nCotAtu = 0;
dDatAnt = dUltAtu;
nVlrLoc = nVlrSal;
@ Inicialização do valor acumulado @
nAtuAcu = 0;
Enquanto (nTemAtualizacao = 1) {
@ Posicionar no primeiro item de cálculo do contrato @
nTemCalculo = lis_ItemCalculo.Primeiro();
nQtdAtuGeradas = nQtdAtuGeradas + 1;
@ Atualiza a data atual de calculo com a data da atualização corrente @
dCalAtu = lis_Atualizacoes.VCTCAL;
@ Verificar quantidade de dias úteis entre data da atualização e a última data usada como base (dDatAnt) @
RetornarDiasUteisPeriodo(dDatAnt, dCalAtu, nQtdDia);
@ Atualiza variáveis dia, mes e ano com data atual @
DesMontaData(dCalAtu, nDiaAtu, nMesAtu, nAnoAtu);
nJrsLoc = 0;
nAtuDia = 0;
Enquanto (nTemCalculo = 1) { @ Enquanto tiver item de cálculo @
se (lis_ItemCalculo.TIPCAL = "D") { @ Buscar índice da data, aplicar índice no valor @
aCodMoe = lis_ItemCalculo.CODMOE;
@ F = P.(1 + i)^n @
MMBuscaCotacaoMoeda(aCodMoe, dCalAtu, 0, nCotAtu);
nAtuDia = (nVlrLoc * nCotAtu) - nVlrLoc;
Potencia(nCotAtu, nQtdDia, nJrsLoc);
nVlrAtu = (nVlrLoc * nJrsLoc) - nVlrLoc;
nAtuAcu = nAtuAcu + nVlrAtu;
nVlrLoc = nVlrLoc + nVlrAtu;
}
senao se (lis_ItemCalculo.TIPCAL = "P") { @ aplicar taxa fixa @
@ Caso exista taxa fixa no cálculo de atualização do contrato, implementar a regra de atualização aqui @
}
nTemCalculo = lis_ItemCalculo.Proximo();
dDatAnt = lis_Atualizacoes.VCTCAL;
}
aTipPar = lis_Atualizacoes.TIPPAR;
aHisCal = lis_Atualizacoes.HISCAL;
InserirAtualizacaoLista();
InserirImpostosLista();
nTemAtualizacao = lis_Atualizacoes.Proximo();
}
}
Funcao InserirAtualizacaoLista(); {
ListaRegraPodeIncluir(CcrNLista, A_S_N); @ Verifica se tem permissão para incluir @
se (A_S_N = "S") {
ListaRegraNovaLinha(CcrNLista); @ Prepara lista para inclusão de uma nova linha. Deve ser chamado sempre que for usar os métodos incluir as colunas. @
ListaRegraEmInclusao(CcrNLista, A_S_N); @ Verifica situação da lista. @
se (A_S_N = "S") {
ListaRegraAddValorLinhaAlfa(CcrNLista, "TipPar", aTipPar , A_S_N); @ Caracter conforme o item que deve ser inserido (A, R, C, I, O) @
ListaRegraAddValorLinhaData(CcrNLista, "VctCal", dCalAtu, A_S_N);
ListaRegraAddValorLinhaAlfa(CcrNLista, "HisCal" ,aHisCal, A_S_N);
ListaRegraAddValorLinhaNumero(CcrNLista, "VlrCalDia", nAtuDia, A_S_N);
ListaRegraAddValorLinhaNumero(CcrNLista, "VlrCal", nAtuAcu, A_S_N);
ListaRegraAddValorLinhaNumero(CcrNLista, "UltDia", 1, A_S_N);
ListaRegraAddValorLinhaNumero(CcrNLista, "VlrSal", nVlrLoc, A_S_N);
ListaRegraSalvarLinha(CcrNLista); @Salva a linha na lista@
}
}
}
Funcao InserirImpostosLista(); {
Definir Numero nTemTributacao; @ Variável para controlar looping ddos tributos @
Definir Numero nPerImp; @ Percentual da aliquota do imposto @
Definir Alfa aTipImp; @ Tipo de registro dependendo do imposto @
Definir Data dDatCpt; @ Data competência para verificação do imposto a ser buscado @
Definir Alfa aCodImp; @ Código do imposto @
Definir Cursor Cur_E049TTR; @ Cursor para verificar informações do imposto @
Definir Cursor Cur_E051IMP; @ Cursor para ver o tipo do imposto @
nTemTributacao = lis_Tributacao.Primeiro();
Enquanto (nTemTributacao = 1) {
nPerImp = 0;
MontaData(1, nMesAtu, nAnoAtu, dDatCpt);
aCodImp = lis_Tributacao.CODIMP;
se (lis_Tributacao.TIPTRI = 3) { @ Taxa fixa que pode estar em um campo de usuário ou o valor fixo do imposto na tabela E049TTR @
Cur_E049TTR.SQL "SELECT DATCPT, PERIMP FROM E049TTR WHERE CODEMP = :NCODEMP AND CODIMP = :ACODIMP AND \
DATCPT = (SELECT MAX(DATCPT) FROM E049TTR WHERE CODEMP = :NCODEMP AND CODIMP = :ACODIMP AND DATCPT <= :DDATCPT)";
Cur_E049TTR.AbrirCursor();
se (Cur_E049TTR.Achou) {
nPerImp = Cur_E049TTR.PERIMP;
}
Cur_E049TTR.FecharCursor();
@ Se for tipo 1, deve-se verificar a tabela progressiva (valor) fazendo cursor na tabela E049TTR @
@ Se for tipo 2, deve-se verificar a tabela regressiva (dias) fazendo cursor na tabela E049TTR @
}
se (nPerImp > 0) {
Cur_E051IMP.SQL "SELECT TIPIMP FROM E051IMP WHERE CODIMP = :ACODIMP";
Cur_E051IMP.AbrirCursor();
aTipImp = " ";
se (Cur_E051IMP.Achou) {
se (Cur_E051IMP.TIPIMP = 11)
aTipImp = "I";
senao se (Cur_E051IMP.TIPIMP = 32)
aTipImp = "O";
}
ListaRegraPodeIncluir(CcrNLista, A_S_N); @ Verifica se tem permissão para incluir @
se ((A_S_N = "S") e (aTipImp <> " ")) {
ListaRegraNovaLinha(CcrNLista); @ Prepara lista para inclusão de uma nova linha. Deve ser chamado sempre que for usar os métodos incluir as colunas. @
ListaRegraEmInclusao(CcrNLista, A_S_N); @ Verifica situação da lista. @
se (A_S_N = "S") {
ListaRegraAddValorLinhaAlfa(CcrNLista, "TipPar", aTipImp , A_S_N); @ Caracter conforme o item que deve ser inserido (A, R, C, I, O) @
ListaRegraAddValorLinhaData(CcrNLista, "VctCal", dCalAtu, A_S_N);
ListaRegraAddValorLinhaAlfa(CcrNLista, "HisCal" ,"Cálculo do imposto", A_S_N);
nVlrCalImp = ((nVlrAtu*nPerImp)/100);
ListaRegraAddValorLinhaNumero(CcrNLista, "VlrCalDia", nVlrCalImp, A_S_N);
nAtuAcuImp = ((nAtuAcu*nPerImp)/100);
ListaRegraAddValorLinhaNumero(CcrNLista, "VlrCal", nAtuAcuImp, A_S_N);
ListaRegraAddValorLinhaNumero(CcrNLista, "UltDia", 1, A_S_N);
ListaRegraAddValorLinhaNumero(CcrNLista, "VlrSal", nVlrLoc-nAtuAcuImp, A_S_N);
ListaRegraSalvarLinha(CcrNLista); @Salva a linha na lista@
}
}
}
nTemTributacao = lis_Tributacao.Proximo();
}
}
@ Inicialização das listas e variáveis @
Funcao Inicializar(); {
Definir Cursor Cur_E606ICC; @ Cursor para selecionar os itens de cálculo do contrato @
Definir Cursor Cur_E606PBT; @ Cursor para selecionar os tributos do produto bancário @
Definir Data dDatTra;
Definir Data dDatFim;
nQtdAtuGeradas = 0;
@ Verificar dados do contrato @
Se (E606CCR.NumCcr > 0) {
nCodEmp = E606CCR.CodEmp; @ Empresa do contrato @
@ Pega última data de atualização do cálculo se existir @
Se (E606CCR.UltLan > 0)
dUltAtu = E606CCR.UltLan;
Senao
dUltAtu = E606CCR.DatCcr;
Se (E606CCR.VlrCat > 0)
nVlrSal = E606CCR.VlrCat;
senao
nVlrSal = E606CCR.VlrCcr; @ Valor do contrato @
@ Verificar dados do cálculo @
Se (E606CCR.CodCac > 0) {
nCodCac = E606CCR.CodCac;
InicializarListas();
@ Selecionar itens do cálculo do contrato @
Cur_E606ICC.Sql "SELECT SEQICC,TIPCAL,CODMOE,VLRCAL FROM E606ICC WHERE CODEMP = :NCODEMP AND CODCAC = :NCODCAC ORDER BY SEQICC";
Cur_E606ICC.AbrirCursor();
@ Alimenta lista dos cálculos do contrato @
Enquanto (Cur_E606ICC.Achou) {
lis_ItemCalculo.Adicionar();
lis_ItemCalculo.SEQCAL = Cur_E606ICC.SeqIcc; @ Sequência de cálculo do contrato @
lis_ItemCalculo.TIPCAL = Cur_E606ICC.TipCal; @ Tipo de cálculo da sequência do contrato @
lis_ItemCalculo.CODMOE = Cur_E606ICC.CodMoe; @ Código da moeda da seqüência de cálculo do contrato @
lis_ItemCalculo.VALPER = Cur_E606ICC.VlrCal; @ Valor/Percentual da sequência de cálculo do contrato @
lis_ItemCalculo.Gravar();
Cur_E606ICC.Proximo();
}
Cur_E606ICC.FecharCursor();
@ Selecionar tributos ligados ao produto bancário do contrato @
nCodPbc = E606CCR.CodPbc;
Cur_E606PBT.Sql "SELECT CODIMP,TIPTRI,SEQTRI FROM E606PBT WHERE CODEMP = :NCODEMP AND CODPBC = :NCODPBC ORDER BY SEQTRI";
Cur_E606PBT.AbrirCursor();
@ Alimenta lista dos tributos @
Enquanto (Cur_E606PBT.Achou) {
lis_Tributacao.Adicionar();
lis_Tributacao.CODIMP = Cur_E606PBT.CodImp; @ Código do imposto @
lis_Tributacao.TIPTRI = Cur_E606PBT.TipTri; @ Tipo da tributação @
lis_Tributacao.Gravar();
Cur_E606PBT.Proximo();
}
Cur_E606PBT.FecharCursor();
@ O padrão neste exemplo é de atualizações mensais, até chegar a data base. Mas o offset de meses pode ser trabalhado ou até não existir e a atualização ser por dia util @
nMesOffset = 1;
dDatTra = dUltAtu;
dDatFim = VarDDatBas;
Definir Numero nCepFil; @ Armazenar o CEP padrão para verificação de dia útil @
nCepFil = 89012170; @ Este CEP pode ser o da Matriz do cliente, o do banco, etc. @
@ Alimenta a lista de atualizações conforme dados do contrato @
Enquanto (dDatTra < dDatFim) {
nQtdAtuGeradas = nQtdAtuGeradas + 1;
lis_Atualizacoes.Adicionar();
lis_Atualizacoes.SEQCAL = nQtdAtuGeradas; @ Sequência do cálculo @
lis_Atualizacoes.TIPPAR = "A"; @ Tipo Atualização @
@ A - Atualizações - Atualizações diárias da aplicação - Provisões - Baseados na Data base @
UltimoDia(dDatTra);
Se (dDatTra >= dDatFim) { @ Se a data trabalhada for maior ou igual a data final para atualização chegamos a data base @
lis_Atualizacoes.VCTCAL = dDatFim; @ Atribui a dDatFim, que é a data base @
dDatTra = dDatFim;
}
Senao {
VerificaDiaUtil(dDatTra, nCepFil, 0 @opção 0 antecipa a data se a data passada não for dia util@, dDatTra);
lis_Atualizacoes.VCTCAL = dDatTra;
}
DesmontaData(dDatTra, nDia, nMes, nAno);
lis_Atualizacoes.DIACAL = nDia;
lis_Atualizacoes.MESCAL = nMes;
lis_Atualizacoes.ANOCAL = nAno;
lis_Atualizacoes.HISCAL = "Atualização via regra"; @ Descrição do cálculo @
lis_Atualizacoes.ULTDIA = 1; @ 1 indica último dia da competência (data base é o campo DiaAni), ou seja, gera movimentação de tesouraria @
lis_Atualizacoes.Gravar();
SomarMesesDataRef(dDatTra, nMesOffset, 2 @opção 2 retorna o primeiro dia do mês@ , dDatTra);
}
}
Senao
mensagem(erro, "Cálculo do contrato não informado no contrato.");
MMCria();
}
senao
mensagem(erro, "Contrato não carregado para a regra.");
}
@ Finalização dos objetos @
Funcao Finalizar(); {
MMLibera();
}
@ *********************** Declarações ************************************** @
@ Lista de atualizações a serem pagas @
Definir Numero CcrNLista;
@ Variável global utilizada para verificar se a execução dos métodos ocorreu com sucesso @
Definir Alfa A_S_N;
@ Data base para a atualização do cálculo @
Definir Data VarDDatBas;
@ Variáveis globais @
Definir Numero nCodEmp; @ Empresa do contrato @
Definir Numero nQtdAtuGeradas; @ Quantidade de atualizações do contrato @
Definir Data dUltAtu; @ data até onde foi realizada a última atualização @
Definir Numero nVlrSal; @ Valor do saldo do montante a cada atualização @
Definir Numero nDiaAtu; @ Dia... @
Definir Numero nMesAtu; @ Mês... @
Definir Numero nAnoAtu; @ e Ano temporários para cálculo @
Definir Data dCalAtu; @ Data da atualização atual @
Definir Numero nAtuDia; @ Valor da atualização por dia @
Definir Numero nAtuAcu; @ Valor acumulado das atualizações @
Definir Numero nVlrAtu; @ Valor da atualização no período @
Definir Alfa aTipPar; @ Tipo de cálculo a ser inserido @
Definir Alfa aHisCal; @ Histórico do cálculo a ser inserido @
@ Cursores e listas @
Definir Lista lis_ItemCalculo; @ Lista dos itens de cálculo do contrato @
Definir Lista lis_Atualizacoes; @ Lista que guarda as atualizações do contrato @
Definir Lista lis_Tributacao; @ Lista que guarda as tributações do contrato @
@ Funções @
Definir Funcao Inicializar();
Definir Funcao InicializarListas();
Definir Funcao GerarAtualizacoes();
Definir Funcao InserirAtualizacaoLista();
Definir Funcao InserirImpostosLista();
Definir Funcao Finalizar();
@ *********************** Implementações ************************************** @
@ Método principal @
Inicializar();
GerarAtualizacoes();
Finalizar();
@ Inicializar lista de sequências de cálculo do contrato, lista de atualizações e de tributações @
Funcao InicializarListas(); {
lis_ItemCalculo.DefinirCampos();
lis_ItemCalculo.AdicionarCampo("SEQCAL", Numero); @ Sequência do cálculo @
lis_ItemCalculo.AdicionarCampo("TIPCAL", Alfa); @ Tipo do cálculo (V-Valor, D-Índice, P-Percentual (taxa fixa), H-Hora) @
lis_ItemCalculo.AdicionarCampo("CODMOE", Alfa); @ Moeda/Índice do cálculo caso seja do tipo "D" @
lis_ItemCalculo.AdicionarCampo("VALPER", Numero); @ Valor/Percentual conforme tipo @
lis_ItemCalculo.EfetivarCampos();
lis_Atualizacoes.DefinirCampos();
lis_Atualizacoes.AdicionarCampo("SEQCAL", Numero); @ Sequência do cálculo @
lis_Atualizacoes.AdicionarCampo("TIPPAR", Alfa); @ Indica o tipo do registro @
@ A - Atualizações - Atualizações diárias da aplicação - Provisões - Baseados na Data base @
@ R - Rendimentos - Se tiver um resgate (Data de resgate) @
@ C - Valorização da cota - Se tiver cota vai ser usado - Atualizações das cotas - Baseados na Data Base @
@ I - IR \ @
@ O - IOF --> Gerados com base na E606PBT, acessando a tabela de impostos E049TTR para verificar aliquotas e isensões @
lis_Atualizacoes.AdicionarCampo("VCTCAL", Data); @ Data do cálculo @
lis_Atualizacoes.AdicionarCampo("DIACAL", Numero); @ Dia... @
lis_Atualizacoes.AdicionarCampo("MESCAL", Numero); @ Mês... @
lis_Atualizacoes.AdicionarCampo("ANOCAL", Numero); @ E ano do cálculo @
lis_Atualizacoes.AdicionarCampo("HISCAL", Alfa); @ Descrição do cálculo @
lis_Atualizacoes.AdicionarCampo("ULTDIA", Numero); @ Último dia útil do mês / 0 - Falso, 1 - Verdadeiro @
lis_Atualizacoes.EfetivarCampos();
lis_Tributacao.DefinirCampos();
lis_Tributacao.AdicionarCampo("CODIMP", Alfa); @ Código do imposto @
lis_Tributacao.AdicionarCampo("TIPTRI", Numero); @ 1 - Tabela progressiva (Valor), 2 - Tabela Regressiva (Dias), 3 - Percentual Fixo @
lis_Tributacao.EfetivarCampos();
}
Funcao GerarAtualizacoes(); {
Definir Numero nCotAtu; @ Cotação do índice da data atual de atualização @
Definir Alfa aCodMoe; @ Código da moeda @
Definir Alfa aCodMoeCot; @ Código do índice que atualizará as cotas @
Definir Numero nCodMoeCot; @ indicativo numérico se existe um código de índice para as cotas @
Definir Numero nQtdCot; @ Quantidade de cotas do contrato @
Definir Numero nTemCalculo; @ Variável para controlar looping de cálculos para cada atualização @
Definir Numero nTemAtualizacao; @ Variável para controlar looping das atualizações a serem geradas @
Definir Numero nQtdDia; @ Quantidade de dias úteis do período @
Definir Numero nVlrLoc; @ Guarda localmente o valor do saldo aplicado @
Definir Numero nJrsLoc; @ Variável local para guardar os juros calculados em cada passagem da repetição do cálculo @
Definir Data dDatAnt; @ Guarda última data base utilizada @
nQtdAtuGeradas = 0;
nTemAtualizacao = lis_Atualizacoes.Primeiro();
@ Atribui o índice para atualização de cotas caso exista @
aCodMoeCot = E606CCR.IndCot;
EstaNulo(aCodMoeCot, nCodMoeCot);
@ Inicializa data e valor @
dDatAnt = dUltAtu;
nVlrLoc = nVlrSal;
@ Atribui a quantidade de cotas caso exista @
se ((E606CCR.VlrCat > 0) e (E606CCR.QtdCot > 0)) {
MMBuscaCotacaoMoeda(aCodMoeCot, dDatAnt, 0, nCotAtu);
nQtdCot = nVlrSal / nCotAtu;
}
senao
nQtdCot = E606CCR.QtdCot;
@ Inicializa cotações para atualizações com indice @
nCotAtu = 0;
@ Inicialização do valor acumulado @
nAtuAcu = 0;
Enquanto (nTemAtualizacao = 1) {
@ Posicionar no primeiro item de cálculo do contrato @
nTemCalculo = lis_ItemCalculo.Primeiro();
nQtdAtuGeradas = nQtdAtuGeradas + 1;
@ Atualiza a data atual de calculo com a data da atualização corrente @
dCalAtu = lis_Atualizacoes.VCTCAL;
@ Verificar quantidade de dias úteis entre data da atualização e a última data usada como base (dDatAnt) @
RetornarDiasUteisPeriodo(dDatAnt, dCalAtu, nQtdDia);
@ Atualiza variáveis dia, mes e ano com data atual @
DesMontaData(dCalAtu, nDiaAtu, nMesAtu, nAnoAtu);
nJrsLoc = 0;
nAtuDia = 0;
aTipPar = "C";
aHisCal = "Cota via regra";
se ((nCodMoeCot = 0) e (nQtdCot > 0)) { @ Se for um contrato por cotas @
@ F = P.(1 + i)^n @
MMBuscaCotacaoMoeda(aCodMoeCot, dCalAtu, 0, nCotAtu);
nAtuDia = (nQtdCot * nCotAtu) - nVlrLoc;
Potencia(nCotAtu, nQtdDia, nJrsLoc);
nVlrAtu = (nQtdCot * nCotAtu) - nVlrLoc;
nAtuAcu = nAtuAcu + nVlrAtu;
nVlrLoc = nVlrLoc + nVlrAtu;
InserirAtualizacaoLista();
}
nJrsLoc = 0;
nAtuDia = 0;
aTipPar = lis_Atualizacoes.TIPPAR;
aHisCal = lis_Atualizacoes.HISCAL;
se (nTemCalculo = 1) {
Enquanto (nTemCalculo = 1) { @ Enquanto tiver item de cálculo @
se (lis_ItemCalculo.TIPCAL = "D") { @ Buscar índice da data, aplicar índice no valor @
aCodMoe = lis_ItemCalculo.CODMOE;
@ F = P.(1 + i)^n @
MMBuscaCotacaoMoeda(aCodMoe, dCalAtu, 0, nCotAtu);
nAtuDia = (nVlrLoc * nCotAtu) - nVlrLoc;
Potencia(nCotAtu, nQtdDia, nJrsLoc);
nVlrAtu = (nVlrLoc * nJrsLoc) - nVlrLoc;
nAtuAcu = nAtuAcu + nVlrAtu;
nVlrLoc = nVlrLoc + nVlrAtu;
}
senao se (lis_ItemCalculo.TIPCAL = "P") { @ aplicar taxa fixa @
@ Caso exista taxa fixa no cálculo de atualização do contrato, implementar a regra de atualização aqui @
}
nTemCalculo = lis_ItemCalculo.Proximo();
}
InserirAtualizacaoLista();
}
InserirImpostosLista();
dDatAnt = lis_Atualizacoes.VCTCAL;
nTemAtualizacao = lis_Atualizacoes.Proximo();
}
}
Funcao InserirAtualizacaoLista(); {
ListaRegraPodeIncluir(CcrNLista, A_S_N); @ Verifica se tem permissão para incluir @
se (A_S_N = "S") {
ListaRegraNovaLinha(CcrNLista); @ Prepara lista para inclusão de uma nova linha. Deve ser chamado sempre que for usar os métodos incluir as colunas. @
ListaRegraEmInclusao(CcrNLista, A_S_N); @ Verifica situação da lista. @
se (A_S_N = "S") {
ListaRegraAddValorLinhaAlfa(CcrNLista, "TipPar", aTipPar , A_S_N); @ Caracter conforme o item que deve ser inserido (A, R, C, I, O) @
ListaRegraAddValorLinhaData(CcrNLista, "VctCal", dCalAtu, A_S_N); @ Adiciona data da atualização @
ListaRegraAddValorLinhaAlfa(CcrNLista, "HisCal" ,aHisCal, A_S_N);
ListaRegraAddValorLinhaNumero(CcrNLista, "VlrCalDia", nAtuDia, A_S_N);
ListaRegraAddValorLinhaNumero(CcrNLista, "VlrCal", nAtuAcu, A_S_N);
ListaRegraAddValorLinhaNumero(CcrNLista, "UltDia", 1, A_S_N);
ListaRegraAddValorLinhaNumero(CcrNLista, "VlrSal", nVlrLoc, A_S_N);
/* ListaRegraAddValorLinhaNumero(CcrNLista, "VlrCalAcu", nVlrLoc, A_S_N);
ListaRegraAddValorLinhaNumero(CcrNLista, "VlrCalCot", 0, A_S_N);
ListaRegraAddValorLinhaNumero(CcrNLista, "VlrJrs", Numero, A_S_N);
ListaRegraAddValorLinhaNumero(CcrNLista, "VlrInd", Numero, A_S_N);
ListaRegraAddValorLinhaNumero(CcrNLista, "SeqCal", Numero, A_S_N);
ListaRegraAddValorLinhaNumero(CcrNLista, "IrrCom", Numero, A_S_N);
ListaRegraAddValorLinhaNumero(CcrNLista, "DiaAni", Numero, A_S_N);
ListaRegraAddValorLinhaNumero(CcrNLista, "VlrBas", Numero, A_S_N);
ListaRegraAddValorLinhaData(CcrNLista, "DatBas", Data, A_S_N);
ListaRegraAddValorLinhaNumero(CcrNLista, "CotInd", Numero, A_S_N);
ListaRegraAddValorLinhaNumero(CcrNLista, "SeqOrd", Numero, A_S_N);
ListaRegraAddValorLinhaNumero(CcrNLista, "VlrPtr", Numero, A_S_N);
ListaRegraAddValorLinhaNumero(CcrNLista, "QtdCot", Numero, A_S_N);
ListaRegraAddValorLinhaNumero(CcrNLista, "VlrRent", Numero, A_S_N); */
ListaRegraSalvarLinha(CcrNLista); @Salva a linha na lista@
}
}
}
Funcao InserirImpostosLista(); {
Definir Numero nTemTributacao; @ Variável para controlar looping ddos tributos @
Definir Numero nPerImp; @ Percentual da aliquota do imposto @
Definir Alfa aTipImp; @ Tipo de registro dependendo do imposto @
Definir Data dDatCpt; @ Data competência para verificação do imposto a ser buscado @
Definir Alfa aCodImp; @ Código do imposto @
Definir Cursor Cur_E049TTR; @ Cursor para verificar informações do imposto @
Definir Cursor Cur_E051IMP; @ Cursor para ver o tipo do imposto @
nTemTributacao = lis_Tributacao.Primeiro();
Enquanto (nTemTributacao = 1) {
nPerImp = 0;
MontaData(1, nMesAtu, nAnoAtu, dDatCpt);
aCodImp = lis_Tributacao.CODIMP;
se (lis_Tributacao.TIPTRI = 3) { @ Taxa fixa que pode estar em um campo de usuário ou o valor fixo do imposto na tabela E049TTR @
Cur_E049TTR.SQL "SELECT DATCPT, PERIMP FROM E049TTR WHERE CODEMP = :NCODEMP AND CODIMP = :ACODIMP AND \
DATCPT = (SELECT MAX(DATCPT) FROM E049TTR WHERE CODEMP = :NCODEMP AND CODIMP = :ACODIMP AND DATCPT <= :DDATCPT)";
Cur_E049TTR.AbrirCursor();
se (Cur_E049TTR.Achou) {
nPerImp = Cur_E049TTR.PERIMP;
}
Cur_E049TTR.FecharCursor();
@ Se for tipo 1, deve-se verificar a tabela progressiva (valor) fazendo cursor na tabela E049TTR @
@ Se for tipo 2, deve-se verificar a tabela regressiva (dias) fazendo cursor na tabela E049TTR @
}
se (nPerImp > 0) {
Cur_E051IMP.SQL "SELECT TIPIMP FROM E051IMP WHERE CODIMP = :ACODIMP";
Cur_E051IMP.AbrirCursor();
aTipImp = " ";
se (Cur_E051IMP.Achou) {
se (Cur_E051IMP.TIPIMP = 11)
aTipImp = "I";
senao se (Cur_E051IMP.TIPIMP = 32)
aTipImp = "O";
}
ListaRegraPodeIncluir(CcrNLista, A_S_N); @ Verifica se tem permissão para incluir @
se ((A_S_N = "S") e (aTipImp <> " ")) {
ListaRegraNovaLinha(CcrNLista); @ Prepara lista para inclusão de uma nova linha. Deve ser chamado sempre que for usar os métodos incluir as colunas. @
ListaRegraEmInclusao(CcrNLista, A_S_N); @ Verifica situação da lista. @
se (A_S_N = "S") {
ListaRegraAddValorLinhaAlfa(CcrNLista, "TipPar", aTipImp , A_S_N); @ Caracter conforme o item que deve ser inserido (A, R, C, I, O) @
ListaRegraAddValorLinhaData(CcrNLista, "VctCal", dCalAtu, A_S_N); @ Adiciona data da atualização @
ListaRegraAddValorLinhaAlfa(CcrNLista, "HisCal" ,"Cálculo do imposto", A_S_N);
nVlrCalImp = ((nVlrAtu*nPerImp)/100);
ListaRegraAddValorLinhaNumero(CcrNLista, "VlrCalDia", nVlrCalImp, A_S_N);
nAtuAcuImp = ((nAtuAcu*nPerImp)/100);
ListaRegraAddValorLinhaNumero(CcrNLista, "VlrCal", nAtuAcuImp, A_S_N);
ListaRegraAddValorLinhaNumero(CcrNLista, "UltDia", 1, A_S_N);
ListaRegraAddValorLinhaNumero(CcrNLista, "VlrSal", nVlrLoc-nAtuAcuImp, A_S_N);
/* ListaRegraAddValorLinhaNumero(CcrNLista, "VlrCalAcu", nVlrLoc, A_S_N);
ListaRegraAddValorLinhaNumero(CcrNLista, "VlrCalCot", 0, A_S_N);
ListaRegraAddValorLinhaNumero(CcrNLista, "VlrJrs", Numero, A_S_N);
ListaRegraAddValorLinhaNumero(CcrNLista, "VlrInd", Numero, A_S_N);
ListaRegraAddValorLinhaNumero(CcrNLista, "SeqCal", Numero, A_S_N);
ListaRegraAddValorLinhaNumero(CcrNLista, "IrrCom", Numero, A_S_N);
ListaRegraAddValorLinhaNumero(CcrNLista, "DiaAni", Numero, A_S_N);
ListaRegraAddValorLinhaNumero(CcrNLista, "VlrBas", Numero, A_S_N);
ListaRegraAddValorLinhaData(CcrNLista, "DatBas", Data, A_S_N);
ListaRegraAddValorLinhaNumero(CcrNLista, "CotInd", Numero, A_S_N);
ListaRegraAddValorLinhaNumero(CcrNLista, "SeqOrd", Numero, A_S_N);
ListaRegraAddValorLinhaNumero(CcrNLista, "VlrPtr", Numero, A_S_N);
ListaRegraAddValorLinhaNumero(CcrNLista, "QtdCot", Numero, A_S_N);
ListaRegraAddValorLinhaNumero(CcrNLista, "VlrRent", Numero, A_S_N); */
ListaRegraSalvarLinha(CcrNLista); @Salva a linha na lista@
}
}
}
nTemTributacao = lis_Tributacao.Proximo();
}
}
@ Inicialização das listas e variáveis @
Funcao Inicializar(); {
Definir Cursor Cur_E606ICC; @ Cursor para selecionar os itens de cálculo do contrato @
Definir Cursor Cur_E606PBT; @ Cursor para selecionar os tributos do produto bancário @
Definir Data dDatTra;
Definir Data dDatFim;
nQtdAtuGeradas = 0;
@ Verificar dados do contrato @
Se (E606CCR.NumCcr > 0) {
nCodEmp = E606CCR.CodEmp; @ Empresa do contrato @
@ Pega última data de atualização do cálculo se existir @
Se (E606CCR.UltPdi > 0)
dUltAtu = E606CCR.UltPdi;
Senao
dUltAtu = E606CCR.DatCcr;
Se (E606CCR.VlrCat > 0)
nVlrSal = E606CCR.VlrCat;
senao
nVlrSal = E606CCR.VlrCcr; @ Valor do contrato @
@ Verificar dados do cálculo @
Se (E606CCR.CodCac > 0) {
nCodCac = E606CCR.CodCac;
InicializarListas();
@ Selecionar itens do cálculo do contrato @
Cur_E606ICC.Sql "SELECT SEQICC,TIPCAL,CODMOE,VLRCAL FROM E606ICC WHERE CODEMP = :NCODEMP AND CODCAC = :NCODCAC ORDER BY SEQICC";
Cur_E606ICC.AbrirCursor();
@ Alimenta lista dos cálculos do contrato @
Enquanto (Cur_E606ICC.Achou) {
lis_ItemCalculo.Adicionar();
lis_ItemCalculo.SEQCAL = Cur_E606ICC.SeqIcc; @ Sequência de cálculo do contrato @
lis_ItemCalculo.TIPCAL = Cur_E606ICC.TipCal; @ Tipo de cálculo da sequência do contrato @
lis_ItemCalculo.CODMOE = Cur_E606ICC.CodMoe; @ Código da moeda da seqüência de cálculo do contrato @
lis_ItemCalculo.VALPER = Cur_E606ICC.VlrCal; @ Valor/Percentual da sequência de cálculo do contrato @
lis_ItemCalculo.Gravar();
Cur_E606ICC.Proximo();
}
Cur_E606ICC.FecharCursor();
@ Selecionar tributos ligados ao produto bancário do contrato @
nCodPbc = E606CCR.CodPbc;
Cur_E606PBT.Sql "SELECT CODIMP,TIPTRI,SEQTRI FROM E606PBT WHERE CODEMP = :NCODEMP AND CODPBC = :NCODPBC ORDER BY SEQTRI";
Cur_E606PBT.AbrirCursor();
@ Alimenta lista dos tributos @
Enquanto (Cur_E606PBT.Achou) {
lis_Tributacao.Adicionar();
lis_Tributacao.CODIMP = Cur_E606PBT.CodImp; @ Código do imposto @
lis_Tributacao.TIPTRI = Cur_E606PBT.TipTri; @ Tipo da tributação @
lis_Tributacao.Gravar();
Cur_E606PBT.Proximo();
}
Cur_E606PBT.FecharCursor();
@ O padrão neste exemplo é de atualizações mensais, até chegar a data base. Mas o offset de meses pode ser trabalhado ou até não existir e a atualização ser por dia util @
nMesOffset = 1;
dDatTra = dUltAtu;
dDatFim = VarDDatBas;
Definir Numero nCepFil; @ Armazenar o CEP padrão para verificação de dia útil @
nCepFil = 89012170; @ Este CEP pode ser o da Matriz do cliente, o do banco, etc. @
@ Alimenta a lista de atualizações conforme dados do contrato @
Enquanto (dDatTra < dDatFim) {
nQtdAtuGeradas = nQtdAtuGeradas + 1;
lis_Atualizacoes.Adicionar();
lis_Atualizacoes.SEQCAL = nQtdAtuGeradas; @ Sequência do cálculo @
lis_Atualizacoes.TIPPAR = "A"; @ Tipo Atualização @
@ A - Atualizações - Atualizações diárias da aplicação - Provisões - Baseados na Data base @
UltimoDia(dDatTra);
Se (dDatTra >= dDatFim) { @ Se a data trabalhada for maior ou igual a data final para atualização chegamos a data base @
lis_Atualizacoes.VCTCAL = dDatFim; @ Atribui a dDatFim, que é a data base @
dDatTra = dDatFim;
}
Senao {
VerificaDiaUtil(dDatTra, nCepFil, 0 @opção 0 antecipa a data se a data passada não for dia util@, dDatTra);
lis_Atualizacoes.VCTCAL = dDatTra;
}
DesmontaData(dDatTra, nDia, nMes, nAno);
lis_Atualizacoes.DIACAL = nDia;
lis_Atualizacoes.MESCAL = nMes;
lis_Atualizacoes.ANOCAL = nAno;
lis_Atualizacoes.HISCAL = "Atualização via regra"; @ Descrição do cálculo @
lis_Atualizacoes.ULTDIA = 1; @ 1 indica último dia da competência (data base é o campo DiaAni), ou seja, gera movimentação de tesouraria @
lis_Atualizacoes.Gravar();
SomarMesesDataRef(dDatTra, nMesOffset, 2 @opção 2 retorna o primeiro dia do mês@ , dDatTra);
}
}
Senao
mensagem(erro, "Cálculo do contrato não informado no contrato.");
MMCria();
}
senao
mensagem(erro, "Contrato não carregado para a regra.");
}
@ Finalização dos objetos @
Funcao Finalizar(); {
MMLibera();
}