science-ation/admin/judges_jdiv.php
2025-02-09 17:24:37 +00:00

345 lines
11 KiB
PHP

<?
/*
* This file is part of the 'Science Fair In A Box' project
* SFIAB Website: http://www.sfiab.ca
*
* Copyright (C) 2005 Sci-Tech Ontario Inc <info@scitechontario.org>
* Copyright (C) 2005 James Grant <james@lightbox.org>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public
* License as published by the Free Software Foundation, version 2.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
?>
<?
require ('../common.inc.php');
require_once ('../user.inc.php');
user_auth_required('committee', 'admin');
include 'judges.inc.php';
send_header('Judging Division Groupings',
array('Committee Main' => 'committee_main.php',
'Administration' => 'admin/index.php',
'Judges' => 'admin/judges.php'));
echo i18n('Instructions: The goal is to create groupings that have the least number of divisions/categories required to have at least %1 projects in the group. %1 is the number of projects that a single team can judge that you have specifed in the judge scheduler configuration. Judge division groupings indicate which divisions/categories can be judged together (by the same team of judges), so the divisons/categories should be somewhat similar to ensure there are judges that can handle judging all divisions assigned to a grouping.', array($config['max_projects_per_team']));
?>
<script language="javascript" type="text/javascript">
function addbuttonclicked(jdiv)
{
document.forms.jdivs.action.value="add";
document.forms.jdivs.jdiv_id.value=jdiv;
document.forms.jdivs.submit();
}
function newbuttonclicked(jdivs)
{
document.forms.jdivs.action.value="new";
document.forms.jdivs.jdivs.value=jdivs;
document.forms.jdivs.submit();
}
</script>
<?
$div = array();
$divshort = array();
$q = $pdo->prepare("SELECT * FROM projectdivisions WHERE year=? ORDER BY id");
$q->execute([$config['FAIRYEAR']]);
while ($r = $q->fetch(PDO::FETCH_OBJ)) {
$divshort[$r->id] = $r->division_shortform;
$div[$r->id] = $r->division;
}
$cat = array();
$q = $pdo->prepare("SELECT * FROM projectcategories WHERE year=? ORDER BY id");
$q->execute([$config['FAIRYEAR']]);
while ($r = $q->fetch(PDO::FETCH_OBJ)) {
$cat[$r->id] = $r->category;
}
$dkeys = array_keys($div);
$ckeys = array_keys($cat);
if ($config['filterdivisionbycategory'] == 'yes') {
$q = $pdo->prepare("SELECT * FROM projectcategoriesdivisions_link WHERE year=? ORDER BY projectdivisions_id,projectcategories_id");
$q->execute([$config['FAIRYEAR']]);
$divcat = array();
while ($r = $q->fetch(PDO::FETCH_OBJ)) {
$divcat[] = array('c' => $r->projectcategories_id, 'd' => $r->projectdivisions_id);
}
} else {
$divcat = array();
foreach ($dkeys AS $d) {
foreach ($ckeys AS $c) {
$divcat[] = array('c' => $c, 'd' => $d);
}
}
}
$langr = array();
$q = $pdo->prepare("SELECT * FROM languages WHERE active='Y'");
$q->execute();
while ($r = $q->fetch(PDO::FETCH_OBJ)) {
$langr[$r->lang] = $r->langname;
}
function get_all_divs()
{
global $config, $pdo;
global $divshort, $div, $cat, $langr;
global $divcat;
$cdlcheck = array();
$cdl = array();
$q = $pdo->prepare('SELECT * FROM judges_jdiv');
$q->execute();
while ($r = $q->fetch(PDO::FETCH_OBJ)) {
$cdl[$r->id]['id'] = $r->id;
$cdl[$r->id]['jdiv'] = $r->jdiv_id;
$cdl[$r->id]['div'] = $r->projectdivisions_id;
$cdl[$r->id]['cat'] = $r->projectcategories_id;
$cdl[$r->id]['lang'] = $r->lang;
$cdlcheck[$r->projectcategories_id][$r->projectdivisions_id][$r->lang] = 1;
}
/* Check for missing cdls */
$divkeys = array_keys($divshort);
$catkeys = array_keys($cat);
$lankeys = array_keys($langr);
foreach ($divcat AS $dc) {
$y = $dc['d'];
$x = $dc['c'];
foreach ($lankeys as $z) {
if ($cdlcheck[$x][$y][$z] == 1)
continue;
/*
* Also, make an entry in the DB, so that this isn't
* unassigned anymore
*/
$stmt = $pdo->prepare('INSERT INTO judges_jdiv (id, jdiv_id, projectdivisions_id, projectcategories_id, lang) '
. " VALUES('', 0,?,?,?)");
$stmt->execute([$y,$x,$z]);
$q = $pdo->prepare('SELECT id FROM judges_jdiv WHERE '
. " projectdivisions_id=?"
. " AND projectcategories_id=?"
. " AND lang=?");
$q->execute([$y,$x,$z]);
$r = $q->fetch(PDO::FETCH_OBJ);
$cdl[$r->id]['id'] = $r->id;
$cdl[$r->id]['jdiv'] = 0; /* Unassigned */
$cdl[$r->id]['cat'] = $x;
$cdl[$r->id]['div'] = $y;
$cdl[$r->id]['lang'] = $z;
}
reset($lankeys);
}
reset($divcat);
/* Make names for all the DCLs, and count the number of projects */
$dkeys = array_keys($cdl);
foreach ($dkeys as $id) {
$x = $cat[$cdl[$id]['cat']];
$y = $divshort[$cdl[$id]['div']];
$z = $div[$cdl[$id]['div']];
$q = $pdo->prepare('SELECT count(projects.id) AS cnt FROM projects,registrations WHERE '
. " projectdivisions_id=?"
. " AND projectcategories_id=?"
. " AND language=?"
. " AND registrations.year=?"
. ' AND projects.registrations_id=registrations.id'
. " AND (registrations.status='complete' OR registrations.status='paymentpending')");
$q->execute([$cdl[$id]['div'],$cdl[$id]['cat'],$cdl[$id]['lang'],$config['FAIRYEAR']]);
$r = $q->fetch(PDO::FETCH_OBJ);
show_pdo_errors_if_any($pdo);
$c = $r->cnt;
$cdl[$id]['name'] = "$x $y ({$cdl[$id]['lang']}) ($c project" . ($c == 1 ? '' : 's') . ')';
$cdl[$id]['lname'] = "$x $z ({$cdl[$id]['lang']}) ($c project" . ($c == 1 ? '' : 's') . ')';
$cdl[$id]['projects'] = $c;
}
return $cdl;
}
if (get_value_from_array($_POST, 'action') == 'add' && get_value_from_array($_POST, 'jdiv_id') && count(get_value_from_array($_POST, 'cdllist', [])) > 0) {
foreach ($_POST['cdllist'] AS $selectedcdl) {
$q = $pdo->prepare("UPDATE judges_jdiv SET jdiv_id=? WHERE "
. " id=?");
$q->execute([$_POST['jdiv_id'],$selectedcdl]);
}
echo happy(i18n('Judging Division(s) successfully added'));
}
if (get_value_from_array($_GET, 'action') == 'del' && get_value_from_array($_GET, 'cdl_id')) {
$stmt = $pdo->prepare("UPDATE judges_jdiv SET jdiv_id=0 WHERE id=?");
$stmt->execute([$_GET['cdl_id']]);
}
if (get_value_from_array($_GET, 'action') == 'empty' && get_value_from_array($_GET, 'jdiv_id')) {
$stmt = $pdo->prepare("UPDATE judges_jdiv SET jdiv_id=0 WHERE jdiv_id=?");
$stmt->execute([$_GET['jdiv_id']]);
echo happy(i18n('Emptied all divisions from Judging Division Group %1', array($_GET['jdiv_id'])));
}
if (get_value_from_array($_GET, 'action') == 'recreate') {
// just delete them all, they'll be recreated automagically
$stmt = $pdo->prepare('TRUNCATE TABLE judges_jdiv');
$stmt->execute();
echo happy(i18n('Recreated all division/category/language options'));
}
/* Sort out all the judging divisions */
$cdl = get_all_divs();
$dkeys = array_keys($cdl);
/*
* Count the divisions, or, use the posted variable so we can create new
* and empty judging divisions
*/
if (get_value_from_array($_POST, 'jdivs') > 0) {
$jdivs = $_POST['jdivs'];
} else {
$jdivs = 0;
foreach ($dkeys as $d) {
if ($cdl[$d]['jdiv'] > $jdivs)
$jdivs = $cdl[$d]['jdiv'];
}
}
reset($dkeys);
$showdivlist = false;
foreach ($dkeys as $id) {
if ($cdl[$id]['jdiv'] == 0) {
$showdivlist = true;
break;
}
}
echo '<form name="jdivs" method="post" action="judges_jdiv.php">';
echo '<input type="hidden" name="action">';
echo "<input type=\"hidden\" name=\"jdivs\" value=\"$jdivs\">";
echo '<input type="hidden" name="jdiv_id">';
echo '<input type="hidden" name="judges_id">';
echo '<table width="100%">';
echo '<tr>';
if ($showdivlist) {
echo '<th width="25%">' . i18n('Division List');
echo '<br />';
echo '</th>';
}
echo '<th>' . i18n('Judging Division Groups') . '</th>';
echo '</tr>';
echo '<tr>';
if ($showdivlist) {
echo '<td valign="top">';
echo '<select name="cdllist[]" multiple="multiple" style="width: 300px; height: 600px;">';
/* Print the list of all unassigned divs */
reset($dkeys);
foreach ($dkeys as $id) {
if ($cdl[$id]['jdiv'] != 0)
continue;
echo "<option value=\"$id\">{$cdl[$id]['name']}</option>\n";
}
echo '</select>';
echo '</td>';
}
echo '<td valign="top">';
/* Print he groupings of the assigned ones */
for ($jdiv = 1; $jdiv <= $jdivs; $jdiv++) {
echo '<hr>';
echo '<table width="100%">';
echo '<tr><td valign=top width="80">';
if ($showdivlist) {
echo "<input onclick=\"addbuttonclicked('$jdiv')\" type=\"button\" value=\"Add &gt;&gt;\"><br />";
}
echo '<br />';
echo "<a onclick=\"return confirmClick('Are you sure you want to empty all the divisions from this grouping?')\" href=\"judges_jdiv.php?action=empty&jdiv_id=$jdiv \">";
echo '<img border=0 src="' . $config['SFIABDIRECTORY'] . '/images/16/button_cancel.' . $config['icon_extension'] . '">';
echo ' ' . i18n('Empty') . ' ';
echo '</a>';
echo '</td><td>';
$p = 0;
reset($dkeys);
foreach ($dkeys as $id) {
if ($cdl[$id]['jdiv'] != $jdiv)
continue;
$p += $cdl[$id]['projects'];
}
echo "<table class=\"tableedit\" width=\"95%\">\n";
echo "<tr><th colspan=\"2\" align=\"left\">Judging Division $jdiv ($p project" . ($p == 1 ? '' : 's') . ')';
echo "</th></tr>\n";
$x = 0;
reset($dkeys);
foreach ($dkeys as $id) {
if ($cdl[$id]['jdiv'] != $jdiv)
continue;
echo '<tr><td>';
echo "<a href=\"judges_jdiv.php?action=del&cdl_id=$id\"><img border=0 src=\"" . $config['SFIABDIRECTORY'] . '/images/16/button_cancel.' . $config['icon_extension'] . '"></a>';
echo '</td><td width="100%">';
echo $cdl[$id]['lname'];
echo '</td></tr>';
$x++;
}
if ($x) {
echo '<tr><td colspan="2">';
// echo "<a onclick=\"return confirmClick('Are you sure you want to empty all the divisions from this grouping?')\" href=\"judges_jdiv.php?action=empty&jdiv_id=$jdiv \">";
// echo " ".i18n("Empty All Divisions")." ";
// echo "<img border=0 src=\"".$config['SFIABDIRECTORY']."/images/16/button_cancel.".$config['icon_extension']."\">";
// echo "</a>";
echo '</td></tr>';
} else {
echo '<tr><td colspan="2">';
echo error(i18n('No divisions present'), 'inline');
echo '</td></tr>';
}
echo '</table>';
echo '</td></tr></table>';
}
echo '<hr><input onclick="newbuttonclicked(\'' . ($jdivs + 1) . '\')" type="button" value="New Judging Divsion Group">';
echo '<br />';
echo '</td></tr>';
echo '</table>';
echo '</form>';
echo '<br />';
echo '<a onclick="return confirmClick(\'' . i18n('Are you sure you want to empty all groupings and re-create the options') . '\')" href="judges_jdiv.php?action=recreate">' . i18n('Re-create all division/category/language options') . '</a>. ' . i18n('This will completely empty ALL of your groupings and recreate all the possibly division/category/language options. Do this if for example you end up with a division/category that should not exist (due to the config option to filter divisions by category, or due to changing your divisions/categories alltogether)');
echo '<br />';
echo '<br />';
send_footer();
?>