Bom dia pessoal estou precisando de ajuda para tornar o recesso dos estagiários proporcional, eles tiram 30 dias cheios, mas agora vou tornar isso proporcional, ex: estagiário de 1 ano = 30 dias, 6 meses = 20 dias, 4 meses = 10 dias ou 15 dias. Alguém pode me ajudar por favor, só tenho 6 meses de experiência e to apanhando para fazer isso
Procedure:
Selecionar tudo
BEGIN
select sysdate+15 into vdia from dual;
insert into rh_job
(dia,processo)
values
(vdia,'insere_feriasdia');
Select to_char(vdia,'yyyy') into v_anoatual from dual;
Open CServidores;
loop
fetch CServidores into VRegistroServidores;
exit when CServidores%notfound;
V_matricula := VRegistroServidores.matricula;
V_admissao := VRegistroServidores.data_admis;
-- dbms_output.put_line('FETCH'||V_MATRICULA||V_admissao);
select count(*) into v_existe
from rh_ferias b
where b.matricula = V_matricula;
-- dbms_output.put_line('Existe'||V_existe);
if V_existe = 0
then
V_ultimaferias := 0;
-- dbms_output.put_line('Existe if then '||V_existe);
Select NVL(MAX(SEQUENCIA),0)+1 into V_sequencia
from rh_ferias
where matricula = V_matricula;
-- dbms_output.put_line('PASSOU PELO COUNT');
V_admissao := TO_CHAR(V_admissao,'dd/mm/')||TO_CHAR(vdia,'yyyy');
-- dbms_output.put_line('PASSOU ADMISSAO');
if to_char(VRegistroServidores.data_admis,'yyyy')<TO_CHAR(vdia,'yyyy')
then
Begin
Insert into rh_ferias
(matricula, sequencia, data_a1, data_a2,estado_ferias)
VALUES
(V_matricula,V_sequencia,V_admissao,add_months(V_admissao,12)-1,1);
end;
end if;
-- COMMIT;
else
-- dbms_output.put_line('Existe if else '||V_existe);
select nvl(max(to_char(b.data_a2,'yyyy')),0) into V_ultimaferias
from rh_ferias b
where b.matricula = V_matricula;
If v_anoatual > V_ultimaferias
then
Begin
-- dbms_output.put_line('ANTES while'||V_matricula||' '||V_sequencia||' '||V_dataIni||' '||V_datafim);
WHILE V_ultimaferias <> v_anoatual
Loop
Select data_a1,data_a2 into V_dataIni,V_datafim
from rh_ferias
where matricula = V_matricula
and to_char(data_a2,'yyyy') = V_ultimaferias;
Select max(sequencia) into V_sequencia
from rh_ferias
where matricula = V_matricula;
V_sequencia := V_sequencia +1;
V_dataIni := ADD_months(V_dataIni,12);
V_datafim := ADD_MONTHS(V_datafim,12);
-- dbms_output.put_line('while insert'||V_matricula||' '||V_sequencia||' '||V_dataIni||' '||V_datafim);
Insert into rh_ferias
(matricula, sequencia, data_a1, data_a2,estado_ferias)
VALUES
(V_matricula,V_sequencia,V_dataIni,V_datafim,1);
V_ultimaferias := V_ultimaferias +1;
-- COMMIT;
end loop;--while ultimasferias
end;
end if; --end if v_anoatual > V_ultimaferias
end if; --if existe
dbms_output.put_line('fetch matricula'||V_matricula);
-- dbms_output.put_line('ultima ferias:'||V_ultimaferias||' Ano atual:'||v_anoatual);
end loop; --loop CServidores
close CServidores;
Minhas tentativas:
Selecionar tudo
---------- atualizacao tentativa 01
Select NVL(MAX(recesso_estagio),0)+1 into V_recesso_estag
from rh_ferias
where matricula = V_matricula;
-- dbms_output.put_line('PASSOU PELO COUNT');
V_admissao := TO_CHAR(V_admissao,'dd/mm/')||TO_CHAR(vdia,'yyyy');
-- dbms_output.put_line('PASSOU ADMISSAO');
-------atualizacao tentativa 02
Select max(recesso_estagio) into V_recesso_estag
from rh_ferias
where matricula = V_matricula;
V_recesso_estag := V_recesso_estag +1;
V_dataIni := ADD_months(V_dataIni,12);
V_datafim := ADD_MONTHS(V_datafim,12);[
-------- atualizacao tentativa 03 (mais provavel)
if to_char(V_admissao.data_admis,'yyyy')<TO_CHAR(vdia,'yyyy')
-- if V_admissao := TO_CHAR(V_admissao,'dd/mm/')||TO_CHAR(vdia,'yyyy') >= vdia and <= -4 V_datafim
then
Begin
if count(recesso_estagio) >to_char(V_admissao.data_admis,'yyyy'+4) <ADD_MONTHS(V_datafim,12) -- +4 meses
V_recesso_estag := V_recesso_estag +1;
end if;
if count(recesso_estagio) >to_char(V_admissao.data_admis,'yyyy'+4) <ADD_MONTHS(V_datafim,12) -- +4 meses
V_recesso_estag := V_recesso_estag +1; --V_ultimaferias := V_ultimaferias +1;
end if;
-- Insert into rh_ferias
-- (recesso_estagio)
-- VALUES
-- (V_recesso_estag,add_months(V_admissao,12)-1,1);
end;
end if;
-----------------------------------------/code]