. */ use Gibbon\Domain\System\SettingGateway; use Gibbon\Forms\Form; use Gibbon\Forms\DatabaseFormFactory; //Module includes require_once __DIR__ . '/moduleFunctions.php'; if (isActionAccessible($guid, $connection2, '/modules/Tracking/graphing.php') == false) { // Access denied $page->addError(__('You do not have access to this action.')); } else { //Get action with highest precendence $highestAction = getHighestGroupedAction($guid, $_GET['q'], $connection2); if ($highestAction == false) { echo "
"; echo __('The highest grouped action cannot be determined.'); echo '
'; } else { //Get action with highest precendence $page->breadcrumbs->add(__('Graphing')); echo '

'; echo __('Filter'); echo '

'; $gibbonPersonIDs = (isset($_POST['gibbonPersonIDs']))? $_POST['gibbonPersonIDs'] : null; $gibbonDepartmentIDs = (isset($_POST['gibbonDepartmentIDs']))? $_POST['gibbonDepartmentIDs'] : null; $dataType = (isset($_POST['dataType']))? $_POST['dataType'] : null; $settingGateway = $container->get(SettingGateway::class); $attainmentAlt = $settingGateway->getSettingByScope('Markbook', 'attainmentAlternativeName'); $effortAlt = $settingGateway->getSettingByScope('Markbook', 'effortAlternativeName'); $dataTypes = array( 'attainment' => (!empty($attainmentAlt))? $attainmentAlt : __('Attainment'), 'effort' => (!empty($effortAlt))? $effortAlt : __('Effort'), ); $form = Form::create('action', $session->get('absoluteURL').'/index.php?q=/modules/Tracking/graphing.php'); $form->setFactory(DatabaseFormFactory::create($pdo)); $form->addHiddenValue('address', $session->get('address')); $row = $form->addRow(); $row->addLabel('gibbonPersonIDs', __('Student')); $row->addSelectStudent('gibbonPersonIDs', $session->get('gibbonSchoolYearID'), array('byName' => true, 'byForm' => true))->selectMultiple()->required(); $row = $form->addRow(); $row->addLabel('dataType', __('Data Type')); $row->addSelect('dataType')->fromArray($dataTypes)->required(); $sql = "SELECT gibbonDepartmentID as value, name FROM gibbonDepartment WHERE type='Learning Area' ORDER BY name"; $results = $pdo->executeQuery(array(), $sql); $row = $form->addRow(); $row->addLabel('gibbonDepartmentIDs', __('Learning Areas')) ->description(__('Only Learning Areas for which the student has data will be displayed.')); if ($results->rowCount() == 0) { $row->addContent(__('No Learning Areas available.'))->wrap('', ''); } else { $row->addCheckbox('gibbonDepartmentIDs')->fromResults($results)->addCheckAllNone(); } $row = $form->addRow(); $row->addFooter(); $row->addSubmit(); $form->loadAllValuesFrom($_POST); echo $form->getOutput(); if (count($_POST) > 0) { if ($gibbonPersonIDs == null or $gibbonDepartmentIDs == null or ($dataType != 'attainment' and $dataType != 'effort')) { echo "
"; echo __('There are no records to display.'); echo '
'; } else { $output = ''; echo '

'; echo __('Report Data'); echo '

'; echo '

'; echo __('The chart below shows Years and Terms along the X axis, and mean Markbook grades, converted to a 0-1 scale, on the Y axis.'); echo '

