CREATE OR REPLACE PROCEDURE sp_fco_rep_cajas_compensacion
(
  psi_id_rep  number,
  pvc_usuario varchar2,
  pti_cod_rep number,
  pch_trab_dde char DEFAULT '',
  pch_trab_hta char DEFAULT '',
  pch_agr_1 char DEFAULT '',
  pch_agr_2 char DEFAULT '',
  pch_agr_3 char DEFAULT '',
  pch_dato_dde char DEFAULT '',
  pch_dato_hta char DEFAULT '',--hasta aqui serian parametros fijos    
  pch_compania    varchar2,
  pch_sucursal    varchar2,
  pnu_anio        varchar2,
  pnu_mes         varchar2
)
/********************************************************************/
/*** Fiscal de Colombia de Data Tecnologia                        ***/
/*** Descripcion: Genera el reporte de cajas de compensacion      ***/
/*** Autor:	Juan Carlos Leguizamon                                ***/
/*** Adecuacion:	Diana Cecilia Rios Peinado                      ***/
/*** Fecha:	Mayo 14 de 2005                                       ***/
/********************************************************************/
--Despues de los parametros fijos, los parametros se reciben como varchar y dentro del sp se convierten
--al tipo de datos correspondiente
AS
  w_agr_trab_caja    char(10);
  w_agr_conc_base    char(3);
  w_agr_conc_caja    char(3);
  w_agr_conc_sena    char(3);
  w_agr_conc_icbf    char(3);
  w_conc_base        number(5);
  w_conc_caja        number(5);
  w_conc_sena        number(5);
  w_conc_icbf        number(5);
    
  vch_compania char(4);
  vnu_anio number(5);
  vnu_mes number(3);
  vch_sucursal char(10);

  vti_trab_dde number(1);
  vti_trab_hta number(1);  

  vch_fecha char(8);
  vch_dias_fin char(2);
  vdt_fec_fin date; 
    
