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�n en un determinado estado. * * @param estado - Estado en el que se busca que est�n las vacaciones. * @return Una lista con las vacaciones en ese estado. * @throws Lanza excepciones si el usuario no tiene permisos. */ private function cargaPermisos(){ if($this->vacaciones == null){ $this->vacacionesSolicitadas = array(); $this->vacacionesAprobadas = array(); $this->vacacionesRechazadas = array(); $this->vacacionesAnulables = array(); //Comprobamos permisos: $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; //Permisos correctos, sigo. }else{ //Cargo la lista de d�as: $fecha = $this->anio."-".$this->mes."-"; $consulta = "SELECT fecha, aprobada FROM permisos 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 permisos: // $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�n solicitadas. * * @return Una lista con las vacaciones aprobadas. * @throws Lanza excepciones si el usuario no tiene permisos. */ function getPermisosSolicitados(){ if($this->vacacionesSolicitadas == null){ $this->cargaPermisos(); } return $this->vacacionesSolicitadas; } /** * Obtiene una lista de todas las vacaciones del usuario en el mes y a�o que * est�n aprobadas. * * @return Una lista con las vacaciones aprobadas. * @throws Lanza excepciones si el usuario no tiene permisos. */ function getPermisosAprobados(){ if($this->vacacionesAprobadas == null){ $this->cargaPermisos(); } return $this->vacacionesAprobadas; } /** * Obtiene una lista de todas las vacaciones del usuario en el mes y a�o que * est�n rechazadas. * * @return Una lista con las vacaciones rechazadas. * @throws Lanza excepciones si el usuario no tiene permisos. */ function getPermisosRechazados(){ if($this->vacacionesRechazadas == null){ $this->cargaPermisos(); } return $this->vacacionesRechazadas; } /** * Obtiene una lista de todas las vacaciones del usuario en el mes y a�o que * est�n pendientes de anulaci�n. * * @return Una lista con las vacaciones pendientes de anulaci�n. * @throws Lanza excepciones si el usuario no tiene permisos. */ function getPermisosPendientes(){ if($this->vacacionesAnulables == null){ $this->cargaPermisos(); } return $this->vacacionesAnulables; } /** * Acceso al mes. * @return El mes. */ function getMes(){ return $this->mes; } /** * Acceso al a�o. * @return El a�o. */ function getAnio(){ return $this->anio; } /** * 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->cargaPermisos(); $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 permisos o solicitud de anulaci�n de permisos es t�cnico. if($estado == 0 || $estado == 3){ $observacion = "observacion_tecnico"; $observacion2 = "observacion_rrhh"; $mensaje2 = $this->getObservacionRRHH($dia); //En caso de aprobaci�n o rechace de permisos 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 permisos WHERE oid = '".$oid."' AND fecha='".$fecha."'"; $bd->execQuery($consulta); $consulta = "INSERT INTO permisos (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 = ""; } } 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->cargaPermisos(); $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 permisos 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 permisos 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)) and ($mensaje != "")){ $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['620']." $nombre $apellidos.\n\n"; $email .= $solicitud."\n\n"; $email = $email."\n\n"; $direccion = constante("email_rrhh"); if(!envia_correo_empleados($direccion, $this->locale['621'], $email)){ //TODO �Excepci�n? } } }else{ $error = $this->locale['3033']; throw new Exception($error); return false; exit; } //Si no, lanzamos excepci�n. }else{ $error = $this->locale['3032']; throw new Exception($error); return false; exit; } //Si no, lanzamos excepci�n. }else{ $error = $this->locale['3007']; throw new Exception($error); return false; exit; } } /** * Comprueba si se puede solicitar un d�a como vacaciones. * */ public function esSolicitable($dia){ if($this->usuario->tieneRol("4")){ return true; } $plazo = constante("antelacion_permisos"); $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 no est�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�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{ return false; } //D�a solicitado o festivo }else{ return false; } //Fecha fuera de plazo. }else{ return false; } } /** * Aprobaci�n de una solicitud de vacaciones. */ public function aprobar($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)){ $muestra_dias = ""; foreach($dias as $dia => $mensaje){ //S�lo puedo aprobar 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 aprobables: if((count($dias_correctos) == count($dias)) && (count($dias_fallidos) == 0)){ //Si insertamos todos los d�as, enviamos el mail con la aprobaci�n e insertamos //una P en el parte de actividad. if($this->insertarDias($dias_correctos, 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->usuario->getValor("nombre"); $apellidos = $this->usuario->getValor("apellidos"); $direccion = $this->empleado->getValor("email"); $email = $this->locale['617']." ".$muestra_dias.$this->locale['623']; if(!envia_correo_empleados($direccion, $this->locale['622'], $email)){ //TODO �Excepci�n? } }else{ $error = $this->locale['3035']; throw new Exception($error); return false; exit; } //Si no son todos aprobables. }else{ $error = $this->locale['3035']; throw new Exception($error); return false; exit; } //Si no, lanzamos excepci�n. }else{ $error = $this->locale['3034']; throw new Exception($error); return false; exit; } //Si no, lanzamos excepci�n. }else{ $error = $this->locale['3007']; 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['617']." ".$muestra_dias.$this->locale['624']; $direccion = $this->empleado->getValor("email"); if(!envia_correo_empleados($direccion, $this->locale['622'], $email)){ //TODO �Excepci�n? } }else{ $error = $this->locale['3036']; throw new Exception($error); return false; exit; } //Si no son todos rechazables. }else{ $error = $this->locale['3036']; throw new Exception($error); return false; exit; } //Si no, lanzamos excepci�n. }else{ $error = $this->locale['3037']; throw new Exception($error); return false; exit; } //Si no, lanzamos excepci�n. }else{ $error = $this->locale['3007']; throw new Exception($error); return false; exit; } } /** * Rechace de una solicitud de anulaci�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�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 �Necesario? }else{ $error = $this->locale['3038']; throw new Exception($error); return false; exit; } //Si no son todos rechazables. }else{ $error = $this->locale['3038']; throw new Exception($error); return false; exit; } //Si no, lanzamos excepci�n. }else{ $error = $this->locale['3037']; throw new Exception($error); return false; exit; } //Si no, lanzamos excepci�n. }else{ $error = $this->locale['3007']; throw new Exception($error); return false; exit; } } /** * Anulaci�n de unas permisos 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�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['618']." $nombre $apellidos.\n\n"; $email .= $solicitud."\n\n"; $path = "http://portal.selforsistemas.net"; $link = "".$nombre.""; $email = $email.$link."\n\n"; $direccion = constante("email_rrhh"); if(!envia_correo_empleados($direccion, $this->locale['619'], $email)){ //TODO �Excepci�n? } }else{ $error = $this->locale['3039']; throw new Exception($error); return false; exit; } //Si no son todos anulables. }else{ $error = $this->locale['3039']; throw new Exception($error); return false; exit; } //Si no, lanzamos excepci�n. }else{ $error = $this->locale['3040']; throw new Exception($error); return false; exit; } //Si no, lanzamos excepci�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�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 permisos 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�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['3041']; throw new Exception($error); return false; exit; } //Si no, lanzamos excepci�n. }else{ $error = $this->locale['3041']; throw new Exception($error); return false; exit; } //Si no, lanzamos excepci�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 solicitar un d�a como vacaciones. * */ public function esAnulable($dia){ $plazo = constante("antelacion_permisos"); $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�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�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{ return false; } //D�a solicitado o festivo }else{ return false; } //Fecha fuera de plazo. }else{ return false; } } function getOidPersona(){ return $this->empleado->getValor("oid"); } function getNombrePersona(){ return $this->empleado->getValor("nombre")." ".$this->empleado->getValor("apellidos"); } } ?>