CREATE OR REPLACE PROCEDURE sp_fco_crea_vw_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 Consolidado. Considera que el ISS NO ES LA ARP.       ***/
/*** Tablas:      Parametros_MF, Trabajadores, Acumulados_Mensuales, VW_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:       Julio 10 de 2001                                              ***/
/*** Revision:    Septiembre 19 de 2002                                         ***/
/*** Motor:       Oracle 8i                 Version interna: 1.00               ***/
/**********************************************************************************/
AS
    vch_acum_imp    char(15);
    vch_acum_tie    char(15);

    vch_agr_02      char(5);
    vch_agr_03      char(5);
    vch_agr_04      char(5);
    vch_agr_05      char(5);
    vch_agr_08      char(5);
    vch_agr_09      char(5);
    vch_agr_10      char(5);
    vch_agr_11      char(5);
    vch_agr_12      char(5);
    vch_agr_16      char(5);
    vch_agr_18      char(5);

    vvc_tabla       varchar2(30);
    vbl_existe	    boolean;
    vnm_existe      number(1); -- cosas de oracle
    vvc_sql         varchar2(3000);
    vch_cod_ISS     char(5);

    vch_periodo     char(8);

    cvc_num_aut     varchar2(10);
    cnm_vlr_aut     number(9,0);

    vin_id_cursor   integer;
    vin_rows	    integer;

    vvc_condicion0  varchar2(255); --WHERE
    vvc_condicion1  varchar2(255); --AND
    vvc_condicion2  varchar2(255); --AND
    vvc_condicion3  varchar2(255); --AND

    cch_sucursal    char(10);

    vnm_arp_iss     number(1);
    vvc_control_suc varchar2(10);
    vnm_random      number(5);

    cdc_ap_riesgos  number(9,0);

    CURSOR cr_autorizaciones_eg IS
    SELECT 
        sucursal, Max(numero) NRO, Sum(valor_total) VLR
    FROM 
        fco_autorizaciones
    WHERE 
        compania = pch_compania And
        periodo = Substr(vch_periodo,2,6) 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 = Substr(vch_periodo,2,6) And 
        RTrim(cod_entidad) = 'ISS' And
        tipo_incapacidad = 1
    GROUP BY
        sucursal
    HAVING Sum(valor_total) > 0;

    CURSOR cr_aportes_riesgos IS
    SELECT sucursal, valor
    FROM fco_vw_iss_arp
    WHERE clave = vnm_random;
   
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;

    /* Codigo del ISS en la compania -Cambiar si es necesario - */
    vch_cod_ISS := '''ISS''';

    /* Periodo de Cotizacion */
    vch_periodo := '''' || LTrim(RTrim(psm_anio)) || Substr(vch_acum_imp,14,2) || '''';

    /* Control del codigo de la sucursal */
    vvc_control_suc := Nvl(RTrim(pch_sucursal),'NA');
    IF Nvl(Length(RTrim(pch_sucursal)),0) = 0 THEN
        vvc_control_suc := 'NA';
    END IF;

    /*** 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;

    /* Cotizacion Obligatoria de Pension */
    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;

    /* Cotizacion 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;

    /* Cotizacion Obligatoria Riesgos Profesionales */
    SELECT '''' || Nvl(dato, 'S09') || '''' INTO vch_agr_09 FROM vw_fdt_parametros 
    WHERE compania = pch_compania AND parametro = 'autoliq' AND secuencia = 9;

    /* 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;

    /* Incapacidad por Accidente de Trabajo */
    SELECT '''' || Nvl(dato, 'S12') || ''''  INTO vch_agr_12 FROM vw_fdt_parametros 
    WHERE compania = pch_compania AND parametro = 'autoliq' AND secuencia = 12;

    /* IBC de 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;

    /*** Fin de Recuperar Agrupaciones de Conceptos ***/


    /*** Saber si el ISS es la ARP de la compaņia ***/
    BEGIN
        SELECT Nvl(arp_iss, 0)
        INTO vnm_arp_iss
        FROM fco_cias_datos_adi
        WHERE compania = pch_compania;
    EXCEPTION 
        WHEN OTHERS THEN vnm_arp_iss := 0;
    END;

    /*** Establecer el Nombre de la Tabla ***/
     vvc_tabla := 'FCO_VW_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_VW_ISS;
    COMMIT;

    /*** Crear y dar permisos a la tabla***/    
    IF NOT(vbl_existe) THEN
        sp_fco_crea_tablas (vvc_tabla);
    END IF;

  	IF vvc_control_suc = 'NA' 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 := 'DELETE FROM ' || vvc_tabla || vvc_condicion0;
        BEGIN
            vin_id_cursor := dbms_sql.open_cursor;
            dbms_sql.parse(vin_id_cursor, vvc_sql, 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 modelo (FCO_VW_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 :=
            ' INSERT INTO FCO_VW_ISS' ||
            ' SELECT AM.compania CIA, TG.trabajador COD_TRAB, ' || 
                ' EPS.dato COD_EPS, FPO.dato COD_FPO, SUC.dato COD_SUC,' ||
                ' ''C'' C10A, T.clave_unica C10B, SUBSTR(T.nombre,1,60) C10C,' ||
                ' '' '' C11A, '' '' C11B, '' '' C11C, 0 C11D, 0 C11E,'||
                ' Nvl(Decode(am.agr_conceptos,' || vch_agr_16 || ',' || vch_acum_tie || ',0),0) C12A,' ||
                ' Nvl(Decode(am.agr_conceptos,' || vch_agr_16 || ',Round((' || vch_acum_imp || '),0),0),0) C13A,' ||
                ' Nvl(Decode(am.agr_conceptos,' || vch_agr_03 || ',Round((' || vch_acum_imp || '-1)/100,0)*100,0),0) C14A,' ||
                ' Nvl(Decode(am.agr_conceptos,' || vch_agr_04 || ',Round((' || vch_acum_imp || '-1)/100,0)*100,0),0) C14B,' ||
                ' Nvl(Decode(am.agr_conceptos,' || vch_agr_05 || ',Round((' || vch_acum_imp || '-1)/100,0)*100,0),0) C14C,' ||
                ' '' '' C25N, 0 C25C, '' '' C26N, 0 C26C' ||
            ' FROM trabajadores T, vw_fco_trabajadores_cia TG,'||
                ' vw_fco_eps_trabajador EPS, vw_fco_fpo_trabajador FPO,' ||
                ' vw_fco_div_trabajador SUC, acumulados_mensuales AM'||
            ' WHERE T.trabajador = TG.trabajador AND '  ||
                ' FPO.compania = TG.compania AND FPO.trabajador = TG.trabajador AND ' ||
                ' EPS.compania = TG.compania AND EPS.trabajador = TG.trabajador AND ' ||
                ' SUC.compania = TG.compania AND SUC.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_16 || ')' 
                || ' 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, 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 :=
            ' INSERT INTO FCO_VW_ISS' ||
            ' SELECT AM.compania CIA, TG.trabajador COD_TRAB, ' || 
                ' EPS.dato COD_EPS, FPO.dato COD_FPO, SUC.dato COD_SUC,' ||
                ' ''C'' C10A, T.clave_unica C10B, SUBSTR(T.nombre,1,60) C10C,' ||
                ' '' '' C11A, '' '' C11B, '' '' C11C, 0 C11D, 0 C11E,'||
                ' Nvl(Decode(am.agr_conceptos,' || vch_agr_16 || ',' || vch_acum_tie || ',0),0) C12A,' ||
                ' Nvl(Decode(am.agr_conceptos,' || vch_agr_16 || ',Round((' || vch_acum_imp || '),0),0),0) C13A,' ||
                ' 0 C14A, 0 C14B,' ||
                ' Nvl(Decode(am.agr_conceptos,' || vch_agr_05 || ',Round((' || vch_acum_imp || '-1)/100,0)*100,0),0) C14C, ' ||
                ' '' '' C25N, 0 C25C, '' '' C26N, 0 C26C' ||
            ' FROM trabajadores T, vw_fco_trabajadores_cia TG,'||
                ' vw_fco_eps_trabajador EPS, vw_fco_fpo_trabajador FPO,' ||
                ' vw_fco_div_trabajador SUC, acumulados_mensuales AM'||
            ' WHERE T.trabajador = TG.trabajador AND '  ||
                ' FPO.compania = TG.compania AND FPO.trabajador = TG.trabajador AND ' ||
                ' EPS.compania = TG.compania AND EPS.trabajador = TG.trabajador AND ' ||
                ' SUC.compania = TG.compania AND SUC.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_05 || ',' || vch_agr_16 || ')' ||
                vvc_condicion1;
        BEGIN
            vin_id_cursor := dbms_sql.open_cursor;
            dbms_sql.parse(vin_id_cursor, vvc_sql, 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 :=
            ' INSERT INTO FCO_VW_ISS' ||
            ' SELECT AM.compania CIA, TG.trabajador COD_TRAB, ' || 
                ' EPS.dato COD_EPS, FPO.dato COD_FPO, SUC.dato COD_SUC,' ||
                ' ''C'' C10A, T.clave_unica C10B, SUBSTR(T.nombre,1,60) C10C,' ||
                ' '' '' C11A, '' '' C11B, '' '' C11C, 0 C11D, 0 C11E,'||
                ' Nvl(Decode(am.agr_conceptos,' || vch_agr_02 || ',' || vch_acum_tie || ',0),0) C12A,' ||
                ' Nvl(Decode(am.agr_conceptos,' || vch_agr_02 || ',Round((' || vch_acum_imp || '),0),0),0) C13A,' ||
                ' Nvl(Decode(am.agr_conceptos,' || vch_agr_03 || ',Round((' || vch_acum_imp || '-1)/100,0)*100,0),0) C14A,' ||
                ' Nvl(Decode(am.agr_conceptos,' || vch_agr_04 || ',Round((' || vch_acum_imp || '-1)/100,0)*100,0),0) C14B,' ||
                ' 0 C14C, '' '' C25N, 0 C25C, '' '' C26N, 0 C26C' ||
            ' FROM trabajadores T, vw_fco_trabajadores_cia TG,'||
                ' vw_fco_eps_trabajador EPS, vw_fco_fpo_trabajador FPO,' ||
                ' vw_fco_div_trabajador SUC, acumulados_mensuales AM'||
            ' WHERE T.trabajador = TG.trabajador AND '  ||
                ' FPO.compania = TG.compania AND FPO.trabajador = TG.trabajador AND ' ||
                ' EPS.compania = TG.compania AND EPS.trabajador = TG.trabajador AND ' ||
                ' SUC.compania = TG.compania AND SUC.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 || ')' || vvc_condicion1;
        BEGIN
            vin_id_cursor := dbms_sql.open_cursor;
            dbms_sql.parse(vin_id_cursor, vvc_sql, 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 :=  
            ' INSERT INTO ' || vvc_tabla ||
            ' SELECT CIA,COD_TRAB,COD_EPS,COD_FPO,COD_SUC,C10A,C10B,C10C,MAX(C11A),MAX(C11B),MAX(C11C),MAX(C11D),MAX(C11E),' ||
            ' MAX(C12A),MAX(C13A),MAX(C14A),MAX(C14B),MAX(C14C),MAX(C25N),MAX(C25C),MAX(C26N),MAX(C26C)' ||
            ' FROM FCO_VW_ISS' || vvc_condicion0 ||
            ' GROUP BY CIA, C10B, C10C, COD_TRAB, COD_EPS, COD_FPO, COD_SUC, C10A';
        BEGIN
            vin_id_cursor := dbms_sql.open_cursor;
            dbms_sql.parse(vin_id_cursor, vvc_sql, 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;


        /******* N O V E D A D E S *******/

        /* INCAPACIDADES POR LICENCIA DE MATERNIDAD */
        BEGIN
            vvc_sql := 
                ' UPDATE ' || vvc_tabla ||
                ' SET C11B = (SELECT Decode(' || vch_acum_imp || ',0,'' '',''I'')' ||
                            ' FROM acumulados_mensuales' ||
                            ' WHERE CIA = compania And COD_TRAB = trabajador And' ||
                                  ' anio = ' || To_Char(psm_anio) || ' And' ||
                                  ' agr_conceptos = ' || vch_agr_10 ||
                            ')' ||
                ' WHERE RTrim(COD_EPS) = ' || vch_cod_ISS || ' And' ||
                      ' CIA =''' || pch_compania || ''' And ' ||
                      ' C13A <> 0 And' ||
                      ' EXISTS (SELECT 1' ||
                            ' FROM acumulados_mensuales' ||
                            ' WHERE CIA = compania And COD_TRAB = trabajador And' ||
                                  ' anio = ' || To_Char(psm_anio) || ' And' ||
                                  ' agr_conceptos = ' || vch_agr_10 ||
                            ')' ||
                vvc_condicion2;
            BEGIN
                vin_id_cursor := dbms_sql.open_cursor;
                dbms_sql.parse(vin_id_cursor, vvc_sql, 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 C11B Incapacidad Salud - E.G.');
            END;
            COMMIT;

        END;

         /* INCAPACIDADES POR ENFERMEDAD GENERAL */
        BEGIN
            vvc_sql := 
                ' UPDATE ' || vvc_tabla ||
                ' SET C11B = (SELECT Decode(' || vch_acum_imp || ',0,'' '',''I'')' ||
                            ' FROM acumulados_mensuales' ||
                            ' WHERE CIA = compania And COD_TRAB = trabajador And' ||
                                  ' anio = ' || To_Char(psm_anio) || ' And' ||
                                  ' agr_conceptos =' || vch_agr_11 ||
                            ')' ||
                ' WHERE RTrim(COD_EPS) = ' || vch_cod_ISS || ' And' ||
                      ' CIA =''' || pch_compania || ''' And ' ||
                      ' C13A <> 0 And' ||
                      ' EXISTS (SELECT 1' ||
                            ' FROM acumulados_mensuales' ||
                            ' WHERE CIA = compania And COD_TRAB = trabajador And' ||
                                  ' anio = ' || To_Char(psm_anio) || ' And' ||
                                  ' agr_conceptos =' || vch_agr_11 ||
                            ')' ||
                vvc_condicion2;
            BEGIN
                vin_id_cursor := dbms_sql.open_cursor;
                dbms_sql.parse(vin_id_cursor, vvc_sql, 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 C11B Incapacidad Salud - L.M.');
            END;
            COMMIT;
        END;

        /* INCAPACIDADES POR ACCIDENTES DE TRABAJO */
	IF vnm_arp_iss = 1 THEN
            vvc_sql := 
                ' UPDATE ' || vvc_tabla ||
                ' SET C11C = (SELECT Decode(' || vch_acum_imp || ',0,'' '',''I'')' ||
                            ' FROM acumulados_mensuales' ||
                            ' WHERE CIA = compania And COD_TRAB = trabajador And' ||
                                  ' anio = ' || To_Char(psm_anio) || ' And' ||
                                  ' agr_conceptos =' || vch_agr_12 ||
                            ')' ||
                ' WHERE CIA =''' || pch_compania || ''' And ' ||
                      ' C13A <> 0 And' ||
                      ' EXISTS (SELECT 1' ||
                            ' FROM acumulados_mensuales' ||
                            ' WHERE CIA = compania And COD_TRAB = trabajador And' ||
                                  ' anio = ' || To_Char(psm_anio) || ' And' ||
                                  ' agr_conceptos =' || vch_agr_12 ||
                            ')' ||
                vvc_condicion2;
            BEGIN
                vin_id_cursor := dbms_sql.open_cursor;
                dbms_sql.parse(vin_id_cursor, vvc_sql, 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 C11C Incapacidad Riesgos Profesionales');
            END;
            COMMIT;
	END IF;


        /* LICENCIA NO REMUNERADA Y SANCIONES  COLUMNA A: PENSION */
        BEGIN
            vvc_sql := 
                ' UPDATE ' || vvc_tabla ||
                ' SET C11A = (SELECT Decode(' || vch_acum_imp || ',0,'' '',''L'')' ||
                            ' FROM acumulados_mensuales' ||
                            ' WHERE CIA = compania And COD_TRAB = trabajador And' ||
                                  ' anio = ' || To_Char(psm_anio) || ' And' ||
                                  ' agr_conceptos = ' || vch_agr_18 || 
                            ')' ||
                ' WHERE RTrim(COD_FPO) = ' || vch_cod_ISS || ' And' ||
                      ' CIA =''' || pch_compania || ''' And ' ||
                      ' C13A <> 0 And' ||
                      ' EXISTS (SELECT 1' ||
                            ' FROM acumulados_mensuales' ||
                            ' WHERE CIA = compania And COD_TRAB = trabajador And' ||
                                  ' anio = ' || To_Char(psm_anio) || ' And' ||
                                  ' agr_conceptos = ' || vch_agr_18 || 
                            ')' ||
                vvc_condicion2;
            BEGIN
                vin_id_cursor := dbms_sql.open_cursor;
                dbms_sql.parse(vin_id_cursor, vvc_sql, 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 C11A Sanciones');
            END;
            COMMIT;

        END;


         /* LICENCIA NO REMUNERADA Y SANCIONES  COLUMNA B: SALUD */
        BEGIN
            vvc_sql := 
                ' UPDATE ' || vvc_tabla ||
                ' SET C11B = (SELECT Decode(' || vch_acum_imp || ',0,'' '',''L'')' ||
                            ' FROM acumulados_mensuales' ||
                            ' WHERE CIA = compania And COD_TRAB = trabajador And' ||
                                  ' anio = ' || To_Char(psm_anio) || ' And' ||
                                  ' agr_conceptos = ' || vch_agr_18 || 
                            ')' ||
                ' WHERE RTrim(COD_EPS) = ' || vch_cod_ISS || ' And' ||
                      ' CIA =''' || pch_compania || ''' And ' ||
                      ' C13A <> 0 And' ||
                      ' EXISTS (SELECT 1' ||
                            ' FROM acumulados_mensuales' ||
                            ' WHERE CIA = compania And COD_TRAB = trabajador And' ||
                                  ' anio = ' || To_Char(psm_anio) || ' And' ||
                                  ' agr_conceptos = ' || vch_agr_18 || 
                            ')' ||
                vvc_condicion2;
            BEGIN
                vin_id_cursor := dbms_sql.open_cursor;
                dbms_sql.parse(vin_id_cursor, vvc_sql, 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 C11B Sanciones');
            END;
            COMMIT;

        END;

        /* LICENCIA NO REMUNERADA Y SANCIONES  COLUMNA C: RIESGOS */
	IF vnm_arp_iss = 1 THEN
            vvc_sql := 
                ' UPDATE ' || vvc_tabla ||
                ' SET C11B = (SELECT Decode(' || vch_acum_imp || ',0,'' '',''L'')' ||
                            ' FROM acumulados_mensuales' ||
                            ' WHERE CIA = compania And COD_TRAB = trabajador And' ||
                                  ' anio = ' || To_Char(psm_anio) || ' And' ||
                                  ' agr_conceptos = ' || vch_agr_18 || 
                            ')' ||
                ' WHERE CIA =''' || pch_compania || ''' And ' ||
                      ' C13A <> 0 And' ||
                      ' EXISTS (SELECT 1' ||
                            ' FROM acumulados_mensuales' ||
                            ' WHERE CIA = compania And COD_TRAB = trabajador And' ||
                                  ' anio = ' || To_Char(psm_anio) || ' And' ||
                                  ' agr_conceptos = ' || vch_agr_18 || 
                            ')' ||
                vvc_condicion2;
            BEGIN
                vin_id_cursor := dbms_sql.open_cursor;
                dbms_sql.parse(vin_id_cursor, vvc_sql, 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 C11B Sanciones');
            END;
            COMMIT;

        END IF;

        /* NOVEDAD V: VACACIONES */
	IF vnm_arp_iss = 1 THEN
            vvc_sql := 
                ' UPDATE ' || vvc_tabla ||
                ' SET C11C = (SELECT Decode(' || vch_acum_imp || ',0,'' '',''V'')' ||
                            ' FROM acumulados_mensuales' ||
                            ' WHERE CIA = compania And COD_TRAB = trabajador And' ||
                                  ' anio = ' || To_Char(psm_anio) || ' And' ||
                                  ' agr_conceptos =' || vch_agr_08 ||
                            '),' ||
                    ' C11E = (SELECT ' || vch_acum_tie ||
                            ' FROM acumulados_mensuales' ||
                            ' WHERE CIA = compania And COD_TRAB = trabajador And' ||
                                  ' anio = ' || To_Char(psm_anio) || ' And' ||
                                  ' agr_conceptos =' || vch_agr_08 ||
                            ')' ||
                ' WHERE CIA =''' || pch_compania || ''' And ' ||
                      ' C13A <> 0 And' ||
                      ' EXISTS (SELECT 1' ||
                            ' FROM acumulados_mensuales' ||
                            ' WHERE CIA = compania And COD_TRAB = trabajador And' ||
                                  ' anio = ' || To_Char(psm_anio) || ' And' ||
                                  ' agr_conceptos =' || vch_agr_08 ||
                            ')' ||
                vvc_condicion2;
            BEGIN
                vin_id_cursor := dbms_sql.open_cursor;
                dbms_sql.parse(vin_id_cursor, vvc_sql, 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 C11C Vacaciones');
            END;
            COMMIT;
	END IF;


	/* TRASLADO DEL ISS A OTRO FONDO DE PENSIONES */
        BEGIN
            vvc_sql := ' UPDATE ' || vvc_tabla ||
                       ' SET C11A = ''T''' ||
                       ' 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, 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 C11A Traslado FPO');
            END;
            COMMIT;
        END;


        /* TRASLADO DEL ISS A OTRA EPS */
        BEGIN
            vvc_sql := ' UPDATE ' || vvc_tabla ||
                       ' SET C11B = ''T''' ||
                       ' 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, 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 C11B Traslado EPS');
            END;
            COMMIT;
        END;


        /* RETIRO DE LA COMPAŅIA - COLUMNA A: PENSION */
        BEGIN
            vvc_sql := 
                ' UPDATE ' || vvc_tabla ||
                ' SET C11A = ''R'',' ||
                    ' C11D = (SELECT To_Number(To_Char(fecha_baja, ''dd''))' ||
                            ' FROM vw_fco_trabajadores_cia' ||
                            ' WHERE CIA = compania And' ||
                            ' COD_TRAB = trabajador And' ||
                            ' Substr(To_Char(fecha_baja,''yyyymmdd''),1,6) = ' || vch_periodo || 
                            ')' ||
                ' WHERE RTrim(COD_FPO) = ' || vch_cod_ISS || ' And' ||
                      ' CIA =''' || pch_compania || ''' And ' ||
                      ' C13A <> 0 And' ||
                      ' EXISTS (SELECT 1' ||
                            ' FROM vw_fco_trabajadores_cia' ||
                            ' WHERE CIA = compania And' ||
                            ' COD_TRAB = trabajador 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, 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 C11A Retiro Cia');
            END;
            COMMIT;

        END;


        /* RETIRO DE LA COMPAŅIA - COLUMNA B: SALUD */
        BEGIN
            vvc_sql := 
                ' UPDATE ' || vvc_tabla ||
                ' SET C11B = ''R'',' ||
                    ' C11D = (SELECT To_Number(To_Char(fecha_baja, ''dd''))' ||
                            ' FROM vw_fco_trabajadores_cia' ||
                            ' WHERE CIA = compania And' ||
                            ' COD_TRAB = trabajador And' ||
                            ' Substr(To_Char(fecha_baja,''yyyymmdd''),1,6) = ' || vch_periodo || 
                            ')' ||
                ' WHERE RTrim(COD_EPS) = ' || vch_cod_ISS || ' And' ||
                      ' CIA =''' || pch_compania || ''' And ' ||
                      ' C13A <> 0 And' ||
                      ' EXISTS (SELECT 1' ||
                            ' FROM vw_fco_trabajadores_cia' ||
                            ' WHERE CIA = compania And' ||
                            ' COD_TRAB = trabajador 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, 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 C11B Retiro Cia');
            END;
            COMMIT;

        END;

        /* RETIRO DE LA COMPAŅIA - COLUMNA C: RIESGOS */
        BEGIN
            vvc_sql := 
                ' UPDATE ' || vvc_tabla ||
                ' SET C11C = ''R'',' ||
                    ' C11D = (SELECT To_Number(To_Char(fecha_baja, ''dd''))' ||
                            ' FROM vw_fco_trabajadores_cia' ||
                            ' WHERE CIA = compania And' ||
                            ' COD_TRAB = trabajador And' ||
                            ' Substr(To_Char(fecha_baja,''yyyymmdd''),1,6) = ' || vch_periodo || 
                            ')' ||
                ' WHERE CIA =''' || pch_compania || ''' And ' ||
                      ' C13A <> 0 And' ||
                      ' EXISTS (SELECT 1' ||
                            ' FROM vw_fco_trabajadores_cia' ||
                            ' WHERE CIA = compania And' ||
                            ' COD_TRAB = trabajador 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, 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 C11C Retiro Cia');
            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, cvc_num_aut, cnm_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, 0, 'ISS', cch_sucursal, 0, cvc_num_aut, cnm_vlr_aut, null, null);
            END IF;
        END LOOP;
        CLOSE cr_autorizaciones_eg;


        /* 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, cvc_num_aut, cnm_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, 0, 'ISS', cch_sucursal, 1, cvc_num_aut, cnm_vlr_aut, null, null);
            END IF;
        END LOOP;
        CLOSE cr_autorizaciones_lm;

	COMMIT;

        /* INSERCION DE LOS APORTES A LA ARP EN LA TABLA DEL PIE DE REPORTE */
	IF vnm_arp_iss = 1 THEN
            SELECT fn_fco_random(vvc_control_suc) INTO vnm_random FROM dual;

            vvc_sql :=
	    ' INSERT INTO fco_vw_iss_arp' ||
            ' SELECT ' ||
		To_Char(vnm_random) || ', SUC.dato, Sum(' || vch_acum_imp || ')' ||
            ' FROM trabajadores T, vw_fco_trabajadores_cia TG,'||
                ' vw_fco_div_trabajador SUC, acumulados_mensuales AM'||
            ' WHERE T.trabajador = TG.trabajador AND '  ||
                ' SUC.compania = TG.compania AND SUC.trabajador = TG.trabajador AND '||
                ' AM.compania = TG.compania AND AM.trabajador = TG.trabajador    AND ' ||
                ' AM.compania =''' || pch_compania || ''' AND '||
                ' AM.anio = '|| To_Char(psm_anio) || ' AND ' ||
                ' AM.agr_conceptos =' || vch_agr_09 || vvc_condicion1 ||
	    ' GROUP BY SUC.dato';
            BEGIN
                vin_id_cursor := dbms_sql.open_cursor;
                dbms_sql.parse(vin_id_cursor, vvc_sql, 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 los aportes a Riesgos Profesionales');
            END;
	    
            OPEN cr_aportes_riesgos;
            LOOP
                FETCH cr_aportes_riesgos INTO cch_sucursal, cdc_ap_riesgos;
                EXIT WHEN cr_aportes_riesgos%NOTFOUND;
          
                IF NOT(vbl_existe) OR (pbl_regenerar AND Rtrim(cch_sucursal) = RTrim(pch_sucursal)) Then
                    sp_fco_cambio_ala_datos_adi (vvc_tabla, 0, 'ISS', cch_sucursal, 8, '', null, null, cdc_ap_riesgos);
                END IF;
            END LOOP;
            CLOSE cr_aportes_riesgos;

            DELETE fco_vw_iss_arp WHERE clave = vnm_random;

	    COMMIT;


        END IF;
	
        /* INSERCION DEL VALOR POR INCAPACIDADES DE ARP EN LA TABLA DEL PIE DE REPORTE */
	IF vnm_arp_iss = 1 THEN
            vvc_sql :=
	    ' INSERT INTO fco_vw_iss_arp' ||
            ' SELECT ' ||
		To_Char(vnm_random) || ', SUC.dato, Sum(' || vch_acum_imp || ')' ||
            ' FROM trabajadores T, vw_fco_trabajadores_cia TG,'||
                ' vw_fco_div_trabajador SUC, acumulados_mensuales AM'||
            ' WHERE T.trabajador = TG.trabajador AND '  ||
                ' SUC.compania = TG.compania AND SUC.trabajador = TG.trabajador AND '||
                ' AM.compania = TG.compania AND AM.trabajador = TG.trabajador    AND ' ||
                ' AM.compania =''' || pch_compania || ''' AND '||
                ' AM.anio = '|| To_Char(psm_anio) || ' AND ' ||
                ' AM.agr_conceptos =' || vch_agr_12 || vvc_condicion1 ||
	    ' GROUP BY SUC.dato';
            BEGIN
                vin_id_cursor := dbms_sql.open_cursor;
                dbms_sql.parse(vin_id_cursor, vvc_sql, 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 los aportes a Riesgos Profesionales');
            END;
	    
            OPEN cr_aportes_riesgos;
            LOOP
                FETCH cr_aportes_riesgos INTO cch_sucursal, cdc_ap_riesgos;
                EXIT WHEN cr_aportes_riesgos%NOTFOUND;
          
                IF NOT(vbl_existe) OR (pbl_regenerar AND Rtrim(cch_sucursal) = RTrim(pch_sucursal)) Then
                    sp_fco_cambio_ala_datos_adi (vvc_tabla, 0, 'ISS', cch_sucursal, 0, '', null, null, cdc_ap_riesgos);
                END IF;
            END LOOP;
            CLOSE cr_aportes_riesgos;

            DELETE fco_vw_iss_arp WHERE clave = vnm_random;

	    COMMIT;


        END IF;

	
	COMMIT WORK;

    END IF;

    BEGIN
        IF pbl_generar_mm THEN
            sp_fco_crea_autolx_mm (pch_compania, psm_anio, psm_mes, pch_sucursal);
        END IF;
    END;

    /*** Borrar datos de la tabla modelo ***/
    DELETE FCO_VW_ISS;
    COMMIT;
    
END;
/
CREATE PUBLIC SYNONYM sp_fco_crea_vw_iss FOR ADAM.sp_fco_crea_vw_iss;
GRANT EXECUTE ON sp_fco_crea_vw_iss TO adama;
