Incam_Intranet/Objects/Vacaciones.php
2011-04-04 15:16:10 +00:00

960 lines
29 KiB
PHP
Raw Permalink Blame History

<?php
/*
* Created on 20/10/2008
*
* Representa la vacaciones de un empleado y comprende toda su gesti<74>n.
*
* 2008-10-20 (diego): Se crea la clase.
*/
include_once("Empleado.php");
include_once("ParteActividad.php");
include_once("./functions_sistema.php");
include_once("Calendario.php");
class Vacaciones{
/* Lista de vacaciones */
private $vacaciones;
/* Lista de vacaciones solicitadas */
private $vacacionesSolicitadas = null;
/* Lista de vacaciones aprobadas*/
private $vacacionesAprobadas = null;
/* Lista de vacaciones rechazadas*/
private $vacacionesRechazadas = null;
/* Lista de vacaciones pendientes de anulaci<63>n */
private $vacacionesAnulables = null;
/* Usuario de la sesi<73>n activa */
private $usuario;
/* Mes del calendario a considerar. */
private $mes;
/* A<>o del calendario a considerar. */
private $anio;
/* Identificador del solicitante de vacaciones*/
private $oid;
/* Empleado solicitante de vacaciones */
private $empleado;
/* Calendario para calcular d<>as especiales. */
private $calendario;
/** Idioma */
private $locale;
/**
* Crea un objeto que representa las vacaciones de un usuario.
* @param usuario - Usuario con la sesi<73>n activa.
* @param oid - Identificador del propietario de las vacaciones.
* @param mes - Mes del a<>o en que se gestionan las vacaciones.
* @param anio - A<>o para el que se gestionan las vacaciones.
* @param locale - Idioma en el que mostrar los mensajes.
*/
function Vacaciones($usuario,$oid,$mes,$anio, $locale){
$this->usuario=$usuario;
if($mes < 10){
//Me aseguro de que no tenga cero delante
$mes = $mes + 0;
//Y le pongo el cero delante.
$mes = "0".$mes;
}
$this->mes=$mes;
$this->anio=$anio;
$this->oid = $oid;
$this->locale = $locale;
$this->calendario = new Calendario($this->usuario, $this->mes, $this->anio, array(), "", $this->locale);
if($oid > 0){
$this->empleado = new Empleado($usuario, $oid);
}else{
$error = $this->locale['1534'];
throw new Exception($error);
return array();
exit;
}
}
/**
* Obtiene una lista de todas las vacaciones del usuario en el mes y a<>o que
* est<73>n en un determinado estado.
*
* @param estado - Estado en el que se busca que est<73>n las vacaciones.
* @return Una lista con las vacaciones en ese estado.
* @throws Lanza excepciones si el usuario no tiene vacaciones.
*/
private function cargaVacaciones(){
if($this->vacaciones == null){
$this->vacacionesSolicitadas = array();
$this->vacacionesAprobadas = array();
$this->vacacionesRechazadas = array();
$this->vacacionesAnulables = array();
//Comprobamos vacaciones:
$oidP = $this->usuario->getValor("oid");
//Si no soy yo y no soy admin ni RRHH, no tengo permiso:
if(($oidP != $this->oid) && (!$this->usuario->tieneRol(1)) && (!$this->usuario->tieneRol(4))){
$error = $this->locale['3031'];
throw new Exception($error);
return array();
exit;
//Vacaciones correctos, sigo.
}else{
//Cargo la lista de d<>as:
$fecha = $this->anio."-".$this->mes."-";
$consulta = "SELECT fecha, aprobada FROM vacaciones WHERE oid='".$this->oid."' AND fecha like '".$fecha."%'";
$bd = new BD();
$array = $bd->keyValueQuery($consulta, "fecha", "aprobada");
$this->vacaciones = array();
foreach($array as $fecha => $estado){
$dia = explode("-", $fecha);
$dia = $dia[2]+0;
$this->vacaciones[$dia] = $estado;
switch($estado){
case 0:
$this->vacacionesSolicitadas[] = $dia;
break;
case 1:
$this->vacacionesAprobadas[] = $dia;
break;
case 2:
$this->vacacionesRechazadas[] = $dia;
break;
case 3:
$this->vacacionesAnulables[] = $dia;
break;
}
}
}
}
// $dias=array();
//
// //Comprobamos vacaciones:
// $oidP = $this->usuario->getValor("oid");
//
// //Si no soy yo y no soy admin ni RRHH, no tengo permiso:
// if(($oidP != $this->oid) && (!$this->usuario->tieneRol(1)) && (!$this->usuario->tieneRol(4))){
// $error = $this->locale['3031'];
// throw new Exception($error);
// return $dias;
// exit;
// }else{
// //Busco los d<>as solicitados:
// $fecha = $this->anio."-".$this->mes."-";
// $consulta = "SELECT fecha FROM vacaciones WHERE oid='".$this->oid."' AND aprobada = '".$estado."' AND fecha like '".$fecha."%'";
// $bd = new BD();
// $array = $bd->arrayQuery($consulta, "fecha");
// foreach($array as $elem){
// $dia = explode("-", $elem);
// $dias[] = $dia[2]+0;
// }
// }
//
// return $dias;
}
/**
* Obtiene una lista de todas las vacaciones del usuario en el mes y a<>o que
* est<73>n solicitadas.
*
* @return Una lista con las vacaciones aprobadas.
* @throws Lanza excepciones si el usuario no tiene vacaciones.
*/
function getVacSoli(){
if($this->vacacionesSolicitadas == null){
$this->cargaVacaciones();
}
return $this->vacacionesSolicitadas;
}
/**
* Obtiene una lista de todas las vacaciones del usuario en el mes y a<>o que
* est<73>n aprobadas.
*
* @return Una lista con las vacaciones aprobadas.
* @throws Lanza excepciones si el usuario no tiene vacaciones.
*/
function getVacApro(){
if($this->vacacionesAprobadas == null){
$this->cargaVacaciones();
}
return $this->vacacionesAprobadas;
}
/**
* Obtiene una lista de todas las vacaciones del usuario en el mes y a<>o que
* est<73>n rechazadas.
*
* @return Una lista con las vacaciones rechazadas.
* @throws Lanza excepciones si el usuario no tiene vacaciones.
*/
function getVacRech(){
if($this->vacacionesRechazadas == null){
$this->cargaVacaciones();
}
return $this->vacacionesRechazadas;
}
/**
* Obtiene una lista de todas las vacaciones del usuario en el mes y a<>o que
* est<73>n pendientes de anulaci<63>n.
*
* @return Una lista con las vacaciones pendientes de anulaci<63>n.
* @throws Lanza excepciones si el usuario no tiene vacaciones.
*/
function getVacPend(){
if($this->vacacionesAnulables == null){
$this->cargaVacaciones();
}
return $this->vacacionesAnulables;
}
// /**
// * Calcula el n<>mero de d<>as de vacaciones restantes de un empleado.
// *
// * @return los d<>as restantes de vacaciones dentro del año.
// */
// public function getVacacionesRestantes(){
// //TODO deber<65>a lanzar excepci<63>n por permisos de consulta.
// $anio_hoy = date("Y");
// $consulta = "SELECT dias FROM vacaciones_oid WHERE oid='".$this->empleado->getValor("oid")."' AND anyo='".$this->anio."'";
// $bd = new BD();
// $dias = $bd->getCampo($consulta);
// //Primero comprobamos si est<73> en la tabla guardado:
// if(($dias >= 0) && ($dias != "")){
// return $dias;
// //Para el a<>o presente se calcula seg<65>n su fecha de alta.
// }else if($this->anio == $anio_hoy){
// $fecha = $this->empleado->getValor("fecha_alta");
// $fecha_array = explode("-", $fecha);
// $anyo = $fecha_array[0];
// $mes = $fecha_array[1];
// $dia = $fecha_array[2];
// $fecha = mktime(0,0,0,$mes,$dia,$anyo);
// $dias_mes = date('t',$fecha);
// $fiestas = constante("fiestas");
// //Si se dio de alta un a<>o anterior al actual tiene todos sus d<>as.
// if($anyo < date('Y')){
// //Se deja fiestas tal y como est<73>.
// //Si no, se calculan seg<65>n la f<>rmula.
// }else{
// $fiestas = (($fiestas/12)*(12-$mes))+(($fiestas/12/$dias_mes)*($dias_mes-$dia));
// $fiestas=round($fiestas,0);
// }
// //Para a<>os posteriores tiene todos los d<>as.
// }else if($this->anio > $anio_hoy){
// $fiestas = constante("fiestas");
// //Y para a<>os anteriores, devolvemos cero.
// }else{
// $fiestas = 0;
// }
//
// //Actualizamos la tabla para ahorrar c<>lculos posteriores:
// $consulta = "INSERT INTO vacaciones_oid (oid, anyo, dias) VALUES ('".$this->oid."', '".$this->anio."', '".$fiestas."')";
// $bd = new BD();
// $bd->execQuery($consulta);
//
// return $fiestas;
// }
/**
* Acceso al mes.
* @return El mes.
*/
function getMes(){
return $this->mes;
}
/**
* Acceso al a<>o.
* @return El a<>o.
*/
function getAnio(){
return $this->anio;
}
/**
* Asigna el valor de las vacaciones restantes del empleado.
*
* @param dias - N<>mero de d<>as de vacaciones restantes a asociar.
* @return True si se asign<67> correctamente y false en caso contrario.
* @throws Lanza excepci<63>n si el usuario no tiene permiso.
*/
public function setVacacionesRestantes($dias){
//Comprobamos permisos.
if($this->usuario->tieneRol(4) || $this->usuario->tieneRol(1)){
$consulta = "UPDATE vacaciones_oid SET dias='$dias' WHERE oid='".$this->oid."' AND anyo='".$this->anio."'";
$bd = new BD();
return $bd->execQuery($consulta);
}else{
$error = $this->locale['3001'];
throw new Exception($error);
return $dias;
exit;
}
}
/**
* Calcula el estado en el que se encuentra un d<>a.
*
* @param dia - D<>a dentro del mes y a<>o de las vacaciones.
* @return El c<>digo de estado si se encuentra el d<>a, -1 en caso contrario.
*/
public function getEstadoDia($dia){
$this->cargaVacaciones();
$estado = $this->vacaciones[$dia];
if($estado == "" || $estado < 0){
$estado = -1;
}
return $estado;
}
/**
*
*/
private function insertarDias($dias, $estado){
$oid = $this->oid;
$bd = new BD();
foreach($dias as $dia => $mensaje){
//En el caso de solicitud de vacaciones o solicitud de anulaci<63>n de vacaciones es t<>cnico.
if($estado == 0 || $estado == 3){
$observacion = "observacion_tecnico";
$observacion2 = "observacion_rrhh";
$mensaje2 = $this->getObservacionRRHH($dia);
//En caso de aprobaci<63>n o rechace de vacaciones es RRHH
}else if($estado == 1 || $estado == 2){
$observacion = "observacion_rrhh";
$observacion2 = "observacion_tecnico";
$mensaje2 = $this->getObservacionTecnico($dia);
}
$fecha = $this->anio."-".$this->mes."-".$dia;
$consulta = "DELETE FROM vacaciones WHERE oid = '".$oid."' AND fecha='".$fecha."'";
$bd->execQuery($consulta);
$consulta = "INSERT INTO vacaciones (oid, fecha, aprobada, f_mod, ".$observacion.", ".$observacion2.") VALUES ('".$oid."', '".$fecha."', '".$estado."',curdate(), '".$mensaje."', '".$mensaje2."')";
if(!$bd->execQuery($consulta)){
return false;
//Si todo ha ido bien comprobamos el estado a ver si hay que actualizar
//las vacaciones restantes.
}else{
$estadoPrevio = $this->vacaciones[$dia];
$this->cambiaEstado($dia, $estado);
$consulta = "";
/* Efectos de los cambios de estado:
* Solicitada: sin efectos.
* Aprobada: restar d<>a de vacaciones y actualizar parte.
* Rechazada: sin efectos.
* Pendiente de anulaci<63>n: sin efectos.
*/
switch ($estado) {
case 1:
//Se quita un d<>a de vacaciones, salvo en el caso de
//que estemos rechazando una solicitud de anulaci<63>n.
// Si el d<>a es 24 de diciembre o 31 de Diciembre, se resta s<>lo 0,5
if($estadoPrevio != 3){
if(($dia=="24") || ($dia=="31") && $this->mes=="12"){
$this->empleado->variaVacaciones(-0.5);
}else {
$this->empleado->variaVacaciones(-1);
}
}
break;
default:
break;
}
}
}
return true;
}
private function eliminaDia($dia){
$this->vacaciones = array_diff($this->vacaciones, array($dia));
$estadoPrevio = $this->vacaciones[$dia];
//Lo eliminamos de la lista donde estuviera:
switch($estadoPrevio){
case 0:
$this->vacacionesSolicitadas = array_diff($this->vacacionesSolicitadas, array($dia));
break;
case 1:
$this->vacacionesAprobadas = array_diff($this->vacacionesAprobadas, array($dia));
break;
case 2:
$this->vacacionesRechazadas = array_diff($this->vacacionesRechazadas, array($dia));
break;
case 3:
$this->vacacionesAnulables = array_diff($this->vacacionesAnulables, array($dia));
break;
}
}
private function cambiaEstado($dia, $estado){
$this->cargaVacaciones();
$estadoPrevio = $this->vacaciones[$dia];
if($estadoPrevio == "") $estadoPrevio = -1;
$this->vacaciones[$dia] = $estado;
//Actuamos s<>lo si hay cambio de estado.
if($estadoPrevio != $estado){
//Lo eliminamos de la lista donde estuviera:
switch($estadoPrevio){
case 0:
$this->vacacionesSolicitadas = array_diff($this->vacacionesSolicitadas, array($dia));
break;
case 1:
$this->vacacionesAprobadas = array_diff($this->vacacionesAprobadas, array($dia));
break;
case 2:
$this->vacacionesRechazadas = array_diff($this->vacacionesRechazadas, array($dia));
break;
case 3:
$this->vacacionesAnulables = array_diff($this->vacacionesAnulables, array($dia));
break;
}
//Y lo insertamos en la correspondiente:
switch($estado){
case 0:
$this->vacacionesSolicitadas[] = $dia;
break;
case 1:
$this->vacacionesAprobadas[] = $dia;
break;
case 2:
$this->vacacionesRechazadas[] = $dia;
break;
case 3:
$this->vacacionesAnulables[] = $dia;
break;
}
return true;
}else{
return false;
}
}
public function getObservacionTecnico($dia){
$fecha = $this->anio."-".$this->mes."-".$dia;
$consulta = "SELECT observacion_tecnico FROM vacaciones WHERE fecha = '".$fecha."' AND oid = ".$this->oid."";
$bd = new BD();
return $bd->getCampo($consulta);
}
public function getObservacionRRHH($dia){
$fecha = $this->anio."-".$this->mes."-".$dia;
$consulta = "SELECT observacion_rrhh FROM vacaciones WHERE fecha = '".$fecha."' AND oid = ".$this->oid."";
$bd = new BD();
return $bd->getCampo($consulta);
}
/**
* Solicita unos d<>as de vacaciones. Si alguno falla no se solicita ninguno.
* @return true si se pudieron solicitar todos y false si falla alguno.
*/
public function solicitar($dias){
if(count($dias) <= 0){
$error = $this->locale['3027'];
throw new Exception($error);
return false;
exit;
}
$dias_correctos = array();
$dias_fallidos = array();
//Comprobamos que estamos recibiendo el argumento bien formado.
if(gettype($dias) == "array"){
//Si tiene rol t<>cnico seguimos.
if((($this->usuario->tieneRol(6)) && ($this->usuario->getValor("oid") == $this->oid))
|| $this->usuario->tieneRol(4)){
foreach($dias as $dia => $mensaje){
if(($this->esSolicitable($dia))){
$dias_correctos[$dia] = $mensaje;
$solicitud = $dia.",";
}else{
$dias_incorrectos[] = $dia;
}
}
//Comprobamos que todos son solicitables:
if((count($dias_correctos) == count($dias)) && (count($dias_fallidos) == 0)){
//Si insertamos todos los d<>as, enviamos el mail con la solicitud.
if($this->insertarDias($dias_correctos, 0)){
$nombre = $this->usuario->getValor("nombre");
$apellidos = $this->usuario->getValor("apellidos");
$oid = $this->usuario->getValor("oid");
$email = $this->locale['616']." $nombre $apellidos.\n\n";
$email .= $solicitud."/".$this->mes."/".$this->anio."\n\n";
$email .= "\n\n";
$direccion = constante("email_rrhh");
if(!envia_correo_empleados($direccion, $this->locale['611'], $email)){
//TODO <20>Excepci<63>n?
}
}
}else{
$error = $this->locale['3004'];
throw new Exception($error);
return false;
exit;
}
//Si no, lanzamos excepci<63>n.
}else{
$error = $this->locale['3004'];
throw new Exception($error);
return false;
exit;
}
//Si no, lanzamos excepci<63>n.
}else{
$error = $this->locale['3007'];
throw new Exception($error);
return false;
exit;
}
}
/**
* Comprueba si se puede solicitar un d<>a como vacaciones.
* Si el usuario tiene rol RRHH sí que puede solicitar
*
*/
public function esSolicitable($dia){
if($this->usuario->tieneRol("4")){
return true;
}
$plazo = constante("antelacion_vacaciones");
$fecha = $this->anio."-".$this->mes."-".$dia;
$estado = $this->getEstadoDia($dia);
$localidad = $this->empleado->getValor("localidad");
$oid = $this->oid;
$mes_hoy=date("m");
$ano_hoy=date("Y");
//Si el plazo es correcto seguimos:
if(fecha_valida($fecha) > $plazo){
//Si no est<73>n ya solicitadas ni el d<>a es festivo seguimos:
$c = $this->calendario;
if(($estado == -1) && (!$c->esFestivo($localidad, $dia))){
//Si se solicita para este a<>o o para el pr<70>ximo dentro del plazo, todo ok:
if(($this->anio == date("Y")) || (($this->anio == date("Y") + 1) && (fecha_valida(date("Y")."-12-01") <= 0))){
return true;
}else{
return false;
}
//D<>a solicitado o festivo
}else{
return false;
}
//Fecha fuera de plazo.
}else{
return false;
}
}
/**
* Aprobaci<63>n de una solicitud de vacaciones.
*/
public function aprobar($dia){
//Si insertamos todos los d<>as, enviamos el mail con la aprobaci<63>n e insertamos
//una P en el parte de actividad.
// Calculamos el número que va a restar
$diasResta=1;
if(($dia=="24") || ($dia=="31") && $this->mes=="12"){
$diasResta=0.5;
}
// Comprobamos que tenga vacaciones suficientes
if($this->empleado->diasTotalesVacaciones()<$diasResta){
$error = $this->locale['3004'];
throw new Exception($error);
return false;
exit;
}
$array=array();
$array[$dia]="";
if($this->insertarDias($array, 1)){
$bd = new BD();
$fecha = $this->anio."-".$this->mes."-".$dia;
$consulta = "DELETE FROM partes_actividad WHERE oid = '".$this->oid."' AND fecha='".$fecha."'";
$bd->execQuery($consulta);
$consulta = "INSERT INTO partes_actividad (oid, fecha, dato) VALUES ('".$this->oid."', '".$fecha."', 'P')";
if(!$bd->execQuery($consulta)){
return false;
}
$nombre = $this->empleado->getValor("nombre");
$apellidos = $this->empleado->getValor("apellidos");
$direccion = $this->empleado->getValor("email");
$email = $this->locale['613']." ".$dia.$this->locale['614'];
//$direccion = constante("email_rrhh");
if(!envia_correo_empleados($direccion, $this->locale['622'], $email)){
//TODO Excepcion?
}
}else{
$error = $this->locale['3011'];
throw new Exception($error);
return false;
exit;
}
}
/**
* Rechace de una solicitud de vacaciones.
*/
function rechazar($dias){
$dias_correctos = array();
$dias_fallidos = array();
//Comprobamos que estamos recibiendo el argumento bien formado.
if(gettype($dias) == "array"){
//Si tiene rol t<>cnico seguimos.
if($this->usuario->tieneRol(1) || $this->usuario->tieneRol(4)){
foreach($dias as $dia => $mensaje){
//S<>lo puedo rechazar vacaciones solicitadas.
if($this->getEstadoDia($dia) == 0){
$dias_correctos[$dia] = $mensaje;
$muestra_dias .= $dia."-".$this->mes."-".$this->anio." ";
}else{
$dias_incorrectos[] = $dia;
}
}
//Comprobamos que todos son rechazables:
if((count($dias_correctos) == count($dias)) && (count($dias_fallidos) == 0)){
//Si insertamos todos los d<>as, enviamos el mail con las rechazadas.
if($this->insertarDias($dias_correctos, 2)){
$nombre = $this->usuario->getValor("nombre");
$apellidos = $this->usuario->getValor("apellidos");
$email = $this->locale['613']." ".$muestra_dias.$this->locale['615'];
//$direccion = constante("email_rrhh");
$direccion = $this->empleado->getValor("email");
if(!envia_correo_empleados($direccion, $this->locale['622'], $email)){
//TODO <20>Excepci<63>n?
}
}else{
$email = $this->locale['613']." ".$muestra_dias.$this->locale['615'];
throw new Exception($error);
return false;
exit;
}
//Si no son todos rechazables.
}else{
$error = $this->locale['3012'];
throw new Exception($error);
return false;
exit;
}
//Si no, lanzamos excepci<63>n.
}else{
$error = $this->locale['3017'];
throw new Exception($error);
return false;
exit;
}
//Si no, lanzamos excepci<63>n.
}else{
$error = $this->locale['3007'];
throw new Exception($error);
return false;
exit;
}
}
/**
* Rechace de una solicitud de anulaci<63>n de vacaciones.
*/
function rechazarAnulacion($dias){
$dias_correctos = array();
$dias_fallidos = array();
//Comprobamos que estamos recibiendo el argumento bien formado.
if(gettype($dias) == "array"){
//Si tiene rol t<>cnico seguimos.
if($this->usuario->tieneRol(1) || $this->usuario->tieneRol(4)){
foreach($dias as $dia => $mensaje){
//S<>lo puedo rechazar vacaciones pendientes de anulaci<63>n.
if($this->getEstadoDia($dia) == 3){
$dias_correctos[$dia] = $mensaje;
}else{
$dias_incorrectos[] = $dia;
}
}
//Comprobamos que todos son rechazables:
if((count($dias_correctos) == count($dias)) && (count($dias_fallidos) == 0)){
//Si insertamos todos los d<>as, enviamos el mail con las rechazadas.
if($this->insertarDias($dias_correctos, 1)){
//TODO <20>Necesario?
}else{
$error = $this->locale['3029'];
throw new Exception($error);
return false;
exit;
}
//Si no son todos rechazables.
}else{
$error = $this->locale['3029'];
throw new Exception($error);
return false;
exit;
}
//Si no, lanzamos excepci<63>n.
}else{
$error = $this->locale['3017'];
throw new Exception($error);
return false;
exit;
}
//Si no, lanzamos excepci<63>n.
}else{
$error = $this->locale['3007'];
throw new Exception($error);
return false;
exit;
}
}
/**
* Anulaci<63>n de unas vacaciones aprobados.
*/
function anular($dias){
$dias_correctos = array();
$dias_fallidos = array();
//Comprobamos que estamos recibiendo el argumento bien formado.
if(gettype($dias) == "array"){
//Si tiene rol t<>cnico seguimos.
if($this->usuario->tieneRol(1) || $this->usuario->tieneRol(4)){
foreach($dias as $dia => $mensaje){
//S<>lo puedo anular las pendientes de anulaci<63>n.
if($this->getEstadoDia($dia) == 3){
$solicitud = $dia.",";
$dias_correctos[] = $dia;
}else{
$dias_incorrectos[] = $dia;
}
}
//Comprobamos que todos son aprobables:
if((count($dias_correctos) == count($dias)) && (count($dias_fallidos) == 0)){
//Si insertamos todos los d<>as, enviamos el mail con las anuladas.
if($this->anularDias($dias_correctos)){
$nombre = $this->usuario->getValor("nombre");
$apellidos = $this->usuario->getValor("apellidos");
$oid = $this->usuario->getValor("oid");
$email = $this->locale['600']." $nombre $apellidos.\n\n";
$email .= $solicitud."\n\n";
$path = "http://portal.selforsistemas.net";
$link = "<a href='".$path."/detalle_empleado.php?oid=".$oid."'>".$nombre."</a>";
$email = $email.$link."\n\n";
$direccion = constante("email_rrhh");
if(!envia_correo_empleados($direccion, $this->locale['619'], $email)){
//TODO <20>Excepci<63>n?
}
// Se suma 1 d<>a a las vacaciones
// Si es 24 o 31 de diciembre se suma 1;
if(($dia=="24") || ($dia=="31") && $this->mes=="12"){
$this->empleado->variaVacaciones(0.5);
}else{
$this->empleado->variaVacaciones(1);
}
}else{
$error = $this->locale['3013'];
throw new Exception($error);
return false;
exit;
}
//Si no son todos anulables.
}else{
$error = $this->locale['3013'];
throw new Exception($error);
return false;
exit;
}
//Si no, lanzamos excepci<63>n.
}else{
$error = $this->locale['3018'];
throw new Exception($error);
return false;
exit;
}
//Si no, lanzamos excepci<63>n.
}else{
$error = $this->locale['3007'];
throw new Exception($error);
return false;
exit;
}
}
function eliminarSolicitud($dias){
$dias_correctos = array();
$dias_fallidos = array();
//Comprobamos que estamos recibiendo el argumento bien formado.
if(gettype($dias) == "array"){
foreach($dias as $dia => $mensaje){
//S<>lo puedo eliminar vacaciones solicitadas.
if($this->getEstadoDia($dia) == 0){
$dias_correctos[] = $dia;
$muestra_dias .= $dia."-".$this->mes."-".$this->anio." ";
}else{
$dias_incorrectos[] = $dia;
}
}
//Comprobamos que todos son rechazables:
if((count($dias_correctos) == count($dias)) && (count($dias_fallidos) == 0)){
//Si insertamos todos los d<>as, enviamos el mail con las rechazadas.
if($this->anularDias($dias_correctos)){
return true;
}
//Si no son todos rechazables.
}else{
$error = $this->locale['3012'];
throw new Exception($error);
return false;
exit;
}
//Si no, lanzamos excepci<63>n.
}else{
$error = $this->locale['3007'];
throw new Exception($error);
return false;
exit;
}
}
private function anularDias($dias){
$oid = $this->oid;
$bd = new BD();
foreach($dias as $dia){
$fecha = $this->anio."-".$this->mes."-".$dia;
$consulta = "DELETE FROM vacaciones WHERE oid = '".$oid."' AND fecha='".$fecha."'";
if(!$bd->execQuery($consulta)){
return false;
//Si todo ha ido bien comprobamos el estado a ver si hay que actualizar
//las vacaciones restantes.
}else{
$this->eliminaDia($dia);
$fecha = $this->anio."-".$this->mes."-".$dia;
$consulta = "DELETE FROM partes_actividad WHERE oid = '".$oid."' AND fecha='".$fecha."'";
$bd->execQuery($consulta);
// $consulta = "INSERT INTO partes_actividad (oid, fecha, dato) VALUES ('".$oid."', '".$fecha."', '0')";
// if(!$bd->execQuery($consulta)){
// return false;
// }
}
}
return true;
}
/**
* Solicitud de anulaci<63>n de unas vacaciones aprobadas.
*/
function solicitarAnulacion($dias){
if(count($dias) <= 0){
$error = $this->locale['3027'];
throw new Exception($error);
return false;
exit;
}
$dias_correctos = array();
$dias_fallidos = array();
//Comprobamos que estamos recibiendo el argumento bien formado.
if(gettype($dias) == "array"){
//Si tiene rol t<>cnico seguimos.
if(($this->usuario->tieneRol(6)) && ($this->usuario->getValor("oid") == $this->oid)){
foreach($dias as $dia => $mensaje){
if($this->esAnulable($dia)){
$dias_correctos[$dia] = $mensaje;
}else{
$dias_incorrectos[] = $dia;
}
}
//Comprobamos que todos son solicitables:
if((count($dias_correctos) == count($dias)) && (count($dias_fallidos) == 0)){
//Si insertamos todos los d<>as, enviamos el mail con la solicitud.
if($this->insertarDias($dias_correctos, 3)){
//TODO
}
}else{
$error = $this->locale['3016'];
throw new Exception($error);
return false;
exit;
}
//Si no, lanzamos excepci<63>n.
}else{
$error = $this->locale['3016'];
throw new Exception($error);
return false;
exit;
}
//Si no, lanzamos excepci<63>n.
}else{
$error = $this->locale['3007'];
throw new Exception($error);
return false;
exit;
}
}
public function setEmpleado($empleado, $oid){
$this->empleado = $empleado;
$this->oid = $oid;
}
/**
* Comprueba si se puede anular un d<>a de vacaciones.
*
*/
public function esAnulable($dia){
$plazo = constante("antelacion_vacaciones");
$fecha = $this->anio."-".$this->mes."-".$dia;
$estado = $this->getEstadoDia($dia);
$localidad = $this->empleado->getValor("localidad");
$oid = $this->oid;
//Si el plazo es correcto seguimos:
if(fecha_valida($fecha) > $plazo){
//Si est<73>n aprobadas y el d<>a es festivo seguimos:
$c = $this->calendario;
if(($estado == 1) && (!$c->esFestivo($localidad, $dia))){
//Si se solicita para este a<>o o para el pr<70>ximo dentro del plazo, todo ok:
if(($this->anio == date("Y")) || (($this->anio == date("Y") + 1) && (fecha_valida(date("Y")."-12-15") <= 0))){
return true;
}else{
$error = $this->locale['3019'];
throw new Exception($error);
return false;
exit;
}
//D<>a solicitado o festivo
}else{
$error = $this->locale['3015'];
throw new Exception($error);
return false;
exit;
}
//Fecha fuera de plazo.
}else{
$error = $this->locale['3019'];
throw new Exception($error);
return false;
exit;
}
}
function getOidPersona(){
return $this->empleado->getValor("oid");
}
function getNombrePersona(){
return $this->empleado->getValor("nombre")." ".$this->empleado->getValor("apellidos");
}
}
?>