CREATE TABLE fco_ausentismos
(
    compania        char(4) NOT NULL,
    id_ausentismo   int NOT NULL,
    trabajador      char(10) NOT NULL,
    concepto        smallint NOT NULL,
    tipo            number(1) NOT NULL,
    fecha_inicio    date,
    fecha_causacion date,
    fecha_pago      date,
    fecha_fin       date,
    dias            smallint,
    tipo_dias       number(1),
    diagnostico     varchar2(5),
    observaciones   varchar2(1000),
    id_origen       int,
    valor_ibc       number(19, 6),
    calculo_ibc     number(1),
    fecha_ini_real  date;
    fecha_fin_real  date;
    fecha_accidente date;
    nro_incapacidad varchar2(20);
    CONSTRAINT PK_fco_ausentismos PRIMARY KEY(compania, id_ausentismo)
    USING INDEX TABLESPACE TS_ADAMINDICES
)
TABLESPACE TS_ADAMDATOS;
CREATE PUBLIC SYNONYM fco_ausentismos FOR ADAM.fco_ausentismos;
GRANT ALL ON fco_ausentismos TO ADAMA;
CREATE TABLE fco_ausentismos_historico
(
    compania        char(4) NOT NULL,
    id_ausentismo   int NOT NULL,
    trabajador      char(10) NOT NULL,
    concepto        smallint NOT NULL,
    tipo            number(1) NOT NULL,
    fecha_inicio    date,
    fecha_causacion date,
    fecha_pago      date,
    fecha_fin       date,
    dias            smallint,
    tipo_dias       number(1),
    diagnostico     varchar2(5),
    observaciones   varchar2(1000),
    id_origen       int,
    valor_ibc       number(19, 6),
    calculo_ibc     number(1),
    fecha_ini_real  date;
    fecha_fin_real  date;
    fecha_accidente date;
    nro_incapacidad varchar2(20);
    CONSTRAINT PK_fco_ausentismos_historico PRIMARY KEY
    (compania, id_ausentismo)
    USING INDEX TABLESPACE TS_ADAMINDICES
)
TABLESPACE TS_ADAMDATOS;
CREATE PUBLIC SYNONYM fco_ausentismos_historico FOR ADAM.fco_ausentismos_historico;
GRANT ALL ON fco_ausentismos_historico TO ADAMA;

CREATE TABLE fco_ausentismos_IBC
(id_rep smallint NOT NULL,
 usuariow varchar2(30) NOT NULL,
 compania char(4) NOT NULL,
 trabajador char(10) NOT NULL,
 concepto number(5) NOT NULL,
 valor_ibc number(19,6) NOT NULL
)
TABLESPACE TS_ADAMDATOS;

CREATE PUBLIC SYNONYM fco_ausentismos_IBC FOR ADAM.fco_ausentismos_IBC;
GRANT ALL ON fco_ausentismos_IBC TO ADAMA;
CREATE TABLE fco_ausentismos_id
(
    compania        char(4) NOT NULL,
    id_ausentismo   int NOT NULL,
    CONSTRAINT PK_fco_ausentismos_id PRIMARY KEY
    (compania, id_ausentismo)
    USING INDEX TABLESPACE TS_ADAMINDICES
)
TABLESPACE TS_ADAMDATOS;

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


INSERT INTO fco_ausentismos_id 
SELECT compania, 0 
FROM companias;

COMMIT;
CREATE TABLE fco_ausentismos_id_as 
(clave smallint NOT NULL, 
id_ausentismo int NOT NULL
)
TABLESPACE TS_ADAMDATOS;

CREATE PUBLIC SYNONYM fco_ausentismos_id_as FOR ADAM.fco_ausentismos_id_as;
GRANT ALL ON fco_ausentismos_id_as TO ADAMA;
CREATE TABLE fco_diagnosticos
(
    diagnostico    varchar2(5) NOT NULL,
    descripcion    varchar2(100) NOT NULL,
    CONSTRAINT PK_fco_diagnosticos PRIMARY KEY (diagnostico)
    USING INDEX TABLESPACE TS_ADAMINDICES
)
TABLESPACE TS_ADAMDATOS;

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

