Create Or Replace Function fn_fco_cir_sodexho
(
    pch_compania in char, 
    psi_anio in number, 
    pti_mes in number, 
    pch_trabajador in char
)
/***************************************/
/*** JCL 12-MAR-08                   ***/
/*** Retorna el valor gravado        ***/
/*** de bonos sodexho por trabajador ***/
/*** Cliente: TELMEX                 ***/
/***************************************/
Return Number Is
    Result number;
    vch_var varchar2(15);
    vch_agr_che char(3);
    vdc_ingresos number(19,6);
    vdc_tope number(19,6);
    vdc_aux number(2,1);
    vdc_che number(19,6);
Begin    
    -- Agrupación bonos sodexho
    Begin
        Select Left(dato, 3) Into vch_agr_che From vw_fdt_parametros
        Where pais = 'COL' And compania = pch_compania And parametro = 'retencion' And secuencia = 21;
    Exception
        When Others Then vch_agr_che := 'x';
    End;
    -- Tope de ingresos para que los bonos sean gravados
    Begin
        Select 'var_nom_' || Trim(Nvl(dato, '0')) Into vch_var
        From vw_fdt_parametros
        Where pais = 'COL' And compania = pch_compania And parametro = 'retencion' And secuencia = 20;
    Exception 
      When Others Then vch_var := 'var_nom_00';
    End;    
    vdc_tope := 0;
    Begin
        Select real Into vdc_tope
        From parametros_rh               
        Where compania = pch_compania
          And parametro_rh = vch_var;
    Exception
      When Others Then vdc_tope := 6502000;
    End;
    Begin
      Select Decode(pti_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)
      Into vdc_ingresos
      From acumulados_mensuales 
      Where compania = pch_compania
        And trabajador = pch_trabajador
        And agr_conceptos = 'CGR'
        And concepto = 0
        And anio = psi_anio;
    Exception
      When Others Then vdc_ingresos := 0;
    End;
    vdc_aux := 1.3; -- para Telmex todos son Salario Integral, complementar esto luego
    Result := 0;
    If (vdc_ingresos / vdc_aux) >= vdc_tope Then
        /* Bonos Sodexho */
        Begin
            Select Decode(pti_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)
            Into vdc_che
            From acumulados_mensuales
            Where compania = pch_compania
              And trabajador = pch_trabajador
              And agr_conceptos = vch_agr_che
              And concepto = 0
              And anio = psi_anio;
        Exception
            When Others Then vdc_che := 0;
        End;
        Result := vdc_che;
    End If;
    Return(Result);
End fn_fco_cir_sodexho;
/
Create Public Synonym fn_fco_cir_sodexho For ADAM.fn_fco_cir_sodexho;
Grant Execute On fn_fco_cir_sodexho To ADAMA;
Create Or Replace View vw_fco_cir_det
As
Select ID_REP, USUARIOW, COD_REP, COMPANIA, SUCURSAL, ANIO, NUMERO, TRABAJADOR, FECHA_DESDE, FECHA_HASTA, 
Decode(CASILLA, 73, 37, CASILLA) As CASILLA, SUM(VALOR) As VALOR, DATO1, DATO2, DATO3
From fco_cir_det
Group By ID_REP, USUARIOW, COD_REP, COMPANIA, SUCURSAL, ANIO, NUMERO, TRABAJADOR, FECHA_DESDE, FECHA_HASTA, 
Decode(CASILLA, 73, 37, CASILLA), DATO1, DATO2, DATO3;
Create Public Synonym vw_fco_cir_det For ADAM.vw_fco_cir_det;
Grant Select On vw_fco_cir_det To ADAMA;
Drop View vw_fco_rep_cir;
/*********************************************/
/*** Certificado de Ingresos y Retenciones ***/
/*** Módulo Fiscal de Colombia             ***/
/*** Revisión: Juan Carlos Leguizamón      ***/
/*** Fecha: 12-MAR-08                      ***/
/*********************************************/
Create View vw_fco_rep_cir
As
Select 
    a.id_rep, a.usuariow, a.cod_rep, a.compania, a.sucursal, a.anio, a.fecha_exp, 
    c.nombre_cia, c.registro_fiscal, c.domicilio, c.cod_ciudad, c.cod_dpto, c.nom_ciudad, c.nom_dpto,
    c.agencias, c.pagador_nombre, c.pagador_id, c.cod_admon, c.telefono, b.numero, b.trabajador, t.nombre As nombre_trab,
    Cast(Left(fn_ape1(t.nombre), 20) As varchar2(20)) As primer_apellido, Cast(Left(fn_ape2(t.nombre), 20) As varchar2(20)) As segundo_apellido,
    Cast(Left(fn_nom1(t.nombre), 20) As varchar2(20)) As primer_nombre, Cast(Left(fn_nom2(t.nombre), 20) As varchar2(20)) As segundo_nombre,
    t.clave_unica As cedula, b.fecha_desde, b.fecha_hasta, Round((b.valor - 1)/1000,0)*1000 As valor, b.casilla, b.dato1, b.dato2, b.dato3
