CREATE OR REPLACE PROCEDURE sp_fco_incorpora_ausentismos
(
    pch_compania        char,
    psi_id_calendario   smallint,
    pch_clase_nomina    char,
    pch_trabajador      char,
    pvc_usuario         varchar2,
    pdt_fecha_hoy       date
)
AS
/*********************************************************************/
/*** Modulo:      Modulo Fiscal ADAM v3 - Ausentismos              ***/
/*** Descripcion: Incorpora ausentismos a la nómina                ***/
/*** Autor:	  Juan Carlos Leguizamon                           ***/
/*** Fecha:	  Junio 17 de 2002                                 ***/
/*** Revision:	  Marzo 22 de 2008                                 ***/
/*********************************************************************/
    cin_id_au         int;
    cch_trabajador    char(10);
    csi_concepto      smallint;
    cti_tipo          number(1);
    cdt_inicio_au     date;
    cdt_fin_au        date;
    cti_horas         number(2);
    vdt_inicio_per    date;
    vdt_fin_per       date;
    vdt_inicio        date; /* Fecha inicio del ausentismo dentro del periodo */
    vdt_fin           date; /* Fecha fin del ausentismo dentro del periodo */
    vnm_tiempo        number(8,3);
    vti_prorroga      number(1);
    vin_cursor        integer;
    vvc_sql           varchar2(2500);
    vin_registros     integer;
    vvc_tabla         varchar2(30);
    vnm_masivo        number(1);
    vnu_valor_ibc     number(19,6);
    vnu_ibc           number(19,6);
    
    CURSOR cr_ausentismos IS
    SELECT
        au.id_ausentismo, au.trabajador, au.concepto, au.tipo,
        au.fecha_inicio, au.fecha_fin, au.valor_ibc, au.horas
    FROM
        fco_ausentismos au, trabajadores_grales tg, calendario_procesos cp, rel_conc_tipo_nomina rctn
    WHERE
        au.compania = tg.compania And au.trabajador = tg.trabajador And
        cp.id_calendario = psi_id_calendario And
        rctn.compania = au.compania And rctn.tipo_nomina = cp.tipo_nomina And
        au.concepto = rctn.concepto And
        au.compania = pch_compania And
        tg.clase_nomina = pch_clase_nomina And
        tg.sit_trabajador = 1 And
        au.fecha_fin >= vdt_inicio_per  And
        ((au.trabajador = pch_trabajador And vnm_masivo=0) OR (vnm_masivo=1)) ;
BEGIN
    /* Deducir si el incorpora es masivo o no */
    vnm_masivo := 0;
    IF Nvl(LTrim(RTrim(pch_trabajador))||'0','0') = '0' THEN
        vnm_masivo := 1;
    END IF;
    /* Eliminar las transacciones ya generadas por este incorpora */
    vin_cursor := dbms_sql.open_cursor;
    vvc_tabla := 'tt' || rtrim(pch_compania) || to_char(psi_id_calendario);
    vvc_sql := ' DELETE ' || vvc_tabla ||
               ' WHERE compania = ''' || pch_compania || '''' ||
               ' AND clase_nomina = ''' || pch_clase_nomina || '''' ||
               ' AND id_calendario = ' || To_Char(psi_id_calendario) ||
               ' AND referencia = ''AUSENTISMO''' ||
               ' AND ((trabajador = ''' || pch_trabajador || ''' And ' || To_Char(vnm_masivo) || '=0) OR (' || To_Char(vnm_masivo) || '=1))';
    dbms_sql.parse(vin_cursor, vvc_sql, dbms_sql.v7);
    vin_registros := dbms_sql.execute(vin_cursor);
    dbms_sql.close_cursor(vin_cursor);
    DELETE
        transacciones_ns
    WHERE
        compania = pch_compania And
        clase_nomina = pch_clase_nomina And
        id_calendario = psi_id_calendario And
        referencia = 'AUSENTISMO' And
        ((trabajador = pch_trabajador And vnm_masivo=0) OR (vnm_masivo=1));
    /* Recuperar las fechas del periodo */
    SELECT
        fecha_inicio, fecha_termino
    INTO
        vdt_inicio_per, vdt_fin_per
    FROM
        calendario_procesos
    WHERE
        id_calendario = psi_id_calendario;
    /* Recorrer los ausentismos activos */
    OPEN cr_ausentismos;
    LOOP
        FETCH cr_ausentismos
        INTO cin_id_au, cch_trabajador, csi_concepto, cti_tipo,
             cdt_inicio_au, cdt_fin_au, vnu_valor_ibc, cti_horas;
        EXIT WHEN cr_ausentismos%NOTFOUND;
        /* Hallar si es prorroga o no */
        Vti_prorroga := 0;
        IF cti_tipo = 4 THEN
           Vti_prorroga := 1;
        END IF;
        /* Calcular las fechas del ausentismo en el periodo */
        If Nvl(cti_horas, 0) > 0 Then
           vnm_tiempo := cti_horas;
           vnu_ibc := 0;
	Else
            IF cdt_inicio_au < vdt_inicio_per THEN
                vdt_inicio := vdt_inicio_per;
            ELSE
                vdt_inicio := cdt_inicio_au;
            END IF;            
            IF cdt_fin_au > vdt_fin_per THEN
                vdt_fin := vdt_fin_per;
            ELSE
                vdt_fin := cdt_fin_au;
            END IF;            
            /* Hallar el numero de dias del ausentismo para el periodo */
            vnm_tiempo := vdt_fin - vdt_inicio + 1;
            vnu_ibc := ROUND(((vnu_valor_ibc/30)*vnm_tiempo),2);
        End If;
	IF vnm_tiempo > 0 THEN
           sp_alta_transacciones_din
           (
            pch_compania,
            pch_clase_nomina,
            psi_id_calendario,
            csi_concepto,
            cch_trabajador,
            'AUSENTISMO',       /* referencia */
            NULL,               /* secuencia */
            '',	                /* referencia2 */
            cdt_inicio_au,	/* fecha */
            pdt_fecha_hoy,    	/* fecha2*/
            vnm_tiempo,         /* tiempo */
            cin_id_au,          /* factor_01 */
            cti_tipo,           /* factor_02 */
            vti_prorroga,       /* factor_03 */
            0,       		/* importe_reportado */
            vnu_ibc, --0,       		/* importe */
            null,    		/* turno_trn */
            null,    		/* puesto_trn */
            null,    		/* agrupacion_01_trn */
            null,    		/* dato_01_trn */
            null,    		/* agrupacion_02_trn */
            null,    		/* dato_02_trn */
            null,    		/* agrupacion_03_trn */
            null,    		/* dato_03_trn */
            null,    		/* agrupacion_04_trn */
            null,    		/* dato_04_trn */
            1,    		/* origen_transaccion */
            pvc_usuario, 	/* usuario_registro */
            pdt_fecha_hoy,	/* fecha_registro */
            null,    		/* usuario_proceso */
            null,		/* fecha_proceso */
            null,    		/* usuario_cambio */
            null,    		/* fecha_cambio */
            1,    		/* sit_transaccion */
            1		        /* checa bajas del periodo */
           );
        END IF;
    END LOOP; /* LOOP */
    CLOSE cr_ausentismos;
    COMMIT WORK;
END;
/
CREATE PUBLIC SYNONYM sp_fco_incorpora_ausentismos FOR ADAM.sp_fco_incorpora_ausentismos;
GRANT EXECUTE ON sp_fco_incorpora_ausentismos TO adama;