CREATE TABLE fco_tmpfechafin
(fecha date
)
TABLESPACE TS_ADAMDATOS;

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

CREATE OR REPLACE FUNCTION fn_acum_imp_rango_meses
(
    pch_compania char,
    pch_trabajador char,
    pch_agr_cnc char,
    pnu_anio_ini number,
    pnu_mes_ini number,
    pnu_anio_fin number,
    pnu_mes_fin number
)
RETURN number
/********************************************************************/
/*** Reportes e Interfases de Data Tecnologia                     ***/
/*** Descripcion: Retorna el valor de una agrupacion de acumulados***/
/*** mensuales                                                    ***/
/*** Autor:	Diana Cecilia Rios Peinado                            ***/
/*** Fecha:	Junio 23 de 2005                                      ***/
/********************************************************************/
--OCT-10-05: DCR, Funcionaba entre dos años, o para el mismo año comenzando en enero, mas no para el mismo
--año, con mes de inicio diferente a enero, Ej. de marzo a agosto de 2003, estaba tomando de enero a agosto de 2003

IS
  vnu_imp_01 number(19,6);
  vnu_imp_02 number(19,6);
  vnu_imp_03 number(19,6);
  vnu_imp_04 number(19,6);
  vnu_imp_05 number(19,6);
  vnu_imp_06 number(19,6);
  vnu_imp_07 number(19,6);
  vnu_imp_08 number(19,6);
  vnu_imp_09 number(19,6);
  vnu_imp_10 number(19,6);
  vnu_imp_11 number(19,6);
  vnu_imp_12 number(19,6);                      
  vnu_acumula number(19,6);
  vnu_acumula2 number(19,6);
  vdc_importe number(19,6);
  