From fco_cir_cab a, vw_fco_cir_det b, vw_fco_companias c, trabajadores t
Where a.id_rep = b.id_rep And a.usuariow = b.usuariow 
   And a.cod_rep = b.cod_rep And a.compania = b.compania And a.sucursal = b.sucursal And a.anio = b.anio
   And a.compania = c.compania
   And t.trabajador = b.trabajador;
Grant Select On vw_fco_rep_cir To ADAMA;
CREATE OR REPLACE PROCEDURE sp_fco_rep_cir  
(  
    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 char,  
    pch_sucursal char,  
    psi_anio number,
    pdt_fecha_exp char
)  
/***********************************************************/  
/*** Modulo:  Modulo Fiscal Colombiano ADAM V3           ***/  
/*** Descripcion: CertIf icado de Ingresos y Retenciones  ***/  
/*** Autor: Juan Carlos Leguizamon                       ***/  
/*** Con base en revisiones de Diana Rios, John Sánchez, ***/
/*** Laura Guzmán, Yesenia González y Silvia Cortés      ***/
/*** Fecha: 06-MAR-08                                    ***/  
/*** Revision:  VERSION ORACLE                           ***/  
/*** JCL 12-MAR-08 REVISION PARA TELMEX                  ***/
/***********************************************************/  
AS  
    vti_trab_dde number(3);
    vti_trab_hta number(3);
    vch_agr_sal char(3);
    vch_agr_ces char(3);
    vti_tip_gas number(3);
    vsi_cnc_gas number(5);
    vch_agr_gas char(3);
    vch_agr_pen char(3);
    vch_agr_oti char(3);
    vch_agr_EPS char(3);
    vch_agr_AFP char(3);
    vch_agr_VOL char(3);
    vti_tip_rtf number(3);
    vsi_cnc_rtf number(5);
    vch_agr_rtf char(3);    
    vch_por_suc char(2);
    vdc_sal number(19,6);
    vdc_sod number(19,6);
    vdc_ces number(19,6);
    vdc_gas number(19,6);
    vdc_pen number(19,6);
    vdc_oti number(19,6);
    vdc_eps number(19,6);
    vdc_fpo number(19,6);
    vdc_vol number(19,6);
    vdc_rtf number(19,6);    
    vdt_desde date;
    vdt_hasta date;
    vch_dato_2 char(10);
    vch_dato_3 char(10);
    vsi_numero number(5);
    -- Variables para el cursor
    cch_trabajador char(10);
    cdt_ingreso date;
    cdt_baja date;
    cch_sucursal char(10);
    cch_dato_1 char(10);

/* Declaración de Cursores */
    Cursor cr_detalle1 Is
    Select tg.trabajador, tg.fecha_ingreso, tg.fecha_baja, Left(pch_sucursal,10), rta.dato
    From trabajadores_grales tg
    Inner Join vw_fco_div_trabajador suc On tg.compania = suc.compania And tg.trabajador = suc.trabajador
    Inner Join rel_trab_agr rta On rta.compania= tg.compania And rta.trabajador = tg.trabajador
    Where tg.compania = pch_compania
      And Year(tg.fecha_ingreso) <= psi_anio
      And (tg.fecha_baja Is Null Or Year(tg.fecha_baja) >= psi_anio)
      And ((suc.dato = pch_sucursal And vch_por_suc = 'SI') Or vch_por_suc <> 'SI')
      And ((tg.trabajador >= pch_trab_dde And vti_trab_dde = 1) Or vti_trab_dde = 0)
      And ((tg.trabajador <= pch_trab_hta And vti_trab_hta = 1) Or vti_trab_hta = 0)
      And rta.agrupacion = pch_agr_1
      And ((rta.dato >= pch_dato_dde And pch_dato_dde <> ' ') Or Nvl(Trim(pch_dato_dde), ' ') = ' ')
      And ((rta.dato <= pch_dato_hta And pch_dato_hta <> ' ') Or Nvl(Trim(pch_dato_hta), ' ') = ' ')
    Order By suc.dato, tg.trabajador;

    Cursor cr_detalle2 Is
    Select tg.trabajador, tg.fecha_ingreso, tg.fecha_baja, Left(pch_sucursal, 10), ' '
    From trabajadores_grales tg
    Inner Join vw_fco_div_trabajador suc On tg.compania = suc.compania And tg.trabajador = suc.trabajador
    Where tg.compania = pch_compania
      And Year(tg.fecha_ingreso) <= psi_anio
      And (tg.fecha_baja Is Null Or Year(tg.fecha_baja) >= psi_anio)
      And ((suc.dato = pch_sucursal And vch_por_suc = 'SI') Or vch_por_suc <> 'SI')
      And ((tg.trabajador >= pch_trab_dde And vti_trab_dde = 1) Or vti_trab_dde = 0)
      And ((tg.trabajador <= pch_trab_hta And vti_trab_hta = 1) Or vti_trab_hta = 0)
    Order By suc.dato, tg.trabajador;

