CREATE OR REPLACE PROCEDURE sp_calcula_dias_ausentismo(  
wch_compania CHAR,  
wch_trabajador CHAR,  
wsi_concepto NUMBER,  
wint_id_ausentismo NUMBER,  
wda_fecha_ini_au DATE,  
wda_fecha_fin_au DATE,   
wda_fecha_ini_per DATE,  
wda_fecha_fin_per DATE,   
wsm_empresa IN OUT NUMBER,  
wsm_trabajador IN OUT NUMBER)  
AS
--DCR:AG-09-07: Pasada a Oracle de una version de SQL que no se quien hizo    
/* Declaración de variables locales */    
 v_dias_ant NUMBER(5);
 v_dias_actuales NUMBER(5);  
 vdt_inicio DATE;
 vdt_fin DATE;
 
 vnu_existe NUMBER(1);
 vnu_dias_aux NUMBER(5);
  
/***********************************************************/  
/* C U E R P O   P R I N C I P A L   D E L   P R O C E S O */  
/***********************************************************/  
BEGIN  
/* calcula los dias anteriores de ausencia por esta misma incapacidad*/  
   vnu_existe := 0;   
   BEGIN
       SELECT 1
       INTO vnu_existe
       FROM VW_DIAS_AUSENCIA  
       WHERE compania = wch_compania   AND  
       trabajador = wch_trabajador AND  
       id_ausentismo = wint_id_ausentismo;
   EXCEPTION
     WHEN OTHERS THEN vnu_existe := 0;
   END;
   
   IF vnu_existe = 0 THEN --no existe
      v_dias_ant := 0;
   ELSE
       v_dias_ant := 0;
       BEGIN
          SELECT NVL(DIAS_ANTERIORES,0)
          INTO v_dias_ant
          FROM VW_DIAS_AUSENCIA  
          WHERE compania = wch_compania   AND  
          trabajador = wch_trabajador AND  
          id_ausentismo = wint_id_ausentismo;
       EXCEPTION
          WHEN OTHERS THEN v_dias_ant := 0;
       END;       
   END IF;
     
   /* Calcular las fechas del ausentismo en el periodo */  
   IF wda_fecha_ini_au < wda_fecha_ini_per THEN
      vnu_dias_aux := wda_fecha_ini_per - wda_fecha_ini_au;
      v_dias_ant := v_dias_ant + vnu_dias_aux;
      vdt_inicio := wda_fecha_ini_per;
   ELSE  
      vdt_inicio := wda_fecha_ini_au;
   END IF;         
  
   IF wda_fecha_fin_au > wda_fecha_fin_per THEN
       vdt_fin := wda_fecha_fin_per;
   ELSE  
       vdt_fin := wda_fecha_fin_au;
   END IF;
  
   v_dias_actuales := (vdt_fin - vdt_inicio) + 1;
      

   IF v_dias_ant >= 3 AND (wsi_concepto = 300 OR wsi_concepto = 310) THEN --if 1           
        wsm_empresa := 0;
        wsm_trabajador := v_dias_actuales;
   ELSE 
    		IF v_dias_ant < 3 AND (wsi_concepto = 300 OR wsi_concepto = 310) THEN --if 2
    			 IF (v_dias_actuales -  (3-v_dias_ant) ) >= 0 THEN --if 2 
			        wsm_empresa := (3-v_dias_ant);  
			        wsm_trabajador := (v_dias_actuales -  (3-v_dias_ant) );   
    			 ELSE  
    			    wsm_empresa := v_dias_actuales;
    			    wsm_trabajador := 0;
    			 END IF;--if 2.1
        ELSE 
    			 IF v_dias_ant >= 1 AND (wsi_concepto = 330 OR wsi_concepto = 335) THEN --if 3 
              wsm_empresa := 0;
              wsm_trabajador := v_dias_actuales;
      		 ELSE 
                IF v_dias_ant >= 0 AND (wsi_concepto = 330 OR wsi_concepto = 335) THEN --if 3.1    
    					     wsm_empresa := 1;
    					     wsm_trabajador := v_dias_actuales - 1;
                END IF; --if 3.1   
    			 END IF; --if 3
        END IF;--if 2        
   END IF;--if 1             
         
   COMMIT WORK;
END;
/
CREATE PUBLIC SYNONYM sp_calcula_dias_ausentismo FOR ADAM.sp_calcula_dias_ausentismo;
GRANT EXECUTE ON sp_calcula_dias_ausentismo TO adama;
