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    varchar2,
  pch_sucursal    varchar2,
  psm_anio        varchar2,
  pdt_fecha_exp   varchar2
)
/**********************************************************************************/
/*** Modulo:      Modulo Fiscal Colombiano ADAM V.3				                      ***/
/*** Descripcion: Genera tablas con la informacion del Certificado de Ingresos	***/
/***              y Retenciones DIAN                                    	      ***/
/*** Tablas:	  vw_fdt_parametros, Ciudades, Departamentos, Trabajadores,           ***/
/***              Trabajadores_Grales, Acumulados_Mensuales                     ***/
/***		  Version con Sociedades: MF_sucursales, rel_trab_agr    	              ***/
/*** Vistas:	  vw_companias                                                    ***/
/*** Autor:	  Juan Carlos Leguizamon					                                  ***/
/*** Fecha:	  Febrero 4 de 2002						                                      ***/
/*** Revision: 	  Febrero 22 de 2002						                                ***/
/*** Revision: 	  Marzo 17 de 2002 (SURTIGAS)					                          ***/
/*** Motor:	  Oracle 8		Version interna: 1.00                                 ***/
/**********************************************************************************/
/*** Adecuacion: Diana Cecilia Rios Peinado                                     ***/
--DCR-MAY-15-05: Adecuación para el año 2005
--DCR-JUN-01-07: Adecuación para el año 2007
AS
    vsm_numero      number(5);
    vtn_tipo_param  number(1);
    vsm_cnc_rtf     number(5);
    cch_trabajador  char(10);
    cvc_nombre      varchar2(100);
    cvc_cedula      varchar2(25);
    cdt_ingreso     date;
    cdt_baja        date;
    vdt_desde       date;
    vdt_hasta       date;
    vch_x_sucursal  char(2);
        
    vdc_ingresos    number(19,6);
    vdc_no_gravados number(19,6);
    vdc_cesantias   number(19,6);
    vdc_retencion   number(19,6);
    vdc_sal_minimo  number(19,6);
    vdc_valor_pn    number(19,6);
    vdc_valor_ap    number(19,6);
    vdc_valor_AFP   number(19,6);
    vdc_valor_EPS   number(19,6);
    vdc_valor_VOL   number(19,6);
    vdc_gastos_rep  number(19,6);
    vdc_tope_che    number(19,6);
    vdc_valor_che   number(19,6);
    vdc_oti         number(19,6);
    vsm_dif_dias    number(19,6);

    vch_agr_ing     char(3);
    vch_agr_ngr     char(3);
    vch_agr_ces     char(3);
    vch_agr_pen     char(3);
    vch_agr_apr     char(3);
    vch_agr_AFP     char(3);
    vch_agr_EPS     char(3); 
    vch_agr_VOL     char(3);
    vch_agr_rep     char(3);    
    vch_agr_che     char(3);
    vch_agr_oti     char(3);
    vch_agr_rtf     char(3);    

    --DCRP para convertir los parametros de entrada
    vch_compania    char(4);
    vch_sucursal    char(10);
    vsm_anio        number(5);
    vdt_fecha       date;    

    vti_trab_dde number(1);
    vti_trab_hta number(1);      
    vch_var_cheque  varchar2(15);    
    
    CURSOR cr_detalle_suc IS
    SELECT 
    T.trabajador, SUBSTR(T.nombre,1,60), T.clave_unica, TG.fecha_ingreso, TG.fecha_baja
    FROM
    trabajadores T, trabajadores_grales TG, vw_fco_div_trabajador SUC
    WHERE 
    TG.trabajador = T.trabajador And
    TG.compania = SUC.compania And TG.trabajador = SUC.trabajador And
    TG.compania = vch_compania And
    To_Number(To_Char(Nvl(TG.fecha_baja, sysdate), 'yyyy')) >= vsm_anio And
    To_Number(To_Char(TG.fecha_ingreso, 'yyyy')) <= vsm_anio And
    SUC.dato = vch_sucursal
    And ((TRIM(vti_trab_dde) = 1) OR (T.trabajador >= RTRIM(pch_trab_dde) AND TRIM(vti_trab_dde) = 0)) AND
       ((TRIM(vti_trab_hta) = 1) OR (T.trabajador <= RTRIM(pch_trab_hta) AND TRIM(vti_trab_hta) = 0))    
    ORDER BY   T.nombre;

    CURSOR cr_detalle IS
    SELECT 
    T.trabajador, SUBSTR(T.nombre,1,60), T.clave_unica, TG.fecha_ingreso, TG.fecha_baja
    FROM
    trabajadores T, trabajadores_grales TG
    WHERE 
    TG.trabajador = T.trabajador And
    TG.compania = vch_compania And
    To_Number(To_Char(Nvl(TG.fecha_baja, sysdate), 'yyyy')) >= vsm_anio And
    To_Number(To_Char(TG.fecha_ingreso, 'yyyy')) <= vsm_anio
    And ((TRIM(vti_trab_dde) = 1) OR (T.trabajador >= RTRIM(pch_trab_dde) AND TRIM(vti_trab_dde) = 0)) AND
       ((TRIM(vti_trab_hta) = 1) OR (T.trabajador <= RTRIM(pch_trab_hta) AND TRIM(vti_trab_hta) = 0))    
    ORDER BY
    T.nombre;