Begin
    vti_trab_dde := 0;
    If Nvl(Trim(pch_trab_dde), ' ') <> ' ' Then
        vti_trab_dde := 1;
    End If;
    
    vti_trab_hta := 0;
    If Nvl(Trim(pch_trab_hta), ' ') <> ' ' Then
        vti_trab_hta := 1;
    End If;

    /* Recuperar los parametros */
    -- Salarios
    Begin
        Select Left(dato, 3) Into vch_agr_sal From vw_fdt_parametros 
        Where pais = 'COL' And compania = pch_compania And parametro = 'retencion' And secuencia = 1;
    Exception
        When Others Then vch_agr_sal := 'x';
    End;

    -- Cesantías e intereses de cesantías
    Begin
        Select Left(dato, 3) Into vch_agr_ces From vw_fdt_parametros 
        Where pais = 'COL' And compania = pch_compania And parametro = 'retencion' And secuencia = 3;
    Exception 
        When Others Then vch_agr_ces := 'x';
    End;

    -- Gastos de representación
    Begin
         Select tipo Into vti_tip_gas From vw_fdt_parametros
         Where pais = 'COL' And compania = pch_compania And parametro = 'retencion' And secuencia = 4;
    Exception 
        When Others Then vti_tip_gas := 0;
    End;
         
    If vti_tip_gas = 0 Then
        Begin
            Select dato Into vsi_cnc_gas From vw_fdt_parametros
            Where pais = 'COL' And compania = pch_compania And parametro = 'retencion' And secuencia = 4;
        Exception 
            When Others Then vsi_cnc_gas := 40000;
        End;            
    Else
        Begin
            Select Left(dato, 3) Into vch_agr_gas From vw_fdt_parametros
            Where pais = 'COL' And compania = pch_compania And parametro = 'retencion' And secuencia = 4;
        Exception
            When Others Then vch_agr_gas := 'x';
        End;
    End If;
    
    -- Pensiones de jubilación, vejez o invalidez
    Begin
        Select Left(dato, 3) Into vch_agr_pen From vw_fdt_parametros
        Where pais = 'COL' And compania = pch_compania And parametro = 'retencion' And secuencia = 5;
    Exception
        When Others Then vch_agr_pen := 'x';
    End;
    
    -- Otros ingresos originados en la relación laboral
    Begin
        Select Left(dato, 3) Into vch_agr_oti From vw_fdt_parametros
        Where pais = 'COL' And compania = pch_compania And parametro = 'retencion' And secuencia = 6;
    Exception
        When Others Then vch_agr_oti := 'x';
    End;
    
    -- Aportes obligatorios por salud
    Begin
        Select Left(dato, 3) Into vch_agr_EPS From vw_fdt_parametros 
        Where pais = 'COL' And compania = pch_compania And parametro = 'retencion' And secuencia = 18;
    Exception
        When Others Then vch_agr_EPS := 'x';
    End;
    
    -- Aportes obligatorios a fondos de pensiones y solidaridad pensional
    Begin
        Select Left(dato, 3) Into vch_agr_AFP From vw_fdt_parametros 
        Where pais = 'COL' And compania = pch_compania And parametro = 'retencion' And secuencia = 17;
    Exception
        When Others Then vch_agr_AFP := 'x';
    End;
    
    -- Aportes voluntarios a fondos de pensiones y cuentas AFC
    Begin
        Select Left(dato, 3) Into vch_agr_VOL From vw_fdt_parametros 
        Where pais = 'COL' And compania = pch_compania And parametro = 'retencion' And secuencia = 19;
    Exception
        When Others Then vch_agr_VOL := 'x';
    End;
    
    -- Retención en la Fuente
    Begin
        Select tipo Into vti_tip_rtf From vw_fdt_parametros  
        Where pais = 'COL' And compania = pch_compania And parametro = 'retencion' And secuencia = 7;
    Exception
        When Others Then vti_tip_rtf := 0;
    End;
    If vti_tip_rtf = 0  Then
        Begin
            Select dato Into vsi_cnc_rtf From vw_fdt_parametros  
            Where pais = 'COL' And compania = pch_compania And parametro = 'retencion' And secuencia = 7;
        Exception
            When Others Then vsi_cnc_rtf := 40000;
        End;
    Else
        Begin
            Select Left(dato, 3) Into vch_agr_rtf From vw_fdt_parametros  
            Where pais = 'COL' And compania = pch_compania And parametro = 'retencion' And secuencia = 7;
        Exception
            When Others Then vch_agr_rtf := 'x';
        End;
    End If;
        
    /* Generar por Sucursales */
    Begin
        Select dato Into vch_por_suc From vw_fdt_parametros
        Where pais = 'COL' And compania = pch_compania And parametro = 'retencion' And secuencia = 22;
    Exception
        When Others Then vch_por_suc := 'NO';
    End;
    vch_por_suc := Nvl(vch_por_suc, 'NO');
    
    /* Borrar los datos actuales */
    Delete fco_cir_det Where id_rep = psi_id_rep And usuariow = pvc_usuario And cod_rep = pti_cod_rep;
    Delete fco_cir_cab Where id_rep = psi_id_rep And usuariow = pvc_usuario And cod_rep = pti_cod_rep;
    /* Hacer que los datos sean permanentes */
    Delete fco_cir_det Where id_rep = 0 And usuariow = 'CIR' And cod_rep = pti_cod_rep;
    Delete fco_cir_cab Where id_rep = 0 And usuariow = 'CIR' And cod_rep = pti_cod_rep;
    
    /* INSERTAR los nuevos datos */
    /* Datos de la Cabecera */
    Insert Into fco_cir_cab (id_rep, usuariow, cod_rep, compania, sucursal, anio, fecha_exp)
    Values (psi_id_rep, pvc_usuario, pti_cod_rep, pch_compania, Nvl(pch_sucursal, ' '), psi_anio, pdt_fecha_exp);
    /* Datos permanentes */    
    Insert Into fco_cir_cab (id_rep, usuariow, cod_rep, compania, sucursal, anio, fecha_exp)
    Values (0, 'CIR', pti_cod_rep, pch_compania, Nvl(pch_sucursal, ' '), psi_anio, pdt_fecha_exp);

    /* Datos del Detalle */    
    vsi_numero := 0;

    If Nvl(Trim(pch_agr_1), ' ') <> ' ' Then
        Open cr_detalle1;
    Else
        Open cr_detalle2;
    End If;    
    
    Loop
        If Nvl(Trim(pch_agr_1), ' ') <> ' ' Then
            Fetch cr_detalle1 Into cch_trabajador, cdt_ingreso, cdt_baja, cch_sucursal, cch_dato_1;
            Exit When cr_detalle1%NOTFOUND; 
        Else
            Fetch cr_detalle2 Into cch_trabajador, cdt_ingreso, cdt_baja, cch_sucursal, cch_dato_1;
            Exit When cr_detalle2%NOTFOUND; 
        End If;
    
        /* Inicializando variables */
        vdc_sal := 0; vdc_ces := 0; vdc_gas := 0; vdc_pen := 0; vdc_oti := 0; vdc_eps := 0; vdc_fpo := 0; vdc_vol := 0; vdc_rtf := 0;
        
        If To_Number(To_Char(cdt_ingreso, 'yyyy')) = psi_anio Then
            vdt_desde := cdt_ingreso;
        Else                
            vdt_desde := To_Date(To_Char(psi_anio) || '0101','yyyymmdd');
        End If;
        
        If To_Number(To_Char(cdt_baja, 'yyyy')) = psi_anio Then
            vdt_hasta := cdt_baja;
        Else
            vdt_hasta := To_Date(To_Char(psi_anio) || '1231', 'yyyymmdd');
        End If;
        
        /* SALARIOS */
        Begin
            Select 
            acum_imp_mes_01 + acum_imp_mes_02 + acum_imp_mes_03 + acum_imp_mes_04 + acum_imp_mes_05 + acum_imp_mes_06 +
            acum_imp_mes_07 + acum_imp_mes_08 + acum_imp_mes_09 + acum_imp_mes_10 + acum_imp_mes_11 + acum_imp_mes_12
            Into vdc_sal
            From acumulados_mensuales
            Where compania = pch_compania
              And trabajador = cch_trabajador
              And agr_conceptos = vch_agr_sal 
              And concepto = 0 
              And anio = psi_anio;
        Exception
            When Others Then vdc_sal := 0;
        End;
        
        /* BONOS SODEXHO */
        Begin
            Select 
              fn_fco_cir_sodexho(pch_compania, psi_anio,  1, cch_trabajador) + 
              fn_fco_cir_sodexho(pch_compania, psi_anio,  2, cch_trabajador) + 
              fn_fco_cir_sodexho(pch_compania, psi_anio,  3, cch_trabajador) + 
              fn_fco_cir_sodexho(pch_compania, psi_anio,  4, cch_trabajador) + 
              fn_fco_cir_sodexho(pch_compania, psi_anio,  5, cch_trabajador) + 
              fn_fco_cir_sodexho(pch_compania, psi_anio,  6, cch_trabajador) + 
              fn_fco_cir_sodexho(pch_compania, psi_anio,  7, cch_trabajador) + 
              fn_fco_cir_sodexho(pch_compania, psi_anio,  8, cch_trabajador) + 
              fn_fco_cir_sodexho(pch_compania, psi_anio,  9, cch_trabajador) + 
              fn_fco_cir_sodexho(pch_compania, psi_anio, 10, cch_trabajador) + 
              fn_fco_cir_sodexho(pch_compania, psi_anio, 11, cch_trabajador) + 
              fn_fco_cir_sodexho(pch_compania, psi_anio, 12, cch_trabajador)
            Into vdc_sod
            From dual;
        Exception
            When Others Then vdc_sod := 0;
        End;
        
        /* CESANTÍAS E INTERESES DE CESANTÍAS EFECTIVAMENTE PAGADAS */                
        Begin
            Select 
            acum_imp_mes_01 + acum_imp_mes_02 + acum_imp_mes_03 + acum_imp_mes_04 + acum_imp_mes_05 + acum_imp_mes_06 +
            acum_imp_mes_07 + acum_imp_mes_08 + acum_imp_mes_09 + acum_imp_mes_10 + acum_imp_mes_11 + acum_imp_mes_12
            Into vdc_ces
            From acumulados_mensuales
            Where compania = pch_compania
              And trabajador = cch_trabajador
              And agr_conceptos = vch_agr_ces
              And concepto = 0
              And anio = psi_anio;
        Exception
            When Others Then vdc_ces := 0;
        End;
        
        /* GASTOS DE REPRESENTACIÓN */        
        Begin
            Select 
            acum_imp_mes_01 + acum_imp_mes_02 + acum_imp_mes_03 + acum_imp_mes_04 + acum_imp_mes_05 + acum_imp_mes_06 +
            acum_imp_mes_07 + acum_imp_mes_08 + acum_imp_mes_09 + acum_imp_mes_10 + acum_imp_mes_11 + acum_imp_mes_12
            Into vdc_gas
            From acumulados_mensuales
            Where compania = pch_compania
              And trabajador = cch_trabajador
              And agr_conceptos = Case When vti_tip_gas = 0 Then '' Else vch_agr_gas End
              And concepto = Case When vti_tip_gas = 0 Then vsi_cnc_gas Else 0 End
              And anio = psi_anio;
        Exception
            When Others Then vdc_gas := 0;
        End;
                
        /* PENSIONES DE JUBILACIÓN, VEJEZ O INVALIDEZ */                
        Begin
            Select 
            acum_imp_mes_01 + acum_imp_mes_02 + acum_imp_mes_03 + acum_imp_mes_04 + acum_imp_mes_05 + acum_imp_mes_06 +
            acum_imp_mes_07 + acum_imp_mes_08 + acum_imp_mes_09 + acum_imp_mes_10 + acum_imp_mes_11 + acum_imp_mes_12
            Into vdc_pen
            From acumulados_mensuales
            Where compania = pch_compania
              And trabajador = cch_trabajador
              And agr_conceptos = vch_agr_pen
              And concepto = 0
              And anio = psi_anio;
        Exception
            When Others Then vdc_pen := 0;
        End;
        
        /* OTROS INGRESOS ORIGINADOS EN LA RELACIÓN LABORAL */                
        Begin
            Select 
            acum_imp_mes_01 + acum_imp_mes_02 + acum_imp_mes_03 + acum_imp_mes_04 + acum_imp_mes_05 + acum_imp_mes_06 +
            acum_imp_mes_07 + acum_imp_mes_08 + acum_imp_mes_09 + acum_imp_mes_10 + acum_imp_mes_11 + acum_imp_mes_12
            Into vdc_oti
            From acumulados_mensuales
            Where compania = pch_compania
              And trabajador = cch_trabajador
              And agr_conceptos = vch_agr_oti
              And concepto = 0
              And anio = psi_anio;
        Exception
            When Others Then vdc_oti := 0;
        End;
        
        /* APORTES OBLIGATORIOS POR SALUD */
        Begin
            Select                
            acum_imp_mes_01 + acum_imp_mes_02 + acum_imp_mes_03 + acum_imp_mes_04 + acum_imp_mes_05 + acum_imp_mes_06 +
            acum_imp_mes_07 + acum_imp_mes_08 + acum_imp_mes_09 + acum_imp_mes_10 + acum_imp_mes_11 + acum_imp_mes_12
            Into vdc_eps
            From acumulados_mensuales
            Where compania = pch_compania
              And trabajador = cch_trabajador
              And agr_conceptos = vch_agr_eps
              And concepto = 0
              And anio = psi_anio;
        Exception
            When Others Then vdc_eps := 0;
        End;
        
        /* APORTES OBLIGATORIOS A FONDOS DE PENSIONES Y SOLIDARIDAD PENSIONAL */
        Begin
            Select 
            acum_imp_mes_01 + acum_imp_mes_02 + acum_imp_mes_03 + acum_imp_mes_04 + acum_imp_mes_05 + acum_imp_mes_06 +
            acum_imp_mes_07 + acum_imp_mes_08 + acum_imp_mes_09 + acum_imp_mes_10 + acum_imp_mes_11 + acum_imp_mes_12
            Into vdc_fpo
            From acumulados_mensuales
            Where compania = pch_compania
              And trabajador = cch_trabajador
              And agr_conceptos = vch_agr_AFP
              And concepto = 0
              And anio = psi_anio;
        Exception
            When Others Then vdc_fpo := 0;
        End;
        
        /* APORTES VOLUNTARIOS A FONDOS DE PENSIONES Y CUENTAS AFC */
        Begin
            Select   
            acum_imp_mes_01 + acum_imp_mes_02 + acum_imp_mes_03 + acum_imp_mes_04 + acum_imp_mes_05 + acum_imp_mes_06 +
            acum_imp_mes_07 + acum_imp_mes_08 + acum_imp_mes_09 + acum_imp_mes_10 + acum_imp_mes_11 + acum_imp_mes_12
            Into vdc_vol
            From acumulados_mensuales
            Where compania = pch_compania
              And trabajador = cch_trabajador
              And agr_conceptos = vch_agr_vol
              And concepto = 0
              And anio = psi_anio;
        Exception
            When Others Then vdc_vol := 0;
        End;
        
        /* VALOR DE LA RETENCIÓN EN LA FUENTE */
        Begin
            Select 
            acum_imp_mes_01 + acum_imp_mes_02 + acum_imp_mes_03 + acum_imp_mes_04 + acum_imp_mes_05 + acum_imp_mes_06 +
            acum_imp_mes_07 + acum_imp_mes_08 + acum_imp_mes_09 + acum_imp_mes_10 + acum_imp_mes_11 + acum_imp_mes_12
            Into vdc_rtf
            From acumulados_mensuales
            Where compania = pch_compania
              And trabajador = cch_trabajador
              And agr_conceptos = Decode(vti_tip_rtf, 0, '   ', vch_agr_rtf)
              And concepto = Decode(vti_tip_rtf, 0, vsi_cnc_rtf, 0)
              And anio = psi_anio;
        Exception
            When Others Then vdc_rtf := 0;
        End;
                
        /* Dato de la agrupación 2 */
        If Nvl(Trim(pch_agr_2), ' ') <> ' ' Then
            Begin
                Select dato Into vch_dato_2 From rel_trab_agr
                Where compania = pch_compania And trabajador = cch_trabajador And agrupacion = pch_agr_2;
            Exception
                When Others Then vch_dato_2 := ' ';
            End;
        End If;

        /* Dato de la agrupación 3 */
        vch_dato_3 := ' ';
        If Nvl(Trim(pch_agr_3), ' ') <> ' ' Then
            Begin
                Select dato Into vch_dato_3 From rel_trab_agr
                Where compania = pch_compania And trabajador = cch_trabajador And agrupacion = pch_agr_3;
            Exception
                When Others Then vch_dato_3 := ' ';
            End;
        End If;

        /* SI LA SUMA DE TODOS LOS VALORES ES MAYOR A CERO, GENERE LOS REGISTROS PARA EL CERTIFICADO */              
        If Nvl(vdc_sal, 0) + Nvl(vdc_ces, 0) + Nvl(vdc_gas, 0) + Nvl(vdc_pen, 0) +               
           Nvl(vdc_oti, 0) + Nvl(vdc_eps, 0) + Nvl(vdc_fpo, 0) +               
           Nvl(vdc_vol, 0) + Nvl(vdc_rtf, 0) > 0 Then
           
            vsi_numero := vsi_numero + 1;

            /* INSERTAR SALARIOS - CASILLA 37 */
            Insert Into fco_cir_det
            (id_rep, usuariow, cod_rep, compania, sucursal, anio, numero, trabajador, fecha_desde, fecha_hasta, casilla, valor, dato1, dato2, dato3)
            Values (psi_id_rep, pvc_usuario, pti_cod_rep, pch_compania, Nvl(pch_sucursal, ' '), psi_anio, vsi_numero,
                cch_trabajador, vdt_desde, vdt_hasta, 37, Nvl(vdc_sal, 0), cch_dato_1, vch_dato_2, vch_dato_3);
            
            /* INSERTAR SALARIOS - CASILLA 37 FANTASMA (73) - BONOS SODEXHO */
            Insert Into fco_cir_det
            (id_rep, usuariow, cod_rep, compania, sucursal, anio, numero, trabajador, fecha_desde, fecha_hasta, casilla, valor, dato1, dato2, dato3)
            Values (psi_id_rep, pvc_usuario, pti_cod_rep, pch_compania, Nvl(pch_sucursal, ' '), psi_anio, vsi_numero,
                cch_trabajador, vdt_desde, vdt_hasta, 73, Nvl(vdc_sod, 0), cch_dato_1, vch_dato_2, vch_dato_3);

            /* INSERTAR CESANTIAS E INTERESES DE CESANTIAS EFECTIVAMENTE PAGADAS - CASILLA 38 */
            Insert Into fco_cir_det
            (id_rep, usuariow, cod_rep, compania, sucursal, anio, numero, trabajador, fecha_desde, fecha_hasta, casilla, valor, dato1, dato2, dato3)
            Values (psi_id_rep, pvc_usuario, pti_cod_rep, pch_compania, Nvl(pch_sucursal, ' '), psi_anio, vsi_numero,
                cch_trabajador, vdt_desde, vdt_hasta, 38, Nvl(vdc_ces, 0), cch_dato_1, vch_dato_2, vch_dato_3);
            
            /* INSERTAR GASTOS DE REPRESENTACION - CASILLA 39 */
            Insert Into fco_cir_det
            (id_rep, usuariow, cod_rep, compania, sucursal, anio, numero, trabajador, fecha_desde, fecha_hasta, casilla, valor, dato1, dato2, dato3)
            Values (psi_id_rep, pvc_usuario, pti_cod_rep, pch_compania, Nvl(pch_sucursal, ' '), psi_anio, vsi_numero, 
                cch_trabajador, vdt_desde, vdt_hasta, 39, Nvl(vdc_gas, 0), cch_dato_1, vch_dato_2, vch_dato_3);
            
            /* INSERTAR PENSIONES DE JUBILIACION, VEJEZ O INVALIDEZ - CASILLA 40 */              
            Insert Into fco_cir_det
            (id_rep, usuariow, cod_rep, compania, sucursal, anio, numero, trabajador, fecha_desde, fecha_hasta, casilla, valor, dato1, dato2, dato3)
            Values (psi_id_rep, pvc_usuario, pti_cod_rep, pch_compania, Nvl(pch_sucursal, ' '), psi_anio, vsi_numero, 
                cch_trabajador, vdt_desde, vdt_hasta, 40, Nvl(vdc_pen, 0), cch_dato_1, vch_dato_2, vch_dato_3);
            
            /* INSERTAR OTROS INGRESOS ORIGINADOS EN LA RELACION LABORAL - CASILLA 41 */              
            Insert Into fco_cir_det
            (id_rep, usuariow, cod_rep, compania, sucursal, anio, numero, trabajador, fecha_desde, fecha_hasta, casilla, valor, dato1, dato2, dato3)
            Values (psi_id_rep, pvc_usuario, pti_cod_rep, pch_compania, Nvl(pch_sucursal, ' '), psi_anio, vsi_numero,
                cch_trabajador, vdt_desde, vdt_hasta, 41, Nvl(vdc_oti, 0), cch_dato_1, vch_dato_2, vch_dato_3);
            
            /* INSERTAR APORTES OBLIGATORIOS POR SALUD - CASILLA 43 */
            Insert Into fco_cir_det
            (id_rep, usuariow, cod_rep, compania, sucursal, anio, numero, trabajador, fecha_desde, fecha_hasta, casilla, valor, dato1, dato2, dato3)
            Values (psi_id_rep, pvc_usuario, pti_cod_rep, pch_compania, Nvl(pch_sucursal, ' '), psi_anio, vsi_numero,
                cch_trabajador, vdt_desde, vdt_hasta, 43, Nvl(vdc_eps, 0), cch_dato_1, vch_dato_2, vch_dato_3);
            
            /* INSERTAR APORTES OBLIGATORIOS A FONDOS DE PENSIONES Y SOLIDARIDAD PENSIONAL - CASILLA 44 */
            Insert Into fco_cir_det
            (id_rep, usuariow, cod_rep, compania, sucursal, anio, numero, trabajador, fecha_desde, fecha_hasta, casilla, valor, dato1, dato2, dato3)
            Values (psi_id_rep, pvc_usuario, pti_cod_rep, pch_compania, Nvl(pch_sucursal, ' '), psi_anio, vsi_numero,
                cch_trabajador, vdt_desde, vdt_hasta, 44, Nvl(vdc_fpo, 0), cch_dato_1, vch_dato_2, vch_dato_3);
            
            /* INSERTAR APORTES VOLUNTARIOS A FONDOS DE PENSIONES Y CUENTAS AFC - CASILLA 45 */
            Insert Into fco_cir_det
            (id_rep, usuariow, cod_rep, compania, sucursal, anio, numero, trabajador, fecha_desde, fecha_hasta, casilla, valor, dato1, dato2, dato3)
            Values (psi_id_rep, pvc_usuario, pti_cod_rep, pch_compania, Nvl(pch_sucursal, ' '), psi_anio, vsi_numero,
                cch_trabajador, vdt_desde, vdt_hasta, 45, Nvl(vdc_vol, 0), cch_dato_1, vch_dato_2, vch_dato_3);
            
            /* INSERTAR RETENCION EN LA FUENTE - CASILLA 46 */
            Insert Into fco_cir_det
            (id_rep, usuariow, cod_rep, compania, sucursal, anio, numero, trabajador, fecha_desde, fecha_hasta, casilla, valor, dato1, dato2, dato3)
            Values (psi_id_rep, pvc_usuario, pti_cod_rep, pch_compania, Nvl(pch_sucursal, ' '), psi_anio, vsi_numero,
                cch_trabajador, vdt_desde, vdt_hasta, 46, Nvl(vdc_rtf, 0), cch_dato_1, vch_dato_2, vch_dato_3);

        End If;
    End Loop;
    If Nvl(Trim(pch_agr_1), ' ') <> ' ' Then
        Close cr_detalle1;
    Else
        Close cr_detalle2;
    End If;
    
    /* Detalle datos permanentes */
    Insert Into fco_cir_det (id_rep, usuariow, cod_rep, compania, sucursal, anio, numero, trabajador, fecha_desde, fecha_hasta, casilla, valor, dato1, dato2, dato3)
    Select 0, 'CIR', cod_rep, compania, sucursal, anio, numero, trabajador, fecha_desde, fecha_hasta, casilla, valor, dato1, dato2, dato3
    From fco_cir_det
    Where id_rep = psi_id_rep
      And usuariow = pvc_usuario
      And cod_rep = pti_cod_rep
      And compania = pch_compania
      And ((sucursal = pch_sucursal And vch_por_suc = 'SI') Or vch_por_suc <> 'SI')
      And anio = psi_anio;
      
    Commit;
End;
/