BEGIN
  -- Inicializar Variables
  w_agr_trab_caja := '';
  w_agr_conc_base := '';
  w_agr_conc_caja := '';
  w_agr_conc_sena := '';
  w_agr_conc_icbf := '';
  w_conc_base := -1;
  w_conc_caja := -1;
  w_conc_sena := -1;
  w_conc_icbf := -1;

  vch_compania := TRIM(pch_compania);
  vnu_anio := TO_NUMBER(pnu_anio);
  vnu_mes := TO_NUMBER(pnu_mes);
  
  IF NVL(TRIM(pch_sucursal), '0') = '0' THEN  
     vch_sucursal := '001';
  ELSE
     vch_sucursal := TRIM(pch_sucursal);
  END IF;

  --armando la fecha final
  SELECT TRIM(TO_CHAR(fn_fco_ult_dia_mes(vnu_anio, vnu_mes), '00'))
  INTO vch_dias_fin
  FROM dual;
  
  vch_fecha := TRIM(TO_CHAR(vnu_anio)) || TRIM(TO_CHAR(vnu_mes, '00')) || TRIM(vch_dias_fin);
  vdt_fec_fin := TO_DATE(SUBSTR(TRIM(vch_fecha),1,8),'YYYYMMDD'); 
  
  -- Recuperar parametros desde el MF
  SELECT dato INTO w_agr_trab_caja 
  FROM vw_fdt_parametros
  WHERE pais = 'COL' And compania = vch_compania And parametro = 'parafiscal' And secuencia = 1;

  SELECT DECODE(tipo,0,'-1',dato), DECODE(tipo,0, dato, -1)
  INTO w_agr_conc_base, w_conc_base
  FROM vw_fdt_parametros
  WHERE pais = 'COL' And compania = vch_compania And parametro = 'parafiscal' And secuencia = 6;

  SELECT DECODE(tipo,0,'-1',dato), DECODE(tipo,0, dato, -1)
  INTO w_agr_conc_caja, w_conc_caja
  FROM vw_fdt_parametros
  WHERE pais = 'COL' And compania = vch_compania And parametro = 'parafiscal' And secuencia = 2;

  SELECT DECODE(tipo,0,'-1',dato), DECODE(tipo,0, dato, -1)
  INTO w_agr_conc_sena, w_conc_sena
  FROM vw_fdt_parametros
  WHERE pais = 'COL' And compania = vch_compania And parametro = 'parafiscal' And secuencia = 3;

  SELECT DECODE(tipo,0,'-1',dato), DECODE(tipo,0, dato, -1)
  INTO w_agr_conc_icbf, w_conc_icbf
  FROM vw_fdt_parametros
  WHERE pais = 'COL' And compania = vch_compania And  parametro = 'parafiscal' And secuencia = 4;

  vti_trab_dde := 0;
  IF Nvl(TRIM(pch_trab_dde),'0') = '0' THEN
      vti_trab_dde := 1;
  END IF;
  
  vti_trab_hta := 0;
  IF Nvl(TRIM(pch_trab_hta),'0') = '0' THEN
      vti_trab_hta := 1;
  END IF;
  
  -- Borrar todos los datos actuales. 
  DELETE fco_parafiscales
  WHERE id_rep = psi_id_rep
  AND usuariow = pvc_usuario
  AND cod_rep = pti_cod_rep;
  
  DELETE fco_parafiscales_tmp
  WHERE id_rep = psi_id_rep
  AND usuariow = pvc_usuario;  
  
    -- Insertar los nuevos datos
    --Base, si es agrupacion de concepto
    IF TRIM(w_agr_conc_base) <> '-1' THEN
      INSERT INTO fco_parafiscales_tmp (id_rep, usuariow, trabajador, agr_caja, cod_caja, base)
      SELECT psi_id_rep, pvc_usuario,
             TG.trabajador, w_agr_trab_caja, RTA.dato,            
  	   Decode(vnu_mes,1, acum_imp_mes_01,
  			2, acum_imp_mes_02,
  			3, acum_imp_mes_03,
  			4, acum_imp_mes_04,
  			5, acum_imp_mes_05,
  			6, acum_imp_mes_06,
  			7, acum_imp_mes_07,
  			8, acum_imp_mes_08,
  			9, acum_imp_mes_09,
  			10, acum_imp_mes_10,
  			11, acum_imp_mes_11,
  			12, acum_imp_mes_12)
      FROM 
             trabajadores_grales TG, rel_trab_Agr RTA, acumulados_mensuales AM, vw_fco_div_trabajador SUC
      WHERE
             TG.compania = AM.compania And TG.trabajador = AM.trabajador And
             TG.compania = RTA.compania And TG.trabajador = RTA.trabajador And
             TG.compania = SUC.compania And TG.trabajador = SUC.trabajador And
             TG.compania = vch_compania And
             AM.anio = vnu_anio And
             AM.agr_conceptos = w_agr_conc_base And
             SUC.dato = vch_sucursal And
             RTA.agrupacion = w_agr_trab_caja
             -- CONDICIONES PARA VALIDAR LA SEGURIDAD                      
             -- AUTORIZACION A LA COMPANIA                      
             AND EXISTS (SELECT 1 FROM aut_companias x WHERE x.compania = tg.compania AND x.usuario = user)
             -- AUTORIZACION POR CLASE DE NOMINA                      
             AND EXISTS (SELECT 1 FROM rel_usu_clase_nom y WHERE y.clase_nomina = tg.clase_nomina AND y.usuario = user)
             -- AUTORIZACION POR AGRUPACIONES                   
             AND NOT EXISTS (SELECT 1 FROM rel_usu_agr_trab u2, rel_trab_agr r2
                            WHERE u2.agrupacion = r2.agrupacion AND u2.dato = r2.dato
                            AND r2.compania = tg.compania AND r2.trabajador = tg.trabajador
                            AND u2.usuario = user)           
             And ((TRIM(vti_trab_dde) = 1) OR (TG.trabajador >= RTRIM(pch_trab_dde) AND TRIM(vti_trab_dde) = 0)) AND
                 ((TRIM(vti_trab_hta) = 1) OR (TG.trabajador <= RTRIM(pch_trab_hta) AND TRIM(vti_trab_hta) = 0));

    END IF;
               
    --Base, si es concepto
    IF w_conc_base <> -1 THEN
      INSERT INTO fco_parafiscales_tmp (id_rep, usuariow, trabajador, agr_caja, cod_caja, base)
      SELECT psi_id_rep, pvc_usuario,
             TG.trabajador, w_agr_trab_caja, RTA.dato,            
  	   Decode(vnu_mes,1, acum_imp_mes_01,
  			2, acum_imp_mes_02,
  			3, acum_imp_mes_03,
  			4, acum_imp_mes_04,
  			5, acum_imp_mes_05,
  			6, acum_imp_mes_06,
  			7, acum_imp_mes_07,
  			8, acum_imp_mes_08,
  			9, acum_imp_mes_09,
  			10, acum_imp_mes_10,
  			11, acum_imp_mes_11,
  			12, acum_imp_mes_12)
      FROM 
             trabajadores_grales TG, rel_trab_Agr RTA, acumulados_mensuales AM, vw_fco_div_trabajador SUC
      WHERE
             TG.compania = AM.compania And TG.trabajador = AM.trabajador And
             TG.compania = RTA.compania And TG.trabajador = RTA.trabajador And
             TG.compania = SUC.compania And TG.trabajador = SUC.trabajador And
             TG.compania = vch_compania And
             AM.anio = vnu_anio And
             AM.concepto = w_conc_base And
             SUC.dato = vch_sucursal And
             RTA.agrupacion = w_agr_trab_caja
             -- CONDICIONES PARA VALIDAR LA SEGURIDAD                      
             -- AUTORIZACION A LA COMPANIA                      
             AND EXISTS (SELECT 1 FROM aut_companias x WHERE x.compania = tg.compania AND x.usuario = user)
             -- AUTORIZACION POR CLASE DE NOMINA                      
             AND EXISTS (SELECT 1 FROM rel_usu_clase_nom y WHERE y.clase_nomina = tg.clase_nomina AND y.usuario = user)
             -- AUTORIZACION POR AGRUPACIONES                   
             AND NOT EXISTS (SELECT 1 FROM rel_usu_agr_trab u2, rel_trab_agr r2
                            WHERE u2.agrupacion = r2.agrupacion AND u2.dato = r2.dato
                            AND r2.compania = tg.compania AND r2.trabajador = tg.trabajador
                            AND u2.usuario = user)           
             And ((TRIM(vti_trab_dde) = 1) OR (TG.trabajador >= RTRIM(pch_trab_dde) AND TRIM(vti_trab_dde) = 0)) AND
                 ((TRIM(vti_trab_hta) = 1) OR (TG.trabajador <= RTRIM(pch_trab_hta) AND TRIM(vti_trab_hta) = 0));
    END IF;                 

    --Caja, si es agrupacion de concepto
    IF TRIM(w_agr_conc_caja) <> '-1' THEN
      INSERT INTO fco_parafiscales_tmp (id_rep, usuariow, trabajador, agr_caja, cod_caja, caja)
      SELECT psi_id_rep, pvc_usuario,
             TG.trabajador, w_agr_trab_caja, RTA.dato,            
  	   Decode(vnu_mes,1, acum_imp_mes_01,
  			2, acum_imp_mes_02,
  			3, acum_imp_mes_03,
  			4, acum_imp_mes_04,
  			5, acum_imp_mes_05,
  			6, acum_imp_mes_06,
  			7, acum_imp_mes_07,
  			8, acum_imp_mes_08,
  			9, acum_imp_mes_09,
  			10, acum_imp_mes_10,
  			11, acum_imp_mes_11,
  			12, acum_imp_mes_12)
      FROM 
             trabajadores_grales TG, rel_trab_Agr RTA, acumulados_mensuales AM, vw_fco_div_trabajador SUC
      WHERE
             TG.compania = AM.compania And TG.trabajador = AM.trabajador And
             TG.compania = RTA.compania And TG.trabajador = RTA.trabajador And
             TG.compania = SUC.compania And TG.trabajador = SUC.trabajador And
             TG.compania = vch_compania And
             AM.anio = vnu_anio And
             AM.agr_conceptos = w_agr_conc_caja And
             SUC.dato = vch_sucursal And
             RTA.agrupacion = w_agr_trab_caja
             -- CONDICIONES PARA VALIDAR LA SEGURIDAD                      
             -- AUTORIZACION A LA COMPANIA                      
             AND EXISTS (SELECT 1 FROM aut_companias x WHERE x.compania = tg.compania AND x.usuario = user)
             -- AUTORIZACION POR CLASE DE NOMINA                      
             AND EXISTS (SELECT 1 FROM rel_usu_clase_nom y WHERE y.clase_nomina = tg.clase_nomina AND y.usuario = user)
             -- AUTORIZACION POR AGRUPACIONES                   
             AND NOT EXISTS (SELECT 1 FROM rel_usu_agr_trab u2, rel_trab_agr r2
                            WHERE u2.agrupacion = r2.agrupacion AND u2.dato = r2.dato
                            AND r2.compania = tg.compania AND r2.trabajador = tg.trabajador
                            AND u2.usuario = user)           
             And ((TRIM(vti_trab_dde) = 1) OR (TG.trabajador >= RTRIM(pch_trab_dde) AND TRIM(vti_trab_dde) = 0)) AND
                 ((TRIM(vti_trab_hta) = 1) OR (TG.trabajador <= RTRIM(pch_trab_hta) AND TRIM(vti_trab_hta) = 0));
    END IF;
               
    --Caja, si es concepto
    IF w_conc_caja <> -1 THEN
      INSERT INTO fco_parafiscales_tmp (id_rep, usuariow, trabajador, agr_caja, cod_caja, caja)
      SELECT psi_id_rep, pvc_usuario,
             TG.trabajador, w_agr_trab_caja, RTA.dato,            
  	   Decode(vnu_mes,1, acum_imp_mes_01,
  			2, acum_imp_mes_02,
  			3, acum_imp_mes_03,
  			4, acum_imp_mes_04,
  			5, acum_imp_mes_05,
  			6, acum_imp_mes_06,
  			7, acum_imp_mes_07,
  			8, acum_imp_mes_08,
  			9, acum_imp_mes_09,
  			10, acum_imp_mes_10,
  			11, acum_imp_mes_11,
  			12, acum_imp_mes_12)
      FROM 
             trabajadores_grales TG, rel_trab_Agr RTA, acumulados_mensuales AM, vw_fco_div_trabajador SUC
      WHERE
             TG.compania = AM.compania And TG.trabajador = AM.trabajador And
             TG.compania = RTA.compania And TG.trabajador = RTA.trabajador And
             TG.compania = SUC.compania And TG.trabajador = SUC.trabajador And
             TG.compania = vch_compania And
             AM.anio = vnu_anio And
             AM.concepto = w_conc_caja And
             SUC.dato = vch_sucursal And
             RTA.agrupacion = w_agr_trab_caja
             -- CONDICIONES PARA VALIDAR LA SEGURIDAD                      
             -- AUTORIZACION A LA COMPANIA                      
             AND EXISTS (SELECT 1 FROM aut_companias x WHERE x.compania = tg.compania AND x.usuario = user)
             -- AUTORIZACION POR CLASE DE NOMINA                      
             AND EXISTS (SELECT 1 FROM rel_usu_clase_nom y WHERE y.clase_nomina = tg.clase_nomina AND y.usuario = user)
             -- AUTORIZACION POR AGRUPACIONES                   
             AND NOT EXISTS (SELECT 1 FROM rel_usu_agr_trab u2, rel_trab_agr r2
                            WHERE u2.agrupacion = r2.agrupacion AND u2.dato = r2.dato
                            AND r2.compania = tg.compania AND r2.trabajador = tg.trabajador
                            AND u2.usuario = user)           
             And ((TRIM(vti_trab_dde) = 1) OR (TG.trabajador >= RTRIM(pch_trab_dde) AND TRIM(vti_trab_dde) = 0)) AND
                 ((TRIM(vti_trab_hta) = 1) OR (TG.trabajador <= RTRIM(pch_trab_hta) AND TRIM(vti_trab_hta) = 0));
    END IF;

    --Sena, si es agrupacion de concepto
    IF TRIM(w_agr_conc_sena) <> '-1' THEN
      INSERT INTO fco_parafiscales_tmp (id_rep, usuariow, trabajador, agr_caja, cod_caja, sena)
      SELECT psi_id_rep, pvc_usuario,
             TG.trabajador, w_agr_trab_caja, RTA.dato,            
  	   Decode(vnu_mes,1, acum_imp_mes_01,
  			2, acum_imp_mes_02,
  			3, acum_imp_mes_03,
  			4, acum_imp_mes_04,
  			5, acum_imp_mes_05,
  			6, acum_imp_mes_06,
  			7, acum_imp_mes_07,
  			8, acum_imp_mes_08,
  			9, acum_imp_mes_09,
  			10, acum_imp_mes_10,
  			11, acum_imp_mes_11,
  			12, acum_imp_mes_12)
      FROM 
             trabajadores_grales TG, rel_trab_Agr RTA, acumulados_mensuales AM, vw_fco_div_trabajador SUC
      WHERE
             TG.compania = AM.compania And TG.trabajador = AM.trabajador And
             TG.compania = RTA.compania And TG.trabajador = RTA.trabajador And
             TG.compania = SUC.compania And TG.trabajador = SUC.trabajador And
             TG.compania = vch_compania And
             AM.anio = vnu_anio And
             AM.agr_conceptos = w_agr_conc_sena And
             SUC.dato = vch_sucursal And
             RTA.agrupacion = w_agr_trab_caja
             -- CONDICIONES PARA VALIDAR LA SEGURIDAD                      
             -- AUTORIZACION A LA COMPANIA                      
             AND EXISTS (SELECT 1 FROM aut_companias x WHERE x.compania = tg.compania AND x.usuario = user)
             -- AUTORIZACION POR CLASE DE NOMINA                      
             AND EXISTS (SELECT 1 FROM rel_usu_clase_nom y WHERE y.clase_nomina = tg.clase_nomina AND y.usuario = user)
             -- AUTORIZACION POR AGRUPACIONES                   
             AND NOT EXISTS (SELECT 1 FROM rel_usu_agr_trab u2, rel_trab_agr r2
                            WHERE u2.agrupacion = r2.agrupacion AND u2.dato = r2.dato
                            AND r2.compania = tg.compania AND r2.trabajador = tg.trabajador
                            AND u2.usuario = user)           
             And ((TRIM(vti_trab_dde) = 1) OR (TG.trabajador >= RTRIM(pch_trab_dde) AND TRIM(vti_trab_dde) = 0)) AND
                 ((TRIM(vti_trab_hta) = 1) OR (TG.trabajador <= RTRIM(pch_trab_hta) AND TRIM(vti_trab_hta) = 0));
    END IF;
               
    --Sena, si es concepto
    IF w_conc_sena <> -1 THEN
      INSERT INTO fco_parafiscales_tmp (id_rep, usuariow, trabajador, agr_caja, cod_caja, sena)
      SELECT psi_id_rep, pvc_usuario,
             TG.trabajador, w_agr_trab_caja, RTA.dato,            
  	   Decode(vnu_mes,1, acum_imp_mes_01,
  			2, acum_imp_mes_02,
  			3, acum_imp_mes_03,
  			4, acum_imp_mes_04,
  			5, acum_imp_mes_05,
  			6, acum_imp_mes_06,
  			7, acum_imp_mes_07,
  			8, acum_imp_mes_08,
  			9, acum_imp_mes_09,
  			10, acum_imp_mes_10,
  			11, acum_imp_mes_11,
  			12, acum_imp_mes_12)
      FROM 
             trabajadores_grales TG, rel_trab_Agr RTA, acumulados_mensuales AM, vw_fco_div_trabajador SUC
      WHERE
             TG.compania = AM.compania And TG.trabajador = AM.trabajador And
             TG.compania = RTA.compania And TG.trabajador = RTA.trabajador And
             TG.compania = SUC.compania And TG.trabajador = SUC.trabajador And
             TG.compania = vch_compania And
             AM.anio = vnu_anio And
             AM.concepto = w_conc_sena And
             SUC.dato = vch_sucursal And
             RTA.agrupacion = w_agr_trab_caja
             -- CONDICIONES PARA VALIDAR LA SEGURIDAD                      
             -- AUTORIZACION A LA COMPANIA                      
             AND EXISTS (SELECT 1 FROM aut_companias x WHERE x.compania = tg.compania AND x.usuario = user)
             -- AUTORIZACION POR CLASE DE NOMINA                      
             AND EXISTS (SELECT 1 FROM rel_usu_clase_nom y WHERE y.clase_nomina = tg.clase_nomina AND y.usuario = user)
             -- AUTORIZACION POR AGRUPACIONES                   
             AND NOT EXISTS (SELECT 1 FROM rel_usu_agr_trab u2, rel_trab_agr r2
                            WHERE u2.agrupacion = r2.agrupacion AND u2.dato = r2.dato
                            AND r2.compania = tg.compania AND r2.trabajador = tg.trabajador
                            AND u2.usuario = user)           
             And ((TRIM(vti_trab_dde) = 1) OR (TG.trabajador >= RTRIM(pch_trab_dde) AND TRIM(vti_trab_dde) = 0)) AND
                 ((TRIM(vti_trab_hta) = 1) OR (TG.trabajador <= RTRIM(pch_trab_hta) AND TRIM(vti_trab_hta) = 0));
    END IF;
    
    --ICBF, si es agrupacion de concepto
    IF TRIM(w_agr_conc_icbf) <> '-1' THEN
      INSERT INTO fco_parafiscales_tmp (id_rep, usuariow, trabajador, agr_caja, cod_caja, icbf)
      SELECT psi_id_rep, pvc_usuario,
             TG.trabajador, w_agr_trab_caja, RTA.dato,            
  	   Decode(vnu_mes,1, acum_imp_mes_01,
  			2, acum_imp_mes_02,
  			3, acum_imp_mes_03,
  			4, acum_imp_mes_04,
  			5, acum_imp_mes_05,
  			6, acum_imp_mes_06,
  			7, acum_imp_mes_07,
  			8, acum_imp_mes_08,
  			9, acum_imp_mes_09,
  			10, acum_imp_mes_10,
  			11, acum_imp_mes_11,
  			12, acum_imp_mes_12)
      FROM 
             trabajadores_grales TG, rel_trab_Agr RTA, acumulados_mensuales AM, vw_fco_div_trabajador SUC
      WHERE
             TG.compania = AM.compania And TG.trabajador = AM.trabajador And
             TG.compania = RTA.compania And TG.trabajador = RTA.trabajador And
             TG.compania = SUC.compania And TG.trabajador = SUC.trabajador And
             TG.compania = vch_compania And
             AM.anio = vnu_anio And
             AM.agr_conceptos = w_agr_conc_icbf And
             SUC.dato = vch_sucursal And
             RTA.agrupacion = w_agr_trab_caja
             -- CONDICIONES PARA VALIDAR LA SEGURIDAD                      
             -- AUTORIZACION A LA COMPANIA                      
             AND EXISTS (SELECT 1 FROM aut_companias x WHERE x.compania = tg.compania AND x.usuario = user)
             -- AUTORIZACION POR CLASE DE NOMINA                      
             AND EXISTS (SELECT 1 FROM rel_usu_clase_nom y WHERE y.clase_nomina = tg.clase_nomina AND y.usuario = user)
             -- AUTORIZACION POR AGRUPACIONES                   
             AND NOT EXISTS (SELECT 1 FROM rel_usu_agr_trab u2, rel_trab_agr r2
                            WHERE u2.agrupacion = r2.agrupacion AND u2.dato = r2.dato
                            AND r2.compania = tg.compania AND r2.trabajador = tg.trabajador
                            AND u2.usuario = user)           
             And ((TRIM(vti_trab_dde) = 1) OR (TG.trabajador >= RTRIM(pch_trab_dde) AND TRIM(vti_trab_dde) = 0)) AND
                 ((TRIM(vti_trab_hta) = 1) OR (TG.trabajador <= RTRIM(pch_trab_hta) AND TRIM(vti_trab_hta) = 0));
    END IF;
                   
    --ICBF, si es concepto
    IF w_conc_icbf <> -1 THEN
      INSERT INTO fco_parafiscales_tmp (id_rep, usuariow, trabajador, agr_caja, cod_caja, icbf)
      SELECT psi_id_rep, pvc_usuario,
             TG.trabajador, w_agr_trab_caja, RTA.dato,            
  	   Decode(vnu_mes,1, acum_imp_mes_01,
  			2, acum_imp_mes_02,
  			3, acum_imp_mes_03,
  			4, acum_imp_mes_04,
  			5, acum_imp_mes_05,
  			6, acum_imp_mes_06,
  			7, acum_imp_mes_07,
  			8, acum_imp_mes_08,
  			9, acum_imp_mes_09,
  			10, acum_imp_mes_10,
  			11, acum_imp_mes_11,
  			12, acum_imp_mes_12)
      FROM 
             trabajadores_grales TG, rel_trab_Agr RTA, acumulados_mensuales AM, vw_fco_div_trabajador SUC
      WHERE
             TG.compania = AM.compania And TG.trabajador = AM.trabajador And
             TG.compania = RTA.compania And TG.trabajador = RTA.trabajador And
             TG.compania = SUC.compania And TG.trabajador = SUC.trabajador And
             TG.compania = vch_compania And
             AM.anio = vnu_anio And
             AM.concepto = w_conc_icbf And
             SUC.dato = vch_sucursal And
             RTA.agrupacion = w_agr_trab_caja
             -- CONDICIONES PARA VALIDAR LA SEGURIDAD                      
             -- AUTORIZACION A LA COMPANIA                      
             AND EXISTS (SELECT 1 FROM aut_companias x WHERE x.compania = tg.compania AND x.usuario = user)
             -- AUTORIZACION POR CLASE DE NOMINA                      
             AND EXISTS (SELECT 1 FROM rel_usu_clase_nom y WHERE y.clase_nomina = tg.clase_nomina AND y.usuario = user)
             -- AUTORIZACION POR AGRUPACIONES                   
             AND NOT EXISTS (SELECT 1 FROM rel_usu_agr_trab u2, rel_trab_agr r2
                            WHERE u2.agrupacion = r2.agrupacion AND u2.dato = r2.dato
                            AND r2.compania = tg.compania AND r2.trabajador = tg.trabajador
                            AND u2.usuario = user)           
             And ((TRIM(vti_trab_dde) = 1) OR (TG.trabajador >= RTRIM(pch_trab_dde) AND TRIM(vti_trab_dde) = 0)) AND
                 ((TRIM(vti_trab_hta) = 1) OR (TG.trabajador <= RTRIM(pch_trab_hta) AND TRIM(vti_trab_hta) = 0));
    END IF;
               