BEGIN

     --hallando el año final
     vnu_acumula := 0;
     vnu_acumula2:= 0;
     vdc_importe := 0;
     
     vnu_imp_01 := 0;
     vnu_imp_02 := 0;
     vnu_imp_03 := 0;
     vnu_imp_04 := 0;
     vnu_imp_05 := 0;
     vnu_imp_06 := 0;
     vnu_imp_07 := 0;
     vnu_imp_08 := 0;
     vnu_imp_09 := 0;
     vnu_imp_10 := 0;
     vnu_imp_11 := 0;
     vnu_imp_12 := 0;
     BEGIN
        SELECT am.acum_imp_mes_01, am.acum_imp_mes_02, am.acum_imp_mes_03, am.acum_imp_mes_04,
        am.acum_imp_mes_05, am.acum_imp_mes_06, am.acum_imp_mes_07, am.acum_imp_mes_08,
        am.acum_imp_mes_09, am.acum_imp_mes_10, am.acum_imp_mes_11, am.acum_imp_mes_12
        INTO vnu_imp_01, vnu_imp_02, vnu_imp_03, vnu_imp_04,
        vnu_imp_05, vnu_imp_06, vnu_imp_07, vnu_imp_08,
        vnu_imp_09, vnu_imp_10, vnu_imp_11, vnu_imp_12
        FROM acumulados_mensuales am
        WHERE compania = pch_compania
        AND trabajador = pch_trabajador
        AND agr_conceptos = pch_agr_cnc
        AND anio = pnu_anio_fin;        
     EXCEPTION
        WHEN OTHERS THEN vnu_imp_01 := 0;
                          vnu_imp_02 := 0;
                          vnu_imp_03 := 0;
                          vnu_imp_04 := 0;
                          vnu_imp_05 := 0;
                          vnu_imp_06 := 0;
                          vnu_imp_07 := 0;
                          vnu_imp_08 := 0;
                          vnu_imp_09 := 0;
                          vnu_imp_10 := 0;
                          vnu_imp_11 := 0;
                          vnu_imp_12 := 0;        
     END;

     IF pnu_mes_fin >= 1 THEN
        vnu_acumula := vnu_imp_01;
     END IF;

     IF pnu_mes_fin >= 2 THEN
        vnu_acumula := vnu_acumula + vnu_imp_02;
     END IF;
     
     IF pnu_mes_fin >= 3 THEN
        vnu_acumula := vnu_acumula + vnu_imp_03;
     END IF;

     IF pnu_mes_fin >= 4 THEN
        vnu_acumula := vnu_acumula + vnu_imp_04;
     END IF;

     IF pnu_mes_fin >= 5 THEN
        vnu_acumula := vnu_acumula + vnu_imp_05;
     END IF;

     IF pnu_mes_fin >= 6 THEN
        vnu_acumula := vnu_acumula + vnu_imp_06;
     END IF;

     IF pnu_mes_fin >= 7 THEN
        vnu_acumula := vnu_acumula + vnu_imp_07;
     END IF;

     IF pnu_mes_fin >= 8 THEN
        vnu_acumula := vnu_acumula + vnu_imp_08;
     END IF;

     IF pnu_mes_fin >= 9 THEN
        vnu_acumula := vnu_acumula + vnu_imp_09;
     END IF;

     IF pnu_mes_fin >= 10 THEN
        vnu_acumula := vnu_acumula + vnu_imp_10;
     END IF;
     
     IF pnu_mes_fin >= 11 THEN
        vnu_acumula := vnu_acumula + vnu_imp_11;
     END IF;
     
     IF pnu_mes_fin >= 12 THEN
        vnu_acumula := vnu_acumula + vnu_imp_12;
     END IF;

		 --hallamos de enero hasta el mes inicial, sin contar el inicial, para luego restarlo
     IF (pnu_anio_fin = pnu_anio_ini) THEN --año igual
		     IF pnu_mes_ini > 1 THEN
		        vnu_acumula := vnu_acumula - vnu_imp_01;
         END IF;
         
		     IF pnu_mes_ini > 2 THEN
		        vnu_acumula := vnu_acumula - vnu_imp_02;
         END IF;
         		     
		     IF pnu_mes_ini > 3 THEN
		         vnu_acumula := vnu_acumula - vnu_imp_03;
         END IF;
         		
		     IF pnu_mes_ini > 4 THEN
		         vnu_acumula := vnu_acumula - vnu_imp_04;
         END IF;
         		
		     IF pnu_mes_ini > 5 THEN
		         vnu_acumula := vnu_acumula - vnu_imp_05;
         END IF;
         		
		     IF pnu_mes_ini > 6 THEN
		         vnu_acumula := vnu_acumula - vnu_imp_06;
         END IF;
         		
		     IF pnu_mes_ini > 7 THEN
		         vnu_acumula := vnu_acumula - vnu_imp_07;
         END IF;
         		
		     IF pnu_mes_ini > 8 THEN
		         vnu_acumula := vnu_acumula - vnu_imp_08;
         END IF;
         		
		     IF pnu_mes_ini > 9 THEN
		         vnu_acumula := vnu_acumula - vnu_imp_09;
         END IF;
         		
		     IF pnu_mes_ini > 10 THEN
		         vnu_acumula := vnu_acumula - vnu_imp_10;
         END IF;
         		     
		     IF pnu_mes_ini > 11 THEN
		         vnu_acumula := vnu_acumula - vnu_imp_11;
         END IF;             
		 END IF;--año igual
  
     IF (pnu_anio_fin > pnu_anio_ini)  THEN
       vnu_imp_01 := 0;
       vnu_imp_02 := 0;
       vnu_imp_03 := 0;
       vnu_imp_04 := 0;
       vnu_imp_05 := 0;
       vnu_imp_06 := 0;
       vnu_imp_07 := 0;
       vnu_imp_08 := 0;
       vnu_imp_09 := 0;
       vnu_imp_10 := 0;
       vnu_imp_11 := 0;
       vnu_imp_12 := 0;
       BEGIN
          SELECT am.acum_imp_mes_01, am.acum_imp_mes_02, am.acum_imp_mes_03, am.acum_imp_mes_04,
          am.acum_imp_mes_05, am.acum_imp_mes_06, am.acum_imp_mes_07, am.acum_imp_mes_08,
          am.acum_imp_mes_09, am.acum_imp_mes_10, am.acum_imp_mes_11, am.acum_imp_mes_12
          INTO vnu_imp_01, vnu_imp_02, vnu_imp_03, vnu_imp_04,
          vnu_imp_05, vnu_imp_06, vnu_imp_07, vnu_imp_08,
          vnu_imp_09, vnu_imp_10, vnu_imp_11, vnu_imp_12
          FROM acumulados_mensuales am
          WHERE compania = pch_compania
          AND trabajador = pch_trabajador
          AND agr_conceptos = pch_agr_cnc
          AND anio = pnu_anio_ini;        
       EXCEPTION
          WHEN OTHERS THEN vnu_imp_01 := 0;
                            vnu_imp_02 := 0;
                            vnu_imp_03 := 0;
                            vnu_imp_04 := 0;
                            vnu_imp_05 := 0;
                            vnu_imp_06 := 0;
                            vnu_imp_07 := 0;
                            vnu_imp_08 := 0;
                            vnu_imp_09 := 0;
                            vnu_imp_10 := 0;
                            vnu_imp_11 := 0;
                            vnu_imp_12 := 0;        
       END;
            
       IF pnu_mes_ini <= 1  THEN
          vnu_acumula2 := vnu_imp_01;
       END IF;
  
       IF pnu_mes_ini <= 2  THEN
          vnu_acumula2 := vnu_acumula2 + vnu_imp_02;
       END IF;
       
       IF pnu_mes_ini <= 3 THEN
          vnu_acumula2 := vnu_acumula2 + vnu_imp_03;
       END IF;
  
       IF pnu_mes_ini <= 4 THEN
          vnu_acumula2 := vnu_acumula2 + vnu_imp_04;
       END IF;
  
       IF pnu_mes_ini <= 5 THEN
          vnu_acumula2 := vnu_acumula2 + vnu_imp_05;
       END IF;
  
       IF pnu_mes_ini <= 6 THEN
          vnu_acumula2 := vnu_acumula2 + vnu_imp_06;
       END IF;
  
       IF pnu_mes_ini <= 7 THEN
          vnu_acumula2 := vnu_acumula2 + vnu_imp_07;
       END IF;
  
       IF pnu_mes_ini <= 8 THEN
          vnu_acumula2 := vnu_acumula2 + vnu_imp_08;
       END IF;
  
       IF pnu_mes_ini <= 9 THEN
          vnu_acumula2 := vnu_acumula2 + vnu_imp_09;
       END IF;
  
       IF pnu_mes_ini <= 10 THEN
          vnu_acumula2 := vnu_acumula2 + vnu_imp_10;
       END IF;
       
       IF pnu_mes_ini <= 11 THEN
          vnu_acumula2 := vnu_acumula2 + vnu_imp_11;
       END IF;
       
       IF pnu_mes_ini <= 12 THEN
          vnu_acumula2 := vnu_acumula2 + vnu_imp_12;
       END IF;                       
     END IF;

     vdc_importe := NVL(vnu_acumula,0) + NVL(vnu_acumula2,0);
     RETURN vdc_importe;
