science-ation/admin/registration_list.php
2025-02-07 20:48:27 +00:00

581 lines
17 KiB
PHP

<?
/*
* This file is part of the 'Science Fair In A Box' project
* SFIAB Website: http://www.sfiab.ca
*
* Copyright (C) 2005-2006 Sci-Tech Ontario Inc <info@scitechontario.org>
* Copyright (C) 2005-2006 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.
*/
// This file was modified Jan of 2014 by Richard Sin
// Flagging has been added to monitor projects with concern.
?>
<?
require_once ('../common.inc.php');
require_once ('../user.inc.php');
$auth_type = user_auth_required(array('fair', 'committee'), 'admin');
// require_once('../register_participants.inc.php');
if (get_value_from_array($_GET, 'year'))
$year = $_GET['year'];
else
$year = $config['FAIRYEAR'];
$q = $pdo->prepare("SELECT * FROM projectcategories WHERE year='$year' ORDER BY id");
$q->execute();
while ($r = $q->fetch(PDO::FETCH_OBJ))
$cats[$r->id] = $r->category;
$q = $pdo->prepare("SELECT * FROM projectdivisions WHERE year='$year' ORDER BY id");
$q->execute();
while ($r = $q->fetch(PDO::FETCH_OBJ))
$divs[$r->id] = $r->division;
$action = get_value_from_array($_GET, 'action');
switch ($action) {
case 'load_row':
$id = intval($_GET['id']);
$q = list_query($year, '', $id);
$r = $q->fetch(PDO::FETCH_OBJ);
print_row($r);
exit;
case 'delete':
$regid = intval($_GET['id']);
$q = $pdo->prepare("SELECT * FROM projects WHERE registrations_id='$regid'");
$q->execute();
if ($q->rowCount()) {
$p = $q->fetch(PDO::FETCH_ASSOC);
$stmt = $pdo->prepare("DELETE FROM winners WHERE projects_id='{$p['id']}'");
$stmt->execute();
}
$stmt = $pdo->prepare("DELETE FROM registrations WHERE id='$regid' AND year='" . $config['FAIRYEAR'] . "'");
$stmt->execute();
$stmt = $pdo->prepare("DELETE FROM students WHERE registrations_id='$regid' AND year='" . $config['FAIRYEAR'] . "'");
$stmt->execute();
$stmt = $pdo->prepare("DELETE FROM projects WHERE registrations_id='$regid' AND year='" . $config['FAIRYEAR'] . "'");
$stmt->execute();
$stmt = $pdo->prepare("DELETE FROM safety WHERE registrations_id='$regid' AND year='" . $config['FAIRYEAR'] . "'");
$stmt->execute();
$stmt = $pdo->prepare("DELETE FROM questions_answers WHERE registrations_id='$regid' AND year='" . $config['FAIRYEAR'] . "'");
$stmt->execute();
$stmt = $pdo->prepare("DELETE FROM mentors WHERE registrations_id='$regid' AND year='" . $config['FAIRYEAR'] . "'");
$stmt->execute();
$stmt = $pdo->prepare("DELETE FROM emergencycontact WHERE registrations_id='$regid' AND year='" . $config['FAIRYEAR'] . "'");
$stmt->execute();
happy_('Registration and all related data successfully deleted');
exit;
}
if ($auth_type == 'committee') {
send_header('Registration Management',
array('Committee Main' => 'committee_main.php',
'Administration' => 'admin/index.php',
'Participant Registration' => 'admin/registration.php'));
} else {
send_header('Student/Project Management',
array('Fair Main' => 'fair_main.php'));
}
?>
<div id="student_editor" title="Student/Project Editor" style="display: none">
<div id="editor_tabs" >
<ul>
<li><a href="#editor_tab_reg"><span><?= i18n('Registration') ?></span></a></li>
<li><a href="#editor_tab_students"><span><?= i18n('Students') ?></span></a></li>
<li><a href="#editor_tab_project"><span><?= i18n('Project') ?></span></a></li>
</ul>
<div id="editor_tab_reg">Loading...
</div>
<div id="editor_tab_students">Loading...</div>
<div id="editor_tab_project">Loading...</div>
</div>
</div>
<script language="javascript" type="text/javascript">
var registrations_id = 0;
var registrations_new = 0;
function popup_editor(id, open_tab)
{
var w = (document.documentElement.clientWidth * 0.9);
var h = (document.documentElement.clientHeight * 0.9);
registrations_id = id;
registrations_new = 0;
if(id == -1) {
open_tab = 'reg';
registrations_new = 1;
}
/* Force no tabs to be selected, need to set collapsible
* to true first */
$('#editor_tabs').tabs('option', 'collapsible', true);
$('#editor_tabs').tabs('option', 'active', -1);
/* Then we'll select a tab to force a reload */
switch(open_tab) {
case 'reg':
/* If we open on the reg tab, disable the others until a save */
$('#editor_tabs').tabs('option', 'disabled', [1,2]);
$('#editor_tabs').tabs('option', 'active', 0);
break;
case 'project':
$('#editor_tabs').tabs('option', 'disabled', []);
$('#editor_tabs').tabs('option', 'active', 2);
break;
default:
$('#editor_tabs').tabs('option', 'disabled', []);
$('#editor_tabs').tabs('option', 'active', 1);
break;
}
/* Don't let anything collapse */
$('#editor_tabs').tabs('option', 'collapsible', false);
/* Show the dialog */
$('#student_editor').dialog('option', 'width', w);
$('#student_editor').dialog('option', 'height', h);
$("#student_editor").dialog('open');
return true;
}
function update_students(numstudents)
{
var id = registrations_id;
var req = "action=students_load&id="+id;
if(numstudents != 0 && numstudents != undefined) req = req+"&numstudents="+numstudents;
$("#editor_tab_students").load("student_editor.php?"+req, '',
function(responseText, textStatus, XMLHttpRequest) {
/* Attach to events we care about */
$("#students_num").change(function() {
var num = $("#students_num").val();
update_students(num);
});
$("#students_save").click(function() {
var id = registrations_id;
$("#debug").load("student_editor.php?action=students_save&id="+id, $("#students_form").serializeArray());
});
$(".students_remove_button").click(function() {
var id = registrations_id;
var sid = $("#"+this.id +"_students_id").val();
var conf = confirmClick('<?= i18n('Are you sure you want to remove this student from the project?') ?>');
if(conf == false) return false;
$("#debug").load("student_editor.php?action=student_remove&id="+id+"&students_id="+sid, '',
function(responseText, textStatus, XMLHttpRequest) {
update_students();
});
return false;
});
}
);
return false;
}
function update_project()
{
var id = registrations_id;
$("#editor_tab_project").load("project_editor.php?action=project_load&id="+id, '',
function(responseText, textStatus, XMLHttpRequest) {
/* Attach to regenerate button */
$("#project_regenerate_number").click(function() {
var id = registrations_id;
/* Call for regen, and when that's done reload the project screen (and rebind everything),
* pass all the form data in, because regen does a save first */
$("#debug").load("project_editor.php?action=project_regenerate_number&id="+id,$("#project_form").serializeArray(),
function(responseText, textStatus, XMLHttpRequest) {
update_project();
});
});
/* Attach to save button */
$("#project_save").click(function() {
var id = registrations_id;
$("#debug").load("project_editor.php?action=project_save&id="+id, $("#project_form").serializeArray());
});
}
);
return false;
}
function delete_registration(id)
{
registrations_id=id;
var conf = confirmClick('<?= i18n('Are you sure you want to completely delete this registration?') ?>');
if(conf == false) return false;
$("#debug").load("<?= $_SERVER['PHP_SELF'] ?>?action=delete&id="+id,{},
function(responseText, textStatus, XMLHttpRequest) {
var id = registrations_id;
$("#row_"+id).remove();
});
}
function update_reg()
{
var id = registrations_id;
$("#editor_tab_reg").load("student_editor.php?action=registration_load&id="+id, '',
function(responseText, textStatus, XMLHttpRequest) {
/* Attach to save button */
$("#registration_save").click(function() {
var id = registrations_id;
$('#debug').load("student_editor.php?action=registration_save&id="+id, $("#registration_form").serializeArray());
/* Enable the other tabs now after a save, FIXME: should be
* after a successful save, but we should use on-the-fly form
* validation to disable the save button, so the extra callback/error
* check isn't needed */
$('#editor_tabs').tabs('option', 'disabled', []);
return false;
});
}
);
return false;
}
$(document).ready(function() {
$("#student_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 */
var id = registrations_id;
if(registrations_new == true) {
/* Create a row before loading it */
$("#registration_list").append("<tr id=\"row_"+id+"\"></tr>");
}
$("#" + $.escapeSelector("row_" + id)).load("<? $_SERVER['PHP_SELF'] ?>?action=load_row&id="+id);
$("#" + $.escapeSelector("row_" + id)).effect('highlight',{},500);
}
});
$("#editor_tabs").tabs({
create: function(event, ui) {
update_students();
update_project();
update_reg();
},
activate: function( event, ui ) {
update_students();
update_project();
update_reg();
},
selected: -1
});
/*$("#editor_tabs").tabs({
show: function(event, ui) {
console.log('hi');
switch(ui.panel.id) {
case 'editor_tab_students':
update_students();
break;
case 'editor_tab_project':
update_project();
break;
case 'editor_tab_reg':
update_reg();
break;
default:
break;
}
},
selected: -1
});*/
$("#newproject").on("click", (function() {
popup_editor(-1);
}
));
});
</script>
<br />
<table width="100%">
<tr><td>
<?= i18n('Choose Status') ?>:
<form name="statuschangerform" method="get" action="registration_list.php">
<select name="showstatus" onchange="document.forms.statuschangerform.submit()">
<?
// if there is no reg fee, then we dont need to show this status, because nobody will ever be in this status
$status_str = array('' => 'Any Status', 'complete' => 'Complete',
'paymentpending' => ($config['regfee'] > 0) ? 'Payment Pending' : '',
'completeorpaymentpending' => ($config['regfee'] > 0) ? 'Complete or Payment Pending' : '',
'open' => 'Open', 'new' => 'New');
$showstatus = $_GET['showstatus'];
foreach ($status_str as $s => $str) {
if ($str == '')
continue;
$sel = ($showstatus == $s) ? 'selected="selected"' : '';
echo "<option $sel value=\"$s\">" . i18n($str) . "</option>\n";
}
?>
</select></form></td>
<td align="right"><button id="newproject"><?= i18n('Create New Project') ?></button></td>
</tr></table>
<?
if ($showstatus) {
switch ($showstatus) {
case 'complete':
$wherestatus = "AND status='complete' ";
break;
case 'paymentpending':
$wherestatus = "AND status='paymentpending' ";
break;
case 'completeorpaymentpending':
$wherestatus = "AND (status='complete' OR status='paymentpending') ";
break;
case 'open':
$wherestatus = "AND status='open' ";
break;
case 'new':
$wherestatus = "AND status='new' ";
break;
default:
$wherestatus = '';
}
} else
$wherestatus = '';
$q = list_query($year, $wherestatus, false);
echo '<table id="registration_list" class="tableview">';
echo "<thead><tr style='background: black';>";
if ($showstatus)
$stat = '&showstatus=' . $showstatus;
echo '<th>' . i18n('Status') . '</th>';
echo '<th>' . i18n('Email Address') . '</th>';
echo '<th>' . i18n('Reg Num') . '</th>';
echo '<th>' . i18n('Proj Num') . '</th>';
echo '<th>' . i18n('Project Title') . '</th>';
echo '<th>' . i18n('Age Category') . '</th>';
echo '<th>' . i18n('Division') . '</th>';
echo '<th>' . i18n('School(s)') . '</th>';
echo '<th>' . i18n('Student(s)') . '</th>';
echo '<th>' . i18n('Flagged') . '</th>';
echo '<th>' . i18n('Action') . '</th>';
echo '</tr></thead>';
while ($r = $q->fetch(PDO::FETCH_OBJ)) {
echo "<tr id=\"row_{$r->reg_id}\">";
print_row($r);
echo '</tr>';
}
echo '</table>';
echo '<br/><br/>The statistics have moved here: <a href="registration_stats.php">Registration Statistics</a><br/><br/>';
send_footer();
/* Now some helper functions we call more than once */
function list_query($year, $wherestatus, $reg_id)
{
global $auth_type, $pdo;
$reg = '';
if ($reg_id != false)
$reg = "AND registrations.id='$reg_id'";
$fair = '';
if ($auth_type == 'fair') {
$fair = "AND projects.fairs_id='{$_SESSION['fairs_id']}'";
}
$q = $pdo->prepare("SELECT registrations.id AS reg_id,
registrations.num AS reg_num,
registrations.status,
registrations.email,
projects.title,
projects.projectnumber,
projects.projectcategories_id,
projects.projectdivisions_id,
projects.feedback,
projects.flagged
FROM
registrations
left outer join projects on projects.registrations_id=registrations.id
WHERE
1
AND registrations.year='$year'
$wherestatus
$reg $fair
ORDER BY
registrations.status DESC, projects.title
");
$q->execute();
// FIXME
show_pdo_errors_if_any($pdo);
return $q;
}
function print_row($r)
{
global $cats, $divs, $config, $year, $pdo;
$status_text = null;
switch (get_value_property_or_default($r, 'status')) {
case 'new':
$status_text = 'New';
break;
case 'open':
$status_text = 'Open';
break;
case 'paymentpending':
$status_text = 'Payment Pending';
break;
case 'complete':
$status_text = 'Complete';
break;
}
$status_text = i18n($status_text);
$scl = 'style="cursor:pointer;" onclick="popup_editor(\'' . get_value_property_or_default($r, 'reg_id') . "','');\"";
$pcl = 'style="cursor:pointer;" onclick="popup_editor(\'' . get_value_property_or_default($r, 'reg_id') . "','project');\"";
echo "<td $scl>{$status_text}</td>";
// echo "<td $scl>" . get_value_property_or_default($r, 'email') . '</td>';
// echo "<td $scl>" . get_value_property_or_default($r, 'reg_num') . '</td>';
// $pn = str_replace(' ', '&nbsp;', get_value_property_or_default($r, 'projectnumber', ''));
// echo "<td $scl>$pn</td>";
// echo "<td $pcl>" . get_value_property_or_default($r, 'title') . '</td>';
// echo "<td $scl>" . i18n(get_value_from_array($cats, get_value_property_or_default($r, 'projectcategories_id'), '')) . '</td>';
// echo "<td $scl>" . i18n(get_value_from_array($divs, get_value_property_or_default($r, 'projectdivisions_id', ''))) . '</td>';
echo "<td $scl>{$r->email}</td>";
echo "<td $scl>{$r->reg_num}</td>";
$pn = str_replace(' ', '&nbsp;', $r->projectnumber);
echo "<td $scl>$pn</td>";
echo "<td $pcl>{$r->title}</td>";
echo "<td $scl>".i18n($cats[$r->projectcategories_id])."</td>";
echo "<td $scl>".i18n($divs[$r->projectdivisions_id])."</td>";
$sq = $pdo->prepare("SELECT students.firstname,
students.lastname,
students.id,
schools.school,
schools.board,
schools.id AS schools_id
FROM
students,schools
WHERE
students.registrations_id='$r->reg_id'
AND
students.schools_id=schools.id
");
$sq->execute();
show_pdo_errors_if_any($pdo);
$studnum = 1;
$schools = '';
$students = '';
while ($studentinfo = $sq->fetch(PDO::FETCH_OBJ)) {
$students .= "$studentinfo->firstname $studentinfo->lastname<br />";
$schools .= "$studentinfo->school <br />";
}
echo "<td $scl>$schools</td>";
echo "<td $scl>$students</td>";
echo '<td align="center" >';
if ($r->flagged == false) {
echo '<a title="' . i18n('Not flagged') . "\" href=\"#\" onClick=\"popup_editor('$r->reg_id','project');\" >";
echo '<img src="' . $config['SFIABDIRECTORY'] . '/images/16/ok.' . $config['icon_extension'] . '" border=0>';
echo '</a>';
} else {
echo '<a title="' . i18n('Flagged') . "\" href=\"#\" onClick=\"popup_editor('$r->reg_id','project');\" >";
echo '<img src="' . $config['SFIABDIRECTORY'] . '/images/16/flagged.' . $config['icon_extension'] . '" border=0>';
echo '</a>';
}
echo '<td align="center" >';
if ($year == $config['FAIRYEAR']) {
echo '<a title="' . i18n('Delete this registration') . "\" href=\"#\" onClick=\"delete_registration({$r->reg_id});return false\" >";
echo '<img src="' . $config['SFIABDIRECTORY'] . '/images/16/button_cancel.' . $config['icon_extension'] . '" border=0>';
echo '</a>';
echo '<form target="_blank" method="post" action="../register_participants.php">';
echo '<input type="hidden" name="action" value="continue">';
echo "<input type=\"hidden\" name=\"email\" value=\"$r->email\">";
echo "<input type=\"hidden\" name=\"regnum\" value=\"$r->reg_num\">";
echo '<input type="submit" value="' . i18n('Login') . '">';
echo '</form>';
}
echo '</td>';
}
?>