DBMS_OUTPUT.PUT_LINE('1: w_agr_conc_base'||w_agr_conc_base);
DBMS_OUTPUT.PUT_LINE('1: w_agr_conc_caja'||w_agr_conc_caja);
DBMS_OUTPUT.PUT_LINE('1: w_agr_conc_sena'||w_agr_conc_sena);
DBMS_OUTPUT.PUT_LINE('1: w_agr_conc_icbf'||w_agr_conc_icbf);

DBMS_OUTPUT.PUT_LINE('2: w_conc_base'||w_conc_base);
DBMS_OUTPUT.PUT_LINE('2: w_conc_caja'||w_conc_caja);
DBMS_OUTPUT.PUT_LINE('3: w_conc_sena'||w_conc_sena);
DBMS_OUTPUT.PUT_LINE('4: w_conc_icbf'||w_conc_icbf);
DBMS_OUTPUT.PUT_LINE('5: vti_trab_dde'||vti_trab_dde);
DBMS_OUTPUT.PUT_LINE('6: vti_trab_hta'||vti_trab_hta);
DBMS_OUTPUT.PUT_LINE('7: pch_trab_dde'||pch_trab_dde);
DBMS_OUTPUT.PUT_LINE('8: pch_trab_hta'||pch_trab_hta);
DBMS_OUTPUT.PUT_LINE('9: w_agr_trab_caja'||w_agr_trab_caja);