END;
/
CREATE PUBLIC SYNONYM fn_acum_imp_rango_meses FOR ADAM.fn_acum_imp_rango_meses;
GRANT ALL ON fn_acum_imp_rango_meses TO ADAMA;
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;

CREATE OR REPLACE PROCEDURE sp_fco_baja_ausentismos
(
    pch_compania    char,
    pin_id_ausentismo  int
)
AS
BEGIN
    INSERT INTO fco_ausentismos_historico
    SELECT * FROM fco_ausentismos
    WHERE compania = pch_compania And 
          id_ausentismo = pin_id_ausentismo;

    DELETE fco_ausentismos
    WHERE compania = pch_compania And 
          id_ausentismo = pin_id_ausentismo;
          
    COMMIT;
END;
/
CREATE PUBLIC SYNONYM sp_fco_baja_ausentismos FOR ADAM.sp_fco_baja_ausentismos;
GRANT EXECUTE ON sp_fco_baja_ausentismos TO adama;
CREATE OR REPLACE PROCEDURE sp_fco_crea_ausentismo
(
    pch_compania char,
    pin_id_ausentismo int,
    pch_trabajador char,
    psi_concepto smallint,
    pti_tipo number,
    pdt_inicio date,
    pdt_causacion date,
    pdt_pago date,
    pdt_fin date,
    psi_dias smallint,
    pti_tipo_dias number,
    pvc_diagnostico varchar2,
    pvc_observaciones varchar2,
    psi_randomico smallint,
    pin_prorroga  int,  --agregado DCRP Agosto25/2003. Puede venir nulo
    pde_valor_ibc  number,
    pti_calculo_ibc number,
    pdt_ini_real date,
    pdt_fin_real date,
    pdt_accidente date,
    pvc_nro_incapacidad varchar2,
    pti_horas number
)
AS
    vin_id_ausentismo int;
    vti_existe	 number(1);
