File "read_marks_context.php"
Full path: /home2/santhos2/public_html/bharath-coe.firstmatrix.in.net/api/internal_marks/read_marks_context.php
File size: 6.66 KiB (6822 bytes)
MIME-type: text/x-php
Charset: utf-8
<?php
require_once __DIR__ . '/../../config/config.php';
header('Content-Type: application/json');
ob_start();
try {
$academic_year = isset($_GET['academic_year']) ? trim($_GET['academic_year']) : '';
$course_id = isset($_GET['course_id']) ? (int)$_GET['course_id'] : 0;
$semester = isset($_GET['semester']) ? (int)$_GET['semester'] : 0;
$subject_id = isset($_GET['subject_id']) ? (int)$_GET['subject_id'] : 0;
if (!$academic_year || !$course_id || !$semester || !$subject_id) { echo json_encode(['status'=>'error','message'=>'Missing params']); exit; }
global $pdo;
// Get subject's course info
$stmt = $pdo->prepare("SELECT course_id, (SELECT course_name FROM courses WHERE courses.course_id=subjects.course_id) as course_name FROM subjects WHERE subject_id=?");
$stmt->execute([$subject_id]);
$subject_row = $stmt->fetch(PDO::FETCH_ASSOC);
if(!$subject_row){
echo json_encode(['status'=>'error','message'=>'Subject not found']);
exit;
}
$subject_course_id = $subject_row['course_id'];
$subject_course_name = $subject_row['course_name'];
// Determine which course to use for settings
$use_course_id = $subject_course_id;
$use_course_name = $subject_course_name;
$force_course_valid = false;
// Check if force_course_id is requested
$force_course_id = isset($_GET['force_course_id']) ? (int)$_GET['force_course_id'] : 0;
if($force_course_id > 0) {
$stmt = $pdo->prepare("SELECT course_name FROM courses WHERE course_id=?");
$stmt->execute([$force_course_id]);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
if($row) {
$use_course_id = $force_course_id;
$use_course_name = $row['course_name'];
$force_course_valid = true;
}
}
// Get course assessment settings
$exam_type = isset($_GET['exam_type']) ? $_GET['exam_type'] : 'Semester';
$stmt = $pdo->prepare("SELECT max_marks, pass_marks, min_marks FROM course_assessment_settings WHERE course_id=? AND exam_type=? ORDER BY setting_id DESC LIMIT 1");
$stmt->execute([$use_course_id, $exam_type]);
$settings = $stmt->fetch(PDO::FETCH_ASSOC);
if(!$settings){
$settings = ['max_marks'=>20,'pass_marks'=>10,'min_marks'=>0];
}
// Get CI settings for this course (use the correct course ID)
$stmt = $pdo->prepare("SELECT ci1_max_marks, ci2_max_marks, ci3_max_marks, calculation_method FROM ci_assessment_settings WHERE course_id=? AND exam_type=? ORDER BY setting_id DESC LIMIT 1");
$stmt->execute([$use_course_id, $exam_type]);
$ciSettings = $stmt->fetch(PDO::FETCH_ASSOC);
if(!$ciSettings){
$ciSettings = ['ci1_max_marks'=>10,'ci2_max_marks'=>10,'ci3_max_marks'=>10, 'calculation_method'=>'best2_avg'];
}
// Get students for the course and semester
$stmt = $pdo->prepare("SELECT student_id, university_rollno, first_name, last_name FROM students WHERE course_id=? AND current_semester=? AND status='Active' ORDER BY university_rollno");
$stmt->execute([$use_course_id, $semester]);
$students = $stmt->fetchAll(PDO::FETCH_ASSOC);
// existing internal marks aggregated for CI1, CI2, CI3 using internal_exams.exam_type_id as 1,2,3
$saved_only = isset($_GET['saved_only']) ? (int)$_GET['saved_only'] : 0;
// Fix the academic year format to match what's stored in internal_exams table
// Ensure the format matches what's in internal_exams table: "2025-2026 - Even"
// If it doesn't have the dash before Even/Odd, add it
$ay_term = $academic_year;
if (preg_match('/^(\d{4}-\d{4})\s+(Even|Odd)$/', $ay_term, $matches)) {
$ay_term = $matches[1] . ' - ' . $matches[2];
}
$ay_base = preg_replace('/\\s+(Odd|Even)$/','', $ay_term);
$stmt = $pdo->prepare(
"SELECT base.student_id, base.ci1, base.ci2, base.ci3,
a1.attendance_pct AS ci1_att,
a2.attendance_pct AS ci2_att,
a3.attendance_pct AS ci3_att
FROM (
SELECT im.student_id,
MAX(CASE WHEN et.type_name='CI1' THEN im.marks_obtained END) AS ci1,
MAX(CASE WHEN et.type_name='CI2' THEN im.marks_obtained END) AS ci2,
MAX(CASE WHEN et.type_name='CI3' THEN im.marks_obtained END) AS ci3
FROM internal_marks im
JOIN internal_exams ie ON im.internal_exam_id = ie.internal_exam_id
JOIN exam_types et ON ie.exam_type_id = et.exam_type_id
WHERE ie.subject_id=? AND ie.academic_year IN (?, ?) AND ie.semester=?
GROUP BY im.student_id
) base
LEFT JOIN internal_exams ie1 ON ie1.subject_id=? AND ie1.academic_year IN (?, ?) AND ie1.semester=?
AND ie1.exam_type_id = (SELECT exam_type_id FROM exam_types WHERE type_name='CI1' LIMIT 1)
LEFT JOIN internal_exams ie2 ON ie2.subject_id=? AND ie2.academic_year IN (?, ?) AND ie2.semester=?
AND ie2.exam_type_id = (SELECT exam_type_id FROM exam_types WHERE type_name='CI2' LIMIT 1)
LEFT JOIN internal_exams ie3 ON ie3.subject_id=? AND ie3.academic_year IN (?, ?) AND ie3.semester=?
AND ie3.exam_type_id = (SELECT exam_type_id FROM exam_types WHERE type_name='CI3' LIMIT 1)
LEFT JOIN internal_ci_attendance a1 ON a1.internal_exam_id = ie1.internal_exam_id AND a1.student_id = base.student_id
LEFT JOIN internal_ci_attendance a2 ON a2.internal_exam_id = ie2.internal_exam_id AND a2.student_id = base.student_id
LEFT JOIN internal_ci_attendance a3 ON a3.internal_exam_id = ie3.internal_exam_id AND a3.student_id = base.student_id"
. ($saved_only ? " WHERE (base.ci1 IS NOT NULL OR base.ci2 IS NOT NULL OR base.ci3 IS NOT NULL OR a1.attendance_pct IS NOT NULL OR a2.attendance_pct IS NOT NULL OR a3.attendance_pct IS NOT NULL)" : "")
);
$stmt->execute([$subject_id, $ay_term, $ay_base, $semester,
$subject_id, $ay_term, $ay_base, $semester,
$subject_id, $ay_term, $ay_base, $semester,
$subject_id, $ay_term, $ay_base, $semester]);
$marks = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo json_encode([
'status'=>'success',
'settings'=>$settings,
'ci_settings'=>$ciSettings,
'students'=>$students,
'marks'=>$marks,
'subject_course_id'=>$subject_course_id,
'subject_course_name'=>$subject_course_name,
'used_course_id'=>$use_course_id,
'used_course_name'=>$use_course_name,
'force_course_id'=>$force_course_id,
'force_course_valid'=>$force_course_valid
]);
} catch (Throwable $e) {
error_log('read_marks_context error: '.$e->getMessage());
http_response_code(500);
echo json_encode(['status'=>'error','message'=>$e->getMessage()]);
}
ob_end_flush();
?>