configureWSDL("checador_service", PAG); //Create a complex types $server->wsdl->addComplexType('HorarioComplex', 'complexType', 'struct', 'all','', array( 'salon' => array('name' => 'salon','type' => 'xsd:string'), 'hora' => array('name' => 'hora','type' => 'xsd:string'), 'hora_inicio' => array('name' => 'hora_inicio','type' => 'xsd:string'), 'tipo' => array('name' => 'tipo','type' => 'xsd:integer'), 'fecha' => array('name' => 'fecha','type' => 'xsd:string'), 'retardo' => array('name' => 'retardo','type' => 'xsd:boolean'), 'materia' => array('name' => 'materia','type' => 'xsd:string'), 'grupo' => array('name' => 'grupo','type' => 'xsd:string') ) ); $server->wsdl->addComplexType('HorariosList', 'complexType', 'array', '', 'SOAP-ENC:Array', array(), array( array('ref' => 'SOAP-ENC:arrayType', 'wsdl:arrayType' => 'tns:HorarioComplex[]') ), 'tns:HorarioComplex' ); $server->wsdl->addComplexType('MensajeComplex', 'complexType', 'struct', 'all','', array( 'texto' => array('name' => 'texto','type' => 'xsd:string') ) ); $server->wsdl->addComplexType('MensajesList', 'complexType', 'array', '', 'SOAP-ENC:Array', array(), array( array('ref' => 'SOAP-ENC:arrayType', 'wsdl:arrayType' => 'tns:MensajeComplex[]') ), 'tns:MensajeComplex' ); //--------- //Recibe clave::string, regresa HorarioComplex function gethorarios($clave = ""){ global $pdo; try { $fecha = date("Y-m-d"); $hora = date("H:i"); $esProf = false; $esAdmin = false; $asistRegistrada = false; $msg = 0; $fecha = '2021-05-17'; $hora = '08:45:00'; $fecha_hora = $fecha." ".$hora; $clave = intval($clave); $error = false; $resultMsg = ""; //Manda clave ULSA y recibe id de Usuario $stmt = $pdo->prepare('Select * from fs_validaclaveulsa(:clave) AS "Usuario_id"');//Obtiene todo el calendario $stmt->bindParam(":clave", $clave); if(!$stmt->execute()){ $resultMsg = "No existe la clave"; $error = true; }else{ $usr_rs = $stmt->fetch(); } $stmt->closeCursor(); //Datos de usuario if(!$error){ $stmt = $pdo->prepare('Select * from fs_usuario(:id)'); $stmt->bindParam(":id", $usr_rs["Usuario_id"]); if(!$stmt->execute()){ $resultMsg = "No existe el usuario"; $error = true; }else{ $usr_datos = $stmt->fetch();//Devuelve sólo 1 resultado $stmt->closeCursor(); // cierra conexion de resultado $stmt = null; // cierra conexion } } $hasAsistencia = false;//revisa si tiene asistenias nuevas //Arrelo para guardar los resultados de las validaciones $asistenciasArr = array( "asistencia" => array("profesor"=>array(), "administrativo"=>array()), "retardo" => array("profesor"=>array(), "administrativo"=>array()) ); //--Profesor LICENCIATURA if(!$error){ //Lee asistencias $stmt = $pdo->prepare('Select * from fs_asistenciaprofesor_busca(:fecha, :hora, :usr, -30, 16, 1)');//Limite inferior es incluyente, limite superior excluyente $stmt->bindParam(":usr", $usr_rs["Usuario_id"]); $stmt->bindParam(":fecha", $fecha); $stmt->bindParam(":hora", $hora); if(!$stmt->execute()){ //$t = $stmt->errorInfo(); $resultMsg = "No se pudieron leer los horarios."; $error = true; }else{ $esProf = true; $rs = $stmt->fetchAll(); if(count($rs) > 0) $hasAsistencia = true; $asistenciasArr["asistencia"]["profesor"] = array_merge($asistenciasArr["asistencia"]["profesor"], $rs); } $stmt->closeCursor(); } if(!$error){ //Lee retardos $stmt = $pdo->prepare('Select * from fs_asistenciaprofesor_busca(:fecha, :hora, :usr, 16, 31, 1)');//Limite inferior es incluyente, limite superior excluyente $stmt->bindParam(":usr", $usr_rs["Usuario_id"]); $stmt->bindParam(":fecha", $fecha); $stmt->bindParam(":hora", $hora); if(!$stmt->execute()){ //$t = $stmt->errorInfo(); $resultMsg = "No se pudieron leer los horarios. "; $error = true; }else{ $esProf = true; $rs = $stmt->fetchAll(); if(count($rs) > 0) $hasAsistencia = true; $asistenciasArr["retardo"]["profesor"] = array_merge($asistenciasArr["retardo"]["profesor"], $rs); } $stmt->closeCursor(); } //--Profesor POSGRADO if(!$error){ //Lee asistencias $stmt = $pdo->prepare('Select * from fs_asistenciaprofesor_busca(:fecha, :hora, :usr, -60, 10, 2)');//Limite inferior es incluyente, limite superior excluyente $stmt->bindParam(":usr", $usr_rs["Usuario_id"]); $stmt->bindParam(":fecha", $fecha); $stmt->bindParam(":hora", $hora); if(!$stmt->execute()){ //$t = $stmt->errorInfo(); $resultMsg = "No se pudieron leer los horarios. "; $error = true; }else{ $esProf = true; $rs = $stmt->fetchAll(); if(count($rs) > 0) $hasAsistencia = true; $asistenciasArr["asistencia"]["profesor"] = array_merge($asistenciasArr["asistencia"]["profesor"], $rs); } $stmt->closeCursor(); } if(!$error){ //Lee retardos $stmt = $pdo->prepare('Select * from fs_asistenciaprofesor_busca(:fecha, :hora, :usr, 10, 31, 2)');//Limite inferior es incluyente, limite superior excluyente $stmt->bindParam(":usr", $usr_rs["Usuario_id"]); $stmt->bindParam(":fecha", $fecha); $stmt->bindParam(":hora", $hora); if(!$stmt->execute()){ //$t = $stmt->errorInfo(); $resultMsg = "No se pudieron leer los horarios. "; $error = true; }else{ $esProf = true; $rs = $stmt->fetchAll(); if(count($rs) > 0) $hasAsistencia = true; $asistenciasArr["retardo"]["profesor"] = array_merge($asistenciasArr["retardo"]["profesor"], $rs); } $stmt->closeCursor(); } //--Administrativo if(!$error){ //Lee asistencias $stmt = $pdo->prepare('Select * from fs_asistenciaadministrativo_busca(:fecha, :hora, :usr)');//Limite inferior es incluyente, limite superior excluyente $stmt->bindParam(":usr", $usr_rs["Usuario_id"]); $stmt->bindParam(":fecha", $fecha); $stmt->bindParam(":hora", $hora); if(!$stmt->execute()){ $t = $stmt->errorInfo(); $resultMsg = "No se pudieron leer los horarios administrativos. "; $error = true; }else{ $esAdmin = true; $rs = $stmt->fetchAll(); if(count($rs) > 0) $hasAsistencia = true; $asistenciasArr["asistencia"]["administrativo"] = array_merge($asistenciasArr["asistencia"]["administrativo"], $rs); } $stmt->closeCursor(); } /*if(!$error){ //Lee retardos no se usan $stmt = $pdo->prepare('Select * from fs_asistenciaadministrativo_busca(:fecha, :hora, :usr, 16, 31)');//Limite inferior es incluyente, limite superior excluyente $stmt->bindParam(":usr", $usr_rs["Usuario_id"]); $stmt->bindParam(":fecha", $fecha); $stmt->bindParam(":hora", $hora); if(!$stmt->execute()){ //$t = $stmt->errorInfo(); $error = 2; // "No se pudieron leer los horarios. "; $error = true; }else{ $rs = $stmt->fetchAll(); if(count($rs) > 0) $hasAsistencia = true; $asistenciasArr["retardo"]["administrativo"] = array_merge($asistenciasArr["retardo"]["administrativo"], $rs); } $stmt->closeCursor(); }*/ //--Inserta en tabla de asistencia $resultArr = array(); if($hasAsistencia){ $pdo->beginTransaction(); foreach($asistenciasArr as $keyAsist=>$asistArr){ if($keyAsist == "asistencia") $retardo = 'false'; else $retardo = 'true'; foreach($asistArr as $keyTipo=>$tipoArr){ if($keyTipo == "profesor") $tipo = 1; else $tipo = 2; foreach($tipoArr as $horario){ $query = ""; if($tipo == 1 && isset($horario["Reposicion_id"]) && $horario["Reposicion_id"] != "") $query .= ":rep_id"; else $query .= "NULL"; $isRepo = "false"; if($tipo == 1 && isset($horario["Asistencia_isReposicion"]) && $horario["Asistencia_isReposicion"]){ $isRepo = "true"; } if($horario["HorarioGrupo_id"] != ""){ $stmt = $pdo->prepare('Select * from fi_asistenciausuario(:usr, :tipo, :fecha_evento, :horario, :retardo, '.$isRepo.', :fecha_reg,'.$query.')'); $stmt->bindParam(":horario", $horario["HorarioGrupo_id"]); }else $stmt = $pdo->prepare('Select * from fi_asistenciausuario(:usr, :tipo, :fecha_evento, NULL, :retardo, '.$isRepo.', :fecha_reg,'.$query.')'); $stmt->bindParam(":usr", $usr_rs["Usuario_id"]); $stmt->bindParam(":tipo", $tipo); $stmt->bindParam(":fecha_evento", $horario["Fecha"]); $stmt->bindParam(":retardo", $retardo); $stmt->bindParam(":fecha_reg", $fecha_hora); if($tipo == 1 && isset($horario["Reposicion_id"]) && $horario["Reposicion_id"] != "") $stmt->bindParam(":rep_id", $horario["Reposicion_id"]); if(!$stmt->execute()){ //$t = $stmt->errorInfo(); $error = 3; // "No se pudo insertar la asistencia. "; $error = true; break; }else{ $asist_rs = $stmt->fetch(); $stmt->closeCursor(); if($asist_rs["fi_asistenciausuario"] != 0){//insertó algo $salon = ""; if(isset($horario["Salon_desc"])){//para profesores if($horario["Salon_desc_larga"]!= ""){ $salon = $horario["Salon_desc"]." (".$horario["Salon_desc_larga"].")"; }else{ $salon = $horario["Salon_desc"]; } } if($tipo == 1){ $resultArr[] = array("salon"=>$salon, "hora"=>$hora, "hora_inicio"=>substr($horario["Horario_hora"], 0, 5), "tipo"=>$tipo, "fecha"=>$horario["Fecha"], "retardo"=>$retardo, "materia"=>$horario["Materia_desc"], "grupo"=>$horario["Grupo_desc"]." ".$horario["Carrera_prefijo"]); } else{ $resultArr[] = array("salon"=>$salon, "hora"=>$hora, "hora_inicio"=>substr($horario["Horario_hora"], 0, 5), "tipo"=>$tipo, "fecha"=>$horario["Fecha"], "retardo"=>$retardo, "materia"=>'Horario administrativo', "grupo"=>''); } $asistRegistrada = true; }/*else{ $resultMsg = "Ya se registró la asistencia para los horarios disponibles. "; }*/ } }//foreach horario }//foreach prof/admin }//foreach asistencia/retardo if($error){ $pdo->rollBack(); }else $pdo->commit(); }else{ //revisa si ya se había registrado //Profesor Lic $registradasArr = null; $registradasArr = array(); $stmt = $pdo->prepare('Select * from fs_asistenciaprofesor_registrada(:fecha, :hora, :usr, -30, 31, 1)');//Limite inferior es incluyente, limite superior excluyente $stmt->bindParam(":usr", $usr_rs["Usuario_id"]); $stmt->bindParam(":fecha", $fecha); $stmt->bindParam(":hora", $hora); if(!$stmt->execute()){ //$t = $stmt->errorInfo(); $resultMsg = "No se pudieron leer los horarios."; $error = true; }else{ $rs = $stmt->fetchAll(); foreach($rs as $row){ $salon = ""; if(isset($row["Salon_desc"])){//para profesores if($row["Salon_desc_larga"]!= ""){ $salon = $row["Salon_desc"]." (".$row["Salon_desc_larga"].")"; }else{ $salon = $row["Salon_desc"]; } } $registradasArr[]= array("salon"=>$salon, "hora"=>$row["Asistencia_hora"], "hora_inicio"=>substr($row["Horario_hora"], 0, 5), "tipo"=>1, "fecha"=>$row["Fecha"], "retardo"=>$row["Asistencia_isRetardo"], "materia"=>$row["Materia_desc"], "grupo"=>$row["Grupo_desc"]." ".$row["Carrera_prefijo"]); } } $stmt->closeCursor(); //Profesor Posgrado $stmt = $pdo->prepare('Select * from fs_asistenciaprofesor_registrada(:fecha, :hora, :usr, -60, 31, 2)');//Limite inferior es incluyente, limite superior excluyente $stmt->bindParam(":usr", $usr_rs["Usuario_id"]); $stmt->bindParam(":fecha", $fecha); $stmt->bindParam(":hora", $hora); if(!$stmt->execute()){ //$t = $stmt->errorInfo(); $resultMsg = "No se pudieron leer los horarios."; $error = true; }else{ $rs = $stmt->fetchAll(); foreach($rs as $row){ $salon = ""; if(isset($row["Salon_desc"])){//para profesores if($row["Salon_desc_larga"]!= ""){ $salon = $row["Salon_desc"]." (".$row["Salon_desc_larga"].")"; }else{ $salon = $row["Salon_desc"]; } } $registradasArr[]= array("salon"=>$salon, "hora"=>$row["Asistencia_hora"], "hora_inicio"=>substr($row["Horario_hora"], 0, 5), "tipo"=>1, "fecha"=>$row["Fecha"], "retardo"=>$row["Asistencia_isRetardo"], "materia"=>$row["Materia_desc"], "grupo"=>$row["Grupo_desc"]." ".$row["Carrera_prefijo"]); } } $stmt->closeCursor(); //Administrativo $stmt = $pdo->prepare('Select * from fs_asistenciaadministrativo_registrada(:fecha, :hora, :usr)');//Sin límites administrativos $stmt->bindParam(":usr", $usr_rs["Usuario_id"]); $stmt->bindParam(":fecha", $fecha); $stmt->bindParam(":hora", $hora); if(!$stmt->execute()){ $t = $stmt->errorInfo(); $resultMsg = "No se pudieron leer los horarios. (Select * from fs_asistenciaadministrativo_registrada('$fecha', '$hora', ".$usr_rs["Usuario_id"]."))".$t[2]; $error = true; }else{ $rs = $stmt->fetchAll(); foreach($rs as $row){ $salon = ""; $registradasArr[]= array("salon"=>$salon, "hora"=>$row["Asistencia_hora"], "hora_inicio"=>substr($row["Horario_hora"], 0, 5), "tipo"=>2, "fecha"=>$row["Fecha"], "retardo"=>$row["Asistencia_isRetardo"], "materia"=>"Horario administrativo", "grupo"=>""); } } $stmt->closeCursor(); }//fin asistencias registrdas //Busca avisos de hoy $avisoArr = array(); $stmt = $pdo->prepare('Select * from fs_avisochecador(:usr, now()::date)'); $stmt->bindParam(":usr", $usr_rs["Usuario_id"]); if($stmt->execute()){ $aviso_rs = $stmt->fetchAll(); foreach($aviso_rs as $aviso){ $avisoArr[] = $aviso["Aviso_texto"]; } //$return["avisoArr"] = $avisoArr; }else{ $t = $stmt->errorInfo(); //$return["errorAviso"] = "error: ".$t[2]; $resultMsg = "No se pudieron obtener los avisos".$t[2]; } $stmt->closeCursor(); if(!$error){ if(count($resultArr) == 0){ if(!isset($resultMsg)) $resultMsg = ""; if(count($registradasArr) > 0){ $resultMsg .= "Ya se registraron asistencias."; }else{ $resultMsg .= "No hay más horarios para registrar."; //$pdo->rollBack(); $error = true; } }else{ $resultMsg = "Registrado [".$hora."]"; //$return["result"] = $resultArr; //$pdo->commit();//comment to test } }/*else{ $pdo->rollBack(); }*/ //Inserta log de asistencias /*$log = new LogAsistencias(); if($asistRegistrada) $log->appendLog($clave, "Registrada"); else $log->appendLog($clave, "No registrada");*/ }catch(PDOException $e) { $pdo->rollBack(); $resultMsg = "Ocurrió un error al insertar la asistencia "; $error = true; } return array( 'result' => !$error, 'usuario_nombre' => $usr_datos["Usuario_apellidos"]." ".$usr_datos["Usuario_nombre"], 'horario_array' => $resultArr, 'asistencia_array' => $registradasArr, "mensaje_array" => $avisoArr, 'result_msg' => $resultMsg ); //array('result' => 'xsd:boolean', 'horario_array' => 'tns:HorariosList', 'mensaje_array' => 'tns:MensajesList', 'error' => 'xsd:string'),//regresa } // Parametros de salida $server->register("gethorarios", array("clave" => "xsd:integer"),//recibe array('result' => 'xsd:boolean', 'usuario_nombre' => 'xsd:string', 'horario_array' => 'tns:HorariosList', 'asistencia_array' => 'tns:HorariosList', 'mensaje_array' => 'tns:MensajesList', 'result_msg' => 'xsd:string'),//regresa PAG, PAG."#gethorarios", "rpc", "encoded", "Obtiene listado de materias y listado de mensajes para la clave de usuario"); @$server->service(file_get_contents("php://input")); ?>