DBMS_OUTPUT.PUT_LINE('10: vch_sucursal'||vch_sucursal);
               
  -- NO PROCESAR LOS TRABAJADORES FUERA DEL RANGO DE DATOS DE LA AGR. 4
  IF NVL(TRIM(pch_dato_dde),'0') <> '0' THEN
    DELETE fco_parafiscales_tmp
    WHERE id_rep = psi_id_rep
    AND usuariow = pvc_usuario
    AND trabajador IN
      (SELECT trabajador FROM rel_trab_agr
      WHERE agrupacion = pch_agr_1
      AND dato < pch_dato_dde);
  END IF;
    
  IF NVL(TRIM(pch_dato_hta),'0') <> '0' THEN
    DELETE fco_parafiscales_tmp
    WHERE id_rep = psi_id_rep
    AND usuariow = pvc_usuario
    AND trabajador IN
        (SELECT trabajador FROM rel_trab_agr
         WHERE agrupacion = pch_agr_1
         AND dato > pch_dato_hta);
  END IF;
           
    INSERT INTO fco_parafiscales
    (id_rep, usuariow, cod_rep, compania, sucursal, anio, mes, trabajador, nombre, caja_cod, caja_nom,
    valor_base, valor_caja, valor_sena, valor_icbf)
    SELECT psi_id_rep, pvc_usuario, pti_cod_rep, vch_compania, vch_sucursal, vnu_anio, vnu_mes, 
           SUBSTR(TRIM(T.clave_unica),1,15), T.nombre, TMP.cod_caja, DAT.descripcion,
           sum(NVL(base,0)), sum(NVL(caja,0)), sum(NVL(sena,0)), sum(NVL(icbf,0))
    FROM  fco_parafiscales_tmp TMP, trabajadores T, datos_agr_trab DAT
    WHERE TMP.trabajador = T.trabajador And 
          TMP.agr_caja = DAT.agrupacion And TMP.cod_caja = DAT.dato
          And TMP.id_rep = psi_id_rep
          And TMP.usuariow = pvc_usuario
    GROUP BY 
          T.clave_unica, T.nombre, TMP.cod_caja, DAT.descripcion
    HAVING
          sum(NVL(base,0)) > 0;

    --actualizando el nombre de la cia y registro fiscal
    UPDATE fco_parafiscales rv
    SET nombre_cia = (SELECT nombre_cia FROM companias c
                      WHERE c.compania = rv.compania)
    WHERE rv.id_rep = psi_id_rep
    AND rv.usuariow = pvc_usuario
    AND rv.compania = vch_compania;
    
    UPDATE fco_parafiscales rv
    SET registro_fiscal = (SELECT registro_fiscal FROM companias c
                      WHERE c.compania = rv.compania)
    WHERE rv.id_rep = psi_id_rep
    AND rv.usuariow = pvc_usuario
    AND rv.compania = vch_compania;
                      
  -- DATOS DE LAS AGRUPACIONES SELECCIONADAS POR EL USUARIO 
  IF NVL(TRIM(pch_agr_1),'0') <> '0' THEN
    --Agrupacion 1 - agr1
    UPDATE fco_parafiscales rv
    SET agr1 = pch_agr_1
    WHERE rv.id_rep = psi_id_rep 
      AND rv.usuariow = pvc_usuario
      AND rv.cod_rep = pti_cod_rep;

    --Agrupacion 1 - dato1
    UPDATE fco_parafiscales rv
    SET dato1 = (SELECT b.dato
                FROM rel_trab_agr a, datos_agr_trab b                          
                WHERE a.agrupacion = b.agrupacion 
                  AND a.dato = b.dato 
                  AND rv.compania = a.compania 
                  AND rv.trabajador = a.trabajador
                  AND TRIM(rv.agr1) = TRIM(a.agrupacion)     
                  AND a.agrupacion = pch_agr_1
                  AND rv.id_rep = psi_id_rep 
                  AND rv.usuariow = pvc_usuario
                  AND rv.cod_rep = pti_cod_rep)
    WHERE rv.id_rep = psi_id_rep 
      AND rv.usuariow = pvc_usuario
      AND rv.cod_rep = pti_cod_rep;

