<?php
define('CLI_SCRIPT', true);
require_once('/home/moodle/public_html/moodle/config.php');
require_once($CFG->libdir . '/clilib.php');
require_once($CFG->dirroot . '/enrol/locallib.php');
list($options, $unrecognized) = cli_get_params([
'help' => false,
'file' => null
], [
'h' => 'help',
'f' => 'file'
]);
if ($options['help'] || empty($options['file'])) {
echo "\nScript pentru sincronizarea cohortelor cu cursurile și atribuirea rolurilor.\n";
echo "\nUtilizare:\n";
echo "php sync_cohorts.php --file=/cale/catre/cohorts.csv\n";
echo "\nStructura CSV:\n";
echo "cohortid,courseid,role\n";
exit(0);
}
$csvfile = $options['file'];
if (!file_exists($csvfile)) {
cli_error("Fișierul CSV nu a fost găsit: {$csvfile}");
}
if (($handle = fopen($csvfile, 'r')) !== false) {
$header = fgetcsv($handle);
if ($header === false || count($header) < 3) {
cli_error("Fișierul CSV trebuie să conțină cel puțin trei coloane: cohortid, courseid, role.");
}
$cohort_col = array_search('cohortid', $header);
$course_col = array_search('courseid', $header);
$role_col = array_search('role', $header);
if ($cohort_col === false || $course_col === false || $role_col === false) {
cli_error("Fișierul CSV trebuie să conțină coloanele 'cohortid', 'courseid' și 'role'.");
}
while (($data = fgetcsv($handle)) !== false) {
$cohortid = trim($data[$cohort_col]);
$courseid = trim($data[$course_col]);
$rolename = trim($data[$role_col]);
// Verificare cohortă
$cohort = $DB->get_record('cohort', ['idnumber' => $cohortid], '*', IGNORE_MISSING);
if (!$cohort) {
cli_writeln("⚠ Cohorta '{$cohortid}' nu a fost găsită.");
continue;
}
// Verificare curs
if (is_numeric($courseid)) {
$course = $DB->get_record('course', ['id' => $courseid], '*', IGNORE_MISSING);
} else {
$course = $DB->get_record('course', ['shortname' => $courseid], '*', IGNORE_MISSING);
}
if (!$course) {
cli_writeln("⚠ Cursul '{$courseid}' nu a fost găsit.");
continue;
}
// Verificare rol
$role = $DB->get_record('role', ['shortname' => $rolename], '*', IGNORE_MISSING);
if (!$role) {
cli_writeln("⚠ Rolul '{$rolename}' nu a fost găsit.");
continue;
}
// Obținere utilizatori cohortei
$users = $DB->get_records('cohort_members', ['cohortid' => $cohort->id]);
// Obținere context curs
$context = context_course::instance($course->id);
// Obținere metodă de înscriere 'cohort'
$enrol = enrol_get_plugin('cohort');
$instances = enrol_get_instances($course->id, true);
$instance = null;
foreach ($instances as $inst) {
if ($inst->enrol === 'cohort' && $inst->customint1 == $cohort->id) {
$instance = $inst;
break;
}
}
// Dacă nu există metoda de înscriere, o adăugăm
if (!$instance) {
$enrolid = $enrol->add_instance($course, ['customint1' => $cohort->id]);
$instance = $DB->get_record('enrol', ['id' => $enrolid]);
cli_writeln("- Cohorta '{$cohortid}' a fost sincronizată cu cursul '{$courseid}'.");
} else {
cli_writeln(" x Cohorta '{$cohortid}' era deja sincronizată cu cursul '{$courseid}'.");
}
// Înrolare utilizatori și atribuirea rolului
foreach ($users as $user) {
$userid = $user->userid;
// Verificare dacă utilizatorul este deja înscris
$exists = $DB->record_exists('user_enrolments', [
'userid' => $userid,
'enrolid' => $instance->id
]);
if (!$exists) {
// Înrolare utilizator
$enrol->enrol_user($instance, $userid);
cli_writeln("- Utilizatorul '{$userid}' a fost înscris în cursul '{$courseid}'.");
}
// Verificare dacă utilizatorul are deja rolul
$role_assigned = $DB->record_exists('role_assignments', [
'roleid' => $role->id,
'userid' => $userid,
'contextid' => $context->id
]);
if (!$role_assigned) {
// Atribuire rol utilizator
$role_assignment = new stdClass();
$role_assignment->roleid = $role->id;
$role_assignment->contextid = $context->id;
$role_assignment->userid = $userid;
$role_assignment->timemodified = time();
$DB->insert_record('role_assignments', $role_assignment);
cli_writeln("- Utilizatorul '{$userid}' a primit rolul '{$rolename}' în cursul '{$courseid}'.");
} else {
cli_writeln("x Utilizatorul '{$userid}' are deja rolul '{$rolename}' în cursul '{$courseid}'.");
}
}
}
fclose($handle);
} else {
cli_error("Eroare la deschiderea fișierului CSV: {$csvfile}");
}
cli_writeln("- Sincronizarea cohortelor și atribuirea rolurilor a fost finalizată.");