BEGIN
     vch_compania := TRIM(pch_compania);
     vch_sucursal := TRIM(pch_sucursal);
     vdt_fecha := TO_DATE(SUBSTR(TRIM(pdt_fecha_exp),1,8),'YYYYMMDD');
     vsm_anio := TO_NUMBER(psm_anio);

     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;
     
    /* Recuperar los parametros */
  /* PARÁMETRO DE SALARIOS */
    vch_agr_ing := NULL;
    BEGIN      
        SELECT dato INTO vch_agr_ing FROM vw_fdt_parametros
        WHERE pais = 'COL' AND compania = vch_compania AND parametro = 'retencion' AND secuencia = 1;
    EXCEPTION
       WHEN OTHERS THEN vch_agr_ing := NULL;
    END;
        
  /* PARÁMETRO DE CONCEPTOS NO GRAVADOS */
    vch_agr_ngr := NULL; 
    BEGIN
        SELECT dato INTO vch_agr_ngr FROM vw_fdt_parametros 
        WHERE pais = 'COL' AND compania = vch_compania AND parametro = 'retencion' AND secuencia = 2;
    EXCEPTION
      WHEN OTHERS THEN vch_agr_ngr := NULL;
    END;
    
  /* PARÁMETRO DE CESANTÍAS E INTERESES DE CESANTÍAS EFECTIVAMENTE PAGADAS */  
    vch_agr_ces := NULL;
    BEGIN
        SELECT dato INTO vch_agr_ces FROM vw_fdt_parametros 
        WHERE pais = 'COL' AND compania = vch_compania AND parametro = 'retencion' AND secuencia = 3;
    EXCEPTION
      WHEN OTHERS THEN vch_agr_ces := NULL;
    END;
    
  /* PARÁMETRO DE GASTOS DE REPRESENTACIÓN */  
    vch_agr_rep := NULL;
    BEGIN
        SELECT dato INTO vch_agr_rep FROM vw_fdt_parametros 
        WHERE pais = 'COL' AND compania = vch_compania AND parametro = 'retencion' AND secuencia = 4;
    EXCEPTION
      WHEN OTHERS THEN vch_agr_rep := NULL;
    END;
    
  /* PARÁMETRO DE PENSIONES DE JUBILACIÓN, VEJEZ O INVALIDEZ */
    vch_agr_pen := NULL;
    BEGIN              
        SELECT dato INTO vch_agr_pen FROM vw_fdt_parametros         
        WHERE pais = 'COL' AND compania = vch_compania AND parametro = 'retencion' AND secuencia = 5;
    EXCEPTION
       WHEN OTHERS THEN vch_agr_pen := NULL;
    END;
    
    /* PARÁMETRO DE OTROS INGRESOS ORIGINADOS EN LA RELACIÓN LABORAL */  
    vch_agr_oti := NULL;
    BEGIN
        SELECT dato INTO vch_agr_oti FROM vw_fdt_parametros         
        WHERE pais = 'COL' AND compania = vch_compania AND parametro = 'retencion' AND secuencia = 6;
    EXCEPTION
       WHEN OTHERS THEN vch_agr_oti := NULL;
    END;
    
  /* PARÁMETRO DE VALOR DE RETENCIÓN EN LA FUENTE */  
    vtn_tipo_param := 0;
    BEGIN
        SELECT tipo INTO vtn_tipo_param FROM vw_fdt_parametros
        WHERE pais = 'COL' AND compania = vch_compania And parametro = 'retencion' And secuencia = 7;
    EXCEPTION
      WHEN OTHERS THEN vtn_tipo_param := 0;
    END;
    
    IF vtn_tipo_param = 0 THEN
        vsm_cnc_rtf := NULL;
        BEGIN
            SELECT dato INTO vsm_cnc_rtf FROM vw_fdt_parametros
            WHERE pais = 'COL' AND compania = vch_compania And parametro = 'retencion' And secuencia = 7;
        EXCEPTION
          WHEN OTHERS THEN vsm_cnc_rtf := NULL;
        END;    
    ELSE
        vch_agr_rtf := NULL;
        BEGIN
            SELECT dato INTO vch_agr_rtf FROM vw_fdt_parametros
            WHERE pais = 'COL' AND compania = vch_compania And parametro = 'retencion' And secuencia = 7;
        EXCEPTION
          WHEN OTHERS THEN vch_agr_rtf := NULL;
        END;    
    END IF;

  /* PARÁMETRO DE APORTES OBLIGATORIOS A FONDOS DE PENSIONES Y SOLIDARIDAD PENSIONAL */  
    vch_agr_AFP := NULL;
    BEGIN
        SELECT dato INTO vch_agr_AFP FROM vw_fdt_parametros               
        WHERE pais = 'COL' AND compania = vch_compania AND parametro = 'retencion' AND secuencia = 17;
    EXCEPTION
      WHEN OTHERS THEN vch_agr_AFP := NULL;
    END;
    
  /* PARÁMETRO DE APORTES OBLIGATORIOS POR SALUD */  
    vch_agr_EPS := NULL;
    BEGIN
        SELECT dato INTO vch_agr_EPS FROM vw_fdt_parametros               
        WHERE pais = 'COL' AND compania = vch_compania AND parametro = 'retencion' AND secuencia = 18;
    EXCEPTION
      WHEN OTHERS THEN vch_agr_EPS := NULL;
    END;

  /* PARÁMETRO DE APORTES VOLUNTARIOS A FONDOS DE PENSIONES Y AFC */  
    vch_agr_VOL := NULL;
    BEGIN
        SELECT dato INTO vch_agr_VOL FROM vw_fdt_parametros               
        WHERE pais = 'COL' AND compania = vch_compania AND parametro = 'retencion' AND secuencia = 19;
    EXCEPTION
      WHEN OTHERS THEN vch_agr_VOL := NULL;
    END;
    
    vch_x_sucursal := NULL;
    BEGIN
        SELECT dato INTO vch_x_sucursal FROM vw_fdt_parametros 
        WHERE pais = 'COL' AND compania = vch_compania AND parametro = 'parafiscal' AND secuencia = 5;
    EXCEPTION
      WHEN OTHERS THEN vch_x_sucursal := NULL;
    END;
          
    /* Hallar valor salario minimo */
    vdc_sal_minimo := 0;
    BEGIN
      SELECT salario_minimo INTO vdc_sal_minimo
      FROM hist_sal_min_zona
      WHERE zona = 'C'
      AND to_number(to_char(fecha, 'yyyy')) = vsm_anio;
    EXCEPTION
      WHEN OTHERS THEN vdc_sal_minimo := 0;
    END;

    /* HALLAR TOPE DE CHEQUES */
    vch_var_cheque := NULL;
    BEGIN    
        SELECT LTRIM(RTRIM(NVL(dato, 0))) INTO vch_var_cheque FROM vw_fdt_parametros
        WHERE pais = 'COL' and compania = vch_compania AND parametro = 'retencion' AND secuencia = 20;
    EXCEPTION
      WHEN OTHERS THEN vch_var_cheque := NULL;
    END;

    vch_var_cheque := 'var_nom_' || NVL(vch_var_cheque,' ');
    
    vdc_tope_che := 0;
    BEGIN
        SELECT real INTO vdc_tope_che FROM parametros_rh               
        WHERE parametro_rh = vch_var_cheque AND compania = vch_compania;
    EXCEPTION
      WHEN OTHERS THEN vdc_tope_che := 0;
    END;
    
    vdc_tope_che := vdc_tope_che * vdc_sal_minimo;
    
    /* PARÁMETRO DEL VALOR DE CHEQUES CANASTA */
    vch_agr_che := NULL;
    BEGIN
        SELECT dato INTO vch_agr_che FROM vw_fdt_parametros
        WHERE compania = vch_compania AND parametro = 'retencion' AND secuencia = 21;
    EXCEPTION
      WHEN OTHERS THEN vch_agr_che := NULL;
    END;
    
    /* Borrar los datos actuales */
    DELETE fco_cir_cab
    WHERE id_rep = psi_id_rep
    AND usuariow = pvc_usuario
    AND cod_rep = pti_cod_rep;
    
    DELETE fco_cir_det
    WHERE id_rep = psi_id_rep
    AND usuariow = pvc_usuario
    AND cod_rep = pti_cod_rep;
        
    /* Insertar los nuevos datos */
    /* PARTE I: Cabecera del Certificado */
    INSERT INTO fco_cir_cab
    (id_rep, usuariow, cod_rep, compania, sucursal, anio, fecha_exp,
    nombre_cia, registro_fiscal, domicilio,
    municipio, departamento, 
    sucursales, pagador_nombre, pagador_id,
    poner_carreta, cod_admon, cod_depto, cod_municipio, telefono) 
    SELECT 
    psi_id_rep, pvc_usuario, pti_cod_rep, vch_compania, SubStr(vch_sucursal,1,10), vsm_anio, vdt_fecha, 
    C.nombre_cia, replace(replace(SubStr(C.registro_fiscal,1,20),'.',''),'-','') , C.domicilio,
    M.nombre, D.nombre,
    SubStr(C.agencias,1,255), C.pagador_nombre, C.pagador_id, 0,
    c.cod_admon, c.cod_dpto, c.cod_ciudad, c.telefono
    FROM
    vw_fco_companias C, fco_ciudades M, fco_departamentos D
    WHERE
    C.cod_dpto = D.codigo And
    C.cod_ciudad = M.codigo And
    M.cod_dpto = D.codigo And
    C.compania = vch_compania;

    /* PARTE II: Detalle del Certificado */
    vsm_numero := 0;

    vch_x_sucursal := NVL(vch_x_sucursal,'NO');
    IF vch_x_sucursal = 'SI' THEN
        OPEN cr_detalle_suc;
    ELSE
        OPEN cr_detalle;
    END IF;

    LOOP
        IF vch_x_sucursal = 'SI' THEN
            FETCH cr_detalle_suc
            INTO cch_trabajador, cvc_nombre, cvc_cedula, cdt_ingreso, cdt_baja;
            EXIT WHEN cr_detalle_suc%NOTFOUND;
        ELSE
            FETCH cr_detalle 
            INTO cch_trabajador, cvc_nombre, cvc_cedula, cdt_ingreso, cdt_baja;
            EXIT WHEN cr_detalle%NOTFOUND;
        END IF;

        IF To_Number(To_Char(cdt_ingreso, 'yyyy')) = vsm_anio THEN
            vdt_desde := cdt_ingreso;
        ELSE
            vdt_desde := To_Date(To_Char(vsm_anio) || '0101','yyyymmdd');
        END IF;

        IF To_Number(To_Char(cdt_baja, 'yyyy')) = vsm_anio THEN
            vdt_hasta := cdt_baja;
        ELSE
            vdt_hasta := To_Date(To_Char(vsm_anio) || '1231', 'yyyymmdd');
        END IF;

        /* CHEQUES CANASTA */
        vdc_valor_che := 0;
        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_valor_che  
          FROM acumulados_mensuales    
          WHERE compania = vch_compania  
          AND trabajador = cch_trabajador   
          AND agr_conceptos = vch_agr_che   
          AND concepto = 0   
          AND anio = vsm_anio;    
        EXCEPTION
          WHEN OTHERS THEN vdc_valor_che := 0;
        END;

        /* Ingresos Laborales */
        vdc_ingresos := 0;
        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_ingresos
          FROM acumulados_mensuales
          WHERE compania = vch_compania 
          AND trabajador = cch_trabajador
          AND agr_conceptos = vch_agr_ing
          AND concepto = 0
          AND anio = vsm_anio;
        EXCEPTION
          WHEN OTHERS THEN vdc_ingresos := 0;
        END;

        /* Conceptos de Cesantias */
        vdc_cesantias := 0;
        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_cesantias
          FROM acumulados_mensuales
          WHERE compania = vch_compania
          AND trabajador = cch_trabajador
          AND agr_conceptos = vch_agr_ces
          AND concepto = 0
          AND anio = vsm_anio;
        EXCEPTION
            WHEN OTHERS THEN vdc_cesantias := 0;
        END;

        /* Gastos de Representacion */
        vdc_gastos_rep := 0;
        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_gastos_rep
          FROM acumulados_mensuales
          WHERE compania = vch_compania
          AND trabajador = cch_trabajador
          AND agr_conceptos = vch_agr_rep
          AND concepto = 0
          AND anio = vsm_anio;
        EXCEPTION
            WHEN OTHERS THEN vdc_gastos_rep := 0;
        END;

        /* Conceptos de Pensiones */  
        vdc_valor_pn := 0;
        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_valor_pn
          FROM acumulados_mensuales        
          WHERE compania = vch_compania
          AND trabajador = cch_trabajador
          AND agr_conceptos = vch_agr_pen
          AND concepto = 0
          AND anio = vsm_anio;
        EXCEPTION
            WHEN OTHERS THEN vdc_valor_pn := 0;
        END;

        /* OTROS INGRESOS ORIGINADOS EN LA RELACIÓN LABORAL */    
        vdc_oti := 0;
        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 = vch_compania   
          AND trabajador = cch_trabajador   
          AND agr_conceptos = vch_agr_oti   
          AND concepto = 0   
          AND anio = vsm_anio;   
        EXCEPTION
            WHEN OTHERS THEN vdc_oti := 0;
        END;

        /* APORTES OBLIGATORIOS POR SALUD */
        vdc_valor_EPS := 0;
        BEGIN
            SELECT 
              NVL(acum_imp_mes_01,0) + NVL(acum_imp_mes_02,0) + NVL(acum_imp_mes_03,0) + NVL(acum_imp_mes_04,0) + 
              NVL(acum_imp_mes_05,0) + NVL(acum_imp_mes_06,0) + NVL(acum_imp_mes_07,0) + NVL(acum_imp_mes_08,0) +  
              NVL(acum_imp_mes_09,0) + NVL(acum_imp_mes_10,0) + NVL(acum_imp_mes_11,0) + NVL(acum_imp_mes_12,0)    
            INTO vdc_valor_EPS
            FROM acumulados_mensuales                  
            WHERE compania = vch_compania
            AND trabajador = cch_trabajador
            AND agr_conceptos = NVL(vch_agr_EPS,' ')
            AND concepto = 0
            AND anio = vsm_anio;
        EXCEPTION
            WHEN OTHERS THEN vdc_valor_EPS := 0;
        END;
        
        /*  Pensiones Obligatorias y Salud */  
        vdc_valor_AFP := 0;
        BEGIN
          SELECT            
            NVL(acum_imp_mes_01,0) + NVL(acum_imp_mes_02,0) + NVL(acum_imp_mes_03,0) + NVL(acum_imp_mes_04,0) + 
            NVL(acum_imp_mes_05,0) + NVL(acum_imp_mes_06,0) + NVL(acum_imp_mes_07,0) + NVL(acum_imp_mes_08,0) +  
            NVL(acum_imp_mes_09,0) + NVL(acum_imp_mes_10,0) + NVL(acum_imp_mes_11,0) + NVL(acum_imp_mes_12,0)
          INTO vdc_valor_AFP
          FROM acumulados_mensuales                  
          WHERE compania = vch_compania
          AND trabajador = cch_trabajador
          AND agr_conceptos = vch_agr_AFP
          AND concepto = 0
          AND anio = vsm_anio;       
        EXCEPTION
            WHEN OTHERS THEN vdc_valor_AFP := 0;
        END;

        /* APORTES VOLUNTARIOS A FONDOS DE PENSIONES Y CUENTAS AFC */    
        vdc_valor_VOL := 0;
        BEGIN
      	  SELECT 
                NVL(acum_imp_mes_01,0) + NVL(acum_imp_mes_02,0) + NVL(acum_imp_mes_03,0) + NVL(acum_imp_mes_04,0) + 
                NVL(acum_imp_mes_05,0) + NVL(acum_imp_mes_06,0) + NVL(acum_imp_mes_07,0) + NVL(acum_imp_mes_08,0) +  
                NVL(acum_imp_mes_09,0) + NVL(acum_imp_mes_10,0) + NVL(acum_imp_mes_11,0) + NVL(acum_imp_mes_12,0)    
          INTO vdc_valor_VOL
          FROM acumulados_mensuales                  
          WHERE compania = vch_compania
          AND trabajador = cch_trabajador
          AND agr_conceptos = vch_agr_VOL
          AND concepto = 0
          AND anio = vsm_anio;
        EXCEPTION
          WHEN OTHERS THEN vdc_valor_VOL := 0;
        END;

        /* Valor de la Retención en la Fuente */
        IF vtn_tipo_param = 0  THEN 
          vdc_retencion := 0;
          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_retencion
              FROM acumulados_mensuales
              WHERE compania = vch_compania
              AND trabajador = cch_trabajador
              AND concepto = vsm_cnc_rtf
              AND anio = vsm_anio;
          EXCEPTION
              WHEN OTHERS THEN vdc_retencion := 0;
          END;
        ELSE
          vdc_retencion := 0;
          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_retencion
              FROM acumulados_mensuales
              WHERE compania = vch_compania
              AND trabajador = cch_trabajador
              AND agr_conceptos = vch_agr_rtf
              AND concepto = 0
              AND anio = vsm_anio;
          EXCEPTION
              WHEN OTHERS THEN vdc_retencion := 0;
          END;
        END IF;

        --Al parecer estos en el año 2007 no aplican, pero se dejan, pro si las
        /* Conceptos No Gravados: Aportes a Pensiones y al Fondo de Solidaridad */
        vdc_no_gravados := 0;
        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_no_gravados
            FROM acumulados_mensuales
            WHERE compania = vch_compania
            AND trabajador = cch_trabajador
            AND agr_conceptos = vch_agr_ngr
            AND concepto = 0
            AND anio = vsm_anio;
        EXCEPTION
            WHEN OTHERS THEN vdc_no_gravados := 0;
        END;

        /* Conceptos de aprendices */  
        vdc_valor_ap := 0;
        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_valor_ap
            FROM acumulados_mensuales        
            WHERE compania = vch_compania
            AND trabajador = cch_trabajador
            AND agr_conceptos = vch_agr_apr
            AND concepto = 0
            AND anio = vsm_anio;
        EXCEPTION
            WHEN OTHERS THEN vdc_valor_ap := 0;
        END;
        --FIN Al parecer estos en el año 2007 no aplican, pero se dejan, pro si las
  
        /* hallando la diferencia en dias entre desde y hasta */
        vsm_dif_dias := 0;
        vsm_dif_dias := (to_number(to_char(vdt_hasta, 'yyyy')) * 360) + (to_number(to_char(vdt_hasta, 'mm')) * 30);
        IF to_number(to_char(vdt_hasta, 'dd')) = 31 THEN
            vsm_dif_dias := vsm_dif_dias + 30;
        ELSE
            IF to_number(to_char(vdt_hasta, 'dd')) = 28 THEN
                IF to_number(to_char(vdt_hasta, 'mm')) = 2 THEN
                    vsm_dif_dias := vsm_dif_dias + 30;
                ELSE
                    vsm_dif_dias := vsm_dif_dias + to_number(to_char(vdt_hasta, 'dd'));
                END IF;
            ELSE
                vsm_dif_dias := vsm_dif_dias + to_number(to_char(vdt_hasta, 'dd'));
            END IF;
        END IF;

        vsm_dif_dias := vsm_dif_dias - (to_number(to_char(vdt_desde, 'yyyy')) * 360) - (to_number(to_char(vdt_desde, 'mm')) * 30);

        IF to_number(to_char(vdt_desde, 'dd')) = 31 THEN
            vsm_dif_dias := vsm_dif_dias - 30;
        ELSE
            IF to_number(to_char(vdt_desde, 'dd')) = 28 THEN
                IF to_number(to_char(vdt_desde, 'mm')) = 2 THEN
                    vsm_dif_dias := vsm_dif_dias - 30;
                ELSE
                    vsm_dif_dias := vsm_dif_dias - to_number(to_char(vdt_desde, 'dd'));
                END IF;
            ELSE
                vsm_dif_dias := vsm_dif_dias - to_number(to_char(vdt_desde, 'dd'));
            END IF;
        END IF;

        vsm_dif_dias := vsm_dif_dias + 1;

        IF NVL(vdc_valor_che,0) > 0 THEN
          IF (vdc_ingresos / vsm_dif_dias) < vdc_tope_che / 30 THEN
              vdc_ingresos := vdc_ingresos - vdc_valor_che;
          END IF;    
        END IF;
        
        vsm_numero := vsm_numero + 1;
        IF NVL(vdc_ingresos,0) > 0 THEN
            /* INSERTAR SALARIOS - SECUENCIA 34 - En el reporte 37*/ 
            INSERT INTO fco_cir_det 
            (id_rep, usuariow, cod_rep, compania, sucursal, anio, numero, 
            trabajador, nombre, cedula, fecha_desde, fecha_hasta, campo_ng, campo_gr, secuencia, valor_retencion)
            VALUES (psi_id_rep, pvc_usuario, pti_cod_rep, vch_compania, vch_sucursal, vsm_anio, vsm_numero, 
            cch_trabajador, cvc_nombre, cvc_cedula, vdt_desde, vdt_hasta, 0, vdc_ingresos, 34, 0);
        END IF;
        
        IF NVL(vdc_cesantias,0) > 0 THEN
            /* INSERTAR CESANTIAS E INTERESES DE CESANTIAS EFECTIVAMENTE PAGADAS - SECUENCIA 35 - En el reporte 38 */  
            INSERT INTO fco_cir_det 
            (id_rep, usuariow, cod_rep, compania, sucursal, anio, numero, 
            trabajador, nombre, cedula, fecha_desde, fecha_hasta, campo_ng, campo_gr, secuencia, valor_retencion) 
            VALUES (psi_id_rep, pvc_usuario, pti_cod_rep, vch_compania, vch_sucursal, vsm_anio, vsm_numero, 
            cch_trabajador, cvc_nombre, cvc_cedula, vdt_desde, vdt_hasta, 0, vdc_cesantias, 35,0);
        END IF;
         
        /* INSERTAR GASTOS DE REPRESENTACION - SECUENCIA 36 - En el reporte 39 */  
        IF vdc_gastos_rep > 0 THEN
            INSERT INTO fco_cir_det 
            (id_rep, usuariow, cod_rep, compania, sucursal, anio, numero, 
            trabajador, nombre, cedula, fecha_desde, fecha_hasta, campo_ng, campo_gr, secuencia, valor_retencion) 
            VALUES (psi_id_rep, pvc_usuario, pti_cod_rep, vch_compania, vch_sucursal, vsm_anio, vsm_numero, 
            cch_trabajador, cvc_nombre, cvc_cedula, vdt_desde, vdt_hasta, 0, vdc_gastos_rep, 36, 0);            
        END IF;

          /* INSERTAR PENSIONES DE JUBILIACION, VEJEZ O INVALIDEZ - SECUENCIA 37 - En el reporte 40 */  
        IF vdc_valor_pn > 0 THEN    
            INSERT INTO fco_cir_det         
            (id_rep, usuariow, cod_rep, compania, sucursal, anio, numero, 
            trabajador, nombre, cedula, fecha_desde, fecha_hasta, campo_ng, campo_gr, secuencia, valor_retencion)        
            VALUES (psi_id_rep, pvc_usuario, pti_cod_rep, vch_compania, vch_sucursal, vsm_anio, vsm_numero,
            cch_trabajador, cvc_nombre, cvc_cedula, vdt_desde, vdt_hasta, 0, vdc_valor_pn, 37, 0);
        END IF;  
          
        /* INSERTAR OTROS INGRESOS ORIGINADOS EN LA RELACION LABORAL - SECUENCIA 38 - En el reporte 41*/                
        IF NVL(vdc_oti,0) > 0 THEN
            INSERT INTO fco_cir_det         
            (id_rep, usuariow, cod_rep, compania, sucursal, anio, numero, 
            trabajador, nombre, cedula, fecha_desde, fecha_hasta, campo_ng, campo_gr, secuencia, valor_retencion)        
            VALUES (psi_id_rep, pvc_usuario, pti_cod_rep, vch_compania, vch_sucursal, vsm_anio, vsm_numero,
            cch_trabajador, cvc_nombre, cvc_cedula, vdt_desde, vdt_hasta, 0, vdc_oti, 38, 0);             
        END IF;
          
          /* INSERTAR APORTES OBLIGATORIOS POR SALUD - SECUENCIA 40 - En el reporte 43*/  
        IF NVL(vdc_valor_EPS,0) > 0 THEN
            INSERT INTO fco_cir_det         
            (id_rep, usuariow, cod_rep, compania, sucursal, anio, numero, 
            trabajador, nombre, cedula, fecha_desde, fecha_hasta, campo_ng, campo_gr, secuencia, valor_retencion)        
            VALUES (psi_id_rep, pvc_usuario, pti_cod_rep, vch_compania, vch_sucursal, vsm_anio, vsm_numero,
            cch_trabajador, cvc_nombre, cvc_cedula, vdt_desde, vdt_hasta, 0, vdc_valor_EPS, 40, 0);             
        END IF;

        /* INSERTAR APORTES OBLIGATORIOS A FONDOS DE PENSIONES Y SOLIDARIDAD PENSIONAL SECUENCIA 41- En el reporte 44 */  
        IF NVL(vdc_valor_AFP,0) > 0 THEN
            INSERT INTO fco_cir_det
            (id_rep, usuariow, cod_rep, compania, sucursal, anio, numero, 
            trabajador, nombre, cedula, fecha_desde, fecha_hasta, campo_ng, campo_gr, secuencia, valor_retencion)
            VALUES (psi_id_rep, pvc_usuario, pti_cod_rep, vch_compania, vch_sucursal, vsm_anio, vsm_numero, 
            cch_trabajador, cvc_nombre, cvc_cedula, vdt_desde, vdt_hasta, 0, vdc_valor_AFP, 41,0);                  
        END IF;
                  
        /* INSERTAR APORTES VOLUNTARIOS A FONDOS DE PENSIONES Y CUENTAS AFC - SECUENCIA 42 -En el reporte 45 */  
        IF NVL(vdc_valor_VOL,0) > 0 THEN
            INSERT INTO fco_cir_det                   
            (id_rep, usuariow, cod_rep, compania, sucursal, anio, numero, 
            trabajador, nombre, cedula, fecha_desde, fecha_hasta, campo_ng, campo_gr, secuencia, valor_retencion)
            VALUES                   
            (psi_id_rep, pvc_usuario, pti_cod_rep, vch_compania, vch_sucursal, vsm_anio, vsm_numero, 
            cch_trabajador, cvc_nombre, cvc_cedula, vdt_desde, vdt_hasta, 0, vdc_valor_VOL, 42, 0);                  
        END IF;
                
        /* INSERTAR RETENCION EN LA FUENTE - SECUENCIA 43 - En el reporte 46*/  
        IF NVL(vdc_retencion,0) > 0 THEN
            INSERT INTO fco_cir_det                   
            (id_rep, usuariow, cod_rep, compania, sucursal, anio, numero, 
            trabajador, nombre, cedula, fecha_desde, fecha_hasta, campo_ng, campo_gr, secuencia, valor_retencion)
            VALUES                   
            (psi_id_rep, pvc_usuario, pti_cod_rep, vch_compania, vch_sucursal, vsm_anio, vsm_numero, 
            cch_trabajador, cvc_nombre, cvc_cedula, vdt_desde, vdt_hasta, 0, vdc_retencion, 43, 0);                  
        END IF;
                
    END LOOP;
        
    IF vch_x_sucursal = 'SI' THEN
        CLOSE cr_detalle_suc;
    ELSE
        CLOSE cr_detalle;
    END IF;
   
  vdt_hasta := To_Date(To_Char(vsm_anio) || '1231', 'yyyymmdd');  

   -- NO PROCESAR LOS TRABAJADORES FUERA DEL RANGO DE DATOS DE LA AGR. 4
  IF NVL(TRIM(pch_dato_dde),'0') <> '0' THEN
    DELETE fco_cir_det
    WHERE id_rep = psi_id_rep
    AND usuariow = pvc_usuario
    AND cod_rep = pti_cod_rep
    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_cir_det
    WHERE id_rep = psi_id_rep
    AND usuariow = pvc_usuario
    AND cod_rep = pti_cod_rep    
    AND trabajador IN
        (SELECT trabajador FROM rel_trab_agr
         WHERE agrupacion = pch_agr_1
         AND dato > pch_dato_hta);
  END IF;

    -- DATOS DE LAS AGRUPACIONES SELECCIONADAS POR EL USUARIO 
  IF NVL(TRIM(pch_agr_1),'0') <> '0' THEN
    --Agrupacion 1 - agr1
    UPDATE fco_cir_det 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_cir_det 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_cir_det 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_hasta) 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_hasta)
                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_cir_det 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_cir_det 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_cir_det 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_cir_det 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_hasta) 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_hasta)
                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_cir_det 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_cir_det 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_cir_det 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_cir_det 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_hasta) 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_hasta)
                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_cir_det 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

  --se ejecuta el sp que Genera archivos planos
  --este sp es solo para Porvenir.
--  sp_fco_rep_cir_mm (psi_id_rep, pvc_usuario, pti_cod_rep);

  /* Cambio  Certificados Nombres y Apellidos*/
  UPDATE fco_cir_det rv 
  SET primer_apellido = SUBSTR(fn_ape1(nombre),1, 20),   
     segundo_apellido = SUBSTR(fn_ape2(nombre), 1,30),            
     primer_nombre = SUBSTR(fn_nom1(nombre),1, 20),   
     segundo_nombre = SUBSTR(fn_nom2(nombre),1, 30)
  WHERE rv.id_rep = psi_id_rep 
    AND rv.usuariow = pvc_usuario
    AND rv.cod_rep = pti_cod_rep;
    
  COMMIT;

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