CREATE OR REPLACE PROCEDURE sp_fco_hallar_final_habil
(
    pch_compania       char, 
    pch_trabajador     char,
    pdt_fecha_inicial  date,
    psi_dias           smallint
)
AS
    vsi_i              smallint;
    vch_dato           char(10);
    vdt_ndias_periodo  date;
    vsi_no_habiles     smallint;
    vdt_fecha_ini_per2 date;
    vvc_agrupacion     varchar2(20);
    vch_agrupacion2    char(10);
    vdt_fecha_final    date;
    vti_flag           number(1);

    CURSOR cur_agrupacion_rh IS
    SELECT LTRIM(RTRIM(alfanumerico)) FROM parametros_rh
    WHERE compania = pch_compania AND
          parametro_rh = 'Ag_Dias_NL';

BEGIN
    vsi_i := 0;
    vch_dato := '';
    vdt_ndias_periodo := '';

    vsi_no_habiles := 0;
    vdt_fecha_ini_per2 := '';
    vvc_agrupacion := '';
    vch_agrupacion2 := '';

    OPEN cur_agrupacion_rh;

    LOOP
        FETCH cur_agrupacion_rh  INTO vvc_agrupacion;
        EXIT WHEN cur_agrupacion_rh%NOTFOUND;
            
        vch_agrupacion2 := LTRIM(RTRIM(vvc_agrupacion));
        vch_dato := '';
           
        vdt_ndias_periodo   := '';
           
        IF NOT ((vch_agrupacion2 = '') OR (vch_agrupacion2 IS NULL)) THEN
            SELECT dato
            INTO vch_dato
            FROM rel_trab_agr
            WHERE compania = pch_compania   AND
                  trabajador = pch_trabajador AND
                  agrupacion = vch_agrupacion2;
        ELSE
            vch_dato := '';
        END IF;
          
        vsi_i := 1;
        vsi_no_habiles := 0;
        vdt_fecha_ini_per2 := pdt_fecha_inicial - 1;
          
        WHILE  (vsi_no_habiles < psi_dias) LOOP
            vdt_ndias_periodo := vdt_fecha_ini_per2 + vsi_i;
            vti_flag :=0;
         
            BEGIN
                SELECT 1 INTO vti_flag
                FROM DUAL
                WHERE EXISTS(SELECT 1 FROM dias_no_laborables
                              WHERE compania   = pch_compania   AND
                                    dato       = vch_dato       AND
                                    fecha      = vdt_ndias_periodo);
            EXCEPTION
                WHEN OTHERS THEN vti_flag := 0;
            END;

            IF vti_flag = 0 THEN
                vsi_no_habiles := vsi_no_habiles + 1;
            END IF;
          
            vsi_i := vsi_i + 1;
        END LOOP;    /* END WHILE */      

    END LOOP;

    CLOSE cur_agrupacion_rh;

    DELETE fco_tmpfechafin;
    vdt_fecha_final := vdt_ndias_periodo;
    INSERT INTO fco_tmpfechafin VALUES (vdt_fecha_final);

    COMMIT WORK;
END;
/
CREATE PUBLIC SYNONYM sp_fco_hallar_final_habil FOR ADAM.sp_fco_hallar_final_habil;
GRANT EXECUTE ON sp_fco_hallar_final_habil TO adama;