BEGIN

    IF pti_tipo = 4 THEN --PRORROGA
       vti_existe := 0;
       BEGIN
          SELECT 1
          INTO vti_existe
          FROM fco_ausentismos
          WHERE compania = pch_compania   AND
          trabajador = pch_trabajador AND
          id_ausentismo = pin_prorroga AND
          concepto = psi_concepto AND
          tipo <> 4;
       EXCEPTION
          WHEN OTHERS THEN vti_existe := 0;
       END;

       IF vti_existe = 0 THEN
          RAISE_APPLICATION_ERROR(-20001, 'El registro a prorrogarar en [FCO_AUSENTISMOS] no existe.');
          RETURN;
       END IF;
    END IF;


    IF psi_randomico = 0 THEN /*--UPDATE*/
        UPDATE fco_ausentismos
        SET concepto = psi_concepto,
            tipo = pti_tipo,
            fecha_inicio = pdt_inicio,
            fecha_causacion = pdt_causacion,
            fecha_pago = pdt_pago,
            fecha_fin = pdt_fin,
            dias = psi_dias,
            tipo_dias = pti_tipo_dias,
            diagnostico = pvc_diagnostico,
            observaciones = pvc_observaciones,
            id_origen = pin_prorroga,
            valor_ibc = pde_valor_ibc,
            calculo_ibc = pti_calculo_ibc,
            fecha_ini_real = pdt_ini_real,
            fecha_fin_real = pdt_fin_real,
            fecha_accidente = pdt_accidente,
            nro_incapacidad = pvc_nro_incapacidad,
            horas = pti_horas
        WHERE
            compania = pch_compania And
            id_ausentismo = pin_id_ausentismo;
    ELSE
        BEGIN

            SELECT Nvl(id_ausentismo,0) + 1
            INTO vin_id_ausentismo
            FROM fco_ausentismos_id
            WHERE compania = pch_compania;

            IF Nvl(vin_id_ausentismo, 0) = 0 THEN
                vin_id_ausentismo := 1;
                INSERT INTO fco_ausentismos_id VALUES (pch_compania, 1);
            ELSE
                UPDATE fco_ausentismos_id
                SET id_ausentismo = vin_id_ausentismo
                WHERE compania = pch_compania;
            END IF;


           INSERT INTO fco_ausentismos
           (compania, id_ausentismo, trabajador, concepto, tipo, fecha_inicio, fecha_causacion, 
            fecha_pago, fecha_fin, dias, tipo_dias, diagnostico, observaciones, id_origen, valor_ibc,
            calculo_ibc, fecha_ini_real, fecha_fin_real, fecha_accidente, nro_incapacidad, horas)
           VALUES
           (
               pch_compania,
               vin_id_ausentismo,
               pch_trabajador,
               psi_concepto,
               pti_tipo,
               pdt_inicio,
               pdt_causacion,
               pdt_pago,
               pdt_fin,
               psi_dias,
               pti_tipo_dias,
               pvc_diagnostico,
               pvc_observaciones,
               pin_prorroga,
               pde_valor_ibc,
               pti_calculo_ibc,
               pdt_ini_real,
               pdt_fin_real,
               pdt_accidente,
               pvc_nro_incapacidad,
               pti_horas
           );

           DELETE fco_ausentismos_id_as;

           COMMIT WORK;

           INSERT INTO fco_ausentismos_id_as VALUES (psi_randomico, vin_id_ausentismo);
        END;

    END IF;
    COMMIT;