--  si por casualidad el trabajador esta dado de baja, se busca en el hist_agrupaciones
  UPDATE fco_parafiscales rv
  SET dato1 = (SELECT b.dato
              FROM hist_agrupaciones a, datos_agr_trab b                          
              WHERE a.agrupacion = b.agrupacion 
                AND a.dato = b.dato 
                AND rv.compania = a.compania 
                AND rv.trabajador = a.trabajador
                AND TRIM(rv.agr1) = TRIM(a.agrupacion)  
                AND a.agrupacion = pch_agr_1
                AND a.fecha_alta = (select max(fecha_alta) from hist_agrupaciones h                        
                           where a.compania = h.compania AND
                                 a.agrupacion = h.agrupacion AND
                                 a.dato = h.dato AND                           
                                 a.trabajador = h.trabajador AND                          
                                 h.fecha_alta <= vdt_fec_fin) AND                          
                a.secuencia = (select max(secuencia) from hist_agrupaciones c                      
                               where a.compania = c.compania AND
                                     a.agrupacion = c.agrupacion AND
                                     a.dato = c.dato AND
                                     a.trabajador = c.trabajador AND
                                     c.fecha_alta <= vdt_fec_fin)
                AND rv.id_rep = psi_id_rep 
                AND rv.usuariow = pvc_usuario
                AND rv.cod_rep = pti_cod_rep
                AND rv.trabajador IN (SELECT trabajador FROM trabajadores_grales tg                    
                     WHERE rv.compania = tg.compania                    
                     AND rv.trabajador = tg.trabajador                    
                     AND tg.sit_trabajador = 2))                  
  WHERE NVL(TRIM(rv.dato1),' ') = ' '
  AND rv.id_rep = psi_id_rep 
  AND rv.usuariow = pvc_usuario
  AND rv.cod_rep = pti_cod_rep;
      
    --Agrupacion 1 - desc1
    UPDATE fco_parafiscales rv
    SET desc1 = (SELECT b.descripcion
              FROM datos_agr_trab b                          
              WHERE TRIM(rv.agr1) = TRIM(b.agrupacion)
                AND TRIM(rv.dato1) = TRIM(b.dato)
                  AND rv.id_rep = psi_id_rep 
                  AND rv.usuariow = pvc_usuario
                  AND rv.cod_rep = pti_cod_rep)  
    WHERE rv.id_rep = psi_id_rep 
      AND rv.usuariow = pvc_usuario
      AND rv.cod_rep = pti_cod_rep;
  
  END IF;
    -- fin agrupacion 1

  IF NVL(TRIM(pch_agr_2),'0') <> '0' THEN
    --Agrupacion 2 - agr2
    UPDATE fco_parafiscales rv
    SET agr2 = pch_agr_2
    WHERE rv.id_rep = psi_id_rep 
      AND rv.usuariow = pvc_usuario
      AND rv.cod_rep = pti_cod_rep;

    --Agrupacion 2 - dato2
    UPDATE fco_parafiscales rv
    SET dato2 = (SELECT b.dato
                FROM rel_trab_agr a, datos_agr_trab b                          
                WHERE a.agrupacion = b.agrupacion 
                  AND a.dato = b.dato 
                  AND rv.compania = a.compania 
                  AND rv.trabajador = a.trabajador
                  AND TRIM(rv.agr1) = TRIM(a.agrupacion)     
                  AND a.agrupacion = pch_agr_2
                  AND rv.id_rep = psi_id_rep 
                  AND rv.usuariow = pvc_usuario
                  AND rv.cod_rep = pti_cod_rep)
    WHERE rv.id_rep = psi_id_rep 
      AND rv.usuariow = pvc_usuario
      AND rv.cod_rep = pti_cod_rep;

