$role->setValue('rol_max_members', $date->getValue('dat_max_members')); $role->save(); } } // check if flag is set that current user wants to participate as leader to the date if (isset($_POST['date_current_user_assigned']) && $_POST['date_current_user_assigned'] == 1 && $gCurrentUser->isLeaderOfRole($date->getValue('dat_rol_id')) == false) { // user wants to participate -> add him to date $member = new TableMembers($gDb); $member->startMembership($role->getValue('rol_id'), $gCurrentUser->getValue('usr_id'), 1); } elseif (isset($_POST['date_current_user_assigned']) == false && $gCurrentUser->isMemberOfRole($date->getValue('dat_rol_id')) == true) { // user does't want to participate as leader -> remove his participation as leader from the event, // dont remove the participation itself! $member = new TableMembers($gDb); $member->readDataByColumns(array('mem_rol_id' => $role->getValue('rol_id'), 'mem_usr_id' => $gCurrentUser->getValue('usr_id'))); $member->setValue('mem_leader', 0); $member->save(); } unset($_SESSION['dates_request']); $gNavigation->deleteLastUrl(); header('Location: ' . $gNavigation->getUrl()); exit; } elseif ($getMode == 2) { // Termin loeschen, wenn dieser zur aktuellen Orga gehoert if ($date->getValue('cat_org_id') == $gCurrentOrganization->getValue('org_id')) { // member bzw. Teilnahme/Rolle löschen $date->delete(); // Loeschen erfolgreich -> Rueckgabe fuer XMLHttpRequest echo 'done'; } } elseif ($getMode == 3) { $member = new TableMembers($gDb);
/** * Create a new membership to a role for the current user. If the date range contains * a future or past membership of the same role then the two memberships will be merged. * In opposite to setRoleMembership this method can't be used to end a membership earlier! * @param int $roleId Id of the role for which the membership should be set. * @param string $startDate Start date of the membership. Default will be @b DATE_NOW. * @param string $endDate End date of the membership. Default will be @b 31.12.9999 * @param bool|string $leader If set to @b 1 then the member will be leader of the role and * might get more rights for this role. * @return bool Return @b true if the membership was successfully added. */ public function setRoleMembership($roleId, $startDate = DATE_NOW, $endDate = '9999-12-31', $leader = '') { $minStartDate = $startDate; $maxEndDate = $endDate; $member = new TableMembers($this->db); if ($startDate === '' || $endDate === '') { return false; } $this->db->startTransaction(); // subtract 1 day from start date so that we find memberships that ends yesterday // these memberships can be continued with new date $oneDayDateInterval = new DateInterval('P1D'); $startDate = DateTime::createFromFormat('Y-m-d', $startDate)->sub($oneDayDateInterval)->format('Y-m-d'); // add 1 to max date because we subtract one day if a membership ends if ($endDate !== '9999-12-31') { $endDate = DateTime::createFromFormat('Y-m-d', $endDate)->add($oneDayDateInterval)->format('Y-m-d'); } // search for membership with same role and user and overlapping dates $sql = 'SELECT * FROM ' . TBL_MEMBERS . ' WHERE mem_rol_id = ' . $roleId . ' AND mem_usr_id = ' . $this->getValue('usr_id') . ' AND mem_begin <= \'' . $endDate . '\' AND mem_end >= \'' . $startDate . '\' ORDER BY mem_begin ASC'; $membershipStatement = $this->db->query($sql); if ($membershipStatement->rowCount() === 1) { // one record found than update this record $row = $membershipStatement->fetch(); $member->setArray($row); // save new start date if an earlier date exists if (strcmp($minStartDate, $member->getValue('mem_begin', 'Y-m-d')) > 0) { $minStartDate = $member->getValue('mem_begin', 'Y-m-d'); } // save new end date if an later date exists // but only if end date is greater than the begin date otherwise the membership should be deleted if (strcmp($member->getValue('mem_end', 'Y-m-d'), $maxEndDate) > 0 && strcmp($member->getValue('mem_begin', 'Y-m-d'), $maxEndDate) < 0) { $maxEndDate = $member->getValue('mem_end', 'Y-m-d'); } } elseif ($membershipStatement->rowCount() > 1) { // several records found then read min and max date and delete all records while ($row = $membershipStatement->fetch()) { $member->clear(); $member->setArray($row); // save new start date if an earlier date exists if (strcmp($minStartDate, $member->getValue('mem_begin', 'Y-m-d')) > 0) { $minStartDate = $member->getValue('mem_begin', 'Y-m-d'); } // save new end date if an later date exists if (strcmp($member->getValue('mem_end', 'Y-m-d'), $maxEndDate) > 0) { $maxEndDate = $member->getValue('mem_end', 'Y-m-d'); } // delete existing entry because a new overlapping entry will be created $member->delete(); } $member->clear(); } if (strcmp($minStartDate, $maxEndDate) > 0) { // if start date is greater than end date than delete membership if ($member->getValue('mem_id') > 0) { $member->delete(); } $returnStatus = true; } else { // save membership to database $member->setValue('mem_rol_id', $roleId); $member->setValue('mem_usr_id', $this->getValue('usr_id')); $member->setValue('mem_begin', $minStartDate); $member->setValue('mem_end', $maxEndDate); if ($leader !== '') { $member->setValue('mem_leader', $leader); } $returnStatus = $member->save(); } $this->db->endTransaction(); $this->renewRoleData(); return $returnStatus; }