Skip to content

Commit

Permalink
RemedialCourse: Set Remedial or Advance Course into settings of
Browse files Browse the repository at this point in the history
excercise #18165 - refs BT#18165
  • Loading branch information
carlangas159 committed Mar 16, 2021
1 parent ba6b2f9 commit 3486510
Showing 1 changed file with 315 additions and 2 deletions.
317 changes: 315 additions & 2 deletions main/exercise/exercise.class.php
Expand Up @@ -2487,14 +2487,78 @@ public function createForm($form, $type = 'full')
$extraField->addElements(
$form,
$this->iId,
['notifications'], //exclude
[
'notifications',
'remedialcourselist',
'advancedcourselist'
], //exclude
false, // filter
false, // tag as select
[], //show only fields
[], // order fields
[] // extra data
);

// See BT#18165
$remedialList =[
'remedialcourselist'=>'remedialCourseList',
'advancedcourselist'=>'advancedCoursList',
] ;
foreach($remedialList as $item=>$label){
$field = new ExtraField('exercise');
$remedialField = $field->get_handler_field_info_by_field_variable($item);
$t = new ExtraFieldValue('exercise');
$sessionId = api_get_session_id();
if (
isset($remedialField['default_value'])
&& $remedialField['default_value'] == 1 // if the plugin is activated
) {
$optionRemedial = [];
$defaults[$item]= [];
$remedialExtraValue = $t->get_values_by_handler_and_field_id($this->iId, $remedialField['id']);
$defaults[$item] = (isset($remedialExtraValue['value']))?explode(';',$remedialExtraValue['value']):[];
if ($sessionId != 0) {
$courseList = SessionManager::getCoursesInSession($sessionId);
foreach ($courseList as $course) {
$courseSession = api_get_course_info_by_id($course);
$course_id = $courseSession['real_id'];
$title = $courseSession['title'];
if (api_get_course_int_id() != $course_id) {
$optionRemedial[$course_id] = "$title";
}
}
} else {
$courseList = CourseManager::get_courses_list_by_user_id(
api_get_user_id(),
false,
false,
true,
[],
false
);
foreach ($courseList as $course) {
$course_id = $course['real_id'];
$title = $course['title'];
if (api_get_course_int_id() != $course_id) {
$optionRemedial[$course_id] = "$title";
}
}
}
unset($optionRemedial[0]);
$form->addSelect(
"extra_".$item,
get_lang($label),
$optionRemedial,
[
'placeholder' => get_lang('SelectAnOption'),
'multiple' => 'multiple'
]
);

}

}

$settings = api_get_configuration_value('exercise_finished_notification_settings');
if (!empty($settings)) {
$options = [];
Expand Down Expand Up @@ -6733,6 +6797,7 @@ public function is_visible(
}

// 4. We check if the student have attempts
$extraMessage = ''; // extra mensaje
if ($isVisible) {
$exerciseAttempts = $this->selectAttempts();

Expand All @@ -6745,12 +6810,14 @@ public function is_visible(
$lpItemViewId
);

$extraMessage .= $this->advanceCourseList();
if ($attemptCount >= $exerciseAttempts) {
$message = sprintf(
get_lang('ReachedMaxAttempts'),
$this->name,
$exerciseAttempts
);
$message .= $this->remedialCourseList(api_get_user_id());
$isVisible = false;
} else {
// Check blocking exercise.
Expand Down Expand Up @@ -6784,7 +6851,7 @@ public function is_visible(
}
}
}

$message .= $extraMessage;
$rawMessage = '';
if (!empty($message)) {
$rawMessage = $message;
Expand Down Expand Up @@ -11294,4 +11361,250 @@ private function setResultDisabledGroup(FormValidator $form)
get_lang('ShowResultsToStudents')
);
}

/**
* When a student takes an exam, and he gets an acceptable grade, he is enrolled in a series of courses that
* represent the next level BT#18165
*
* @return string|null
*/
public function advanceCourseList($userId =0){
$userId = ((int)$userId == 0)?$userId:api_get_user_id();
$extraMessage = null;
/******************************************************************/
$bestAttempt = Event::get_best_attempt_exercise_results_per_user(
$userId,
$this->id,
$this->course_id,
$this->sessionId
);
if (!isset($bestAttempt['exe_result'])) {
// In the case that the result is 0, get_best_attempt_exercise_results_per_user does not return data,
// for that this block is used
$exercise_stat_info = Event::getExerciseResultsByUser(
$userId,
$this->id,
$this->course_id,
$this->sessionId
);
$bestAttempt['exe_result'] = 0;
foreach ($exercise_stat_info as $attemp) {
if ($attemp['exe_result'] >= $bestAttempt['exe_result']) {
$bestAttempt = $attemp;
}
}
}
if(
!isset( $bestAttempt['exe_result'])
|| !isset( $bestAttempt['exe_id'])
|| !isset( $bestAttempt['exe_weighting'])
) {
// Sin intentos, sin id de ejercicio y sin total definido
return '';
}

$resultado = $bestAttempt['exe_result'];
$total = $bestAttempt['exe_weighting'];
$objExercise = new Exercise();
$objExercise->read($bestAttempt['exe_id']);
$percentSuccess = (float)$objExercise->selectPassPercentage();
$pass = ExerciseLib::isPassPercentageAttemptPassed(
$objExercise,
$resultado,
$total
);
if ($percentSuccess == 0 && $pass == false) {
return '';
}
$canRemedial = ($pass == false) ? true : false;
//Examen de siguiente nivel
$extraFieldValue = new ExtraFieldValue('exercise');
$advanceCourseExcerciseField = $extraFieldValue->get_values_by_handler_and_field_variable(
$this->iId,
'advancedcourselist'
);
$field = new ExtraField('exercise');
$advancedCourseField = $field->get_handler_field_info_by_field_variable('advancedcourselist');
if (!empty($advanceCourseExcerciseField)
&& isset($advancedCourseField['default_value'])
&& $advancedCourseField['default_value'] == 1 // if the plugin is activated
&& $canRemedial == false
) {
$coursesIds = explode(';', $advanceCourseExcerciseField['value']);
$courses = [];
foreach ($coursesIds as $course) {
$courseData = api_get_course_info_by_id($course);
//aqui se inscribe en el curso
$isInASession = !empty($this->sessionId);
$isSubscribed = CourseManager::is_user_subscribed_in_course(
$userId,
$courseData['code'],
$isInASession,
$this->sessionId
);

if (!$isSubscribed) {
CourseManager::subscribeUser(
$userId,
$courseData['code'],
STUDENT,
$this->sessionId
);

}
$courses[] = $courseData['title'];
}
if (count($courses) != 0) {
$extraMessage .= "<br>".get_lang('AdvancedCourseInscription')." <strong>".
implode(' - ', $courses)."</strong> ";
}
}
/******************************************************************/
return $extraMessage;
}