--  si por casualidad el trabajador esta dado de baja, se busca en el hist_agrupaciones
  UPDATE fco_parafiscales rv
  SET dato2 = (SELECT b.dato
              FROM hist_agrupaciones a, datos_agr_trab b                          
              WHERE a.agrupacion = b.agrupacion 
                AND a.dato = b.dato 
                AND rv.compania = a.compania 
                AND rv.trabajador = a.trabajador
                AND TRIM(rv.agr2) = TRIM(a.agrupacion)  
                AND a.agrupacion = pch_agr_2
                AND a.fecha_alta = (select max(fecha_alta) from hist_agrupaciones h                        
                           where a.compania = h.compania AND
                                 a.agrupacion = h.agrupacion AND
                                 a.dato = h.dato AND                           
                                 a.trabajador = h.trabajador AND                          
                                 h.fecha_alta <= vdt_fec_fin) AND                          
                a.secuencia = (select max(secuencia) from hist_agrupaciones c                      
                               where a.compania = c.compania AND
                                     a.agrupacion = c.agrupacion AND
                                     a.dato = c.dato AND
                                     a.trabajador = c.trabajador AND
                                     c.fecha_alta <= vdt_fec_fin)
                AND rv.id_rep = psi_id_rep 
                AND rv.usuariow = pvc_usuario
                AND rv.cod_rep = pti_cod_rep
                AND rv.trabajador IN (SELECT trabajador FROM trabajadores_grales tg                    
                     WHERE rv.compania = tg.compania                    
                     AND rv.trabajador = tg.trabajador                    
                     AND tg.sit_trabajador = 2))                  
  WHERE NVL(TRIM(rv.dato2),' ') = ' '
  AND rv.id_rep = psi_id_rep 
  AND rv.usuariow = pvc_usuario
  AND rv.cod_rep = pti_cod_rep;
      
    --Agrupacion 2 - desc2
    UPDATE fco_parafiscales rv
    SET desc2 = (SELECT b.descripcion
              FROM datos_agr_trab b                          
              WHERE TRIM(rv.agr2) = TRIM(b.agrupacion)
                AND TRIM(rv.dato2) = TRIM(b.dato)
                  AND rv.id_rep = psi_id_rep 
                  AND rv.usuariow = pvc_usuario
                  AND rv.cod_rep = pti_cod_rep)  
    WHERE rv.id_rep = psi_id_rep 
      AND rv.usuariow = pvc_usuario
      AND rv.cod_rep = pti_cod_rep;
  
  END IF;
    -- fin agrupacion 2

  IF NVL(TRIM(pch_agr_3),'0') <> '0' THEN
    --Agrupacion 3 - agr3
    UPDATE fco_parafiscales rv
    SET agr3 = pch_agr_3
    WHERE rv.id_rep = psi_id_rep 
      AND rv.usuariow = pvc_usuario
      AND rv.cod_rep = pti_cod_rep;

    --Agrupacion 2 - dato2
    UPDATE fco_parafiscales rv
    SET dato3 = (SELECT b.dato
                FROM rel_trab_agr a, datos_agr_trab b                          
                WHERE a.agrupacion = b.agrupacion 
                  AND a.dato = b.dato 
                  AND rv.compania = a.compania 
                  AND rv.trabajador = a.trabajador
                  AND TRIM(rv.agr3) = TRIM(a.agrupacion)     
                  AND a.agrupacion = pch_agr_3
                  AND rv.id_rep = psi_id_rep 
                  AND rv.usuariow = pvc_usuario
                  AND rv.cod_rep = pti_cod_rep)
    WHERE rv.id_rep = psi_id_rep 
      AND rv.usuariow = pvc_usuario
      AND rv.cod_rep = pti_cod_rep;

