36 $this->db = $DIC->database();
37 $this->
user = $DIC->user();
45 $id = self::getTeamId($a_assignment_id, $a_user_id, $a_create_on_demand);
52 foreach (self::getAssignmentTeamMap($a_assignment_id) as $user_id => $team_id) {
53 $teams[$team_id][] = $user_id;
57 foreach ($teams as $team_id =>
$members) {
60 $team->assignment_id = $a_assignment_id;
62 $res[$team_id] = $team;
78 protected function read($a_id)
83 $this->members = array();
85 $sql =
"SELECT * FROM il_exc_team" .
86 " WHERE id = " .
$ilDB->quote($a_id,
"integer");
87 $set =
$ilDB->query($sql);
88 if (
$ilDB->numRows($set)) {
91 while ($row =
$ilDB->fetchAssoc($set)) {
92 $this->assignment_id = $row[
"ass_id"];
93 $this->members[] = $row[
"user_id"];
107 public static function getTeamId($a_assignment_id, $a_user_id, $a_create_on_demand =
false)
111 $ilDB = $DIC->database();
113 $sql =
"SELECT id FROM il_exc_team" .
114 " WHERE ass_id = " .
$ilDB->quote($a_assignment_id,
"integer") .
115 " AND user_id = " .
$ilDB->quote($a_user_id,
"integer");
116 $set =
$ilDB->query($sql);
117 $row =
$ilDB->fetchAssoc($set);
120 if (!
$id && $a_create_on_demand) {
126 $fields = array(
"id" => array(
"integer",
$id),
127 "ass_id" => array(
"integer", $a_assignment_id),
128 "user_id" => array(
"integer", $a_user_id));
129 $ilDB->insert(
"il_exc_team", $fields);
132 if ($idl->getStartingTimestamp() > 0) {
134 $idl_team->setStartingTimestamp($idl->getStartingTimestamp());
138 self::writeTeamLog(
$id, self::TEAM_LOG_CREATE_TEAM);
141 self::TEAM_LOG_ADD_MEMBER,
153 $fields = array(
"id" => array(
"integer",
$id),
154 "ass_id" => array(
"integer", $a_assignment_id),
155 "user_id" => array(
"integer", $a_user_id));
156 $ilDB->insert(
"il_exc_team", $fields);
157 self::writeTeamLog(
$id, self::TEAM_LOG_CREATE_TEAM);
160 self::TEAM_LOG_ADD_MEMBER,
187 $sql =
"SELECT user_id" .
188 " FROM il_exc_team" .
189 " WHERE ass_id = " .
$ilDB->quote($this->assignment_id,
"integer");
190 $set =
$ilDB->query($sql);
191 while ($row =
$ilDB->fetchAssoc($set)) {
192 $ids[] = $row[
"user_id"];
214 $fields = array(
"id" => array(
"integer", $this->
id),
215 "ass_id" => array(
"integer", $this->assignment_id),
216 "user_id" => array(
"integer", $a_user_id));
217 $ilDB->insert(
"il_exc_team", $fields);
224 self::TEAM_LOG_ADD_MEMBER,
228 $this->
read($this->
id);
250 $sql =
"DELETE FROM il_exc_team" .
251 " WHERE ass_id = " .
$ilDB->quote($this->assignment_id,
"integer") .
252 " AND id = " .
$ilDB->quote($this->
id,
"integer") .
253 " AND user_id = " .
$ilDB->quote($a_user_id,
"integer");
254 $ilDB->manipulate($sql);
261 self::TEAM_LOG_REMOVE_MEMBER,
265 $this->
read($this->
id);
278 $ilDB = $DIC->database();
282 $sql =
"SELECT * FROM il_exc_team" .
283 " WHERE ass_id = " .
$ilDB->quote($a_ass_id,
"integer");
284 $set =
$ilDB->query($sql);
285 while ($row =
$ilDB->fetchAssoc($set)) {
286 $map[$row[
"user_id"]] = $row[
"id"];
292 public function writeLog($a_action, $a_details = null)
294 self::writeTeamLog($this->
id, $a_action, $a_details);
304 public static function writeTeamLog($a_team_id, $a_action, $a_details = null)
308 $ilDB = $DIC->database();
310 $id =
$ilDB->nextId(
'il_exc_team_log');
313 "log_id" => array(
"integer",
$id),
314 "team_id" => array(
"integer", $a_team_id),
315 "user_id" => array(
"integer",
$ilUser->getId()),
316 "action" => array(
"integer", $a_action),
317 "details" => array(
"text", $a_details),
318 "tstamp" => array(
"integer", time())
321 $ilDB->insert(
"il_exc_team_log", $fields);
338 $sql =
"SELECT * FROM il_exc_team_log" .
339 " WHERE team_id = " .
$ilDB->quote($this->
id,
"integer") .
340 " ORDER BY tstamp DESC";
341 $set =
$ilDB->query($sql);
342 while ($row =
$ilDB->fetchAssoc($set)) {
360 $obsolete_teams = [];
361 $set =
$ilDB->query(
"SELECT DISTINCT l.team_id as id FROM il_exc_team_log as l LEFT JOIN il_exc_team as t ON (l.team_id = t.id) WHERE t.id IS NULL;");
362 while ($row =
$ilDB->fetchAssoc($set)) {
363 $obsolete_teams[] = $row[
"id"];
366 if (count($obsolete_teams) > 0) {
367 $q =
"DELETE FROM il_exc_team_log" .
368 " WHERE " .
$ilDB->in(
"team_id", $obsolete_teams,
false,
"integer");
369 $ilDB->manipulate($q);
385 if (!$a_exc_ref_id ||
386 $ilUser->getId() == $a_user_id) {
393 $ntf->setLangModules(array(
"exc"));
394 $ntf->setRefId($a_exc_ref_id);
395 $ntf->setChangedByUserId(
$ilUser->getId());
396 $ntf->setSubjectLangId(
'exc_team_notification_subject_' . $a_action);
397 $ntf->setIntroductionLangId(
'exc_team_notification_body_' . $a_action);
398 $ntf->addAdditionalInfo(
"exc_assignment", $ass->getTitle());
399 $ntf->setGotoLangId(
'exc_team_notification_link');
400 $ntf->setReasonLangId(
'exc_team_notification_reason');
401 $ntf->sendMail(array($a_user_id));
410 foreach (
$data as $row) {
411 if ($a_exclude_ass_id && $row[
"id"] == $a_exclude_ass_id) {
416 $map = self::getAssignmentTeamMap($row[
"id"]);
418 if ($a_user_id && !array_key_exists($a_user_id, $map)) {
425 $user_team_id = $map[$a_user_id];
426 $user_team = array();
427 foreach ($map as $user_id => $team_id) {
428 if ($user_id != $a_user_id &&
429 $user_team_id == $team_id) {
430 $user_team[] = $user_id;
436 sizeof($user_team)) {
437 $res[$row[
"id"]] = array(
438 "title" => $row[
"title"],
439 "teams" =>
sizeof(array_flip($map)),
443 $res[$row[
"id"]][
"user_team"] = $user_team;
453 public static function adoptTeams($a_source_ass_id, $a_target_ass_id, $a_user_id = null, $a_exc_ref_id = null)
458 foreach (self::getAssignmentTeamMap($a_source_ass_id) as $user_id => $team_id) {
459 $teams[$team_id][] = $user_id;
461 if ($a_user_id && $user_id == $a_user_id) {
462 $old_team = $team_id;
469 self::getInstanceByUserId($a_target_ass_id, $a_user_id)->
getId()) {
474 $current_map = self::getAssignmentTeamMap($a_target_ass_id);
476 foreach ($teams as $team_id => $user_ids) {
477 if (!$old_team || $team_id == $old_team) {
480 foreach ($user_ids as $user_id) {
481 if (!array_key_exists($user_id, $current_map)) {
482 $missing[] = $user_id;
486 if (
sizeof($missing)) {
488 $first = array_shift($missing);
489 $new_team = self::getInstanceByUserId($a_target_ass_id, $first,
true);
492 if ($a_user_id > 0 && $old_team > 0) {
494 if ($idl->getStartingTimestamp()) {
496 $idl_team->setStartingTimestamp($idl->getStartingTimestamp());
503 $new_team->sendNotification($a_exc_ref_id, $first,
"add");
506 foreach ($missing as $user_id) {
507 $new_team->addTeamMember($user_id, $a_exc_ref_id);
522 $tree = $DIC->repositoryTree();
526 $parent_ref_id = $tree->getParentId($a_exc_ref_id);
527 if ($parent_ref_id) {
528 foreach ($tree->getChildsByType($parent_ref_id,
"grp") as $group) {
529 $res[] = $group[
"obj_id"];
540 foreach (self::getAdoptableGroups($a_exc_ref_id) as $grp_obj_id) {
543 $res[$grp_obj_id] = array(
545 ,
"members" => $members_obj->getMembers()
566 public function createRandomTeams($a_exercise_id, $a_assignment_id, $a_number_teams, $a_min_participants)
569 if (count(self::getAssignmentTeamMap($a_assignment_id))) {
574 $members = $obj_exc_members->getMembers();
575 $total_exc_members = count(
$members);
576 $number_of_teams = $a_number_teams;
577 if (!$number_of_teams) {
578 if ($a_min_participants) {
579 $number_of_teams = round($total_exc_members / $a_min_participants);
581 $number_of_teams = random_int(1, $total_exc_members);
584 $members_per_team = round($total_exc_members / $number_of_teams);
586 for (
$i = 0;
$i < $number_of_teams;
$i++) {
587 $members_counter = 0;
588 while (!empty(
$members) && $members_counter < $members_per_team) {
590 if ($members_counter == 0) {
591 $team_id = $this->
createTeam($a_assignment_id, $member_id);
592 $this->
setId($team_id);
593 $this->assignment_id = $a_assignment_id;
601 $teams = array_unique(array_values(self::getAssignmentTeamMap($a_assignment_id)));
605 $team_id = array_pop($teams);
606 $this->
setId($team_id);
static sortArray( $array, $a_array_sortby, $a_array_sortorder=0, $a_numeric=false, $a_keep_keys=false)
sortArray
static getAssignmentDataOfExercise($a_exc_id)
Get assignments data of an exercise in an array.
const TEAM_LOG_REMOVE_MEMBER
static getAdoptableGroups($a_exc_ref_id)
static getGroupMembersMap($a_exc_ref_id)
static getAssignmentTeamMap($a_ass_id)
Get team structure for assignment.
static getTeamId($a_assignment_id, $a_user_id, $a_create_on_demand=false)
Get team id for member id.
static getInstancesFromMap($a_assignment_id)
static _lookupFullname($a_user_id)
Lookup Full Name.
addTeamMember($a_user_id, $a_exc_ref_id=null)
Add new member to team.
getLog()
Get all log entries for team.
Exercise assignment team.
static _lookupTitle($a_id)
lookup object title
static adoptTeams($a_source_ass_id, $a_target_ass_id, $a_user_id=null, $a_exc_ref_id=null)
getMembers()
Get members of assignment team.
static getAdoptableTeamAssignments($a_exercise_id, $a_exclude_ass_id=null, $a_user_id=null)
const TEAM_LOG_REMOVE_FILE
foreach($_POST as $key=> $value) $res
sendNotification($a_exc_ref_id, $a_user_id, $a_action)
Send notification about team status.
static getInstanceByUserId($a_assignment_id, $a_user_id, $a_create_on_demand=false)
removeTeamMember($a_user_id, $a_exc_ref_id=null)
Remove member from team.
static getInstance($a_ass_id, $a_participant_id, $a_is_team=false)
Get instance.
cleanLog()
Remove obsolete log entries.
getMembersOfAllTeams()
Get members for all teams of assignment.
createTeam($a_assignment_id, $a_user_id)
writeLog($a_action, $a_details=null)
Wrapper classes for system notifications.
const TEAM_LOG_CREATE_TEAM
createRandomTeams($a_exercise_id, $a_assignment_id, $a_number_teams, $a_min_participants)
Create random teams for assignment type "team upload" following specific rules.
static writeTeamLog($a_team_id, $a_action, $a_details=null)
Add entry to team log.
const TEAM_LOG_ADD_MEMBER