* Copyright (C) 2005 James Grant * Copyright (C) 2024 AlgoLibre Inc. * Copyright (C) 2009 David Grant * * 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. */ ?> prepare("SELECT * FROM fairs_stats WHERE fairs_id='{$u['fairs_id']}' AND year='$year'"); $q->execute(); $response['stats'] = $q->fetch(PDO::FETCH_ASSOC); unset($response['stats']['id']); $response['error'] = 0; } function handle_stats(&$u, $fair, &$data, &$response) { global $pdo; $stats = $data['stats']; foreach ($stats as $k => $v) { $stats[$k] = $stats[$k]; } // $str = join(',',$stats); $keys = '`fairs_id`,`' . join('`,`', array_keys($stats)) . '`'; $vals = "'{$u['fairs_id']}','" . join("','", array_values($stats)) . "'"; $stmt = $pdo->prepare("DELETE FROM fairs_stats WHERE fairs_id='{$u['fairs_id']}' AND year='{$stats['year']}'"); $stmt->execute(); show_pdo_errors_if_any($pdo); $stmt = $pdo->prepare("INSERT INTO fairs_stats (`id`,$keys) VALUES ('',$vals)"); $stmt->execute(); show_pdo_errors_if_any($pdo); $response['message'] = 'Stats saved'; $response['error'] = 0; } function handle_getawards(&$u, $fair, &$data, &$response) { global $pdo; $awards = array(); $year = $data['getawards']['year']; $ids = array(); /* Load a list of awards linked to the fair id */ $q = $pdo->prepare("SELECT * FROM fairs_awards_link WHERE fairs_id='{$fair['id']}'"); $q->execute(); while ($r = $q->fetch(PDO::FETCH_ASSOC)) { $aaid = $r['award_awards_id']; if ($r['download_award'] == 'yes') $ids[] = $aaid; $ul[$aaid] = $r['upload_winners']; } /* Load the awards this fair is allowed to download */ $where = "(id='" . join("' OR id='", $ids) . "')"; $q = $pdo->prepare("SELECT * FROM award_awards WHERE $where AND year='$year'"); $q->execute(); while ($a = $q->fetch(PDO::FETCH_ASSOC)) { $award = array(); $award['identifier'] = $a['external_identifier']; $award['external_additional_materials'] = $a['external_additional_materials']; $award['external_register_winners'] = $a['external_register_winners']; $award['year'] = $a['year']; $award['name_en'] = $a['name']; $award['criteria_en'] = $a['criteria']; $award['upload_winners'] = $ul[$a['id']]; $award['self_nominate'] = $a['self_nominate']; $award['schedule_judges'] = $a['schedule_judges']; if ($a['sponsors_id']) { $sq = $pdo->prepare("SELECT * FROM sponsors WHERE id='{$a['sponsors_id']}'"); $sq->execute(); if ($sq->rowCount()) { $s = $sq->fetch(PDO::FETCH_ASSOC); $award['sponsor'] = $s['organization']; } } $award['prizes'] = array(); $pq = $pdo->prepare("SELECT * FROM award_prizes WHERE award_awards_id='{$a['id']}'"); $pq->execute(); while ($p = $pq->fetch(PDO::FETCH_ASSOC)) { /* Map array keys -> local database field */ $map = array( 'cash' => 'cash', 'scholarship' => 'scholarship', 'value' => 'value', 'prize_en' => 'prize', 'number' => 'number', 'ord' => 'order', 'trophystudentkeeper' => 'trophystudentkeeper', 'trophystudentreturn' => 'trophystudentreturn', 'trophyschoolkeeper' => 'trophyschoolkeeper', 'trophyschoolreturn' => 'trophyschoolreturn' ); $prize = array('identifier' => ''); foreach ($map as $k => $field) $prize[$k] = $p[$field]; $award['prizes'][] = $prize; } $awards[] = $award; } $response['awards'] = $awards; $response['postback'] = 'http://localhost'; } function award_upload_update_school(&$mysql_query, &$school, $school_id = -1) { global $pdo; /* transport name => mysql name */ $school_fields = array( // 'schoolname'=>'school', 'schoollang' => 'schoollang', 'schoollevel' => 'schoollevel', 'board' => 'board', 'district' => 'district', 'phone' => 'phone', 'fax' => 'fax', 'address' => 'address', 'city' => 'city', 'province_code' => 'province_code', 'postalcode' => 'postalcode', 'schoolemail' => 'schoolemail' ); /* 'principal'=>'principal', 'sciencehead'=>'sciencehead', 'scienceheademail'=>'scienceheademail', 'scienceheadphone'=>'scienceheadphone');*/ if ($school_id == -1) { $our_school = $mysql_query->fetch(PDO::FETCH_ASSOC); $sid = $our_school['id']; } else { $sid = $school_id; $our_school = array(); } $set = ''; foreach ($school_fields as $t => $m) { if ($our_school[$m] == $school[$t]) continue; if ($set != '') $set .= ','; $set .= "`$m`='" . $school[$t] . "'"; } $stmt = $pdo->prepare("UPDATE schools SET $set WHERE id='$sid'"); $stmt->execute(); return $sid; } function award_upload_school(&$student, &$school, $year, &$response) { global $pdo; $school_name = $school['schoolname']; $school_city = $school['city']; $school_phone = $school['phone']; $school_addr = $school['address']; $student_city = $student['city']; /* Find school by matching name, city, phone, year */ $q = $pdo->prepare("SELECT * FROM schools WHERE school='$school_name' AND city='$school_city' AND phone='$school_phone' AND year='$year'"); $q->execute(); if ($q->rowCount() == 1) return award_upload_update_school($q, $school); /* Find school by matching name, city, address, year */ $q = $pdo->prepare("SELECT * FROM schools WHERE school='$school_name' AND city='$school_city' AND address='$school_addr' AND year='$year'"); $q->execute(); if ($q->rowCount() == 1) return award_upload_update_school($q, $school); /* Find school by matching name, city, year */ $q = $pdo->prepare("SELECT * FROM schools WHERE school='$school_name' AND city='$school_city' AND year='$year'"); $q->execute(); if ($q->rowCount() == 1) return award_upload_update_school($q, $school); /* Find school by matching name, student city, year */ $q = $pdo->prepare("SELECT * FROM schools WHERE school='$school_name' AND city='$student_city' AND year='$year'"); $q->execute(); if ($q->rowCount() == 1) return award_upload_update_school($q, $school); $response['notice'][] = " - Creating new school: $school_name"; /* No? ok, make a new school */ $stmt = $pdo->prepare("INSERT INTO schools(`school`,`year`) VALUES ('" . $school['schoolname'] . "','$year')"); $stmt->execute(); $school_id = $pdo->lastInsertId(); return award_upload_update_school($q, $school, $school_id); } function award_upload_assign(&$fair, &$award, &$prize, &$project, $year, &$response) { global $pdo; $reg_email_needs_update = false; $new_reg = false; /* * Copied from admin/award_upload.php, this is the * transport name => sql name mapping */ $student_fields = array( 'firstname' => 'firstname', 'lastname' => 'lastname', 'email' => 'email', 'gender' => 'sex', 'grade' => 'grade', 'language' => 'lang', 'birthdate' => 'dateofbirth', 'address' => 'address', 'city' => 'city', 'province' => 'province', 'postalcode' => 'postalcode', 'phone' => 'phone', 'teachername' => 'teachername', 'teacheremail' => 'teacheremail' ); /* See if this project already exists */ $pn = $project['projectnumber']; $q = $pdo->prepare("SELECT * FROM projects WHERE projectnumber='$pn' AND fairs_id='{$fair['id']}' AND year='$year'"); $q->execute(); show_pdo_errors_if_any($pdo); if ($q->rowCount() == 1) { $our_project = $q->fetch(PDO::FETCH_ASSOC); $registrations_id = $our_project['registrations_id']; $pid = $our_project['id']; $response['notice'][] = " - Found existing project: {$project['title']}"; } else { $response['notice'][] = " - Creating new project: {$project['title']}"; /* Create a registration */ $regnum = 0; // now create the new registration record, and assign a random/unique registration number to then. do { // random number between // 100000 and 999999 (six digit integer) $regnum = rand(100000, 999999); $q = $pdo->prepare("SELECT * FROM registrations WHERE num='$regnum' AND year=$year"); $q->execute(); show_pdo_errors_if_any($pdo); } while ($q->rowCount() > 0); // actually insert it $stmt = $pdo->prepare('INSERT INTO registrations (num,email,start,status,schools_id,year) VALUES (' . "'$regnum','$regnum',NOW(),'open',NULL,'$year')"); $stmt->execute(); $registrations_id = $pdo->lastInsertId(); /* We'll fill in the email address later */ /* Add the project */ $stmt = $pdo->prepare("INSERT INTO projects (`registrations_id`,`projectnumber`,`year`,`fairs_id`) VALUES('$registrations_id', '" . $project['projectnumber'] . "', '$year', '{$fair['id']}');"); $stmt->execute(); $pid = $pdo->lastInsertId(); $reg_email_needs_update = true; $new_reg = true; } $q = $pdo->prepare("SELECT * FROM registrations WHERE id='$registrations_id'"); $q->execute(); $registration = $q->fetch(PDO::FETCH_ASSOC); /* Update the project in case anythign changed */ $stmt = $pdo->prepare("UPDATE projects SET title='" . $project['title'] . "', summary='" . $project['abstract'] . "', projectcategories_id='" . intval($project['projectcategories_id']) . "', projectdivisions_id='" . intval($project['projectdivisions_id']) . "' WHERE id='$pid'"); $stmt->execute(); /* Record the winner */ $stmt = $pdo->prepare("INSERT INTO winners(`awards_prizes_id`,`projects_id`,`year`,`fairs_id`) VALUES('{$prize['id']}','$pid','$year','{$fair['id']}')"); $stmt->execute(); /* Delete the students attached to this project */ $stmt = $pdo->prepare("DELETE FROM students WHERE registrations_id='$registrations_id'"); $stmt->execute(); /* Add new */ foreach ($project['students'] as &$student) { $response['notice'][] = " - Student {$student['firstname']} {$student['lastname']} saved"; $schools_id = award_upload_school($student, $student['school'], $year, $response); $keys = ',`' . join('`,`', array_values($student_fields)) . '`'; $values = ''; foreach ($student_fields as $k => $v) $values .= ",'" . $student[$k] . "'"; /* Note lack of comma before $keys, we added it above for both keys and values */ $stmt = $pdo->prepare("INSERT INTO students (`registrations_id`,`fairs_id`, `schools_id`,`year` $keys) VALUES('$registrations_id','{$fair['id']}','$schools_id','$year' $values )"); $stmt->execute(); /* Update the registration email */ if ($reg_email_needs_update) { $stmt = $pdo->prepare("UPDATE registrations SET email='" . $student['email'] . "' WHERE id='$registrations_id'"); $stmt->execute(); $reg_email_needs_update = false; } if ($award['external_register_winners'] == 1 && $new_reg == true) { /* * This award is for students who are participating in this fair, we need * to get their reg number to them if this is a new registration */ email_send( 'new_participant', $student['email'], array(), array( 'EMAIL' => $student['email'], 'REGNUM' => $registration['num'] ) ); $response['notice'][] = " - Sent welcome registration email to: {$student['firstname']} {$student['lastname']} <{$student['email']}>"; } } if ($award['external_register_winners'] == 0) { /* * It's not an external, so we don't need the student to login * or antyhing, we probably want to include it in reports, so set * it to complete */ $stmt = $pdo->prepare("UPDATE registrations SET status='complete' WHERE id='$registrations_id'"); $stmt->execute(); } } function handle_award_upload(&$u, &$fair, &$data, &$response) { $response['notice'][] = 'Handle Award Upload deprecated , please upgrade your SFIAB'; $response['error'] = 1; } function handle_awards_upload(&$u, &$fair, &$data, &$response) { global $pdo; // $response['debug'] = array_keys($data['awards_upload']); // $response['error'] = 0; // return; foreach ($data['awards_upload'] as $award_data) { $external_identifier = $award_data['external_identifier']; $year = intval($award_data['year']); /* Find the award */ $eid = $external_identifier; $q = $pdo->prepare("SELECT * FROM award_awards WHERE external_identifier='$eid' AND year='$year'"); $q->execute(); if ($q->rowCount() != 1) { $response['message'] = "Unknown award identifier '$eid' for year $year"; $response['error'] = 1; return; } $award = $q->fetch(PDO::FETCH_ASSOC); $aaid = $award['id']; $response['notice'][] = "Found award: {$award['name']}"; /* * Load prizes, we fetched the right award by year, so we don't need to * check the year as long as we query by aaid */ $prizes = array(); $q = $pdo->prepare("SELECT * FROM award_prizes WHERE award_awards_id='$aaid'"); $q->execute(); while ($prize = $q->fetch(PDO::FETCH_ASSOC)) { $response['notice'][] = " - Prize: {$prize['prize']}"; /* Clean out existing winners for this prize */ $stmt = $pdo->prepare("DELETE FROM winners WHERE award_prize_id='{$prize['id']}' AND fairs_id='{$fair['id']}'"); $stmt->execute(); /* Assign projects to this prize */ $ul_p = &$award_data['prizes'][$prize['prize']]; if (!is_array($ul_p['projects'])) continue; foreach ($ul_p['projects'] as &$project) { award_upload_assign($fair, $award, $prize, $project, $year, $response); } } } $response['notice'][] = 'All awards and winners saved'; $response['error'] = 0; } function handle_get_categories(&$u, &$fair, &$data, &$response) { global $pdo; $year = intval($data['get_categories']['year']); $cat = array(); $q = $pdo->prepare("SELECT * FROM projectcategories WHERE year='$year' ORDER BY id"); $q->execute(); while ($r = $q->fetch(PDO::FETCH_OBJ)) { $cat[$r->id] = array( 'id' => $r->id, 'category' => $r->category, 'mingrade' => $r->mingrade, 'maxgrade' => $r->maxgrade ); } $response['categories'] = $cat; $response['error'] = 0; } function handle_get_divisions(&$u, &$fair, &$data, &$response) { global $pdo; $year = intval($data['get_divisions']['year']); $div = array(); $q = $pdo->prepare("SELECT * FROM projectdivisions WHERE year='$year' ORDER BY id"); $q->execute(); while ($r = $q->fetch(PDO::FETCH_OBJ)) { $div[$r->id] = array( 'id' => $r->id, 'division' => $r->division ); } $response['divisions'] = $div; $response['error'] = 0; } function handle_award_additional_materials(&$u, &$fair, &$data, &$response) { global $pdo; $year = intval($data['award_additional_materials']['year']); $external_identifier = $data['award_additional_materials']['identifier']; $eid = $external_identifier; $q = $pdo->prepare("SELECT * FROM award_awards WHERE external_identifier='$eid' AND year='$year'"); $q->execute(); if ($q->rowCount() != 1) { $response['message'] = "Unknown award identifier '$eid'"; $response['error'] = 1; return; } $award = $q->fetch(PDO::FETCH_ASSOC); $pdf = fair_additional_materials($fair, $award, $year); $response['award_additional_materials']['pdf']['header'] = $pdf['header']; $response['award_additional_materials']['pdf']['data64'] = base64_encode($pdf['data']); $response['error'] = 0; } // echo "post:";print_r($_POST); // echo "json post: ".htmlspecialchars($_POST['json'])."
"; // echo "stripslashes(json post): ".stripslashes($_POST['json'])."
"; // echo "data:";print_r($data); // echo "
"; // exit; $username = $data['auth']['username']; $password = $data['auth']['password']; $response['query'] = $data; // echo "Authenticating... "; $u = user_load_by_email($username); if ($u == false) { $response['error'] = 1; $response['message'] = 'Authentication Failed'; echo json_encode($response); exit; } if (!is_array($u) || $u['password'] == '') { $response['error'] = 1; $response['message'] = 'Authentication Failed'; echo json_encode($response); exit; } if (!password_verify($password, $u['password'])) { $response['error'] = 1; $response['message'] = 'Authentication Failed'; echo json_encode($response); exit; } $q = $pdo->prepare("SELECT * FROM fairs WHERE id='?'"); $q->execute([$u['fairs_id']]); $fair = $q->fetch(PDO::FETCH_ASSOC); $response = array(); if (array_key_exists('getstats', $data)) handle_getstats($u, $fair, $data, $response); if (array_key_exists('stats', $data)) handle_stats($u, $fair, $data, $response); if (array_key_exists('getawards', $data)) handle_getawards($u, $fair, $data, $response); if (array_key_exists('awards_upload', $data)) handle_awards_upload($u, $fair, $data, $response); if (array_key_exists('award_upload', $data)) handle_award_upload($u, $fair, $data, $response); if (array_key_exists('get_categories', $data)) handle_get_categories($u, $fair, $data, $response); if (array_key_exists('get_divisions', $data)) handle_get_divisions($u, $fair, $data, $response); if (array_key_exists('award_additional_materials', $data)) handle_award_additional_materials($u, $fair, $data, $response); // $response['hi'] = 'hi'; echo urlencode(json_encode($response)); // echo "Success!
"; ?>