Skip to content

Commit

Permalink
Merge pull request #115 from OrifInformatique:list_user_courses
Browse files Browse the repository at this point in the history
Rework user courses management
  • Loading branch information
DidierViret committed Jul 10, 2024
2 parents 9e7e162 + dbdd2dc commit 32dcda2
Show file tree
Hide file tree
Showing 10 changed files with 297 additions and 104 deletions.
170 changes: 112 additions & 58 deletions orif/plafor/Controllers/Apprentice.php
Original file line number Diff line number Diff line change
Expand Up @@ -195,29 +195,74 @@ public function view_apprentice($apprentice_id = 0) {
return $this->display_view('Plafor\apprentice/view',$output);
}


/**
* Display the list of user courses linked to one given user
*
* @param int $id_apprentice ID of the concerned apprentice
*
* @return void
*
*/
public function list_user_courses($id_apprentice = null)
{
if(is_numeric($id_apprentice))
$user = $this->user_model->where('id', $id_apprentice)->first();

if(!isset($user) || empty($user))
return redirect()->to('plafor/apprentice/list_apprentice');

$user_courses = $this->user_course_model->where('fk_user', $id_apprentice)->findAll();

// Get the course_plan informations for each user_course
foreach($user_courses as &$user_course)
{
$user_course['course_plan'] = $this->course_plan_model->withDeleted()->find($user_course['fk_course_plan']);
$user_course['status'] = $this->user_course_status_model->getUserCourseStatusName($user_course['fk_status']);

if($user_course['date_end'] === '0000-00-00')
$user_course['date_end'] = null;
}

$output = array(
'title' => sprintf(lang('plafor_lang.title_user_course_plan_list'), $user['username']),
'user_courses' => $user_courses,
'id_apprentice' => $id_apprentice
);

return $this->display_view(['Plafor\user_course\list'], $output);
}


