if ($role->allowedToAssignMembers($gCurrentUser)) {
        try {
            $member->stopMembership();
        } catch (AdmException $e) {
            $e->showText();
        }
        // Beendigung erfolgreich -> Rueckgabe fuer XMLHttpRequest
        echo 'done';
    } else {
        echo $gL10n->get('SYS_NO_RIGHTS');
    }
} elseif ($getMode === 3) {
    // Remove former membership of role
    if ($gCurrentUser->isWebmaster()) {
        $member = new TableMembers($gDb, $getMemberId);
        $member->delete();
        // Entfernen erfolgreich -> Rueckgabe fuer XMLHttpRequest
        echo 'done';
    }
} elseif ($getMode === 4) {
    // reload role memberships
    $count_show_roles = 0;
    $roleStatement = getRolesFromDatabase($getUserId);
    $count_role = $roleStatement->rowCount();
    getRoleMemberships('role_list', $user, $roleStatement, $count_role, true);
} elseif ($getMode === 5) {
    // reload former role memberships
    $count_show_roles = 0;
    $roleStatement = getFormerRolesFromDatabase($getUserId);
    $count_role = $roleStatement->rowCount();
    getRoleMemberships('former_role_list', $user, $roleStatement, $count_role, true);
Ejemplo n.º 2
0
 /**
  * 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;
 }