Incam_Intranet/Objects/ParteActividad.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;
}
}
?>