File "check_by_register.php"
Full path: /home2/santhos2/public_html/bharath-coe.firstmatrix.in.net/api/results/check_by_register.php
File size: 9.11 KiB (9325 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($_POST['academic_year']) ? trim($_POST['academic_year']) : '';
$course_id = isset($_POST['course_id']) ? (int)$_POST['course_id'] : 0;
$exam_type_id = isset($_POST['exam_type_id']) ? (int)$_POST['exam_type_id'] : 0;
$register_number = isset($_POST['register_number']) ? trim($_POST['register_number']) : '';
if(!$academic_year || !$course_id || !$exam_type_id || !$register_number){
echo json_encode(['status'=>'error','message'=>'Missing required fields']);
exit;
}
global $pdo;
// Process academic year format (same as report API)
$ay_term = (preg_match('/\b(Odd|Even)\b$/', $academic_year)) ? $academic_year : ($academic_year . ' Even');
$ay_term = preg_replace('/\s+(Odd|Even)\s+\1$/', ' $1', $ay_term);
// Find student by register number
$stmt = $pdo->prepare("SELECT s.student_id, s.university_rollno, s.first_name, s.last_name, s.course_id, c.course_name, c.course_code
FROM students s
LEFT JOIN courses c ON s.course_id = c.course_id
WHERE s.university_rollno = ? AND s.course_id = ?");
$stmt->execute([$register_number, $course_id]);
$student = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$student) {
echo json_encode(['status'=>'error','message'=>'Student not found with this register number']);
exit;
}
// Get subjects for the course and academic year
$stmt = $pdo->prepare("SELECT DISTINCT s.subject_id, s.subject_code, s.subject_name, s.credits, s.semester
FROM subjects s
INNER JOIN exam_subjects es ON s.subject_id = es.subject_id
INNER JOIN exams e ON es.exam_id = e.exam_id
WHERE s.course_id = ? AND e.academic_year = ? AND e.exam_type_id = ?
ORDER BY s.semester, s.subject_code");
$stmt->execute([$course_id, $ay_term, $exam_type_id]);
$subjects = $stmt->fetchAll(PDO::FETCH_ASSOC);
if (empty($subjects)) {
echo json_encode(['status'=>'error','message'=>'No subjects found for this course and academic year']);
exit;
}
// Get CI settings for calculation method
$stmt = $pdo->prepare("SELECT calculation_method FROM ci_assessment_settings WHERE course_id=? AND exam_type='Internal' ORDER BY setting_id DESC LIMIT 1");
$stmt->execute([$course_id]);
$ciSettings = $stmt->fetch(PDO::FETCH_ASSOC);
$calculationMethod = $ciSettings['calculation_method'] ?? 'best2_avg';
// Get internal marks based on calculation method from CI1, CI2, CI3
$internalMarks = [];
$subIds = implode(',', array_map('intval', array_column($subjects, 'subject_id')));
$stmt = $pdo->prepare("SELECT
im.student_id,
ie.subject_id,
ie.exam_type_id,
im.marks_obtained
FROM internal_marks im
JOIN internal_exams ie ON im.internal_exam_id = ie.internal_exam_id
WHERE im.student_id = ?
AND ie.subject_id IN ($subIds)
AND ie.academic_year = ?");
$stmt->execute([$student['student_id'], $ay_term]);
$internalData = [];
while($r = $stmt->fetch(PDO::FETCH_ASSOC)){
$key = (int)$r['subject_id'];
if(!isset($internalData[$key])) $internalData[$key] = [];
$internalData[$key][(int)$r['exam_type_id']] = (float)$r['marks_obtained'];
}
// Compute internal marks based on calculation method for each subject
foreach($internalData as $subId => $marks){
$ciMarks = array_values($marks);
if(count($ciMarks) >= 1){
$internalMark = 0;
if($calculationMethod === 'best1'){
// Best of 1
$internalMark = max($ciMarks);
} else if($calculationMethod === 'avg3' && count($ciMarks) >= 3){
// Average of 3
$internalMark = array_sum($ciMarks) / count($ciMarks);
} else if($calculationMethod === 'best2_avg' && count($ciMarks) >= 2){
// Best 2 average (default behavior)
rsort($ciMarks);
$best2 = array_slice($ciMarks, 0, 2);
$internalMark = array_sum($best2) / count($best2);
} else if(count($ciMarks) >= 2){
// Fallback to best 2 average if not enough marks for selected method
rsort($ciMarks);
$best2 = array_slice($ciMarks, 0, 2);
$internalMark = array_sum($best2) / count($best2);
} else {
// Just use the single mark if only one exists
$internalMark = $ciMarks[0];
}
$internalMarks[$subId] = round($internalMark, 2);
}
}
// Get external marks from subject_results - same as report
$externalMarks = [];
$stmt = $pdo->prepare("SELECT sr.subject_id, sr.external_marks, sr.internal_marks, sr.result
FROM subject_results sr
JOIN exams e ON sr.exam_id = e.exam_id
WHERE sr.student_id = ? AND sr.subject_id IN ($subIds) AND e.academic_year = ?");
$stmt->execute([$student['student_id'], $ay_term]);
while($r = $stmt->fetch(PDO::FETCH_ASSOC)){
$externalMarks[(int)$r['subject_id']] = [
'external_marks' => (float)$r['external_marks'],
'internal_marks' => (float)$r['internal_marks'],
'result' => $r['result']
];
}
// Get grading system for the course
$grading = [];
$gsStmt = $pdo->prepare("SELECT grading_system_id FROM grading_systems WHERE course_id=? AND is_active=1 ORDER BY grading_system_id DESC LIMIT 1");
$gsStmt->execute([$course_id]);
$gs = $gsStmt->fetch(PDO::FETCH_ASSOC);
if($gs){
$gStmt = $pdo->prepare("SELECT grade_name, min_marks, max_marks, grade_point, is_pass FROM grades WHERE grading_system_id=? ORDER BY min_marks ASC");
$gStmt->execute([$gs['grading_system_id']]);
$grading = $gStmt->fetchAll(PDO::FETCH_ASSOC) ?: [];
}
$computeGrade = function(float $external) use ($grading){
if(empty($grading)) return ['grade_name'=>null,'grade_point'=>null,'is_pass'=>null];
foreach($grading as $g){
if($external >= (float)$g['min_marks'] && $external <= (float)$g['max_marks']){
return ['grade_name'=>$g['grade_name'],'grade_point'=>(float)$g['grade_point'],'is_pass'=>(int)$g['is_pass']===1];
}
}
return ['grade_name'=>null,'grade_point'=>null,'is_pass'=>null];
};
// Combine data
$results = [];
foreach($subjects as $sub) {
$subId = (int)$sub['subject_id'];
$ext = $externalMarks[$subId] ?? ['external_marks' => 0, 'internal_marks' => 0, 'result' => null];
$int = (float)($internalMarks[$subId] ?? $ext['internal_marks']);
$ext_marks = (float)$ext['external_marks'];
$total = $int + $ext_marks;
// Normalize result
$resRaw = $ext['result'];
$gradeInfo = $computeGrade($ext_marks);
$resultText = 'RA';
if($resRaw){
$resultText = (strtolower($resRaw)==='pass') ? 'PASS' : ((strtolower($resRaw)==='absent' || strtolower($resRaw)==='abs') ? 'ABS' : 'RA');
} else {
if($int==0 && $ext_marks==0){ $resultText = 'ABS'; }
else if($gradeInfo && $gradeInfo['is_pass']===true){ $resultText = 'PASS'; }
else { $resultText = 'RA'; }
}
$results[] = [
'subject_id' => $subId,
'subject_code' => $sub['subject_code'],
'subject_name' => $sub['subject_name'],
'credits' => (int)$sub['credits'],
'internal_marks' => $int,
'external_marks' => $ext_marks,
'total_marks' => $total,
'grade' => $gradeInfo['grade_name'],
'grade_point' => $gradeInfo['grade_point'],
'result' => $resultText
];
}
$result_data = [
'student' => [
'student_id' => $student['student_id'],
'university_rollno' => $student['university_rollno'],
'name' => trim(($student['first_name']??'').' '.($student['last_name']??''))
],
'course' => [
'course_id' => $course_id,
'course_name' => $student['course_name'],
'course_code' => $student['course_code']
],
'academic_year' => $academic_year,
'exam_type_id' => $exam_type_id,
'results' => $results
];
echo json_encode(['status'=>'success','result_data'=>$result_data]);
} catch (Exception $e) {
http_response_code(500);
echo json_encode(['status'=>'error','message'=>$e->getMessage()]);
}
ob_end_clean();
?>