2011-04-14 21:32:18 +00:00
< ? php
/*
This file is a plug - in to the 'Science Fair In A Box' project
SFIAB Website : http :// www . sfiab . ca
Copyright ( C ) 2011 At Work Software ( dennis @ spanogle . net >
Copyright ( C ) 2011 Dennis Spanogle < dennis @ spanogle . net >
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 .
*/
?>
<! DOCTYPE html PUBLIC " -//W3C//DTD XHTML 1.0 Transitional//EN " " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd " >
< html xmlns = " http://www.w3.org/1999/xhtml " xml : lang = " en " >
2011-05-01 22:33:56 +00:00
< head >< title > SFIAB Evaluations Link </ title >
2011-04-14 21:32:18 +00:00
< link rel = " stylesheet " href = " sfiab.css " type = " text/css " />
</ head >
< body >
< ? php
include " sfiab_common.inc.php " ; // check SFIAB install and get config etc.
include " eval_common.inc.php " ; // check Evaluations setup and get eval_config
include " eval_menu_inc.php " ;
2011-05-01 22:33:56 +00:00
echo " <h2>Link Evaluations and SFIAB Data</h2><br /><br /> " ;
2011-04-14 21:32:18 +00:00
echo " <br /><br /> " ;
$errors = 0 ;
2011-05-01 22:33:56 +00:00
echo " Click the button to link SFIAB and Evaluations. (Be patient, may take a while) " ;
echo " <form method= \" post \" action= \" eval_link_sfiab.php \" > " ;
echo " <input type= \" hidden \" name= \" action \" value= \" link \" /> " ;
echo " <br /> " ;
echo " <input type= \" submit \" value= \" Link Now \" > " ;
echo " </form> " ;
2011-04-14 21:32:18 +00:00
if ( ! $_POST [ 'action' ] == " link " )
{
exit ;
}
2011-05-01 22:33:56 +00:00
echo " Linking Process complete - status follows:<br /><br /> " ;
2011-04-14 21:32:18 +00:00
// get the eval_scheme id and eval_schemes.assignto_project_when fields
$q = mysql_query ( " SELECT * FROM eval_schemes " );
if ( ! q ){
echo " ERROR: Cannot open eval_schemes. You must have schemes set up prior to linking " ;
exit ;
}
// build an array of eval_schemes table
while ( $r = mysql_fetch_object ( $q ))
{
$crit = $r -> assignto_project_when ;
$words = explode ( ' ' , $crit ); //this should get the parameter, '+' and the value
//echo "".$r->scheme_id." ".$words[0]." ".$words[1]." ".$words[2]."<br />";
$schmidval = $r -> scheme_id ;
$schemes [] = array ( $schmidval , $words [ 0 ], $words [ 1 ], $words [ 2 ]);
}
/*
For now , the evaluations are done by the teams ( judges_teams_id ) - one evaluation per divisional round perhaps .
the table judges_teams_timeslots_projects_link contains the necessary fields 'Projects_id' and 'judges_teams_id'
Eventually perhaps Another table - eval_project_assignements will link 'Who does the eval' to the 'Projects_id' to be evaluated .
table eval_projects_entries has :
Judges_teams_id ( this will be always be set to a judges_teams_id whick I will assume for now is always > 0 )
Judge_user_id ( this will be set to 0 to indicate we use judges_teams . set > 0 if we use individual judges later .. ) criteria_id ( this is which evaluation criteria is being entered ( entered by team or upload or ... null => no entry )
level_id ( this is the score - entered as an Id so we can get the value and calculate a score generically . null => no entry )
( A ) Using sfiab projects table and eval_projects table .
1. ) For each project in SFIAB
if project . id in eval_projects then verify entries ( judges , team etc ) and update
if not in eval_projects do link ( insert row in eval_projects ) and fill in entries ( judges , team etc .
entries : project_id ; team ( also scheme_id <-- setup ); eval_score ; final_score ; eval_score_status ; overall_status ) set scheme_id according to the values in eval_schemes . assignto_project_when fields ( something = something )
2. ) For each project in eval_projects
if project_id NOT in SFIAB then remove from eval_projects
( B ) Using judges_teams_timeslots_projects_link and eval_projects_entries .
See if eval_projects_entries has any entries => any criteria_id and or level_id will have non - null entries
If NO then : Empty the table and reload it from judges_teams_timeslots_projects_links SFIAB table
If YES then :
1 Remove all records in eval_projects_entries without entries
2 See if we can save the ones with entries .
For each record with an entry criteria_id or level_id
If matching team / project in SFIAB then leave it
If not matching team / project in SFIAB then remove it
3. For each record in judges_teams_timeslots_projects_links
If same project , team in eval then skip ( have record and have entry )
else add record .
this for later ? ? or remove
SELECT Exhibitors . Exhibit_ID , Exhibits . EXN , Exhibits . Exhibit_ID AS Expr1 , Exhibitors . UserId
FROM Exhibitors LEFT OUTER JOIN
Exhibits ON Exhibitors . Exhibit_ID = Exhibits . Exhibit_ID
*/
// projects has projectcategories_id ( ) and projectdivisions_id ( ) and as possible scheme setups valuse
// Students has grade as possilbe scheme setup values
// ************************ NOTE This gets ALL projects, even those not assigned to a judge team(open versus complete) *******************************
$qst = " SELECT students.registrations_id, projects.registrations_id, projects.id, projects.shorttitle, students.grade, " ;
$qst = $qst . " projects.projectcategories_id, projects.projectdivisions_id, projects.cwsfdivisionid " ;
$qst = $qst . " FROM students LEFT OUTER JOIN projects ON students.registrations_id = projects.registrations_id ORDER by projects.id " ;
// note the sort order is important if my code works to discover teams
$nscnt = 0 ;
$nprj = 0 ;
$ns = 0 ;
$pid = - 1 ;
//echo $qst;
$q = mysql_query ( $qst );
if ( $q ) {
while ( $r = mysql_fetch_object ( $q ))
{
$ns += 1 ; // count students
$cwdiv = $r -> cwsfdivisionid ;
$grade = $r -> grade ;
$divid = $r -> projectdivisions_id ;
$cat = $r -> projectcategories_id ;
if ( $r -> id == $pid ){
// we already did this project but... it is a team project since # students > 1
if ( $r -> grade > $grade ) {
$grade = $r -> grade ; // always select the highest grade in the team (matched help.html)
}
$team = " yes " ;
}
else {
// project.id changed so save the last one
// but only if see if we did the save
if ( $pid == - 1 ){
$pid = $r -> id ; // setup first time
//echo "Did First time pid = ".$pid." <br />";
$team = " no " ;
}
else {
// done with last so save it (note does not save the last one.
$nprj += 1 ; // count projects
insert_project ( $schemes , $pid , $divid , $team , $cat , $grade , $cwdiv );
// get ready for the next
$pid = $r -> id ;
$team = " no " ;
}
}
}
$nprj += 1 ; // count projects
insert_project ( $schemes , $pid , $divid , $team , $cat , $grade , $cwdiv );
}
else {
echo ( '<br/>Error performing query!<br/>' . $qst . '<br/> mysqlerror: ' . mysql_error () . '<br /><br />' );
echo " <br />Query failed<br /> " ;
$errors += 1 ;
}
if ( errors == 0 ){
echo " SFIAB has " . $ns . " Students and " . $nprj . " Projects. <br /> " ;
echo " <br />Evaluations links to SFIAB have been updated!<br /> " ;
echo " This means:<br /> " ;
echo " ** Each Project in SFIAB is now included in Evaluations' data.<br /> " ;
echo " ** Projects removed from SFIAB since the last link-up were removed from Evaluations' data.<br /> " ;
echo " Note: Project evaluations entered (if any) were retained! SFIAB projects 'newly added' will have no evaluation entries.<br /> " ;
echo " <br /> " ;
}
else {
echo " There were errors! Review the notices and correct the problems!<br /> " ;
}
// **************** create/ update the eval_projects_entries table *************************
// now see if any extra records in local table (not in SFIAB) to delete - remember eval_projects contains ALL projects, not just those complete.
$loc = mysql_query ( " SELECT project_id from eval_projects " ); // All projects = even those not assigned a judge team
while ( $lr = mysql_fetch_object ( $loc ))
{
$q = mysql_query ( " SELECT id FROM projects WHERE id = ' " . $lr -> project_id . " ' " );
$remr = mysql_fetch_object ( $q ) -> id ;
if ( mysql_num_rows ( $q ) == 0 ){ // will probably find 2 for project_id = 0 (due to way $qst is formed above
$del = mysql_query ( " DELETE from eval_projects WHERE project_id = ' " . $lr -> project_id . " ' " );
if ( ! $del ){
echo " delete error project_id= " . $lr -> project_id . " <br /> " ;
}
else {
echo " Deleted project_id " . $lr -> project_id . " from evaluations data.<br /> " ;
}
}
}
// could have some records left for projects that are not complete if.. was complete, then had an evaluation, then was set as incomplete
// I will not worry about this at this time.
// *****************************************************************************************************
// Now do the work on eval_projects_entries table using SFIAB judges_teams_timeslots_projects_links
echo " <br />Updating Projects Evaluations Entries! <br /> " ;
$num_entries = 0 ;
$chknum_entries = 0 ;
// First delete all entries without evaluations
$q = mysql_query ( " DELETE FROM eval_projects_entries WHERE level_id IS NULL " );
if ( ! q ){
echo " Error opening table eval_projects_entries " ;
exit ;
}
$qst = " SELECT * FROM eval_projects_entries WHERE level_id IS NOT NULL " ;
$q = mysql_query ( $qst );
if ( ! q ){
echo " Error opening table eval_projects_entries " ;
exit ;
}
else {
if ( mysql_num_rows ( $q ) > 0 ){ // will probably find 2 for project_id = 0 (due to way $qst is formed above
// Have records
$num_entries = mysql_num_rows ( $q );
echo " Found " . $num_entries . " records with entries<br /> " ;
// now see if those left have entries in judges_teams_timeslots_projects_link
// if not, then they also can be deleted
$q = mysql_query ( $qst );
while ( $r = mysql_fetch_object ( $q )) {
$qeval = mysql_query ( " SELECT * FROM judges_teams_timeslots_projects_link WHERE projects_id = ' $r->project_id ' AND judges_teams_id = ' $r->judges_teams_id ' " ); // find matching entry
if ( mysql_num_rows ( $qeval ) == 0 ){
echo " project_id andjudge_team_id not in SFIAB so removed<br /> " ;
$qremove = mysql_query ( " DELETE FROM eval_projects_entries WHERE project_id = ' $r->project_id ' AND judges_teams_id = ' $r->judges_teams_id ' " );
}
}
}
else {
echo " Good! No recores had entries<br /> " ;
}
}
// Add all records from judges_teams_timeslots_projects_links NOT in eval_projects_entries
$q = mysql_query ( " SELECT * FROM judges_teams_timeslots_projects_link " );
$count = 0 ;
while ( $r = mysql_fetch_object ( $q )) {
//$skip = 0;
//$qeval = mysql_query($qst); // find all with level_id entries
//while($reval=mysql_fetch_object($qeval)) {
// if($reval->project_id == $r->projects_id ){
// if($reval->judges_teams_id == $r->judges_teams_id) {
// $skip = 1; // found this one with at least one level_id entry non-null entries so do not add it
// }
// }
//}
//if ($skip == 0){
// insert a record for each criteria ID that does NOT have a current level_id non null. New entries level_id will be set null
// for the project, get the scheme id.
$qprj = mysql_query ( " SELECT * FROM eval_projects WHERE project_id = ' " . $r -> projects_id . " ' " );
if ( $qprj ){
// for the scheme id get all the criteria ids
while ( $rprj = mysql_fetch_object ( $qprj )) {
$qcrit = mysql_query ( " SELECT * FROM eval_criteria WHERE scheme_id = ' " . $rprj -> scheme_id . " ' " );
if ( $qcrit ){
while ( $rcrit = mysql_fetch_object ( $qcrit )) {
// find this record (project, Team, criteria has an entry for level_id)
if ( $num_entries > 0 ){ // no sense checking if no evaluations done at start.
$qcheck = mysql_query ( " SELECT * FROM eval_projects_entries WHERE project_id=' " . $r -> projects_id . " ' AND judges_teams_id = ' " . $r -> judges_teams_id . " ' AND criteria_id =' " . $rcrit -> criteria_id . " ' " );
if ( mysql_num_rows ( $qcheck ) > 0 ) {
$chknum_entries += 1 ;
}
else {
$qadd = mysql_query ( " INSERT INTO eval_projects_entries (project_id, judges_teams_id, judges_timeslots_id, criteria_id) VALUES (' $r->projects_id ', ' $r->judges_teams_id ', ' $r->judges_timeslots_id ', ' $rcrit->criteria_id ' ) " );
$count += 1 ;
}
} // if ($num_entries > 0)
else {
$qadd = mysql_query ( " INSERT INTO eval_projects_entries (project_id, judges_teams_id, judges_timeslots_id, criteria_id) VALUES (' $r->projects_id ', ' $r->judges_teams_id ', ' $r->judges_timeslots_id ', ' $rcrit->criteria_id ' ) " );
$count += 1 ;
} // else (if ($num_entries > 0)
} // while $rcrit
} // if $qcrit
} // while $rprj
} // if $qprj
//}
else {
//echo "skipped<br />";
$skipped += 1 ;
}
}
if ( $chknum_entries == $num_entries ){
echo " <br />Eval_projects_entries updated! " . $num_entries . " evaluation entries were retained. Total evals to do = " . ( $count + $num_entries ) . " <br /> " ;
}
else {
echo " <br />ERROR num_entries = " . $num_entries . " not same as check of num_entries = " . $chknum_entries . " <br /> " ;
}
exit ;
// ******************************** function to insert or update eval_projects table ****************************
function insert_project ( $schemes , $pid , $div , $team , $cat , $grade , $cwdiv )
{
/*
if this project is in eval_projects then update scheme_id , team ( leaves eval_score , etc )
if this project is NOT in eval_projects then insert project_id , team , scheme_id
if this project is in eval_projects_entries then update judges_teams_id , judges_timeslots_id , judge_user_id
( leave entries criteria_id , level_id )
if this project is NOT in eval_projects_entries then insert project_id , judges_teams_id , judges_timeslots_id , judge_user_id
*/
// see if any of the possible selection parameters for this project are matched to a scheme (see help)
// The $schemes array and example
// id par con val
// 0 1 2 3
// 1 team = no
// 2 team = yes
$proj_scheme_id = 9999 ; //set this as the default in case we find no matches
foreach ( $schemes as $sch )
{
$match = 0 ;
// get the parameter
$par = $sch [ 1 ];
//get the condition
$con = $sch [ 2 ];
// get the value
$val = $sch [ 3 ];
// see if this project's values matches the parameter and condition
// for the example above this will set proj_scheme_id to 1 for team=no 2 for team=yes
if ( $par == 'team' ){ // there is a team condition in schemes
if ( $con == " = " ){
if ( $team == $val ){ // is this projects team setting = scheme setting 'yes' or 'no'
$proj_scheme_id = $sch [ 0 ];
escape ;
}
}
if ( $con == '!=' ){
if ( $team != $val ){ // is this projects team setting != scheme setting != 'yes' or != 'no'
$proj_scheme_id = $sch [ 0 ];
escape ;
}
}
if ( $con == '<' ){
if ( $team < $val ){ // is this projects team setting < scheme setting of 'yes' or 'no'
$proj_scheme_id = $sch [ 0 ];
escape ;
}
}
if ( $con == '>' ) {
if ( $team > $val ){ // is this projects team setting > scheme setting of 'yes' or 'no'
$proj_scheme_id = $sch [ 0 ];
escape ;
}
}
}
if ( $par == 'div' ){
if ( $con == " = " ){
if ( $div == $val ){ // is this projects division setting = the setting in a scheme
$proj_scheme_id = $sch [ 0 ];
escape ;
}
}
if ( $con == '!=' ){
if ( $div != $val ){ // is this projects division setting != the setting in a scheme
$proj_scheme_id = $sch [ 0 ];
escape ;
}
}
if ( $con == '<' ){
if ( $div < $val ){ // is this projects division setting <t he setting in a scheme
$proj_scheme_id = $sch [ 0 ];
escape ;
}
}
if ( $con == '>' ) {
if ( $div > $val ){ // is this projects division setting > the setting in a scheme
$proj_scheme_id = $sch [ 0 ];
escape ;
}
}
}
if ( $par == 'cat' ){
if ( $con == " = " ){
if ( $cat == $val ){ // is this projects category setting = the setting in a scheme
$proj_scheme_id = $sch [ 0 ];
escape ;
}
}
if ( $con == '!=' ){
if ( $cat != $val ){ // is this projects category setting != the setting in a scheme
$proj_scheme_id = $sch [ 0 ];
escape ;
}
}
if ( $con == '<' ){
if ( $cat < $val ){ // is this projects category setting = the setting in a scheme
$proj_scheme_id = $sch [ 0 ];
escape ;
}
}
if ( $con == '>' ) {
if ( $cat > $val ){ // is this projects category setting = the setting in a scheme
$proj_scheme_id = $sch [ 0 ];
escape ;
}
}
}
if ( $par == 'grade' ){
if ( $con == " = " ){
if ( $grade == $val ){ // is this projects team grade = the setting in a scheme
$proj_scheme_id = $sch [ 0 ];
escape ;
}
}
if ( $con == '!=' ){
if ( $grade != $val ){
$proj_scheme_id = $sch [ 0 ];
escape ;
}
}
if ( $con == '<' ){
if ( $grade < $val ){
$proj_scheme_id = $sch [ 0 ];
escape ;
}
}
if ( $con == '>' ) {
if ( $grade > $val ){
$proj_scheme_id = $sch [ 0 ];
escape ;
}
}
}
if ( $par == 'cwdiv' ){ // check the canada wide div id = scheme setting for cwdiv.
if ( $con == " = " ){
if ( $cwdiv == $val ){
$proj_scheme_id = $sch [ 0 ];
escape ;
}
}
if ( $con == '!=' ){
if ( $cwdiv != $val ){
$proj_scheme_id = $sch [ 0 ];
escape ;
}
}
if ( $con == '<' ){
if ( $cwdiv < $val ){
$proj_scheme_id = $sch [ 0 ];
escape ;
}
}
if ( $con == '>' ) {
if ( $cwdiv > $val ){
$proj_scheme_id = $sch [ 0 ];
escape ;
}
}
}
}
// echo "Save Scheme= ".$proj_scheme_id." Save pid= ".$pid." Team= ".$team." div= ".$div." cat= ".$cat." grade= ".$grade." cwdiv= ".$cwdiv."<br />";
// ready to update or add the eval_projects table entry
// See if a record for this project ID
$ev = mysql_query ( " SELECT * FROM eval_projects WHERE project_id = $pid " );
if ( mysql_num_rows ( $ev ) > 0 ) {
//echo "found - updating<br />";
$ev = mysql_query ( " UPDATE eval_projects SET team = ' $team ', scheme_id = ' $proj_scheme_id ' WHERE project_id = $pid " );
echo mysql_error ();
}
else {
// echo "not found - adding<br />";
$ev = mysql_query ( " INSERT INTO eval_projects (project_id, team, scheme_id) VALUES (' $pid ', ' $team ', ' $proj_scheme_id ') " );
echo mysql_error ();
}
/* keep this code here until I copy it to the score entry routines
// DO NOT .. Do the same for table eval_projects_entries
// Every entry into this table must be done when we know the values for criteria_id and value-id
// because these are the entries from a judge or team or... so then... we enter the judges_team_id and timeslot
//or... in an optional method of assigning judges the judge_user_id
$ev = mysql_query ( " SELECT * FROM eval_projects_entries WHERE project_id = $pid " );
if ( mysql_num_rows ( $ev ) > 0 ) {
//echo "found - updating<br />";
$ev = mysql_query ( " UPDATE eval_projects_entries SET judges_teams_id = ' $judges_teams_id ', judges_timeslots_id = ' $judges_timeslots_id ', judge_user_id = ' $judge_user_id ' WHERE project_id = $pid " );
echo mysql_error ();
}
else {
// echo "not found - adding<br />";
$ev = mysql_query ( " INSERT INTO eval_projects_entries (project_id, judges_teams_id, judges_timeslots_id, judge_user_id ) VALUES (' $pid ', ' $judges_teams_id ', ' $judges_timeslots_id ', ' $judge_user_id ') " );
echo mysql_error ();
}
*/
}
?>
</ body >