PageRenderTime 21ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/modules/Vtiger/models/Relation.php

https://bitbucket.org/thomashii/vtigercrm-6-for-postgresql
PHP | 278 lines | 201 code | 39 blank | 38 comment | 20 complexity | e44ed66599b5dacfe93b177eb6b45cb1 MD5 | raw file
Possible License(s): Apache-2.0, LGPL-3.0, LGPL-2.1, GPL-2.0, GPL-3.0
  1. <?php
  2. /*+***********************************************************************************
  3. * The contents of this file are subject to the vtiger CRM Public License Version 1.0
  4. * ("License"); You may not use this file except in compliance with the License
  5. * The Original Code is: vtiger CRM Open Source
  6. * The Initial Developer of the Original Code is vtiger.
  7. * Portions created by vtiger are Copyright (C) vtiger.
  8. * All Rights Reserved.
  9. *************************************************************************************/
  10. class Vtiger_Relation_Model extends Vtiger_Base_Model{
  11. protected $parentModule = false;
  12. protected $relatedModule = false;
  13. protected $relationType = false;
  14. //one to many
  15. const RELATION_DIRECT = 1;
  16. //Many to many and many to one
  17. const RELATION_INDIRECT = 2;
  18. /**
  19. * Function returns the relation id
  20. * @return <Integer>
  21. */
  22. public function getId(){
  23. return $this->get('relation_id');
  24. }
  25. /**
  26. * Function sets the relation's parent module model
  27. * @param <Vtiger_Module_Model> $moduleModel
  28. * @return Vtiger_Relation_Model
  29. */
  30. public function setParetModuleModel($moduleModel){
  31. $this->parentModule = $moduleModel;
  32. return $this;
  33. }
  34. /**
  35. * Function that returns the relation's parent module model
  36. * @return <Vtiger_Module_Model>
  37. */
  38. public function getParentModuleModel(){
  39. if(empty($this->parentModule)){
  40. $this->parentModule = Vtiger_Module_Model::getInstance($this->get('tabid'));
  41. }
  42. return $this->parentModule;
  43. }
  44. public function getRelationModuleModel(){
  45. if(empty($this->relatedModule)){
  46. $this->relatedModule = Vtiger_Module_Model::getInstance($this->get('related_tabid'));
  47. }
  48. return $this->relatedModule;
  49. }
  50. public function getRelationModuleName() {
  51. $relationModuleName = $this->get('relatedModuleName');
  52. if(!empty($relationModuleName)) {
  53. return $relationModuleName;
  54. }
  55. return $this->getRelationModuleModel()->getName();
  56. }
  57. public function getListUrl($parentRecordModel) {
  58. return 'module='.$this->getParentModuleModel()->get('name').'&relatedModule='.$this->get('modulename').
  59. '&view=Detail&record='.$parentRecordModel->getId().'&mode=showRelatedList';
  60. }
  61. public function setRelationModuleModel($relationModel){
  62. $this->relatedModule = $relationModel;
  63. return $this;
  64. }
  65. public function isActionSupported($actionName){
  66. $actionName = strtolower($actionName);
  67. $actions = $this->getActions();
  68. foreach($actions as $action) {
  69. if(strcmp(strtolower($action), $actionName)== 0){
  70. return true;
  71. }
  72. }
  73. return false;
  74. }
  75. public function isSelectActionSupported() {
  76. return $this->isActionSupported('select');
  77. }
  78. public function isAddActionSupported() {
  79. return $this->isActionSupported('add');
  80. }
  81. public function getActions(){
  82. $actionString = $this->get('actions');
  83. $label = $this->get('label');
  84. // No actions for Activity history
  85. if($label == 'Activity History') {
  86. return array();
  87. }
  88. return explode(',', $actionString);
  89. }
  90. public function getQuery($parentRecord, $actions=false){
  91. $parentModuleModel = $this->getParentModuleModel();
  92. $relatedModuleModel = $this->getRelationModuleModel();
  93. $parentModuleName = $parentModuleModel->getName();
  94. $relatedModuleName = $relatedModuleModel->getName();
  95. $functionName = $this->get('name');
  96. $query = $parentModuleModel->getRelationQuery($parentRecord->getId(), $functionName, $relatedModuleModel);
  97. return $query;
  98. }
  99. public function addRelation($sourcerecordId, $destinationRecordId) {
  100. $sourceModule = $this->getParentModuleModel();
  101. $sourceModuleName = $sourceModule->get('name');
  102. $sourceModuleFocus = CRMEntity::getInstance($sourceModuleName);
  103. $destinationModuleName = $this->getRelationModuleModel()->get('name');
  104. relateEntities($sourceModuleFocus, $sourceModuleName, $sourcerecordId, $destinationModuleName, $destinationRecordId);
  105. }
  106. public function deleteRelation($sourceRecordId, $relatedRecordId){
  107. $sourceModule = $this->getParentModuleModel();
  108. $sourceModuleName = $sourceModule->get('name');
  109. $destinationModuleName = $this->getRelationModuleModel()->get('name');
  110. $destinationModuleFocus = CRMEntity::getInstance($destinationModuleName);
  111. DeleteEntity($destinationModuleName, $sourceModuleName, $destinationModuleFocus, $relatedRecordId, $sourceRecordId);
  112. return true;
  113. }
  114. public function isDirectRelation() {
  115. return ($this->getRelationType() == self::RELATION_DIRECT);
  116. }
  117. public function getRelationType(){
  118. if(empty($this->relationType)){
  119. $this->relationType = self::RELATION_INDIRECT;
  120. if ($this->getRelationField()) {
  121. $this->relationType = self::RELATION_DIRECT;
  122. }
  123. }
  124. return $this->relationType;
  125. }
  126. /**
  127. * Function which will specify whether the relation is editable
  128. * @return <Boolean>
  129. */
  130. public function isEditable() {
  131. return $this->getRelationModuleModel()->isPermitted('EditView');
  132. }
  133. /**
  134. * Function which will specify whether the relation is deletable
  135. * @return <Boolean>
  136. */
  137. public function isDeletable() {
  138. return $this->getRelationModuleModel()->isPermitted('Delete');
  139. }
  140. public static function getInstance($parentModuleModel, $relatedModuleModel, $label=false) {
  141. $db = PearDatabase::getInstance();
  142. $query = 'SELECT vtiger_relatedlists.*,vtiger_tab.name as modulename FROM vtiger_relatedlists
  143. INNER JOIN vtiger_tab on vtiger_tab.tabid = vtiger_relatedlists.related_tabid AND vtiger_tab.presence != 1
  144. WHERE vtiger_relatedlists.tabid = ? AND related_tabid = ?';
  145. $params = array($parentModuleModel->getId(), $relatedModuleModel->getId());
  146. if(!empty($label)) {
  147. $query .= ' AND label = ?';
  148. $params[] = $label;
  149. }
  150. $result = $db->pquery($query, $params);
  151. if($db->num_rows($result)) {
  152. $row = $db->query_result_rowdata($result, 0);
  153. $relationModelClassName = Vtiger_Loader::getComponentClassName('Model', 'Relation', $parentModuleModel->get('name'));
  154. $relationModel = new $relationModelClassName();
  155. $relationModel->setData($row)->setParetModuleModel($parentModuleModel)->setRelationModuleModel($relatedModuleModel);
  156. return $relationModel;
  157. }
  158. return false;
  159. }
  160. public static function getAllRelations($parentModuleModel, $selected = true, $onlyActive = true) {
  161. $db = PearDatabase::getInstance();
  162. $skipReltionsList = array('get_history');
  163. $query = 'SELECT vtiger_relatedlists.*,vtiger_tab.name as modulename FROM vtiger_relatedlists
  164. INNER JOIN vtiger_tab on vtiger_relatedlists.related_tabid = vtiger_tab.tabid
  165. WHERE vtiger_relatedlists.tabid = ? AND related_tabid != 0';
  166. if ($selected) {
  167. $query .= ' AND vtiger_relatedlists.presence <> 1';
  168. }
  169. if($onlyActive){
  170. $query .= ' AND vtiger_tab.presence <> 1 ';
  171. }
  172. $query .= ' AND vtiger_relatedlists.name NOT IN ('.generateQuestionMarks($skipReltionsList).') ORDER BY sequence'; // TODO: Need to handle entries that has related_tabid 0
  173. $result = $db->pquery($query, array($parentModuleModel->getId(), $skipReltionsList));
  174. $relationModels = array();
  175. $relationModelClassName = Vtiger_Loader::getComponentClassName('Model', 'Relation', $parentModuleModel->get('name'));
  176. for($i=0; $i<$db->num_rows($result); $i++) {
  177. $row = $db->query_result_rowdata($result, $i);
  178. //$relationModuleModel = Vtiger_Module_Model::getCleanInstance($moduleName);
  179. // Skip relation where target module does not exits or is no permitted for view.
  180. if (!Users_Privileges_Model::isPermitted($row['modulename'],'DetailView')) {
  181. continue;
  182. }
  183. $relationModel = new $relationModelClassName();
  184. $relationModel->setData($row)->setParetModuleModel($parentModuleModel)->set('relatedModuleName',$row['modulename']);
  185. $relationModels[] = $relationModel;
  186. }
  187. return $relationModels;
  188. }
  189. /**
  190. * Function to get relation field for relation module and parent module
  191. * @return Vtiger_Field_Model
  192. */
  193. public function getRelationField() {
  194. $relationField = $this->get('relationField');
  195. if (!$relationField) {
  196. $relationField = false;
  197. $relatedModel = $this->getRelationModuleModel();
  198. $parentModule = $this->getParentModuleModel();
  199. $relatedModelFields = $relatedModel->getFields();
  200. foreach($relatedModelFields as $fieldName => $fieldModel) {
  201. if($fieldModel->getFieldDataType() == Vtiger_Field_Model::REFERENCE_TYPE) {
  202. $referenceList = $fieldModel->getReferenceList();
  203. if(in_array($parentModule->getName(), $referenceList)) {
  204. $this->set('relationField', $fieldModel);
  205. $relationField = $fieldModel;
  206. break;
  207. }
  208. }
  209. }
  210. }
  211. return $relationField;
  212. }
  213. public static function updateRelationSequenceAndPresence($relatedInfoList, $sourceModuleTabId) {
  214. $db = PearDatabase::getInstance();
  215. $query = 'UPDATE vtiger_relatedlists SET sequence=CASE ';
  216. $relation_ids = array();
  217. foreach($relatedInfoList as $relatedInfo){
  218. $relation_id = $relatedInfo['relation_id'];
  219. $relation_ids[] = $relation_id;
  220. $sequence = $relatedInfo['sequence'];
  221. $presence = $relatedInfo['presence'];
  222. $query .= ' WHEN relation_id='.$relation_id.' THEN '.$sequence;
  223. }
  224. $query.= ' END , ';
  225. $query.= ' presence = CASE ';
  226. foreach($relatedInfoList as $relatedInfo){
  227. $relation_id = $relatedInfo['relation_id'];
  228. $relation_ids[] = $relation_id;
  229. $sequence = $relatedInfo['sequence'];
  230. $presence = $relatedInfo['presence'];
  231. $query .= ' WHEN relation_id='.$relation_id.' THEN '.$presence;
  232. }
  233. $query .= ' END WHERE tabid=? AND relation_id IN ('. generateQuestionMarks($relation_ids).')';
  234. $result = $db->pquery($query, array($sourceModuleTabId,$relation_ids));
  235. }
  236. public function isActive() {
  237. return $this->get('presence') == 0 ? true : false;
  238. }
  239. }