diff --git a/admin/reports_students.php b/admin/reports_students.php new file mode 100644 index 00000000..76d0d518 --- /dev/null +++ b/admin/reports_students.php @@ -0,0 +1,614 @@ + + Copyright (C) 2005 James 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. +*/ +?> + 'Project Number', + 'header' => '#', + 'width' => 0.5, + 'table' => 'projects.projectnumber' ); +$fields['last_name'] = array( 'name' => 'Last Name', + 'header' => 'Last Name', + 'width' => 1.0, + 'table' => 'students.lastname' ); +$fields['first_name'] = array( 'name' => 'First Name', + 'header' => 'First Name', + 'width' => 1.0, + 'table' => 'students.firstname' ); +$fields['name'] = array( 'name' => 'Full Student Name (last, first)', + 'header' => 'Name', + 'width' => 1.5, + 'table' => "CONCAT(students.lastname, ', ', students.firstname)", + 'table_sort'=> 'students.lastname' ); +$fields['partner'] = array( 'name' => 'Partner Name', + 'header' => 'Partner', + 'width' => 1.5, + 'table' => "CONCAT(students2.lastname, ', ', students2.firstname)" ); +$fields['bothnames'] = array( 'name' => "Both Student Names", + 'header' => 'Student(s)', + 'width' => 3.0, + 'table' => "CONCAT(students.firstname, ' ', students.lastname, IF(students2.lastname IS NULL,'', CONCAT(', ', students2.firstname, ' ', students2.lastname)))", + 'table_sort' => 'students.lastnmae'); +$fields['grade'] = array( 'name' => 'Grade', + 'header' => 'Grade', + 'width' => 0.5, + 'table' => 'students.grade'); +$fields['gender'] = array( 'name' => 'Gender', + 'header' => 'Gender', + 'width' => 0.5, + 'table' => 'students.sex', + 'value_map' =>array ('male' => 'Male', 'female' => 'Female')); +$fields['title'] = array( 'name' => 'Project Title', + 'header' => 'Project Title', + 'width' => 3.0, + 'table' => 'projects.title' ); +$fields['division'] = array( 'name' => 'Project Division', + 'header' => 'Division', + 'width' => 3.0, + 'table' => 'projectdivisions.division' ); +$fields['div'] = array( 'name' => 'Project Division Short Form' , + 'header' => 'Div', + 'width' => 0.4, + 'table' => 'projectdivisions.division_shortform' ); +$fields['category'] = array( 'name' => 'Project Category', + 'header' => 'Category', + 'width' => 1, + 'table_sort' => 'projectcategories.id', + 'table' => 'projectcategories.category' ); +$fields['address'] = array( 'name' => 'Student Address -- Street Address', + 'header' => 'Address', + 'width' => 2.0, + 'table' => 'students.address'); +$fields['city'] = array( 'name' => 'Student Address -- City', + 'header' => 'City', + 'width' => 1.5, + 'table' => 'students.city' ); +$fields['province'] = array( 'name' => 'Student Address -- Province', + 'header' => 'Province', + 'width' => 0.75, + 'table' => 'students.province' ); +$fields['postal'] = array( 'name' => 'Student Address -- Postal Code', + 'header' => 'Postal', + 'width' => 0.75, + 'table' => 'students.postalcode' ); +$fields['school'] = array( 'name' => 'School -- Name', + 'header' => 'School Name', + 'width' => 2.0, + 'table' => 'schools.school' ); +$fields['teacher'] =array( 'name' => 'School -- Teacher Name', + 'header' => 'Teacher', + 'width' => 2.0, + 'table' => 'students.teachername' ); +$fields['school_phone'] =array( 'name' => 'School -- Phone', + 'header' => 'School Phone', + 'width' => 1.0, + 'table' => 'schools.phone' ); +$fields['school_fax'] =array( 'name' => 'School -- Fax', + 'header' => 'School Fax', + 'width' => 1.0, + 'table' => 'schools.fax' ); +$fields['paid'] = array( 'name' => 'Paid', + 'header' => 'Paid', + 'width' => '0.4', + 'table' => 'registrations.status', + 'value_map' =>array ('complete' => '', 'paymentpending' => 'No')); +$fields['tshirt'] = array( 'name' => 'T-Shirt Size', + 'header' => 'T-Shirt', + 'width' => 0.75, + 'table' => 'students.tshirt' ); +$fields['awards'] = array( 'name' => 'Awards (warning: duplicates student for multiple awards!)', + 'header' => 'Award Name', + 'width' => 4, + 'table' => "CONCAT(IF(award_types.type='Other','Special',award_types.type), ' ', award_awards.name)", + 'table_sort' => 'award_awards.order'); +$fields['pn_awards'] = array( 'name' => 'Project Num + Award (will be unique)', + 'header' => 'Award Name', + 'width' => 4, + 'table' => "CONCAT(projects.projectnumber,' ', award_awards.name)", + 'table_sort' => 'award_awards.order'); + + + + + + + + + $reports = array(); + $reports[] = array( 'name' => "Student Name, Project Num and Title, Category sorted by Last Name", + 'cols' => array('pn', 'name', 'title', 'category'), + 'sort' => array('last_name'), + 'group' => array() + ); + $reports[] = array( 'name' => "Student Name, Project Num and Title, Category sorted by Project Number", + 'cols' => array('pn', 'name', 'title', 'category'), + 'sort' => array('pn'), + 'group' => array() + ); + $reports[] = array( 'name' => "Student Name, Project Num and Title, Category sorted by Last Name, grouped by Category", + 'cols' => array('pn', 'name', 'title'), + 'sort' => array('last_name'), + 'group' => array('category') + ); + $reports[] = array( 'name' => "Student Name, Project Num, School Name sorted by Last Name", + 'cols' => array('pn', 'name', 'school'), + 'sort' => array('last_name'), + 'group' => array() + ); + $reports[] = array( 'name' => "Student Name, Project Num and Name sorted by Last Name, grouped by School Name", + 'cols' => array('pn', 'name', 'title', 'category'), + 'sort' => array('last_name'), + 'group' => array('school'), + ); + + $reports[] = array( 'name' => "Teacher, School Info sorted by Teacher Name", + 'cols' => array('teacher', 'school','school_phone','school_fax'), + 'sort' => array('teacher'), + 'group' => array(), + 'distinct' => array('teacher'), + ); + $reports[] = array( 'name' => "Teacher, School Info sorted by Teacher Name grouped by School Name", + 'cols' => array('teacher', 'school','school_phone','school_fax'), + 'sort' => array('teacher'), + 'group' => array('school'), + 'distinct' => array('teacher'), + ); + + $reports[] = array( 'name' => "Project Checkin", + 'cols' => array('paid', 'pn', 'title', 'name', 'partner','tshirt', 'div'), + 'sort' => array('pn'), + 'group' => array('category'), + 'option' => array('group_new_page' => 'yes'), + ); + + $reports[] = array( 'name' => "Student Pairs, Project Name/Num Grouped by School", + 'cols' => array('pn', 'name', 'partner','title'), + 'sort' => array('pn'), + 'group' => array('school'), + 'distinct' => array('pn'), + ); + $reports[] = array( 'name' => "Individual Students, Project Name/Num Grouped by School", + 'cols' => array('pn', 'name', 'title'), + 'sort' => array('pn'), + 'group' => array('school'), + ); + + $reports[] = array( 'name' => "Individual Students, Project Num, TShirt, Grouped by School", + 'cols' => array('pn', 'name', 'tshirt'), + 'sort' => array('pn'), + 'group' => array('school'), + ); + + $reports[] = array( 'name' => "Program Guide", + 'cols' => array('pn', 'bothnames', 'title'), + 'sort' => array('pn'), + 'group' => array('school'), + 'distinct' => array('pn'), + ); + + $reports[] = array( 'name' => "Project Name/Num, Grade Grouped by School", + 'cols' => array('pn', 'title', 'grade'), + 'sort' => array('pn'), + 'group' => array('school'), + 'distinct' => array('pn'), + ); + + $reports[] = array( 'name' => "Award List (Media)", + 'cols' => array('pn', 'name', 'address','city','province','postal'), + 'sort' => array('pn'), + 'group' => array('awards'), + + ); + + + + + + + + + $options = array(); + $options['type'] = array( 'desc' => 'Report Format', + 'values' => array('pdf'=>'PDF', 'csv'=>'CSV') + ); + $options['group_new_page'] = array( 'desc' => 'Start each new grouping on a new page', + 'values' => array('no'=>'No', 'yes'=>'Yes') + ); + + + $allow_fields = array_keys($fields); + + function check_fields_array($a, $name) + { + global $allow_fields; + $n = array(); + foreach($a as $f) { + if($f=='') continue; + if(!in_array($f, $allow_fields)) { + echo "$name [$f] not allowed.\n"; + exit; + } + $n[] = $f; + } + return $n; + } + + /* ---- Generator -----*/ + $action= $_GET['action']; + if($action == 'gen') { + + /* Scrub the data */ + $col = check_fields_array($_GET['col'], "Column"); + $group = check_fields_array($_GET['group'], "Group"); + $sort = check_fields_array($_GET['sort'], "Sort"); + $distinct = check_fields_array($_GET['distinct'], "Distinct"); + + $option = $_GET['option']; +//print_r($option); + foreach($option as $k=>$v) { + $keys = array_keys($options[$k]['values']); + if(!in_array($v, $keys)) { + echo "option $k [$v] not allowed.\n"; + exit; + } + + } + + $fieldname = array(); + + $thead = array(); + + if($option['type']=="pdf") { + $rep=new lpdf( i18n($config['fairname']), + i18n($report_name), + $_SERVER['DOCUMENT_ROOT'].$config['SFIABDIRECTORY']."/data/logo-200.gif"); + $rep->newPage(); + $rep->setFontSize(11); + + } else if($option['type']=="csv") { + $rep=new lcsv(i18n($report_name)); + } + + + $table['header']=array(); + $table['widths']=array(); + $table['dataalign']=array(); + $sel = array(); + $x=0; + /* Select columns to display */ + foreach($col as $f) { + $table['header'][] = i18n($fields[$f]['header']); + $table['widths'][] = $fields[$f]['width']; + $table['dataalign'][] = 'left'; + $sel[] = "{$fields[$f]['table']} AS C$x"; + $fieldname[$f] = "C$x"; + $x++; + } + /* We also want to select any column groupings, but we won't display them */ + $x=0; + foreach($group as $f) { + if(isset($fieldnmae[$f])) continue; + $sel[] = "{$fields[$f]['table']} AS G$x"; + $fieldname[$f] = "G$x"; + $x++; + } + + $x=0; + foreach($distinct as $f) { + if(isset($fieldname[$f])) continue; + $sel[] = "{$fields[$f]['table']} AS D$x"; + $fieldname[$f] = "D$x"; + $x++; + } + $sel = implode(",", $sel); + + + + $n_groups = count($group); + $last_group_data = array(); + $order = array(); + + /* Setup the order: groups, then sort order */ + foreach($group as $f) { + if(isset($fields[$f]['table_sort'])) { + $order[] = $fields[$f]['table_sort']; + } else { + $order[] = $fieldname[$f];//ields[$f]['table']; + } + } + foreach($sort as $f) { + if(isset($fields[$f]['table_sort'])) { + $order[] = $fields[$f]['table_sort']; + } else { + $order[] = $fieldname[$f];//$fields[$f]['table']; + } + } + $order = implode(",", $order); + + $year = $config['FAIRYEAR']; + + $group_query = ""; + if(count($distinct)) { + $f = $distinct[0]; + $group_query = "GROUP BY {$fieldname[$f]}";//$$fields[$f]['table']}"; + } + + if(in_array('awards', $col) || in_array('pn_awards', $col) + || in_array('awards', $group) || in_array('pn_awards', $group) ) { + /* This requires some extra gymnastics */ + $awards_join = "LEFT JOIN winners ON(winners.projects_id = projects.id),award_prizes,award_awards,award_types"; + $awards_where = " AND winners.awards_prizes_id=award_prizes.id + AND award_prizes.award_awards_id=award_awards.id + AND award_types.id=award_awards.award_types_id + AND winners.year=$year + AND award_awards.year=$year + AND award_prizes.year=$year + AND award_types.year=$year "; + } else { + $awards_join = ''; + $awards_where = ''; + } + + if(in_array('bothnames', $col) || in_array('partner', $col)) { + $partner_join = "LEFT JOIN students AS students2 + ON(students2.registrations_id=students.registrations_id + AND students2.id != students.id)"; + } else { + $partner_join = ''; + } + + + $q = " SELECT $sel + FROM + students $partner_join, + schools, projects $awards_join, projectdivisions, + projectcategories, registrations + WHERE + schools.id=students.schools_id + AND projects.registrations_id=students.registrations_id + AND projectdivisions.id=projects.projectdivisions_id + AND projectcategories.id=projects.projectcategories_id + AND registrations.id=students.registrations_id + AND (registrations.status='complete' OR registrations.status='paymentpending') + AND students.year='$year' + AND projects.year='$year' + AND registrations.year='$year' + AND projectcategories.year='$year' + AND projectdivisions.year='$year' + $awards_where + + $group_query + + ORDER BY + $order"; + +//print("$q"); + + $r = mysql_query($q); + echo mysql_error(); + + $ncols = count($col); + while($i = mysql_fetch_assoc($r)) { + + if($n_groups > 0) { + $group_change = false; + for($x=0; $x<$n_groups; $x++) { + if($last_group_data["G$x"] != $i["G$x"]) { + $group_change = true; + } + $last_group_data["G$x"] = $i["G$x"]; + } + + if($group_change) { + /* Dump the last table */ + if(count($table['data'])) { + // print_r($table); + $rep->addTable($table); + $rep->nextLine(); + $table['data'] = array(); + /* Start a new page AFTER a table is + * dumped, so the first page doesn't + * end up blank */ + if($option['group_new_page'] == 'yes') { + $rep->newPage(); + } else { + $rep->hr(); + $rep->vspace(-0.1); + } + } + + /* Construct a new header */ + $h = implode(", ", $last_group_data); + $rep->heading($h); + $rep->nextLine(); + } + + } + + $data = array(); + $x=0; + foreach($col as $c) { + if(is_array($fields[$c]['value_map'])) { + $v = $fields[$c]['value_map'][$i["C$x"]]; + } else { + $v = $i["C$x"]; + } + $data[] = $v; + $x++; + } + $table['data'][] = $data; + } + + if(count($table['data'])) { + $rep->addTable($table); + } + $rep->output(); + + exit; + } + + + + send_header("Administration - Reports > Student Report Generator"); + +?> + + + +<< ".i18n("Back to Reports")."
"; + echo "
"; + + echo "
"; + echo ""; + + echo ""; + + echo "

Table Columns

"; + echo ""; + $x=0; + foreach($fields as $k=>$f) { + if($x%2==0) echo ""; + echo ""; + if($x%2 == 1) echo ""; + $x++; + } + echo "
{$f['name']}
"; + + echo "

Grouping

"; + echo "Group By: "; + echo ""; + echo "

Sorting

"; + for($x=0;$x<3;$x++) { + echo "Sort By".($x + 1).": "; + echo "
"; + } + echo "

Distinct

"; + echo "Distinct Column: "; + echo ""; + + + echo "

Options

"; + foreach($options as $ok=>$o) { + echo "{$o['desc']}:
\n"; + } + + echo "
"; + echo ""; + + echo "
"; + + send_footer(); +?>