/**
* Displays a form to create a link between an apprentice and a course plan
*
* @param int $id_apprentice : ID of the apprentice
* @param int $id_user_course : ID of the user's course
* @param int $id_apprentice ID of the apprentice
* @param int $id_user_course ID of the user's course
*
* @return void
*
*/
public function save_user_course($id_apprentice = 0, $id_user_course = 0) {
public function save_user_course($id_apprentice = 0, $id_user_course = 0)
{
// Access permissions
if ($this->session->get('user_access')>=config('\User\Config\UserConfig')->access_lvl_trainer) {
// Gets data of the apprentice and their course, if they exist
$user_type_id = $this->user_type_model->
where('access_level', config('\User\Config\UserConfig')->access_level_apprentice)->first()['id'];
$apprentice = $this->user_model->where('fk_user_type', $user_type_id)->find($id_apprentice);
if($this->session->get('user_access')>=config('\User\Config\UserConfig')->access_lvl_trainer)
{
$user_type_id = $this->user_type_model
->where('access_level', config('\User\Config\UserConfig')->access_level_apprentice)
->first()['id'];

$apprentice = $this->user_model
->where('fk_user_type', $user_type_id)
->find($id_apprentice);

$user_course = $this->user_course_model->find($id_user_course);

// Redirection
if (is_null($apprentice)) {
if(is_null($apprentice))
return redirect()->to(base_url('plafor/apprentice/list_apprentice'));
}

// Actions upon form submission
if (count($_POST) > 0) {
if(count($_POST) > 0)
{
$fk_course_plan = $this->request->getPost('course_plan');
$new_user_course = array(
'fk_user' => $id_apprentice,
Expand All @@ -227,65 +272,73 @@ public function save_user_course($id_apprentice = 0, $id_user_course = 0) {
'date_end' => $this->request->getPost('date_end'),
);

// Query to perform
if (!is_null($user_course)) {
if (!is_null($user_course))
// User's course already exists - updates it
$this->user_course_model->update($id_user_course, $new_user_course);
} else if ($this->user_course_model->where('fk_user', $id_apprentice)->where('fk_course_plan', $fk_course_plan)->first() == null) {
// No user's course was found in database - inserts a new one
$id_user_course = $this->user_course_model->insert($new_user_course);

$course_plan = $this->user_course_model->getCoursePlan($new_user_course['fk_course_plan']);
$competenceDomainIds = [];

foreach ($this->course_plan_model->getCompetenceDomains($course_plan['id']) as $competence_domain) {
$competenceDomainIds[] = $competence_domain['id'];
}

else
{
$user_has_course = $this->user_course_model->where(['fk_user' => $id_apprentice, 'fk_course_plan' => $fk_course_plan])->findAll() ? true : false;

// If the apprentice already follows the course plan submitted, prevent the creation of the entry.
if(!$user_has_course)
{
// No user's course was found in database - inserts a new one
$id_user_course = $this->user_course_model->insert($new_user_course);

$course_plan = $this->user_course_model->getCoursePlan($new_user_course['fk_course_plan']);
$competenceDomainIds = [];

foreach ($this->course_plan_model->getCompetenceDomains($course_plan['id']) as $competence_domain)
$competenceDomainIds[] = $competence_domain['id'];

$operational_competences = [];
// No operational competence associated
try
{
$operational_competences = $this->operational_comp_model->withDeleted()->whereIn('fk_competence_domain', $competenceDomainIds)->findAll();
}

catch (\Exception $e) {};

// Adds an acquisition status of level 1 for each objective
$objectiveIds = array();
foreach ($operational_competences as $operational_competence)
{
foreach ($this->operational_comp_model->getObjectives($operational_competence['id']) as $objective)
$objectiveIds[] = $objective['id'];
}

$operational_competences = [];
// No operational competence associated
try {
$operational_competences = $this->operational_comp_model->withDeleted()->whereIn('fk_competence_domain', $competenceDomainIds)->findAll();
} catch (\Exception $e) {
};
// Adds an acquisition status of level 1 for each objective
$objectiveIds = array();
foreach ($operational_competences as $operational_competence) {
foreach ($this->operational_comp_model->getObjectives($operational_competence['id']) as $objective) {
$objectiveIds[] = $objective['id'];
foreach ($objectiveIds as $objectiveId)
{
$acquisition_status = array(
'fk_objective' => $objectiveId,
'fk_user_course' => $id_user_course,
'fk_acquisition_level' => 1
);

$this->acquisition_status_model->insert($acquisition_status);
}
}
foreach ($objectiveIds as $objectiveId) {
$acquisition_status = array(
'fk_objective' => $objectiveId,
'fk_user_course' => $id_user_course,
'fk_acquisition_level' => 1
);

$this->acquisition_status_model->insert($acquisition_status);
}
}
// Error handling
if ($this->user_course_model->errors() == null) {
// No error - redirects to apprentice page
return redirect()->to(base_url('plafor/apprentice/view_apprentice/' . $id_apprentice));
}

if($this->user_course_model->errors() == null)
return redirect()->to(base_url('plafor/apprentice/list_user_courses/' . $id_apprentice));
}

// Preparing data for the view
// Course plans
$course_plans = [];
$status = [];

foreach ($this->course_plan_model->findAll() as $courseplan)
$course_plans[$courseplan['id']] = $courseplan['official_name'];
// Status of user's course
$status = [];
foreach ($this->user_course_status_model->findAll() as $usercoursestatus) {

foreach ($this->user_course_status_model->findAll() as $usercoursestatus)
$status[$usercoursestatus['id']] = $usercoursestatus['name'];
}

// Data to send to the view
$output = array(
'title' => lang('plafor_lang.title_user_course_plan_link'),
'title' => lang('plafor_lang.title_add_user_course'),
'course_plans' => $course_plans,
'user_course' => $user_course,
'status' => $status,
Expand All @@ -294,9 +347,10 @@ public function save_user_course($id_apprentice = 0, $id_user_course = 0) {
);

return $this->display_view('Plafor\user_course/save', $output);
} else {
}

else
return $this->display_view('\User\errors\403error');
}
}

/**
Expand Down
81 changes: 57 additions & 24 deletions orif/plafor/Controllers/CoursePlan.php
Original file line number Diff line number Diff line change
Expand Up @@ -369,60 +369,93 @@ public function delete_operational_competence($operational_comp_id = 0, $action
/**
* Deletes a user's course depending on $action
*
* @param integer $user_course_id : ID of the user_course to affect
* @param integer $action : Action to apply on the course plan:
* @param integer $user_course_id ID of the user_course to affect
* @param integer $action Action to apply on the course plan :
* - 0 for displaying the confirmation
* - 1 for deleting (hard delete)
*
* @return void
*
*/
public function delete_user_course($user_course_id = 0, $action = 0) {
// Access permissions
if ($_SESSION['user_access'] >= config('\User\Config\UserConfig')->access_lvl_admin) {
// Gets data of the user's course if it exists
$user_course = $this->user_course_model->find($user_course_id);
public function delete_user_course($user_course_id = 0, $action = 0)
{
$user_course = $this->user_course_model->find($user_course_id);

// Redirection
if (is_null($user_course)) {
/**
* @todo Create method and view for list of users' courses
*/
// return redirect()->to(base_url('plafor/courseplan/list_user_course'));
return redirect()->to(base_url('plafor/apprentice/list_apprentice')); // Temporary redirection
// Redirection
if (is_null($user_course))
return redirect()->to(base_url());

// Checks if a currently logged trainer is the trainer of the apprentice
if($_SESSION['user_access'] === config('\User\Config\UserConfig')->access_lvl_trainer)
{
$trainer = $this->trainer_apprentice_model->getTrainer($_SESSION['user_id']);
$doesTrainerTrainsApprentice = false;

if(isset($trainer))
{
$trainer_apprentices = $this->trainer_apprentice_model->getApprenticeIdsFromTrainer($trainer['id']);

if(isset($trainer_apprentices))
{
foreach($trainer_apprentices as $id_apprentice)
{
if($id_apprentice === $user_course['fk_user'])
{
$doesTrainerTrainsApprentice = true;
break;
}
}
}
}
}

// Access permissions
if ($_SESSION['user_access'] >= config('\User\Config\UserConfig')->access_lvl_admin
|| (isset($doesTrainerTrainsApprentice) && $doesTrainerTrainsApprentice))
{
// Gets data for the confirmation view
$course_plan = $this->course_plan_model->find($user_course['fk_course_plan']);
$apprentice = $this->user_model->find($user_course['fk_user']);
$status = $this->user_course_status_model->find($user_course['fk_status']);

// Action to perform
switch ($action) {
switch ($action)
{
case 0: // Displays confirmation
$output = array(
'user_course' => $user_course,
'course_plan' => $course_plan,
'apprentice' => $apprentice,
'status' => $status,
'title' => lang('plafor_lang.title_user_course_delete')
'apprentice' => $apprentice,
'status' => $status,
'title' => lang('plafor_lang.title_user_course_delete')
);

return $this->display_view('Plafor\user_course/delete', $output);

case 1: // Deletes user's course and the corresponding comments and acquisition status
// Deletes comments
foreach ($this->acquisition_status_model->where('fk_user_course', $user_course_id)->find() as $acquisition_status) {
foreach ($this->acquisition_status_model->where('fk_user_course', $user_course_id)->find() as $acquisition_status)
{
$this->comment_model->where('fk_acquisition_status', $acquisition_status['id'])->delete();
};

// Deletes acquisition status
$this->acquisition_status_model->where('fk_user_course', $user_course_id)->delete();

// Deletes user's course
$this->user_course_model->delete($user_course_id);
break;
default: // Do nothing
break;

return redirect()->to(base_url('plafor/apprentice/list_user_courses/'.$apprentice['id']));

default:
// Do nothing
}

return redirect()->to(base_url('plafor/apprentice/list_apprentice'));
} else {
}

else
return $this->display_view('\User\errors\403error');
}
}

/**
Expand Down
18 changes: 11 additions & 7 deletions orif/plafor/Language/fr/plafor_lang.php
Original file line number Diff line number Diff line change
Expand Up @@ -67,9 +67,10 @@
'title_objective_new' => 'Ajouter un objectif',

//User course
'title_user_course_delete' => 'Supprimer un cours',
'title_user_course_view' => 'Détail du cours',
'title_user_course_plan_link' => 'Ajouter un cours associé',
'title_user_course_delete' => 'Supprimer une formation',
'title_user_course_view' => 'Détail de la formation',
'title_add_user_course' => 'Ajouter une nouvelle formation',
'btn_user_course_manage' => 'Gérer ces formations',

//Acquisition status
'title_acquisition_status_view' => 'Afficher les détails des status d\'acquisition',
Expand Down Expand Up @@ -97,6 +98,7 @@
'title_trainer_new' => 'Ajouter un formateur',
'title_trainer_delete' => 'Supprimer un formateur',
'title_course_plan_list' => 'Liste des plans de formation',
'title_user_course_plan_list' => 'Formations suivies par %s',
'title_course_plan_update' => 'Modifier le plan de formation',
'title_course_plan_new' => 'Ajouter un plan de formation',
'title_course_plan_delete' => 'Supprimer le plan de formation',
Expand All @@ -118,8 +120,8 @@
'title_objective_delete' => 'Supprimer l\'objectif',
'title_objective_enable' => 'Réactiver l\'objectif',
'title_user_course_list' => 'Liste des formations',
'title_user_course_update' => 'Modifer la formation',
'title_user_course_new' => 'Ajouter une formation',
'title_user_course_update' => 'modifer la formation',
'title_user_course_new' => 'nouvelle formation',
'title_user_course_delete' => 'Supprimer la formation',
'title_apprentice_link_list' => 'Liste des formateurs',
'title_apprentice_link_update' => 'Modifer le formateur',
Expand Down Expand Up @@ -182,6 +184,8 @@
'field_linked_objectives' => 'Objectifs liés à la compétence opérationnelle',
'field_user_course_date_begin' => 'Date du début de la formation',
'field_user_course_date_end' => 'Date de fin de la formation',
'field_user_course_date_begin_short' => 'Date début',
'field_user_course_date_end_short' => 'Date fin',
'field_user_course_course_plan' => 'Formation',
'field_user_course_status' => 'Statut de la formation',
'field_user_course_objectives_status' => 'Statuts d\'acquisition des objectifs',
Expand Down Expand Up @@ -231,7 +235,7 @@
'symbol' => 'Symbole',
'user_course' => 'Formation liée',
'user_course_delete' => 'Supprimer cette formation liée',
'user_course_delete_explanation' => 'Toutes les informations concernant cette formation liée seront supprimées.',
'user_course_delete_explanation' => 'Toutes les informations concernant le suivi de cette formation par cette personne seront supprimées.',
'user_course_disable' => 'Désactiver cette formation liée',
'apprentice_link' => 'Apprenti et formateur liés',
'apprentice_link_delete' => 'Supprimer le lien entre cet apprenti et ce formateur',
Expand All @@ -257,6 +261,6 @@
'objective_enable_explanation' => 'Toutes les informations concernant cet objectif (symbole, taxonomie, nom) seront réactivées.',
'apprentice_link_enable_explanation' => 'Toutes les informations concernant le lien entre cet apprenti et ce formateur seront réactivées.',
'acquisition_status_enable_explanation' => 'Toutes les informations concernant le statut d\'acquisition seront réactivées.',

'current' => 'En vigueur',
'apprentices_already_assigned_to_course_plan' => 'Les apprentis suivants sont associés à ce plan de formation'
];
Loading

0 comments on commit 32dcda2

Please sign in to comment.