CREATE OR REPLACE PROCEDURE sp_fco_ausentismos_IBC
(
  psi_id_rep  smallint,
  pvc_usuariow varchar2,      
  pch_compania   char,
  pch_trabajador char,
  pnu_concepto number,
  pdt_fec_ini varchar2,
  pnu_tipo_ibc number,
  pin_id_orig int DEFAULT NULL
)
AS
/*********************************************************************/
/*** Modulo:      Modulo Fiscal ADAM v3 - Embargos                 ***/
/*** Descripcion: Calcula el IBC para registro de ausentismos      ***/
/*** Autor:	  Diana C. Rios Peinado                                ***/
/*** Fecha:	  Junio 22 de 2004                                     ***/
/*** Motor:	  oracle 8i		Version interna: 1.0                     ***/
/*********************************************************************/
  vnu_ibc number(19,6);
  vnu_mes number(3);
  vnu_anio number(5);
  vvc_parametro varchar2(10);  
  vch_agr_cnc char(3);

  vdt_fec_ing date;  
  vnu_anio_ini number(5);
  vnu_anio_fin number(5);
  vnu_mes_ini number(3);
  vnu_mes_fin number(3);
  vnu_meses_corte number(3);  
  vnu_promedio number(3);  
  vnu_dif_meses number(3);
  vnu_dif_anios number(5);

  vnu_acumula number(19,6);
  
BEGIN
  vnu_mes := TO_NUMBER(TO_CHAR(TO_DATE(pdt_fec_ini,'YYYYMMDD'),'MM'));
  vnu_anio := TO_NUMBER(TO_CHAR(TO_DATE(pdt_fec_ini,'YYYYMMDD'),'YYYY'));
  --trayendo los parametros que se requieren. En esta interfase, necesitamos el concepto
  vvc_parametro := 'autoliq';
  
  --Agr de conceptos S16, IBC de salud
  vch_agr_cnc := '0';
  BEGIN
       SELECT dato
       INTO vch_agr_cnc
       FROM vw_fdt_parametros
       WHERE pais = 'COL'
       AND compania = pch_compania
       AND TRIM(parametro) = TRIM(vvc_parametro)
       AND secuencia = 16;
  EXCEPTION
       WHEN OTHERS THEN vch_agr_cnc := '0';
  END;

  IF pnu_tipo_ibc = 1 THEN --Basico
     vnu_ibc := 0;
     BEGIN
        SELECT a.salario
        INTO vnu_ibc                         
        FROM historico_sueldos a                      
        WHERE
            a.compania = pch_compania AND
            a.trabajador = pch_trabajador AND
            a.fecha = (select max(fecha) from historico_sueldos b
                       where a.compania = b.compania AND
                             a.trabajador = b.trabajador AND
                             b.fecha < pdt_fec_ini) AND
            a.secuencia = (select max(secuencia) from historico_sueldos c
                           where a.compania = c.compania AND
                                 a.trabajador = c.trabajador AND
                                 c.fecha < pdt_fec_ini);
        EXCEPTION
           WHEN OTHERS THEN vnu_ibc := 0;    
     END;  
  END IF;
  
  IF pnu_tipo_ibc = 2 THEN  --ibc del mes anterior de la fecha de inicio
     IF vnu_mes = 1 THEN
        vnu_mes := 12;
        vnu_anio := vnu_anio - 1;
     ELSE
        vnu_mes := vnu_mes - 1;
     END IF;   
     
     vnu_ibc := 0;
     BEGIN
       SELECT  SUM(DECODE(vnu_mes, 1, a.acum_imp_mes_01,
                 2, a.acum_imp_mes_02,
                 3, a.acum_imp_mes_03,
                 4, a.acum_imp_mes_04,
                 5, a.acum_imp_mes_05,
                 6, a.acum_imp_mes_06,
                 7, a.acum_imp_mes_07,
                 8, a.acum_imp_mes_08,
                 9, a.acum_imp_mes_09,
                 10, a.acum_imp_mes_10,
                 11, a.acum_imp_mes_11,
                 12, a.acum_imp_mes_12))
       INTO vnu_ibc
       FROM acumulados_mensuales a
       WHERE compania = pch_compania
       AND trabajador = pch_trabajador
       AND agr_conceptos = vch_agr_cnc
       AND anio = vnu_anio;       
     EXCEPTION
         WHEN OTHERS THEN vnu_ibc := 0;
     END;     
  END IF;
  
  IF pnu_tipo_ibc = 3 THEN -- buscar el ibc del id_origen
     vnu_ibc := 0;
     BEGIN
        SELECT valor_ibc
        INTO vnu_ibc
        FROM fco_ausentismos
        WHERE compania = pch_compania
        AND id_ausentismo = pin_id_orig
        AND trabajador = pch_trabajador
        AND concepto = pnu_concepto;        
     EXCEPTION
         WHEN OTHERS THEN vnu_ibc := 0;
     END;          
  END IF;

  IF pnu_tipo_ibc = 4 THEN  --los ultimos 12 meses, de la agrupacion IBC.
     vnu_meses_corte := 12;
     vnu_promedio := vnu_meses_corte;
  
     --hallando la fecha de ingreso del trabajador
     vdt_fec_ing := '';
     BEGIN
       SELECT fecha_ingreso
       INTO vdt_fec_ing
       FROM trabajadores_grales
       WHERE compania = pch_compania
       AND trabajador = pch_trabajador;
     EXCEPTION
       WHEN OTHERS THEN vdt_fec_ing := '';
     END;

     --hallando el aņo de ingreso y la fecha de ingreso
     vnu_anio_ini := TO_NUMBER(TO_CHAR(vdt_fec_ing,'YYYY'));
     vnu_mes_ini := TO_NUMBER(TO_CHAR(vdt_fec_ing,'MM'));
        
     IF vnu_mes = 1 THEN
        vnu_mes := 12;
        vnu_anio := vnu_anio - 1;
     ELSE
        vnu_mes := vnu_mes - 1;
     END IF;   

     vnu_anio_fin := vnu_anio;
     vnu_mes_fin := vnu_mes;
     
     vnu_dif_meses := NVL(vnu_mes_fin,0) - NVL(vnu_mes_ini,0);
     vnu_dif_anios := NVL(vnu_anio_fin,0) - NVL(vnu_anio_ini,0);
     IF vnu_dif_meses > 0 THEN 
        vnu_promedio := vnu_dif_meses+1;
     ELSE
        vnu_promedio := (NVL(vnu_mes_ini,0) - NVL(vnu_mes_fin,0))+1;
     END IF;

     IF vnu_dif_anios > 1 THEN
        vnu_anio_ini := vnu_anio - 1;
        vnu_mes_ini := vnu_mes_fin + 1;
        vnu_promedio := 12;
     ELSIF vnu_dif_anios = 1 THEN
           IF vnu_dif_meses >= 0 THEN --mas de 12 meses
              vnu_promedio := 12;
              vnu_mes_ini := vnu_mes_fin + 1;
           END IF;
     END IF;  

