Update Saqel Platform: 2026-09-20 16:38:51

This commit is contained in:
Hamza-Ayed
2026-09-20 16:38:51 +03:00
parent 5805413f51
commit e8163fe265
11 changed files with 1140 additions and 3002 deletions
@@ -20,6 +20,8 @@ class ErrorNotebookController
$items = Database::select($sql . ' ORDER BY created_at DESC', $params);
$mastered = count(array_filter($items, fn($item) => ($item['status'] ?? '') === 'mastered'));
$inRemediation = count(array_filter($items, fn($item) => ($item['status'] ?? '') === 'in_remediation'));
$pending = count(array_filter($items, fn($item) => ($item['status'] ?? '') === 'pending_remediation'));
$bySubject = [];
foreach ($items as $item) {
$name = (string)($item['subject_name'] ?? '');
@@ -30,7 +32,8 @@ class ErrorNotebookController
'summary' => [
'total_errors' => $total,
'mastered_count' => $mastered,
'pending_count' => $total - $mastered,
'in_remediation_count' => $inRemediation,
'pending_count' => $pending,
'mastery_percentage' => $total ? round(($mastered / $total) * 100, 1) : 0.0,
'by_subject' => $bySubject,
],
@@ -146,12 +149,18 @@ class ErrorNotebookController
return;
}
// Mark error as mastered upon successful completion of remedial drill
$isRetentionPhase = ($error['status'] === 'in_remediation');
$nextStatus = $isRetentionPhase ? 'mastered' : 'in_remediation';
// Stage 1: Initial Remedial Drill passed -> enters Spaced Repetition (in_remediation)
// Stage 2: Spaced Repetition Retention Challenge passed -> enters permanently Mastered
Database::query(
"UPDATE student_error_notebook
SET status = 'mastered', mastered_at = NOW(), remediation_attempts_count = remediation_attempts_count + 1
"UPDATE student_error_notebook
SET status = ?,
mastered_at = IF(? = 'mastered', NOW(), mastered_at),
remediation_attempts_count = remediation_attempts_count + 1
WHERE id = ?",
[(int)$error['id']]
[$nextStatus, $nextStatus, (int)$error['id']]
);
// Update student mastery analytics and readiness
@@ -160,8 +169,10 @@ class ErrorNotebookController
[$studentId]
);
if ($currentMastery) {
$newReadiness = min(100.0, (float)$currentMastery['tawjihi_readiness_score'] + 1.2);
$newMastery = min(100.0, (float)$currentMastery['mastery_percentage'] + 1.0);
$readinessGain = $isRetentionPhase ? 1.5 : 0.6;
$masteryGain = $isRetentionPhase ? 1.2 : 0.5;
$newReadiness = min(100.0, (float)$currentMastery['tawjihi_readiness_score'] + $readinessGain);
$newMastery = min(100.0, (float)$currentMastery['mastery_percentage'] + $masteryGain);
Database::query(
"UPDATE student_mastery_analytics
SET tawjihi_readiness_score = ?, mastery_percentage = ?, updated_at = NOW()
@@ -170,11 +181,23 @@ class ErrorNotebookController
);
}
$response->json([
'status' => 'success',
'mastered' => true,
'message' => 'تم اعتماد الشفاء المعرفي للفجوة بنجاح وتحديث مؤشر الجاهزية الأكاديمية.',
]);
if ($isRetentionPhase) {
$response->json([
'status' => 'success',
'mastered' => true,
'is_retention_verified' => true,
'new_status' => 'mastered',
'message' => 'تم اجتياز اختبار الاسترجاع والتثبيت بنجاح تام! اعتُمد المفهوم كمتقن في الذاكرة طويلة المدى.',
]);
} else {
$response->json([
'status' => 'success',
'mastered' => false,
'is_retention_verified' => false,
'new_status' => 'in_remediation',
'message' => 'تم اجتياز الكويز العلاجي الأولي بنجاح! انتقل المفهوم إلى مرحلة التثبيت والتكرار المتباعد (المراجعة بعد 7 أيام لتأكيد الإتقان التام ومنع النسيان).',
]);
}
}
/**