- <?php
- /**
- * @package koliportal
- */
-
-
-
- /** A szobákba beoszott hallgatók kitörlése
- *
- * Fejlesztői funkció. Kitörli a room_conn_student tábla tartalmát, s ezzel
- * a hallgatókat nem lesznek egyik szobába sem beosztva, valamint a
- * hallgatók kívánságait nem használtra állítja, így azok ismét kiértékelhetőek.
- * Tesztelés, fejlesztéshez használatos.
- */
-
- function debug_clean_tables()
- {
- global $database;
-
- /* FIXME: csak delevop verzió! */
- $sql_d = "DELETE FROM room_conn_student";
- mysql_query($sql_d, $database)
- or myerr(ERROR_DB, $sql_d);
-
- debug_echo($sql_d, DEBUG_SQL);
-
- $sql_u = "UPDATE wishes SET used = '0'";
- mysql_query($sql_u, $database)
- or myerr(ERROR_DB, $sql_u);
-
- debug_echo($sql_u, DEBUG_SQL);
-
- }
-
-
-
-
- /* kivánságok csúcsmátrix létrehozása */
- // FIXME: paraméterek? más kell még?
-
- /** Kívánságmátrix létrehozása
- *
- * Az adatbázis wishes táblája alapján letrehoz egy kétdimenziós tömböt,
- * amely a ki-kivel kapcsolatokat tartalmazza. A mátrix [ki, kivel]
- * indexű elemének értéke pedig a kívánságlistabeli sorszám lesz
- * (wishes.pref).
- *
- * @param array $sid_list Csak az itt megadott felhasználóazonosítókhoz
- * tartozó kívánságokat kérdezi le. A paraméter elhagyása esetén minden felhasználó
- * kívánságai bekerülnek a mátrixba.
- * @return array A kívánságmátrix, 2 dimenziós táblaként
- */
- function get_wishes($sid_list = false)
- {
- global $database;
-
- $wst = array();
-
- $ws_q = "SELECT * FROM wishes WHERE used = '0' ";
- if (is_array($sid_list) && (count($sid_list) > 0))
- {
- // FIXME
- $ws_q .= " AND ( ";
- reset($sid_list);
- $i = 0;
- while (list(, $sid) = each($sid_list))
- {
- if ($i++ > 0)
- {
- $ws_q .= " OR ";
- }
- $ws_q .= "sid = '$sid'";
- }
- $ws_q .= " )";
- } else {;}
-
- debug_echo($ws_q, DEBUG_SQL);
- $ws_res = mysql_query($ws_q, $database)
- or myerr(ERROR_DB, $ws_q);
-
- while ($ws_arr = mysql_fetch_assoc($ws_res))
- {
- // [ki][kivel] = hanyadik helyen
- $wst[$ws_arr["sid"]][$ws_arr["wsid"]] = $ws_arr["pref"];
- }
-
- return $wst;
-
- }
-
- /** Hallgatói azonosítók kinyerése egy kivánságmátrixból
- *
- * A bemeneti kívánságmátrixból kigyűjti az összes hallgatói azonosítót,
- * majd egy folytosan indexelt tömb elemeiként visszatér ezekkel.
- * Általában a $keys tömbök így állnak elő.
- *
- * @param array $w Bemeneti kívánságmátrix
- * @return array A hallgatók azonosítói egy tömbben
- */
- function get_students_from_wishlist($w)
- {
- $s = array();
- reset($w);
- while (list($wi, $wa) = each($w)) // sorokra bontás
- {
- $s[$wi] = $wi;
- reset($wa);
- while (list($wi2, ) = each($wa)) // egy-egy sid kiszedése
- {
- $s[$wi2] = $wi2;
- }
- }
- $s = array_unique($s);
- sort($s, SORT_NUMERIC);
- return $s;
- }
-
- /** Két szoba összehasonlítása szabad helyek szerint
- *
- * Segédfüggvény az usort() hoz.
- *
- * @param array $a Első szoba tömbje
- * @param array $b Második szoba tömbje
- * @return array Az usort() által várt -1, +1, vagy 0
- */
- function cmp_rooms_by_space($a, $b)
- {
- if ($a["freespace"] > $b["freespace"])
- {
- return 1;
- }
- if ($a["freespace"] < $b["freespace"])
- {
- return -1;
- }
- return 0;
- }
-
- /** Szobák összeszámolása szabad hely szerinti bontásban
- *
- * Egy tömbbe összegyűjti, hogy n szabad hellyel rendelkező szobából
- * hány található a listában. Az n lesz a tömb indexe, az n szabad
- * hellyel rendelkező szobák száma pedig az indexhez tartozó érték.
- *
- * @param array $r Szobalista
- * @return array Szobák darabszáma szabad hely szerinti bontásban
- */
- function count_rooms_by_spaces($r)
- {
- $min = $max = false;
- $rets = $s = array();
- reset($r);
- while (list(, $ra) = each($r))
- {
- if ((false === $min) || ($min > $ra["freespace"]))
- {
- $min = $ra["freespace"];
- }
- if ((false === $max) || ($max < $ra["freespace"]))
- {
- $max = $ra["freespace"];
- }
- if (!isset($s[$ra["freespace"]]))
- {
- $s[$ra["freespace"]] = 0;
- }
- $s[$ra["freespace"]]++;
- }
-
- if (count($r) == 0)
- {
- $rets = array();
- } elseif (1 == count($r)) {
- reset($r);
- list(, $ra) = each($r);
- $rets = array($ra["freespace"] => 1);
- } else {
- /* hogy szép csökkenő sorban legyenek */
- for ($i = $max; $i >= $min; $i--)
- {
- if (isset($s[$i]))
- {
- $rets[$i] = $s[$i];
- }
- }
- }
- return $rets;
- }
-
- function get_spaces_min($s)
- {
- $m = false;
- reset($s);
- while (list($i, $v) = each($s))
- {
- if ((false === $m) || ($m > $i))
- {
- $m = $i;
- }
- }
-
- return $m;
- }
- function get_spaces_max($s)
- {
- $m = false;
- reset($s);
- while (list($i, $v) = each($s))
- {
- if ((false === $m) || ($m < $i))
- {
- $m = $i;
- }
- }
-
- return $m;
- }
-
-
- /** Felesleges szobák kiszűrése
- *
- * Pontosan annyi férőhelyet hagy meg a szobalistából, amennyire szükség
- * van. Ha nincs annyi összesen, akkor persze kevesebbet.
- *
- * @param array $rooms Kezdeti szobalista
- * @param string $st A szükséges szobatípus
- * @param int $num A szükséges férőhelyek száma
- * @return array A megmaradt szobalista
- */
- function strip_extra_rooms($rooms, $st, $num)
- {
- usort($rooms, "cmp_rooms_by_space");
- $spaces = count_rooms_by_spaces($rooms);
-
- $min = get_spaces_min($spaces);
- $max = get_spaces_max($spaces);
-
- if (false === $min || false === $max)
- {
- return $rooms;
- }
-
- $sum = 0;
- $f = $max;
- $used = array();
- /* $used[$i] azt jelenti, hogy $i férőhelyes szobából mennyire
- van szükség */
-
- //debug_echo(sprintf("min: %d, max: %d, spaces:", $min, $max));
- //var_dump($spaces);
-
- for ($i = $max; $i >= $min; $i--)
- {
- //debug_echo("for space = $i");
- // ez egy szoba esetén jól működik?
- for ($j = 1; isset($spaces[$i]) && ($j <= $spaces[$i]); $j++)
- {
- if (!isset($used[$i]))
- {
- $used[$i] = 0;
- }
- if ($used[$i] <= $spaces[$i])
- {
- if ($sum + $i <= $num)
- {
- $sum += $i;
- $used[$i]++;
- }
- }
- //debug_echo(sprintf("j = $j (sum: $sum, used[$i]: %d, spaces[$i]: %d)", $used[$i], $spaces[$i]));
- }
- }
-
- sort($rooms);
- reset($rooms);
- $rc = count($rooms);
- for ($i = 0; $i < $rc; $i++)
- {
- $sp = $rooms[$i]["freespace"];
- if (isset($used[$sp]) && ($used[$sp] > 0))
- {
- $used[$sp]--;
- } else {
- unset($rooms[$i]);
- }
- }
-
- return $rooms;
- }
-
-
- /** Szobalista lekérdezése
- *
- * Kinyeri az adatbázisból az adott típusú szobák listáját.
- *
- * Négyféle szobatípus van:
- * - homogén (ST_HOMOGEN): csak egynemű hallgatók kerülhetnek bele, tehát
- * csak fiúk, vagy csak lányok
- * - heterogén (ST_HETEROGEN): különböző nemű hallgatók is beköltözhetnek
- * - lány (ST_FEMALE): csak nőnemű hallgatók vehetik birtokba
- * - fiú (ST_MALE): csak fiúk költözhetne be
- *
- * Keresésnél ha ST_MALE vagy ST_FEMALE szobát keresünk, akkor annak
- * megfelelő az ST_HOMOGEN típusú is, hiszen abba is beköltözhetnek csak
- * fiúk, vagy csak lányok.
- *
- * @param int $bid épület azonosítója (buildings.bid)
- * @param string $szoba a keresett szobák típusa (ST_* konstansok alapján)
- *
- * @return array tömbben a szobák azonosítói
- */
-
- function get_roomlist($bid, $stype)
- {
- global $database;
-
-
-
- if (!is_numeric($bid))
- {
- myerr(ERROR_CODE, "get_roomlist($bid, $stype): bid isn't numeric");
- }
-
- /* FIXME: lehet módosítani kellene a get_roomlist() használó függvényeket,
- hogy helyesen működjenek, ha nem csak az ST_HETEROGEN van megkülönböztetve a többitől */
-
- switch ($stype)
- {
- /* a fiú vagy lányszobák lehetnek a HOMOGEN típusúak is, vagy
- akár HETEROGEN szobába is rakhatunk csak egyneműeket */
- case ST_MALE:
- case ST_FEMALE:
- $room_q = "SELECT * FROM rooms WHERE bid = '$bid' AND
- (rtype = '$stype' OR rtype = 'ST_HOMOGEN' OR rtype = 'ST_HETEROGEN')
- ORDER BY rnum";
- break;
-
- case ST_HOMOGEN: /* ilyet nem valószínű, h keresne bárki is, de meghagyjuk */
-
- case ST_HETEROGEN:
- $room_q = "SELECT * FROM rooms WHERE bid = '$bid' AND rtype = '$stype'
- ORDER BY rnum";
- break;
- case ST_ALL:
- /* szobák adatainak lekérdezése... ha esetleg baj van velük, akkor már
- itt kiderüljön */
- $room_q = "SELECT * FROM rooms WHERE bid = '$bid'";
- break;
- default:
- myerr("Érvénytelen ST_ konstans. get_roomlist()");
- break;
- }
-
- debug_echo($room_q, DEBUG_SQL);
- $room_res = mysql_query($room_q, $database)
- or myerr(ERROR_DB, $room_q);
-
- $rooms = array();
-
- while ($room_arr = mysql_fetch_assoc($room_res))
- {
- $rid = $room_arr["roomid"];
- $rfs = room_freespace($rid);
- if ($rfs > 0)
- {
- $rooms[$rid] = $room_arr;
- $rooms[$rid]["freespace"] = $rfs;
- /*
- keres jó neki
-
- ST_HOMO ST_HOMO
- ST_HETERO ST_HETERO
- ST_MALE ST_MALE | ((ST_HOMO | ST_HETERO) && (t_MALE | üres))
- ST_FEMALE ST_FEMALE | ((ST_HOMO | ST_HETERO) && (t_FEMALE | üres)
-
-
- */
-
- $real_type = get_room_st($rid);
- $rtype = $room_arr["rtype"];
-
- //checkit($room_arr["rtype"], get_room_st($rid))
- $type_ok = false;
- /* homogén szobát keres, és olyan tényleg a szoba, viszont csak akkor
- jó, ha még nem költözött bele senki, mert akkor már ST_MALE vagy ST_FEMALE
- kellene h legyen */
-
- // itt akár a szabad helyet is lekérdezhetnénk az ST_ALL helyett
- if (($stype == ST_HOMOGEN) && ($rtype == ST_HOMOGEN) && ($real_type == ST_ALL))
- {
- $type_ok = true;
- }
- elseif (($stype == ST_HETEROGEN) && ($rtype == ST_HETEROGEN))
- {
- $type_ok = true;
- }
- /* női szobát keres, és az is vagy
- ((ST_HOMO ill ST_HETERO) és (üres vagy nők vannak benne csak) */
- elseif (($stype == ST_MALE) &&
- (($rtype == ST_MALE) ||
- ((($rtype == ST_HOMOGEN) || ($rtype == ST_HETEROGEN)) &&
- (($real_type == ST_MALE) || ($real_type == ST_ALL)))
- ))
- {
- $type_ok = true;
- }
- /* ugyanaz mint az előző csak ST_FEMALE ST_MALE helyett */
- elseif (($stype == ST_FEMALE) &&
- (($rtype == ST_FEMALE) ||
- ((($rtype == ST_HOMOGEN) || ($rtype == ST_HETEROGEN)) &&
- (($real_type == ST_FEMALE) || ($real_type == ST_ALL)))
- ))
- {
- $type_ok = true;
- }
-
- /* FIXME: ST_HETEROGEN szobába is kerülhetnek homogénen emberek! */
- //$rooms[$rid]["st"] = $st; // FIXME: ez felesleges!
- if (false === $type_ok) {
- unset($rooms[$rid]);
- }
- }
- }
-
-
- return $rooms;
- }
-
- /** Egy szobában lakók nemének meghatározása
- *
- * Lekérdezi az adatbázisból, hogy kik laknak a megadott szobában: fiúk
- * vagy lányok. Ha üres a szoba, akkor ST_ALL -al tér vissza.
- *
- * Csak a get_roomlist() függvény használja.
- *
- * @param int $rid szobaazonosító (rooms.roomid)
- *
- * @return string ST_* konstans
- */
-
- function get_room_st($rid)
- {
- global $database;
- $male = $female = false;
-
- /*
- $r_q = "SELECT * FROM rooms WHERE roomid = '$rid'";
- $r_res = mysql_query($r_q, $database)
- or myerr(ERROR_DB, $r_q);
- if (mysql_num_rows($r_res) === 0)
- {
- // ez nem nagyon következhetne be
- myerr("Mégsincs ilyen szoba? Ez elég gáz.");
-
- } else {
- $rarr = mysql_fetch_assoc($r_res)
- or myerr("Mégsincs ilyen szoba?");
- }
- */
-
- $sql_q = "SELECT st.sex AS st FROM users AS st, room_conn_student AS ct WHERE
- ct.roomid = '$rid' AND st.sid = ct.sid";
- /* $sql_q = "SELECT st.sex AS st, rt1.rtype
- FROM users AS st, room_conn_student AS ct
- LEFT OUTER JOIN rooms AS rt1
- ON (ct.roomid = '$rid' AND rt1.roomid = ct.roomid AND st.sid = ct.sid)";*/
- $sql_res = mysql_query($sql_q, $database)
- or myerr(ERROR_DB, $sql_q);
- while ($arr = mysql_fetch_assoc($sql_res))
- {
- if ($arr["st"] == 'F')
- {
- $female = true;
- } elseif ($arr["st"] == 'M') {
- $male = true;
- }
- }
-
-
- if ($male && $female)
- {
- $ret = ST_HETEROGEN;
- } elseif ($male && !$female) {
- $ret = ST_MALE;
- } elseif (!$male && $female) {
- $ret = ST_FEMALE;
- } else {
- $ret = ST_ALL; // ha nincs senki a szobában
- }
-
- return $ret;
- }
-
-
-
-
-
- /** Szobalistából a minimális szobaméret meghatározása
- *
- * A megadott szobalista minden szobájára a férőhelyen egy minimumkeresést
- * hajt végre. Üres szobalista esetén hibával kilép (ilyen nem fordulhat
- * elő, hamarabb kell ellenőrizni.
- *
- * @param array $r Szobalista
- * @return int A minimumkeresés eredménye
- */
- function get_rooms_spacemin($r)
- {
- $spacemin = false;
- reset($r);
-
- while (list( , $room_arr) = each($r))
- {
- if ($spacemin === false)
- {
- $spacemin = $room_arr["space"];
- }
- elseif ($spacemin > $room_arr["space"])
- {
- $spacemin = $room_arr["space"];
- }
- }
-
- if ($spacemin === false)
- {
- myerr("Üres szobalista!");
- }
- return $spacemin;
- }
-
- /** Szobalistából a maximális szobaméret meghatározása
- *
- * A megadott szobalista minden szobájára a férőhelyen egy maximumkeresést
- * hajt végre. Üres szobalista esetén hibával kilép (ilyen nem fordulhat
- * elő, hamarabb kell ellenőrizni.
- *
- * @param array $r Szobalista
- * @return int A maxiumkeresés eredménye
- */
- function get_rooms_spacemax($r)
- {
- $spacemax = false;
- reset($r);
-
- while (list( , $room_arr) = each($r))
- {
- if ($spacemax === false)
- {
- $spacemax = $room_arr["space"];
- }
- elseif ($spacemax < $room_arr["space"])
- {
- $spacemax = $room_arr["space"];
- }
- }
-
- if ($spacemax === false)
- {
- myerr("Üres szobalista!");
- }
- return $spacemax;
- }
-
- /** Nem kölcsönös kívánságok eltávolítása
- *
- * A megkapott kívánságmátrixból eltávolítja a nem kölcsönös kívánságokat.
- * Lényegében megnézi, hogy az [i,j] elemhez van-e [j,i]. Ha nincs, akkor
- * törli az elemet a tömbből.
- *
- * @param array $table A kapcsolatokat tartalmazó táblázat
- * @param array $key A $table azonosítói egy tömbben
- * @return array Csak kölcsönös kívánságokat tartalmazó tömb
- */
- function drop_single_wishes($table, $keys)
- {
- sort($keys);
- $maxij = count($keys);
-
- for ($i = 0; $i < $maxij; $i++)
- {
- $ki = $keys[$i];
- for ($j = 0; $j < $maxij; $j++)
- {
- $kj = $keys[$j];
- /* ha nincs kölcsönös él
- [j, i] -hez [i, j], akkor töröljük az
- [j, i] -t is
- */
- if (!isset($table[$ki][$kj]))
- {
- if (isset($table[$kj]))
- {
- //debug_echo("unset: $kj, $ki");
- unset($table[$kj][$ki]);
- }
- }
- }
- }
-
- return $table;
- }
-
-
- /** Különböző-e két tömb?
- *
- * Két tömb különbözőségét vizsgálja. Az array_diff() nem teljesen alkalmas
- * erre a feladatra, de használható részeredmények számításához.
- *
- * @param array $a1 Egyik tömb
- * @param array $a2 Másik tömb
- */
- function array_diffp($a1, $a2)
- {
- $c = count(array_diff($a1, $a2)) + count(array_diff($a2, $a1));
- // felesleges így cicózni, de így struktúrált =)
- if ($c == 0)
- {
- $ret = false; // nem különböznek
- }
- else
- {
- $ret = true; // különbözőek
- }
- return $ret;
- }
-
-
- /** Kivánság megkeresése
- *
- * Megkeresi az $uid felhasználó kivánságlistájában a $pref. helyen szereplő
- * hallgató azonosítóját, ha van ilyen a megadott kívánságmátrixban.
- *
- * @param array $table A kívánságokat tartalmazó táblázat
- * @param array $key A $table indexeihez tartozó valódi felhasználói azonosítók (users.sid)
- * @param int $uid A felhasználó azonosítója (users.sid)
- * @param int $pref A keresett hely a listában
- * @return mixed A listában $pref helyen lévő hallgató azonosítója (users.sid), ha
- * nincs ilyen, akkor false
- */
- function find_wish($table, $keys, $uid, $pref)
- {
- //debug_echo("find_wish(table, keys, $uid, $pref)");
- sort($keys);
- reset($keys);
-
- for ($i = 0; $i < count($keys); $i++)
- {
- if (isset($table[$uid][$keys[$i]]) && ($table[$uid][$keys[$i]] == $pref))
- {
- return $keys[$i];
- }
- }
- return false;
- }
-
- /** Csoportok megjelenítése
- *
- * Csoportok megjelenítése sorrendezéssel vagy anélkül. Fejlesztői funkció.
- *
- * @param array $g A csoportokat tartalmazó tömb
- * @param bool $sort Legyen-e sorrendezés a megjelenítés előtt
- */
- function debug_show_groups($g, $sort = true)
- {
- if (defined("DEBUG_OFF"))
- {
- return;
- }
-
- echo '<pre class="group_list">';
- if ($sort)
- {
- sort($g);
- }
- for ($i = 0; $i < count($g); $i++)
- {
- $unames = $vesszo = '';
- echo "group[$i]: ";
- reset($g[$i]["users"]);
- while (list(, $g1user) = each($g[$i]["users"]))
- {
- echo sprintf("%d (%s); ", $g1user, get_student_st($g1user));
- $unames .= sprintf('%s%s', $vesszo, get_student_name($g1user));
- $vesszo = ', ';
-
- }
- printf("(points: %d) (%s)", $g[$i]["points"], $unames);
- echo "\n";
- }
- echo "</pre>";
- }
-
- /** Kívánságmátrix megjelenítése
- *
- * Megjeleníti táblázatos formában egy kivánságmátrixot.
- * Fejlesztői funkció.
- *
- * @param array $table A kívánságokat tartalmazó táblázat
- * @param array $key A $table -ben előforduló hallgatói azonosítók sorbarendezve
- * @return array A táblázat nem üres elemeinek száma
- */
- function debug_show_table($alttext, $table, $keys)
- {
- $num = 0;
- $maxij = count($keys);
-
- if (defined("DEBUG_OFF") || ($maxij > 25))
- {
- return;
- }
-
- echo '<table border="1" class="kivansag_table" title="' . $alttext . '">';
- echo "\n";
- echo '<tr><th colspan="' . ($maxij + 2) . '">' . $alttext . '</th></tr>';
- echo "\n";
-
-
- echo '<tr><th colspan="2" rowspan="2">z</th><th colspan="' . $maxij . '">kivel</th></tr>';
-
- echo "\n\t<tr>\n";
- for ($j = 0; $j < $maxij; $j++)
- {
- echo "\t\t<th>";
- echo $keys[$j];
- echo "</th>\n";
- }
- echo "\t</tr>\n";
-
-
- for ($i = 0; $i < $maxij; $i++)
- {
- echo "\t<tr>\n";
- if ($i == 0) {
- echo "\t\t";
- echo '<th rowspan="' . $maxij . '">ki</th>';
- echo "\n";
-
- }
- echo "\t<th>";
- echo $keys[$i];
- echo "</th>\n";
-
- for ($j = 0; $j < $maxij; $j++)
- {
- echo "\t\t<td>";
- if (isset($table[$keys[$i]][$keys[$j]]))
- {
- echo $table[$keys[$i]][$keys[$j]];
- $num++;
- } else {
- echo "";
- }
-
- if ($i == $j)
- {
- echo "-";
- }
- echo "</td>\n";
-
- }
- echo "\t</tr>\n";
- }
- echo '</table>';
- return $num;
- }
-
-
-
-
-
-
-
- /** Szobák szűrése minimális férőhely alapján
- *
- * Meghagyja a megadott szobalistából azokat a szobákat, amelyekben legalább
- * $minspace ágy található.
- *
- * @param array $rooms Szobalista (tömbként)
- * @param int $minspace A keresett férőhelyek minimuma
- * @return array A feltételnek megfelelő szobákt (tömbként)
- */
- function room_filter_by_minspace($rooms, $minspace)
- {
- //debug_echo(sprintf("room_filter_by_minspace(%s, %s)", count($rooms) ,$minspace));
- $br = array();
-
- reset($rooms);
- while (list($i, ) = each($rooms))
- {
- $free = room_freespace($rooms[$i]["roomid"]);
- if ($free >= $minspace)
- {
- $br[$i] = $rooms[$i];
- }
- }
-
- return $br;
- }
-
-
-
- /** Szabad helyek számítsa egy szobához
- *
- * Kiszámítja a megadott szobában a szabad helyek számát.
- *
- * @param int $roomid A szoba azonosítója
- * @return int A szabad ágyak száma
- */
- function room_freespace($roomid)
- {
- global $database;
-
- if (!is_numeric($roomid))
- {
- myerr("room_freespace($roomid)");
- }
-
- $mh_q = "SELECT count(*) AS count FROM room_conn_student
- WHERE roomid = '$roomid'";
- //debug_echo($mh_q, DEBUG_SQL);
-
- $mh_res = mysql_query($mh_q, $database)
- or myerr(ERROR_DB, $mh_q);
- $mh_arr = mysql_fetch_assoc($mh_res)
- or myerr(ERROR_DB, $mh_q);
-
- $sz_q = "SELECT space AS space FROM rooms WHERE roomid = '$roomid'";
- //debug_echo($sz_q, DEBUG_SQL);
-
- $sz_res = mysql_query($sz_q, $database)
- or myerr(ERROR_DB, $sz_q);
- $sz_arr = mysql_fetch_assoc($sz_res)
- or myerr(ERROR_DB, $sz_q);
-
- if (!is_numeric($sz_arr["space"]) || !is_numeric($mh_arr["count"]))
- {
- myerr("room_freespace($roomid)");
- }
- $marad = $sz_arr["space"] - $mh_arr["count"];
- if ($marad < 0)
- {
- myerr("room_freespace($roomid)");
- }
-
- return $marad;
- }
-
-
- /** Elhelyez egy hallgatót egy szobában
- *
- * A megadott szobát hozzárendeli a megadott hallgatóhoz.
- * Technikailag a room_conn_student táblába tölt fel egy rekordot.
- * FIXME: itt ellenőrizni kellene mindent
- * - ferőhely >= benne lakók száma
- * - csak páros szobába kerülhetnek nem azonos neműek
- *
- * @param int $roomid A szoba azonosítója
- * @param int $sid A hallgató azonosítója
- */
- function szobaba_tesz($roomid, $sid)
- {
- global $database;
-
- if (!is_numeric($sid))
- {
- var_dump(debug_backtrace());
- die();
- }
-
- show_log(sprintf("%s szoba új lakója: %s (roomid: %d, sid: %d)", get_room_name($roomid),
- get_student_name($sid), $roomid, $sid));
- if (room_freespace($roomid) < 1)
- {
- myerr("Nincs elég hely a szobában!");
- }
-
- //FIXME: csak páros szobába kerülhetnek nem azonos neműek
-
- $sz_i = "INSERT INTO room_conn_student (roomid, sid)
- VALUES ('$roomid', '$sid');";
- //debug_echo($sz_i, DEBUG_SQL);
- $sz_res = mysql_query($sz_i, $database)
- or myerr(ERROR_DB, $sz_i);
- if (mysql_affected_rows($database) !== 1)
- {
- myerr(ERROR_DB, $sz_i);
- }
- }
-
-
- /** Egy hallgató és a hallgatóra vonatkozó kívánságok érvénytelenítése
- *
- * A hallgató kivánságainak megjelölése használtként, valamint az összes
- * az adott hallgatóra vonatkozó kívánság szintén használtként való
- * megjelölése. Erre akkor van szükség, ha a hallgatót már beosztottuk
- * valamelyik szobába, mert ilyenkor a további kívánságait nem lehet
- * figyelembe venni, mivel egy hallgatót csak egy szobába lehet beosztani.
- * Ilyenkor az összes további kívánsága, és az összes olyan kívánság,
- * ami az adott hallgatóra vonatkozik érvényét veszti.
- *
- * Ez technikailag a wishes tábla used attributumának 1-re állítását jelenti.
- *
- * @param int $student_id A hallgató azonosítója
- */
- function set_usedwish($student_id)
- {
- global $database;
-
- //debug_echo("set_usedwish($student_id)", DEBUG_CODE);
-
- $sz_u = "UPDATE wishes
- SET used = '1'
- WHERE sid = '$student_id'
- OR wsid = '$student_id'";
-
- $sz_res = mysql_query($sz_u, $database)
- or myerr(ERROR_DB, $sz_u);
- if (mysql_affected_rows($database) === -1)
- {
- myerr(ERROR_DB, $sz_u);
- }
- }
-
-
-
-
- /** Minden csoportból kimaradt hallgatók összegyűjtése
- *
- * A függvény összegyűjti azokat a hallgatókat, akik egyik szobába
- * sincsenek még beosztva. Ezek tipikusan azok a hallgatók, akik a
- * a csoport pontozásánál a hátsó csoportokban szerepeltek,
- * és már minden csoporttársukat beosztott valamelyik másik csoporttal.
- *
- * @param int $bid Az adott épületbe beosztott hallgatók között keres
- * @param int $stype A megadott típusú hallgatókat keresi (ST_* konstansok alapján)
- * @return array A hallgatók azonosítóit tartalmazó tömb
- */
- function collect_unassigned_students($bid, $stype)
- {
- /* FIXME: használhatná az is_assigned_student() függvényt is,
- de nem tudom, hogy melyik a gyorsabb */
- global $database;
-
-
- switch ($stype) {
- case ST_MALE:
- $std_q = "SELECT * FROM users WHERE bid = '$bid' AND ut = 'UT_ASTUDENT' AND sex = 'M'";
- break;
- case ST_FEMALE:
- $std_q = "SELECT * FROM users WHERE bid = '$bid' AND ut = 'UT_ASTUDENT' AND sex = 'F'";
- break;
- case ST_ALL:
- default:
- $std_q = "SELECT * FROM users WHERE bid = '$bid' AND ut = 'UT_ASTUDENT'";
- break;
-
- }
-
- $std_res = mysql_query($std_q, $database)
- or myerr(ERROR_DB, $std_q);
-
- $std = array();
- while ($std_arr = mysql_fetch_assoc($std_res))
- {
- $std[] = $std_arr["sid"];
- }
-
- $conn_q = "SELECT sid FROM room_conn_student";
- $conn_res = mysql_query($conn_q, $database)
- or myerr(ERROR_DB, $conn_q);
-
- $assigned_std = array();
- while ($conn_arr = mysql_fetch_assoc($conn_res))
- {
- $assigned_std[] = $conn_arr["sid"];
- }
-
- return array_diff($std, $assigned_std);
-
- }
-
-
-
- /** Szobák összes férőhelyének kiszámítása
- *
- * A megadott szobalista alapján kiszámolja, hogy hány hallgatót lehet
- * elszállásolni összesen.
- *
- * @param array $roomlist Szobalista
- * @return int Összes férőhely
- */
- function sum_room_space($roomlist)
- {
- $sum = 0;
- reset($roomlist);
-
- while (list( , $room_arr) = each($roomlist))
- {
- $sum += $spacemin = $room_arr["space"];
- }
-
- return $sum;
- }
-
- /** Férőhelyek és felvett hallgatók épületenkénti ellenőrzése
- *
- * A függvény ellenőrzi, hogy a megadott épület összes férőhelyében
- * elférnek-e az oda felvett hallgatók. Ellenőrzi továbbá, hogy
- * ha van az épületben olyan szoba, ahova csak fiúkat, illetve csak
- * lányokat lehet beköltöztetni, s ezekből elegendő áll-e az épületbe
- * felvett hallgatók rendelkezésére.
- *
- * @param int $bid Épület-azonosító (buildins.bid)
- * @return mixed Siker esetén true, egyébként hibaüzenet (string)
- */
-
- function check_spaces($bid, $roomlist)
- {
- $ret = true;
-
- $students = get_student_list($bid, ST_ALL);
- $rooms = get_roomlist($bid, ST_ALL);
- $roomspace = sum_room_space($rooms);
-
- if ($roomspace > count($students))
- {
- $ret = "Az épületbe több hallgató van felvéve, mint a férőhelyek száma!";
- return $ret;
- }
-
- /*
- további ellenőrzések: FIXME:
- count get_student_list(ST_FEMALE) << get_roomlist(ST_FEMALE + ST_HETEROGEN + ST_HOMOGEN)
- count get_student_list(ST_MALE) << get_roomlist(ST_MALE + ST_HETEROGEN + ST_HOMOGEN)
-
-
-
- */
-
-
-
- }
-
-
- ?>