Crear solicitudes y envío de correos

This commit is contained in:
2024-03-14 09:14:13 -06:00
parent 99c9482925
commit 0308d5c42e
4 changed files with 232 additions and 125 deletions

View File

@@ -50,7 +50,7 @@ $duracion_rs = $db->querySingle("select * from duracion where duracion_id = :id"
$duracion_tiempo = $duracion_rs["duracion_interval"];
//-- Obtiene datos de horario regular de clase
if($horario!= null)
if($horario!= null && $tipo !=3)
{
$horario_rs = $db->querySingle('SELECT * from horario_view where horario_id = :hor',
[':hor' => $horario]
@@ -58,140 +58,141 @@ if($horario!= null)
$materia = $horario_rs["materia_id"];
$dia = $horario_rs["horario_dia"];
$hora_orig = $horario_rs["horario_hora"];
}else{
$dia = date('w', strtotime($fecha));
}
$hora = $hora_ini.":".$min_ini.":00";
if($tipo == 2){//Cambio
$fecha_cambio = DateTime::createFromFormat('d/m/Y', $fecha_cambio)->format('Y-m-d');
$dia_falta = date('w', strtotime($fecha_cambio));
}else{
switch($tipo){
case 1://Reposición
$fecha_new = DateTime::createFromFormat('d/m/Y', $fecha)->format('Y-m-d')." ".$hora;
$fecha_fin_new = date("Y-m-d", strtotime($fecha_new))." ".$duracion_tiempo;
$dia_new = date('w', strtotime($fecha_new));
$fecha_falta = DateTime::createFromFormat('d/m/Y', $fecha_falta)->format('Y-m-d');
$dia_falta = date('w', strtotime($fecha_falta));
}
//Valida que tenga clase en la fecha de falta
if(intval($dia) != intval($dia_falta)){
//Valida que tenga clase en la fecha de falta
if(intval($dia) != intval($dia_falta)){
header("Location:".$pag."?error=11");
/*print_r($_POST);
echo 'SELECT * from horario_view where horario_id = '.$horario;
echo intval($dia)." != ".intval($dia_falta);*/
exit();
}
//Obtiene materia
$materia_rs = $db->querySingle('SELECT materia_nombre from materia where materia_id = :mat',[':mat' => $materia]);
//Obtiene correo
$correos_rs = $db->querySingle('SELECT coor.usuario_correo, coor.usuario_nombre from usuario coor where rol_id = :rol_coord and facultad_id = (
select coalesce(facultad_id,0) from usuario u where u.usuario_id = :id_usr) and coor.usuario_correo != \'\'',[':rol_coord' => COORDINADOR, ':id_usr' => $user->user["id"]]
);
if( count($correos_rs) > 0 ){
$to = $correos_rs["usuario_correo"];
}
if($tipo == 1){//Reposición
// Valida que grupo no tenga clases
/*$result = validaConflictoHoras($pdo, $gpo, $dia_new, $hora, $materia, "-", $fecha_new, $fecha_fin_new, $duracion);
if($result != ""){//error
//echo $result;
header("Location:".$pag."?error=7");
exit();
}
*/
//Valida que profesor no este en 2 reposiciones al mismo tiempo en la fecha nueva
$fecha_nueva = date('d/m/Y', strtotime($fecha_new));
$fecha_clase = date('d/m/Y', strtotime($fecha_falta));
break;
case 2://Cambio
$fecha_cambio = DateTime::createFromFormat('d/m/Y', $fecha_cambio)->format('Y-m-d');
$dia_falta = date('w', strtotime($fecha_cambio));
$fecha_nueva = date('d/m/Y', strtotime($fecha_cambio));
break;
case 3://Solicitud de espacio
$fecha_new = DateTime::createFromFormat('d/m/Y', $fecha)->format('Y-m-d')." ".$hora;
$fecha_fin_new = date("Y-m-d", strtotime($fecha_new))." ".$duracion_tiempo;
$dia_new = date('w', strtotime($fecha_new));
$fecha_nueva = date('d/m/Y', strtotime($fecha_new));
break;
case 4://Cambio permanente
$fecha_new = DateTime::createFromFormat('d/m/Y', $fecha)->format('Y-m-d')." ".$hora;
$fecha_fin_new = date("Y-m-d", strtotime($fecha_new))." ".$duracion_tiempo;
$dia_new = date('w', strtotime($fecha_new));
$fecha_cambio = DateTime::createFromFormat('d/m/Y', $fecha_cambio)->format('Y-m-d');
$dia_falta = date('w', strtotime($fecha_cambio));
$fecha_nueva = date('d/m/Y', strtotime($fecha_new));
$fecha_clase = date('d/m/Y', strtotime($fecha_cambio));
break;
}
if($materia!= null && $tipo !=3){
//Obtiene materia
$materia_rs = $db->querySingle('SELECT materia_nombre from materia where materia_id = :mat',[':mat' => $materia]);
}
switch($tipo){
case 1://Reposición
$traslape = $db->querySingle('SELECT * from traslape_profesor_reposicion(:prof, :fecha, :hora, :dur)',
[':prof' => $prof, ':fecha'=>DateTime::createFromFormat('d/m/Y', $fecha)->format('Y-m-d'), ':hora'=>$hora, ':dur'=>$duracion_tiempo]
)["traslape_profesor_reposicion"];
if($traslape){
//print_r($_POST);
//echo "SELECT * from traslape_profesor_reposicion($prof,'".DateTime::createFromFormat('d/m/Y', $fecha)->format('Y-m-d')."' , '$hora', $duracion)";
header("Location:".$pag."?error=9");
exit();
}
try{
if($user->jefe_carrera){//jefe
$db->query('SELECT * from fi_reposicion_solicitud(:f_falta, :f_nueva, :hora_nueva, :hor, :prof, 1, :desc, :alumnos, true, :aula, :duracion, :usr, :bloque, :ciclo)',
[':f_falta' => $fecha_falta, ':f_nueva' => $fecha_new, ':hora_nueva' => $hora, ':hor' => $horario,
':prof' => $prof, ':desc' => $comentario, ':alumnos' => $alumnos, ':aula' => $aula, ':duracion' => $duracion_tiempo, ':usr'=>$user->user["id"],
':bloque' => $bloque, ':ciclo' => $ciclo
]
);
$db_params=[
":f_falta"=>$fecha_falta, ":f_nueva"=>$fecha_new, ":hora_nueva"=>$hora, ":prof"=>$prof, ":desc"=>$comentario,
":edo"=>1, ":alumnos"=>$alumnos, ":aula"=>$aula, ":solicitudtipo"=>$tipo, ":usr"=>$user->user["id"],
":duracion"=>$duracion_tiempo, ":hor"=>$horario, ":bloque"=>$bloque, ":ciclo"=>$ciclo
];
$asunto = "Solicitud - Reposición nueva";
$texto = "<p>Se creó un cambio de salón nuevo.</p>";
$texto .= "<p><b>".mb_strtoupper($materia_rs["materia_nombre"])."</b> del día <b>".$fecha_falta." a las ".$hora_orig." hrs. </b> se propone reponer el <b>".$fecha_nueva." a las ".$hora." hrs.</b>";
}else{//coordinador
echo 'SELECT * from fi_reposicion_solicitud(:f_falta, :f_nueva, :hora_nueva, :hor, :prof, 2, :desc, :alumnos, true, :aula, :duracion, :usr, :bloque, :ciclo, '.$salon.')';
$db->query('SELECT * from fi_reposicion_solicitud(:f_falta, :f_nueva, :hora_nueva, :hor, :prof, 2, :desc, :alumnos, true, :aula, :duracion, :usr, :bloque, :ciclo, :salon)',
[':f_falta' => $fecha_falta, ':f_nueva' => $fecha_new, ':hora_nueva' => $hora, ':hor' => $horario,
':prof' => $prof, ':desc' => $comentario, ':alumnos' => $alumnos, ':aula' => $aula, ':duracion' => $duracion_tiempo, ':usr'=>$user->user["id"],
':bloque' => $bloque, ':ciclo' => $ciclo, ':salon'=>$salon
]
);
}
}catch(Exception $e){
echo "ERROR Reposición<br>".$e->getMessage();
//header("Location: ".$pag."?error=1");
exit();
}
$fecha_clase = date('d/m/Y', strtotime($fecha_falta));
$fecha_nueva = date('d/m/Y', strtotime($fecha_new));
$texto = "<p>Se creó una reposición nueva.</p>";
$texto .= "<p><b>".mb_strtoupper($materia_rs["materia_nombre"])."</b> del día <b>".$fecha_clase." a las ".$horario_rs["horario_hora"]." hrs. </b> se propone reponer el <b>".$fecha_nueva." a las ".$hora." hrs.</b>";
$texto .= "<p>Ingresa al <a href='https://paad.lci.ulsa.mx'>sistema PAAD</a> para autorizarla.</p>";
/*
/*
$log = new LogActividad();
$desc_log = "Inserta reposición nueva ID[".$rs["fi_reposicion"]."] Fechas[".$fecha_falta.">".$fecha_new."] Periodo[".$_SESSION["periodo_id"]."] Materia[".$materia."] Profesor[".$prof."] Salon[".$salon."] Horario[".$horario."] Alumnos[".$alumnos."]";
$log->appendLog($_SESSION["usuario_id"], $_SESSION["usuario_nombre"]." ".$_SESSION["usuario_apellidos"], $desc_log);*/
}else{//Cambio salón / hora
try{
if($user->jefe_carrera){//jefe
$db->query('SELECT * from fi_reposicion_solicitud(:f_falta, :f_nueva, :hora_nueva, :hor, :prof, 1, :desc, :alumnos, false, :aula, :duracion, :usr, :bloque, :ciclo)',
[':f_falta' => $fecha_cambio, ':f_nueva' => $fecha_cambio, ':hora_nueva' => $hora, ':hor' => $horario,
':prof' => $prof, ':desc' => $comentario, ':alumnos' => $alumnos, ':aula' => $aula, ':duracion' => $duracion_tiempo, ':usr'=>$user->user["id"],
':bloque' => $bloque, ':ciclo' => $ciclo
]
);
}else{//coordinador
$db->query('SELECT * from fi_reposicion_solicitud(:f_falta, :f_nueva, :hora_nueva, :hor, :prof, 2, :desc, :alumnos, false, :aula, :duracion, :usr, :bloque, :ciclo, :salon)',
[':f_falta' => $fecha_cambio, ':f_nueva' => $fecha_cambio, ':hora_nueva' => $hora, ':hor' => $horario,
':prof' => $prof, ':desc' => $comentario, ':alumnos' => $alumnos, ':aula' => $aula, ':duracion' => $duracion_tiempo, ':usr'=>$user->user["id"],
':bloque' => $bloque, ':ciclo' => $ciclo, ':salon'=>$salon
]
);
}
}catch(Exception $e){
echo "ERROR Cambio<br>".$e->getMessage();
//header("Location: ".$pag."?error=1");
exit();
}
$texto = "<p>Se creó un cambio de salón nuevo.</p>";
$texto .= "<p><b>".mb_strtoupper($materia_rs["materia_nombre"])."</b> del día <b>".$fecha_falta." a las ".$hora." hrs. </b> se propone reponer el <b>".$fecha_nueva." a las ".$hora." hrs.</b>";
$texto .= "<p>Ingresa al <a href='https://paad.lci.ulsa.mx'>sistema PAAD</a> para autorizarlo.</p>";
break;
case 2:
$db_params=[
":f_falta"=>$fecha_cambio, ":f_nueva"=>$fecha_cambio, ":hora_nueva"=>$hora, ":prof"=>$prof, ":desc"=>$comentario,
":edo"=>1, ":alumnos"=>$alumnos, ":aula"=>$aula, ":solicitudtipo"=>$tipo, ":usr"=>$user->user["id"],
":duracion"=>$duracion_tiempo, ":hor"=>$horario, ":bloque"=>$bloque, ":ciclo"=>$ciclo
];
$asunto = "Solicitud - Cambio de salón";
$texto = "<p>Se creó una solicitud de cambio de salón nuevo.</p>";
$texto .= "<p>El día <b>".$fecha_nueva." a las ".$hora." hrs. </b>";
/*
$log = new LogActividad();
$desc_log = "Inserta reposición nueva ID[".$rs["fi_reposicion"]."] Fechas[".$fecha_cambio.">".$fecha_cambio_nueva."] Periodo[".$_SESSION["periodo_id"]."] Materia[".$materia."] Profesor[".$prof."] Salon[".$salon."] Horario[".$horario."] Alumnos[".$alumnos."]";
$log->appendLog($_SESSION["usuario_id"], $_SESSION["usuario_nombre"]." ".$_SESSION["usuario_apellidos"], $desc_log);
*/
break;
case 3:
$db_params=[
":f_falta"=>null, ":f_nueva"=>$fecha_new, ":hora_nueva"=>$hora, ":prof"=>$prof, ":desc"=>$comentario,
":edo"=>1, ":alumnos"=>$alumnos, ":aula"=>$aula, ":solicitudtipo"=>$tipo, ":usr"=>$user->user["id"],
":duracion"=>$duracion_tiempo, ":hor"=>null, ":bloque"=>null, ":ciclo"=>null
];
$asunto = "Solicitud - Asignación de espacio";
$texto = "<p>Se creó una solicitud de asignación de salón nuevo.</p>";
$texto .= "<p><b>".mb_strtoupper($materia_rs["materia_nombre"])."</b> del día <b>".$fecha_nueva." a las ".$hora." hrs. </b>";
break;
case 4:
$db_params=[
":f_falta"=>$fecha_cambio, ":f_nueva"=>$fecha_new, ":hora_nueva"=>$hora, ":prof"=>$prof, ":desc"=>$comentario,
":edo"=>1, ":alumnos"=>$alumnos, ":aula"=>$aula, ":solicitudtipo"=>$tipo, ":usr"=>$user->user["id"],
":duracion"=>$duracion_tiempo, ":hor"=>$horario, ":bloque"=>$bloque, ":ciclo"=>$ciclo
];
$asunto = "Solicitud - Cambio permanente";
$texto = "<p>Se creó una solicitud de asignación de salón nuevo.</p>";
$texto .= "<p><b>".mb_strtoupper($materia_rs["materia_nombre"])."</b> del día <b>".$fecha_clase." a las ".$hora_orig." hrs. </b> se propone cambiar para el <b>".$fecha_nueva." a las ".$hora." hrs.</b>";
break;
}
try{
$db->query('SELECT * from fi_solicitud(:f_falta, :f_nueva, :hora_nueva, :prof, :desc, :edo, :alumnos, :aula, :solicitudtipo, :usr, :duracion, :hor, :bloque, :ciclo)',
$db_params);
}catch(Exception $e){
echo "ERROR Cambio<br>".$e->getMessage();
//header("Location: ".$pag."?error=1");
exit();
}
if($to!= "" && ENVIO_CORREOS){
MandaCorreos::enviarCorreo($db, $asunto, $texto, $user->facultad["facultad_id"], MandaCorreos::COORDINADOR);
/*if($to!= "" && ENVIO_CORREOS){
$texto .= "<p>Ingresa al <a href='https://paad.lci.ulsa.mx'>sistema PAAD</a> para autorizarlo.</p>";
$asunto = "Reposición nueva - solicitud";
//crear plantilla
$texto = '<body >
@@ -207,7 +208,7 @@ if($to!= "" && ENVIO_CORREOS){
Mailer::enviarCorreo($to, $asunto, $texto, true);
}
}
}*/
header("Location: ".$pag."?ok=0");
exit();

84
class/manda_correo.php Normal file
View File

@@ -0,0 +1,84 @@
<?php
class MandaCorreos{
public static const COORDINADOR = 1;
public static const SUPERVISOR = 2;
public static const JEFE = 4;
public static const PROFESOR = 8;
private const ENVIO_CORREOS = true;
private const PRUEBAS = false;
/* tipo es un acumulador de las banderas */
public static function enviarCorreo($db, $asunto, $texto, $facultad, $tipo, $prof_id = NULL){
$to="";
$correos=[];
if($_ENV['DB_NAME'] == "paad_pruebas" || self::PRUEBAS){
$to = "alejandro.lara@lasalle.mx";
}else{
if($tipo & self::COORDINADOR){
$correos_rs = $db->querySingle("SELECT DISTINCT coor.usuario_correo FROM usuario coor
where rol_id = 9 and facultad_id = :fac
and coor.usuario_correo is not null and coor.usuario_correo != ''",
[':fac' => $facultad]
);
foreach($correos_rs as $correo){
array_push($correos, $correo["usuario_correo"]);
}
unset($correos_rs);
}
if($tipo & self::SUPERVISOR){
$correosSup_rs = $db->querySingle("SELECT DISTINCT sup.usuario_correo
FROM horario_supervisor hs
inner join usuario sup on sup.usuario_id =hs.usuario_id
where :id_fac = ANY(hs.facultad_id_array)
and sup.usuario_correo is not null and sup.usuario_correo != ''",
[':id_fac' => $facultad] );
foreach($correosSup_rs as $correo){
array_push($correos, $correo["usuario_correo"]);
}
unset($correosSup_rs);
}
if($tipo & self::JEFE){
$correosJefe_rs = $db->querySingle("SELECT DISTINCT jefe.usuario_correo
FROM horario_jefe_carrera hs
inner join usuario jefe on jefe.usuario_id =hs.usuario_id
where :id_fac = ANY(hs.facultad_id_array)
and jefe.usuario_correo is not null and jefe.usuario_correo != ''",
[':id_fac' => $facultad] );
foreach($correosJefe_rs as $correo){
array_push($correos, $correo["usuario_correo"]);
}
unset($correosJefe_rs);
}
if($tipo & self::PROFESOR && $prof_id != NULL){
$correosProf_rs = $db->querySingle("SELECT DISTINCT prof.usuario_correo
FROM horario_profesor hs
inner join usuario prof on prof.usuario_id =hs.usuario_id
where :id_fac = ANY(hs.facultad_id_array) and prof.usuario_id = :id_prof
and prof.usuario_correo is not null and prof.usuario_correo != ''",
[':id_prof'=>$prof_id, ':id_fac' => $facultad] );
foreach($correosProf_rs as $correo){
array_push($correos, $correo["usuario_correo"]);
}
unset($correosProf_rs);
}
$to .= join(",", $correos);
}
if($to!= "" && self::ENVIO_CORREOS){
//crear plantilla
$texto = '<body >
<img src="https://paad.lci.ulsa.mx/imagenes/logo_lasalle.png" alt="La Salle" style="margin-bottom:60px">
'.$texto.'
</body>';
require_once('../include/phpmailer/PHPMailerAutoload.php');
if($_ENV['DB_NAME'] == "paad_pruebas" || self::PRUEBAS){
$asunto = "PRUEBAS-".$asunto;
}
Mailer::enviarCorreo($to, $asunto, $texto, true);
}
}
}
?>

View File

@@ -19,6 +19,14 @@ require_once $ruta_superior."/include/bd_pdo_rest.php";
require_once __DIR__."/token.php";
require_once __DIR__."/LogCambios.php";
function quitaAcentos($cadena) {
// Normalizar la cadena para descomponer caracteres acentuados en sus formas base y acentos
$cadenaNormalizada = Normalizer::normalize($cadena, Normalizer::FORM_D);
// Utilizar una expresión regular para eliminar los caracteres diacríticos
$cadenaSinAcentos = preg_replace('/\p{M}/u', '', $cadenaNormalizada);
return $cadenaSinAcentos;
}
//--------------ACTUALIZA HORARIOS--------------------------
if(!empty($_GET["fecha"])){
$hoy = $_GET["fecha"];
@@ -271,7 +279,12 @@ try{
//------------------
// Encontrar los "hash" que están en $sgu pero no están en $bd
$hashes_no_en_sgu = array_diff($hashes_bd, $hashes_sgu);
//$hashes_no_en_sgu = array_udiff($hashes_bd, $hashes_sgu, 'strcasecmp');
$hashes_no_en_sgu = array_udiff($hashes_bd, $hashes_sgu, function($a, $b){
return strcasecmp(quitaAcentos($a), quitaAcentos($b));
});
if($debug) echo "hashes_no_en_sgu ".count($hashes_no_en_sgu)."<br>";
if(count($hashes_no_en_sgu)>0){
@@ -305,7 +318,12 @@ try{
}
// Encontrar los "hash" que están en $sgu pero no están en $bd
$hashes_no_en_bd = array_diff($hashes_sgu, $hashes_bd);
//$hashes_no_en_bd = array_udiff($hashes_sgu, $hashes_bd, 'strcasecmp');
//comparar $hashes_sgu y $hashes_bd sin importar las maypusculas, minúsculas incluyendo acentos y ñ
$hashes_no_en_bd = array_udiff($hashes_sgu, $hashes_bd, function($a, $b){
return strcasecmp(quitaAcentos($a), quitaAcentos($b));
});
//echo "hashes_no_en_bd ".count($hashes_no_en_bd)."<br>";

View File

@@ -128,8 +128,8 @@ if(!is_null($user->periodo_id)){
if($write==true && isset($prof_rs) && count($prof_rs)>0) {?>
<!-- Botón para abrir el modal -->
<div class="row mb-4">
<div class="col-12 text-right">
<div class="btn-group" role="group" aria-label="Basic example">
<div class="col-12 text-center">
<div class="btn-group" role="group">
<?php foreach ($tiposol_rs as $tipo){ ?>
<button type="button" class="btn btn-outline-primary" data-accion="1" data-tipo="<?php echo $tipo["solicitudtipo_id"];?>" data-toggle="modal" data-target="#modal" <?php if (!$en_fecha ) { echo "disabled"; } ?>><span class="ing-mas ing-fw"></span><?php echo $tipo["solicitudtipo_nombre"];?></button>
<?php } ?>
@@ -642,6 +642,7 @@ if(!is_null($user->periodo_id)){
$('#fecha_nueva').attr("required", true);
$("#hora_nombre").text("Hora reposición *");
$("#materiaBlock").show();
break;
case 2://cambio de salón
$('#fecha_cambio').parents('.row').show();
@@ -653,6 +654,7 @@ if(!is_null($user->periodo_id)){
$('#fecha_nueva').removeAttr("required");
$("#hora_nombre").text("Hora cambio *");
$("#materiaBlock").show();
var hora = $("#dlMateria ul li.selected").data("hr");
var min = $("#dlMateria ul li.selected").data("min");
$("#hora_ini").val(hora);
@@ -668,6 +670,7 @@ if(!is_null($user->periodo_id)){
$('#fecha_nueva').attr("required", true);
$("#hora_nombre").text("Hora *");
$("#materiaBlock").hide();
break;
case 4:
$('#fecha_cambio').parents('.row').show();
@@ -679,6 +682,7 @@ if(!is_null($user->periodo_id)){
$('#fecha_nueva').attr("required", true);
$("#hora_nombre").text("Hora cambio *");
$("#materiaBlock").show();
break;
}
}