_db = $db; } /** * @return object $usr * $usr->primaryKey * $usr->login * $usr->password optional (required in createUser) * $usr->name * $usr->email * $usr->phone * $usr->homeEmail * $usr->homePhone * $usr->employeeType 'Pracownik','Kandydat','Partner' * $usr->isDisabled 1, 0 or null if not set */ public function getUser($usrLogin) { if (!$this->_db) return false; if (empty($usrLogin)) return false; $user = null; $sql = "SELECT a.`ID` as primaryKey , a.`ADM_ACCOUNT` as login , a.`ADM_PASSWD` as password , a.`ADM_NAME` as name , a.`EMAIL` as email , a.`ADM_PHONE` as phone , '' as homeEmail , '' as homePhone , a.`EMPLOYEE_TYPE` as employeeType , IF(a.`A_STATUS`='NORMAL', 0, 1) as isDisabled -- , a.`ADM_ADMIN_LEVEL` -- , a.`ADM_ADMIN_DESC` -- stanowisko -- , a.`ADM_NIP` -- NIP -- , a.`ADM_PESEL` -- nr. PESEL from `ADMIN_USERS` as a where a.`ADM_ACCOUNT`='{$usrLogin}' "; $res = $this->_db->query($sql); if ($r = $this->_db->fetch($res)) { $user = $this->_buildUserFromRow($r); } return $user; } private function _buildUserFromRow($r) { $user = new ObjectUserDB($this); $user->primaryKey = $r->primaryKey; $user->login = $r->login; $user->password = $r->password; $user->name = $r->name; $user->email = $r->email; $user->phone = $r->phone; $user->homeEmail = $r->homeEmail; $user->homePhone = $r->homePhone; $user->employeeType = $r->employeeType; $user->isDisabled = (int)$r->isDisabled; return $user; } /** * Build group realName from zasob. * * @param object $zasob {ID, DESC, TYPE} * @return string realName */ protected function _buildRealNameFromZasob($zasob) { $realName = "{$zasob->DESC}"; if ($zasob->TYPE != 'STANOWISKO') $realName = "{$zasob->TYPE} {$realName}"; $realName = "[{$zasob->ID}] {$realName}"; return $realName; } /** * Group. * * @return object $group * $group->primaryKey * $group->realName * $group->nestedGroups * $group->type 'STANOWISKO','PODMIOT','DZIAL','local' * $group->zasobID * (optional) $group->zasobDESC */ public function getGroup($groupID) { if (!$this->_db) return false; if ($groupID <= 0) return false; $group = null; $sql = "SELECT z.`ID` , z.`DESC` , z.`TYPE` -- , IF(a.`A_STATUS`='NORMAL', 0, 1) as isDisabled from `CRM_LISTA_ZASOBOW` as z where z.`ID`='{$groupID}' and z.`TYPE` in('STANOWISKO','PODMIOT','DZIAL') "; $res = $this->_db->query($sql); if ($r = $this->_db->fetch($res)) { $group = $this->_buildGroupFromRow($r, $fetchNested = true); } return $group; } public function getGroupWithoutNested($groupID) { if (!$this->_db) return false; if ($groupID <= 0) return false; $group = null; $sql = "SELECT z.`ID` , z.`DESC` , z.`TYPE` -- , IF(a.`A_STATUS`='NORMAL', 0, 1) as isDisabled from `CRM_LISTA_ZASOBOW` as z where z.`ID`='{$groupID}' and z.`TYPE` in('STANOWISKO','PODMIOT','DZIAL') "; $res = $this->_db->query($sql); if ($r = $this->_db->fetch($res)) { $group = $this->_buildGroupFromRow($r, $fetchNested = false); } return $group; } public function fetchNestedGroups($groupID) { if (!$this->_db) return null; if ($groupID <= 0) return null; $groups = array(); $sql = "SELECT l.`TABLE_2_ID` as groupID , z2.`ID` , z2.`DESC` , z2.`TYPE` from `ITEM_LINKS` as l join `CRM_LISTA_ZASOBOW` as z1 on(z1.`ID`=l.`TABLE_1_ID`) join `CRM_LISTA_ZASOBOW` as z2 on(z2.`ID`=l.`TABLE_2_ID`) where l.`TABLE_1_ID`='{$groupID}' and l.`TABLE_2_ID`>0 and l.`LINKS_TYPE_ID`=5 and l.`TABLE_1_NAME`='CRM_LISTA_ZASOBOW' and l.`A_STATUS` in('NORMAL') and l.`TABLE_2_NAME`='CRM_LISTA_ZASOBOW' and z1.`TYPE` in('STANOWISKO','PODMIOT','DZIAL') and z2.`TYPE` in('STANOWISKO','PODMIOT','DZIAL') "; $res = $this->_db->query($sql); while ($r = $this->_db->fetch($res)) { $groups[$r->groupID] = $this->_buildGroupFromRow($r, $fetchNested = false); } return $groups; } public function getParentGroups(ObjectGroup $group) { return $this->fetchParentGroups($group->primaryKey); } public function fetchParentGroups($groupID) { if (!$this->_db) return null; if ($groupID <= 0) return null; $groups = array(); $sql = "SELECT l.`TABLE_1_ID` as groupID , z1.`ID` , z1.`DESC` , z1.`TYPE` from `ITEM_LINKS` as l join `CRM_LISTA_ZASOBOW` as z1 on(z1.`ID`=l.`TABLE_1_ID`) join `CRM_LISTA_ZASOBOW` as z2 on(z2.`ID`=l.`TABLE_2_ID`) where l.`TABLE_1_ID`>0 and l.`TABLE_2_ID`='{$groupID}' and l.`LINKS_TYPE_ID`=5 and l.`TABLE_1_NAME`='CRM_LISTA_ZASOBOW' and l.`A_STATUS` in('NORMAL') and l.`TABLE_2_NAME`='CRM_LISTA_ZASOBOW' and z1.`TYPE` in('STANOWISKO','PODMIOT','DZIAL') and z2.`TYPE` in('STANOWISKO','PODMIOT','DZIAL') "; $res = $this->_db->query($sql); while ($r = $this->_db->fetch($res)) { $groups[$r->groupID] = $this->_buildGroupFromRow($r, $fetchNested = false); } return $groups; } private function _getGroupConnection($parentGroupID, $groupID) { if (!$this->_db) return null; if ($parentGroupID <= 0) return null; if ($groupID <= 0) return null; $sql = "SELECT l.* from `ITEM_LINKS` as l join `CRM_LISTA_ZASOBOW` as z1 on(z1.`ID`=l.`TABLE_1_ID`) join `CRM_LISTA_ZASOBOW` as z2 on(z2.`ID`=l.`TABLE_2_ID`) where l.`TABLE_1_ID`='{$parentGroupID}' and l.`TABLE_2_ID`='{$groupID}' and l.`LINKS_TYPE_ID`=5 and l.`TABLE_1_NAME`='CRM_LISTA_ZASOBOW' and l.`TABLE_2_NAME`='CRM_LISTA_ZASOBOW' and z1.`TYPE` in('STANOWISKO','PODMIOT','DZIAL') and z2.`TYPE` in('STANOWISKO','PODMIOT','DZIAL') "; $res = $this->_db->query($sql); if ($r = $this->_db->fetch($res)) { return $r; } return null; } private function _setGroupConnection($parentGroupID, $groupID) { if (!$this->_db) return null; if ($groupID <= 0 || $parentGroupID <= 0) return null; $tblName = 'CRM_LISTA_ZASOBOW'; Lib::loadClass('ProcesHelper'); $tblZasobyID = ProcesHelper::getZasobTableID($tblName); if (!$tblZasobyID) return false; $connObj = $this->_getGroupConnection($parentGroupID, $groupID); if ($connObj) { $connObj->A_STATUS = 'NORMAL'; $affected = $this->_db->UPDATE_OBJ('ITEM_LINKS', $connObj); if ($affected > 0) { return true; } } else { $sqlObj = new stdClass(); $sqlObj->TABLE_1_ID = $parentGroupID; $sqlObj->TABLE_2_ID = $groupID; $sqlObj->TABLE_1_NAME = $tblName; $sqlObj->TABLE_2_NAME = $tblName; $sqlObj->TABLE_1_ZASOB_ID = $tblZasobyID; $sqlObj->TABLE_2_ZASOB_ID = $tblZasobyID; $sqlObj->LINKS_TYPE_ID = 5;// NestedGroups $sqlObj->A_STATUS = 'NORMAL'; $rowID = $this->_db->ADD_NEW_OBJ('ITEM_LINKS', $sqlObj); if ($rowID > 0) { return true; } } return false; } public function addNestedGroup($groupID, $nestedGroupID) { if (!$this->_db) return null; if ($groupID <= 0) return null; if ($nestedGroupID) return null; return $this->_setGroupConnection($groupID, $nestedGroupID); } public function addParentGroup($groupID, $parentGroupID) { if (!$this->_db) return null; if ($groupID <= 0) return null; if ($parentGroupID <= 0) return null; return $this->_setGroupConnection($parentGroupID, $groupID); } public function removeNestedGroup($groupID, $nestedGroupID) { if (!$this->_db) return null; if ($groupID <= 0) return null; if ($nestedGroupID <= 0) return null; $connObj = $this->_getGroupConnection($groupID, $nestedGroupID); if ($connObj) { $connObj->A_STATUS = 'DELETED'; $affected = $this->_db->UPDATE_OBJ('ITEM_LINKS', $connObj); if ($affected > 0) { return true; } } return false; } public function removeParentGroup($groupID, $parentGroupID) { if (!$this->_db) return null; if ($groupID <= 0) return null; if ($parentGroupID <= 0) return null; $connObj = $this->_getGroupConnection($parentGroupID, $groupID); if ($connObj) { $connObj->A_STATUS = 'DELETED'; $affected = $this->_db->UPDATE_OBJ('ITEM_LINKS', $connObj); if ($affected > 0) { return true; } } return false; } /** * @return bool */ public function isDisabled($usr) { if (null == $usr->isDisabled) { // TODO: sql IF(a.`A_STATUS`='NORMAL', 1, 0) as isDisabled } return $usr->isDisabled; } /** * @return bool */ public function setDisabled($usrLogin, $isDisabled) { if (empty($usrLogin) || null == $isDisabled) { return false; } $sqlStatus = ''; if ($isDisabled) { $sqlStatus = 'OFF_HARD'; } else { $sqlStatus = 'NORMAL'; } $sql = "update `ADMIN_USERS` set `A_STATUS`='{$sqlStatus}' where `ADM_ACCOUNT`='{$usrLogin}' "; echo'
sql (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($sql);echo'';
return false;
}
public function createUser($userData) {
// TODO: insert into `ADMIN_USERS` ...
return false;
}
public function updateUser($usrLogin, $updateData) {
// TODO: update `ADMIN_USERS` set ...
return false;
}
private function _getUserGroupsAll($usrLogin) {
$groups = array();
$sql_select = array();
$sql_select[] = "z.`ID`";
$sql_select[] = "z.`DESC`";
$sql_select[] = "z.`TYPE`";
//$sql_select[] = "z.`OPIS`";
$sql_select[] = "z.`A_LDAP_GID`";
$sql_select = implode(', ', $sql_select);
$sql = "select {$sql_select}
from `CRM_AUTH_PROFILE` as up
join `ADMIN_USERS` as a on(a.`ID`=up.`REMOTE_ID` and up.`REMOTE_TABLE`='ADMIN_USERS')
join `CRM_LISTA_ZASOBOW` as z on(z.`ID`=up.`ID_ZASOB`)
where
a.`ADM_ACCOUNT`='{$usrLogin}'
and up.`A_STATUS` in('WAITING', 'NORMAL')
and z.`TYPE` in('STANOWISKO','PODMIOT')
";
$res = $this->_db->query($sql);
while ($r = $this->_db->fetch($res)) {
$groups[$r->ID] = $this->_buildGroupFromRow($r);
}
return $groups;
}
private function _getUserGroupsBelow($groups) {// TODO: fetch groups below
if (empty($groups)) return null;
$groupsBelow = array();
$sqlGroupIds = array_keys($groups);
$sql = "
";
return $groupsBelow;
}
private function _getUserGroupsAbove($groups) {// TODO: fetch groups below
if (empty($groups)) return null;
$groupsAbove = array();
$sqlGroupIds = array_keys($groups);
$sql = "
";
return $groupsAbove;
}
/**
* Build network group object.
*
* @param object $groupDB {ID, DESC, TYPE} @see _getUserGroupsAll
* @return object $group @see getGroup
*
* Example: _buildGroupFromRow($r) => {@see group}
*/
private function _buildGroupFromRow($groupDB, $fetchNested = false) {
$group = new ObjectGroupDB($this);
$group->primaryKey = $groupDB->ID;
$group->type = $groupDB->TYPE;
$group->realName = $this->_buildRealNameFromZasob($groupDB);
$group->zasobID = $groupDB->ID;
$group->zasobDESC = $groupDB->DESC;
if ($fetchNested) $group->nestedGroups = $this->fetchNestedGroups($groupDB->ID);
return $group;
}
/**
* User group list by id.
*
* @param bool $fetchNested - contain all groups below connected groups and group PODMIOT from above.
*
* @return array with group objects @see getGroup
*/
public function getUserGroups($usrLogin, $fetchNested = false) {
$usrDB = $this->getUser($usrLogin);
if (!$usrDB) return false;
$groups = array();
if ($usrDB->employeeType == 'Pracownik') {
$groups['workgroup'] = $this->_buildGroupNetwork('workgroup');
$groups['com.apple.access_mail'] = $this->_buildGroupLocal('com.apple.access_mail');
$groups['com.apple.access_addressbook'] = $this->_buildGroupLocal('com.apple.access_addressbook');
$groups['com.apple.access_calendar'] = $this->_buildGroupLocal('com.apple.access_calendar');
$groups['com.apple.access_smb'] = $this->_buildGroupLocal('com.apple.access_smb');
$groups['com.apple.access_afp'] = $this->_buildGroupLocal('com.apple.access_afp');
$groups['com.apple.access_vpn'] = $this->_buildGroupLocal('com.apple.access_vpn');
$groups['com.apple.access_chat'] = $this->_buildGroupLocal('com.apple.access_chat');
}
$groupsAll = $this->_getUserGroupsAll($usrLogin);
if (is_array($groupsAll) && !empty($groupsAll)) {
foreach ($groupsAll as $kId => $vGroup) {
$groups[$vGroup->zasobID] = $vGroup;
}
if (false) {// TODO: $fetchNested) {
$groupsBelow = $this->_getUserGroupsBelow($groupsAll);
if (is_array($groupsBelow) && !empty($groupsBelow)) {
foreach ($groupsBelow as $kId => $vGroup) {
if (!isset($groups[$vGroup->zasobID])) {
$groups[$vGroup->zasobID] = $vGroup;
}
}
}
$groupsAbove = $this->_getUserGroupsAbove($groupsAll);
if (is_array($groupsAbove) && !empty($groupsAbove)) {
foreach ($groupsAbove as $kId => $vGroup) {
if (!isset($groups[$vGroup->zasobID])) {
$groups[$vGroup->zasobID] = $vGroup;
}
}
}
}
}
return $groups;
}
/**
* Add group member.
*
* @param string $usrLogin - user login
* @param object $group - @see getGroup
* @param optional int $telboxID
* @return bool
*/
public function addUserGroup($usrLogin, $group, $telboxID = 0) {
if (!$group->zasobID) return false;
$usrDB = $this->getUser($usrLogin);
if (!$usrDB) return false;
$sqlObj = new stdClass();
$sqlObj->ID_ZASOB = $group->zasobID;
$sqlObj->REMOTE_TABLE = 'ADMIN_USERS';
$sqlObj->REMOTE_ID = $usrDB->primaryKey;
$sqlObj->T_TELBOX_NEIGHBOUR_IN_ID = $telboxID;
$rowID = $this->_db->ADD_NEW_OBJ('CRM_AUTH_PROFILE', $sqlObj);
if ($rowID > 0) {
return true;
}
return false;
}
/**
* Get user and group info by profile ID (CRM_AUTH_PROFILE.ID)
* Only in UserStorageDB
*
* @return profile {}
* ID
* usrId
* usrLogin
* group - @see getGroup
*/
public function getProfileById($profileID) {
if (!$profileID) return false;
$profile = null;
$sql_select = array();
$sql_select[] = "z.`ID`";
$sql_select[] = "z.`DESC`";
$sql_select[] = "z.`TYPE`";
//$sql_select[] = "z.`OPIS`";
$sql_select[] = "z.`A_LDAP_GID`";
$sql_select[] = "up.`ID` as profileId";
$sql_select[] = "up.`T_TELBOX_NEIGHBOUR_IN_ID` as localisationId";
$sql_select[] = "a.`ADM_ACCOUNT` as usrLogin";
$sql_select[] = "a.`ID` as usrId";
$sql_select = implode(', ', $sql_select);
$sql = "select {$sql_select}
from `CRM_AUTH_PROFILE` as up
join `ADMIN_USERS` as a on(a.`ID`=up.`REMOTE_ID` and up.`REMOTE_TABLE`='ADMIN_USERS')
join `CRM_LISTA_ZASOBOW` as z on(z.`ID`=up.`ID_ZASOB`)
where
up.`ID`='{$profileID}'
and up.`A_STATUS` in('WAITING', 'NORMAL')
and z.`TYPE` in('STANOWISKO','PODMIOT')
";
$res = $this->_db->query($sql);
if ($r = $this->_db->fetch($res)) {
$profile = new stdClass();
$profile->profileId = $r->profileId;
$profile->localisationId = $r->localisationId;
$profile->usrId = $r->usrId;
$profile->usrLogin = $r->usrLogin;
$profile->group = $this->_buildGroupFromRow($r);
}
return $profile;
}
/**
* Get user and group info by profile ID (CRM_AUTH_PROFILE.ID)
* Only in UserStorageDB
*
* @return array of profile {}
* ID
* usrId
* usrLogin
* group - @see getGroup
*/
public function getUserProfiles($usrLogin) {
if (!$usrLogin) return false;
$profiles = array();
$sql_select = array();
$sql_select[] = "z.`ID`";
$sql_select[] = "z.`DESC`";
$sql_select[] = "z.`TYPE`";
//$sql_select[] = "z.`OPIS`";
$sql_select[] = "z.`A_LDAP_GID`";
$sql_select[] = "up.`ID` as profileId";
$sql_select[] = "up.`T_TELBOX_NEIGHBOUR_IN_ID` as localisationId";
$sql_select[] = "a.`ADM_ACCOUNT` as usrLogin";
$sql_select[] = "a.`ID` as usrId";
$sql_select = implode(', ', $sql_select);
$sql = "select {$sql_select}
from `CRM_AUTH_PROFILE` as up
join `ADMIN_USERS` as a on(a.`ID`=up.`REMOTE_ID` and up.`REMOTE_TABLE`='ADMIN_USERS')
join `CRM_LISTA_ZASOBOW` as z on(z.`ID`=up.`ID_ZASOB`)
where
a.`ADM_ACCOUNT`='{$usrLogin}'
and up.`A_STATUS` in('WAITING', 'NORMAL')
and z.`TYPE` in('STANOWISKO','PODMIOT')
";
$res = $this->_db->query($sql);
while ($r = $this->_db->fetch($res)) {
$profile = new stdClass();
$profile->profileId = $r->profileId;
$profile->localisationId = $r->localisationId;
$profile->usrId = $r->usrId;
$profile->usrLogin = $r->usrLogin;
$profile->group = $this->_buildGroupFromRow($r);
$profiles[] = $profile;
}
return $profiles;
}
/**
* Remove user group by profile ID (CRM_AUTH_PROFILE.ID)
* Only in UserStorageDB
*/
public function removeUserGroupByProfileId($usrLogin, $group, $profileID) {
if (!$this->_db) return false;
if (!$usrLogin || !$profileID || !$group || !$group->zasobID) return false;
$usrDB = $this->getUser($usrLogin);
if (!$usrDB) return false;
$sql = "delete from `CRM_AUTH_PROFILE`
where
`ID_ZASOB`='{$group->zasobID}'
and `REMOTE_ID`='{$usrDB->primaryKey}'
and `REMOTE_TABLE`='ADMIN_USERS'
and `ID`='{$profileID}'
";
$res = $this->_db->query($sql);
return true;
}
public function setSyncUserDate($usrLogin) {
if (!$this->_db) return false;
$sql = "update `ADMIN_USERS` set `A_SYNC_LDAP_DATE`=NOW() where `ADM_ACCOUNT`='{$usrLogin}' ";
$res = $this->_db->query($sql);
}
public function setSyncGroupDate($groupID) {
if (!$this->_db) return false;
if ($groupID <= 0) return false;
$sql = "update `CRM_LISTA_ZASOBOW` set `A_SYNC_LDAP_DATE`=NOW() where `ID`='{$groupID}' ";
$res = $this->_db->query($sql);
}
public function isPasswordChanged($usrLogin) {
$cnt = 0;
$sql = "
SELECT
-- h.`ADM_PASSWD`,
count(1) as cnt
FROM `ADMIN_USERS` as u
JOIN `ADMIN_USERS_HIST` as h on(h.`ID_USERS2`=u.`ID`)
WHERE u.`ADM_ACCOUNT`='{$usrLogin}'
AND h.`A_RECORD_CREATE_DATE`>u.`A_SYNC_LDAP_DATE`
AND h.`ADM_PASSWD`!='N/S;'
AND h.`ADM_PASSWD`!=''
-- GROUP BY h.`ADM_PASSWD`
";
$res = $this->_db->query($sql);
if ($r = $this->_db->fetch($res)) {
$cnt = $r->cnt;
}
return ($cnt > 0);
}
}