diff --git a/app/controllers/course/members.php b/app/controllers/course/members.php index 37d529121733cbee08380efa3e4d7b24f0d7b844..5644717b7d813a0ac0c924087ce1f873b2db1f43 100644 --- a/app/controllers/course/members.php +++ b/app/controllers/course/members.php @@ -240,6 +240,9 @@ class Course_MembersController extends AuthenticatedController $current_member->position = $i; $position[$current_member->position] = true; $current_member->store(); + $membername = $current_member->vorname . " " . $current_member->nachname; + StudipLog::log('SEAT_RESERVATION', $this->course_id, null, + sprintf('%s hat Sitzplatz %s erhalten', $membername, $current_member->position)); break; } } @@ -273,8 +276,12 @@ class Course_MembersController extends AuthenticatedController } foreach ($current_members as $current_member) { + $old_position = $current_member->position; $current_member->position = 0; $current_member->store(); + $membername = $current_member->vorname . " " . $current_member->nachname; + StudipLog::log('SEAT_RESERVATION', $this->course_id, null, + sprintf('%s hat Sitzplatz %s zurückgegeben', $membername, $old_position)); } } diff --git a/app/controllers/course/statusgroups.php b/app/controllers/course/statusgroups.php index 18b327d37e7f9e72777603e0295333ae20b4c16a..80249a97e2dfaf6308863587a449ed6cc7bcc961 100644 --- a/app/controllers/course/statusgroups.php +++ b/app/controllers/course/statusgroups.php @@ -471,6 +471,17 @@ class Course_StatusgroupsController extends AuthenticatedController $success), $success, htmlReady($g->name) )); } + + // Logging seats according to group list number + if ($success > 0 && count($g->dates)) { + $info = 'Sitzplatz in Statusgruppe ' . $g->name . ' reserviert. Aktuelle Sitzplätze: '; + $members = $this->sortMembers($g->members); + $i = 1; + foreach ($members as $member) { + $info .= $member->user->getFullName() . ": " . $i++ . "; "; + } + StudipLog::log('SEAT_RESERVATION', $this->course_id, null, $info); + } $this->relocate('course/statusgroups'); @@ -620,6 +631,17 @@ class Course_StatusgroupsController extends AuthenticatedController htmlReady($g->name) )); } + // Logging seats according to group list number + if (count($g->dates)) { + $info = 'Sitzplatz in Statusgruppe ' . $g->name . ' zurückgegeben. Aktuelle Sitzplätze: '; + $members = $this->sortMembers($g->members); + $i = 1; + foreach ($members as $member) { + $info .= $member->user->getFullName() . ": " . $i++ . "; "; + } + StudipLog::log('SEAT_RESERVATION', $this->course_id, null, $info); + } + } else { if ($user_id == $GLOBALS['user']->id) { PageLayout::postError(sprintf( @@ -804,6 +826,16 @@ class Course_StatusgroupsController extends AuthenticatedController _('Sie wurden aus der Gruppe %s ausgetragen.'), htmlReady($g->name) )); + // Logging seats according to group list number + if (count($g->dates)) { + $info = 'Sitzplatz in Statusgruppe ' . $g->name . ' zurückgegeben. Aktuelle Sitzplätze: '; + $members = $this->sortMembers($g->members); + $i = 1; + foreach ($members as $member) { + $info .= $member->user->getFullName() . ": " . $i++ . "; "; + } + StudipLog::log('SEAT_RESERVATION', $this->course_id, null, $info); + } } else { PageLayout::postError(sprintf( _('Sie konnten nicht aus der Gruppe %s ausgetragen werden.'), @@ -1274,7 +1306,32 @@ class Course_StatusgroupsController extends AuthenticatedController } } } - $groupname = Statusgruppen::find(Request::option('target_group'))->name; + + // Logging seats according to group list number + $old_group = Statusgruppen::find(Request::option('source')); + if (count($old_group->dates)) { + $info = 'Sitzplätze in ' . $old_group->name . ' zurückgegeben. Aktuelle Sitzplätze: '; + $members = $this->sortMembers($old_group->members); + $i = 1; + foreach ($members as $member) { + $info .= $member->user->getFullName() . ": " . $i++ . "; "; + } + StudipLog::log('SEAT_RESERVATION', $this->course_id, null, $info); + } + + $target_group = Statusgruppen::find(Request::option('target_group')); + if (count($target_group->dates)) { + $info = 'Sitzplätze in ' . $target_group->name . ' reserviert. Aktuelle Sitzplätze: '; + $members = $this->sortMembers($target_group->members); + $i = 1; + foreach ($members as $member) { + $cm = CourseMember::find([$this->course_id, $member->user_id]); + $info .= $member->user->getFullName() . ": " . $i++ . "; "; + } + StudipLog::log('SEAT_RESERVATION', $this->course_id, null, $info); + } + + $groupname = $target_group->name; // Everything completed successfully => success message. if ($success && !$error) { diff --git a/db/uos_migrations/74_add_seat_reservation_log_action.php b/db/uos_migrations/74_add_seat_reservation_log_action.php new file mode 100644 index 0000000000000000000000000000000000000000..a1feb2ab671712fc640c1b023f28928ddce7f179 --- /dev/null +++ b/db/uos_migrations/74_add_seat_reservation_log_action.php @@ -0,0 +1,28 @@ +<?php +class AddSeatReservationLogAction extends Migration +{ + public function description() + { + return "Adds a log event action for a seat reservation"; + } + + public function up() + { + DBManager::get()->exec(" + INSERT IGNORE INTO log_actions + SET action_id = MD5('SEAT_RESERVATION'), + name = 'SEAT_RESERVATION', + description = 'Nutzer bucht oder gibt einen Sitzplatz zurück', + info_template = '%user hat einen Sitzplatz in %sem(%affected) geändert.', + active = '1', + expires = '0' + "); + } + + public function down() + { + DBManager::get()->exec(" + DELETE FROM log_actions WHERE action_id = MD5('SEAT_RESERVATION') + "); + } +} diff --git a/lib/classes/Seminar.class.php b/lib/classes/Seminar.class.php index 74ffa2eb07c5355e01c3528ad14dbc16fafbc2ea..c0880d9cd6c1a8916dc9d6d8dc90be625a03d6db 100644 --- a/lib/classes/Seminar.class.php +++ b/lib/classes/Seminar.class.php @@ -1997,6 +1997,9 @@ class Seminar */ public function deleteMember($user_id) { + // Variable for seat logging + $seat_number = CourseMember::find([$this->id, $user_id])->position; + $dozenten = $this->getMembers('dozent'); if (count($dozenten) >= 2 || !$dozenten[$user_id]) { $query = "DELETE FROM seminar_user WHERE Seminar_id = ? AND user_id = ?"; @@ -2054,7 +2057,23 @@ class Seminar // Remove from associated status groups foreach (Statusgruppen::findBySeminar_id($this->id) as $group) { - $group->removeUser($user_id, true); + $removed = $group->removeUser($user_id, true); + // Logging seat reservation by group list number + if (count($group->dates) && $removed) { + $info = 'Sitzplätze in Statusgruppe ' . $group->name . ' zurückgegeben. Aktuelle Sitzplätze: '; + $group->sortMembersAlphabetic(); + $i = 1; + foreach ($group->members as $member) { + $info .= $member->user->getFullName() . ": " . $i++ . "; "; + } + StudipLog::log('SEAT_RESERVATION', $this->id, null, $info); + } + } + + if (!$removed && $seat_number) { + StudipLog::log('SEAT_RESERVATION', $this->id, null, + sprintf("%s hat Sitzplatz %s zurückgegeben", + get_fullname($user_id), $seat_number)); } $this->createMessage(sprintf( diff --git a/lib/export/csv-t-1.xsl b/lib/export/csv-t-1.xsl index 5c5e2e9752e031514b483daa5b57a89170027e54..25dfdd4682d0c5d675cc345513ecb976081f2f8b 100644 --- a/lib/export/csv-t-1.xsl +++ b/lib/export/csv-t-1.xsl @@ -62,6 +62,7 @@ <xsl:text>";</xsl:text> </xsl:for-each> </xsl:if> + <xsl:text>Sitzplatz;</xsl:text> <xsl:text>Bemerkung</xsl:text> <xsl:text> </xsl:text> @@ -151,6 +152,11 @@ <xsl:with-param name="daten" select="zusatzangaben"/> </xsl:call-template> + <xsl:if test="sitzplatz"> + <xsl:value-of select="sitzplatz"/> + </xsl:if> + <xsl:text>";"</xsl:text> + <xsl:if test="bemerkung"> <xsl:value-of select="bemerkung"/> </xsl:if> diff --git a/lib/export/csv-t-3.xsl b/lib/export/csv-t-3.xsl index 7ae2f4969ea17f800b902d8df1cd631a2209f389..e1ded55ab86ce0c1d677e53338abc4e6454d55af 100644 --- a/lib/export/csv-t-3.xsl +++ b/lib/export/csv-t-3.xsl @@ -38,6 +38,7 @@ <xsl:text></xsl:text> <xsl:text>Gruppe;</xsl:text> <xsl:text>Titel;</xsl:text> + <xsl:text>Position;</xsl:text> <xsl:text>Vorname;</xsl:text> <xsl:text>Nachname;</xsl:text> <xsl:text>Titel2;</xsl:text> @@ -87,6 +88,11 @@ <xsl:value-of select="str:replace(titel,'"','""')"/> </xsl:if> <xsl:text>";"</xsl:text> + + <xsl:if test="listnumber"> + <xsl:value-of select="listnumber"/> + </xsl:if> + <xsl:text>";"</xsl:text> <xsl:if test="vorname"> <xsl:value-of select="vorname"/> diff --git a/lib/export/export_studipdata_func.inc.php b/lib/export/export_studipdata_func.inc.php index 2b7a45285afe92c986c4b7b677a92d990d8d4425..42dfeb954d5c73e356d761ab0550e7c350ab5c68 100644 --- a/lib/export/export_studipdata_func.inc.php +++ b/lib/export/export_studipdata_func.inc.php @@ -612,7 +612,8 @@ function export_teilis($inst_id, $ex_sem_id = "no") $parameters[':seminar_id'] = $ex_sem_id; } else { $query = "SELECT DISTINCT ui.*, aum.*, su.*, FROM_UNIXTIME(su.mkdate) AS registration_date, - GROUP_CONCAT(CONCAT_WS(',', sg.name, a.name, user_studiengang.semester) SEPARATOR '; ') AS nutzer_studiengaenge + GROUP_CONCAT(CONCAT_WS(',', sg.name, a.name, user_studiengang.semester) SEPARATOR '; ') AS nutzer_studiengaenge, + statusgruppe_user.statusgruppe_id FROM statusgruppe_user LEFT JOIN seminar_user AS su USING (user_id) LEFT JOIN auth_user_md5 AS aum USING (user_id) @@ -700,6 +701,7 @@ function export_teilis($inst_id, $ex_sem_id = "no") $object_counter_tmp = $object_counter; if (count($data) > 0) { $data_object_tmp .= xml_open_tag($xml_groupnames_person['subgroup1'], $val1); + $i = 1; foreach ($data as $row) { // Nur Personen ausgeben, die entweder einer Gruppe angehoeren // oder zur Veranstaltung gehoeren und noch nicht ausgegeben wurden. @@ -721,6 +723,14 @@ function export_teilis($inst_id, $ex_sem_id = "no") if ($matrikelnummer != '') { $data_object_tmp .= xml_tag('matrikelnummer', $matrikelnummer); } + + if ($row['position']) { + $data_object_tmp .= xml_tag('sitzplatz', $row['position']); + } + + if ($row['statusgruppe_id'] && Statusgruppen::find($row['statusgruppe_id'])->dates) { + $data_object_tmp .= xml_tag('listnumber', $i++); + } // freie Datenfelder ausgeben $data_object_tmp .= export_datafields($row['user_id'], $xml_groupnames_person['childgroup1'], $xml_groupnames_person['childobject1'], 'user');