DBMS_OUTPUT.PUT_LINE('vnu_anio_ini: ' ||vnu_anio_ini);
DBMS_OUTPUT.PUT_LINE('vnu_mes_ini: ' ||vnu_mes_ini);
DBMS_OUTPUT.PUT_LINE('vnu_anio_fin: ' ||vnu_anio_fin);
DBMS_OUTPUT.PUT_LINE('vnu_mes_fin: ' ||vnu_mes_fin);
     
     --hallando valor acumulado
     vnu_acumula := 0;
     BEGIN
          SELECT fn_acum_imp_rango_meses(pch_compania, pch_trabajador, vch_agr_cnc, vnu_anio_ini, vnu_mes_ini, vnu_anio_fin, vnu_mes_fin)
          INTO vnu_acumula
          FROM DUAL;
     EXCEPTION
          WHEN OTHERS THEN vnu_acumula := 0;
     END;
         
     vnu_ibc := NVL(vnu_acumula,0)/ NVL(vnu_promedio,0); 
     
DBMS_OUTPUT.PUT_LINE('vnu_anio: ' ||vnu_anio);     
DBMS_OUTPUT.PUT_LINE('vnu_mes: ' ||vnu_mes);
DBMS_OUTPUT.PUT_LINE('vnu_promedio: ' ||vnu_promedio);
DBMS_OUTPUT.PUT_LINE('vnu_acumula: ' ||vnu_acumula);
DBMS_OUTPUT.PUT_LINE('vnu_ibc: ' ||vnu_ibc);
DBMS_OUTPUT.PUT_LINE('vch_agr_cnc: ' ||vch_agr_cnc);

  END IF;
  
  DELETE fco_ausentismos_IBC
  WHERE id_rep = psi_id_rep
  AND usuariow = pvc_usuariow;
    
  --insertando en la tabla
  INSERT INTO fco_ausentismos_IBC
  VALUES (psi_id_rep, pvc_usuariow, pch_compania, pch_trabajador, pnu_concepto, ROUND(vnu_ibc,0));

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

