Skip to content
Snippets Groups Projects
CRMEntity.php 130 KiB
Newer Older
Prasad's avatar
Prasad committed

	/**
	 * Function which will give the basic query to find duplicates
	 * @param <String> $module
	 * @param <String> $tableColumns
	 * @param <String> $selectedColumns
	 * @param <Boolean> $ignoreEmpty
Prasad's avatar
Prasad committed
	 * @param <Array> $requiredTables
Prasad's avatar
Prasad committed
	 * @return string
	 */
	function getQueryForDuplicates($module, $tableColumns, $selectedColumns = '', $ignoreEmpty = false,$requiredTables = array(),$columnTypes = null) {
yogeshwar's avatar
yogeshwar committed
		$query='';
Prasad's avatar
Prasad committed
		if(is_array($tableColumns)) {
			$tableColumnsString = implode(',', $tableColumns);
		}
Prasad's avatar
Prasad committed
		$selectClause = "SELECT " . $this->table_name . "." . $this->table_index . " AS recordid," . $tableColumnsString;
Prasad's avatar
Prasad committed

Prasad's avatar
Prasad committed
		// Select Custom Field Table Columns if present
		if (isset($this->customFieldTable))
			$query .= ", " . $this->customFieldTable[0] . ".* ";
Prasad's avatar
Prasad committed

Prasad's avatar
Prasad committed
		$fromClause = " FROM $this->table_name";
Prasad's avatar
Prasad committed

Prasad's avatar
Prasad committed
		$fromClause .= " INNER JOIN vtiger_crmentity ON vtiger_crmentity.crmid = $this->table_name.$this->table_index";
Prasad's avatar
Prasad committed

		if($this->tab_name) {
			foreach($this->tab_name as $tableName) {
Prasad's avatar
Prasad committed
				if($tableName != 'vtiger_crmentity' && $tableName != $this->table_name && $tableName != 'vtiger_inventoryproductrel' && in_array($tableName,$requiredTables)) {
Prasad's avatar
Prasad committed
					if($this->tab_name_index[$tableName]) {
						$fromClause .= " INNER JOIN " . $tableName . " ON " . $tableName . '.' . $this->tab_name_index[$tableName] .
							" = $this->table_name.$this->table_index";
					}
				}
			}
		}

Prasad's avatar
Prasad committed
		$whereClause = " WHERE vtiger_crmentity.deleted = 0";
		$whereClause .= $this->getListViewSecurityParameter($module);
Prasad's avatar
Prasad committed

		if($ignoreEmpty) {
			foreach($tableColumns as $tableColumn){
				if ($columnTypes && ($columnTypes[$tableColumn] == "date" || $columnTypes[$tableColumn] == "datetime")) {
					$whereClause .= " AND ($tableColumn IS NOT NULL) ";	
				} else {
					$whereClause .= " AND ($tableColumn IS NOT NULL AND $tableColumn != '') ";
				}
Prasad's avatar
Prasad committed
		if (isset($selectedColumns) && trim($selectedColumns) != '') {
			$sub_query = "SELECT $selectedColumns FROM $this->table_name AS t " .
					" INNER JOIN vtiger_crmentity AS crm ON crm.crmid = t." . $this->table_index;
			// Consider custom table join as well.
			if (isset($this->customFieldTable)) {
				$sub_query .= " LEFT JOIN " . $this->customFieldTable[0] . " tcf ON tcf." . $this->customFieldTable[1] . " = t.$this->table_index";
			}
			$sub_query .= " WHERE crm.deleted=0 GROUP BY $selectedColumns HAVING COUNT(*)>1";
		} else {
			$sub_query = "SELECT $tableColumnsString $fromClause $whereClause GROUP BY $tableColumnsString HAVING COUNT(*)>1";
		}
Prasad's avatar
Prasad committed

		$i = 1;
yogeshwar's avatar
yogeshwar committed
		$duplicateCheckClause='';
Prasad's avatar
Prasad committed
		foreach($tableColumns as $tableColumn){
			$tableInfo = explode('.', $tableColumn);
			$duplicateCheckClause .= " ifnull($tableColumn,'null') = ifnull(temp.$tableInfo[1],'null')";
			if (php7_count($tableColumns) != $i++) $duplicateCheckClause .= " AND ";
Prasad's avatar
Prasad committed
		$query = $selectClause . $fromClause .
				" LEFT JOIN vtiger_users_last_import ON vtiger_users_last_import.bean_id=" . $this->table_name . "." . $this->table_index .
				" INNER JOIN (" . $sub_query . ") AS temp ON " . $duplicateCheckClause .
				$whereClause .
				" ORDER BY $tableColumnsString," . $this->table_name . "." . $this->table_index . " ASC";
		return $query;
	}

	/**
	 * Function to get relation query for get_activities
	 */
	function get_activities($id, $cur_tab_id, $rel_tab_id, $actions=false) {
		global $currentModule;
		$this_module = $currentModule;

		$related_module = vtlib_getModuleNameById($rel_tab_id);
		$userNameSql = getSqlForNameInDisplayFormat(array('first_name' => 'vtiger_users.first_name', 'last_name' => 'vtiger_users.last_name'), 'Users');

		$query = "SELECT CASE WHEN (vtiger_users.user_name not like '') THEN $userNameSql ELSE vtiger_groups.groupname END AS user_name,
					vtiger_crmentity.*, vtiger_activity.activitytype, vtiger_activity.subject, vtiger_activity.date_start, vtiger_activity.time_start,
					vtiger_activity.recurringtype, vtiger_activity.due_date, vtiger_activity.time_end, vtiger_activity.visibility, vtiger_seactivityrel.crmid AS parent_id,
					CASE WHEN (vtiger_activity.activitytype = 'Task') THEN (vtiger_activity.status) ELSE (vtiger_activity.eventstatus) END AS status
					FROM vtiger_activity
					INNER JOIN vtiger_crmentity ON vtiger_crmentity.crmid = vtiger_activity.activityid
					LEFT JOIN vtiger_seactivityrel ON vtiger_seactivityrel.activityid = vtiger_activity.activityid
					LEFT JOIN vtiger_cntactivityrel ON vtiger_cntactivityrel.activityid = vtiger_activity.activityid
					LEFT JOIN vtiger_users ON vtiger_users.id = vtiger_crmentity.smownerid
					LEFT JOIN vtiger_groups ON vtiger_groups.groupid = vtiger_crmentity.smownerid
						WHERE vtiger_crmentity.deleted = 0 AND vtiger_activity.activitytype <> 'Emails'
							AND vtiger_seactivityrel.crmid = ".$id;

		$return_value = GetRelatedList($this_module, $related_module, '', $query, '', '');
		if($return_value == null) $return_value = Array();
		return $return_value;
	}

	function get_comments($relatedRecordId = false) {
		$current_user = vglobal('current_user');
		$moduleName = $this->moduleName;
		if($moduleName != 'ModComments') {
			return false;
		}
		$queryGenerator = new EnhancedQueryGenerator($moduleName, $current_user);
		if(is_object($this->column_fields)) {
			$fields = $this->column_fields->getColumnFieldNames();
		} else if(is_array($this->column_fields)) {
			$fields = array_keys($this->column_fields);
		}
		array_push($fields, 'id');
		$queryGenerator->setFields($fields);
		$query = $queryGenerator->getQuery();
		if($relatedRecordId){
			$query .= " AND related_to = ".$relatedRecordId." ORDER BY vtiger_crmentity.createdtime DESC";
		}
		return $query;
	}
Prasad's avatar
Prasad committed
}
Prasad's avatar
Prasad committed

Prasad's avatar
Prasad committed
#[\AllowDynamicProperties]
Prasad's avatar
Prasad committed
class TrackableObject implements ArrayAccess, IteratorAggregate {
	private $storage;
	private $trackingEnabled = true;
its4you's avatar
its4you committed
	private $tracking;
	
Prasad's avatar
Prasad committed
	function __construct($value = array()) {
		$this->storage = $value;
	}

Prasad's avatar
Prasad committed
	function offsetExists($key) {
		return isset($this->storage[$key]) || array_key_exists($key, $this->storage);
Prasad's avatar
Prasad committed
	}

Prasad's avatar
Prasad committed
	function offsetSet($key, $value) {
yogeshwar's avatar
yogeshwar committed
		if(is_array($value)) $value = empty($value) ? "" : (array_key_exists(0, $value) ? $value[0] : ""); //it is an associative (if array without a key 0) modified to prevent warning of Undefined array key 0 .
Prasad's avatar
Prasad committed
		if($this->tracking && $this->trackingEnabled) {
			$olderValue = $this->offsetGet($key);
			// decode_html only expects string
			$olderValue = is_string($olderValue) ? decode_html($olderValue) : $olderValue ;
			//same logic is used in vtEntityDelta to check for delta
			if((empty($olderValue) && !empty($value)) || ($olderValue !== $value)) {
Prasad's avatar
Prasad committed
				$this->changed[] = $key;
			}
		}
		$this->storage[$key] = $value;
	}

Prasad's avatar
Prasad committed
	public function offsetUnset($key) {
		unset($this->storage[$key]);
	}

Prasad's avatar
Prasad committed
	public function offsetGet($key) {
		return isset($this->storage[$key]) || array_key_exists($key, $this->storage) ? $this->storage[$key] : null;
Prasad's avatar
Prasad committed
	}

Prasad's avatar
Prasad committed
	public function getIterator() {
		$iterator = new ArrayObject($this->storage);
		return $iterator->getIterator();
	}

	function getChanged() {
		return $this->changed;
	}

	function startTracking() {
		if($this->tracking && $this->trackingEnabled) return;
		$this->tracking = true;
		$this->changed = array();
	}

	function restartTracking() {
		$this->tracking = true;
		$this->startTracking();
	}

	function pauseTracking() {
		$this->tracking = false;
	}

	function resumeTracking() {
		if($this->trackingEnabled)
			$this->tracking = true;
	}

	function getColumnFields() {
		return $this->storage;
	}

	function getColumnFieldNames(){
		return array_keys($this->storage);
	}