CREATE OR REPLACE PROCEDURE sp_fco_crea_ISS
(
    pch_compania     char,
    psm_anio         smallint,
    psm_mes          smallint,
    pch_sucursal     char,
    pbl_generar_mm   boolean,
    pbl_regenerar    boolean
)
/**********************************************************************************/
/*** Modulo:      Modulo Fiscal Colombiano ADAM V.3                             ***/
/*** Descripcion: Crea tabla base para autoliquidacion de aportes al ISS.       ***/
/***              Formato Integrado. Considera que el ISS NO ES LA ARP.         ***/
/*** Tablas:      Parametros_MF, Trabajadores, Acumulados_Mensuales, MF_ISS,    ***/
/***              Traslados_EPS, Traslados_FPO                                  ***/
/*** Vistas:      vw_trabajadores_cia, vw_EPS_trabajador, vw_FPO_trabajador,    ***/ 
/***              vw_div_trabajador, vw_sueldos, vw_hist_traslados_FPO,         ***/
/***              vw_hist_traslados_EPS                                         ***/
/*** Autor:       Juan Carlos Leguizamon                                        ***/
/*** Fecha:       Junio 19 de 2001                                              ***/
/*** Revision:    Febrero 23 de 2002                                            ***/
/*** Motor:       Oracle 8i            Version interna: 1.00                    ***/
/**********************************************************************************/
AS
    vch_acum_imp     char(15);
    vch_acum_tie     char(15);
    vvc_tabla        varchar2(30);
    vbl_existe       boolean;
    vnm_existe       number(1);
    vvc_sql_1        varchar2(2000);
    vvc_sql_2        varchar2(2000);
    vvc_sql_3        varchar2(2000);
    vch_agr_02       char(3);
    vch_agr_03       char(3);
    vch_agr_04       char(3);
    vch_agr_05       char(3);
    vch_agr_08       char(3);
    vch_agr_10       char(3);
    vch_agr_11       char(3);
    vch_agr_15       char(3);
    vch_agr_16       char(3);
    vch_agr_18       char(3);
    vch_agr_20       char(3);
    vch_cod_ISS      char(5);
    vch_periodo      char(6);
    vvc_num_aut      varchar2(10);
    vnm_vlr_aut      number(9,0);
    vvc_condicion0   varchar2(255); --WHERE
    vvc_condicion1   varchar2(255); --AND
    vvc_condicion2   varchar2(255); --AND
    vvc_condicion3   varchar2(255); --AND
    vin_id_cursor integer;
    vin_rows	  integer;
    cch_sucursal    char(10);
    CURSOR cr_autorizaciones_eg IS
    SELECT 
        sucursal, Max(numero) NRO, Sum(valor_total) VLR
    FROM 
        fco_autorizaciones
    WHERE 
        compania = pch_compania And
        periodo = vch_periodo And 
        RTrim(cod_entidad) = 'ISS' And
        tipo_incapacidad = 0
    GROUP BY 
        sucursal
    HAVING Sum(valor_total) > 0;
    CURSOR cr_autorizaciones_lm IS
    SELECT 
        sucursal, Max(numero) NRO, Sum(valor_total) VLR
    FROM 
        fco_autorizaciones
    WHERE 
        compania = pch_compania And
        periodo = vch_periodo And 
        RTrim(cod_entidad) = 'ISS' And
        tipo_incapacidad = 1
    GROUP BY
        sucursal
    HAVING Sum(valor_total) > 0;
