CREATE TABLE fco_parafiscales
(
  id_rep      number(5) NOT NULL,
  usuariow	  varchar2(30) NOT NULL,
  cod_rep     number(3) NOT NULL,  
  compania    char(4) NOT NULL,
  sucursal    char(10) NULL,
  anio        number(5) NULL,
  mes         number(3) NULL,
  trabajador  varchar2(15) NULL,
  nombre      varchar2(100) NULL,
  caja_cod    char(10) NULL,
  caja_nom    varchar2(60) NULL,
  valor_base  number(19,6) NULL,
  valor_caja  number(19,6) NULL,
  valor_sena  number(19,6) NULL,
  valor_icbf  number(19,6) NULL,
  agr1        varchar2(10) NULL,
  dato1       varchar2(10) NULL,
  desc1	      varchar2(40) NULL,
  agr2        varchar2(10) NULL,
  dato2       varchar2(10) NULL,
  desc2       varchar2(40) NULL,
  agr3        varchar2(10) NULL,
  dato3       varchar2(10) NULL,
  desc3	      varchar2(40) NULL,
  nombre_cia  varchar2(60) NULL,
  registro_fiscal varchar2(20) NULL
)
TABLESPACE TS_ADAMDATOS;

CREATE PUBLIC SYNONYM fco_parafiscales FOR ADAM.fco_parafiscales;
GRANT ALL ON fco_parafiscales TO ADAMA;

CREATE TABLE fco_parafiscales_tmp
(	
	id_rep   number(5) NOT NULL,
	usuariow varchar2(30) NOT NULL,
	trabajador char(10), 
	agr_caja char(10), 
	cod_caja char(10), 
	base number(19,6), 
	caja number(19,6), 
	sena number(19,6), 
	icbf number(19,6)
)
TABLESPACE TS_ADAMDATOS;

CREATE PUBLIC SYNONYM fco_parafiscales_tmp FOR ADAM.fco_parafiscales_tmp;
GRANT ALL ON fco_parafiscales_tmp TO ADAMA;


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;
CREATE OR REPLACE PROCEDURE sp_fco_del_rep_cajas
(
  psi_id_rep  number,
  pvc_usuario varchar2,
  pti_cod_rep number
)
/********************************************************************/
/*** Fiscal de Colombia de Data Tecnologia                        ***/
/*** Descripcion: limpia las tablas involucradas en la ejecucion  ***/
/*** del reporte de cajas                                         ***/
/*** Autor:	Diana Cecilia Rios Peinado                            ***/
/*** Fecha:	Mayo 14 de 2005                                      ***/
/********************************************************************/

AS
BEGIN
     DELETE fco_reportes_proc
     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;
     
     DELETE fco_parafiscales
     WHERE id_rep = psi_id_rep
     AND usuariow = pvc_usuario
     AND cod_rep = pti_cod_rep;

     DELETE fco_reportes_mm
     WHERE id_rep = psi_id_rep
     AND usuariow = pvc_usuario
     AND cod_rep = pti_cod_rep;
     
     COMMIT;
END;
/
CREATE PUBLIC SYNONYM sp_fco_del_rep_cajas FOR ADAM.sp_fco_del_rep_cajas;
GRANT EXECUTE ON sp_fco_del_rep_cajas TO adama;
