science-ation/config/rollover.php
2025-02-09 18:59:35 +00:00

364 lines
13 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-2009 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');
require_once ('../config_editor.inc.php');
user_auth_required('committee', 'config');
send_header('Year Rollover',
array('Committee Main' => 'committee_main.php',
'SFIAB Configuration' => 'config/index.php'),
'rollover_fair_year');
?>
<script language="javascript" type="text/javascript">
function confirmYearRollover()
{
var currentyear=<?= $config['FAIRYEAR'] ?>;
var nextyear=document.forms.rollover.nextfairyear.value;
if(nextyear<currentyear)
alert('You cannot roll backwards in years!');
else if(nextyear==currentyear)
alert('You cannot roll to the same year!');
else
{
var okay=confirm('Are you sure you want to roll the FAIRYEAR from '+currentyear+' to '+nextyear+'? This can not be undone and should only be done if you are absolutely sure!');
if(okay)
return true;
}
return false;
}
</script>
<?
function roll($currentfairyear, $newfairyear, $table, $where = '', $replace = array())
{
global $pdo;
/*
* Field Type Null Key Default Extra
* id int(10) unsigned NO PRI NULL auto_increment
* sponsors_id int(10) unsigned NO MUL 0
* award_source_fairs_id int(10) unsigned YES NULL
*/
/* Get field list for this table */
$q = $pdo->prepare("SHOW COLUMNS IN $table");
$q->execute();
show_pdo_errors_if_any($pdo);
while (($c = $q->fetch(PDO::FETCH_ASSOC))) {
$col[$c['Field']] = $c;
}
/* Record fields we care about */
$fields = array();
$keys = array_keys($col);
foreach ($keys as $k) {
/* Skip id field */
if ($col[$k]['Extra'] == 'auto_increment')
continue;
/* Skip year field */
if ($k == 'year')
continue;
$fields[] = $k;
}
if ($where == '')
$where = '1';
/* Get data */
$q = $pdo->prepare("SELECT * FROM $table WHERE year=? AND $where");
$q->execute([$currentfairyear]);
show_pdo_errors_if_any($pdo);
$names = '`' . join('`,`', $fields) . '`';
/* Process data */
while ($r = $q->fetch(PDO::FETCH_ASSOC)) {
$vals = '';
foreach ($fields as $f) {
if (array_key_exists($f, $replace))
$vals .= ',' . $pdo->quote($replace[$f]);
else if ($col[$f]['Null'] == 'YES' && $r[$f] == NULL)
$vals .= ',NULL';
else
$vals .= ',' . $pdo->quote($r[$f]);
}
$stmt = $pdo->prepare("INSERT INTO `$table` (`year`,?) VALUES (?,?)");
$stmt->execute([$names,$newfairyear,$vals]);
show_pdo_errors_if_any($pdo);
}
}
if (get_value_from_array($_POST, 'action') == 'rollover' && get_value_from_array($_POST, 'nextfairyear')) {
$newfairyear = intval(get_value_from_array($_POST, 'nextfairyear'));
$currentfairyear = intval($config['FAIRYEAR']);
$cy = $currentfairyear;
$ny = $newfairyear;
if ($newfairyear < $currentfairyear)
echo error(i18n('You cannot roll backwards in years!'));
else if ($newfairyear == $currentfairyear)
echo error(i18n('You cannot roll to the same year!'));
else {
// okay here we go! this is going to get to be a pretty big script me thinks!
// first, lets do all of the configuration variables
echo i18n('Rolling configuration variables') . '<br />';
config_update_variables($newfairyear, $currentfairyear);
// now the dates
echo i18n('Rolling dates') . '<br />';
$q = $pdo->prepare("SELECT DATE_ADD(date,INTERVAL 365 DAY) AS newdate,name,description FROM dates WHERE year=?");
$q->execute([$currentfairyear]);
show_pdo_errors_if_any($pdo);
while ($r = $q->fetch(PDO::FETCH_OBJ)) {
$stmt = $pdo->prepare("INSERT INTO dates (date,name,description,year) VALUES (
?,
?,
?,
?)");
$stmt->execute([$r->newdate,$r->name,$r->description,$newfairyear]);
show_pdo_errors_if_any($pdo);
}
// page text
echo i18n('Rolling page texts') . '<br />';
$q = $pdo->prepare("SELECT * FROM pagetext WHERE year=?");
$q->execute([$currentfairyear]);
show_pdo_errors_if_any($pdo);
while ($r = $q->fetch(PDO::FETCH_OBJ)) {
$stmt = $pdo->prepare("INSERT INTO pagetext (textname,textdescription,text,lastupdate,year,lang) VALUES (
?,
?,
?,
?,
?,
?)");
$stmt->execute([$r->textname,$r->textdescription,$r->text,$r->lastupdate,$newfairyear,$r->lang]);
show_pdo_errors_if_any($pdo);
}
echo i18n('Rolling project categories') . '<br />';
// project categories
$q = $pdo->prepare("SELECT * FROM projectcategories WHERE year=?");
$q->execute([$currentfairyear]);
show_pdo_errors_if_any($pdo);
while ($r = $q->fetch(PDO::FETCH_OBJ)) {
$stmt = $pdo->prepare("INSERT INTO projectcategories (id,category,category_shortform,mingrade,maxgrade,year) VALUES (
?,
?,
?,
?,
?,
?)");
$stmt->execute([$r->id,$r->category,$r->category_shortform,$r->mingrade,$r->maxgrade,$newfairyear]);
show_pdo_errors_if_any($pdo);
}
echo i18n('Rolling project divisions') . '<br />';
// project divisions
$q = $pdo->prepare("SELECT * FROM projectdivisions WHERE year=?");
$q->execute([$currentfairyear]);
show_pdo_errors_if_any($pdo);
while ($r = $q->fetch(PDO::FETCH_OBJ)) {
$stmt = $pdo->prepare("INSERT INTO projectdivisions (id,division,division_shortform,cwsfdivisionid,year) VALUES (
?,
?,
?,
?,
?)");
$stmt->execute([$r->id,$r->division,$r->division_shortform,$r->cwsfdivisionid,$newfairyear]);
show_pdo_errors_if_any($pdo);
}
echo i18n('Rolling project category-division links') . '<br />';
// project categories divisions links
$q = $pdo->prepare("SELECT * FROM projectcategoriesdivisions_link WHERE year=?");
$q->execute([$currentfairyear]);
show_pdo_errors_if_any($pdo);
while ($r = $q->fetch(PDO::FETCH_OBJ)) {
$stmt = $pdo->prepare("INSERT INTO projectcategoriesdivisions_link (projectdivisions_id,projectcategories_id,year) VALUES (
?,
?,
?)");
$stmt->execute([$r->projectdivisions_id,$r->projectcategories_id ,$newfairyear]);
show_pdo_errors_if_any($pdo);
}
echo i18n('Rolling project sub-divisions') . '<br />';
// project subdivisions
$q = $pdo->prepare("SELECT * FROM projectsubdivisions WHERE year=?");
$q->execute([$currentfairyear]);
show_pdo_errors_if_any($pdo);
while ($r = $q->fetch(PDO::FETCH_OBJ)) {
$stmt = $pdo->prepare("INSERT INTO projectsubdivisions (id,projectdivisions_id,subdivision,year) VALUES (
?,
?,
?,
?)");
$stmt->execute([$r->id,$r->projectsubdivisions_id,$r->subdivision,$newfairyear]);
show_pdo_errors_if_any($pdo);
}
echo i18n('Rolling safety questions') . '<br />';
// safety questions
$q = $pdo->prepare("SELECT * FROM safetyquestions WHERE year=?");
$q->execute([$currentfairyear]);
show_pdo_errors_if_any($pdo);
while ($r = $q->fetch(PDO::FETCH_OBJ)) {
$stmt = $pdo->prepare("INSERT INTO safetyquestions (question,type,required,ord,year) VALUES (
?,
?,
?,
?,
?");
$stmt->execute([$r->question,$r->type,$r->required ,$r->ord,$newfairyear]);
show_pdo_errors_if_any($pdo);
}
echo i18n('Rolling awards') . '<br />';
// awards
$q = $pdo->prepare("SELECT * FROM award_awards WHERE year=?");
$q->execute([$currentfairyear]);
show_pdo_errors_if_any($pdo);
while ($r = $q->fetch(PDO::FETCH_OBJ)) {
/* Roll the one award */
roll($cy, $ny, 'award_awards', "id='{$r->id}'");
$award_awards_id = $pdo->lastInsertId();
roll($cy, $ny, 'award_awards_projectcategories', "award_awards_id='{$r->id}'",
array('award_awards_id' => $award_awards_id));
roll($cy, $ny, 'award_awards_projectdivisions', "award_awards_id='{$r->id}'",
array('award_awards_id' => $award_awards_id));
echo i18n('&nbsp; Rolling award prizes') . '<br />';
roll($cy, $ny, 'award_prizes', "award_awards_id='{$r->id}'",
array('award_awards_id' => $award_awards_id));
}
echo i18n('Rolling award types') . '<br />';
// award types
$q = $pdo->prepare("SELECT * FROM award_types WHERE year=?");
$q->execute([$currentfairyear]);
show_pdo_errors_if_any($pdo);
while ($r = $q->fetch(PDO::FETCH_OBJ)) {
$stmt = $pdo->prepare("INSERT INTO award_types (id,type,`order`,year) VALUES (
?,
?,
?,
?)");
$stmt->execute([$r->id,$r->type,$r->order,$newfairyear]);
show_pdo_errors_if_any($pdo);
}
echo i18n('Rolling schools') . '<br />';
// award types
$q = $pdo->prepare("SELECT * FROM schools WHERE year=?");
$q->execute([$currentfairyear]);
show_pdo_errors_if_any($pdo);
while ($r = $q->fetch(PDO::FETCH_OBJ)) {
$puid = ($r->principal_uid == null) ? 'NULL' : ("'" . intval($r->principal_uid) . "'");
$shuid = ($r->sciencehead_uid == null) ? 'NULL' : ("'" . intval($r->sciencehead_uid) . "'");
$stmt = $pdo->prepare('INSERT INTO schools (school, schoollang, schoollevel, board, district, phone, fax, address, city, province_code, postalcode, principal_uid, schoolemail, sciencehead_uid, accesscode, lastlogin, junior, intermediate, senior, registration_password, projectlimit, projectlimitper, year) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, ?, ?, ?)');
$stmt->execute([$r->school, $r->schoollang, $r->schoollevel, $r->board, $r->district, $r->phone, $r->fax, $r->address, $r->city, $r->province_code, $r->postalcode, $puid, $r->schoolemail, $shuid, $r->accesscode, $r->junior, $r->intermediate, $r->senior, $r->registration_password, $r->projectlimit, $r->projectlimitper, $newfairyear]);
show_pdo_errors_if_any($pdo);
}
echo i18n('Rolling questions') . '<br />';
$q = $pdo->prepare("SELECT * FROM questions WHERE year=?");
$q->execute([$currentfairyear]);
show_pdo_errors_if_any($pdo);
while ($r = $q->fetch(PDO::FETCH_OBJ)) {
$stmt = $pdo->prepare("INSERT INTO questions (id, year, section, db_heading, question, type, required, ord) VALUES ('', ?, ?, ?, ?, ?, ?, ?)");
$stmt->execute([$newfairyear, $r->section, $r->db_heading, $r->question, $r->type, $r->required, $r->ord]);
show_pdo_errors_if_any($pdo);
}
// regfee items
echo i18n('Rolling registration fee items') . '<br />';
roll($cy, $ny, 'regfee_items');
// volunteer positions
echo i18n('Rolling volunteer positions') . '<br />';
roll($cy, $ny, 'volunteer_positions');
// timeslots and rounds
echo i18n('Rolling judging timeslots and rounds') . '<br />';
$q = $pdo->prepare("SELECT * FROM judges_timeslots WHERE year=? AND round_id='0'");
$q->execute([$currentfairyear]);
show_pdo_errors_if_any($pdo);
while ($r = $q->fetch(PDO::FETCH_ASSOC)) {
$d = $newfairyear - $currentfairyear;
$stmt = $pdo->prepare("INSERT INTO judges_timeslots (`year`,`round_id`,`type`,`date`,`starttime`,`endtime`,`name`)
VALUES (?,'0',?,DATE_ADD(?, INTERVAL ? YEAR),
?,?,?)");
$stmt->execute([$newfairyear,$r['type'],$r['date'],$d,$r['starttime'],$r['endtime'],$r['name']]);
show_pdo_errors_if_any($pdo);
$round_id = $pdo->lastInsertId();
$qq = $pdo->prepare("SELECT * FROM judges_timeslots WHERE round_id=?");
$qq->execute([$r['id']]);
show_pdo_errors_if_any($pdo);
while ($rr = $qq->fetch(PDO::FETCH_ASSOC)) {
$stmt = $pdo->prepare("INSERT INTO judges_timeslots (`year`,`round_id`,`type`,`date`,`starttime`,`endtime`)
VALUES (?,?,'timeslot',DATE_ADD(?, INTERVAL ? YEAR),
?,?)");
$stmt->execute([$newfairyear,$round_id,$rr['date'],$d,$rr['starttime'],$rr['endtime']]);
show_pdo_errors_if_any($pdo);
}
}
echo '<br /><br />';
$stmt = $pdo->prepare("UPDATE config SET val=? WHERE var='FAIRYEAR' AND year=0");
$stmt->execute([$newfairyear]);
show_pdo_errors_if_any($pdo);
echo happy(i18n('Fair year has been rolled over from %1 to %2', array($currentfairyear, $newfairyear)));
send_footer();
exit;
}
}
echo '<br />';
echo '<a href="backuprestore.php">' . i18n('You should consider making a database backup before rolling over, just in case!') . "</a><br />\n";
echo '<br />';
echo '<form name="rollover" method="post" action="rollover.php" onsubmit="return confirmYearRollover()">';
echo '<input type="hidden" name="action" value="rollover" />';
echo i18n('Current Fair Year') . ': <b>' . $config['FAIRYEAR'] . '</b><br />';
$nextfairyear = $config['FAIRYEAR'] + 1;
echo i18n('Next Fair Year') . ": <input size=\"8\" type=\"text\" name=\"nextfairyear\" value=\"$nextfairyear\" />";
echo '<br />';
echo '<input type="submit" value="' . i18n('Rollover Fair Year') . '" />';
echo '</form>';
send_footer();
?>