BEGIN
    /* Campos que interesan de la tabla Acumulados Mensuales (importe y tiempo) */
    SELECT fn_fco_imp_mes(psm_mes), fn_fco_tie_mes(psm_mes) 
    INTO vch_acum_imp, vch_acum_tie FROM dual;
    /* Periodo de Cotizacion */
    vch_periodo := LTrim(RTrim(psm_anio)) || Substr(vch_acum_imp,14,2);
    /* Codigo del ISS en la compania -Cambiar si es necesario - */
    vch_cod_ISS := '''ISS''';
    /*** Recuperar Agrupaciones de Conceptos ***/
    /* IBC de Pension */
    SELECT Nvl(dato, 'S02') INTO vch_agr_02 FROM vw_fdt_parametros 
    WHERE compania = pch_compania AND parametro = 'autoliq' AND secuencia = 2;
    /* Cotización Obligatoria Pensión */
    SELECT Nvl(dato, 'S03') INTO vch_agr_03 FROM vw_fdt_parametros 
    WHERE compania = pch_compania AND parametro = 'autoliq' AND secuencia = 3;
    /* Fondo de Solidaridad Pensional */
    SELECT Nvl(dato, 'S04') INTO vch_agr_04 FROM vw_fdt_parametros 
    WHERE compania = pch_compania AND parametro = 'autoliq' AND secuencia = 4;
    /* Cotización Obligatoria de Salud */
    SELECT Nvl(dato, 'S05') INTO vch_agr_05 FROM vw_fdt_parametros 
    WHERE compania = pch_compania AND parametro = 'autoliq' AND secuencia = 5;
    /* Vacaciones */
    SELECT Nvl(dato, 'S08') INTO vch_agr_08 FROM vw_fdt_parametros 
    WHERE compania = pch_compania AND parametro = 'autoliq' AND secuencia = 8;
    /* Licencia de Maternidad */
    SELECT Nvl(dato, 'S10') INTO vch_agr_10 FROM vw_fdt_parametros 
    WHERE compania = pch_compania AND parametro = 'autoliq' AND secuencia = 10;
    /* Incapacidad por Enfermedad General */
    SELECT Nvl(dato, 'S11') INTO vch_agr_11 FROM vw_fdt_parametros 
    WHERE compania = pch_compania AND parametro = 'autoliq' AND secuencia = 11;
    /* UPC (Aporte Unidad de Capitacion) */
    SELECT Nvl(dato, 'S15') INTO vch_agr_15 FROM vw_fdt_parametros 
    WHERE compania = pch_compania AND parametro = 'autoliq' AND secuencia = 15;
    /* IBC Salud */
    SELECT Nvl(dato, 'S16') INTO vch_agr_16 FROM vw_fdt_parametros 
    WHERE compania = pch_compania AND parametro = 'autoliq' AND secuencia = 16;
    /* Licencia No Remunerada y Sanciones */
    SELECT Nvl(dato, 'S18') INTO vch_agr_18 FROM vw_fdt_parametros 
    WHERE compania = pch_compania AND parametro = 'autoliq' AND secuencia = 18;
    /* Ingresos o Aporte Sin Sueldo Basico */
    SELECT Nvl(dato, 'S20') INTO vch_agr_20 FROM vw_fdt_parametros 
    WHERE compania = pch_compania AND parametro = 'autoliq' AND secuencia = 20;
    /*** Fin de Recuperar Agrupaciones de Conceptos ***/
    /*** Establecer el Nombre de la Tabla ***/
    vvc_tabla := 'FCO_ISS_' || RTrim(pch_compania) || '_' || LTrim(psm_anio) || '_' || LTrim(psm_mes);
    /*** Verificar Existencia de la Tabla ***/
    vnm_existe := 0;
    vbl_existe := False;
    BEGIN
        SELECT 1 INTO vnm_existe
        FROM all_objects
        WHERE 
            object_name = UPPER(vvc_tabla) And 
            object_type = 'TABLE';
    EXCEPTION
        WHEN OTHERS THEN vnm_existe := 0;
    END;
    IF vnm_existe = 1 THEN
        vbl_existe := True;
    END IF;
    /*** Borrar datos de la tabla modelo ***/
    DELETE FCO_ISS;
    COMMIT;
    /*** Crear y dar permisos a la tabla***/    
    IF NOT(vbl_existe) THEN
        sp_fco_crea_tablas (vvc_tabla);
    END IF;

    --Para porvenir, DCRP, Jun9/2005
    IF Nvl(Length(pch_sucursal),0) = 0 THEN
        vvc_condicion0 := ' '; -- DELETE e INSERT en depurada
        vvc_condicion1 := ' '; -- Insert General
        vvc_condicion2 := ' '; -- Novedades
        vvc_condicion3 := ' '; -- Fantasmas
    ELSE
        vvc_condicion0 := ' WHERE RTrim(COD_SUC) = ''' || RTrim(pch_sucursal) || ''''; -- DELETE e INSERT en depurada
        vvc_condicion1 := ' AND RTrim(SUC.dato) = ''' || RTrim(pch_sucursal) || ''''; -- Insert General
        vvc_condicion2 := ' AND RTrim(COD_SUC) = ''' || RTrim(pch_sucursal) || ''''; -- Novedades
        vvc_condicion3 := ' AND RTrim(SUC) = ''' || RTrim(pch_sucursal) || '''';    -- Fantasmas
    END IF;
        
    IF pbl_regenerar THEN
        vvc_sql_1 := 'DELETE FROM ' || vvc_tabla || vvc_condicion0;
        BEGIN
            vin_id_cursor := dbms_sql.open_cursor;
            dbms_sql.parse(vin_id_cursor, vvc_sql_1, dbms_sql.v7);
            vin_rows := dbms_sql.execute(vin_id_cursor);
            dbms_sql.close_cursor(vin_id_cursor);
        EXCEPTION
            WHEN OTHERS THEN
                raise_application_error (-20001, '20001-Error al eliminar la informacion existente');
        END;
    ELSE
        vvc_condicion0 := ' ';
        vvc_condicion1 := ' ';
        vvc_condicion2 := ' ';
        vvc_condicion3 := ' ';                
    END IF;
    
    IF NOT(vbl_existe) OR pbl_regenerar THEN
       /*** Insertar los valores No Depurados a la tabla FCO_ISS ***/
       /*** En el caso del ISS se llena la tabla en 3 procesos:  ***/
        /* Para quienes estan afiliados TANTO en Pensiones COMO en Salud al ISS: */
        vvc_sql_1 :=
            ' INSERT INTO FCO_ISS' ||
            ' SELECT AM.compania CIA, TG.trabajador COD_TRAB, ' || 
            ' EPS.dato COD_EPS, FPO.dato COD_FPO, SUC.dato COD_SUC,' ||
            ' ''C'' C03, T.clave_unica C04, T.nombre C05,' ||
            ' '' '' C09, '' '' C10, '' '' C11, '' '' C12, '' '' C13, '' '' C14,' ||
            ' Decode(AM.agr_conceptos,''' || vch_agr_20 || ''', Decode(' || vch_acum_imp || ',0,'' '',''X''), '' ''),' ||
            ' Decode(AM.agr_conceptos,''' || vch_agr_18 || ''', Decode(' || vch_acum_imp || ',0,'' '',''X''), '' ''),' ||
            ' Decode(AM.agr_conceptos,''' || vch_agr_11 || ''', Decode(' || vch_acum_imp || ',0,'' '',''X''), '' ''),' ||
            ' Decode(AM.agr_conceptos,''' || vch_agr_10 || ''', Decode(' || vch_acum_imp || ',0,'' '',''X''), '' ''),' ||
            ' Decode(AM.agr_conceptos,''' || vch_agr_08 || ''', Decode(' || vch_acum_imp || ',0,'' '',''X''), '' ''),' ||
            ' '' '' C20, '' '' C21, 0 C22,' ||
            ' Decode(AM.agr_conceptos,''' || vch_agr_02 || ''',' || vch_acum_tie || ',0),' ||
            ' Decode(AM.agr_conceptos,''' || vch_agr_16 || ''',' || vch_acum_tie || ',0),' ||
            ' 0 C25, Round((SU.salario),0) C26, 0 C27,';
        vvc_sql_2 :=
            ' Decode(AM.agr_conceptos,''' || vch_agr_02 || ''', Round((' || vch_acum_imp || '),0), 0),' ||
            ' Decode(AM.agr_conceptos,''' || vch_agr_16 || ''', Round((' || vch_acum_imp || '),0), 0),' ||
            ' 0 C30, 0.1450 C31,' ||
            ' Decode(AM.agr_conceptos,''' || vch_agr_03 || ''', Round((' || vch_acum_imp || '-1)/100, 0)*100,  0),' ||
            ' 0 C33, 0 C34, 0 C35,' ||
            ' Decode(AM.agr_conceptos,''' || vch_agr_04 || ''', Round((' || vch_acum_imp || '-1)/100, 0)*100,  0),' ||
            ' 0 C37,' ||
            ' Decode(AM.agr_conceptos,''' || vch_agr_05 || ''', Round((' || vch_acum_imp || '-1)/100, 0)*100,  0),' ||
            ' '' '' C39, 0 C40, '' '' C41, 0 C42,' ||
            ' Decode(AM.agr_conceptos,''' || vch_agr_15 || ''', ' || vch_acum_imp || ', 0),' ||
            ' 0 C44, 0 C45, 0 C46, '' '' C47, '' '' C48' ||
            ' FROM trabajadores T, vw_fco_trabajadores_cia TG,' ||
            ' vw_fco_EPS_trabajador EPS, vw_fco_FPO_trabajador FPO,' || 
            ' vw_fco_div_trabajador SUC, vw_fco_sueldos SU, acumulados_mensuales AM';
        vvc_sql_3 :=
            ' WHERE T.trabajador = TG.trabajador AND' ||
            ' EPS.compania = TG.compania AND EPS.trabajador = TG.trabajador AND ' ||
            ' FPO.compania = TG.compania AND FPO.trabajador = TG.trabajador AND ' ||
            ' SUC.compania = TG.compania AND SUC.trabajador = TG.trabajador AND '||
            ' SU.compania = TG.compania AND SU.trabajador = TG.trabajador AND ' ||
            ' AM.compania = TG.compania AND AM.trabajador = TG.trabajador AND ' ||
            ' RTrim(FPO.dato) =' || vch_cod_ISS || ' AND RTrim(EPS.dato) =' || vch_cod_ISS || ' AND' ||
            ' AM.compania =''' || pch_compania || ''' AND ' ||
            ' AM.anio = ' || To_Char(psm_anio) || ' AND ' ||
            ' AM.agr_conceptos IN (''' ||vch_agr_02 || ''',' ||
            '''' || vch_agr_03 || ''',''' || vch_agr_04 || ''',''' || vch_agr_05 || ''',' ||
            '''' || vch_agr_08 || ''',''' || vch_agr_10 || ''',''' || vch_agr_11 || ''',' ||
            '''' || vch_agr_15 || ''',''' || vch_agr_16 || ''',''' || vch_agr_18 || ''',' ||
            '''' || vch_agr_20 || ''')' 
            || ' AND instr(T.clave_unica, ''S'') = 0' --solo para porvenir, al parecer en la clave unica a algunos les agregaron un S            
            || vvc_condicion1;
        BEGIN
            vin_id_cursor := dbms_sql.open_cursor;
            dbms_sql.parse(vin_id_cursor, vvc_sql_1 || vvc_sql_2 || vvc_sql_3, dbms_sql.v7);
            vin_rows := dbms_sql.execute(vin_id_cursor);
            dbms_sql.close_cursor(vin_id_cursor);
        EXCEPTION
            WHEN OTHERS THEN
                raise_application_error (-20001, 'Error al llenar la tabla temporal. (EPS y FPO)');
        END ;
        COMMIT;
        /* Para quienes estan afiliados UNICAMENTE en Salud al ISS: */
        vvc_sql_1 :=
            ' INSERT INTO FCO_ISS' ||
            ' SELECT AM.compania CIA, TG.trabajador COD_TRAB, ' || 
            ' EPS.dato COD_EPS, FPO.dato COD_FPO, SUC.dato COD_SUC,' ||
            ' ''C'' C03, T.clave_unica C04, T.nombre C05,' ||
            ' '' '' C09, '' '' C10, '' '' C11, '' '' C12, '' '' C13, '' '' C14,'||
            ' Decode(AM.agr_conceptos,''' || vch_agr_20 || ''', Decode(' || vch_acum_imp || ',0,'' '',''X''), '' ''),' ||
            ' Decode(AM.agr_conceptos,''' || vch_agr_18 || ''', Decode(' || vch_acum_imp || ',0,'' '',''X''), '' ''),' ||
            ' Decode(AM.agr_conceptos,''' || vch_agr_11 || ''', Decode(' || vch_acum_imp || ',0,'' '',''X''), '' ''),' ||
            ' Decode(AM.agr_conceptos,''' || vch_agr_10 || ''', Decode(' || vch_acum_imp || ',0,'' '',''X''), '' ''),' ||
            ' Decode(AM.agr_conceptos,''' || vch_agr_08 || ''', Decode(' || vch_acum_imp || ',0,'' '',''X''), '' ''),' ||
            ' '' '' C20, '' '' C21, 0 C22, 0 C23,' ||
            ' Decode(AM.agr_conceptos,''' || vch_agr_16 || ''',' || vch_acum_tie || ',0),' ||
            ' 0, Round((SU.salario),0) C26, 0 C27, 0 C28,' ||
            ' Decode(AM.agr_conceptos,''' || vch_agr_16 || ''', Round((' || vch_acum_imp || '),0), 0),' ||
            ' 0 C30, 0 C31, 0 C32, 0 C33, 0 C34, 0 C35, 0 C36, 0 C37,' ||
            ' Decode(AM.agr_conceptos,''' || vch_agr_05 || ''', Round((' || vch_acum_imp || '-1)/100, 0)*100,  0),';
        vvc_sql_2 :=
            ' '' '' C39, 0 C40, '' '' C41, 0 C42,' ||
            ' Decode(AM.agr_conceptos,''' || vch_agr_15 || ''', ' || vch_acum_imp || ', 0),' ||
            ' 0 C44, 0 C45, 0 C46, '' '' C47, '' '' C48' ||
            ' FROM trabajadores T, vw_fco_trabajadores_cia TG,' ||
            ' vw_fco_EPS_trabajador EPS, vw_fco_FPO_trabajador FPO,' || 
            ' vw_fco_div_trabajador SUC, vw_fco_sueldos SU, acumulados_mensuales AM'||
            ' WHERE T.trabajador = TG.trabajador AND' ||
            ' EPS.compania = TG.compania AND EPS.trabajador = TG.trabajador AND ' ||
            ' FPO.compania(+) = TG.compania AND FPO.trabajador(+) = TG.trabajador AND ' ||
            ' SUC.compania = TG.compania AND SUC.trabajador = TG.trabajador AND '||
            ' SU.compania = TG.compania AND SU.trabajador = TG.trabajador AND ' ||
            ' AM.compania = TG.compania AND AM.trabajador = TG.trabajador AND ' ||
            ' RTrim(EPS.dato) =' || vch_cod_ISS || ' AND' ||
            ' decode(RTrim(FPO.DATO),'||''||vch_cod_ISS||''||',1,2) <> 1 '||
--            ' RTrim(FPO.dato(+)) <>' || vch_cod_ISS ||
            ' AND RTrim(EPS.dato) =' || vch_cod_ISS || ' AND' ||
            ' AM.compania =''' || pch_compania || ''' AND '||
            ' AM.anio = ' || To_char(psm_anio) || ' AND ' ||
            ' AM.agr_conceptos IN (''' ||vch_agr_05 || ''',' ||
            '''' || vch_agr_08 || ''',''' || vch_agr_10 || ''',''' || vch_agr_11 || ''',' ||
            '''' || vch_agr_15 || ''',''' || vch_agr_16 || ''',''' || vch_agr_18 || ''',' ||
            '''' || vch_agr_20 || ''')' || vvc_condicion1;
        BEGIN
            vin_id_cursor := dbms_sql.open_cursor;
            dbms_sql.parse(vin_id_cursor, vvc_sql_1 || vvc_sql_2, dbms_sql.v7);
            vin_rows := dbms_sql.execute(vin_id_cursor);
            dbms_sql.close_cursor(vin_id_cursor); 
        EXCEPTION
            WHEN OTHERS THEN
                raise_application_error (-20001, 'Error al llenar la tabla temporal. (EPS)');
        END ;
        COMMIT;
        /* Para quienes estan afiliados UNICAMENTE en Pensiones al ISS: */
        vvc_sql_1 :=
            ' INSERT INTO FCO_ISS' ||
            ' SELECT AM.compania CIA, TG.trabajador COD_TRAB, ' || 
            ' EPS.dato COD_EPS, FPO.dato COD_FPO, SUC.dato COD_SUC,' ||
            ' ''C'' C03, T.clave_unica C04, T.nombre C05,' ||
            ' '' '' C09, '' '' C10, '' '' C11, '' '' C12, '' '' C13, '' '' C14,'||
            ' Decode(AM.agr_conceptos,''' || vch_agr_20 || ''', Decode(' || vch_acum_imp || ',0,'' '',''X''), '' ''),' ||
            ' Decode(AM.agr_conceptos,''' || vch_agr_18 || ''', Decode(' || vch_acum_imp || ',0,'' '',''X''), '' ''),' ||
            ' '' '' C17, '' '' C18,' ||
            ' Decode(AM.agr_conceptos,''' || vch_agr_08 || ''', Decode(' || vch_acum_imp || ',0,'' '',''X''), '' ''),' ||
            ' '' '' C20, '' '' C21, 0 C22,' ||
            ' Decode(AM.agr_conceptos,''' || vch_agr_02 || ''',' || vch_acum_tie || ',0),' ||
            ' 0 C24, 0 C25, Round((SU.salario),0) C26, 0 C27,' ||
            ' Decode(AM.agr_conceptos,''' || vch_agr_02 || ''', Round((' || vch_acum_imp || '),0), 0),' ||
            ' 0 C29, 0 C30, 0.1450 C31,' ||
            ' Decode(AM.agr_conceptos,''' || vch_agr_03 || ''', Round((' || vch_acum_imp || '-1)/100, 0)*100,  0),' ||
            ' 0 C33, 0 C34, 0 C35,' ||
            ' Decode(AM.agr_conceptos,''' || vch_agr_04 || ''', Round((' || vch_acum_imp || '-1)/100, 0)*100,  0),' ||
            ' 0 C37, 0 C38,';
        vvc_sql_2 :=
            ' '' '' C39, 0 C40, '' '' C41, 0 C42, 0 C43, 0 C44, 0 C45, 0 C46, '' '' C47, '' '' C48' ||
            ' FROM trabajadores T, vw_fco_trabajadores_cia TG,' ||
            ' vw_fco_EPS_trabajador EPS, vw_fco_FPO_trabajador FPO,' || 
            ' vw_fco_div_trabajador SUC, vw_fco_sueldos SU, acumulados_mensuales AM'||
            ' WHERE T.trabajador = TG.trabajador AND' ||
            ' EPS.compania(+) = TG.compania AND EPS.trabajador(+) = TG.trabajador AND ' ||
            ' FPO.compania = TG.compania AND FPO.trabajador = TG.trabajador AND ' ||
            ' SUC.compania = TG.compania AND SUC.trabajador = TG.trabajador AND '||
            ' SU.compania = TG.compania AND SU.trabajador = TG.trabajador AND ' ||
            ' AM.compania = TG.compania AND AM.trabajador = TG.trabajador AND ' ||
            ' RTrim(FPO.dato) =' || vch_cod_ISS || 
            ' AND decode(RTrim(EPS.DATO),'||''||vch_cod_ISS||''||',1,2) <> 1 '||' AND' ||
--          ' AND RTrim(EPS.dato) <> ' || vch_cod_ISS || ' AND' ||
            ' AM.compania =''' || pch_compania || ''' AND'||
            ' AM.anio = ' || To_Char(psm_anio) || ' AND ' ||
            ' AM.agr_conceptos IN (''' ||vch_agr_02 || ''',' ||
            '''' || vch_agr_03 || ''',''' || vch_agr_04 || ''',''' || vch_agr_08 || ''',' ||
            '''' || vch_agr_18 || ''',''' || vch_agr_20 || ''')' || vvc_condicion1;
        BEGIN
            vin_id_cursor := dbms_sql.open_cursor;
            dbms_sql.parse(vin_id_cursor, vvc_sql_1 || vvc_sql_2, dbms_sql.v7);
            vin_rows := dbms_sql.execute(vin_id_cursor);
            dbms_sql.close_cursor(vin_id_cursor);
        EXCEPTION
            WHEN OTHERS THEN
                raise_application_error (-20001, 'Error al llenar la tabla temporal. (FPO)');
        END;
        COMMIT;
        /* inserta los valores (Depurados) a la tabla */
        vvc_sql_1 :=
            ' INSERT INTO ' || vvc_tabla ||
            ' SELECT CIA, COD_TRAB, COD_EPS, COD_FPO, COD_SUC, C03, C04, C05,' ||
              ' '' '' C09, '' '' C10, '' '' C11, '' '' C12, '' '' C13, '' '' C14, Max(C15),' ||
              ' Max(C16), Max(C17), Max(C18), Max(C19), '' '' C20, '' '' C21, 0 C22,' ||
              ' Max(C23), Max(C24), 0 C25, Max(C26), 0 C27, Max(C28), Max(C29),' ||
              ' 0 C30, Max(C31), Max(C32), 0 C33, 0 C34, 0 C35, Max(C36),' ||
              ' 0 C37, Max(C38), '' '' C39, 0 C40, '' '' C41, 0 C42, Max(C43),' ||
              ' 0 C44, 0 C45, 0 C46, '' '' C47, '' '' C48' ||
            ' FROM FCO_ISS' || vvc_condicion0 ||
            ' GROUP BY CIA, C05, C04, COD_TRAB, COD_EPS, COD_FPO, COD_SUC, C03' ||
            ' ORDER BY CIA, C05';
        BEGIN
            vin_id_cursor := dbms_sql.open_cursor;
            dbms_sql.parse(vin_id_cursor, vvc_sql_1, dbms_sql.v7);
            vin_rows := dbms_sql.execute(vin_id_cursor);
            dbms_sql.close_cursor(vin_id_cursor);
        EXCEPTION
            WHEN OTHERS THEN
                raise_application_error (-20001, 'Error al llenar la tabla depurada');
        END;
        COMMIT;
		/***Actualizacion del tipo de documento. DCRP-Mayo5/2004 ***/
        BEGIN
            vvc_sql_1 := ' UPDATE ' || vvc_tabla ||
                       ' SET C03 = ''T''' ||
                       ' WHERE CIA =''' || pch_compania || ''' AND' ||
                       ' EXISTS (SELECT 1 ' ||
                       ' FROM rel_trab_agr' ||
                       ' WHERE compania = cia AND ' ||
                       ' trabajador = cod_trab AND' ||
                       ' agrupacion = ''NIT'' AND' ||
                       ' dato = ''TI'''||')';
            BEGIN
                vin_id_cursor := dbms_sql.open_cursor;
                dbms_sql.parse(vin_id_cursor, vvc_sql_1, dbms_sql.v7);
                vin_rows := dbms_sql.execute(vin_id_cursor);
                dbms_sql.close_cursor(vin_id_cursor);
            EXCEPTION
                WHEN OTHERS THEN
                    raise_application_error (-20001, 'Error al actualizar Tipo de documento [TI]');
            END;
            COMMIT;
        END;
        BEGIN
            vvc_sql_1 := ' UPDATE ' || vvc_tabla ||
                       ' SET C03 = ''E''' ||
                       ' WHERE CIA =''' || pch_compania || ''' AND' ||
                       ' EXISTS (SELECT 1 ' ||
                       ' FROM rel_trab_agr' ||
                       ' WHERE compania = cia AND ' ||
                       ' trabajador = cod_trab AND' ||
                       ' agrupacion = ''NIT'' AND' ||
                       ' dato = ''CE'''||')';
            BEGIN
                vin_id_cursor := dbms_sql.open_cursor;
                dbms_sql.parse(vin_id_cursor, vvc_sql_1, dbms_sql.v7);
                vin_rows := dbms_sql.execute(vin_id_cursor);
                dbms_sql.close_cursor(vin_id_cursor);
            EXCEPTION
                WHEN OTHERS THEN
                    raise_application_error (-20001, 'Error al actualizar Tipo de documento [CE]');
            END;
            COMMIT;
        END;
        /*** NOVEDADES ***/
        /* ING: INGRESO A LA COMPANIA */
        BEGIN
            vvc_sql_1 := ' UPDATE ' || vvc_tabla ||
                         ' SET C09 = ''X''' ||
                         ' WHERE CIA =''' || pch_compania || ''' AND' ||
                         ' EXISTS (SELECT 1 ' ||
                         ' FROM vw_fco_trabajadores_cia' ||
                         ' WHERE compania = cia AND ' ||
                         ' trabajador = cod_trab AND' ||
                         ' Substr(To_Char(fecha_ingreso,''yyyymmdd''),1,6)='''||vch_periodo||''')' ||
                         vvc_condicion2;
            BEGIN
                vin_id_cursor := dbms_sql.open_cursor;
                dbms_sql.parse(vin_id_cursor, vvc_sql_1, dbms_sql.v7);
                vin_rows := dbms_sql.execute(vin_id_cursor);
                dbms_sql.close_cursor(vin_id_cursor);
            EXCEPTION
                WHEN OTHERS THEN
                    raise_application_error (-20001, 'Error al insertar Novedad ING');
            END;
            COMMIT;
        END;
        /* RET: RETIRO DE LA COMPANIA */
        BEGIN
            vvc_sql_1 := ' UPDATE ' || vvc_tabla ||
                         ' SET C10 = ''X''' ||
                         ' WHERE CIA =''' || pch_compania || ''' AND' ||
                         ' EXISTS (SELECT 1 ' ||
                         ' FROM vw_fco_trabajadores_cia' ||
                         ' WHERE compania = cia AND ' ||
                         ' trabajador = cod_trab AND' ||
                         ' Substr(To_Char(fecha_baja,''yyyymmdd''),1,6)='''||vch_periodo||''')' ||
                         vvc_condicion2;
            BEGIN
                vin_id_cursor := dbms_sql.open_cursor;
                dbms_sql.parse(vin_id_cursor, vvc_sql_1, dbms_sql.v7);
                vin_rows := dbms_sql.execute(vin_id_cursor);
                dbms_sql.close_cursor(vin_id_cursor);
            EXCEPTION
                WHEN OTHERS THEN
                    raise_application_error (-20001, 'Error al insertar Novedad RET');
            END;
            COMMIT;
        END;
        /* TDA: INGRESO AL ISS EN PENSIONES */
        BEGIN
            vvc_sql_1 := ' UPDATE ' || vvc_tabla ||
                         ' SET C11 = ''X''' ||
                         ' WHERE CIA =''' || pch_compania || ''' AND' ||
			 ' C09 <> ''X'' AND' ||
                         ' RTrim(COD_FPO) = ' || vch_cod_ISS || ' AND ' ||
                         ' EXISTS (SELECT 1 ' ||
                         ' FROM vw_fco_hist_traslados_FPO' ||
                         ' WHERE compania = cia AND ' ||
                         ' trabajador = cod_trab AND' ||
                         ' Substr(To_Char(fecha_alta,''yyyymmdd''),1,6)='''||vch_periodo||''')' ||
                         vvc_condicion2;
            BEGIN
                vin_id_cursor := dbms_sql.open_cursor;
                dbms_sql.parse(vin_id_cursor, vvc_sql_1, dbms_sql.v7);
                vin_rows := dbms_sql.execute(vin_id_cursor);
                dbms_sql.close_cursor(vin_id_cursor);
            EXCEPTION
                WHEN OTHERS THEN
                    raise_application_error (-20001, 'Error al insertar Novedad TDA (FPO)');
            END;
            COMMIT;
        END;
        /* TDA: INGRESO AL ISS EN SALUD */
        BEGIN
            vvc_sql_1 := ' UPDATE ' || vvc_tabla ||
                         ' SET C11 = ''X''' ||
                         ' WHERE CIA =''' || pch_compania || ''' AND' ||
			 ' C09 <> ''X'' AND' ||
                         ' RTrim(COD_EPS) = ' || vch_cod_ISS || ' AND ' ||
                         ' EXISTS (SELECT 1 ' ||
                         ' FROM vw_fco_hist_traslados_EPS' ||
                         ' WHERE compania = cia AND ' ||
                         ' trabajador = cod_trab AND' ||
                         ' Substr(To_Char(fecha_alta,''yyyymmdd''),1,6)='''||vch_periodo||''')' ||
                         vvc_condicion2;
            BEGIN
                vin_id_cursor := dbms_sql.open_cursor;
                dbms_sql.parse(vin_id_cursor, vvc_sql_1, dbms_sql.v7);
                vin_rows := dbms_sql.execute(vin_id_cursor);
                dbms_sql.close_cursor(vin_id_cursor);
            EXCEPTION
                WHEN OTHERS THEN
                    raise_application_error (-20001, 'Error al insertar Novedad TDA (EPS)');
            END;
            COMMIT;
        END;
        /* TAA: RETIRO DEL ISS EN PENSIONES */
        BEGIN
            vvc_sql_1 := ' UPDATE ' || vvc_tabla ||
                         ' SET C12 = ''X''' ||
                         ' WHERE CIA =''' || pch_compania || ''' AND' ||
                         ' RTrim(COD_FPO) = ' || vch_cod_ISS || ' AND ' ||
                         ' EXISTS (SELECT 1 ' ||
                         ' FROM fco_traslados_FPO' ||
                         ' WHERE compania = cia AND ' ||
                         ' trabajador = cod_trab AND' ||
                         ' Substr(To_Char(fecha_cambio,''yyyymmdd''),1,6)='''||vch_periodo||''')' ||
                         vvc_condicion2;
            BEGIN
                vin_id_cursor := dbms_sql.open_cursor;
                dbms_sql.parse(vin_id_cursor, vvc_sql_1, dbms_sql.v7);
                vin_rows := dbms_sql.execute(vin_id_cursor);
                dbms_sql.close_cursor(vin_id_cursor);
            EXCEPTION
                WHEN OTHERS THEN
                    raise_application_error (-20001, 'Error al insertar Novedad TAA (FPO)');
            END;
            COMMIT;
        END;
        /* TAA: RETIRO DEL ISS EN SALUD */
        BEGIN
            vvc_sql_1 := ' UPDATE ' || vvc_tabla ||
                         ' SET C12 = ''X''' ||
                         ' WHERE CIA =''' || pch_compania || ''' AND' ||
                         ' RTrim(COD_EPS) = ' || vch_cod_ISS || ' AND ' ||
                         ' EXISTS (SELECT 1 ' ||
                         ' FROM fco_traslados_EPS' ||
                         ' WHERE compania = cia AND ' ||
                         ' trabajador = cod_trab AND' ||
                         ' Substr(To_Char(fecha_cambio,''yyyymmdd''),1,6)='''||vch_periodo||''')' ||
                         vvc_condicion2;
            BEGIN
                vin_id_cursor := dbms_sql.open_cursor;
                dbms_sql.parse(vin_id_cursor, vvc_sql_1, dbms_sql.v7);
                vin_rows := dbms_sql.execute(vin_id_cursor);
                dbms_sql.close_cursor(vin_id_cursor);
            EXCEPTION
                WHEN OTHERS THEN
                    raise_application_error (-20001, 'Error al insertar Novedad TAA (EPS)');
            END;
            COMMIT;
        END;
        /* VSP: CAMBIO PERMANENTE DE SUELDO */
        BEGIN    
            vvc_sql_1 := ' UPDATE ' || vvc_tabla ||
                         ' SET C13 = ''X''' ||
                         ' WHERE CIA =''' || pch_compania || ''' AND' ||
                         ' C09 <> ''X'' AND ' ||
                         ' EXISTS (SELECT 1 ' ||
                         ' FROM sueldos' ||
                         ' WHERE compania = cia AND ' ||
                         ' trabajador = cod_trab AND' ||
                         ' Substr(To_Char(fecha,''yyyymmdd''),1,6)='''||vch_periodo||''')' ||
                         vvc_condicion2;
            BEGIN
                vin_id_cursor := dbms_sql.open_cursor;
                dbms_sql.parse(vin_id_cursor, vvc_sql_1, dbms_sql.v7);
                vin_rows := dbms_sql.execute(vin_id_cursor);
                dbms_sql.close_cursor(vin_id_cursor);
            EXCEPTION
                WHEN OTHERS THEN
                    raise_application_error (-20001, 'Error al insertar Novedad VSP');
            END;
            COMMIT;
        END;
        /* CODIGO NUEVA ADMINISTRADORA */
        /* EPS */
        BEGIN    
            vvc_sql_1 :=' UPDATE ' || vvc_tabla || 
                        ' SET C47 = (SELECT A.cod_super ' ||
                                  ' FROM fco_administradoras A, fco_traslados_eps T' ||
                                  ' WHERE A.codigo = T.EPS_nueva AND' ||
                                  ' A.tipo = ''EPS'' AND' ||
                                  ' RTrim(T.EPS_actual) = ' || vch_cod_ISS || ' AND' ||
                                  ' CIA = T.compania AND' ||
                                  ' COD_TRAB = T.trabajador AND' ||
                                  ' Substr(To_Char(fecha_cambio,''yyyymmdd''),1,6)='''||vch_periodo||''')' ||
                        ' WHERE CIA =''' || pch_compania || ''' AND' ||
                        ' EXISTS (SELECT 1 ' ||
                                ' FROM fco_administradoras A, fco_traslados_eps T' ||
                                ' WHERE A.codigo = T.EPS_nueva AND' ||
                                ' A.tipo = ''EPS'' AND' ||
                                ' RTrim(T.EPS_actual) = ' || vch_cod_ISS || ' AND' ||
                                ' CIA = T.compania AND' ||
                                ' COD_TRAB = T.trabajador AND' ||
                                ' Substr(To_Char(fecha_cambio,''yyyymmdd''),1,6)='''||vch_periodo||''')' ||
                        vvc_condicion2;
            BEGIN
                vin_id_cursor := dbms_sql.open_cursor;
                dbms_sql.parse(vin_id_cursor, vvc_sql_1, dbms_sql.v7);
                vin_rows := dbms_sql.execute(vin_id_cursor);
                dbms_sql.close_cursor(vin_id_cursor);
            EXCEPTION
                WHEN OTHERS THEN
                    raise_application_error (-20001, 'Error al insertar Codigo Nueva EPS');
            END;
            COMMIT;
        END;
        /* AFP */
        BEGIN
            vvc_sql_1 :=' UPDATE ' || vvc_tabla || 
                        ' SET C48 = (SELECT A.cod_super ' ||
                                  ' FROM fco_administradoras A, fco_traslados_fpo T' ||
                                  ' WHERE A.codigo = T.FPO_nueva AND' ||
                                  ' A.tipo = ''AFP'' AND' ||
                                  ' RTrim(T.FPO_actual) = ' || vch_cod_ISS || ' AND' ||
                                  ' CIA = T.compania AND' ||
                                  ' COD_TRAB = T.trabajador AND' ||
                                  ' Substr(To_Char(fecha_cambio,''yyyymmdd''),1,6)='''||vch_periodo||''')' ||
                        ' WHERE CIA =''' || pch_compania || ''' AND' ||
                        ' EXISTS (SELECT 1 ' ||
                                ' FROM fco_administradoras A, fco_traslados_fpo T' ||
                                ' WHERE A.codigo = T.FPO_nueva AND' ||
                                ' A.tipo = ''AFP'' AND' ||
                                ' RTrim(T.FPO_actual) = ' || vch_cod_ISS || ' AND' ||
                                ' CIA = T.compania AND' ||
                                ' COD_TRAB = T.trabajador AND' ||
                                ' Substr(To_Char(fecha_cambio,''yyyymmdd''),1,6)='''||vch_periodo||''')' ||
                        vvc_condicion2;
            BEGIN
                vin_id_cursor := dbms_sql.open_cursor;
                dbms_sql.parse(vin_id_cursor, vvc_sql_1, dbms_sql.v7);
                vin_rows := dbms_sql.execute(vin_id_cursor);
                dbms_sql.close_cursor(vin_id_cursor);
            EXCEPTION
                WHEN OTHERS THEN
                    raise_application_error (-20001, 'Error al insertar Codigo Nueva FPO');
            END;
            COMMIT;
        END;
        /* AUTORIZACIONES ENFERMEDAD GENERAL (NUMERO Y VALOR POR TRABAJADOR) */
        BEGIN
            vvc_sql_1 :=' UPDATE ' || vvc_tabla ||
                        ' SET C39 = (SELECT numero ' ||
                                   ' FROM fco_autorizaciones C, fco_autorizaciones_det D' ||
                                   ' WHERE C.compania = D.compania And C.autorizacion = D.autorizacion' ||
                                   ' AND cia = C.compania AND cod_trab = D.trabajador' ||
                                   ' AND tipo_incapacidad = 0' ||
                                   ' AND cod_entidad = ' || vch_cod_ISS || 
                                   ' AND periodo='''||vch_periodo || '''),' ||
                        ' C40 = (SELECT valor_total ' ||
                                   ' FROM fco_autorizaciones C, fco_autorizaciones_det D' ||
                                   ' WHERE C.compania = D.compania And C.autorizacion = D.autorizacion' ||
                                   ' AND cia = C.compania AND cod_trab = D.trabajador' ||
                                   ' AND tipo_incapacidad = 0' ||
                                   ' AND cod_entidad = ' || vch_cod_ISS || 
                                   ' AND periodo='''||vch_periodo || ''')' ||
                        ' WHERE CIA = '''||pch_compania||''' AND' ||
                        ' EXISTS (SELECT 1 ' ||
                                ' FROM fco_autorizaciones C, fco_autorizaciones_det D' ||
                                ' WHERE C.compania = D.compania And C.autorizacion = D.autorizacion' ||
                                ' AND cia = C.compania AND cod_trab = D.trabajador' ||
                                ' AND tipo_incapacidad = 0' ||
                                ' AND periodo='''||vch_periodo || ''')' ||
                  vvc_condicion2;

            BEGIN
                vin_id_cursor := dbms_sql.open_cursor;
                dbms_sql.parse(vin_id_cursor, vvc_sql_1, dbms_sql.v7);
                vin_rows := dbms_sql.execute(vin_id_cursor);
                dbms_sql.close_cursor(vin_id_cursor);
            EXCEPTION
                WHEN OTHERS THEN
                    raise_application_error (-20001, 'Error al llenar las autorizaciones de Incapacidades por EG');
            END;
            COMMIT;
        END;
        /* INSERCION DE LAS AUTORIZACIONES POR EG EN LA TABLA DEL PIE DE REPORTE */
        OPEN cr_autorizaciones_eg;
        LOOP
            FETCH cr_autorizaciones_eg INTO cch_sucursal, vvc_num_aut, vnm_vlr_aut;
            EXIT WHEN cr_autorizaciones_eg%NOTFOUND;
            IF NOT(vbl_existe) OR (pbl_regenerar AND Rtrim(cch_sucursal) = RTrim(pch_sucursal)) Then
                sp_fco_cambio_ala_datos_adi (vvc_tabla, 4, 'ISS', cch_sucursal, 0, vvc_num_aut, vnm_vlr_aut, null, null);
            END IF;
        END LOOP;
        CLOSE cr_autorizaciones_eg;
        /* AUTORIZACIONES LICENCIAS DE MATERNIDAD (NUMERO Y VALOR POR TRABAJADOR) */
        BEGIN
            vvc_sql_1 :=' UPDATE ' || vvc_tabla ||
                        ' SET C41 = (SELECT MAX(numero) ' ||
                                   ' FROM fco_autorizaciones C, fco_autorizaciones_det D' ||
                                   ' WHERE C.compania = D.compania And C.autorizacion = D.autorizacion' ||
                                   ' AND cia = C.compania AND cod_trab = D.trabajador' ||
                                   ' AND tipo_incapacidad = 1' ||
                                   ' AND cod_entidad = ' || vch_cod_ISS || 
                                   ' AND periodo='''||vch_periodo || '''),' ||
                        ' C42 = (SELECT SUM(valor) ' ||
                                   ' FROM fco_autorizaciones C, fco_autorizaciones_det D' ||
                                   ' WHERE C.compania = D.compania And C.autorizacion = D.autorizacion' ||
                                   ' AND cia = C.compania AND cod_trab = D.trabajador' ||
                                   ' AND tipo_incapacidad = 1' ||
                                   ' AND cod_entidad = ' || vch_cod_ISS || 
                                   ' AND periodo='''||vch_periodo || ''')' ||
                        ' WHERE CIA = '''||pch_compania||''' AND' ||
                        ' EXISTS (SELECT 1 ' ||
                                ' FROM fco_autorizaciones C, fco_autorizaciones_det D' ||
                                ' WHERE C.compania = D.compania And C.autorizacion = D.autorizacion' ||
                                ' AND cia = C.compania AND cod_trab = D.trabajador' ||
                                ' AND tipo_incapacidad = 1' ||
                                ' AND periodo='''||vch_periodo || ''')' ||
                  vvc_condicion2;
            BEGIN
                vin_id_cursor := dbms_sql.open_cursor;
                dbms_sql.parse(vin_id_cursor, vvc_sql_1, dbms_sql.v7);
                vin_rows := dbms_sql.execute(vin_id_cursor);
                dbms_sql.close_cursor(vin_id_cursor);
            EXCEPTION
                WHEN OTHERS THEN
                    raise_application_error (-20001, 'Error al llenar las autorizaciones de Licencias de Maternidad');
            END;
            COMMIT;
        END;
        /* INSERCION DE LAS AUTORIZACIONES POR LM EN LA TABLA DEL PIE DE REPORTE */
        OPEN cr_autorizaciones_lm;
        LOOP
            FETCH cr_autorizaciones_lm INTO cch_sucursal, vvc_num_aut, vnm_vlr_aut;
            EXIT WHEN cr_autorizaciones_lm%NOTFOUND;
            IF NOT(vbl_existe) OR (pbl_regenerar AND Rtrim(cch_sucursal) = RTrim(pch_sucursal)) Then
                sp_fco_cambio_ala_datos_adi (vvc_tabla, 4, 'ISS', cch_sucursal, 1, vvc_num_aut, vnm_vlr_aut, null, null);
            END IF;
        END LOOP;
        CLOSE cr_autorizaciones_lm;
        COMMIT WORK;
    END IF;
    BEGIN
        IF pbl_generar_mm THEN
            sp_fco_crea_ISS_mm (pch_compania, psm_anio, psm_mes, pch_sucursal);
        END IF;
    END;
    
    /*** Borrar datos de la tabla modelo ***/
    DELETE FCO_ISS;
    COMMIT;
    
END;
/
CREATE PUBLIC SYNONYM sp_fco_crea_ISS FOR ADAM.sp_fco_crea_ISS;
GRANT EXECUTE ON sp_fco_crea_ISS TO adama;
