goj1
(usa Debian)
Enviado em 13/09/2012 - 10:28h
Estou há duas semanas tentando criar uma função PL/SQL para verificar se um boleto foi pago em dia ou não e caso o vencimento caia num feriado ou final de semana o vencimento passa para o próximo dia útil, caso tenha sido pago após a data de vencimento.
O problema é basicamente o descrito
Criei duas tabelas BOLETO e CALENDARIO (foi utilizado o mês de novembro em razão dos feriados) Já povoei as duas entidades.
Minha dificuldade é, no oracle não existe o tipo boolean, portanto não tive como eu definir os feriados e os finais de semana como TRUE, eles estão como number com valor 1 para sim e 0 para não, ou seja, 1 é feriado ou final de semana e 0 não é feriado nem final de semana.
Aqui está a função:
create or replace
function
CALCULAR_VL_PAGAMENTO(V_CD_BARRAS in varchar2)
return varchar2 is
--Definição de variáveis.
data_vencimento date;
data_vencimento_antiga date;
data_pagamento date;
data_calendario date;
dia_util date;
feriado number;
final_semana number;
atraso number := 0;
valor_documento number(10,2);
valor_pago number(10,2);
verifica_valor_pago number(10,2);
valor_multa number(10,2);
valor_juros number(10,2);
acrescimo number(10,2);
mensagem varchar2(1000);
begin
--Select para recuperar as colunas das duas tabelas que serão utilizadas no corpo da função.
select dt_vencimento, dt_pagamento, vl_documento, vl_acrescimo, vl_pagamento, dt_calendario, bo_feriado, bo_final_semana
into data_vencimento, data_pagamento, valor_documento, acrescimo, valor_pago, data_calendario, feriado, final_semana
from boleto B inner join calendario C on B.dt_vencimento = C.dt_calendario
where cd_barras = v_cd_barras;
valor_multa := 0.10 * valor_documento;
valor_juros := 0.0033 * valor_documento;
--Se o pagamento for menor ou igual à data de vencimento entra aqui
if data_pagamento <= data_vencimento then
mensagem := 'pagamento dentro do prazo!'
||' data de vencimento: '||to_char(data_vencimento, 'dd-mm-yyyy')
||'. data de pagamento: '||to_char(data_pagamento, 'dd-mm-yyyy')
||' valor pago: R$ '||to_char(valor_pago)||'.';
/*
senão (o pagamento ocorreu após o vencimento) entra aqui e verifica se o vencimento caiu num dia não útil para jogar o vencimento para o próximo dia útil.
*/
else
data_vencimento_antiga := data_vencimento; /*Guardando a data de vencimento original*/
/*Aqui se eu usar somente final_semana = 1 or feriado = 1 não entra no while por isso a rendundância data_pagamento > data_vencimento que já foi a condição para entrar no else. O problema está nessa condição pq ele não está avaliando o feriado nem o final de semana pq no final data de vencimento será igual à data de pagamento.
Eu utilizei um boleto que foi pago em 14-11-2012 e venceu num sábado 10-11-2012.
*/
while data_pagamento > data_vencimento and final_semana = 1 or feriado = 1 loop
data_vencimento := data_vencimento + 1;
atraso := 0;
end loop;
/*Aqui é só um teste para testar o while e já tentei o que sei e sempre as datas de pagamento e vencimento saem iguas.*/
mensagem := to_char(data_pagamento, 'dd-mm-yyyy')||' '||to_char(data_vencimento, 'dd-mm-yyyy');
end if;
return mensagem;
end;