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

960 lines
34 KiB
PHP

<?php
include_once("./functions_calendario.php");
include_once("BD.php");
class Calendario{
private $mes;
private $anio;
private $diasEspeciales;
private $back;
private $locale;
private $usuario;
private $festivosNacional = "";
private $festivosLocales = array();
private $hexadecimales;
private $mesAnt;
private $anioAnt;
private $mesSig;
private $anioSig;
function Calendario($usuario,$mes,$anio,$diasEsp,$back,$locale){
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->diasEspeciales=$diasEsp;
if(strpos($back,"?")>0)
$this->back=$back."&";
else
$this->back=$back."?";
$this->locale=$locale;
$this->usuario=$usuario;
$this->hexadecimales = array();
//calculo el mes y ano del mes anterior
$mes_anterior = $mes - 1;
$ano_anterior = $anio;
if ($mes_anterior==0) {
$ano_anterior--;
$mes_anterior=12;
}
$this->mesAnt=$mes_anterior;
$this->anioAnt=$ano_anterior;
//calculo el mes y ano del mes siguiente
$mes_siguiente = $mes + 1;
$ano_siguiente = $anio;
if ($mes_siguiente==13) {
$ano_siguiente++;
$mes_siguiente=1;
}
$this->mesSig=$mes_siguiente;
$this->anioSig=$ano_siguiente;
}
function getRellenable($parte){
$tabla=$this->htmlCabecera("500");
//Variable para llevar la cuenta del dia actual
$dia_actual = 1;
//calculo el numero del dia de la semana del primer dia
$numero_dia = que_dia_de_semana(1,$this->mes,$this->anio);
//calculo el ltimo dia del mes
$ultimo_dia = verifica_long_mes($this->mes,$this->anio);
/*
* PRIMERA FILA
*/
$semana= "<tr class=dia>";
for ($i=0;$i<7;$i++) {
$horasJob="0";
if(array_key_exists($dia_actual,$parte)){
$horasJob=$parte[$dia_actual];
}
if($horasJob=="P"){
$textoDia="<input readonly name=\"d".$dia_actual."\" type=\"text\" value=\"".$horasJob."\" maxlength=\"4\" style=\"width:30px \">";
} else {
$textoDia="<input name=\"d".$dia_actual."\" type=\"text\" value=\"".$horasJob."\" maxlength=\"4\" style=\"width:30px \">";
}
if ($i < $numero_dia) {
//si el dia de la semana i es menor que el numero del primer dia de la semana no pongo nada en la celda
$dia = "<td class=dia_vacio ></td>";
} else {
$dia="<td";
// Comprobamos si ese dnia es especial
if(array_key_exists($dia_actual,$this->diasEspeciales)){
//Si es dia antes de alta, no poner bgcolor
if($this->diasEspeciales[$dia_actual]!="7")
$dia.=" bgcolor=\"".$this->leyenda($this->diasEspeciales[$dia_actual])."\"";
if(($this->diasEspeciales[$dia_actual]=="3")
|| ($this->diasEspeciales[$dia_actual]=="4")
|| ($this->diasEspeciales[$dia_actual]=="7")
|| ($this->diasEspeciales[$dia_actual]=="5")){
$textoDia="";
}
}
if($this->esFestivo($this->usuario->getValor("localidad_trabajo"),$dia_actual))
$dia.=" bgcolor=\"".$this->leyenda("1")."\"";
$dia.=" align=\"center\" valign=\"top\" style=\"padding:0px; margin:0px\"><div class=\"nombreDia\">".$dia_actual."</div><div <div class=\"textoDia\">".$textoDia."</div></td>";
$dia_actual++;
}
$semana.=$dia;
}
$tabla.=$semana;
/*
* RESTO DE FILAS
*/
$numero_dia = 0;
while ($dia_actual <= $ultimo_dia) {
$horasJob="0";
if(array_key_exists($dia_actual,$parte)){
$horasJob=$parte[$dia_actual];
}
if($horasJob=="P"){
$textoDia="<input readonly name=\"d".$dia_actual."\" type=\"text\" value=\"".$horasJob."\" maxlength=\"4\" style=\"width:30px \">";
} else {
$textoDia="<input name=\"d".$dia_actual."\" type=\"text\" value=\"".$horasJob."\" maxlength=\"4\" style=\"width:30px \">";
}
//si estamos a principio de la semana escribo el <TR>
if ($numero_dia == 0)
$semana="<tr align=center class=dia>";
//si es el ultimo de la semana, me pongo al principio de la semana y escribo el </tr>
$dia="<td ";
// Comprobamos si ese dnia es espedia
if(array_key_exists($dia_actual,$this->diasEspeciales)){
//Si es dia antes de alta, no poner bgcolor
if($this->diasEspeciales[$dia_actual]!="7")
$dia.=" bgcolor=\"".$this->leyenda($this->diasEspeciales[$dia_actual])."\"";
if(($this->diasEspeciales[$dia_actual]=="3")
|| ($this->diasEspeciales[$dia_actual]=="4")
|| ($this->diasEspeciales[$dia_actual]=="7")
|| ($this->diasEspeciales[$dia_actual]=="5")){
$textoDia="";
}
}
if($this->esFestivo($this->usuario->getValor("localidad_trabajo"),$dia_actual))
$dia.=" bgcolor=\"".$this->leyenda("1")."\"";
$dia.=" align=\"center\" valign=\"top\" style=\"padding:0px; margin:0px\"><div class=\"nombreDia\">".$dia_actual."</div><div <div class=\"textoDia\">".$textoDia."</div></td>";
$semana.=$dia;
$dia_actual++;
$numero_dia++;
if ($numero_dia == 7) {
$numero_dia = 0;
$semana.="</tr>";
$tabla.=$semana;
}
}
/*
* FINAL niLTIMA FILA
*/
if($numero_dia>0){
for ($i=$numero_dia;$i<7;$i++) {
$semana.= "<td class=dia_vacio></td>";
}
$tabla.=$semana;
}
$tabla.="</table>";
return $tabla;
}
function getMostrable($parte){
$tabla=$this->htmlCabecera("500");
//Variable para llevar la cuenta del dia actual
$dia_actual = 1;
//calculo el numero del dia de la semana del primer dia
$numero_dia = que_dia_de_semana(1,$this->mes,$this->anio);
//calculo el ltimo dia del mes
$ultimo_dia = verifica_long_mes($this->mes,$this->anio);
//escribo la primera fila de la semana
//<div class="nombreDia">14</div><div align="center"><input name="2008-10-29" type="text" value="0" maxlength="2" style="width:20px "></div>
$semana= "<tr class=dia>";
for ($i=0;$i<7;$i++) {
$horasJob="0";
if(array_key_exists($dia_actual,$parte)){
$horasJob=$parte[$dia_actual];
}
$textoDia=$horasJob;
if ($i < $numero_dia) {
//si el dia de la semana i es menor que el numero del primer dia de la semana no pongo nada en la celda
$dia = "<td class=dia_vacio ></td>";
} else {
$dia="<td";
// Comprobamos si ese dnia es espedia
if(array_key_exists($dia_actual,$this->diasEspeciales)){
//Si es dia antes de alta, no poner bgcolor
if($this->diasEspeciales[$dia_actual]!="7")
$dia.=" bgcolor=\"".$this->leyenda($this->diasEspeciales[$dia_actual])."\"";
if(($this->diasEspeciales[$dia_actual]=="3")
|| ($this->diasEspeciales[$dia_actual]=="4")
|| ($this->diasEspeciales[$dia_actual]=="7")
|| ($this->diasEspeciales[$dia_actual]=="5")){
$textoDia="";
}
}
if($this->esFestivo($this->usuario->getValor("localidad_trabajo"),$dia_actual))
$dia.=" bgcolor=\"".$this->leyenda("1")."\"";
$dia.=" align=\"center\" valign=\"top\" style=\"padding:0px; margin:0px\"><div class=\"nombreDia\">".$dia_actual."</div><div <div class=\"textoDia\">".$textoDia."</div></td>";
$dia_actual++;
}
$semana.=$dia;
}
$tabla.=$semana;
//recorro todos los dems das hasta el final del mes
$numero_dia = 0;
while ($dia_actual <= $ultimo_dia) {
$horasJob="0";
if(array_key_exists($dia_actual,$parte)){
$horasJob=$parte[$dia_actual];
}
$textoDia=$horasJob;
if ($numero_dia == 0)
$semana="<tr align=center class=dia>";
$dia="<td ";
if(array_key_exists($dia_actual,$this->diasEspeciales)){
//Si es dia antes de alta, no poner bgcolor
if($this->diasEspeciales[$dia_actual]!="7")
$dia.=" bgcolor=\"".$this->leyenda($this->diasEspeciales[$dia_actual])."\"";
if(($this->diasEspeciales[$dia_actual]=="3")
|| ($this->diasEspeciales[$dia_actual]=="4")
|| ($this->diasEspeciales[$dia_actual]=="7")
|| ($this->diasEspeciales[$dia_actual]=="5")){
$textoDia="";
}
}
if($this->esFestivo($this->usuario->getValor("localidad_trabajo"),$dia_actual))
$dia.=" bgcolor=\"".$this->leyenda("1")."\"";
$dia.=" align=\"center\" valign=\"top\" style=\"padding:0px; margin:0px\"><div class=\"nombreDia\">".$dia_actual."</div><div <div class=\"textoDia\">".$textoDia."</div></td>";
$semana.=$dia;
$dia_actual++;
$numero_dia++;
if ($numero_dia == 7) {
$numero_dia = 0;
$semana.="</tr>";
$tabla.=$semana;
}
}
//Comprobando terminar el calendario del mes
if($numero_dia>0){
for ($i=$numero_dia;$i<7;$i++) {
$semana.= "<td class=dia_vacio></td>";
}
$tabla.=$semana;
}
$tabla.="</table>";
return $tabla;
}
function getSoliVacaciones($mes){
$tabla=$this->htmlCabecera("500");
//Variable para llevar la cuenta del dia actual
$dia_actual = 1;
//calculo el numero del dia de la semana del primer dia
$numero_dia = que_dia_de_semana(1,$this->mes,$this->anio);
//calculo el ltimo dia del mes
$ultimo_dia = verifica_long_mes($this->mes,$this->anio);
//escribo la primera fila de la semana
$semana= "<tr class=dia>";
for ($i=0;$i<7;$i++) {
// Comprobamos si ese dnia es puede marcar
if($this->puedeSolicitarVacaciones($dia_actual))
$textoDia="<input type=\"checkbox\" name=\"d".$dia_actual."-".$mes."\" value=\"on\">";
elseif ($this->puedeSolicitarAnulacionVacaciones($dia_actual)) {
// Puedo pedir anulacinin
$textoDia="<input type=\"checkbox\" name=\"a".$dia_actual."-".$mes."\" value=\"on\">";
} elseif ($this->puedeSolicitarAnulacionSolicitud($dia_actual)) {
$textoDia="<input type=\"checkbox\" name=\"e".$dia_actual."-".$mes."\" value=\"on\">";
} else{
$textoDia="";
}
if ($i < $numero_dia) {
//si el dia de la semana i es menor que el numero del primer dia de la semana no pongo nada en la celda
$dia = "<td class=dia_vacio ></td>";
} else {
$dia="<td";
// Comprobamos si ese dnia es especial
if(array_key_exists($dia_actual,$this->diasEspeciales)){
//Si es dia antes de alta, no poner bgcolor
if($this->diasEspeciales[$dia_actual]!="7")
$dia.=" bgcolor=\"".$this->leyenda($this->diasEspeciales[$dia_actual])."\"";
}
if($this->esFestivo($this->usuario->getValor("localidad_trabajo"),$dia_actual))
$dia.=" bgcolor=\"".$this->leyenda("1")."\"";
$dia.=" align=\"center\" valign=\"top\" style=\"padding:0px; margin:0px\"><div class=\"nombreDia\">".$dia_actual."</div><div <div class=\"textoDia\">".$textoDia."</div></td>";
$dia_actual++;
}
$semana.=$dia;
}
$tabla.=$semana;
//recorro todos los dems das hasta el final del mes
$numero_dia = 0;
while ($dia_actual <= $ultimo_dia) {
// Comprobamos si ese dnia es puede marcar
if($this->puedeSolicitarVacaciones($dia_actual))
$textoDia="<input type=\"checkbox\" name=\"d".$dia_actual."-".$mes."\" value=\"on\">";
elseif ($this->puedeSolicitarAnulacionVacaciones($dia_actual)) {
// Puedo pedir anulacinin
$textoDia="<input type=\"checkbox\" name=\"a".$dia_actual."-".$mes."\" value=\"on\">";
} elseif ($this->puedeSolicitarAnulacionSolicitud($dia_actual)) {
$textoDia="<input type=\"checkbox\" name=\"e".$dia_actual."-".$mes."\" value=\"on\">";
}else {
$textoDia="";
}
if ($numero_dia == 0)
$semana="<tr align=center class=dia>";
$dia="<td ";
if(array_key_exists($dia_actual,$this->diasEspeciales)){
//Si es dia antes de alta, no poner bgcolor
if($this->diasEspeciales[$dia_actual]!="7")
$dia.=" bgcolor=\"".$this->leyenda($this->diasEspeciales[$dia_actual])."\"";
}
if($this->esFestivo($this->usuario->getValor("localidad_trabajo"),$dia_actual))
$dia.=" bgcolor=\"".$this->leyenda("1")."\"";
$dia.=" align=\"center\" valign=\"top\" style=\"padding:0px; margin:0px\"><div class=\"nombreDia\">".$dia_actual."</div><div <div class=\"textoDia\">".$textoDia."</div></td>";
$semana.=$dia;
$dia_actual++;
$numero_dia++;
if ($numero_dia == 7) {
$numero_dia = 0;
$semana.="</tr>";
$tabla.=$semana;
}
}
//Comprobando terminar el calendario del mes
if($numero_dia>0){
for ($i=$numero_dia;$i<7;$i++) {
$semana.= "<td class=dia_vacio></td>";
}
$tabla.=$semana;
}
$tabla.="</table>";
return $tabla;
}
function getMiniAgenda($diaVer){
$tabla=$this->htmlCabeceraMini($diaVer);
//Variable para llevar la cuenta del dia actual
$dia_actual = 1;
//calculo el numero del dia de la semana del primer dia
$numero_dia = que_dia_de_semana(1,$this->mes,$this->anio);
//calculo el ltimo dia del mes
$ultimo_dia = verifica_long_mes($this->mes,$this->anio);
//escribo la primera fila de la semana
$semana= "<tr class=\"semana\">";
for ($i=0;$i<7;$i++) {
$diaVista=mktime(0,0,0,$this->mes,$dia_actual,$this->anio);
// Comprobamos si ese dnia es puede marcar
if ($i < $numero_dia) {
//si el dia de la semana i es menor que el numero del primer dia de la semana no pongo nada en la celda
$dia = "<td class=\"vacio\"></td>";
} else {
$dia="<td";
// Comprobamos si ese dnia es el que estamos viendo
if (($this->anio==date("Y",$diaVer)) && ($this->mes==date("m",$diaVer)) && ($dia_actual==date("j",$diaVer))) {
// Es el dnia que estamos viendo
$dia.=" class=\"vista\" ";
} elseif (($this->anio==date("Y")) && ($this->mes==date("m")) && ($dia_actual==date("j"))) {
// Es hoy
$dia.=" class=\"hoy\" ";
}elseif ($this->esFestivo($this->usuario->getValor("localidad_trabajo"),$dia_actual)) {
// Es finde
$dia.=" bgcolor=\"".$this->leyenda("1")."\"";
}
$dia.=" align=\"center\" valign=\"top\"><a href=\"agenda.php?dia=".$dia_actual."&mes=".$this->mes."&anio=".$this->anio."\"><span style=\"color:#000000;\">".$dia_actual."</span></a></td>";
$dia_actual++;
}
$semana.=$dia;
}
$tabla.=$semana;
//recorro todos los dems das hasta el final del mes
$numero_dia = 0;
while ($dia_actual <= $ultimo_dia) {
$diaVista=mktime(0,0,0,$this->mes,$dia_actual,$this->anio);
if ($numero_dia == 0)
$semana="<tr class=\"semana\">";
$dia="<td";
// Comprobamos si ese dnia es el que estamos viendo
if (($this->anio==date("Y",$diaVer)) && ($this->mes==date("m",$diaVer)) && ($dia_actual==date("j",$diaVer))) {
// Es el dnia que estamos viendo
$dia.=" class=\"vista\" ";
} elseif (($this->anio==date("Y")) && ($this->mes==date("m")) && ($dia_actual==date("j"))) {
// Es hoy
$dia.=" class=\"hoy\" ";
}elseif ($this->esFestivo($this->usuario->getValor("localidad_trabajo"),$dia_actual)) {
// Es finde
$dia.=" bgcolor=\"".$this->leyenda("1")."\"";
}
$dia.=" align=\"center\" valign=\"top\"><a href=\"agenda.php?dia=".$dia_actual."&mes=".$this->mes."&anio=".$this->anio."\"><span style=\"color:#000000;\">".$dia_actual."</span></a></td>";
$semana.=$dia;
$dia_actual++;
$numero_dia++;
if ($numero_dia == 7) {
$numero_dia = 0;
$semana.="</tr>";
$tabla.=$semana;
}
}
//Comprobando terminar el calendario del mes
if($numero_dia>0){
for ($i=$numero_dia;$i<7;$i++) {
$semana.= "<td class=dia_vacio></td>";
}
$tabla.=$semana;
}
$tabla.="</table>";
return $tabla;
}
private function htmlCabeceraMini($diaVer){
$nombre_mes = nombre_mes($this->mes);
$tabla="<table width=\"200px\" border=\"1\" cellpadding=\"1\" cellspacing=\"0\" class=\"miniCalendario\">";
// Flechas y nombre del mes
$fila= "<tr>";
if($this->back!="?")
$fila.="<th><a href=\"".$this->back."mesCal=".$this->mesAnt."&anioCal=".$this->anioAnt."&dia=".date("j",$diaVer)."&mes=".date("m",$diaVer)."&anio=".date("Y",$diaVer)."\"><img src=\"css/flecha_menos.gif\" /></a></th>";
else
$fila.="<th></th>";
$fila.="<th colspan=\"5\"><div align=\"center\">".$nombre_mes." de ".$this->anio."</div></th>";
if($this->back!="?")
$fila.="<th align=\"right\"><a href=\"".$this->back."mesCal=".$this->mesSig."&anioCal=".$this->anioSig."&dia=".date("j",$diaVer)."&mes=".date("m",$diaVer)."&anio=".date("Y",$diaVer)."\"><img src=\"css/flecha_mas.gif\" /></a></th>";
else
$fila.="<th></th>";
$fila.="</tr>";
$tabla.=$fila;
// Nombre de los dnias de la semana
$diasSemana= "<tr class=\"nombreSemana\">" .
" <td align=center width=\"14%\">L</td>" .
" <td align=center width=\"14%\">M</td>" .
" <td align=center width=\"14%\">X</td>" .
" <td align=center width=\"14%\">J</td>" .
" <td align=center width=\"14%\">V</td>" .
" <td align=center width=\"14%\">S</td>" .
" <td align=center width=\"14%\">D</td>" .
"</tr>";
$tabla.=$diasSemana;
return $tabla;
}
private function htmlCabecera($tamano){
$nombre_mes = nombre_mes($this->mes);
if($tamano=="200")
$classe="class=\"miniCalendario\"";
else
$classe="";
$tabla="<table width=\"".$tamano."px\" border=\"1\" cellpadding=\"1\" cellspacing=\"0\" ".$classe.">";
// Flechas y nombre del mes
$fila= "<tr class=\"encabezado\">";
if($this->back!="?")
$fila.="<td><a href=\"".$this->back."mes=".$this->mesAnt."&anio=".$this->anioAnt."\"><img src=\"css/flecha_menos.gif\" /></a></td>";
else
$fila.="<td></td>";
$fila.="<td colspan=\"5\"><div align=\"center\">".$nombre_mes." de ".$this->anio."</div></td>";
if($this->back!="?")
$fila.="<td align=\"right\"><a href=\"".$this->back."mes=".$this->mesSig."&anio=".$this->anioSig."\"><img src=\"css/flecha_mas.gif\" /></a></td>";
else
$fila.="<td></td>";
$fila.="</tr>";
$tabla.=$fila;
// Nombre de los dnias de la semana
$diasSemana= "<tr class=fondo>" .
" <td align=center width=\"14%\"> ".$this->locale['050']."</td>" .
" <td align=center width=\"14%\">".$this->locale['051']."</td>" .
" <td align=center width=\"14%\">".$this->locale['052']."</td>" .
" <td align=center width=\"14%\">".$this->locale['053']."</td>" .
" <td align=center width=\"14%\">".$this->locale['054']."</td>" .
" <td align=center width=\"14%\">".$this->locale['055']."</td>" .
" <td align=center width=\"14%\">".$this->locale['056']."</td>" .
"</tr>";
$tabla.=$diasSemana;
return $tabla;
}
function puedeSolicitarVacaciones($dia){
// Comprobamos que el dnia sea posteior a dos desde hoy
$diaComprobar = mktime(0,0,0,$this->mes,$dia,$this->anio);
$frontera=mktime (0,0,0,date("m"),date("d")+2,date("Y"));
if($frontera<$diaComprobar){
// Comprobamso que no sea fin de semana
if(!($this->esFestivo($this->usuario->getValor("localidad_trabajo"),date("j",$diaComprobar)))){
//Si se solicita para este anio o para el prniximo dentro del plazo, todo ok:
if(($this->anio == date("Y")) || (($this->anio == date("Y") + 1) && (fecha_valida(date("Y")."-12-15") <= 0))){
if(array_key_exists($dia,$this->diasEspeciales)){
if($this->diasEspeciales[$dia]=="2"){
return true;
} else {
return false;
}
} else
return true;
}else
return false;
}else
return false;
} else
return false;
}
function puedeSolicitarAnulacionVacaciones($dia){
// Comprobamos que el dnia sea posteior a dos desde hoy
$diaComprobar = mktime(0,0,0,$this->mes,$dia,$this->anio);
$frontera=mktime (0,0,0,date("m"),date("d")+2,date("Y"));
if($frontera<$diaComprobar){
// Comprobamso que no sea fin de semana
if(!($this->esFestivo($this->usuario->getValor("localidad_trabajo"),date("j",$diaComprobar)))){
//Si se solicita para este anio o para el prniximo dentro del plazo, todo ok:
if(($this->anio == date("Y")) || (($this->anio == date("Y") + 1) && (fecha_valida(date("Y")."-12-15") <= 0))){
if(array_key_exists($dia,$this->diasEspeciales)){
if($this->diasEspeciales[$dia]=="5"){
return true;
} else {
return false;
}
} else
return false;
}else
return false;
}else
return false;
} else
return false;
}
function puedeSolicitarAnulacionSolicitud($dia){
// Comprobamos que el dnia sea posteior a 15 desde hoy
$diaComprobar = mktime(0,0,0,$this->mes,$dia,$this->anio);
$frontera=mktime (0,0,0,date("m"),date("d")+15,date("Y"));
if($frontera<$diaComprobar){
// Comprobamos que no sea fin de semana
if(!($this->esFestivo($this->usuario->getValor("localidad_trabajo"),date("j",$diaComprobar)))){
//Si se solicita para este anio o para el prniximo dentro del plazo, todo ok:
if(($this->anio == date("Y")) || (($this->anio == date("Y") + 1) && (fecha_valida(date("Y")."-12-15") <= 0))){
if(array_key_exists($dia,$this->diasEspeciales)){
if($this->diasEspeciales[$dia]=="3"){
return true;
} else {
return false;
}
} else
return false;
}else
return false;
}else
return false;
} else
return false;
}
/**
* Asigna los festivos nacionales.
* @param $dias - Array con los festivos nacionales.
* @throws Lanza varias excepciones para casos no permitidos o de error.
*/
public function setFestivosNacional($dias){
if($this->usuario->tieneRol(4)){
$this->getFestivosNacional();
//Inserto los nuevos:
foreach($dias as $dia){
//Si no estni, lo inserto.
if(!in_array($dia, $this->festivosNacional)){
$this->addFestivoNacional($dia);
}
}
//Borro los que ya no estnin:
$this->festivosNacional = $this->quitaCeros($this->festivosNacional);
$viejos = array_diff($this->festivosNacional, $dias);
if(count($viejos) > 0){
$consulta = "DELETE FROM festivos_nacional WHERE id IN (";
foreach($viejos as $viejo){
$fecha = $this->anio."-".$this->mes."-".$viejo;
$consulta .= "'".$fecha."',";
}
//Quitamos la niltima coma
if ($consulta{strlen($consulta) - 1} == ",")
$consulta = substr($consulta,0,strlen($consulta) - 1);
$consulta .= ")";
$bd = new BD();
if($bd->execQuery($consulta)){
$this->festivosNacional = $dias;
}else{
$error = $this->locale['bd'];
throw new Exception($error);
return false;
exit;
}
}
}else{
$error = $this->locale['4043'];
throw new Exception($error);
return false;
exit;
}
return true;
}
/**
* Aniade un festivo nacional.
* @param $dia - dnia a asignar
* @return true si se asignni correctamente y false en caso contrario.
* @throws Lanza excepcinin si el usuario no tiene permisos o el dnia no es vnilido.
*/
private function addFestivoNacional($dia){
if($this->usuario->tieneRol(4)){
if(($dia > 0) && ($dia <= 31)){
if($dia < 10){
$dia = $dia * 1;
$dia = "0".$dia;
}
$fecha = $this->anio."-".$this->mes."-".$dia;
$consulta = "INSERT INTO festivos_nacional VALUES ('".$fecha."')";
$bd = new BD();
if($bd->execQuery($consulta)){
$this->festivosNacional[] = $dia;
}else{
$error = $this->locale['bd'];
throw new Exception($error);
return false;
exit;
}
}else{
$error = $this->locale['4044'];
throw new Exception($error);
return false;
exit;
}
}else{
$error = $this->locale['4043'];
throw new Exception($error);
return false;
exit;
}
return true;
}
/*
* Asigna los festivos locales.
* @param $dias - Array con los festivos locales.
* @param $localidad - Localidad donde asignar los festivos.
* @throws Lanza varias excepciones para casos no permitidos o de error.
*/
public function setFestivosLocal($dias, $localidad){
if($this->usuario->tieneRol(4)){
$actuales = $this->getFestivosLocal($localidad);
//Inserto los nuevos:
foreach($dias as $dia){
//Si no estni, lo inserto.
if(!in_array($dia, $actuales)){
$this->addFestivoLocal($dia, $localidad);
}
}
//Borro los que ya no estnin:
$actuales = $this->quitaCeros($actuales);
$viejos = array_diff($actuales, $dias);
/*echo "<br>Actualmente hay:<br>";
print_r($actuales);
echo "<br>Y tengo que dejar:<br>";
print_r($dias);
echo "<br>Con lo cual elimino:<br>";
print_r($viejos);*/
if(count($viejos) > 0){
$consulta = "DELETE FROM festivos_local WHERE localidad = '".$localidad."' AND fecha IN (";
foreach($viejos as $viejo){
$fecha = $this->anio."-".$this->mes."-".$viejo;
$consulta .= "'".$fecha."',";
}
//Quitamos la niltima coma
if ($consulta{strlen($consulta) - 1} == ",")
$consulta = substr($consulta,0,strlen($consulta) - 1);
$consulta .= ")";
$bd = new BD();
if(!$bd->execQuery($consulta)){
$error = $this->locale['bd'];
throw new Exception($error);
return false;
exit;
}
}
}else{
$error = $this->locale['4043'];
throw new Exception($error);
return false;
exit;
}
return true;
}
/**
* Aniade un festivo local.
* @param $dia - dnia a asignar
* @param $localidad - localidad a la que asignar el dnia festivo.
* @return true si se asignni correctamente y false en caso contrario.
* @throws Lanza excepcinin si el usuario no tiene permisos o el dnia no es vnilido.
*/
private function addFestivoLocal($dia, $localidad){
if($this->usuario->tieneRol(4)){
if(($dia > 0) && ($dia <= 31)){
if($dia < 10){
$dia = $dia * 1;
$dia = "0".$dia;
}
$fecha = $this->anio."-".$this->mes."-".$dia;
$consulta = "INSERT INTO festivos_local (localidad, fecha) VALUES ('".$localidad."', '".$fecha."')";
$bd = new BD();
if(!$bd->execQuery($consulta)){
$error = $this->locale['bd'];
throw new Exception($error);
return false;
exit;
}
}else{
$error = $this->locale['4044'];
throw new Exception($error);
return false;
exit;
}
}else{
$error = $this->locale['4043'];
throw new Exception($error);
return false;
exit;
}
return true;
}
function getFestivosNacional(){
if($this->festivosNacional == ""){
$this->festivosNacional = array();
$fecha = $this->anio."-".$this->mes;
$consulta = "SELECT id FROM festivos_nacional WHERE id LIKE '".$fecha."-%'";
$bd = new BD();
$array = $bd->arrayQuery($consulta, "id");
foreach($array as $elem){
$dia = explode("-", $elem);
$this->festivosNacional[] = $dia[2]+0;
}
}
return $this->festivosNacional;
}
function getFestivosLocal($localidad){
if(!array_key_exists($localidad, $this->festivosLocales)){
$dias = array();
$fecha = $this->anio."-".$this->mes;
$consulta = "SELECT fecha FROM festivos_local WHERE fecha LIKE '".$fecha."-%' AND localidad = '".$localidad."'";
$bd = new BD();
$array = $bd->arrayQuery($consulta, "fecha");
foreach($array as $elem){
$dia = explode("-", $elem);
$dias[] = $dia[2];
}
$this->festivosLocales[$localidad] = $dias;
}
return $this->festivosLocales[$localidad];
}
function esFestivo($localidad, $dia){
$nacional = $this->esFestivoNacional($dia);
/*$local = $this->esFestivoLocal($localidad, $dia);
$finde = $this->esFinde($dia);*/
$local = false;
$finde = false;
if(!$nacional && $localidad != ""){
$local = $this->esFestivoLocal($localidad, $dia);
if(!$local){
$finde = $this->esFinde($dia);
}
}else{
$finde = $this->esFinde($dia);
}
if($nacional || $local || $finde){
return true;
}else{
return false;
}
}
function esFestivoNacional($dia){
$festivos = $this->getFestivosNacional();
return in_array($dia, $festivos);
}
function esFestivoLocal($localidad, $dia){
$festivos = $this->getFestivosLocal($localidad);
return in_array($dia, $festivos);
}
private function esFinde($dia){
$d = date('N', mktime(0,0,0,$this->mes,$dia,$this->anio));
if(($d != 6) && ($d != 7)){
return false;
}else{
return true;
}
}
function leyenda($cod){
if(!array_key_exists($cod, $this->hexadecimales)){
$consulta="SELECT hexadecimal FROM leyenda WHERE cod='".$cod."'";
$bd=new BD();
$valor= $bd->getCampo($consulta);
$this->hexadecimales[$cod] = $valor;
}
return $this->hexadecimales[$cod];
}
/**
* Muestra un calendario configurable, mostrando los festivos nacionales y locales
* del usuario.
* Si el dnia estni dentro del array $diasEsp, se muestra el texto que hay, sino se deja en blanco
*
* @param $diasEsp : Array con los dnias, de la forma array("1" => array("color" => "codigo color","texto" => "texto interior"))
* @param $tipo (g|p) : g = Grande | p = Pequenio
*/
function getCalendar($diasEsp,$tipo){
switch ($tipo) {
case "p": // Pequenio
$tabla = $this->htmlCabecera("200");
break;
case "g": // Grande
$tabla = $this->htmlCabecera("500");
break;
default: // Otro valor = grande
$tabla = $this->htmlCabecera("500");
break;
}
// Variable para llevar la cuenta del dia actual
$dia_actual = 1;
//calculo el numero del dia de la semana del primer dia
$numero_dia = que_dia_de_semana(1,$this->mes,$this->anio);
//calculo el ltimo dia del mes
$ultimo_dia = verifica_long_mes($this->mes,$this->anio);
/*
* PRIMERA FILA
*/
$semana= "<tr class=dia>";
for ($i=0;$i<7;$i++) {
if ($i < $numero_dia) {
//si el dia de la semana i es menor que el numero del primer dia de la semana no pongo nada en la celda
$dia = "<td class=dia_vacio ></td>";
} else {
$texto="";
$bgcolor="";
if(array_key_exists($dia_actual,$diasEsp)){
$texto=$diasEsp[$dia_actual]["texto"];
if($diasEsp[$dia_actual]["color"]!="")
$bgcolor=" bgcolor=\"".$diasEsp[$dia_actual]["color"]."\"";
}
$dia="<td";
// Comprobamos si ese dnia es festivo
if($this->esFestivo($this->usuario->getValor("localidad_trabajo"),$dia_actual))
$bgcolor.=" bgcolor=\"".$this->leyenda("1")."\"";
$dia.=$bgcolor;
$dia.=" align=\"center\" valign=\"top\" style=\"padding:0px; margin:0px\"><div class=\"nombreDia\">".$dia_actual."</div><div <div class=\"textoDia\">".$texto."</div></td>";
$dia_actual++;
}
$semana.=$dia;
}
$tabla.=$semana;
/*
* RESTO DE FILAS
*/
$numero_dia = 0;
while ($dia_actual <= $ultimo_dia) {
$texto="";
$bgcolor="";
//si estamos a principio de la semana escribo el <TR>
if ($numero_dia == 0)
$semana="<tr align=center class=dia>";
//si es el ultimo de la semana, me pongo al principio de la semana y escribo el </tr>
$dia="<td ";
// Comprobamos si ese dnia es espedia
if(array_key_exists($dia_actual,$diasEsp)){
$texto=$diasEsp[$dia_actual]["texto"];
if($diasEsp[$dia_actual]["color"]!="")
$bgcolor=" bgcolor=\"".$diasEsp[$dia_actual]["color"]."\"";
}
// Comprobamos si ese dnia es festivo
if($this->esFestivo($this->usuario->getValor("localidad_trabajo"),$dia_actual))
$bgcolor.=" bgcolor=\"".$this->leyenda("1")."\"";
$dia.=$bgcolor;
$dia.=" align=\"center\" valign=\"top\" style=\"padding:0px; margin:0px\"><div class=\"nombreDia\">".$dia_actual."</div><div <div class=\"textoDia\">".$texto."</div></td>";
$semana.=$dia;
$dia_actual++;
$numero_dia++;
if ($numero_dia == 7) {
$numero_dia = 0;
$semana.="</tr>";
$tabla.=$semana;
}
}
/*
* FINAL niLTIMA FILA
*/
if($numero_dia>0){
for ($i=$numero_dia;$i<7;$i++) {
$semana.= "<td class=dia_vacio></td>";
}
$tabla.=$semana;
}
$tabla.="</table>";
return $tabla;
}
private function quitaCeros($array){
$res = array();
foreach($array as $elem){
$res[] = $elem + 0;
}
return $res;
}
}
?>