science-ation/admin/winners.php

659 lines
20 KiB
PHP

<?
/*
* This file is part of the Science-ation project
* Science-ation Website: https://science-ation.ca
*
* This file was part of the 'Science Fair In A Box' project
*
*
* Copyright (C) 2005 Sci-Tech Ontario Inc <info@scitechontario.org>
* Copyright (C) 2005 James Grant <james@lightbox.org>
* Copyright (C) 2024 AlgoLibre Inc. <science-ation@algolibre.io>
*
* 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_once ('../common.inc.php');
require_once ('../user.inc.php');
require_once ('../projects.inc.php');
require_once ('../fair_additional_materials.inc.php');
$auth_type = user_auth_required(array('fair', 'committee'), 'admin');
$award_awards_id = intval(get_value_from_array($_GET, 'award_awards_id'));
$action = get_value_from_array($_GET, 'action');
/* Load fairs */
$fairs = array();
$q = $pdo->prepare("SELECT * FROM fairs WHERE type='feeder' ORDER BY name");
$q->execute();
while (($f = $q->fetch(PDO::FETCH_ASSOC))) {
$fairs[$f['id']] = $f;
}
switch ($action) {
case 'addwinner':
$prize_id = intval($_GET['prize_id']);
$projects_id = intval($_GET['projects_id']);
if (!$prize_id || !$projects_id) {
error_('Illegal Assignment');
exit;
}
// first check how many we are allowed to have
$q = $pdo->prepare('SELECT number FROM award_prizes WHERE id=?');
$q->execute([$prize_id]);
show_pdo_errors_if_any($pdo);
$r = $q->fetch(PDO::FETCH_ASSOC);
$number = $r['number'];
/* Get the award info */
$q = $pdo->prepare('SELECT * FROM award_awards WHERE id=?');
$q->execute([$award_awards_id]);
show_pdo_errors_if_any($pdo);
$a = $q->fetch(PDO::FETCH_ASSOC);
/* Get the project */
$q = $pdo->prepare('SELECT fairs_id FROM projects WHERE id=?');
$q->execute([$projects_id]);
show_pdo_errors_if_any($pdo);
$p = $q->fetch(PDO::FETCH_ASSOC);
$fairs_id = $p['fairs_id'];
/*
* Quick sanity check don't let a fair user do an assignment for someone not
* in their fair
*/
if ($auth_type == 'fair' && $fairs_id != $_SESSION['fairs_id']) {
error_('Illegal Assignemnt');
exit;
}
if ($a['per_fair'] == 'yes') {
/* Count is the number of this fair already assigned */
$q = $pdo->prepare('SELECT COUNT(*) AS count FROM winners
LEFT JOIN projects ON winners.projects_id=projects.id
WHERE
projects.fairs_id=?
awards_prizes_id=?');
$q->execute([$fairs_id, $prize_id]);
show_pdo_errors_if_any($pdo);
$r = $q->fetch(PDO::FETCH_ASSOC);
$count = $r['count'];
} else {
/* Count is the total number assigned */
$q = $pdo->prepare('SELECT COUNT(*) AS count FROM winners WHERE awards_prizes_id=?');
$q->execute([$prize_id]);
show_pdo_errors_if_any($pdo);
$r = $q->fetch(PDO::FETCH_ASSOC);
$count = $r['count'];
}
if ($count < $number) {
$stmt = $pdo->prepare('INSERT INTO winners (awards_prizes_id,projects_id,year) VALUES (?,?,?)');
$stmt->execute([$prize_id, $projects_id, $config['FAIRYEAR']]);
happy_('Winning project added');
} else {
error_('This prize cannot accept any more winners. Maximum: %1', $number);
}
exit;
case 'deletewinner':
$prize_id = intval($_GET['prize_id']);
$projects_id = intval($_GET['projects_id']);
if ($prize_id && $projects_id) {
$stmt = $pdo->prepare('DELETE FROM winners WHERE awards_prizes_id=? AND projects_id=?');
$stmt->execute([$prize_id, $projects_id]);
happy_('Winning project removed');
}
exit;
case 'award_load':
$fairs_id = intval($_GET['fairs_id']);
/* Load the award */
$q = $pdo->prepare("SELECT
award_awards.id,
award_awards.name,
award_awards.criteria,
award_awards.order AS awards_order,
award_awards.per_fair,
award_awards.external_additional_materials,
award_awards.award_source_fairs_id,
award_types.type
FROM
award_awards ,
award_types
WHERE
award_awards.year=?
AND\taward_awards.award_types_id=award_types.id
AND \taward_types.year=award_awards.year
AND\taward_awards.id=?
");
$q->execute([$config['FAIRYEAR'], $award_awards_id]);
show_pdo_errors_if_any($pdo);
if ($q->rowCount() != 1) {
echo i18n("Invalid award to load $award_awards_id");
exit;
}
$r = $q->fetch(PDO::FETCH_ASSOC);
print_award($r, $fairs_id);
exit;
case 'edit_load':
$fairs_id = intval($_GET['fairs_id']);
/* Force the fair user to only edit their fair */
// if($auth_type == 'fair') $fairs_id = $_SESSION['fairs_id'];
/* Load the award */
$q = $pdo->prepare("SELECT
award_awards.id,
award_awards.name,
award_awards.criteria,
award_awards.order AS awards_order,
award_awards.per_fair,
award_awards.external_additional_materials,
award_awards.award_source_fairs_id,
award_types.type
FROM
award_awards ,
award_types
WHERE
award_awards.year=?
AND\taward_awards.award_types_id=award_types.id
AND \taward_types.year=award_awards.year
AND\taward_awards.id=?
");
$q->execute([$config['FAIRYEAR'], $award_awards_id]);
show_pdo_errors_if_any($pdo);
if ($q->rowCount() != 1) {
echo i18n("Invalid award to edit $award_awards_id");
exit;
}
$r = $q->fetch(PDO::FETCH_ASSOC);
$editor_data = array();
/* Load projects */
if ($r['type'] == 'Special') {
$editor_data['projects_nominated'] = getProjectsNominatedForSpecialAward($r['id']);
$editor_data['disable_nominated'] = false;
} else {
$editor_data['projects_nominated'] = array();
$editor_data['disable_nominated'] = true;
}
$editor_data['projects_eligible'] = getProjectsEligibleForAward($r['id']);
/* Print the award header */
echo '<br />';
if ($fairs_id)
echo '<h4>' . i18n('Winners from') . ": {$fairs[$fairs_id]['name']}</h4>";
echo "<b>{$r['type']} - {$r['name']}</b><br />";
echo "{$r['criteria']}<br />";
/* Print the award with editor */
print_award($r, $fairs_id, true, $editor_data);
exit;
case 'additional_materials':
$fairs_id = intval($_GET['fairs_id']);
$q = $pdo->prepare('SELECT * FROM award_awards WHERE id=?');
$q->execute([$award_awards_id]);
if ($fairs_id == 0) {
echo "Unsupported Action: Can't get additional materials for fairs_id=0. Edit the project and set it's fair to anything except 'Local/Unspecified'.";
exit;
}
$a = $q->fetch(PDO::FETCH_ASSOC);
$q = $pdo->prepare('SELECT * FROM fairs WHERE id=?');
$q->execute([$fairs_id]);
$fair = $q->fetch(PDO::FETCH_ASSOC);
$pdf = fair_additional_materials($fair, $a, $config['FAIRYEAR']);
foreach ($pdf['header'] as $h)
header($h);
echo $pdf['data'];
exit;
}
if ($auth_type == 'fair') {
send_header('Enter Winning Projects',
array('Science Fair Main' => 'fair_main.php'),
'enter_winning_projects');
} else {
send_header('Enter Winning Projects',
array('Committee Main' => 'committee_main.php',
'Administration' => 'admin/index.php'),
'enter_winning_projects');
}
?>
<div id="winner_editor" title="Edit Winners" style="display: none">
<div id="winner_content"></div>
</div>
<script language="javascript" type="text/javascript">
var award_awards_id = 0;
var fairs_id = 0;
function update_winner_content()
{
$("#winner_content").load("<?= $_SERVER['PHP_SELF'] ?>?action=edit_load&award_awards_id="+award_awards_id+"&fairs_id="+fairs_id,{},
function(responseText, textStatus, XMLHttpRequest) {
/* Attach to save button */
$("#project_save").click(function() {
var id = award_awards_id;
$("#debug").load("project_editor.php?action=save&award_awards_id="+id, $("#project_form").serializeArray());
});
}
);
}
function popup_editor(id,fid)
{
var w = (document.documentElement.clientWidth * 0.9);
var h = (document.documentElement.clientHeight * 0.9);
award_awards_id = id;
fairs_id = fid;
/* Show the dialog */
$('#winner_editor').dialog('option', 'width', w);
$('#winner_editor').dialog('option', 'height', h);
$("#winner_editor").dialog('open');
update_winner_content();
return true;
}
function delete_winner(prize_id, projects_id)
{
var conf = confirm("<?= i18n('Are you sure you want to remove this project from this prize?') ?>");
if(conf == false) return false;
$("#debug").load("<?= $_SERVER['PHP_SELF'] ?>?action=deletewinner&award_awards_id="+award_awards_id+"&prize_id="+prize_id+"&projects_id="+projects_id,{},
function(responseText, textStatus, XMLHttpRequest) {
update_winner_content();
}
);
}
function add_winner(prize_id)
{
var projects_id;
if($("#nom_"+prize_id).hasClass('text-link-selected')) {
projects_id = $("#projects_select_"+prize_id+"_nom").val();
} else {
projects_id = $("#projects_select_"+prize_id+"_eli").val();
}
$("#debug").load("<?= $_SERVER['PHP_SELF'] ?>?action=addwinner&award_awards_id="+award_awards_id+"&prize_id="+prize_id+"&projects_id="+projects_id,{},
function(responseText, textStatus, XMLHttpRequest) {
update_winner_content();
}
);
}
function unlist_winner(projects_id)
{
$(".projects_select option[value='"+projects_id+"']").remove();
}
function set_nom(prize_id)
{
/* Don't try anything if this is already selected */
if($("#nom_"+prize_id).hasClass('text-link-selected')) return false;
/* If nominated link is disabled, set all-eligible instead */
if($("#nom_"+prize_id).hasClass('text-link-disabled')) return set_eli(prize_id);
/* Populate List */
$("#projects_select_"+prize_id+"_eli").css('display', 'none');
$("#projects_select_"+prize_id+"_nom").css('display', 'inline');
/* This was brilliant, but we need to filter select boxes by fairs_id in some cases,
* so keeping a master copy and duplicating it just didn't work :(
* Actually, we can do this now, but the code works the other way, so i'm not going
* to change it back. :p */
/* $("#projects_select_"+prize_id).val('');
$("#projects_select_"+prize_id).html('');
$("#projects_nominated > option").clone().appendTo("#projects_select_"+prize_id); */
/* Swap selected styles */
$("#nom_"+prize_id).addClass('text-link-selected');
$("#eli_"+prize_id).removeClass('text-link-selected');
}
function set_eli(prize_id)
{
/* Don't try anything if this is already selected */
if($("#eli_"+prize_id).hasClass('text-link-selected')) {
return false;
}
/* Populate List */
$("#projects_select_"+prize_id+"_eli").css('display', 'inline');
$("#projects_select_"+prize_id+"_nom").css('display', 'none');
/* Swap selected styles */
$("#nom_"+prize_id).removeClass('text-link-selected');
$("#eli_"+prize_id).addClass('text-link-selected');
}
$(document).ready(function() {
$("#winner_editor").dialog({
bgiframe: true, autoOpen: false,
modal: true, resizable: false,
draggable: false,
buttons: {
/* "<?= i18n('Cancel') ?>": function() {
$(this).dialog("close");
},
"<?= i18n('Save') ?>": function() {
save_report();
$(this).dialog("close"); */
"<?= i18n('Close') ?>": function() {
// save_report();
$(this).dialog("close");
}
},
close: function() {
/* Reload the row after the dialog close in case the info has changed */
$("#winner_list_"+award_awards_id+"_"+fairs_id).load("<?= $_SERVER['PHP_SELF'] ?>?action=award_load&award_awards_id="+award_awards_id+"&fairs_id="+fairs_id);
}
});
});
</script>
<?
$fair_join = '';
$fair_where = '';
if ($auth_type == 'fair') {
/*
* Join to fairs_award_link, and only list awards that are set
* as "upload winners" for this fair
*/
$fair_join = 'LEFT JOIN fairs_awards_link ON fairs_awards_link.award_awards_id=award_awards.id';
$fair_where = "AND fairs_awards_link.upload_winners='yes'
AND fairs_awards_link.fairs_id='{$_SESSION['fairs_id']}'";
}
$q = $pdo->prepare("SELECT
award_awards.id,
award_awards.name,
award_awards.order AS awards_order,
award_awards.per_fair,
award_awards.external_additional_materials,
award_awards.award_source_fairs_id,
award_types.type,
sponsors.organization
FROM
award_awards $fair_join,
award_types,
sponsors
WHERE
award_awards.year=?
AND award_awards.award_types_id=award_types.id
AND award_types.year=?
AND award_awards.sponsors_id=sponsors.id
$fair_where
ORDER BY awards_order");
$q->execute([$config['FAIRYEAR'], $config['FAIRYEAR']]);
show_pdo_errors_if_any($pdo);
if ($q->rowCount() == 0) {
echo i18n('No awards to display.');
send_footer();
exit;
}
echo '<br />';
echo i18n('Choose an award to assign winners');
echo '<br />';
echo '<br />';
$fairs_id = ($auth_type == 'fair') ? $_SESSION['fairs_id'] : 0;
while ($r = $q->fetch(PDO::FETCH_ASSOC)) {
if ($r['per_fair'] == 'yes' && $auth_type != 'fair') {
?> <?= $r['type'] ?> - <?= $r['name'] ?>
<span style="font-size: 0.8em; font-style: italic;">(<?= $r['organization'] ?>)</span><br />
<?
foreach ($fairs as $fid => $f) {
?> <a title="<?= i18n('Edit winners for this award') ?>" href="#" onClick="popup_editor(<?= $r['id'] ?>,<?= $f['id'] ?>);return false;">
<?= $f['name'] ?></a><br />
<div id="winner_list_<?= $r['id'] ?>_<?= $fid ?>">
<?
print_award($r, $f['id']);
echo '</div>';
}
} else {
?> <a title="<?= i18n('Edit winners for this award') ?>" href="#" onClick="popup_editor(<?= $r['id'] ?>,<?= $fairs_id ?>);return false;">
<?= $r['type'] ?> - <?= $r['name'] ?></a>
<span style="font-size: 0.8em; font-style: italic;">(<?= $r['organization'] ?>)</span><br />
<div id="winner_list_<?= $r['id'] ?>_<?= $fairs_id ?>">
<?
print_award($r, $fairs_id);
echo '</div>';
}
echo '<br />';
}
function print_award(&$r, $fairs_id, $editor = false, $editor_data = array())
{
global $config, $auth_type;
global $pdo;
// echo "fair=$fairs_id";
/*
* Setup the winner filter, we don't want to restrict this
* to a specific fair for the 'fair' user
*/
$fairs_where = '';
if ($r['per_fair'] == 'yes') {
if ($fairs_id == 0) {
echo "blank fairs_id for per-fair award. bug.\n";
exit;
}
/* For per-fair awards, filter the results */
$fairs_where = "AND projects.fairs_id='$fairs_id'";
}
/* Force the 'fair' user to only edit their own fair */
if ($auth_type == 'fair')
$fairs_id = $_SESSION['fairs_id'];
/* Load prizes for this award */
$q = $pdo->prepare('SELECT
award_prizes.prize,
award_prizes.number,
award_prizes.id,
award_prizes.cash,
award_prizes.scholarship
FROM
award_prizes
WHERE
award_awards_id=?
AND award_prizes.year=?
ORDER BY
`order`');
$q->execute([$r['id'], $config['FAIRYEAR']]);
show_pdo_errors_if_any($pdo);
echo '<table width="100%"><tr><td>';
$has_winners = false;
while ($pr = $q->fetch(PDO::FETCH_OBJ)) {
if ($editor == true) {
echo '<br /><hr />';
}
echo "&nbsp;&nbsp;<b>{$pr->prize}";
if ($pr->cash || $pr->scholarship) {
echo ' (';
if ($pr->cash && $pr->scholarship)
echo "\${$pr->cash} cash / \${$pr->scholarship} scholarship";
else if ($pr->cash)
echo "\${$pr->cash} cash";
else if ($pr->scholarship)
echo "\${$pr->scholarship} scholarship";
echo ')';
}
/* Load winners for this prize */
$cq = $pdo->prepare('SELECT winners.projects_id,
projects.projectnumber,
projects.title,
projects.fairs_id
FROM
winners
LEFT JOIN projects ON projects.id=winners.projects_id
WHERE
winners.awards_prizes_id=?
? ');
$cq->execute([$pr->id, $fairs_where]);
show_pdo_errors_if_any($pdo);
$count = $cq->rowCount();
// echo "winners=$count";
/* Print count */
$colour = ($count < $pr->number) ? 'red' : 'green';
echo " <font color=\"$colour\">[$count/{$pr->number}]</font>";
echo '</b>';
echo '<br />';
/* List current winners for this prize */
$winners = array();
while ($w = $cq->fetch(PDO::FETCH_ASSOC)) {
if ($w['projectnumber']) {
echo '&nbsp;&nbsp;&nbsp;&nbsp;';
if ($editor == true) {
/* Print the delete X before the project */
if ($auth_type == 'fair' && $w['fairs_id'] != $fairs_id) {
/* show a blank so everything lines up */
echo '&nbsp;&nbsp;&nbsp;&nbsp;';
} else {
echo "<a onclick=\"delete_winner({$pr->id},{$w['projects_id']});return false;\" href=\"#\" >";
echo "<img style=\"vertical-align:middle\" border=0 src=\"{$config['SFIABDIRECTORY']}/images/16/button_cancel.{$config['icon_extension']}\"></a>";
echo '&nbsp;';
}
$winners[] = $w['projects_id'];
}
$has_winners = true;
echo "({$w['projectnumber']}) {$w['title']}";
echo '<br />';
} else {
/* echo "&nbsp;&nbsp;&nbsp;&nbsp;";
echo "<font color=\"red\">No winner(s) specified</font>"; */
}
}
/* Unlist all the winners we just printed from ALL lists */
if ($editor == true) {
echo '<script language="javascript" type="text/javascript">';
foreach ($winners as $w)
echo "unlist_winner($w);";
echo '</script>';
}
/* Print the select box if we need it */
if ($editor == true && $count < $pr->number) {
$n_nom = 0;
$n_eli = 0;
?>
<br />
<form id="winner_<?= $pr->id ?>">
&nbsp;&nbsp;&nbsp;
<select id="projects_select_<?= $pr->id ?>_nom" class="projects_select" style="display:none">
<option value=""><?= i18n('Choose a project') ?></option>
<?
foreach ($editor_data['projects_nominated'] as $p) {
if ($fairs_id != 0 && $p['fairs_id'] != $fairs_id)
continue;
echo "<option value=\"{$p['id']}\">{$p['projectnumber']} {$p['title']}</option>";
$n_nom++;
}
?> </select>
<select id="projects_select_<?= $pr->id ?>_eli" class="projects_select" style="display:none">
<option value=""><?= i18n('Choose a project') ?></option>
<?
foreach ($editor_data['projects_eligible'] as $p) {
if ($fairs_id != 0 && $p['fairs_id'] != $fairs_id)
continue;
echo "<option value=\"{$p['id']}\">{$p['projectnumber']} {$p['title']}</option>";
$n_eli++;
print_r($p);
}
?> </select>
<button id="" onClick="add_winner(<?= $pr->id ?>); return false;"><?= i18n('Add') ?></button>
<br />&nbsp;&nbsp;&nbsp;
<?= i18n('List') ?>:
<?
if ($editor_data['disable_nominated'] == true)
$n_nom = 'N/A';
$nom = i18n('All Nominated') . " ($n_nom)";
$el = i18n('All Eligible') . " ($n_eli)";
$cl = ($editor_data['disable_nominated'] == true) ? 'text-link-disabled' : '';
?>
<span id="nom_<?= $pr->id ?>" class="text-link <?= $cl ?>" onClick="set_nom(<?= $pr->id ?>);return false;"><?= $nom ?>
</span> - <span id="eli_<?= $pr->id ?>" class="text-link" onClick="set_eli(<?= $pr->id ?>);return false;"><?= $el ?></span>
</form>
<script language="javascript" type="text/javascript">
<? /*
* Start with the nominated list, unless there are none, do
* the eligible list by default in that case
*/
if ($n_nom > 0)
echo "set_nom({$pr->id});";
else
echo "set_eli({$pr->id});";
?> </script>
<?
}
}
echo '</td><td align="right">';
if ($r['external_additional_materials'] == 1 && $editor == false && $r['award_source_fairs_id'] == NULL) {
$d = 'disabled="disabled"';
$a = '';
if ($has_winners == true) {
echo "<a href=\"{$_SERVER['PHP_SELF']}?action=additional_materials&award_awards_id={$r['id']}&fairs_id={$fairs_id}\" >";
$d = '';
$a = '</a>';
}
echo "<button $d title=\"" . i18n('Download additional material (currently only a nomination form)') . '">' . i18n('Download Additional Materials') . "</button>$a<br/>";
}
echo '</td></tr></table>';
}
send_footer();
?>