vtenext/modules/ModComments/ModCommentsCore.php
2021-04-28 20:10:26 +02:00

893 lines
37 KiB
PHP

<?php
/*************************************
* SPDX-FileCopyrightText: 2009-2020 Vtenext S.r.l. <info@vtenext.com>
* SPDX-License-Identifier: AGPL-3.0-only
************************************/
require_once('data/CRMEntity.php');
require_once('data/Tracker.php');
require_once 'vtlib/Vtecrm/Module.php';//crmv@207871
class ModCommentsCore extends CRMEntity {
var $db, $log; // Used in class functions of CRMEntity
var $table_name;
var $table_index= 'modcommentsid';
/** Indicator if this is a custom module or standard module */
var $IsCustomModule = true;
/**
* Mandatory table for supporting custom fields.
*/
var $customFieldTable = Array();
/**
* Mandatory for Saving, Include tables related to this module.
*/
var $tab_name = Array();
/**
* Mandatory for Saving, Include tablename and tablekey columnname here.
*/
var $tab_name_index = Array();
/**
* Mandatory for Listing (Related listview)
*/
var $list_fields = Array (
/* Format: Field Label => Array(tablename, columnname) */
// tablename should not have prefix 'vte_'
'Comment' => Array('modcomments', 'commentcontent'),
'Assigned To' => Array('crmentity','smownerid')
);
var $list_fields_name = Array (
/* Format: Field Label => fieldname */
'Comment' => 'commentcontent',
'Assigned To' => 'assigned_user_id'
);
// Make the field link to detail view
var $list_link_field = 'commentcontent';
// For Popup listview and UI type support
var $search_fields = Array(
/* Format: Field Label => Array(tablename, columnname) */
// tablename should not have prefix 'vte_'
'Comment' => Array('modcomments', 'commentcontent')
);
var $search_fields_name = Array (
/* Format: Field Label => fieldname */
'Comment' => 'commentcontent'
);
// For Popup window record selection
var $popup_fields = Array ('commentcontent');
// Allow sorting on the following (field column names)
var $sortby_fields = Array ('commentcontent');
// Should contain field labels
//var $detailview_links = Array ('Comment');
// For Alphabetical search
var $def_basicsearch_col = 'commentcontent';
// Column value to use on detail view record text display
var $def_detailview_recname = 'commentcontent';
// Required Information for enabling Import feature
var $required_fields = Array ('assigned_user_id'=>1);
var $default_order_by = 'commentcontent';
var $default_sort_order='ASC';
// Used when enabling/disabling the mandatory fields for the module.
// Refers to vte_field.fieldname values.
var $mandatory_fields = Array('createdtime', 'modifiedtime', 'commentcontent');
//crmv@10759
var $search_base_field = 'commentcontent';
//crmv@10759 e
// these characters are removed before saving the comment
public $badChars = array("\xe2\x80\xa8", "\xe2\x80\xa9"); // crmv@154947
function __construct() {
global $log, $table_prefix;
parent::__construct(); // crmv@37004
$this->table_name = $table_prefix.'_modcomments';
$this->tab_name_index = Array(
$table_prefix.'_crmentity' => 'crmid',
$table_prefix.'_modcomments' => 'modcommentsid',
$table_prefix.'_modcommentscf'=>'modcommentsid');
$this->tab_name = Array($table_prefix.'_crmentity',$table_prefix.'_modcomments', $table_prefix.'_modcommentscf');
$this->customFieldTable = Array($table_prefix.'_modcommentscf', 'modcommentsid');
$this->column_fields = getColumnFields('ModComments'); //crmv@146187 crmv@193294
$this->db = PearDatabase::getInstance();
$this->log = $log;
}
// crmv@154947
function presaveAlterValues() {
parent::presaveAlterValues();
// remove dangerous characters
if (is_string($this->column_fields['commentcontent']) && !empty($this->column_fields['commentcontent']) && !empty($this->badChars)) {
$this->column_fields['commentcontent'] = str_replace($this->badChars, '', $this->column_fields['commentcontent']);
}
}
// crmv@154947e
function save_module($module) {
global $current_user, $adb,$table_prefix;
require_once('modules/SDK/src/Notifications/Notifications.php');
//crmv@2963m
if (getSalesEntityType($this->column_fields['related_to']) == 'Messages') {
$result = $adb->pquery("SELECT messagehash FROM {$table_prefix}_messages WHERE messagesid = ?",array($this->column_fields['related_to']));
if ($result && $adb->num_rows($result) > 0) {
$messagehash = $adb->query_result($result,0,'messagehash');
if ($adb->isMysql()) {
$adb->pquery("insert ignore into {$table_prefix}_messagesrel (messagehash,crmid,module) values (?,?,?)",array($messagehash,$this->id,'ModComments'));
} else {
$result = $adb->pquery("select * from {$table_prefix}_messagesrel where messagehash = ? and crmid = ?",array($messagehash,$this->id));
if (!$result || $adb->num_rows($result) == 0) {
$adb->pquery("insert into {$table_prefix}_messagesrel (messagehash,crmid,module) values (?,?,?)",array($messagehash,$this->id,'ModComments'));
}
}
}
// crmv@63349 - insert into the special messages-relation table
if (empty($this->column_fields['parent_comments'])) { // crmv@109127
$this->insertIntoMsgRelTable($this->column_fields['related_to']);
}
// crmv@63349e
}
//crmv@2963me
if (!in_array($this->column_fields['parent_comments'],array('',0))) {
//reply
$focusFather = CRMEntity::getInstance('ModComments');
$focusFather->retrieve_entity_info($this->column_fields['parent_comments'],'ModComments');
$users_to_notify = array();
if ($focusFather->column_fields['visibility_comm'] == 'All') {
/*
//notifico a ( (assegnatario commento padre + utenti che hanno risp almeno una volta) - autore corrente )
$result = $adb->pquery('SELECT smownerid FROM '.$table_prefix.'_modcomments INNER JOIN '.$table_prefix.'_crmentity ON '.$table_prefix.'_crmentity.crmid = '.$table_prefix.'_modcomments.modcommentsid WHERE deleted = 0 AND parent_comments = ?',array($this->column_fields['parent_comments']));
if ($result && $adb->num_rows($result) > 0) {
while($row=$adb->fetchByAssoc($result)) {
if (!in_array($row['smownerid'],$users_to_notify)) {
$users_to_notify[] = $row['smownerid'];
}
}
}
*/
//notifico a (tutti gli utenti attivi e abilitati alle conversazioni pubbliche - autore corrente)
$result = $adb->pquery('select id from '.$table_prefix.'_users where deleted = 0 and status = ? and receive_public_talks = ?',array('Active','1'));
if ($result && $adb->num_rows($result) > 0) {
while($row = $adb->fetchByAssoc($result)) {
$users_to_notify[] = $row['id'];
}
}
} elseif ($focusFather->column_fields['visibility_comm'] == 'Users') {
//notifico a ( (assegnatario commento padre + utenti invitati) - autore corrente )
$users_to_notify[] = $focusFather->column_fields['assigned_user_id'];
$column = 'user';
$adb->format_columns($column);
$result = $adb->pquery('SELECT '.$column.' FROM '.$table_prefix.'_modcomments_users WHERE id = ?',array($this->column_fields['parent_comments']));
if ($result && $adb->num_rows($result) > 0) {
while($row=$adb->fetchByAssoc($result)) {
$users_to_notify[] = $row['user'];
}
}
}
$users_to_notify = array_filter($users_to_notify);
foreach($users_to_notify as $user) {
if ($user == $this->column_fields['assigned_user_id']) {
continue;
}
$notifications = new Notifications($user,'ModComments');
$notifications->addNotification($this->id);
}
$adb->pquery("update {$table_prefix}_modcomments set lastchild = ? where modcommentsid = ?", array($this->id, $this->column_fields['parent_comments'])); // crmv@53565
$adb->pquery("update {$table_prefix}_crmentity set modifiedtime = ? where crmid = ?", array($adb->formatDate(date('Y-m-d H:i:s'), true), $this->column_fields['parent_comments'])); // crmv@49398 crmv@69690
} elseif ($this->column_fields['visibility_comm'] == 'Users' && isset($_REQUEST['users_comm'])) {
//new father comment to specified users
$adb->pquery('delete from '.$table_prefix.'_modcomments_users where id = ?',array($this->id));
$idlist = vtlib_purify($_REQUEST['users_comm']);
if ($idlist != '') {
$idlist = array_filter(explode('|',$idlist));
$column = 'user';
$adb->format_columns($column);
foreach($idlist as $id) {
$adb->pquery('insert into '.$table_prefix.'_modcomments_users (id,'.$column.') values (?,?)',array($this->id,$id));
//notifico gli utenti invitati
$notifications = new Notifications($id,'ModComments');
$notifications->addNotification($this->id);
}
}
$adb->pquery("update {$table_prefix}_modcomments set lastchild = ? where modcommentsid = ?", array($this->id, $this->id)); // crmv@53565
} elseif ($this->column_fields['visibility_comm'] == 'All') {
//new father comment to all
//notifico a (tutti gli utenti attivi e abilitati alle conversazioni pubbliche - autore corrente)
$result = $adb->pquery('select id from '.$table_prefix.'_users where deleted = 0 and status = ? and receive_public_talks = ?',array('Active','1'));
if ($result && $adb->num_rows($result) > 0) {
while($row = $adb->fetchByAssoc($result)) {
if ($row['id'] == $this->column_fields['assigned_user_id']) {
continue;
}
$notifications = new Notifications($row['id'],'ModComments');
$notifications->addNotification($this->id);
}
}
$adb->pquery("update {$table_prefix}_modcomments set lastchild = ? where modcommentsid = ?", array($this->id, $this->id)); // crmv@53565
}
}
// crmv@43050 - add users to the current
function addUsers($userlist = array()) {
global $adb, $table_prefix;
require_once('modules/SDK/src/Notifications/Notifications.php');
$commentid = $this->id;
if (!is_array($userlist)) $userlist = array($userlist);
if (count($userlist) == 0 || $this->column_fields['visibility_comm'] != 'Users') return false;
$column = 'user';
$adb->format_columns($column);
$addedUsers = false;
foreach ($userlist as $userid) {
// check if present
$res = $adb->pquery("select id from {$table_prefix}_modcomments_users where id = ? and $column = ?", array($commentid,$userid));
if ($res && $adb->num_rows($res) == 0) {
// if not, add and notify
$adb->pquery("insert into {$table_prefix}_modcomments_users (id,$column) values (?,?)", array($commentid,$userid));
// notifico gli utenti invitati
$notifications = new Notifications($userid,'ModComments');
$notifications->addNotification($commentid);
$addedUsers = true;
// crmv@63349 - add to the relation table
if ($this->column_fields['related_to'] > 0 && getSalesEntityType($this->column_fields['related_to']) == 'Messages') { // crmv@109127
if ($adb->isMysql()) {
$adb->pquery("insert ignore into {$table_prefix}_modcomments_msgrel (userid, messagesid) values (?,?)",array($userid,$this->column_fields['related_to']));
} else {
$result = $adb->pquery("select userid from {$table_prefix}_modcomments_msgrel where userid = ? and messagesid = ?",array($userid,$this->column_fields['related_to']));
if ($result && $adb->num_rows($result) == 0) {
$adb->pquery("insert into {$table_prefix}_modcomments_msgrel (userid, messagesid) values (?,?)",array($userid,$this->column_fields['related_to']));
}
}
}
// crmv@63349e
}
}
if ($addedUsers) {
// update modified time
$adb->pquery("update {$table_prefix}_crmentity set modifiedtime = ? where crmid = ?", array(date('Y-m-d H:i:s'), $commentid));
}
return true;
}
// crmv@43050e
//crmv@179773
function checkParentPermissions($related_to, $commentid='', $visibility='', $users=array()) {
global $adb, $table_prefix, $current_user;
if ($this->isEnabledParentPermissionsProp()) {
if (!empty($commentid)) {
$visibility = getSingleFieldValue("{$table_prefix}_modcomments", 'visibility_comm', 'modcommentsid', $commentid);
if ($visibility == 'Users' && empty($users)) {
$result = $adb->pquery("SELECT user FROM {$table_prefix}_modcomments_users WHERE id = ?", array($commentid));
if ($result && $adb->num_rows($result) > 0) {
while($row=$adb->fetchByAssoc($result)) {
$users[] = $row['user'];
}
}
}
}
$tmp_current_user = $current_user;
$parent_module = getSalesEntityType($related_to);
if ($visibility == 'All') {
$result = $adb->pquery('select id from '.$table_prefix.'_users where deleted = 0 and status = ? and receive_public_talks = ?',array('Active','1'));
if ($result && $adb->num_rows($result) > 0) {
while($row = $adb->fetchByAssoc($result,-1,false)) {
$current_user = CRMEntity::getInstance('Users');
$current_user->retrieveCurrentUserInfoFromFile($row['id']);
if (isPermitted($parent_module, 'DetailView', $related_to) == 'no') return false;
}
}
} elseif ($visibility == 'Users' && !empty($users)) {
foreach($users as $user) {
$current_user = CRMEntity::getInstance('Users');
$current_user->retrieveCurrentUserInfoFromFile($user);
if (isPermitted($parent_module, 'DetailView', $related_to) == 'no') return false;
}
}
$current_user = $tmp_current_user;
}
return true;
}
function isParentPermitted($module,$actionname,$record_id) {
global $adb, $table_prefix, $current_user;
$permission = '';
$VTEP = VTEProperties::getInstance();
if ($VTEP->getProperty('performance.modcomments_parent_perm')) {
$result = $adb->pquery("select max(related_to_perm) as \"related_to_perm\"
from {$this->table_name}
inner join {$table_prefix}_crmentity on {$this->table_name}.{$this->table_index} = {$table_prefix}_crmentity.crmid
left join {$table_prefix}_modcomments_users on {$this->table_name}.{$this->table_index} = {$table_prefix}_modcomments_users.id
where deleted = 0 and related_to = ? and (visibility_comm = ? or (visibility_comm = ? and user = ?))", array($record_id,'All','Users',$current_user->id));
if ($result && $adb->num_rows($result) > 0) {
$related_to_perm = $adb->query_result($result,0,'related_to_perm'); // 0 No Permission, 1 Read Only, 2 Read/Write
$actionid = getActionid($actionname);
switch ($actionid) {
case 0: // save
case 1: // editview
if ($related_to_perm == 2) $permission = 'yes';
break;
case 4: // detailview
if ($related_to_perm > 0) $permission = 'yes';
break;
}
}
}
return $permission;
}
function isEnabledParentPermissionsProp() {
global $current_user;
$VTEP = VTEProperties::getInstance();
if ($VTEP->getProperty('performance.modcomments_parent_perm')) {
$users = $VTEP->getProperty('performance.modcomments_parent_perm_users');
if ($users['all']) {
return true;
}
if (!empty($users['users']) && in_array($current_user->id,$users['users'])) {
return true;
}
if (!empty($users['groups'])) {
require_once('include/utils/GetGroupUsers.php');
foreach($users['groups'] as $group) {
$groupUsers = new GetGroupUsers();
$groupUsers->getAllUsersInGroup($group,true);
if (in_array($current_user->id,$groupUsers->group_users)) {
return true;
}
}
}
if (!empty($users['roles']) && in_array($current_user->roleid,$users['roles'])) {
return true;
}
}
return false;
}
//crmv@179773e
// crmv@43448
function setAsUnread($commentid, $userid = null, $children = false) {
global $adb, $table_prefix, $current_user;
require_once('modules/SDK/src/Notifications/Notifications.php');
if (empty($userid)) $userid = $current_user->id;
$comments = array($commentid);
if ($children) {
// retrieve also replies
$comments = array_unique(array_merge($comments, $this->getRepliesIds($commentid)));
}
$comments = array_map('intval', $comments); //crmv@85396
// notifico l'utente
$notifications = new Notifications($userid,'ModComments');
foreach ($comments as $commentid) {
$notifications->addNotification($commentid, 1);
}
// crmv@57366 crmv@64325 - update the modifiedtime (not the best thing, since notifications are per-user)
if (count($comments) > 0) {
(PerformancePrefs::getBoolean('CRMENTITY_PARTITIONED')) ? $setypeCond = "AND setype = 'ModComments'" : $setypeCond = '';
$adb->pquery("UPDATE {$table_prefix}_crmentity SET modifiedtime = ? WHERE crmid IN (".generateQuestionMarks($comments).") ".$setypeCond, array(date('Y-m-d H:i:s'), $comments));
}
// crmv@57366e crmv@64325e
}
function setAsRead($commentid, $userid = null, $children = true) {
global $adb, $table_prefix, $current_user;
require_once('modules/SDK/src/Notifications/Notifications.php');
if (empty($userid)) $userid = $current_user->id;
$comments = array($commentid);
if ($children) {
// retrieve also replies
$comments = array_unique(array_merge($comments, $this->getRepliesIds($commentid)));
}
$comments = array_map('intval', $comments); //crmv@85396
// notifico l'utente
$notifications = new Notifications($userid,'ModComments');
foreach ($comments as $commentid) {
$notifications->deleteNotification($commentid, true);
}
// crmv@57366 crmv@64325 - update the modifiedtime (not the best thing, since notifications are per-user)
if (count($comments) > 0) {
(PerformancePrefs::getBoolean('CRMENTITY_PARTITIONED')) ? $setypeCond = "AND setype = 'ModComments'" : $setypeCond = '';
$adb->pquery("UPDATE {$table_prefix}_crmentity SET modifiedtime = ? WHERE crmid IN (".generateQuestionMarks($comments).") ".$setypeCond, array(date('Y-m-d H:i:s'), $comments));
}
// crmv@57366e crmv@64325e
}
function getRepliesIds($commentid) {
global $adb, $table_prefix;
$ret = array();
$res = $adb->pquery("
select modcommentsid
from {$table_prefix}_modcomments mc
inner join {$table_prefix}_crmentity c on c.crmid = mc.modcommentsid
where c.deleted = 0 and mc.parent_comments = ?", array($commentid));
if ($res) {
while ($row = $adb->FetchByAssoc($res, -1, false)) {
$ret[] = $row['modcommentsid'];
}
}
return $ret;
}
// crmv@43448e
/**
* Return query to use based on given modulename, fieldname
* Useful to handle specific case handling for Popup
*/
function getQueryByModuleField($module, $fieldname, $srcrecord) {
// $srcrecord could be empty
}
/**
* Get list view query (send more WHERE clause condition if required)
*/
/**
* Get list view query (send more WHERE clause condition if required)
*/
function getListQuery($module, $where='', $replies=false, $skip_parent_join=false, $joinusers=false, $visibilityInherited=false) { //crmv@32429 crmv@101978
global $table_prefix;
if ($visibilityInherited) $replies = true; // crmv@101978
$query = "SELECT * ";
// Keep track of tables joined to avoid duplicates
$joinedTables = array();
// Select Custom Field Table Columns if present
// if(!empty($this->customFieldTable)) $query .= ", " . $this->customFieldTable[0] . ".* ";
$query .= " FROM $this->table_name";
$query .= " INNER JOIN ".$table_prefix."_crmentity ON ".$table_prefix."_crmentity.crmid = $this->table_name.$this->table_index";
$joinedTables[] = $this->table_name;
$joinedTables[] = $table_prefix.'_crmentity';
// Consider custom table join as well.
if(!empty($this->customFieldTable)) {
$query .= " INNER JOIN ".$this->customFieldTable[0]." ON ".$this->customFieldTable[0].'.'.$this->customFieldTable[1] .
" = $this->table_name.$this->table_index";
$joinedTables[] = $this->customFieldTable[0];
}
if (!$replies && !$joinusers) {
$query .= " LEFT JOIN ".$table_prefix."_users ON ".$table_prefix."_users.id = ".$table_prefix."_crmentity.smownerid";
$query .= " LEFT JOIN ".$table_prefix."_groups ON ".$table_prefix."_groups.groupid = ".$table_prefix."_crmentity.smownerid";
$joinedTables[] = $table_prefix.'_users';
$joinedTables[] = $table_prefix.'_groups';
}
if (!$skip_parent_join) { //crmv@32429
$linkedModulesQuery = $this->db->pquery("SELECT distinct fieldname, columnname, relmodule FROM ".$table_prefix."_field" .
" INNER JOIN ".$table_prefix."_fieldmodulerel ON ".$table_prefix."_fieldmodulerel.fieldid = ".$table_prefix."_field.fieldid" .
" WHERE uitype='10' AND ".$table_prefix."_fieldmodulerel.module=?", array($module));
$linkedFieldsCount = $this->db->num_rows($linkedModulesQuery);
for($i=0; $i<$linkedFieldsCount; $i++) {
$related_module = $this->db->query_result($linkedModulesQuery, $i, 'relmodule');
$fieldname = $this->db->query_result($linkedModulesQuery, $i, 'fieldname');
$columnname = $this->db->query_result($linkedModulesQuery, $i, 'columnname');
$other = CRMEntity::getInstance($related_module);
vtlib_setup_modulevars($related_module, $other);
if(!in_array($other->table_name, $joinedTables)) {
$query .= " LEFT JOIN $other->table_name ON $other->table_name.$other->table_index = $this->table_name.$columnname";
$joinedTables[] = $other->table_name;
}
}
} //crmv@32429
global $current_user;
if (!$replies) {
$query .= $this->getNonAdminAccessControlQuery($module,$current_user);
}
// crmv@64325
$setypeCond = '';
if (PerformancePrefs::getBoolean('CRMENTITY_PARTITIONED')) {
$setypeCond = "AND {$table_prefix}_crmentity.setype = 'ModComments'";
}
$query .= " WHERE ".$table_prefix."_crmentity.deleted = 0 $setypeCond ".$where;
// crmv@64325e
if (!$replies) {
$query = $this->listQueryNonAdminChange($query, $module);
}
// crmv@101978
if ($visibilityInherited) {
if ($_REQUEST['ajxaction'] != 'LOADRELATEDLIST') {
$query .= " AND ($this->table_name.parent_comments IS NULL OR $this->table_name.parent_comments = '')";
}
}
// crmv@101978e
return $query;
}
public function listQueryNonAdminChange($query,$module,$scope='') {
global $current_user,$adb,$table_prefix;
$query = parent::listQueryNonAdminChange($query,$module,$scope);
if ($_REQUEST['ajxaction'] != 'LOADRELATEDLIST') {
$query .= " AND ($this->table_name.parent_comments IS NULL OR $this->table_name.parent_comments = '')";
$query .= " AND (
".$table_prefix."_crmentity.smcreatorid = $current_user->id";
if ($current_user->column_fields['receive_public_talks'] == '1') {
$query .= " OR ".$table_prefix."_modcomments.visibility_comm = 'All'";
}
$column = 'user';
$adb->format_columns($column);
$query .= " OR (".$table_prefix."_modcomments.visibility_comm = 'Users' AND EXISTS(SELECT * FROM ".$table_prefix."_modcomments_users WHERE ".$table_prefix."_modcomments_users.id = ".$table_prefix."_modcomments.modcommentsid AND ".$table_prefix."_modcomments_users.$column = $current_user->id))
)";
}
return $query;
}
// crmv@63349 - handlers for the msgrel table
public function insertIntoMsgRelTable($messageId) {
global $adb, $table_prefix;
$visib = $this->column_fields['visibility_comm'];
$users = array();
// if public, insert only for users with the receive public flag, otherwise only to the specified users
if ($visib == 'All') {
$result = $adb->pquery(
"select u.id as userid
from {$table_prefix}_users u
left join {$table_prefix}_modcomments_msgrel mr on mr.userid = u.id and mr.messagesid = ?
where u.deleted = 0 and u.receive_public_talks = ? AND mr.userid IS NULL",
array($messageId, 1)
);
} elseif ($visib == 'Users' && !empty($_REQUEST['users_comm'])) {
$idlist = vtlib_purify($_REQUEST['users_comm']);
if (!empty($idlist)) {
$idlist = array_filter(explode('|',$idlist));
}
if (is_array($idlist) && count($idlist) > 0) {
$result = $adb->pquery(
"SELECT u.id as userid
FROM {$table_prefix}_users u
LEFT JOIN {$table_prefix}_modcomments_msgrel mr ON mr.userid = u.id AND mr.messagesid = ?
WHERE mr.userid IS NULL AND u.id in (".generateQuestionMarks($idlist).")",
array($messageId, $idlist)
);
}
}
// retrieve the users to be put in the rel table
if ($result && $adb->num_rows($result) > 0) {
while($row = $adb->fetchByAssoc($result, -1, false)) {
$uid = intval($row['userid']);
if ($uid != $this->column_fields['assigned_user_id']) {
$users[] = $uid;
}
}
}
// insert it
foreach ($users as $userid) {
$adb->pquery("INSERT INTO {$table_prefix}_modcomments_msgrel (userid, messagesid) VALUES (?,?)", array($userid, $messageId));
}
return true;
}
public function removeFromMsgRelTable($messageId) {
global $adb, $current_user,$table_prefix;
$visib = $this->column_fields['visibility_comm'];
$users = array();
if ($visib == 'All') {
// get all the users
$result = $adb->query("SELECT DISTINCT userid FROM {$table_prefix}_modcomments_msgrel");
} elseif ($visib == 'Users') {
$result = $adb->pquery("SELECT user AS userid FROM {$table_prefix}_modcomments_users WHERE id = ?", array($this->id));
}
if ($result && $adb->num_rows($result) > 0) {
while($row = $adb->fetchByAssoc($result, -1, false)) {
$users[] = intval($row['userid']);
}
}
// delete those lines
if (count($users) > 0) {
$result = $adb->pquery("DELETE FROM {$table_prefix}_modcomments_msgrel WHERE userid IN (".generateQuestionMarks($users).") AND messagesid = ?", array($users, $messageId));
}
// regenerate the table for the message
$msgfocus = CRMEntity::getInstance('Messages');
foreach ($users as $userid) {
$msgfocus->regenCommentsMsgRelTable($userid, $messageId);
}
}
// crmv@63349e
function generateReportsQuery($module, $reportid = 0, $joinProducts = false, $joinUitype10 = true) { // crmv@146653
global $current_user,$table_prefix;
//crmv@21249
$query = "from ".$table_prefix."_modcomments inner join ".$table_prefix."_modcommentscf ".$table_prefix."_modcommentscf
on ".$table_prefix."_modcommentscf.modcommentsid=".$table_prefix."_modcomments.modcommentsid
inner join ".$table_prefix."_crmentity on ".$table_prefix."_crmentity.crmid=".$table_prefix."_modcomments.modcommentsid
left join ".$table_prefix."_groups ".$table_prefix."_groupsModComments on ".$table_prefix."_groupsModComments.groupid = ".$table_prefix."_crmentity.smownerid
left join ".$table_prefix."_users ".$table_prefix."_usersModComments on ".$table_prefix."_usersModComments.id = ".$table_prefix."_crmentity.smownerid
left join ".$table_prefix."_crmentity ".substr("".$table_prefix."_crmentityRelModComments",0,29)." on ".substr("".$table_prefix."_crmentityRelModComments",0,29).".crmid = ".$table_prefix."_modcomments.related_to
and ".$table_prefix."_crmentityRelModComments.deleted=0
left join ".$table_prefix."_leaddetails ".substr("".$table_prefix."_leaddetailsRelModComments",0,29)." on ".substr("".$table_prefix."_leaddetailsRelModComments",0,29).".leadid = ".substr("".$table_prefix."_crmentityRelModComments",0,29).".crmid
left join ".$table_prefix."_contactdetails ".substr("".$table_prefix."_contactdetailsRelModComments",0,29)." on ".substr("".$table_prefix."_contactdetailsRelModComments",0,29).".contactid = ".substr("".$table_prefix."_crmentityRelModComments",0,29).".crmid
left join ".$table_prefix."_account ".$table_prefix."_accountRelModComments on ".$table_prefix."_accountRelModComments.accountid = ".substr("".$table_prefix."_crmentityRelModComments",0,29).".crmid";
$projectModule = Vtecrm_Module::getInstance('Project');
if($projectModule !== false) {
$query .= " left join ".$table_prefix."_projecttask as ".substr("".$table_prefix."_projecttaskRelModComments",0,29)." on ".substr("".$table_prefix."_projecttaskRelModComments",0,29).".projecttaskid = ".substr("".$table_prefix."_crmentityRelModComments",0,29).".crmid
left join ".$table_prefix."_project as ".$table_prefix."_projectRelModComments on ".$table_prefix."_projectRelModComments.projectid = ".substr("".$table_prefix."_crmentityRelModComments",0,29).".crmid";
}
//crmv@21249e
return $query;
}
// crmv@43050
function save_related_module($module, $crmid, $with_module, $with_crmid, $skip_check=false) { // crmv@146653
global $adb, $table_prefix, $current_user;
if ($module != 'ModComments') {
return parent::save_related_module($module, $crmid, $with_module, $with_crmid, $skip_check); // crmv@146653
}
if(!is_array($with_crmid)) $with_crmid = array($with_crmid);
$with_crmid = array_filter($with_crmid);
if ($crmid > 0 && $with_module && count($with_crmid) > 0)
// save only the first
$adb->pquery("update {$this->table_name} set related_to = ? where {$this->table_index} = ?", array($with_crmid[0], $crmid));
$adb->pquery("update {$table_prefix}_crmentity set modifiedtime = ? where crmid = ?", array(date('Y-m-d H:i:s'), $crmid));
if (isModuleInstalled('ModNotifications') && $current_user->id != getOwnerId($crmid)) {
$obj = ModNotifications::getInstance(); // crmv@164122
$owner = getOwnerId($crmid);
$notified_users = $obj->saveFastNotification(
array(
'assigned_user_id' => $owner,
'related_to' => $crmid,
'mod_not_type' => 'Relation',
'description' => $with_crmid[0],
),false
);
}
}
// crmv@43050e
/**
* Invoked when special actions are performed on the module.
* @param String Module name
* @param String Event Type (module.postinstall, module.disabled, module.enabled, module.preuninstall)
*/
function vtlib_handler($modulename, $event_type) {
if($event_type == 'module.postinstall') {
// TODO Handle post installation actions
} else if($event_type == 'module.disabled') {
// TODO Handle actions when this module is disabled.
} else if($event_type == 'module.enabled') {
// TODO Handle actions when this module is enabled.
} else if($event_type == 'module.preuninstall') {
// TODO Handle actions when this module is about to be deleted.
} else if($event_type == 'module.preupdate') {
// TODO Handle actions before this module is updated.
} else if($event_type == 'module.postupdate') {
// TODO Handle actions after this module is updated.
}
}
/**
* Handle saving related module information.
* NOTE: This function has been added to CRMEntity (base class).
* You can override the behavior by re-defining it here.
*/
// function save_related_module($module, $crmid, $with_module, $with_crmid) { }
/**
* Handle deleting related module information.
* NOTE: This function has been added to CRMEntity (base class).
* You can override the behavior by re-defining it here.
*/
function delete_related_module($module, $crmid, $with_module, $with_crmid, $reverse = true) { // crmv@146653
if ($with_module == 'ModComments') {
$destinationModule = vtlib_purify($_REQUEST['destination_module']);
if (!is_array($with_crmid)) $with_crmid = Array($with_crmid);
foreach($with_crmid as $relcrmid) {
$child = CRMEntity::getInstance($destinationModule);
$child->retrieve_entity_info($relcrmid, $destinationModule);
$child->trash($destinationModule, $relcrmid);
}
} else {
parent::delete_related_module($module, $crmid, $with_module, $with_crmid, $reverse); // crmv@146653
}
}
/**
* Handle getting related list information.
* NOTE: This function has been added to CRMEntity (base class).
* You can override the behavior by re-defining it here.
*/
//function get_related_list($id, $cur_tab_id, $rel_tab_id, $actions=false) { }
/**
* Handle getting dependents list information.
* NOTE: This function has been added to CRMEntity (base class).
* You can override the behavior by re-defining it here.
*/
//function get_dependents_list($id, $cur_tab_id, $rel_tab_id, $actions=false) { }
function trash($module, $id) {
global $current_user, $adb, $table_prefix;
if ($this->column_fields['creator']) {
$creator = $this->column_fields['creator'];
} else {
$focus = CRMEntity::getInstance($module);
$focus->retrieve_entity_info($id, $module);
$creator = $focus->column_fields['creator'];
}
if ($current_user->id != $creator) {
return false;
}
require_once('modules/SDK/src/Notifications/Notifications.php');
$notifications = new Notifications($current_user->id,'ModComments');
$notifications->deleteAllNotificationForComment($id);
// crmv@63349
if (empty($this->column_fields['creator'])) {
$this->retrieve_entity_info($id, $module);
}
$relatedTo = $this->column_fields['related_to'];
if (!empty($relatedTo) && getSalesEntityType($relatedTo) == 'Messages') {
$removeMsg = true;
}
parent::trash($module, $id);
if ($removeMsg) {
$this->id = $id;
$this->removeFromMsgRelTable($relatedTo);
}
// crmv@63349e
//cancello le eventuali risposte
$result = $adb->pquery("SELECT modcommentsid FROM {$table_prefix}_modcomments WHERE parent_comments = ?",array($id));
if ($result && $adb->num_rows($result) > 0) {
while($row=$adb->fetchByAssoc($result)){
$notifications->deleteAllNotificationForComment($row['modcommentsid']);
parent::trash($module, $row['modcommentsid']);
}
}
}
function get_replies($id, $cur_tab_id, $rel_tab_id, $actions=false) {
global $currentModule, $app_strings, $current_user,$table_prefix;//crmv@203484 removed global singlepane
//crmv@203484
$VTEP = VTEProperties::getInstance();
$singlepane_view = $VTEP->getProperty('layout.singlepane_view');
//crmv@203484e
$parenttab = getParentTab();
// echo "$id, $currentModule";die;
$focus = CRMEntity::getInstance($currentModule);
$focus->retrieve_entity_info($id, $currentModule);
// echo '<pre>';print_r($focus->column_fields);die;
$related_module = vtlib_getModuleNameById($rel_tab_id);
$other = CRMEntity::getInstance($related_module);
// Some standard module class doesn't have required variables
// that are used in the query, they are defined in this generic API
vtlib_setup_modulevars($currentModule, $this);
vtlib_setup_modulevars($related_module, $other);
$button = '';
// To make the edit or del link actions to return back to same view.
if($singlepane_view == true) $returnset = "&return_module=$currentModule&return_action=DetailView&return_id=$id";//crmv@203484 changed to normal bool true, not string 'true'
else $returnset = "&return_module=$currentModule&return_action=CallRelatedList&return_id=$id";
$return_value = null;
$dependentFieldSql = $this->db->pquery("SELECT tabid, fieldname, columnname FROM ".$table_prefix."_field WHERE uitype='10' AND" .
" fieldid IN (SELECT fieldid FROM ".$table_prefix."_fieldmodulerel WHERE relmodule=? AND module=?)", array($currentModule, $related_module));
$numOfFields = $this->db->num_rows($dependentFieldSql);
if($numOfFields > 0) {
$dependentColumn = $this->db->query_result($dependentFieldSql, 0, 'columnname');
$dependentField = $this->db->query_result($dependentFieldSql, 0, 'fieldname');
$button .= '<input type="hidden" name="'.$dependentColumn.'" id="'.$dependentColumn.'" value="'.$id.'">';
$button .= '<input type="hidden" name="'.$dependentColumn.'_type" id="'.$dependentColumn.'_type" value="'.$currentModule.'">';
if($actions) {
if(is_string($actions)) $actions = explode(',', strtoupper($actions));
if(in_array('ADD', $actions) && isPermitted($related_module,1, '') == 'yes'
&& getFieldVisibilityPermission($related_module,$current_user->id,$dependentField) == '0') {
if (intval($focus->column_fields['parent_comments']) == 0) {
$button .= '<input type="hidden" name="related_to" id="related_to" value="'.$focus->column_fields['related_to'].'">';
$button .= "<input title='".getTranslatedString('LBL_ADD_NEW'). " ". getTranslatedString('LBL_MODCOMMENTS_REPLY',$related_module) ."' class='crmbutton small create'" .
" onclick='this.form.action.value=\"EditView\";this.form.module.value=\"$related_module\"' type='submit' name='button'" .
" value='". getTranslatedString('LBL_ADD_NEW'). " " . getTranslatedString('LBL_MODCOMMENTS_REPLY',$related_module) ."'>&nbsp;";
}
}
}
$query = "SELECT ".$table_prefix."_crmentity.*, $other->table_name.*";
$query .= ", CASE WHEN (".$table_prefix."_users.user_name is not null) THEN ".$table_prefix."_users.user_name ELSE ".$table_prefix."_groups.groupname END AS user_name";
$more_relation = '';
if(!empty($other->related_tables)) {
foreach($other->related_tables as $tname=>$relmap) {
$query .= ", $tname.*";
// Setup the default JOIN conditions if not specified
if(empty($relmap[1])) $relmap[1] = $other->table_name;
if(empty($relmap[2])) $relmap[2] = $relmap[0];
$more_relation .= " LEFT JOIN $tname ON $tname.$relmap[0] = $relmap[1].$relmap[2]";
}
}
$query .= " FROM $other->table_name";
$query .= " INNER JOIN ".$table_prefix."_crmentity ON ".$table_prefix."_crmentity.crmid = $other->table_name.$other->table_index";
//crmv@24527
if (!empty($other->customFieldTable)) {
$query .= " INNER JOIN ".$other->customFieldTable[0]." ON $other->table_name.$other->table_index = ".$other->customFieldTable[0].".".$other->customFieldTable[1];
}
//crmv@24527e
$query .= " INNER JOIN $this->table_name AS parent_modcomments ON parent_modcomments.$this->table_index = $other->table_name.$dependentColumn";
$query .= $more_relation;
$query .= " LEFT JOIN ".$table_prefix."_users ON ".$table_prefix."_users.id = ".$table_prefix."_crmentity.smownerid";
if (!empty($other->groupTable) ){
$query .= " LEFT JOIN ".$other->groupTable[0]."
ON ".$other->groupTable[0].".".$other->groupTable[1]." = $other->table_name.$other->table_index ";
$query .= " LEFT JOIN ".$table_prefix."_groups
ON ".$other->groupTable[0].".groupname = ".$table_prefix."_groups.groupname ";
}
else {
$query .= " LEFT JOIN ".$table_prefix."_groups ON ".$table_prefix."_groups.groupid = ".$table_prefix."_crmentity.smownerid";
}
$query .= " WHERE ".$table_prefix."_crmentity.deleted = 0 AND parent_modcomments.$this->table_index = $id";
$return_value = GetRelatedList($currentModule, $related_module, $other, $query, $button, $returnset);
}
if($return_value == null) $return_value = Array();
$return_value['CUSTOM_BUTTON'] = $button;
return $return_value;
}
}
?>