mirror of
https://github.com/VTECRM/vtenext.git
synced 2026-02-26 16:18:47 +00:00
567 lines
17 KiB
PHP
567 lines
17 KiB
PHP
<?php
|
|
/*************************************
|
|
* SPDX-FileCopyrightText: 2009-2020 Vtenext S.r.l. <info@vtenext.com>
|
|
* SPDX-License-Identifier: AGPL-3.0-only
|
|
************************************/
|
|
|
|
/* crmv@63349 - temporary tables replacements */
|
|
|
|
|
|
class TmpUserTables extends SDKExtendableUniqueClass {
|
|
|
|
public $tmpTable = '_tmp_users';
|
|
|
|
public function __construct() {
|
|
global $table_prefix;
|
|
|
|
$this->tmpTable = $table_prefix.'_tmp_users';
|
|
}
|
|
|
|
// Clean the whole table
|
|
public function cleanTmp() {
|
|
global $adb, $table_prefix;
|
|
|
|
$adb->query("DELETE FROM {$this->tmpTable}");
|
|
return true;
|
|
}
|
|
|
|
// Clean only a specific user from the table
|
|
public function cleanTmpForUser($userid) {
|
|
global $adb, $table_prefix;
|
|
|
|
$adb->pquery("DELETE FROM {$this->tmpTable} WHERE userid = ?", array($userid));
|
|
return true;
|
|
}
|
|
|
|
public function getAllUsers() {
|
|
global $adb, $table_prefix;
|
|
|
|
$list = array();
|
|
$r = $adb->pquery("SELECT id FROM {$table_prefix}_users WHERE status = ?", array('Active'));
|
|
if ($r && $adb->num_rows($r) > 0) {
|
|
$list = array();
|
|
while ($row = $adb->FetchByAssoc($r, -1, false)) {
|
|
$list[] = $row['id'];
|
|
}
|
|
}
|
|
|
|
return $list;
|
|
}
|
|
|
|
// Get a list of non-admin users which may use the table
|
|
public function getNonAdminUsers() {
|
|
global $adb, $table_prefix;
|
|
|
|
$list = array();
|
|
$r = $adb->pquery("SELECT id FROM {$table_prefix}_users WHERE is_admin = ? AND status = ?", array('off', 'Active'));
|
|
if ($r && $adb->num_rows($r) > 0) {
|
|
$list = array();
|
|
while ($row = $adb->FetchByAssoc($r, -1, false)) {
|
|
$list[] = $row['id'];
|
|
}
|
|
}
|
|
|
|
return $list;
|
|
}
|
|
|
|
// Get a list of admin users
|
|
public function getAdminUsers() {
|
|
global $adb, $table_prefix;
|
|
|
|
$list = array();
|
|
$r = $adb->pquery("SELECT id FROM {$table_prefix}_users WHERE is_admin = ? AND status = ?", array('on', 'Active'));
|
|
if ($r && $adb->num_rows($r) > 0) {
|
|
$list = array();
|
|
while ($row = $adb->FetchByAssoc($r, -1, false)) {
|
|
$list[] = $row['id'];
|
|
}
|
|
}
|
|
|
|
return $list;
|
|
}
|
|
|
|
// Generate all the rows for a specified module
|
|
public function generateTmpForUser($userid, $moduleHint = 'Accounts') {
|
|
global $adb, $table_prefix;
|
|
|
|
//$this->cleanTmpForUser($userid);
|
|
// insert the privileges
|
|
|
|
$userid = intval($userid);
|
|
|
|
require('user_privileges/requireUserPrivileges.php'); // crmv@39110
|
|
//crmv@69557
|
|
if (is_readable('user_privileges/sharing_privileges_'.$userid.'.php')) {
|
|
require('user_privileges/sharing_privileges_'.$userid.'.php');
|
|
} else{
|
|
return false;
|
|
}
|
|
//crmv@69557e
|
|
|
|
$user = CRMEntity::getInstance('Users');
|
|
$user->retrieveCurrentUserInfoFromFile($userid);
|
|
$user->id = $userid;
|
|
|
|
if (empty($current_user_parent_role_seq)) {
|
|
$user_role = $user->column_fields['roleid'];
|
|
$user_role_info = getRoleInformation($user_role);
|
|
$current_user_parent_role_seq = $user_role_info[$user_role][1];
|
|
}
|
|
if (empty($current_user_groups)) {
|
|
$userGroupFocus = new GetUserGroups();
|
|
$userGroupFocus->getAllUserGroups($user->id);
|
|
$current_user_groups = $userGroupFocus->user_groups;
|
|
}
|
|
|
|
$inst = CRMEntity::getInstance($moduleHint);
|
|
|
|
if (method_exists($inst, 'getNonAdminAccessQuery')) {
|
|
$query = $inst->getNonAdminAccessQuery(null, $user, $current_user_parent_role_seq, $current_user_groups);
|
|
$query = preg_replace('/^select id/', "select $userid as id, id as subuserid", $query);
|
|
|
|
$sql = "INSERT INTO {$this->tmpTable} (userid, subuserid) $query";
|
|
$r = $adb->query($sql);
|
|
}
|
|
|
|
return (!!$r);
|
|
|
|
}
|
|
|
|
// Generate the whole table
|
|
public function generateTmp() {
|
|
global $adb, $table_prefix;
|
|
|
|
// clear the table
|
|
$this->cleanTmp();
|
|
|
|
// get all the users
|
|
$users = $this->getAllUsers();
|
|
|
|
if ($users) {
|
|
foreach ($users as $userid) {
|
|
// insert the privileges
|
|
$this->generateTmpForUser($userid);
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public function hasSubUser($userid, $subuserid) {
|
|
global $adb, $table_prefix;
|
|
|
|
$has = false;
|
|
$ret = $adb->pquery("SELECT COUNT(*) AS cnt FROM {$this->tmpTable} WHERE userid = ? AND subuserid = ?", array($userid, $subuserid));
|
|
if ($ret) {
|
|
$has = ($adb->query_result_no_html($ret, 0, 'cnt') > 0);
|
|
}
|
|
return $has;
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* This class handles the new table for user permissions
|
|
*/
|
|
class TmpUserModTables extends TmpUserTables {
|
|
|
|
public $tmpTable = '_tmp_users_mod';
|
|
|
|
public function __construct() {
|
|
global $table_prefix;
|
|
|
|
parent::__construct();
|
|
$this->tmpTable = $table_prefix.'_tmp_users_mod';
|
|
}
|
|
|
|
// Clean only a specific module from the table
|
|
public function cleanTmpForModule($module) {
|
|
global $adb, $table_prefix;
|
|
|
|
$tabid = getTabid2($module); // crmv@127944
|
|
$adb->pquery("DELETE FROM {$this->tmpTable} WHERE tabid = ?", array($tabid));
|
|
return true;
|
|
}
|
|
|
|
// Clean only a module and a user from the table
|
|
public function cleanTmpForModuleUser($module, $userid) {
|
|
global $adb, $table_prefix;
|
|
|
|
$tabid = getTabid2($module); // crmv@127944
|
|
$adb->pquery("DELETE FROM {$this->tmpTable} WHERE userid = ? AND tabid = ?", array($userid, $tabid));
|
|
return true;
|
|
}
|
|
|
|
public function cleanTmpForUser($userid) {
|
|
global $adb, $table_prefix;
|
|
|
|
$adb->pquery("DELETE FROM {$this->tmpTable} WHERE userid = ?", array($userid));
|
|
return true;
|
|
}
|
|
|
|
// Get a list of modules which require rows in the table
|
|
public function getTmpModulesForUser($userid) {
|
|
global $adb, $table_prefix, $current_user;
|
|
|
|
// uses the $userid var
|
|
require('user_privileges/requireUserPrivileges.php'); // crmv@39110
|
|
require('user_privileges/sharing_privileges_'.$userid.'.php');
|
|
|
|
$list = false;
|
|
|
|
if ($is_admin == false &&
|
|
$profileGlobalPermission[1] == 1 &&
|
|
$profileGlobalPermission[2] == 1
|
|
) {
|
|
|
|
// first get a list of active modules
|
|
$r = $adb->query("SELECT tabid, name FROM {$table_prefix}_tab WHERE presence = 0");
|
|
if ($r && $adb->num_rows($r) > 0) {
|
|
$list = array();
|
|
while ($row = $adb->FetchByAssoc($r, -1, false)) {
|
|
$tabid = $row['tabid'];
|
|
if ($defaultOrgSharingPermission[$tabid] == 3 || $defaultOrgSharingPermission[$tabid] == 8) { //crmv@160797
|
|
$list[] = $row['name'];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return $list;
|
|
}
|
|
|
|
// Generate the rows for the specified module and user
|
|
public function generateTmpForModuleUser($module, $userid) {
|
|
global $adb, $table_prefix;
|
|
|
|
$userid = intval($userid);
|
|
$tabid = getTabid2($module); // crmv@127944
|
|
if (!$tabid) return false;
|
|
|
|
require('user_privileges/requireUserPrivileges.php'); // crmv@39110
|
|
require('user_privileges/sharing_privileges_'.$userid.'.php');
|
|
|
|
$user = CRMEntity::getInstance('Users');
|
|
$user->retrieveCurrentUserInfoFromFile($userid);
|
|
$user->id = $userid;
|
|
|
|
if (empty($current_user_parent_role_seq)) {
|
|
$user_role = $user->column_fields['roleid'];
|
|
$user_role_info = getRoleInformation($user_role);
|
|
$current_user_parent_role_seq = $user_role_info[$user_role][1];
|
|
}
|
|
if (empty($current_user_groups)) {
|
|
$userGroupFocus = new GetUserGroups();
|
|
$userGroupFocus->getAllUserGroups($user->id);
|
|
$current_user_groups = $userGroupFocus->user_groups;
|
|
}
|
|
|
|
$inst = CRMEntity::getInstance($module);
|
|
|
|
if (method_exists($inst, 'getNonAdminAccessQuery')) {
|
|
$query = $inst->getNonAdminAccessQuery($module, $user, $current_user_parent_role_seq, $current_user_groups);
|
|
$query = preg_replace('/^select id/', "select $userid as id, $tabid as tabid, id as subuserid", $query);
|
|
|
|
$sql = "INSERT INTO {$this->tmpTable} (userid, tabid, subuserid) $query";
|
|
$r = $adb->query($sql);
|
|
}
|
|
|
|
return (!!$r);
|
|
}
|
|
|
|
// Generate all the rows for a specified module
|
|
public function generateTmpForUser($userid, $moduleHint = null) { // crmv@146653
|
|
global $adb, $table_prefix;
|
|
|
|
$this->cleanTmpForUser($userid);
|
|
$mods = $this->getTmpModulesForUser($userid);
|
|
if (is_array($mods)) {
|
|
foreach ($mods as $module) {
|
|
// insert the privileges
|
|
$this->generateTmpForModuleUser($module, $userid);
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
// Generate all the rows for a specified module
|
|
public function generateTmpForModule($module) {
|
|
global $adb, $table_prefix;
|
|
|
|
$this->cleanTmpForModule($module);
|
|
$users = $this->getNonAdminUsers();
|
|
|
|
if ($users) {
|
|
foreach ($users as $userid) {
|
|
// insert the privileges
|
|
$this->generateTmpForModuleUser($module, $userid);
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
// Generate the whole table
|
|
public function generateTmp() {
|
|
global $adb, $table_prefix;
|
|
|
|
// clear the table
|
|
$this->cleanTmp();
|
|
|
|
// get the non admin users
|
|
$users = $this->getNonAdminUsers();
|
|
|
|
if ($users) {
|
|
foreach ($users as $userid) {
|
|
// get the modules for the user
|
|
$mods = $this->getTmpModulesForUser($userid);
|
|
if (is_array($mods)) {
|
|
foreach ($mods as $module) {
|
|
// insert the privileges
|
|
$this->generateTmpForModuleUser($module, $userid);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// and for admin users, generate the messages
|
|
$users = $this->getAdminUsers();
|
|
if ($users) {
|
|
foreach ($users as $userid) {
|
|
// insert the privileges
|
|
$this->generateTmpForModuleUser('Messages', $userid);
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public function hasSubUser($userid, $subuserid, $module = null) { // crmv@146653
|
|
global $adb, $table_prefix;
|
|
|
|
$has = false;
|
|
$tabid = getTabid2($module); // crmv@127944
|
|
|
|
$ret = $adb->pquery("SELECT COUNT(*) AS cnt FROM {$this->tmpTable} WHERE userid = ? AND tabid = ? AND subuserid = ?", array($userid, $tabid, $subuserid));
|
|
if ($ret) {
|
|
$has = ($adb->query_result_no_html($ret, 0, 'cnt') > 0);
|
|
}
|
|
return $has;
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* This class handles the table for the calendar permissions
|
|
*/
|
|
class TmpUserCalTables extends TmpUserModTables {
|
|
|
|
public $tmpTable = '_tmp_users_cal';
|
|
|
|
public function __construct() {
|
|
global $table_prefix;
|
|
|
|
parent::__construct();
|
|
$this->tmpTable = $table_prefix.'_tmp_users_cal';
|
|
}
|
|
|
|
// Retrieves only the Calendar and Events modules
|
|
public function getTmpModulesForUser($userid) {
|
|
global $adb, $table_prefix;
|
|
|
|
// uses the $userid var
|
|
require('user_privileges/requireUserPrivileges.php'); // crmv@39110
|
|
require('user_privileges/sharing_privileges_'.$userid.'.php');
|
|
|
|
$list = false;
|
|
$modNames = array('Calendar', 'Events');
|
|
|
|
if ($is_admin == false &&
|
|
$profileGlobalPermission[1] == 1 &&
|
|
$profileGlobalPermission[2] == 1
|
|
) {
|
|
|
|
// first get a list of active modules
|
|
$r = $adb->pquery("SELECT tabid, name FROM {$table_prefix}_tab WHERE presence = 0 AND name in (".generateQuestionMarks($modNames).")", $modNames);
|
|
if ($r && $adb->num_rows($r) > 0) {
|
|
$list = array();
|
|
while ($row = $adb->FetchByAssoc($r, -1, false)) {
|
|
$tabid = $row['tabid'];
|
|
// crmv@99203 - remove condition
|
|
//if ($defaultOrgSharingPermission[$tabid] == 3) {
|
|
$list[] = $row['name'];
|
|
//}
|
|
// crmv@99203e
|
|
}
|
|
}
|
|
}
|
|
|
|
return $list;
|
|
}
|
|
|
|
// Generate the rows for the specified module and user
|
|
public function generateTmpForModuleUser($module, $userid) {
|
|
global $adb, $table_prefix;
|
|
|
|
$userid = intval($userid);
|
|
$tabid = getTabid2($module); // crmv@127944
|
|
|
|
require('user_privileges/requireUserPrivileges.php'); // crmv@39110
|
|
require('user_privileges/sharing_privileges_'.$userid.'.php');
|
|
|
|
$user = CRMEntity::getInstance('Users');
|
|
$user->retrieveCurrentUserInfoFromFile($userid);
|
|
$user->id = $userid;
|
|
|
|
if (empty($current_user_parent_role_seq)) {
|
|
$user_role = $user->column_fields['roleid'];
|
|
$user_role_info = getRoleInformation($user_role);
|
|
$current_user_parent_role_seq = $user_role_info[$user_role][1];
|
|
}
|
|
if (empty($current_user_groups)) {
|
|
$userGroupFocus = new GetUserGroups();
|
|
$userGroupFocus->getAllUserGroups($user->id);
|
|
$current_user_groups = $userGroupFocus->user_groups;
|
|
}
|
|
|
|
$sharedCol = 'SHARED';
|
|
$adb->format_columns($sharedCol);
|
|
|
|
$inst = CRMEntity::getInstance($module);
|
|
|
|
$query = $inst->getNonAdminAccessQuery($module, $user, $current_user_parent_role_seq, $current_user_groups);
|
|
|
|
// first populate it with all zeroes
|
|
$query = preg_replace('/^select id/', "select $userid as id, $tabid as tabid, id as subuserid, 0 as $sharedCol", $query);
|
|
$sql = "INSERT INTO {$this->tmpTable} (userid, tabid, subuserid, $sharedCol) $query";
|
|
$r = $adb->query($sql);
|
|
|
|
// now replace the 0s with 1s
|
|
if ($adb->isMysql()) {
|
|
// nothing for the moment
|
|
/*$query =
|
|
"REPLACE INTO {$this->tmpTable}
|
|
SELECT $userid as userid, $tabid as tabid, userid as subuserid, 1 as $sharedCol
|
|
FROM {$table_prefix}_sharedcalendar
|
|
WHERE sharedid = $userid";*/
|
|
//$result = $adb->query($query);
|
|
} else {
|
|
$query =
|
|
"INSERT INTO {$this->tmpTable}
|
|
SELECT $userid as userid, $tabid as tabid, userid as subuserid, 1 as $sharedCol
|
|
FROM {$table_prefix}_sharedcalendar
|
|
WHERE sharedid = $userid
|
|
AND not exists (select userid from {$this->tmpTable} tt where tt.userid = $userid AND tt.tabid = $tabid AND tt.subuserid = {$table_prefix}_sharedcalendar.userid)";
|
|
$result = $adb->query($query);
|
|
}
|
|
|
|
//crmv@17001 - add missing users
|
|
$res = $adb->query("SELECT id FROM {$table_prefix}_users WHERE id NOT IN (SELECT subuserid FROM {$this->tmpTable} WHERE userid = $userid AND tabid = $tabid)");
|
|
if ($res && $adb->num_rows($res)>0) {
|
|
while($row=$adb->fetchByAssoc($res, -1, false)) {
|
|
$adb->pquery("insert into {$this->tmpTable} (userid, tabid, subuserid, $sharedCol) values ($userid, $tabid, ?,?)",array($row['id'], 2));
|
|
}
|
|
}
|
|
//crmv@17001e
|
|
|
|
//crmv@42775
|
|
if ($adb->isMysql()) {
|
|
$query =
|
|
"UPDATE {$this->tmpTable} t
|
|
INNER JOIN {$table_prefix}_sharedcalendar s ON t.userid = $userid AND t.tabid = $tabid AND s.userid = t.subuserid AND s.sharedid = $userid
|
|
SET t.$sharedCol = 1
|
|
WHERE t.$sharedCol = 2";
|
|
} elseif ($adb->isOracle()) {
|
|
$query =
|
|
"UPDATE {$this->tmpTable} t
|
|
SET t.$sharedCol = 1
|
|
WHERE t.$sharedCol = 2
|
|
AND EXISTS
|
|
(SELECT s.userid
|
|
FROM {$table_prefix}_sharedcalendar s WHERE t.userid = $userid AND t.tabid = $tabid AND s.userid = t.subuserid AND s.sharedid = $userid
|
|
)";
|
|
} elseif ($adb->isMssql()) {
|
|
// TODO: Not tested!
|
|
$query =
|
|
"UPDATE t
|
|
SET t.$sharedCol = 1
|
|
FROM {$this->tmpTable} t
|
|
INNER JOIN {$table_prefix}_sharedcalendar s ON t.userid = $userid AND t.tabid = $tabid AND s.userid = t.subuserid AND s.sharedid = $userid
|
|
WHERE t.$sharedCol = 2";
|
|
}
|
|
$result = $adb->query($query);
|
|
//crmv@42775e
|
|
|
|
//crmv@25593 - invitees
|
|
$query = "select {$table_prefix}_crmentity.smownerid
|
|
from {$table_prefix}_activity
|
|
inner join {$table_prefix}_crmentity on {$table_prefix}_crmentity.crmid = {$table_prefix}_activity.activityid
|
|
inner join {$table_prefix}_groups on {$table_prefix}_groups.groupid = {$table_prefix}_crmentity.smownerid
|
|
inner join (SELECT activityid FROM {$table_prefix}_invitees WHERE inviteeid = ? AND activityid > 0) t on t.activityid = {$table_prefix}_activity.activityid
|
|
WHERE deleted = 0
|
|
GROUP BY {$table_prefix}_crmentity.smownerid";
|
|
$res = $adb->pquery($query,array($userid));
|
|
if ($res && $adb->num_rows($res)>0) {
|
|
while($row=$adb->fetchByAssoc($res, -1, false)) {
|
|
// crmv@28028 insert ignore for oracle
|
|
if ($adb->isOracle()) {
|
|
$par = array($row['smownerid'],3, $row['smownerid']);
|
|
$adb->pquery(
|
|
"insert into {$this->tmpTable} (userid, tabid, subuserid, $sharedCol) ($sharedCol,id)
|
|
select $userid as userid, $tabid as tabid, ?, ? from dual where not exists (select subuserid from {$this->tmpTable} where userid = $userid AND $tabid = $tabid AND {$this->tmpTable}.subuserid = ?)", $par);
|
|
} elseif ($adb->isMysql()) {
|
|
$adb->pquery("insert ignore into {$this->tmpTable} (userid, tabid, subuserid, $sharedCol) values ($userid, $tabid, ?,?)",array($row['smownerid'], 3));
|
|
} else {
|
|
$adb->pquery("insert into {$this->tmpTable} (userid, tabid, subuserid, $sharedCol) values ($userid, $tabid, ?,?)",array($row['smownerid'], 3));
|
|
}
|
|
// crmv@28028e
|
|
}
|
|
}
|
|
//crmv@25593e
|
|
|
|
return true;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
class TmpUserModRelTables extends TmpUserModTables {
|
|
public $tmpTable = '_tmp_users_mod_rel';
|
|
|
|
public function __construct() {
|
|
global $table_prefix;
|
|
|
|
parent::__construct();
|
|
$this->tmpTable = $table_prefix.'_tmp_users_mod_rel';
|
|
}
|
|
|
|
public function cleanTmpForModuleUserId($module, $relmodule, $userid, $id) {
|
|
global $adb, $table_prefix;
|
|
|
|
$tabid = getTabid2($module); // crmv@127944
|
|
$reltabid = getTabid2($relmodule); // crmv@127944
|
|
$adb->pquery("DELETE FROM {$this->tmpTable} WHERE userid = ? AND tabid = ? AND reltabid = ? AND parentid = ?", array($userid, $tabid,$reltabid, $id));
|
|
return true;
|
|
}
|
|
|
|
public function getJoinCondition($module, $relmodule, $userid, $id, $extColumn = null, $extColumn2 = null, $alias = '') {
|
|
$tableName = $this->tmpTable;
|
|
if (empty($alias)) $alias = $tableName;
|
|
|
|
$id = intval($id);
|
|
$userid = intval($userid);
|
|
$tabid = intval(getTabid2($module)); // crmv@127944
|
|
$reltabid = intval(getTabid2($relmodule)); // crmv@127944
|
|
|
|
$sql = "$alias.userid = $userid AND $alias.tabid = $tabid AND $alias.reltabid = $reltabid AND $alias.parentid = $id";
|
|
if ($extColumn) {
|
|
$sql .= " AND $alias.crmid = $extColumn";
|
|
}
|
|
if ($extColumn2) {
|
|
$sql .= " AND $alias.relcrmid = $extColumn2";
|
|
}
|
|
return $sql;
|
|
}
|
|
|
|
} |