--  si por casualidad el trabajador esta dado de baja, se busca en el hist_agrupaciones
  UPDATE fco_parafiscales rv
  SET dato3 = (SELECT b.dato
              FROM hist_agrupaciones a, datos_agr_trab b                          
              WHERE a.agrupacion = b.agrupacion 
                AND a.dato = b.dato 
                AND rv.compania = a.compania 
                AND rv.trabajador = a.trabajador
                AND TRIM(rv.agr3) = TRIM(a.agrupacion)  
                AND a.agrupacion = pch_agr_3
                AND a.fecha_alta = (select max(fecha_alta) from hist_agrupaciones h                        
                           where a.compania = h.compania AND
                                 a.agrupacion = h.agrupacion AND
                                 a.dato = h.dato AND                           
                                 a.trabajador = h.trabajador AND                          
                                 h.fecha_alta <= vdt_fec_fin) AND                          
                a.secuencia = (select max(secuencia) from hist_agrupaciones c                      
                               where a.compania = c.compania AND
                                     a.agrupacion = c.agrupacion AND
                                     a.dato = c.dato AND
                                     a.trabajador = c.trabajador AND
                                     c.fecha_alta <= vdt_fec_fin)
                AND rv.id_rep = psi_id_rep 
                AND rv.usuariow = pvc_usuario
                AND rv.cod_rep = pti_cod_rep
                AND rv.trabajador IN (SELECT trabajador FROM trabajadores_grales tg                    
                     WHERE rv.compania = tg.compania                    
                     AND rv.trabajador = tg.trabajador                    
                     AND tg.sit_trabajador = 2))                  
  WHERE NVL(TRIM(rv.dato3),' ') = ' '
  AND rv.id_rep = psi_id_rep 
  AND rv.usuariow = pvc_usuario
  AND rv.cod_rep = pti_cod_rep;
      
    --Agrupacion 3 - desc3
    UPDATE fco_parafiscales rv
    SET desc3 = (SELECT b.descripcion
              FROM datos_agr_trab b                          
              WHERE TRIM(rv.agr3) = TRIM(b.agrupacion)
                AND TRIM(rv.dato3) = TRIM(b.dato)
                  AND rv.id_rep = psi_id_rep 
                  AND rv.usuariow = pvc_usuario
                  AND rv.cod_rep = pti_cod_rep)  
    WHERE rv.id_rep = psi_id_rep 
      AND rv.usuariow = pvc_usuario
      AND rv.cod_rep = pti_cod_rep;
  
  END IF;
    -- fin agrupacion 3

  COMMIT;
          
  EXCEPTION
  WHEN OTHERS THEN
       RAISE_APPLICATION_ERROR(-20002, SQLCODE||SQLERRM(SQLCODE));
       RETURN;                    
END;
/
CREATE PUBLIC SYNONYM sp_fco_rep_cajas_compensacion FOR ADAM.sp_fco_rep_cajas_compensacion;
GRANT EXECUTE ON sp_fco_rep_cajas_compensacion TO adama;
