tieneAcceso() ){ echo "Error! No tienes permisos para realizar esta acción."; exit(); }else if(!isset($_POST["perfiles"])){ echo "Error! No se recibió la información de los perfiles."; exit(); } $perfiles = trim(filter_input(INPUT_POST, "perfiles", FILTER_SANITIZE_STRING,array('flags' => FILTER_FLAG_STRIP_LOW)));//limpia texto $eventos_list = array();//eventos con todas las fechas para pintarse. Arreglo de Objeto evento $error = false; // Obtiene fecha máxima y min $stmt = $pdo->prepare('Select * from fs_fechaimportante(:periodo, 3)');//periodo $stmt->bindParam(":periodo", $_SESSION["periodo_id"]); if(!$stmt->execute()){ $errorDesc = "Ocurrió un error al cargar las fechas del periodo."; }else{ $fecha_rs = $stmt->fetch(); $fecha_min = date('Y-m-d', strtotime($fecha_rs["FechaImportante_inicial"].' - 1 month ')); $fecha_max = date('Y-m-d', strtotime($fecha_rs["FechaImportante_final"].' + 1 month ')); } $stmt->closeCursor(); $stmt = null; //------------------------- //Obtiene fechas de periodo $stmt = $pdo->prepare('Select * from fs_periodo(:periodo, NULL, NULL, true)'); $stmt->bindParam(":periodo", $_SESSION["periodo_id"]); if(!$stmt->execute()){ //print_r($stmt->errorInfo()); echo "Ocurrió un error al cargar los datos del periodo."; exit(); }else{ $periodo_rs = $stmt->fetch(); } $stmt->closeCursor(); $mes=date("m", strtotime($periodo_rs["Periodo_fecha_inicial"])); $anho=date("Y", strtotime($periodo_rs["Periodo_fecha_inicial"])); $eventoObj = new Evento(-2, "Inicio de cursos","",0, "Fechas importantes", PERIODO_COLOR, $_SESSION["periodo_id"], $periodo_rs["Periodo_fecha_inicial"], true,"","", false); $eventoObj->addFecha($periodo_rs["Periodo_fecha_inicial"]); $eventos_list = array_merge($eventos_list, $eventoObj->getEventList_All($periodo_rs["Periodo_fecha_inicial"], $periodo_rs["Periodo_fecha_final"])); $eventoObj = new Evento(-1, "Fin de cursos","",0, "Fechas importantes", PERIODO_COLOR, $_SESSION["periodo_id"], $periodo_rs["Periodo_fecha_final"], true,"","", false); $eventoObj->addFecha($periodo_rs["Periodo_fecha_final"]); $eventos_list = array_merge($eventos_list, $eventoObj->getEventList_All($periodo_rs["Periodo_fecha_inicial"], $periodo_rs["Periodo_fecha_final"])); $stmt = $pdo->prepare('Select * from fs_fechaimportante(:periodo, 2)');//extras $stmt->bindParam(":periodo", $_SESSION["periodo_id"]); if(!$stmt->execute()){ echo "Ocurrió un error al cargar las fechas del periodo."; exit(); }else{ $fecha_rs = $stmt->fetch(); if(is_array($fecha_rs) && count($fecha_rs) > 0){ $eventoObj = new Evento(0, "Exámenes Extraordinarios", "",0, "Fechas importantes", EXTRAS_COLOR, $_SESSION["periodo_id"], $fecha_rs["FechaImportante_inicial"], true,"","", false); $fecha = $fecha_rs["FechaImportante_inicial"]; $diasArr = array(1,2,3,4,5); while (strtotime($fecha) <= strtotime($fecha_rs["FechaImportante_final"])) { if(in_array(date("w", strtotime($fecha)), $diasArr) ){//si es el día que quiero $eventoObj->addFecha($fecha); } $fecha = date ("Y-m-d", strtotime("+1 day", strtotime($fecha))); } $eventos_list = array_merge($eventos_list, $eventoObj->getEventList_All($fecha_min, $fecha_max)); } } $stmt->closeCursor(); $stmt = null; //------------------------- //--Obtiene todos los eventos dentro del rango del periodo para los perfiles indicados $stmt = $pdo->prepare('Select * from fs_calendarioevento(:per, :fecha_i, :fecha_f, :perf, false)'); $stmt->bindParam(":per", $_SESSION["periodo_id"]); $stmt->bindParam(":fecha_i", $fecha_min); $stmt->bindParam(":fecha_f", $fecha_max); $stmt->bindParam(":perf", $perfiles); unset($perfiles); if(!$stmt->execute()){ $t = $stmt->errorInfo(); echo "Ocurrió un error al obtener los eventos.".$t[2]; exit(); } $eventos_rs = $stmt->fetchAll(); $stmt->closeCursor(); //Recorre eventos foreach($eventos_rs as $evento){ $eventoObj = new Evento($evento["CalendarioEvento_id"], $evento["CalendarioEvento_titulo"],$evento["CalendarioEvento_desc"],$evento["CalendarioCategoria_id"], $evento["CalendarioCategoria_desc"], $evento["CalendarioCategoria_color"], $evento["Periodo_id"] ,$evento["CalendarioEvento_fecha"], $evento["CalendarioEvento_todo_dia"], $evento["CalendarioEvento_hora_inicial"],$evento["CalendarioEvento_hora_final"]); $stmt = $pdo->prepare('Select * from fs_calendarioevento_perfil(:id)'); $stmt->bindParam(":id", $evento["CalendarioEvento_id"]); if($stmt->execute()){ $perf_rs = $stmt->fetchAll(); $stmt->closeCursor(); foreach($perf_rs as $perf){ $eventoObj->addPerfil($perf); } }else{ echo "Error al obtener perfiles."; exit(); } //-- Calcular posibles fechas e insertar fechas en objeto -- $fecha = fechaGuion($evento["CalendarioEvento_fecha"]); switch($evento["CalendarioRepeticion_id"]){ case 1: //diario while (strtotime($fecha) <= strtotime($evento["CalendarioReglas_fecha_final"])) { $eventoObj->addFecha($fecha); $fecha = date ("Y-m-d", strtotime("+1 day", strtotime($fecha))); } break; case 2: //semanal $diasArr = explode(",", $evento["CalendarioReglas_dias_str"]); while (strtotime($fecha) <= strtotime($evento["CalendarioReglas_fecha_final"])) { if(in_array(date("w", strtotime($fecha)), $diasArr) ){//si es el día que quiero $eventoObj->addFecha($fecha); } $fecha = date ("Y-m-d", strtotime("+1 day", strtotime($fecha))); } break; case 3://mensual $diasArr = explode(",", $evento["CalendarioReglas_dias_str"]); //reglas $weekTxt = array(1=>"first", 2=>"second", 3=>"third", 4=>"fourth", -1=>"last"); $dayname = array("sun", "mon", "tue", "wed", "thu", "fri", "sat"); $fecha = date ("Y-m-01", strtotime($fecha));//empieza a revisar en el primer día del mes $semana = $evento["CalendarioReglas_semana"]; while (strtotime($fecha) <= strtotime($evento["CalendarioReglas_fecha_final"])) { foreach($diasArr as $d){ //echo "-->". intval(date("w", strtotime($fecha)))." == ". intval($d)."[".$fecha."]"; if($semana == 1 && intval(date("w", strtotime($fecha))) == intval($d) ){//si el día actual es el que quiero lo guarda $eventoObj->addFecha($fecha); }else{//si no calcula siguiente día if(intval(date("w", strtotime($fecha))) == intval($d)){ $fechaTmp = date ("Y-m-d", strtotime($weekTxt[$semana-1]." ".$dayname[$d], strtotime($fecha))); }else{ $fechaTmp = date ("Y-m-d", strtotime($weekTxt[$semana]." ".$dayname[$d], strtotime($fecha))); } $eventoObj->addFecha($fechaTmp); } } $fecha = date ("Y-m-01", strtotime("+1 month", strtotime($fecha)));//siguiente mes primer día } break; default: //no se repite $eventoObj->addFecha($fecha); } //Obtiene eventos modificados (fechas que cambiaron) $stmt = $pdo->prepare('Select * from fs_calendarioeventoeditado(:id)'); $stmt->bindParam(":id", $eventoObj->id_db); if(!$stmt->execute()){ $t = $stmt->errorInfo(); echo "Ocurrió un error al obtener las fechas editadas.".$t[2]; exit(); } if(!$error){ //modifica fechas $eventosEditados_rs = $stmt->fetchAll(); $stmt->closeCursor(); foreach($eventosEditados_rs as $modif){ $eventoObj->replaceFecha($modif["CalendarioEventoEditado_fecha_origen"], $modif["CalendarioEventoEditado_fecha_nueva"], $modif["CalendarioEventoEditado_hora_inicial"], $modif["CalendarioEventoEditado_hora_final"]); } //Quitar fechas de excepción foreach(explode(",", $evento["CalendarioEvento_excepcion_str"]) as $ex){ $eventoObj->removeFecha($ex); } //Descompone el objeto en un arreglo con todas las fechas y agrega a lista al total del calendario $eventos_list = array_merge($eventos_list, $eventoObj->getEventList_All($fecha_min, $fecha_max)); } }//foreach //--Llena arreglo con los meses del periodo $eventos_display = array();//arreglo que imprime los eventos $mes= intval(date("m", strtotime($fecha_min))); $anho= intval(date("Y", strtotime($fecha_min))); $mesFin= intval(date("m", strtotime($fecha_max))); $anhoFin= intval(date("Y", strtotime($fecha_max))); while( intval($anho*100+$mes) <= intval($anhoFin*100+$mesFin) ){ $eventos_display[] = array("mes"=>$mes, "anho"=>$anho, "eventos"=>array()); $mes++; if($mes > 12){ $mes = 1; $anho++; } } //----- $ids = array(); foreach($eventos_list as $evento){ $ids[] = $evento["id_db"]; $mes_new = date("n", strtotime(fechaGuion($evento["fecha"]))); $hora = $evento["todo_dia"] ? "Todo el día": $evento["hora_ini"]." hrs"; $evento_mes = array("id_db"=>$evento["id_db"], "fecha"=> $evento["fecha"], "dia"=> date("j", strtotime(fechaGuion($evento["fecha"]))), "hora"=> $hora, "titulo"=>$evento["titulo"], "color"=>$evento["color"]); insertaEvento($eventos_display, $mes_new, $evento_mes); } $ids = array_unique($ids); sort($ids); //-- PDF -------- $mpdf = new \Mpdf\Mpdf([ 'mode' => 'utf-8', 'format' => [215, 279], 'orientation' => 'P', 'margin_left' => 14, 'margin_right' => 14, 'margin_top' => 7, 'margin_bottom' => 7, ]); //$mpdf->SetDisplayMode('fullpage'); $stylesheet = ""; //echo $stylesheet; $xtpl = new XTemplate('../tpl/calendario.tpl.html'); $xtpl->assign("PERIODO", $periodo_rs["Periodo_desc"]); for($j=0; $j<7; $j++){ $dia = strtoupper(diaNombre($j)); $xtpl->assign("DIA", $dia[0]); $xtpl->parse("main.dia"); } $ico = 0; foreach($eventos_display as $mes){ usort($mes["eventos"], "ordenaEventos"); //-- Eventos $eventos_out = array(); $iconos_out = array(); foreach($mes["eventos"] as $evento_mes){ if(!in_array($evento_mes["id_db"], $eventos_out)){ //$evento_mes = array("id_db"=>$evento["id_db"], "fecha"=> $evento["fecha"], "dia"=> date("j", strtotime(fechaGuion($evento["fecha"]))), "hora"=> $hora, "titulo"=>$evento["titulo"], "color"=>$evento["color"]); //$iconos_out[] = $CAL_ICO[$ico]; $id = $evento_mes["id_db"]; $ico = $CAL_ICO[ array_search($id, $ids)%count($CAL_ICO) ]; $xtpl->assign("ICO", $ico); $xtpl->assign("NOMBRE", $evento_mes["titulo"]); $eventos_out[] = $evento_mes["id_db"]; $xtpl->parse("main.mes.evento"); } } //-- Calendario $dia = 1; $cells = 0; $dia_inicio = date("w", strtotime($mes["anho"]."-".$mes["mes"]."-1"));//0 a 7 $dias_max = date("t", strtotime($mes["anho"]."-".$mes["mes"]."-1")); $j=0; while($j < $dia_inicio){ $xtpl->assign("DIA"," "); $xtpl->parse("main.mes.renglon.dia.empty"); $xtpl->parse("main.mes.renglon.dia"); $cells++; $j++; } do{ //Ver si hay eventos ese día $dia_ids = eventosDia($mes["eventos"], $dia); foreach($dia_ids as $id){ $ico = $CAL_ICO[ array_search($id, $ids)%count($CAL_ICO) ]; $xtpl->assign("ICO", $ico); //$xtpl->assign("ICO", $iconos_out[array_search($id, $eventos_out)] ); $xtpl->parse("main.mes.renglon.dia.ico"); } $xtpl->assign("DIA", $dia); $xtpl->parse("main.mes.renglon.dia.border"); $xtpl->parse("main.mes.renglon.dia"); $cells++; $dia++; if($cells%7 == 0 && $cells > 0){//domingo $xtpl->parse("main.mes.renglon"); } }while($dia <= $dias_max); $j=7 - $cells%7; while($j > 0 && $j<7){ $xtpl->assign("DIA"," "); $xtpl->parse("main.mes.renglon.dia.empty"); $xtpl->parse("main.mes.renglon.dia"); $j--; } $xtpl->parse("main.mes.renglon"); $xtpl->assign("MES", mesNombre($mes["mes"])); $xtpl->parse("main.mes"); } $xtpl->parse("main"); /*echo $stylesheet; $xtpl->out("main"); exit();*/ $mpdf->WriteHTML($stylesheet); $mpdf->WriteHTML($xtpl->text("main")); $mpdf->Output("CalendarioEscolar.pdf", 'I'); ?>