END;
/
CREATE PUBLIC SYNONYM sp_fco_crea_ausentismo FOR ADAM.sp_fco_crea_ausentismo;
GRANT EXECUTE ON sp_fco_crea_ausentismo TO adama;
CREATE OR REPLACE PROCEDURE sp_fco_del_diagnosticos
(
    pvc_diagnostico varchar
)
AS
BEGIN
    DELETE fco_diagnosticos 
    WHERE diagnostico = pvc_diagnostico;
    
    COMMIT;
END;
/

CREATE PUBLIC SYNONYM sp_fco_del_diagnosticos FOR ADAM.sp_fco_del_diagnosticos;
GRANT EXECUTE ON sp_fco_del_diagnosticos TO adama;

CREATE OR REPLACE PROCEDURE sp_fco_hallar_final_habil
(
    pch_compania       char, 
    pch_trabajador     char,
    pdt_fecha_inicial  date,
    psi_dias           smallint
)
AS
    vsi_i              smallint;
    vch_dato           char(10);
    vdt_ndias_periodo  date;
    vsi_no_habiles     smallint;
    vdt_fecha_ini_per2 date;
    vvc_agrupacion     varchar2(20);
    vch_agrupacion2    char(10);
    vdt_fecha_final    date;
    vti_flag           number(1);

    CURSOR cur_agrupacion_rh IS
    SELECT LTRIM(RTRIM(alfanumerico)) FROM parametros_rh
    WHERE compania = pch_compania AND
          parametro_rh = 'Ag_Dias_NL';

BEGIN
    vsi_i := 0;
    vch_dato := '';
    vdt_ndias_periodo := '';

    vsi_no_habiles := 0;
    vdt_fecha_ini_per2 := '';
    vvc_agrupacion := '';
    vch_agrupacion2 := '';

    OPEN cur_agrupacion_rh;

    LOOP
        FETCH cur_agrupacion_rh  INTO vvc_agrupacion;
        EXIT WHEN cur_agrupacion_rh%NOTFOUND;
            
        vch_agrupacion2 := LTRIM(RTRIM(vvc_agrupacion));
        vch_dato := '';
           
        vdt_ndias_periodo   := '';
           
        IF NOT ((vch_agrupacion2 = '') OR (vch_agrupacion2 IS NULL)) THEN
            SELECT dato
            INTO vch_dato
            FROM rel_trab_agr
            WHERE compania = pch_compania   AND
                  trabajador = pch_trabajador AND
                  agrupacion = vch_agrupacion2;
        ELSE
            vch_dato := '';
        END IF;
          
        vsi_i := 1;
        vsi_no_habiles := 0;
        vdt_fecha_ini_per2 := pdt_fecha_inicial - 1;
          
        WHILE  (vsi_no_habiles < psi_dias) LOOP
            vdt_ndias_periodo := vdt_fecha_ini_per2 + vsi_i;
            vti_flag :=0;
         
            BEGIN
                SELECT 1 INTO vti_flag
                FROM DUAL
                WHERE EXISTS(SELECT 1 FROM dias_no_laborables
                              WHERE compania   = pch_compania   AND
                                    dato       = vch_dato       AND
                                    fecha      = vdt_ndias_periodo);
            EXCEPTION
                WHEN OTHERS THEN vti_flag := 0;
            END;

            IF vti_flag = 0 THEN
                vsi_no_habiles := vsi_no_habiles + 1;
            END IF;
          
            vsi_i := vsi_i + 1;
        END LOOP;    /* END WHILE */      

    END LOOP;

    CLOSE cur_agrupacion_rh;

    DELETE fco_tmpfechafin;
    vdt_fecha_final := vdt_ndias_periodo;
    INSERT INTO fco_tmpfechafin VALUES (vdt_fecha_final);

    COMMIT WORK;
END;
/
CREATE PUBLIC SYNONYM sp_fco_hallar_final_habil FOR ADAM.sp_fco_hallar_final_habil;
GRANT EXECUTE ON sp_fco_hallar_final_habil TO adama;

