diff --git a/oss/vtiger/trunk/data/CRMEntity.php b/oss/vtiger/trunk/data/CRMEntity.php
index 6156ce0b..d4371148 100644
--- a/oss/vtiger/trunk/data/CRMEntity.php
+++ b/oss/vtiger/trunk/data/CRMEntity.php
@@ -72,14 +72,24 @@ class CRMEntity
$this->save_module($module);
$assigntype=vtlib_purify($_REQUEST['assigntype']);
- if($module != "Calendar")
- $this->whomToSendMail($module,$this ->mode,$assigntype);
+ if(PerformancePrefs::getBoolean('NOTIFY_OWNER_EMAILS', true) === true){
+ if($module != "Calendar" && $module != "Accounts" && $module != "Contacts"){
+ $this->whomToSendMail($module,$this ->mode,$assigntype);
+ }
+ }
$this->db->completeTransaction();
$this->db->println("TRANS saveentity ends");
- // vtlib customization: Hook provide to enable generic module relation.
- if($_REQUEST['return_action'] == 'CallRelatedList') {
+ // vtlib customization: Hook provide to enable generic module relation.
+
+ // Ticket 6386 fix
+ global $singlepane_view;
+
+ if($_REQUEST['return_action'] == 'CallRelatedList' ||
+ (isset($singlepane_view) && $singlepane_view == true &&
+ $_REQUEST['return_action'] == 'DetailView' &&
+ !empty($_REQUEST['return_module']))){
$for_module = vtlib_purify($_REQUEST['return_module']);
$for_crmid = vtlib_purify($_REQUEST['return_id']);
@@ -174,7 +184,6 @@ class CRMEntity
}
$binFile = sanitizeUploadFileName($file_name, $upload_badext);
-
$current_id = $adb->getUniqueID("vtiger_crmentity");
@@ -187,7 +196,7 @@ class CRMEntity
$upload_file_path = decideFilePath();
//upload the file in server
- $upload_status = move_uploaded_file($filetmp_name,$upload_file_path.$current_id."_".urlencode($binFile));
+ $upload_status = move_uploaded_file($filetmp_name,$upload_file_path.$current_id."_".$binFile);
$save_file = 'true';
//only images are allowed for these modules
@@ -511,18 +520,11 @@ class CRMEntity
}
elseif($uitype == 5 || $uitype == 6 || $uitype ==23)
{
- if($_REQUEST['action'] == 'Import')
- {
- $fldvalue = $this->column_fields[$fieldname];
- }
- else
- {
- //Added to avoid function call getDBInsertDateValue in ajax save
- if (isset($current_user->date_format)) {
- $fldvalue = getValidDBInsertDateValue($this->column_fields[$fieldname]);
- } else {
- $fldvalue = $this->column_fields[$fieldname];
- }
+ //Added to avoid function call getDBInsertDateValue in ajax save
+ if (isset($current_user->date_format)) {
+ $fldvalue = getValidDBInsertDateValue($this->column_fields[$fieldname]);
+ } else {
+ $fldvalue = $this->column_fields[$fieldname];
}
}
elseif($uitype == 7)
@@ -755,8 +757,9 @@ $log->info("in getOldFileName ".$notesid);
foreach($this->tab_name_index as $table_name=>$index)
{
$result[$table_name] = $adb->pquery("select * from $table_name where $index=?", array($record));
- if($adb->query_result($result["vtiger_crmentity"],0,"deleted") == 1)
- die("
".$app_strings['LBL_RECORD_DELETE']." ".$app_strings['LBL_GO_BACK'].".");
+ if($adb->query_result($result["vtiger_crmentity"],0,"deleted") == 1) {
+ die("
".$app_strings['LBL_RECORD_DELETE']." ".$app_strings['LBL_GO_BACK'].".");
+ }
}
/* Prasad: Fix for ticket #4595 */
@@ -966,9 +969,10 @@ $log->info("in getOldFileName ".$notesid);
* Contributor(s): ______________________________________..
*/
function mark_deleted($id) {
+ global $current_user;
$date_var = date('Y-m-d H:i:s');
- $query = "UPDATE vtiger_crmentity set deleted=1,modifiedtime=? where crmid=?";
- $this->db->pquery($query, array($this->db->formatDate($date_var, true),$id), true,"Error marking record deleted: ");
+ $query = "UPDATE vtiger_crmentity set deleted=1,modifiedtime=?,modifiedby=? where crmid=?";
+ $this->db->pquery($query, array($this->db->formatDate($date_var, true),$current_user->id,$id), true,"Error marking record deleted: ");
}
function retrieve_by_string_fields($fields_array, $encode=true)
@@ -1036,7 +1040,7 @@ $log->info("in getOldFileName ".$notesid);
function constructCustomQueryAddendum($tablename,$module)
{
global $adb;
- $tabid=getTabid($module);
+ $tabid=getTabid($module);
$sql1 = "select columnname,fieldlabel from vtiger_field where generatedtype=2 and tabid=? and vtiger_field.presence in (0,2)";
$result = $adb->pquery($sql1, array($tabid));
$numRows = $adb->num_rows($result);
@@ -1288,10 +1292,26 @@ $log->info("in getOldFileName ".$notesid);
$this->db->println("TRANS restore starts $module");
$this->db->startTransaction();
- $this->db->pquery('UPDATE vtiger_crmentity SET deleted=0 WHERE crmid = ?', array($id));
+ $date_var = date('Y-m-d H:i:s');
+ $query = 'UPDATE vtiger_crmentity SET deleted=0,modifiedtime=?,modifiedby=? WHERE crmid = ?';
+ $this->db->pquery($query, array($this->db->formatDate($date_var, true),$current_user->id,$id),true,"Error restoring records :" );
//Restore related entities/records
$this->restoreRelatedRecords($module,$id);
+ //Event triggering code
+ require_once("include/events/include.inc");
+ global $adb;
+ $em = new VTEventsManager($adb);
+
+ // Initialize Event trigger cache
+ $em->initTriggerCache();
+
+ $this->id = $id;
+ $entityData = VTEntityData::fromCRMEntity($this);
+ //Event triggering code
+ $em->triggerEvent("vtiger.entity.afterrestore", $entityData);
+ //Event triggering code ends
+
$this->db->completeTransaction();
$this->db->println("TRANS restore ends");
}
@@ -1667,7 +1687,7 @@ $log->info("in getOldFileName ".$notesid);
vtlib_setup_modulevars($currentModule, $this);
vtlib_setup_modulevars($related_module, $other);
- $singular_modname = vtlib_toSingular($related_module);
+ $singular_modname = 'SINGLE_'.$related_module;
$button = '';
if($actions) {
@@ -1675,12 +1695,12 @@ $log->info("in getOldFileName ".$notesid);
if(in_array('SELECT', $actions) && isPermitted($related_module,4, '') == 'yes') {
$button .= " ";
+ " value='". getTranslatedString('LBL_SELECT'). " " . getTranslatedString($related_module, $related_module) ."'> ";
}
if(in_array('ADD', $actions) && isPermitted($related_module,1, '') == 'yes') {
$button .= " ";
+ " value='". getTranslatedString('LBL_ADD_NEW'). " " . getTranslatedString($singular_modname, $related_module) ."'> ";
}
}
@@ -1709,11 +1729,9 @@ $log->info("in getOldFileName ".$notesid);
$query .= " INNER JOIN vtiger_crmentityrel ON (vtiger_crmentityrel.relcrmid = vtiger_crmentity.crmid OR vtiger_crmentityrel.crmid = vtiger_crmentity.crmid)";
$query .= " LEFT JOIN $this->table_name ON $this->table_name.$this->table_index = $other->table_name.$other->table_index";
$query .= $more_relation;
- $query .= " LEFT JOIN vtiger_users ON vtiger_users.id = vtiger_crmentity.smownerid";
- $query .= " LEFT JOIN vtiger_groups ON vtiger_groups.groupid = vtiger_crmentity.smownerid";
-
+ $query .= " LEFT JOIN vtiger_users ON vtiger_users.id = vtiger_crmentity.smownerid";
+ $query .= " LEFT JOIN vtiger_groups ON vtiger_groups.groupid = vtiger_crmentity.smownerid";
$query .= " WHERE vtiger_crmentity.deleted = 0 AND (vtiger_crmentityrel.crmid = $id OR vtiger_crmentityrel.relcrmid = $id)";
-
$return_value = GetRelatedList($currentModule, $related_module, $other, $query, $button, $returnset);
if($return_value == null) $return_value = Array();
@@ -1743,7 +1761,7 @@ $log->info("in getOldFileName ".$notesid);
vtlib_setup_modulevars($currentModule, $this);
vtlib_setup_modulevars($related_module, $other);
- $singular_modname = vtlib_toSingular($related_module);
+ $singular_modname = 'SINGLE_'.$related_module;
$button = '';
@@ -1766,9 +1784,9 @@ $log->info("in getOldFileName ".$notesid);
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') {
- $button .= " ";
+ " value='". getTranslatedString('LBL_ADD_NEW'). " " . getTranslatedString($singular_modname, $related_module) ."'> ";
}
}
@@ -1880,7 +1898,7 @@ $log->info("in getOldFileName ".$notesid);
$ui10_modules_query = $adb->pquery("SELECT relmodule FROM vtiger_fieldmodulerel WHERE fieldid=?",array($field_id));
if($adb->num_rows($ui10_modules_query)>0){
- $query.= " left join vtiger_crmentity as vtiger_crmentityRel$module on vtiger_crmentityRel$module.crmid = $tab_name.$field_name and vtiger_crmentityRel$module.deleted=0";
+ $query.= " left join vtiger_crmentity as vtiger_crmentityRel$module$i on vtiger_crmentityRel$module$i.crmid = $tab_name.$field_name and vtiger_crmentityRel$module$i.deleted=0";
for($j=0;$j<$adb->num_rows($ui10_modules_query);$j++){
$rel_mod = $adb->query_result($ui10_modules_query,$j,'relmodule');
$rel_obj = CRMEntity::getInstance($rel_mod);
@@ -1888,7 +1906,7 @@ $log->info("in getOldFileName ".$notesid);
$rel_tab_name = $rel_obj->table_name;
$rel_tab_index = $rel_obj->table_index;
- $query.= " left join $rel_tab_name as ".$rel_tab_name."Rel$module on ".$rel_tab_name."Rel$module.$rel_tab_index = vtiger_crmentityRel$module.crmid";
+ $query.= " left join $rel_tab_name as ".$rel_tab_name."Rel$module on ".$rel_tab_name."Rel$module.$rel_tab_index = vtiger_crmentityRel$module$i.crmid";
}
}
}
@@ -1936,7 +1954,7 @@ $log->info("in getOldFileName ".$notesid);
$ui10_modules_query = $adb->pquery("SELECT relmodule FROM vtiger_fieldmodulerel WHERE fieldid=?",array($field_id));
if($adb->num_rows($ui10_modules_query)>0){
- $query.= " left join vtiger_crmentity as vtiger_crmentityRel$secmodule on vtiger_crmentityRel$secmodule.crmid = $tab_name.$field_name and vtiger_crmentityRel$secmodule.deleted=0";
+ $query.= " left join vtiger_crmentity as vtiger_crmentityRel$secmodule$i on vtiger_crmentityRel$secmodule$i.crmid = $tab_name.$field_name and vtiger_crmentityRel$secmodule$i.deleted=0";
for($j=0;$j<$adb->num_rows($ui10_modules_query);$j++){
$rel_mod = $adb->query_result($ui10_modules_query,$j,'relmodule');
$rel_obj = CRMEntity::getInstance($rel_mod);
@@ -1944,7 +1962,7 @@ $log->info("in getOldFileName ".$notesid);
$rel_tab_name = $rel_obj->table_name;
$rel_tab_index = $rel_obj->table_index;
- $query.= " left join $rel_tab_name as ".$rel_tab_name."Rel$secmodule on ".$rel_tab_name."Rel$secmodule.$rel_tab_index = vtiger_crmentityRel$secmodule.crmid";
+ $query.= " left join $rel_tab_name as ".$rel_tab_name."Rel$secmodule on ".$rel_tab_name."Rel$secmodule.$rel_tab_index = vtiger_crmentityRel$secmodule$i.crmid";
}
}
}
@@ -1972,7 +1990,8 @@ $log->info("in getOldFileName ".$notesid);
{
$sec_query .= " vtiger_groups.groupid in (". implode(",", $current_user_groups) .") or ";
}
- $sec_query .= " vtiger_groups.groupid in(select vtiger_tmp_read_group_sharing_per.sharedgroupid from vtiger_tmp_read_group_sharing_per where userid=".$current_user->id." and tabid=".$tabid."))) ";
+ $sec_query .= " vtiger_groups.groupid in(select vtiger_tmp_read_group_sharing_per.sharedgroupid from vtiger_tmp_read_group_sharing_per where userid=".$current_user->id." and tabid=".$tabid."))) ";
+ return $sec_query;
}
/*
@@ -1994,7 +2013,8 @@ $log->info("in getOldFileName ".$notesid);
{
$sec_query .= " vtiger_groups$module.groupid in (". implode(",", $current_user_groups) .") or ";
}
- $sec_query .= " vtiger_groups$module.groupid in(select vtiger_tmp_read_group_sharing_per.sharedgroupid from vtiger_tmp_read_group_sharing_per where userid=".$current_user->id." and tabid=".$tabid."))) ";
+ $sec_query .= " vtiger_groups$module.groupid in(select vtiger_tmp_read_group_sharing_per.sharedgroupid from vtiger_tmp_read_group_sharing_per where userid=".$current_user->id." and tabid=".$tabid."))) ";
+ return $sec_query;
}
/*
@@ -2021,17 +2041,13 @@ $log->info("in getOldFileName ".$notesid);
$condvalue = $tabname.".".$prifieldname;
}
$condition = " {$tmpname}.{$prifieldname} = {$condvalue} ";
- $entity_check_query = " {$tmpname}.{$secfieldname} IN (SELECT crmid FROM vtiger_crmentity WHERE vtiger_crmentity.deleted=0 AND vtiger_crmentity.setype='{$secmodule}')";
$condition_secmod_table = " {$table_name}.{$column_name} = {$tmpname}.{$secfieldname} ";
if($tabname=='vtiger_crmentityrel'){
- $condition = " ($condition OR {$tmpname}.{$secfieldname} = $condvalue) and";
- $entity_check_query = "({$entity_check_query} OR {$tmpname}.{$prifieldname} IN (SELECT crmid FROM vtiger_crmentity WHERE vtiger_crmentity.deleted=0 AND vtiger_crmentity.setype='{$secmodule}')) ";
- $condition_secmod_table = "({$condition_secmod_table} OR {$table_name}.{$column_name} = {$tmpname}.{$prifieldname})";
- } else {
- $condition .= " and ";
+ $condition = " ($condition OR {$tmpname}.{$secfieldname} = $condvalue) ";
+ $condition_secmod_table = "({$condition_secmod_table})";
}
- $query = " left join {$tabname} as {$tmpname} on {$condition} {$entity_check_query}";
+ $query = " left join {$tabname} as {$tmpname} on {$condition}";
$query .= " LEFT JOIN {$table_name} ON {$condition_secmod_table}";
return $query;
@@ -2158,5 +2174,216 @@ $log->info("in getOldFileName ".$notesid);
$this->__inactive_fields_filtered = true;
}
/** END **/
+
+ function buildSearchQueryForFieldTypes($uitypes, $value) {
+ global $adb;
+
+ if(!is_array($uitypes)) $uitypes = array($uitypes);
+ $module = get_class($this);
+
+ $cachedModuleFields = VTCacheUtils::lookupFieldInfo_Module($module);
+ if($cachedModuleFields === false) {
+ getColumnFields($module); // This API will initialize the cache as well
+ // We will succeed now due to above function call
+ $cachedModuleFields = VTCacheUtils::lookupFieldInfo_Module($module);
+ }
+
+ $lookuptables = array();
+ $lookupcolumns = array();
+ foreach($cachedModuleFields as $fieldinfo) {
+ if (in_array($fieldinfo['uitype'], $uitypes)) {
+ $lookuptables[] = $fieldinfo['tablename'];
+ $lookupcolumns[] = $fieldinfo['columnname'];
+ }
+ }
+
+ $entityfields = getEntityField($module);
+ $querycolumnnames = implode(',', $lookupcolumns);
+ $entitycolumnnames = $entityfields['fieldname'];
+ $query = "select crmid as id, $querycolumnnames, $entitycolumnnames as name ";
+ $query .= " FROM $this->table_name ";
+ $query .=" INNER JOIN vtiger_crmentity ON $this->table_name.$this->table_index = vtiger_crmentity.crmid AND deleted = 0 ";
+
+ //remove the base table
+ $LookupTable = array_unique($lookuptables);
+ $indexes = array_keys($LookupTable, $this->table_name);
+ if(!empty($indexes)) {
+ foreach($indexes as $index) {
+ unset($LookupTable[$index]);
+ }
+ }
+ foreach($LookupTable as $tablename) {
+ $query .= " INNER JOIN $tablename
+ on $this->table_name.$this->table_index = $tablename.".$this->tab_name_index[$tablename];
+ }
+ if(!empty($lookupcolumns)) {
+ $query .=" WHERE ";
+ $i=0;
+ $columnCount = count($lookupcolumns);
+ foreach($lookupcolumns as $columnname) {
+ if(!empty($columnname)) {
+ if($i == 0 || $i == ($columnCount))
+ $query .= sprintf("%s = '%s'", $columnname, $value);
+ else
+ $query .= sprintf(" OR %s = '%s'", $columnname, $value);
+ $i++;
+ }
+ }
+ }
+ return $query;
+ }
+
+ /**
+ *
+ * @param String $tableName
+ * @return String
+ */
+ public function getJoinClause($tableName) {
+ if(strripos($tableName, 'rel') === (strlen($tableName) - 3)) {
+ return 'LEFT JOIN';
+ } else {
+ return 'INNER JOIN';
+ }
+ }
+
+ /**
+ *
+ * @param $module
+ * @param $user
+ * @param $parentRole
+ * @param $userGroups
+ */
+ function getNonAdminAccessQuery($module,$user,$parentRole,$userGroups){
+ $query = $this->getNonAdminUserAccessQuery($user, $parentRole, $userGroups);
+ if(!empty($module)) {
+ $moduleAccessQuery = $this->getNonAdminModuleAccessQuery($module, $user);
+ if(!empty($moduleAccessQuery)) {
+ $query .= " UNION $moduleAccessQuery";
+ }
+ }
+ return $query;
+ }
+
+ /**
+ *
+ * @param $user
+ * @param $parentRole
+ * @param $userGroups
+ */
+ function getNonAdminUserAccessQuery($user,$parentRole,$userGroups){
+ $query = "(SELECT $user->id as id) UNION (SELECT vtiger_user2role.userid AS userid FROM ".
+ "vtiger_user2role INNER JOIN vtiger_users ON vtiger_users.id=vtiger_user2role.userid ".
+ "INNER JOIN vtiger_role ON vtiger_role.roleid=vtiger_user2role.roleid WHERE ".
+ "vtiger_role.parentrole like '$parentRole::%')";
+ if(count($userGroups) > 0 ) {
+ $query .= " UNION (SELECT groupid FROM vtiger_groups where".
+ " groupid in (".implode(",", $userGroups)."))";
+ }
+ return $query;
+ }
+
+ /**
+ *
+ * @param $module
+ * @param $user
+ */
+ function getNonAdminModuleAccessQuery($module,$user){
+ require('user_privileges/sharing_privileges_'.$user->id.'.php');
+ $tabId = getTabid($module);
+ $sharingRuleInfoVariable = $module.'_share_read_permission';
+ $sharingRuleInfo = $$sharingRuleInfoVariable;
+ $sharedTabId = null;
+ $query = '';
+ if(!empty($sharingRuleInfo) && (count($sharingRuleInfo['ROLE']) > 0 ||
+ count($sharingRuleInfo['GROUP']) > 0)) {
+ $query = " (SELECT shareduserid FROM vtiger_tmp_read_user_sharing_per ".
+ "WHERE userid=$user->id AND tabid=$tabId) UNION (SELECT ".
+ "vtiger_tmp_read_group_sharing_per.sharedgroupid FROM ".
+ "vtiger_tmp_read_group_sharing_per WHERE userid=$user->id AND tabid=$tabId)";
+ }
+ return $query;
+ }
+
+ /**
+ *
+ * @param $module
+ * @param $user
+ * @param $parentRole
+ * @param $userGroups
+ */
+ protected function setupTemporaryTable($tableName,$tabId, $user,$parentRole,$userGroups) {
+ $module = null;
+ if (!empty($tabId)) {
+ $module = getTabModuleName($tabId);
+ }
+ $query = $this->getNonAdminAccessQuery($module, $user, $parentRole, $userGroups);
+ $query = "create temporary table IF NOT EXISTS $tableName(id int(11) primary key) ignore ".
+ $query;
+ $db = PearDatabase::getInstance();
+ $result = $db->pquery($query, array());
+ if(is_object($result)) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ *
+ * @param String $module - module name for which query needs to be generated.
+ * @param Users $user - user for which query needs to be generated.
+ * @return String Access control Query for the user.
+ */
+ function getNonAdminAccessControlQuery($module,$user,$scope=''){
+ require('user_privileges/user_privileges_'.$user->id.'.php');
+ require('user_privileges/sharing_privileges_'.$user->id.'.php');
+ $query = ' ';
+ $tabId = getTabid($module);
+ if($is_admin==false && $profileGlobalPermission[1] == 1 && $profileGlobalPermission[2]
+ == 1 && $defaultOrgSharingPermission[$tabId] == 3) {
+ $tableName = 'vt_tmp_u'.$user->id;
+ $sharingRuleInfoVariable = $module.'_share_read_permission';
+ $sharingRuleInfo = $$sharingRuleInfoVariable;
+ $sharedTabId = null;
+ if(!empty($sharingRuleInfo) && (count($sharingRuleInfo['ROLE']) > 0 ||
+ count($sharingRuleInfo['GROUP']) > 0)) {
+ $tableName = $tableName.'_t'.$tabId;
+ $sharedTabId = $tabId;
+ }elseif($module == 'Calendar' || !empty($scope)) {
+ $tableName .= '_t'.$tabId;
+ }
+ $this->setupTemporaryTable($tableName, $sharedTabId, $user,
+ $current_user_parent_role_seq, $current_user_groups);
+ $query = " INNER JOIN $tableName $tableName$scope ON $tableName$scope.id = ".
+ "vtiger_crmentity$scope.smownerid ";
+ }
+ return $query;
+ }
+
+ public function listQueryNonAdminChange( $query, $scope='' ) {
+ //make the module base table as left hand side table for the joins,
+ //as mysql query optimizer puts crmentity on the left side and considerably slow down
+ $query = preg_replace('/\s+/', ' ', $query);
+ if(strripos($query, ' WHERE ') !== false) {
+ vtlib_setup_modulevars($module, $this);
+ $query = str_ireplace(' where ', " WHERE $this->table_name.$this->table_index > 0 AND ",
+ $query);
+ }
+ return $query;
+ }
+
+ /*
+ * Function to get the relation tables for related modules
+ * @param String $secmodule - $secmodule secondary module name
+ * @return Array returns the array with table names and fieldnames storing relations
+ * between module and this module
+ */
+ function setRelationTables($secmodule){
+ $rel_tables = array (
+ "Documents" => array("vtiger_senotesrel"=>array("crmid","notesid"),
+ $this->table_name=>$this->table_index),
+ );
+ return $rel_tables[$secmodule];
+ }
+
}
?>