/**
* When a student completes the number of attempts and fails the exam, she is enrolled in a series of remedial
* courses BT#18165
*
* @return string|null
*/
public function remedialCourseList($userId = 0, $review = false){
$userId = ((int)$userId == 0)?$userId:api_get_user_id();
$extraMessage = null;
$bestAttempt = Event::get_best_attempt_exercise_results_per_user(
$userId,
$this->id,
$this->course_id,
$this->sessionId
);
if (!isset($bestAttempt['exe_result'])) {
// In the case that the result is 0, get_best_attempt_exercise_results_per_user does not return data,
// for that this block is used
$exercise_stat_info = Event::getExerciseResultsByUser(
$userId,
$this->id,
$this->course_id,
$this->sessionId
);
$bestAttempt['exe_result'] = 0;
foreach ($exercise_stat_info as $attemp) {
if ($attemp['exe_result'] >= $bestAttempt['exe_result']) {
$bestAttempt = $attemp;
}
}
}
$questionExcluded = [
5
];
$questionList = isset($bestAttempt['question_list'])?$bestAttempt['question_list']:null;
if(isset($bestAttempt['question_list'])) {
foreach ($bestAttempt['question_list'] as $questionId => $answer) {
$question = Question::read($questionId, api_get_course_info_by_id($bestAttempt['c_id']));
$type = $question->type;
if (in_array($type, $questionExcluded) && $review == false) {
return '';
}
}
}
//https://github.com/chamilo/chamilo-lms/blob/1.11.x/main/inc/lib/exercise.lib.php#L2103
// CMAR
// Si viene por revision y no tiene preguntas abiertas por corregir
// if($review == true) {
$whereCondition = '';


$whereCondition .= " te.exe_user_id = '$userId'";

/*
if (!empty($whereCondition)) {
$whereCondition = " AND $whereCondition";
}
*/

/*
$count = ExerciseLib::get_count_exam_results(
$this->id,
$whereCondition
);
*/
// CMAR Aqui se debe validar los ejercicios corregidos
$count = ExerciseLib::get_exam_results_data(
null,
null,
null,
null,
$this->id,
$whereCondition,
false
// ,
// $courseCode,
// $showSession
);
$a = $count ;
// }
$resultado = $bestAttempt['exe_result'];
$total = $bestAttempt['exe_weighting'];
$objExercise = new Exercise();
$objExercise->read($bestAttempt['exe_id']);
$percentSuccess = (float)$objExercise->selectPassPercentage();
$pass = ExerciseLib::isPassPercentageAttemptPassed(
$objExercise,
$resultado,
$total
);
if ($percentSuccess == 0 && $pass == false) {
return '';
}
$canRemedial = ($pass == false) ? true : false;
$extraFieldValue = new ExtraFieldValue('exercise');
$remedialExcerciseField = $extraFieldValue->get_values_by_handler_and_field_variable(
$this->iId,
'remedialcourselist'
);
$field = new ExtraField('exercise');
$remedialField = $field->get_handler_field_info_by_field_variable('remedialcourselist');


// examen de recuperacion
if (!empty($remedialExcerciseField)
&& isset($remedialField['default_value'])
&& $remedialField['default_value'] == 1 // if the plugin is activated
&& $canRemedial
) {
$coursesIds = explode(';', $remedialExcerciseField['value']);
$courses = [];
foreach ($coursesIds as $course) {
$courseData = api_get_course_info_by_id($course);
//aqui se inscribe en el curso
$isInASession = !empty($this->sessionId);
$isSubscribed = CourseManager::is_user_subscribed_in_course(
$userId,
$courseData['code'],
$isInASession,
$this->sessionId
);

if (!$isSubscribed) {
CourseManager::subscribeUser(
$userId,
$courseData['code'],
STUDENT,
$this->sessionId
);

$courses[] = $courseData['title'];
}

}

if (count($courses) != 0) {
$extraMessage .= "<br>".get_lang('RemedialCourseInscription')." <strong>".
implode(' - ', $courses)."</strong> ";
} else {
$extraMessage .= "<br>".get_lang('RemedialCourseAlreadyInscription');
}
}
return $extraMessage;
}
}

0 comments on commit 3486510

Please sign in to comment.