CREATE OR REPLACE PROCEDURE sp_fco_incorpora_ausentismos
(
    pch_compania        char,
    psi_id_calendario   smallint,
    pch_clase_nomina    char,
    pch_trabajador      char,
    pvc_usuario         varchar2,
    pdt_fecha_hoy       date
)
AS
/*********************************************************************/
/*** Modulo:      Modulo Fiscal ADAM v3 - Embargos                 ***/
/*** Descripcion: Incorpora embargos a la nómina                   ***/
/*** Autor:	  Juan Carlos Leguizamon                           ***/
/*** Fecha:	  Junio 17 de 2002                                 ***/
/*** Revision:	  Julio 25 de 2002                                 ***/
/*** Motor:	  oracle 8i		Version interna: 1.0       ***/
/*********************************************************************/
    cin_id_au         int;
    cch_trabajador    char(10);
    csi_concepto      smallint;
    cti_tipo          number(1);
    cdt_inicio_au     date;
    cdt_fin_au        date;
    csi_dias          smallint;
    cti_tipo_dias     number(1);
    vdt_inicio_per    date;
    vdt_fin_per       date;
    vdt_inicio        date; /* Fecha inicio del ausentismo dentro del periodo */
    vdt_fin           date; /* Fecha fin del ausentismo dentro del periodo */
    vnm_tiempo        number(8,3);
    vti_prorroga      number(1);
    vin_cursor        integer;
    vvc_sql           varchar2(2500);
    vin_registros     integer;
    vvc_tabla         varchar2(30);
    vnm_masivo        number(1);
    vnu_valor_ibc     number(19,6);
    vnu_ibc           number(19,6);
    
    CURSOR cr_ausentismos IS
    SELECT
        au.id_ausentismo, au.trabajador, au.concepto, au.tipo,
        au.fecha_inicio, au.fecha_fin, au.dias, au.tipo_dias, au.valor_ibc
    FROM
        fco_ausentismos au, trabajadores_grales tg, calendario_procesos cp, rel_conc_tipo_nomina rctn
    WHERE
        au.compania = tg.compania And au.trabajador = tg.trabajador And
        cp.id_calendario = psi_id_calendario And
        rctn.compania = au.compania And rctn.tipo_nomina = cp.tipo_nomina And
        au.concepto = rctn.concepto And
        au.compania = pch_compania And
        tg.clase_nomina = pch_clase_nomina And
        tg.sit_trabajador = 1 And
        au.fecha_fin >= vdt_inicio_per  And
        ((au.trabajador = pch_trabajador And vnm_masivo=0) OR (vnm_masivo=1)) ;
