git-svn-id: https://192.168.0.254/svn/Proyectos.Incam_Intranet/trunk/src@62 e2b1556b-49f8-d141-9351-52d6861a72d9
578 lines
17 KiB
PHP
578 lines
17 KiB
PHP
<?php
|
|
/*
|
|
* Created on 20/10/2008
|
|
*
|
|
* Representa el parte de actividad de un empleado y comprende toda su gestión.
|
|
*
|
|
* 2008-10-20 (diego): Se crea la clase.
|
|
*/
|
|
|
|
include_once("Empleado.php");
|
|
include_once("Objects/Permisos.php");
|
|
|
|
class ParteActividad{
|
|
|
|
/* Usuario de la sesión activa */
|
|
private $usuario;
|
|
|
|
/* Mes del calendario a considerar. */
|
|
private $mes;
|
|
|
|
/* Año del calendario a considerar. */
|
|
private $anio;
|
|
|
|
/* Identificador del dueño del parte*/
|
|
private $oid;
|
|
|
|
/* Empleado dueño del parte. */
|
|
private $empleado;
|
|
|
|
/* Número de horas trabajadas. */
|
|
private $horas;
|
|
|
|
/* Número de jornadas trabajadas. */
|
|
private $jornadas;
|
|
|
|
/* Nombre y apellidos del empleado. */
|
|
private $nombreCompleto;
|
|
|
|
/* Vacaciones asociadas al parte de actividad. */
|
|
private $vacaciones;
|
|
|
|
/* Permisos asociados al parte de actividad. */
|
|
private $permisos;
|
|
|
|
/* Idioma */
|
|
private $locale;
|
|
|
|
/* Observaciones del mes */
|
|
private $observaciones = null;
|
|
|
|
/* Proyecto del parte*/
|
|
private $proyecto = null;
|
|
|
|
/* Cliente */
|
|
private $cliente = null;
|
|
|
|
/**
|
|
* Crea un objeto Parte de Actividad para un empleado para un mes y año concreto.
|
|
* @param usuario - Dueño de la sesión.
|
|
* @param oid - Identificador del dueño del parte de actividad.
|
|
* @param mes - Mes que contempla el parte.
|
|
* @param anio - Año que contempla el parte.
|
|
* @param locale - Contenido del fichero de idioma.
|
|
*/
|
|
function ParteActividad($usuario,$oid,$mes,$anio, $locale){
|
|
$this->usuario=$usuario;
|
|
$this->oid = $oid;
|
|
$this->locale = $locale;
|
|
if(($oid == $this->oid) || ($this->usuario->tieneRol(1)) || ($this->usuario->tieneRol(4))){
|
|
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->empleado = new Empleado($usuario, $oid);
|
|
$this->horas = -1;
|
|
$this->jornadas = -1;
|
|
$this->nombreCompleto = "";
|
|
$this->vacaciones = null;
|
|
$this->permisos = null;
|
|
}else{
|
|
$error = $this->locale['3024'];
|
|
throw new Exception($error);
|
|
return false;
|
|
exit;
|
|
}
|
|
}
|
|
|
|
function getMes(){
|
|
return $this->mes;
|
|
}
|
|
|
|
function getAnio(){
|
|
return $this->anio;
|
|
}
|
|
|
|
/**
|
|
* Acceso al parte de actividad del empleado
|
|
*/
|
|
function getParte(){
|
|
$parte=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['3002'];
|
|
throw new Exception($error);
|
|
return $parte;
|
|
exit;
|
|
}else{
|
|
//Busco el parte de actividad del presente mes:
|
|
$fecha = $this->anio."-".$this->mes;
|
|
$consulta = "SELECT dato, fecha FROM partes_actividad WHERE oid='".$this->oid."' AND fecha like '".$fecha."-%'";
|
|
$bd = new BD();
|
|
$array = $bd->keyValueQuery($consulta, "fecha", "dato");
|
|
//Nos quedamos sólo con el día:
|
|
foreach($array as $key => $value){
|
|
$fecha_array = explode("-", $key);
|
|
$search = array(".");
|
|
$replace = array(",");
|
|
$value = str_replace($search, $replace, $value);
|
|
$parte[$fecha_array[2]+0] = $value;
|
|
}
|
|
}
|
|
|
|
return $parte;
|
|
}
|
|
|
|
function rellenaParte($dias){
|
|
$dias_correctos = array();
|
|
$dias_fallidos = array();
|
|
//Comprobamos que estamos recibiendo el argumento bien formado.
|
|
if(gettype($dias) == "array"){
|
|
//Si tiene rol técnico y es el que tiene la sesión activa o tiene permisos de admin o RRHH seguimos.
|
|
$oidP = $this->usuario->getValor("oid");
|
|
if(($oidP == $this->oid) || ($this->usuario->tieneRol(1)) || ($this->usuario->tieneRol(4))){
|
|
foreach($dias as $dia => $parte){
|
|
if($this->esRellenableDia($dia) || $parte == "P"){
|
|
$dias_correctos[$dia] = $parte;
|
|
}else{
|
|
$dias_fallidos[$dia] = $parte;
|
|
}
|
|
}
|
|
//Comprobamos que todos son rellenables:
|
|
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)){
|
|
//TODO Duda
|
|
}
|
|
}else{
|
|
$error = $this->locale['3007'];
|
|
throw new Exception($error);
|
|
return false;
|
|
exit;
|
|
}
|
|
//Si no, lanzamos excepción.
|
|
}else{
|
|
$error = $this->locale['3008'];
|
|
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 insertarDias($dias){
|
|
$oid = $this->oid;
|
|
$partes = $this->getParte();
|
|
$bd = new BD();
|
|
foreach($dias as $dia => $parte){
|
|
if($parte != "P"){
|
|
//Verificamos cada valor del parte:
|
|
if($this->verificarValorParte($parte)){
|
|
$search = array(",");
|
|
$replace = array(".");
|
|
$parte = str_replace($search, $replace, $parte);
|
|
$fecha = $this->anio."-".$this->mes."-".$dia;
|
|
//Comprobamos si ha cambiado el parte.
|
|
if($partes[$dia] != $parte){
|
|
//Si ya existía actualizamos
|
|
if(array_key_exists($dia, $partes)){
|
|
//Si es 0 lo borro en lugar de actualizar.
|
|
if($parte != "0"){
|
|
$consulta = "UPDATE partes_actividad SET dato = '".$parte."' WHERE oid = '".$oid."' AND fecha = '".$fecha."'";
|
|
}else{
|
|
$consulta = "DELETE FROM partes_actividad WHERE oid = '".$oid."' AND fecha='".$fecha."'";
|
|
}
|
|
}else{
|
|
//Si es 0 ni inserto.
|
|
if($parte != "0"){
|
|
$consulta = "INSERT INTO partes_actividad (oid, fecha, dato) VALUES ('".$oid."', '".$fecha."', '".$parte."')";
|
|
}
|
|
}
|
|
//Hay casos en los que no hace falta tocar la base de datos.
|
|
if($consulta != ""){
|
|
if(!$bd->execQuery($consulta)){
|
|
return false;
|
|
}else{
|
|
$mensaje = "Modificado el parte del ".$dia."-".$this->mes."-".$this->anio." -> ".$parte;
|
|
//$this->empleado->actualizarHistorial($mensaje);
|
|
}
|
|
}
|
|
}
|
|
}else{
|
|
$error = $this->locale['3009'];
|
|
throw new Exception($error);
|
|
return false;
|
|
exit;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public function getDiasAntesAlta(){
|
|
$fecha_alta = $this->empleado->getValor("fecha_alta");
|
|
$fecha_alta = explode("-", $fecha_alta);
|
|
$mes_alta = $fecha_alta[1];
|
|
$mes = $this->mes;
|
|
$anio = $this->anio;
|
|
$anio_alta = $fecha_alta[0];
|
|
|
|
//Si es un mes posterior al de alta, devolvemos vacío
|
|
if(($anio > $anio_alta) || ($anio == $anio_alta && $mes > $mes_alta)){
|
|
return array();
|
|
//Si es un mes anterior al de alta, devolvemos todos
|
|
}else if(($anio < $anio_alta) || ($anio == $anio_alta && $mes < $mes_alta)){
|
|
$total = verifica_long_mes($mes, $anio);
|
|
$dias = array();
|
|
for($i = 1; $i <= $total; $i++){
|
|
$dias[] = $i;
|
|
}
|
|
return $dias;
|
|
//Si estamos en el mismo mes, calculamos:
|
|
}else{
|
|
$dia_alta = $fecha_alta[2];
|
|
$dias = array();
|
|
for($i = 1; $i <= $dia_alta; $i++){
|
|
$dias[] = $i;
|
|
}
|
|
return $dias;
|
|
}
|
|
}
|
|
|
|
private function verificarValorParte($dato){
|
|
if ((ereg("^[0-9]+(,[0-9]+)*$",$dato) && ($dato < 25)) || ($dato == "A") || ($dato == "P")){
|
|
return true;
|
|
}else{
|
|
$error = $this->locale['3009']." -> ".$dato;
|
|
throw new Exception($error);
|
|
return false;
|
|
exit;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Comprueba si el mes es objeto de ser rellenable o no.
|
|
*/
|
|
public function esRellenable(){
|
|
//Si es administrador o RRHH puede rellenar todos.
|
|
if(($this->usuario->tieneRol(1)) || ($this->usuario->tieneRol(4))){
|
|
return true;
|
|
}else{
|
|
$mes = $this->mes;
|
|
$anio = $this->anio;
|
|
$dia_hoy = date("j");
|
|
$mes_hoy = date("n");
|
|
$anio_hoy = date("Y");
|
|
//Sólo podemos actualizar partes del mismo mes o del anterior (hasta el día 3).
|
|
if($anio != $anio_hoy) return false;
|
|
if(($mes+1 == $mes_hoy) && ($dia_hoy <= 3)) return true;
|
|
if($mes != $mes_hoy) return false;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
private function esRellenableDia($dia){
|
|
if(($this->usuario->tieneRol(1)) || ($this->usuario->tieneRol(4))){
|
|
return true;
|
|
}else{
|
|
$mes = $this->mes;
|
|
$anio = $this->anio;
|
|
$dia_hoy = date("j");
|
|
$mes_hoy = date("n");
|
|
$anio_hoy = date("Y");
|
|
//No se puede rellenar parte de vacaciones solicitadas o aprobadas
|
|
if($this->vacaciones == null){
|
|
$this->vacaciones = new Vacaciones($this->usuario, $this->oid, $this->mes, $this->anio, $this->locale);
|
|
$this->vacaciones->setEmpleado($this->empleado, $this->oid);
|
|
}
|
|
if($this->vacaciones->getEstadoDia($dia) == 0) return false;
|
|
if($this->vacaciones->getEstadoDia($dia) == 1) return false;
|
|
//No se puede rellenar parte de permisos solicitados o aprobados
|
|
if($this->permisos == null){
|
|
$this->permisos = new Permisos($this->usuario, $this->oid, $this->mes, $this->anio, $this->locale);
|
|
$this->permisos->setEmpleado($this->empleado, $this->oid);
|
|
}
|
|
if($this->permisos->getEstadoDia($dia) == 0) return false;
|
|
if($this->permisos->getEstadoDia($dia) == 1) return false;
|
|
//Sólo podemos actualizar partes del mismo mes o del anterior (hasta el día 3).
|
|
if($anio != $anio_hoy) return false;
|
|
if(($mes+1 == $mes_hoy) && ($dia_hoy <= 3)) return true;
|
|
if($mes != $mes_hoy) return false;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
public function setHoras($horas){
|
|
$this->horas = $horas;
|
|
return $this->horas;
|
|
}
|
|
|
|
public function setJornadas($horas){
|
|
$this->jornadas = $horas;
|
|
return $this->jornadas;
|
|
}
|
|
|
|
/**
|
|
* Calcula las horas totales trabajadas.
|
|
*
|
|
* @return Un entero con el número de horas.
|
|
*/
|
|
public function getHoras(){
|
|
if($this->horas == -1){
|
|
$parte = $this->getParte();
|
|
$suma = 0;
|
|
foreach($parte as $dia){
|
|
if($this->haTrabajado($dia)){
|
|
$suma = $suma + $dia;
|
|
}
|
|
}
|
|
$this->horas = $suma;
|
|
}
|
|
|
|
return $this->horas;
|
|
}
|
|
|
|
/**
|
|
* Calcula las jornadas totales trabajadas.
|
|
*
|
|
* @return Un entero con el número de jornadas.
|
|
*/
|
|
public function getJornadas(){
|
|
if($this->jornadas == -1){
|
|
$parte = $this->getParte();
|
|
$suma = 0;
|
|
foreach($parte as $dia){
|
|
if($this->haTrabajado($dia)){
|
|
$suma = $suma + 1;
|
|
}
|
|
}
|
|
$this->jornadas = $suma;
|
|
}
|
|
|
|
return $this->jornadas;
|
|
}
|
|
|
|
/**
|
|
* Comprueba si un día se ha trabajado o no.
|
|
*
|
|
* @return true si se trabajó y false en caso contrario.
|
|
*/
|
|
private function haTrabajado($dia){
|
|
if ((ereg("^[0-9]+(.[0-9]+)*$",$dia) && ($dia < 25) && ($dia > 0))){
|
|
return true;
|
|
}else{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public function setNombreCompleto($nombre){
|
|
$this->nombreCompleto = $nombre;
|
|
}
|
|
|
|
/**
|
|
* Acceso al nombre del empleado.
|
|
*/
|
|
public function getNombreEmpleado(){
|
|
if($this->nombreCompleto == ""){
|
|
$this->nombreCompleto = $this->empleado->getValor("nombre")." ".$this->empleado->getValor("apellidos");
|
|
}
|
|
|
|
return $this->nombreCompleto;
|
|
}
|
|
|
|
/**
|
|
* Acceso al identificador del empleado.
|
|
*/
|
|
public function getOidEmpleado(){
|
|
return $this->oid;
|
|
}
|
|
|
|
|
|
function setObservacion($observaciones){
|
|
// //Comprobamos permisos:
|
|
$oidP = $this->usuario->getValor("oid");
|
|
if(($oidP != $this->oid) && (!$this->usuario->tieneRol(1)) && (!$this->usuario->tieneRol(4))){
|
|
$error = $this->locale['3002'];
|
|
throw new Exception($error);
|
|
return false;
|
|
exit;
|
|
}else{
|
|
$fecha = $this->anio."-".$this->mes;
|
|
if($observaciones==""){
|
|
// Eliminamos la observacion
|
|
$consulta="DELETE FROM observaciones WHERE oid = '".$this->oid."' AND fecha = '".$fecha."'";
|
|
$this->observaciones = null;
|
|
} else {
|
|
$this->getObservacion();
|
|
//Si no había cliente insertamos.
|
|
if(($this->observaciones == null)){
|
|
$consulta = "INSERT INTO observaciones (oid, fecha, fecha_mod, persona, observacion) VALUES ('".$this->oid."', '".$fecha."', curdate(),'".$this->usuario->getValor("nombre")."', '".$observaciones."')";
|
|
$this->observaciones = $observaciones;
|
|
//Si se ha modificado el clientea actualizamos.
|
|
}elseif($this->observaciones != $observaciones){
|
|
$consulta = "UPDATE observaciones SET observacion = '".$observaciones."', fecha_mod = curdate() WHERE oid = '".$this->oid."' AND fecha = '".$fecha."'";
|
|
$this->observaciones = $observaciones;
|
|
}
|
|
}
|
|
|
|
//Si hay que actualizar, actualizo:
|
|
if($consulta != ""){
|
|
$bd = new BD();
|
|
return $bd->execQuery($consulta);
|
|
}else{
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Asigna el cliente del empleado.
|
|
*/
|
|
public function setCliente($cliente){
|
|
//Comprobamos permisos:
|
|
$oidP = $this->usuario->getValor("oid");
|
|
if(($oidP != $this->oid) && (!$this->usuario->tieneRol(1)) && (!$this->usuario->tieneRol(4))){
|
|
$error = $this->locale['3002'];
|
|
throw new Exception($error);
|
|
return false;
|
|
exit;
|
|
}else{
|
|
$fecha = $this->anio."-".$this->mes;
|
|
$this->getCliente();
|
|
//Si no había cliente insertamos.
|
|
if(($this->observaciones == null) && ($this->cliente == null) && ($this->proyecto == null)){
|
|
$consulta = "INSERT INTO observaciones (oid, fecha, fecha_mod, persona, cliente) VALUES ('".$this->oid."', '".$fecha."', curdate(),'".$this->usuario->getValor("nombre")."', '".$cliente."')";
|
|
$this->cliente = $cliente;
|
|
//Si se ha modificado el clientea actualizamos.
|
|
}else if($this->cliente != $cliente){
|
|
$consulta = "UPDATE observaciones SET cliente = '".$cliente."', fecha_mod = curdate() WHERE persona = '".$this->usuario->getValor("nombre")."' AND fecha = '".$fecha."'";
|
|
$this->cliente = $cliente;
|
|
}
|
|
|
|
//Si hay que actualizar, actualizo:
|
|
if($consulta != ""){
|
|
$bd = new BD();
|
|
return $bd->execQuery($consulta);
|
|
}else{
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Asigna el proyecto del empleado.
|
|
*/
|
|
public function setProyecto($proyecto){
|
|
//Comprobamos permisos:
|
|
$oidP = $this->usuario->getValor("oid");
|
|
if(($oidP != $this->oid) && (!$this->usuario->tieneRol(1)) && (!$this->usuario->tieneRol(4))){
|
|
$error = $this->locale['3002'];
|
|
throw new Exception($error);
|
|
return false;
|
|
exit;
|
|
}else{
|
|
$fecha = $this->anio."-".$this->mes;
|
|
$this->getCliente();
|
|
//Si no había cliente insertamos.
|
|
if(($this->observaciones == null) && ($this->cliente == null) && ($this->proyecto == null)){
|
|
$consulta = "INSERT INTO observaciones (oid, fecha, fecha_mod, persona, proyecto) VALUES ('".$this->oid."', '".$fecha."', curdate(),'".$this->usuario->getValor("nombre")."', '".$proyecto."')";
|
|
$this->proyecto = $proyecto;
|
|
//Si se ha modificado el clientea actualizamos.
|
|
}else if($this->proyecto != $proyecto){
|
|
$consulta = "UPDATE observaciones SET proyecto = '".$proyecto."', fecha_mod = curdate() WHERE persona = '".$this->usuario->getValor("nombre")."' AND fecha = '".$fecha."'";
|
|
$this->proyecto = $proyecto;
|
|
}
|
|
|
|
//Si hay que actualizar, actualizo:
|
|
if($consulta != ""){
|
|
$bd = new BD();
|
|
return $bd->execQuery($consulta);
|
|
}else{
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
function getObservacion(){
|
|
if(($this->observaciones == null) && ($this->cliente == null) && ($this->proyecto == null)){
|
|
$fecha = $this->anio."-".$this->mes;
|
|
$consulta = "SELECT observacion, proyecto, cliente FROM observaciones WHERE oid='".$this->oid."' AND fecha = '".$fecha."'";
|
|
$bd = new BD();
|
|
$campos = $bd->getCampos($consulta);
|
|
if(array_key_exists("observacion", $campos)){
|
|
$this->observaciones = $campos["observacion"][0];
|
|
}
|
|
if(array_key_exists("proyecto", $campos)){
|
|
$this->proyecto = $campos["proyecto"][0];
|
|
}
|
|
if(array_key_exists("cliente", $campos)){
|
|
$this->cliente = $campos["cliente"][0];
|
|
}
|
|
}
|
|
|
|
return $this->observaciones;
|
|
}
|
|
|
|
/**
|
|
* Acceso al cliente del proyecto del empleado.
|
|
*/
|
|
public function getCliente(){
|
|
if(($this->observaciones == null) && ($this->cliente == null) && ($this->proyecto == null)){
|
|
$fecha = $this->anio."-".$this->mes;
|
|
$consulta = "SELECT observacion, proyecto, cliente FROM observaciones WHERE oid='".$this->oid."' AND fecha = '".$fecha."'";
|
|
$bd = new BD();
|
|
$campos = $bd->getCampos($consulta);
|
|
if(array_key_exists("observacion", $campos)){
|
|
$this->observaciones = $campos["observacion"][0];
|
|
}
|
|
if(array_key_exists("proyecto", $campos)){
|
|
$this->proyecto = $campos["proyecto"][0];
|
|
}
|
|
if(array_key_exists("cliente", $campos)){
|
|
$this->cliente = $campos["cliente"][0];
|
|
}
|
|
}
|
|
|
|
return $this->cliente;
|
|
}
|
|
|
|
/**
|
|
* Acceso al cliente del proyecto del empleado.
|
|
*/
|
|
public function getProyecto(){
|
|
if(($this->observaciones == null) && ($this->cliente == null) && ($this->proyecto == null)){
|
|
$fecha = $this->anio."-".$this->mes;
|
|
$consulta = "SELECT observacion, proyecto, cliente FROM observaciones WHERE oid='".$this->oid."' AND fecha = '".$fecha."'";
|
|
$bd = new BD();
|
|
$campos = $bd->getCampos($consulta);
|
|
if(array_key_exists("observacion", $campos)){
|
|
$this->observaciones = $campos["observacion"][0];
|
|
}
|
|
if(array_key_exists("proyecto", $campos)){
|
|
$this->proyecto = $campos["proyecto"][0];
|
|
}
|
|
if(array_key_exists("cliente", $campos)){
|
|
$this->cliente = $campos["cliente"][0];
|
|
}
|
|
}
|
|
|
|
return $this->proyecto;
|
|
|
|
}
|
|
|
|
}
|
|
?>
|