CREATE PROCEDURE SP_TIPODOCUMENTO_TEMPO (
ipcodigotipodocumento integer,
ipdatafinal date)
returns (
opdataprevistaretirada date,
opdatarealretirada date)
as
declare variable vtempoarquivoanos integer;
declare variable vtempoarquivomeses integer;
declare variable vtempoarquivoanosusuario integer;
declare variable vtempoarquivomesusuario integer;
declare variable vfinalconcessao varchar(1);
declare variable vtempoesperaano integer;
declare variable vtempoesperameses integer;
declare variable vdatafinalconcessao date;
declare variable vdiapadrao integer;
BEGIN
VDIAPADRAO = 1;
/* LEMBRANDO QUE NO PROGRAMA SÓ VOU ACEITAR 3 6 E 9 PARA OS MESES*/
SELECT TEMPOARQUIVOANO, TEMPOARQUIVOMESES, TEMPOARQUIVOANOSUSUARIO, TEMPOARQUIVOMESUSUARIO, FINALCONCESSAO, TEMPOESPERAANO, TEMPOESPERAMESES
FROM TIPODOCUMENTO
WHERE CODIGOTIPODOCUMENTO = :IPCODIGOTIPODOCUMENTO
INTO :VTEMPOARQUIVOANOS, :VTEMPOARQUIVOMESES, :VTEMPOARQUIVOANOSUSUARIO, :VTEMPOARQUIVOMESUSUARIO, :VFINALCONCESSAO, :VTEMPOESPERAANO, :VTEMPOESPERAMESES;
IF (:VTEMPOARQUIVOANOS IS NULL) THEN
VTEMPOARQUIVOANOS = 0;
IF (:VTEMPOARQUIVOMESES IS NULL) THEN
VTEMPOARQUIVOMESES = 0;
IF (:VTEMPOARQUIVOANOSUSUARIO IS NULL) THEN
VTEMPOARQUIVOANOSUSUARIO = 0;
IF (:VTEMPOARQUIVOMESUSUARIO IS NULL) THEN
VTEMPOARQUIVOMESUSUARIO = 0;
IF (:VTEMPOESPERAANO IS NULL) THEN
VTEMPOESPERAANO = 0;
IF (:VTEMPOESPERAMESES IS NULL) THEN
VTEMPOESPERAMESES = 0;
IF (EXTRACT (MONTH FROM IPDATAFINAL) + :VTEMPOARQUIVOMESES < 12) THEN
BEGIN
OPDATAPREVISTARETIRADA =
CAST((EXTRACT (MONTH FROM IPDATAFINAL) + :VTEMPOARQUIVOMESES) AS VARCHAR(5)) || ‘/’ ||
:VDIAPADRAO || ‘/’ ||
CAST((EXTRACT (YEAR FROM IPDATAFINAL) + :VTEMPOARQUIVOANOS) AS VARCHAR(5));
/** NO CASO DE MESES MENORES **/
IF (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES < 12) THEN
BEGIN
/** NO CASO DE MESES MENORES PREENCHIDOS OS MESES**/
IF (:VTEMPOESPERAMESES <> 0) THEN
BEGIN
IF ( (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) >= 1) AND (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) <= 3) ) THEN
OPDATAREALRETIRADA = ’04/01/’ || CAST(EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) AS VARCHAR(5));
IF ( (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) >= 4) AND (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) <= 6) ) THEN
OPDATAREALRETIRADA = ’07/01/’ || CAST(EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) AS VARCHAR(5));
IF ( (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) >= 7) AND (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) <= 9) ) THEN
OPDATAREALRETIRADA = ’10/01/’ || CAST(EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) AS VARCHAR(5));
IF ( (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) >= 10) AND (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) <= 12) ) THEN
OPDATAREALRETIRADA = ’01/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + 1) AS VARCHAR(5));
IF ( (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 = 0)) THEN
OPDATAREALRETIRADA = ’01/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + 1 + VTEMPOESPERAANO)AS VARCHAR(5));
END
ELSE
BEGIN
/** NO CASO DE MESES MENORES PREENCHIDOS ANOS **/
OPDATAREALRETIRADA = ’01/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + VTEMPOESPERAANO)AS VARCHAR(5));
END
END
ELSE
BEGIN
/** NO CASO DE MESES IGUAIS E MAIORES **/
IF ( (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 >= 1) AND (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 <= 3)) THEN
OPDATAREALRETIRADA = ’04/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + 1 + VTEMPOESPERAANO)AS VARCHAR(5));
IF ( (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 >= 4) AND (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 <= 6)) THEN
OPDATAREALRETIRADA = ’07/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + 1 + VTEMPOESPERAANO)AS VARCHAR(5));
IF ( (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 >= 7) AND (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 <= 9)) THEN
OPDATAREALRETIRADA = ’10/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + 1 + VTEMPOESPERAANO)AS VARCHAR(5));
IF ( (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 >= 10) AND (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 <= 12)) THEN
OPDATAREALRETIRADA = ’01/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + 2 + VTEMPOESPERAANO)AS VARCHAR(5));
IF ( (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 = 0)) THEN
OPDATAREALRETIRADA = ’01/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + 1 + VTEMPOESPERAANO)AS VARCHAR(5));
END
END
ELSE
BEGIN
/* CASO SEJA 12 TENHO QUE SOMAR 1 AO ANO*/
IF (EXTRACT (MONTH FROM IPDATAFINAL) + :VTEMPOARQUIVOMESES = 12) THEN
BEGIN
OPDATAPREVISTARETIRADA =
CAST(EXTRACT (MONTH FROM IPDATAFINAL) AS VARCHAR(5)) || ‘/’ ||
:VDIAPADRAO || ‘/’ ||
CAST((EXTRACT (YEAR FROM IPDATAFINAL) + :VTEMPOARQUIVOANOS + 1) AS VARCHAR(5));
END
ELSE
BEGIN
OPDATAPREVISTARETIRADA =
CAST((EXTRACT (MONTH FROM IPDATAFINAL) – 12 + :VTEMPOARQUIVOMESES) AS VARCHAR(5)) || ‘/’ ||
:VDIAPADRAO || ‘/’ ||
CAST((EXTRACT (YEAR FROM IPDATAFINAL) + :VTEMPOARQUIVOANOS + 1) AS VARCHAR(5));
END
/** NO CASO DE MESES MENORES **/
IF (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES < 12) THEN
BEGIN
/** NO CASO DE MESES MENORES PREENCHIDOS OS MESES**/
IF (:VTEMPOESPERAMESES <> 0) THEN
BEGIN
IF ( (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) >= 1) AND (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) <= 3) ) THEN
OPDATAREALRETIRADA = ’04/01/’ || CAST(EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) AS VARCHAR(5));
IF ( (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) >= 4) AND (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) <= 6) ) THEN
OPDATAREALRETIRADA = ’07/01/’ || CAST(EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) AS VARCHAR(5));
IF ( (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) >= 7) AND (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) <= 9) ) THEN
OPDATAREALRETIRADA = ’10/01/’ || CAST(EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) AS VARCHAR(5));
IF ( (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) >= 10) AND (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) <= 12) ) THEN
OPDATAREALRETIRADA = ’01/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + 1) AS VARCHAR(5));
IF ( (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 = 0)) THEN
OPDATAREALRETIRADA = ’01/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + 1 + VTEMPOESPERAANO)AS VARCHAR(5));
END
ELSE
BEGIN
/** NO CASO DE MESES MENORES PREENCHIDOS ANOS **/
OPDATAREALRETIRADA = ’01/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + VTEMPOESPERAANO)AS VARCHAR(5));
END
END
ELSE
BEGIN
/** NO CASO DE MESES IGUAIS E MAIORES **/
IF ( (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 >= 1) AND (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 <= 3)) THEN
OPDATAREALRETIRADA = ’04/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + 1 + VTEMPOESPERAANO)AS VARCHAR(5));
IF ( (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 >= 4) AND (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 <= 6)) THEN
OPDATAREALRETIRADA = ’07/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + 1 + VTEMPOESPERAANO)AS VARCHAR(5));
IF ( (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 >= 7) AND (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 <= 9)) THEN
OPDATAREALRETIRADA = ’10/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + 1 + VTEMPOESPERAANO)AS VARCHAR(5));
IF ( (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 >= 10) AND (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 <= 12)) THEN
OPDATAREALRETIRADA = ’01/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + 2 + VTEMPOESPERAANO)AS VARCHAR(5));
IF ( (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 = 0)) THEN
OPDATAREALRETIRADA = ’01/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + 1 + VTEMPOESPERAANO)AS VARCHAR(5));
END
END
IF (VFINALCONCESSAO = ‘S’) THEN
BEGIN
SELECT DATAFINAL FROM FINALCONCESSAO INTO :VDATAFINALCONCESSAO;
IF (:VDATAFINALCONCESSAO > :OPDATAREALRETIRADA) THEN
BEGIN
OPDATAPREVISTARETIRADA = VDATAFINALCONCESSAO;
OPDATAREALRETIRADA = VDATAFINALCONCESSAO;
END
SUSPEND;
EXIT;
END
SUSPEND;
END^