BEGIN
    /* Deducir si el incorpora es masivo o no */
    vnm_masivo := 0;
    IF Nvl(LTrim(RTrim(pch_trabajador))||'0','0') = '0' THEN
        vnm_masivo := 1;
    END IF;
    /* Eliminar las transacciones ya generadas por este incorpora */
    vin_cursor := dbms_sql.open_cursor;
    vvc_tabla := 'tt' || rtrim(pch_compania) || to_char(psi_id_calendario);
    vvc_sql := ' DELETE ' || vvc_tabla ||
               ' WHERE compania = ''' || pch_compania || '''' ||
               ' AND clase_nomina = ''' || pch_clase_nomina || '''' ||
               ' AND id_calendario = ' || To_Char(psi_id_calendario) ||
               ' AND referencia = ''AUSENTISMO''' ||
               ' AND ((trabajador = ''' || pch_trabajador || ''' And ' || To_Char(vnm_masivo) || '=0) OR (' || To_Char(vnm_masivo) || '=1))';
    dbms_sql.parse(vin_cursor, vvc_sql, dbms_sql.v7);
    vin_registros := dbms_sql.execute(vin_cursor);
    dbms_sql.close_cursor(vin_cursor);
    DELETE
        transacciones_ns
    WHERE
        compania = pch_compania And
        clase_nomina = pch_clase_nomina And
        id_calendario = psi_id_calendario And
        referencia = 'AUSENTISMO' And
        ((trabajador = pch_trabajador And vnm_masivo=0) OR (vnm_masivo=1));
    /* Recuperar las fechas del periodo */
    SELECT
        fecha_inicio, fecha_termino
    INTO
        vdt_inicio_per, vdt_fin_per
    FROM
        calendario_procesos
    WHERE
        id_calendario = psi_id_calendario;
    /* Recorrer los ausentismos activos */
    OPEN cr_ausentismos;
    LOOP
        FETCH cr_ausentismos
        INTO cin_id_au, cch_trabajador, csi_concepto, cti_tipo,
             cdt_inicio_au, cdt_fin_au, csi_dias, cti_tipo_dias, vnu_valor_ibc;
        EXIT WHEN cr_ausentismos%NOTFOUND;
        /* Hallar si es prorroga o no */
        Vti_prorroga := 0;
        IF cti_tipo = 4 THEN
           Vti_prorroga := 1;
        END IF;
        /* Calcular las fechas del ausentismo en el periodo */
        IF cdt_inicio_au < vdt_inicio_per THEN
            vdt_inicio := vdt_inicio_per;
        ELSE
            vdt_inicio := cdt_inicio_au;
        END IF;            
        IF cdt_fin_au > vdt_fin_per THEN
            vdt_fin := vdt_fin_per;
        ELSE
            vdt_fin := cdt_fin_au;
        END IF;            
        /* Hallar el numero de dias del ausentismo para el periodo */
        vnm_tiempo := vdt_fin - vdt_inicio + 1;
        vnu_ibc := ROUND(((vnu_valor_ibc/30)*vnm_tiempo),2);
	IF vnm_tiempo > 0 THEN
           sp_alta_transacciones_din
           (
            pch_compania,
            pch_clase_nomina,
            psi_id_calendario,
            csi_concepto,
            cch_trabajador,
            'AUSENTISMO',       /* referencia */
            NULL,               /* secuencia */
            '',	                /* referencia2 */
            cdt_inicio_au,	/* fecha */
            pdt_fecha_hoy,    	/* fecha2*/
            vnm_tiempo,         /* tiempo */
            cin_id_au,          /* factor_01 */
            cti_tipo,           /* factor_02 */
            vti_prorroga,       /* factor_03 */
            0,       		/* importe_reportado */
            vnu_ibc, --0,       		/* importe */
            null,    		/* turno_trn */
            null,    		/* puesto_trn */
            null,    		/* agrupacion_01_trn */
            null,    		/* dato_01_trn */
            null,    		/* agrupacion_02_trn */
            null,    		/* dato_02_trn */
            null,    		/* agrupacion_03_trn */
            null,    		/* dato_03_trn */
            null,    		/* agrupacion_04_trn */
            null,    		/* dato_04_trn */
            1,    		/* origen_transaccion */
            pvc_usuario, 	/* usuario_registro */
            pdt_fecha_hoy,	/* fecha_registro */
            null,    		/* usuario_proceso */
            null,		/* fecha_proceso */
            null,    		/* usuario_cambio */
            null,    		/* fecha_cambio */
            1,    		/* sit_transaccion */
            1		        /* checa bajas del periodo */
           );
        END IF;
    END LOOP; /* LOOP */
    CLOSE cr_ausentismos;
    COMMIT WORK;
END;
/
CREATE PUBLIC SYNONYM sp_fco_incorpora_ausentismos FOR ADAM.sp_fco_incorpora_ausentismos;
GRANT EXECUTE ON sp_fco_incorpora_ausentismos TO adama;
CREATE OR REPLACE PROCEDURE sp_fco_upd_diagnosticos
(
    pvc_diagnostico varchar2,
    pvc_descripcion varchar2
)
AS
    vti_existe number(1);
BEGIN

    vti_existe := 0;

    BEGIN
      SELECT 1
      INTO vti_existe
      FROM fco_diagnosticos
      WHERE diagnostico = pvc_diagnostico;
    EXCEPTION
      WHEN OTHERS THEN vti_existe := 0;
    END;

    IF vti_existe = 1 THEN 
        UPDATE fco_diagnosticos 
        SET descripcion = pvc_descripcion
        WHERE diagnostico = pvc_diagnostico;
    ELSE
        INSERT INTO fco_diagnosticos (diagnostico, descripcion)
        VALUES (pvc_diagnostico, pvc_descripcion);
    END IF;
    
    COMMIT WORK;
END;
/

CREATE PUBLIC SYNONYM sp_fco_upd_diagnosticos FOR ADAM.sp_fco_upd_diagnosticos;
GRANT EXECUTE ON sp_fco_upd_diagnosticos TO adama;

