232 lines
8.1 KiB
PHP
232 lines
8.1 KiB
PHP
<?php
|
|
require_once 'header.php';
|
|
|
|
try {
|
|
$pdo = db();
|
|
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
|
|
|
// Fetch data for Discipline
|
|
$discipline_stmt = $pdo->query("SELECT discipline, COUNT(*) as count FROM grievances GROUP BY discipline");
|
|
$discipline_data = $discipline_stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
|
|
// Fetch data for Subject
|
|
$subject_stmt = $pdo->query("SELECT subject, COUNT(*) as count FROM grievances GROUP BY subject");
|
|
$subject_data = $subject_stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
|
|
// Fetch data for Grievances per Quarter
|
|
$quarter_stmt = $pdo->query("SELECT QUARTER(last_updated) as quarter, COUNT(*) as count FROM grievances GROUP BY QUARTER(last_updated)");
|
|
$quarter_data = $quarter_stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
|
|
} catch (PDOException $e) {
|
|
echo '<div class="alert alert-danger">Database error: ' . $e->getMessage() . '</div>';
|
|
exit;
|
|
}
|
|
|
|
$discipline_labels = [];
|
|
$discipline_values = [];
|
|
foreach ($discipline_data as $data) {
|
|
$discipline_labels[] = $data['discipline'];
|
|
$discipline_values[] = $data['count'];
|
|
}
|
|
|
|
$subject_labels = [];
|
|
$subject_values = [];
|
|
foreach ($subject_data as $data) {
|
|
$subject_labels[] = $data['subject'];
|
|
$subject_values[] = $data['count'];
|
|
}
|
|
|
|
$quarter_labels = [];
|
|
$quarter_values = [];
|
|
foreach ($quarter_data as $data) {
|
|
$quarter_labels[] = 'Q' . $data['quarter'];
|
|
$quarter_values[] = $data['count'];
|
|
}
|
|
?>
|
|
|
|
<div class="container mt-5">
|
|
<h2 class="text-center mb-4">Grievance Statistics</h2>
|
|
<div class="row">
|
|
<div class="col-md-4">
|
|
<h4 class="text-center">Discipline</h4>
|
|
<canvas id="disciplineChart"></canvas>
|
|
</div>
|
|
<div class="col-md-4">
|
|
<h4 class="text-center">Subject</h4>
|
|
<canvas id="subjectChart"></canvas>
|
|
</div>
|
|
<div class="col-md-4">
|
|
<h4 class="text-center">Grievances per Quarter</h4>
|
|
<canvas id="quarterChart"></canvas>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<script>
|
|
document.addEventListener('DOMContentLoaded', function () {
|
|
// Discipline Chart
|
|
var disciplineCtx = document.getElementById('disciplineChart').getContext('2d');
|
|
var disciplineChart = new Chart(disciplineCtx, {
|
|
type: 'pie',
|
|
data: {
|
|
labels: <?php echo json_encode($discipline_labels); ?>,
|
|
datasets: [{
|
|
label: 'Discipline',
|
|
data: <?php echo json_encode($discipline_values); ?>,
|
|
backgroundColor: [
|
|
'rgba(255, 99, 132, 0.7)',
|
|
'rgba(54, 162, 235, 0.7)',
|
|
'rgba(255, 206, 86, 0.7)',
|
|
'rgba(75, 192, 192, 0.7)',
|
|
'rgba(153, 102, 255, 0.7)',
|
|
'rgba(255, 159, 64, 0.7)'
|
|
],
|
|
borderColor: [
|
|
'rgba(255, 99, 132, 1)',
|
|
'rgba(54, 162, 235, 1)',
|
|
'rgba(255, 206, 86, 1)',
|
|
'rgba(75, 192, 192, 1)',
|
|
'rgba(153, 102, 255, 1)',
|
|
'rgba(255, 159, 64, 1)'
|
|
],
|
|
borderWidth: 1
|
|
}]
|
|
},
|
|
options: {
|
|
responsive: true,
|
|
plugins: {
|
|
legend: {
|
|
position: 'top',
|
|
},
|
|
tooltip: {
|
|
callbacks: {
|
|
label: function(context) {
|
|
let label = context.label || '';
|
|
if (label) {
|
|
label += ': ';
|
|
}
|
|
if (context.parsed !== null) {
|
|
label += context.parsed;
|
|
const total = context.chart.data.datasets[0].data.reduce((a, b) => a + b, 0);
|
|
const percentage = (context.parsed / total * 100).toFixed(2) + '%';
|
|
label += ' (' + percentage + ')';
|
|
}
|
|
return label;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
// Subject Chart
|
|
var subjectCtx = document.getElementById('subjectChart').getContext('2d');
|
|
var subjectChart = new Chart(subjectCtx, {
|
|
type: 'pie',
|
|
data: {
|
|
labels: <?php echo json_encode($subject_labels); ?>,
|
|
datasets: [{
|
|
label: 'Subject',
|
|
data: <?php echo json_encode($subject_values); ?>,
|
|
backgroundColor: [
|
|
'rgba(255, 99, 132, 0.7)',
|
|
'rgba(54, 162, 235, 0.7)',
|
|
'rgba(255, 206, 86, 0.7)',
|
|
'rgba(75, 192, 192, 0.7)',
|
|
'rgba(153, 102, 255, 0.7)',
|
|
'rgba(255, 159, 64, 0.7)'
|
|
],
|
|
borderColor: [
|
|
'rgba(255, 99, 132, 1)',
|
|
'rgba(54, 162, 235, 1)',
|
|
'rgba(255, 206, 86, 1)',
|
|
'rgba(75, 192, 192, 1)',
|
|
'rgba(153, 102, 255, 1)',
|
|
'rgba(255, 159, 64, 1)'
|
|
],
|
|
borderWidth: 1
|
|
}]
|
|
},
|
|
options: {
|
|
responsive: true,
|
|
plugins: {
|
|
legend: {
|
|
position: 'top',
|
|
},
|
|
tooltip: {
|
|
callbacks: {
|
|
label: function(context) {
|
|
let label = context.label || '';
|
|
if (label) {
|
|
label += ': ';
|
|
}
|
|
if (context.parsed !== null) {
|
|
label += context.parsed;
|
|
const total = context.chart.data.datasets[0].data.reduce((a, b) => a + b, 0);
|
|
const percentage = (context.parsed / total * 100).toFixed(2) + '%';
|
|
label += ' (' + percentage + ')';
|
|
}
|
|
return label;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
// Quarter Chart
|
|
var quarterCtx = document.getElementById('quarterChart').getContext('2d');
|
|
var quarterChart = new Chart(quarterCtx, {
|
|
type: 'pie',
|
|
data: {
|
|
labels: <?php echo json_encode($quarter_labels); ?>,
|
|
datasets: [{
|
|
label: 'Grievances per Quarter',
|
|
data: <?php echo json_encode($quarter_values); ?>,
|
|
backgroundColor: [
|
|
'rgba(255, 99, 132, 0.7)',
|
|
'rgba(54, 162, 235, 0.7)',
|
|
'rgba(255, 206, 86, 0.7)',
|
|
'rgba(75, 192, 192, 0.7)'
|
|
],
|
|
borderColor: [
|
|
'rgba(255, 99, 132, 1)',
|
|
'rgba(54, 162, 235, 1)',
|
|
'rgba(255, 206, 86, 1)',
|
|
'rgba(75, 192, 192, 1)'
|
|
],
|
|
borderWidth: 1
|
|
}]
|
|
},
|
|
options: {
|
|
responsive: true,
|
|
plugins: {
|
|
legend: {
|
|
position: 'top',
|
|
},
|
|
tooltip: {
|
|
callbacks: {
|
|
label: function(context) {
|
|
let label = context.label || '';
|
|
if (label) {
|
|
label += ': ';
|
|
}
|
|
if (context.parsed !== null) {
|
|
label += context.parsed;
|
|
const total = context.chart.data.datasets[0].data.reduce((a, b) => a + b, 0);
|
|
const percentage = (context.parsed / total * 100).toFixed(2) + '%';
|
|
label += ' (' + percentage + ')';
|
|
}
|
|
return label;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
});
|
|
});
|
|
</script>
|
|
|
|
<?php
|
|
require_once 'footer.php';
|
|
?>
|