'; //GET DEPARTMENTS $departments = array(); $departmentCount = 0; $colours = getColourArray(); try { $dataDepartments = array(); $departmentExtra_MB = ''; $departmentExtra_IA = ''; foreach ($gibbonDepartmentIDs as $gibbonDepartmentID) { //INCLUDE ONLY SELECTED DEPARTMENTS $dataDepartments['department_MB'.$gibbonDepartmentID] = $gibbonDepartmentID; $departmentExtra_MB .= 'gibbonDepartment.gibbonDepartmentID=:department_MB'.$gibbonDepartmentID.' OR '; $dataDepartments['department_IA'.$gibbonDepartmentID] = $gibbonDepartmentID; $departmentExtra_IA .= 'gibbonDepartment.gibbonDepartmentID=:department_IA'.$gibbonDepartmentID.' OR '; } if ($departmentExtra_MB != '') { $departmentExtra_MB = 'AND ('.substr($departmentExtra_MB, 0, -4).')'; } if ($departmentExtra_IA != '') { $departmentExtra_IA = 'AND ('.substr($departmentExtra_IA, 0, -4).')'; } $personExtra_MB = ''; $personExtra_IA = ''; foreach ($gibbonPersonIDs as $gibbonPersonID) { //INCLUDE ONLY SELECTED STUDENTS $dataDepartments['person_MB'.$gibbonPersonID] = $gibbonPersonID; $personExtra_MB .= 'gibbonMarkbookEntry.gibbonPersonIDStudent=:person_MB'.$gibbonPersonID.' OR '; $dataDepartments['person_IA'.$gibbonPersonID] = $gibbonPersonID; $personExtra_IA .= 'gibbonInternalAssessmentEntry.gibbonPersonIDStudent=:person_IA'.$gibbonPersonID.' OR '; } if ($personExtra_MB != '') { $personExtra_MB = 'AND ('.substr($personExtra_MB, 0, -4).')'; } if ($personExtra_IA != '') { $personExtra_IA = 'AND ('.substr($personExtra_IA, 0, -4).')'; } $sqlDepartments = '(SELECT DISTINCT gibbonDepartment.name AS department FROM gibbonMarkbookEntry JOIN gibbonMarkbookColumn ON (gibbonMarkbookEntry.gibbonMarkbookColumnID=gibbonMarkbookColumn.gibbonMarkbookColumnID) JOIN gibbonCourseClass ON (gibbonMarkbookColumn.gibbonCourseClassID=gibbonCourseClass.gibbonCourseClassID) JOIN gibbonCourse ON (gibbonCourseClass.gibbonCourseID=gibbonCourse.gibbonCourseID) JOIN gibbonDepartment ON (gibbonCourse.gibbonDepartmentID=gibbonDepartment.gibbonDepartmentID) JOIN gibbonScale ON (gibbonMarkbookColumn.gibbonScaleID'.ucfirst($dataType)."=gibbonScale.gibbonScaleID) JOIN gibbonSchoolYearTerm ON (gibbonSchoolYearTerm.firstDay<=completeDate AND gibbonSchoolYearTerm.lastDay>=completeDate) JOIN gibbonSchoolYear ON (gibbonSchoolYearTerm.gibbonSchoolYearID=gibbonSchoolYear.gibbonSchoolYearID) WHERE complete='Y' AND completeDate<='".date('Y-m-d')."' AND (SELECT count(*) FROM gibbonScaleGrade WHERE gibbonScaleID=gibbonScale.gibbonScaleID)>3 AND ".$dataType."Value!='' AND ".$dataType."Value IS NOT NULL $departmentExtra_MB $personExtra_MB) UNION (SELECT DISTINCT gibbonDepartment.name AS department FROM gibbonInternalAssessmentEntry JOIN gibbonInternalAssessmentColumn ON (gibbonInternalAssessmentEntry.gibbonInternalAssessmentColumnID=gibbonInternalAssessmentColumn.gibbonInternalAssessmentColumnID) JOIN gibbonCourseClass ON (gibbonInternalAssessmentColumn.gibbonCourseClassID=gibbonCourseClass.gibbonCourseClassID) JOIN gibbonCourse ON (gibbonCourseClass.gibbonCourseID=gibbonCourse.gibbonCourseID) JOIN gibbonDepartment ON (gibbonCourse.gibbonDepartmentID=gibbonDepartment.gibbonDepartmentID) JOIN gibbonScale ON (gibbonInternalAssessmentColumn.gibbonScaleID".ucfirst($dataType)."=gibbonScale.gibbonScaleID) JOIN gibbonSchoolYearTerm ON (gibbonSchoolYearTerm.firstDay<=completeDate AND gibbonSchoolYearTerm.lastDay>=completeDate) JOIN gibbonSchoolYear ON (gibbonSchoolYearTerm.gibbonSchoolYearID=gibbonSchoolYear.gibbonSchoolYearID) WHERE complete='Y' AND completeDate<='".date('Y-m-d')."' AND (SELECT count(*) FROM gibbonScaleGrade WHERE gibbonScaleID=gibbonScale.gibbonScaleID)>3 AND ".$dataType."Value!='' AND ".$dataType."Value IS NOT NULL $departmentExtra_IA $personExtra_IA) ORDER BY department"; $resultDepartments = $connection2->prepare($sqlDepartments); $resultDepartments->execute($dataDepartments); } catch (PDOException $e) { echo "
".$e->getMessage().'
'; } while ($rowDepartments = $resultDepartments->fetch()) { $departments[$departmentCount]['department'] = $rowDepartments['department']; $departments[$departmentCount]['colour'] = $colours[$departmentCount % 12]; ++$departmentCount; } //GET GRADES & TERMS try { $dataGrades = array(); $departmentExtra_MB = ''; $departmentExtra_IA = ''; foreach ($gibbonDepartmentIDs as $gibbonDepartmentID) { //INCLUDE ONLY SELECTED DEPARTMENTS $dataGrades['department_MB'.$gibbonDepartmentID] = $gibbonDepartmentID; $departmentExtra_MB .= 'gibbonDepartment.gibbonDepartmentID=:department_MB'.$gibbonDepartmentID.' OR '; $dataGrades['department_IA'.$gibbonDepartmentID] = $gibbonDepartmentID; $departmentExtra_IA .= 'gibbonDepartment.gibbonDepartmentID=:department_IA'.$gibbonDepartmentID.' OR '; } if ($departmentExtra_MB != '') { $departmentExtra_MB = 'AND ('.substr($departmentExtra_MB, 0, -4).')'; } if ($departmentExtra_IA != '') { $departmentExtra_IA = 'AND ('.substr($departmentExtra_IA, 0, -4).')'; } $personExtra_MB = ''; $personExtra_IA = ''; foreach ($gibbonPersonIDs as $gibbonPersonID) { //INCLUDE ONLY SELECTED STUDENTS $dataGrades['person_MB'.$gibbonPersonID] = $gibbonPersonID; $personExtra_MB .= 'gibbonMarkbookEntry.gibbonPersonIDStudent=:person_MB'.$gibbonPersonID.' OR '; $dataGrades['person_IA'.$gibbonPersonID] = $gibbonPersonID; $personExtra_IA .= 'gibbonInternalAssessmentEntry.gibbonPersonIDStudent=:person_IA'.$gibbonPersonID.' OR '; } if ($personExtra_MB != '') { $personExtra_MB = 'AND ('.substr($personExtra_MB, 0, -4).')'; } if ($personExtra_IA != '') { $personExtra_IA = 'AND ('.substr($personExtra_IA, 0, -4).')'; } $sqlGrades = '(SELECT gibbonSchoolYearTerm.sequenceNumber AS termSequence, gibbonSchoolYear.sequenceNumber AS yearSequence, gibbonSchoolYear.name AS year, gibbonSchoolYearTerm.name AS term, gibbonSchoolYearTerm.gibbonSchoolYearTermID AS termID, gibbonDepartment.name AS department, gibbonMarkbookColumn.name AS markbook, completeDate, '.$dataType.', gibbonScaleID'.ucfirst($dataType).', '.$dataType.'Value, '.$dataType.'Descriptor, (SELECT count(*) FROM gibbonScaleGrade WHERE gibbonScaleID=gibbonScale.gibbonScaleID) AS totalGrades, (SELECT count(*) FROM gibbonScaleGrade WHERE gibbonScaleID=gibbonScale.gibbonScaleID AND sequenceNumber>=(SELECT sequenceNumber FROM gibbonScaleGrade WHERE gibbonScaleID=gibbonScale.gibbonScaleID AND value=gibbonMarkbookEntry.'.$dataType.'Value) ORDER BY sequenceNumber DESC) AS gradePosition FROM gibbonMarkbookEntry JOIN gibbonMarkbookColumn ON (gibbonMarkbookEntry.gibbonMarkbookColumnID=gibbonMarkbookColumn.gibbonMarkbookColumnID) JOIN gibbonCourseClass ON (gibbonMarkbookColumn.gibbonCourseClassID=gibbonCourseClass.gibbonCourseClassID) JOIN gibbonCourse ON (gibbonCourseClass.gibbonCourseID=gibbonCourse.gibbonCourseID) JOIN gibbonDepartment ON (gibbonCourse.gibbonDepartmentID=gibbonDepartment.gibbonDepartmentID) JOIN gibbonScale ON (gibbonMarkbookColumn.gibbonScaleID'.ucfirst($dataType)."=gibbonScale.gibbonScaleID) JOIN gibbonSchoolYearTerm ON (gibbonSchoolYearTerm.firstDay<=completeDate AND gibbonSchoolYearTerm.lastDay>=completeDate) JOIN gibbonSchoolYear ON (gibbonSchoolYearTerm.gibbonSchoolYearID=gibbonSchoolYear.gibbonSchoolYearID) WHERE complete='Y' AND completeDate<='".date('Y-m-d')."' AND (SELECT count(*) FROM gibbonScaleGrade WHERE gibbonScaleID=gibbonScale.gibbonScaleID)>3 AND ".$dataType."Value!='' AND ".$dataType."Value IS NOT NULL $departmentExtra_MB $personExtra_MB) UNION (SELECT gibbonSchoolYearTerm.sequenceNumber AS termSequence, gibbonSchoolYear.sequenceNumber AS yearSequence, gibbonSchoolYear.name AS year, gibbonSchoolYearTerm.name AS term, gibbonSchoolYearTerm.gibbonSchoolYearTermID AS termID, gibbonDepartment.name AS department, gibbonInternalAssessmentColumn.name AS markbook, completeDate, ".$dataType.', gibbonScaleID'.ucfirst($dataType).', '.$dataType.'Value, '.$dataType.'Descriptor, (SELECT count(*) FROM gibbonScaleGrade WHERE gibbonScaleID=gibbonScale.gibbonScaleID) AS totalGrades, (SELECT count(*) FROM gibbonScaleGrade WHERE gibbonScaleID=gibbonScale.gibbonScaleID AND sequenceNumber>=(SELECT sequenceNumber FROM gibbonScaleGrade WHERE gibbonScaleID=gibbonScale.gibbonScaleID AND value=gibbonInternalAssessmentEntry.'.$dataType.'Value) ORDER BY sequenceNumber DESC) AS gradePosition FROM gibbonInternalAssessmentEntry JOIN gibbonInternalAssessmentColumn ON (gibbonInternalAssessmentEntry.gibbonInternalAssessmentColumnID=gibbonInternalAssessmentColumn.gibbonInternalAssessmentColumnID) JOIN gibbonCourseClass ON (gibbonInternalAssessmentColumn.gibbonCourseClassID=gibbonCourseClass.gibbonCourseClassID) JOIN gibbonCourse ON (gibbonCourseClass.gibbonCourseID=gibbonCourse.gibbonCourseID) JOIN gibbonDepartment ON (gibbonCourse.gibbonDepartmentID=gibbonDepartment.gibbonDepartmentID) JOIN gibbonScale ON (gibbonInternalAssessmentColumn.gibbonScaleID'.ucfirst($dataType)."=gibbonScale.gibbonScaleID) JOIN gibbonSchoolYearTerm ON (gibbonSchoolYearTerm.firstDay<=completeDate AND gibbonSchoolYearTerm.lastDay>=completeDate) JOIN gibbonSchoolYear ON (gibbonSchoolYearTerm.gibbonSchoolYearID=gibbonSchoolYear.gibbonSchoolYearID) WHERE complete='Y' AND completeDate<='".date('Y-m-d')."' AND (SELECT count(*) FROM gibbonScaleGrade WHERE gibbonScaleID=gibbonScale.gibbonScaleID)>3 AND ".$dataType."Value!='' AND ".$dataType."Value IS NOT NULL $departmentExtra_IA $personExtra_IA) ORDER BY yearSequence, termSequence, completeDate, markbook"; $resultGrades = $connection2->prepare($sqlGrades); $resultGrades->execute($dataGrades); } catch (PDOException $e) { echo "
".$e->getMessage().'
'; } if ($resultGrades->rowCount() < 1) { echo "
"; echo __('There are no records to display.'); echo '
'; } else { //Prep grades & terms $grades = array(); $gradeCount = 0; $lastDepartment = ''; $terms = array(); $termCount = 0; $lastTerm = ''; while ($rowGrades = $resultGrades->fetch()) { //Store grades $grades[$gradeCount]['department'] = $rowGrades['department']; $grades[$gradeCount]['year'] = $rowGrades['year']; $grades[$gradeCount]['term'] = $rowGrades['term']; $grades[$gradeCount]['termID'] = $rowGrades['termID']; $grades[$gradeCount]['markbook'] = $rowGrades['markbook']; $grades[$gradeCount]['completeDate'] = $rowGrades['completeDate']; $grades[$gradeCount][$dataType] = $rowGrades[$dataType]; $grades[$gradeCount]['gibbonScaleID'.ucfirst($dataType)] = $rowGrades['gibbonScaleID'.ucfirst($dataType)]; $grades[$gradeCount][$dataType.'Value'] = $rowGrades[$dataType.'Value']; $grades[$gradeCount][$dataType.'Descriptor'] = $rowGrades[$dataType.'Descriptor']; $grades[$gradeCount]['totalGrades'] = $rowGrades['totalGrades']; $grades[$gradeCount]['gradePosition'] = $rowGrades['gradePosition']; $grades[$gradeCount]['gradeWeighted'] = round($rowGrades['gradePosition'] / $rowGrades['totalGrades'], 2); //Store terms for axis if ($lastTerm != $rowGrades['term']) { $terms[$termCount]['year'] = $rowGrades['year']; $terms[$termCount]['term'] = $rowGrades['term']; $terms[$termCount]['termID'] = $rowGrades['termID']; $terms[$termCount]['termFullName'] = $rowGrades['year'].' '.$rowGrades['term']; ++$termCount; } $lastTerm = $rowGrades['term']; ++$gradeCount; } //POPULATE FINAL DATA $finalData = array(); foreach ($terms as $term) { foreach ($departments as $department) { $finalData[$term['termID']][$department['department']]['termID'] = $term['termID']; $finalData[$term['termID']][$department['department']]['termFullName'] = $term['termFullName']; $finalData[$term['termID']][$department['department']]['department'] = $department['department']; $finalData[$term['termID']][$department['department']]['gradeWeightedTotal'] = null; $finalData[$term['termID']][$department['department']]['gradeWeightedDivisor'] = 0; $finalData[$term['termID']][$department['department']]['gradeWeightedMean'] = null; foreach ($grades as $grade) { if ($grade['termID'] == $term['termID'] and $grade['department'] == $department['department']) { $finalData[$term['termID']][$department['department']]['gradeWeightedTotal'] += $grade['gradeWeighted']; ++$finalData[$term['termID']][$department['department']]['gradeWeightedDivisor']; } } } } //CALCULATE AVERAGES foreach ($departments as $department) { foreach ($terms as $term) { if ($finalData[$term['termID']][$department['department']]['gradeWeightedDivisor'] > 0) { $finalData[$term['termID']][$department['department']]['gradeWeightedMean'] = round(($finalData[$term['termID']][$department['department']]['gradeWeightedTotal'] / $finalData[$term['termID']][$department['department']]['gradeWeightedDivisor']), 2); } else { $finalData[$term['termID']][$department['department']]['gradeWeightedMean'] = 'null'; } } } if (count($grades) < 4) { echo "
"; echo __('The are less than 4 data points, so no graph can be produced.'); echo '
'; } else { //PLOT DATA echo ''; echo "

".__('Data').'

'; echo '
'; echo '
'; echo ''; echo '
'; echo '
'; ?>