PageRenderTime 50ms CodeModel.GetById 20ms RepoModel.GetById 1ms app.codeStats 0ms

/modules/Documents/Documents.php

https://bitbucket.org/yousef_fadila/vtiger
PHP | 480 lines | 342 code | 55 blank | 83 comment | 64 complexity | 60d7b6b8dcde670a9a35850dba93913f MD5 | raw file
Possible License(s): LGPL-2.1, GPL-2.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. include_once('config.php');
  11. require_once('include/logging.php');
  12. require_once('include/database/PearDatabase.php');
  13. require_once('data/CRMEntity.php');
  14. require_once('include/upload_file.php');
  15. // Note is used to store customer information.
  16. class Documents extends CRMEntity {
  17. var $log;
  18. var $db;
  19. var $table_name = "vtiger_notes";
  20. var $table_index= 'notesid';
  21. var $default_note_name_dom = array('Meeting vtiger_notes', 'Reminder');
  22. var $tab_name = Array('vtiger_crmentity','vtiger_notes');
  23. var $tab_name_index = Array('vtiger_crmentity'=>'crmid','vtiger_notes'=>'notesid','vtiger_senotesrel'=>'notesid');
  24. var $column_fields = Array();
  25. var $sortby_fields = Array('title','modifiedtime','filename','createdtime','lastname','filedownloadcount','smownerid');
  26. // This is used to retrieve related vtiger_fields from form posts.
  27. var $additional_column_fields = Array('', '', '', '');
  28. // This is the list of vtiger_fields that are in the lists.
  29. var $list_fields = Array(
  30. 'Title'=>Array('notes'=>'title'),
  31. 'File Name'=>Array('notes'=>'filename'),
  32. 'Modified Time'=>Array('crmentity'=>'modifiedtime'),
  33. 'Assigned To' => Array('crmentity'=>'smownerid'),
  34. 'Folder Name' => Array('attachmentsfolder'=>'foldername')
  35. );
  36. var $list_fields_name = Array(
  37. 'Title'=>'notes_title',
  38. 'File Name'=>'filename',
  39. 'Modified Time'=>'modifiedtime',
  40. 'Assigned To'=>'assigned_user_id',
  41. 'Folder Name' => 'folderid'
  42. );
  43. var $search_fields = Array(
  44. 'Title' => Array('notes'=>'notes_title'),
  45. 'File Name' => Array('notes'=>'filename'),
  46. 'Assigned To' => Array('crmentity'=>'smownerid'),
  47. 'Folder Name' => Array('attachmentsfolder'=>'foldername')
  48. );
  49. var $search_fields_name = Array(
  50. 'Title' => 'notes_title',
  51. 'File Name' => 'filename',
  52. 'Assigned To' => 'assigned_user_id',
  53. 'Folder Name' => 'folderid'
  54. );
  55. var $list_link_field= 'notes_title';
  56. var $old_filename = '';
  57. //var $groupTable = Array('vtiger_notegrouprelation','notesid');
  58. var $mandatory_fields = Array('notes_title','createdtime' ,'modifiedtime','filename','filesize','filetype','filedownloadcount','assigned_user_id');
  59. //Added these variables which are used as default order by and sortorder in ListView
  60. var $default_order_by = 'title';
  61. var $default_sort_order = 'ASC';
  62. function Documents() {
  63. $this->log = LoggerManager::getLogger('notes');
  64. $this->log->debug("Entering Documents() method ...");
  65. $this->db = PearDatabase::getInstance();
  66. $this->column_fields = getColumnFields('Documents');
  67. $this->log->debug("Exiting Documents method ...");
  68. }
  69. function save_module($module)
  70. {
  71. global $log,$adb,$upload_badext;
  72. $insertion_mode = $this->mode;
  73. if(isset($this->parentid) && $this->parentid != '')
  74. $relid = $this->parentid;
  75. //inserting into vtiger_senotesrel
  76. if(isset($relid) && $relid != '')
  77. {
  78. $this->insertintonotesrel($relid,$this->id);
  79. }
  80. $filetype_fieldname = $this->getFileTypeFieldName();
  81. $filename_fieldname = $this->getFile_FieldName();
  82. if($this->column_fields[$filetype_fieldname] == 'I' ){
  83. if($_FILES[$filename_fieldname]['name'] != ''){
  84. $errCode=$_FILES[$filename_fieldname]['error'];
  85. if($errCode == 0){
  86. foreach($_FILES as $fileindex => $files)
  87. {
  88. if($files['name'] != '' && $files['size'] > 0){
  89. $filename = $_FILES[$filename_fieldname]['name'];
  90. $filename = from_html(preg_replace('/\s+/', '_', $filename));
  91. $filetype = $_FILES[$filename_fieldname]['type'];
  92. $filesize = $_FILES[$filename_fieldname]['size'];
  93. $filelocationtype = 'I';
  94. $binFile = sanitizeUploadFileName($filename, $upload_badext);
  95. $filename = ltrim(basename(" ".$binFile)); //allowed filename like UTF-8 characters
  96. }
  97. }
  98. }
  99. }elseif($this->mode == 'edit') {
  100. $fileres = $adb->pquery("select filetype, filesize,filename,filedownloadcount,filelocationtype from vtiger_notes where notesid=?", array($this->id));
  101. if ($adb->num_rows($fileres) > 0) {
  102. $filename = $adb->query_result($fileres, 0, 'filename');
  103. $filetype = $adb->query_result($fileres, 0, 'filetype');
  104. $filesize = $adb->query_result($fileres, 0, 'filesize');
  105. $filedownloadcount = $adb->query_result($fileres, 0, 'filedownloadcount');
  106. $filelocationtype = $adb->query_result($fileres, 0, 'filelocationtype');
  107. }
  108. }elseif($this->column_fields[$filename_fieldname]) {
  109. $filename = $this->column_fields[$filename_fieldname];
  110. $filesize = $this->column_fields['filesize'];
  111. $filetype = $this->column_fields['filetype'];
  112. $filelocationtype = $this->column_fields[$filetype_fieldname];
  113. $filedownloadcount = 0;
  114. } else {
  115. $filelocationtype = 'I';
  116. $filetype = '';
  117. $filesize = 0;
  118. $filedownloadcount = null;
  119. }
  120. } else if($this->column_fields[$filetype_fieldname] == 'E' ){
  121. $filelocationtype = 'E';
  122. $filename = $this->column_fields[$filename_fieldname];
  123. // If filename does not has the protocol prefix, default it to http://
  124. // Protocol prefix could be like (https://, smb://, file://, \\, smb:\\,...)
  125. if(!empty($filename) && !preg_match('/^\w{1,5}:\/\/|^\w{0,3}:?\\\\\\\\/', trim($filename), $match)) {
  126. $filename = "http://$filename";
  127. }
  128. $filetype = '';
  129. $filesize = 0;
  130. $filedownloadcount = null;
  131. }
  132. $query = "UPDATE vtiger_notes SET filename = ? ,filesize = ?, filetype = ? , filelocationtype = ? , filedownloadcount = ? WHERE notesid = ?";
  133. $re=$adb->pquery($query,array($filename,$filesize,$filetype,$filelocationtype,$filedownloadcount,$this->id));
  134. //Inserting into attachments table
  135. if($filelocationtype == 'I') {
  136. $this->insertIntoAttachment($this->id,'Documents');
  137. }else{
  138. $query = "delete from vtiger_seattachmentsrel where crmid = ?";
  139. $qparams = array($this->id);
  140. $adb->pquery($query, $qparams);
  141. }
  142. }
  143. /**
  144. * This function is used to add the vtiger_attachments. This will call the function uploadAndSaveFile which will upload the attachment into the server and save that attachment information in the database.
  145. * @param int $id - entity id to which the vtiger_files to be uploaded
  146. * @param string $module - the current module name
  147. */
  148. function insertIntoAttachment($id,$module)
  149. {
  150. global $log, $adb;
  151. $log->debug("Entering into insertIntoAttachment($id,$module) method.");
  152. $file_saved = false;
  153. foreach($_FILES as $fileindex => $files)
  154. {
  155. if($files['name'] != '' && $files['size'] > 0)
  156. {
  157. $files['original_name'] = vtlib_purify($_REQUEST[$fileindex.'_hidden']);
  158. $file_saved = $this->uploadAndSaveFile($id,$module,$files);
  159. }
  160. }
  161. $log->debug("Exiting from insertIntoAttachment($id,$module) method.");
  162. }
  163. /** Function used to get the sort order for Documents listview
  164. * @return string $sorder - first check the $_REQUEST['sorder'] if request value is empty then check in the $_SESSION['NOTES_SORT_ORDER'] if this session value is empty then default sort order will be returned.
  165. */
  166. function getSortOrder()
  167. {
  168. global $log;
  169. $log->debug("Entering getSortOrder() method ...");
  170. if(isset($_REQUEST['sorder']))
  171. $sorder = $this->db->sql_escape_string($_REQUEST['sorder']);
  172. else
  173. $sorder = (($_SESSION['NOTES_SORT_ORDER'] != '')?($_SESSION['NOTES_SORT_ORDER']):($this->default_sort_order));
  174. $log->debug("Exiting getSortOrder() method ...");
  175. return $sorder;
  176. }
  177. /** Function used to get the order by value for Documents listview
  178. * @return string $order_by - first check the $_REQUEST['order_by'] if request value is empty then check in the $_SESSION['NOTES_ORDER_BY'] if this session value is empty then default order by will be returned.
  179. */
  180. function getOrderBy()
  181. {
  182. global $log;
  183. $log->debug("Entering getOrderBy() method ...");
  184. $use_default_order_by = '';
  185. if(PerformancePrefs::getBoolean('LISTVIEW_DEFAULT_SORTING', true)) {
  186. $use_default_order_by = $this->default_order_by;
  187. }
  188. if (isset($_REQUEST['order_by']))
  189. $order_by = $this->db->sql_escape_string($_REQUEST['order_by']);
  190. else
  191. $order_by = (($_SESSION['NOTES_ORDER_BY'] != '')?($_SESSION['NOTES_ORDER_BY']):($use_default_order_by));
  192. $log->debug("Exiting getOrderBy method ...");
  193. return $order_by;
  194. }
  195. /**
  196. * Function used to get the sort order for Documents listview
  197. * @return String $sorder - sort order for a given folder.
  198. */
  199. function getSortOrderForFolder($folderId) {
  200. if(isset($_REQUEST['sorder']) && $_REQUEST['folderid'] == $folderId) {
  201. $sorder = $this->db->sql_escape_string($_REQUEST['sorder']);
  202. } elseif(is_array($_SESSION['NOTES_FOLDER_SORT_ORDER']) &&
  203. !empty($_SESSION['NOTES_FOLDER_SORT_ORDER'][$folderId])) {
  204. $sorder = $_SESSION['NOTES_FOLDER_SORT_ORDER'][$folderId];
  205. } else {
  206. $sorder = $this->default_sort_order;
  207. }
  208. return $sorder;
  209. }
  210. /**
  211. * Function used to get the order by value for Documents listview
  212. * @return String order by column for a given folder.
  213. */
  214. function getOrderByForFolder($folderId) {
  215. $use_default_order_by = '';
  216. if(PerformancePrefs::getBoolean('LISTVIEW_DEFAULT_SORTING', true)) {
  217. $use_default_order_by = $this->default_order_by;
  218. }
  219. if (isset($_REQUEST['order_by']) && $_REQUEST['folderid'] == $folderId) {
  220. $order_by = $this->db->sql_escape_string($_REQUEST['order_by']);
  221. } elseif(is_array($_SESSION['NOTES_FOLDER_ORDER_BY']) &&
  222. !empty($_SESSION['NOTES_FOLDER_ORDER_BY'][$folderId])) {
  223. $order_by = $_SESSION['NOTES_FOLDER_ORDER_BY'][$folderId];
  224. } else {
  225. $order_by = ($use_default_order_by);
  226. }
  227. return $order_by;
  228. }
  229. /** Function to export the notes in CSV Format
  230. * @param reference variable - where condition is passed when the query is executed
  231. * Returns Export Documents Query.
  232. */
  233. function create_export_query($where)
  234. {
  235. global $log,$current_user;
  236. $log->debug("Entering create_export_query(". $where.") method ...");
  237. include("include/utils/ExportUtils.php");
  238. //To get the Permitted fields query and the permitted fields list
  239. $sql = getPermittedFieldsQuery("Documents", "detail_view");
  240. $fields_list = getFieldsListFromQuery($sql);
  241. $userNameSql = getSqlForNameInDisplayFormat(array('first_name'=>
  242. 'vtiger_users.first_name', 'last_name' => 'vtiger_users.last_name'), 'Users');
  243. $query = "SELECT $fields_list, case when (vtiger_users.user_name not like '') then $userNameSql else vtiger_groups.groupname end as user_name" .
  244. " FROM vtiger_notes
  245. inner join vtiger_crmentity
  246. on vtiger_crmentity.crmid=vtiger_notes.notesid
  247. LEFT JOIN vtiger_attachmentsfolder on vtiger_notes.folderid=vtiger_attachmentsfolder.folderid
  248. LEFT JOIN vtiger_users ON vtiger_crmentity.smownerid=vtiger_users.id " .
  249. " LEFT JOIN vtiger_groups ON vtiger_crmentity.smownerid=vtiger_groups.groupid "
  250. ;
  251. $query .= getNonAdminAccessControlQuery('Documents',$current_user);
  252. $where_auto=" vtiger_crmentity.deleted=0";
  253. if($where != "")
  254. $query .= " WHERE ($where) AND ".$where_auto;
  255. else
  256. $query .= " WHERE ".$where_auto;
  257. $log->debug("Exiting create_export_query method ...");
  258. return $query;
  259. }
  260. function del_create_def_folder($query)
  261. {
  262. global $adb;
  263. $dbQuery = $query." and vtiger_attachmentsfolder.folderid = 0";
  264. $dbresult = $adb->pquery($dbQuery,array());
  265. $noofnotes = $adb->num_rows($dbresult);
  266. if($noofnotes > 0)
  267. {
  268. $folderQuery = "select folderid from vtiger_attachmentsfolder";
  269. $folderresult = $adb->pquery($folderQuery,array());
  270. $noofdeffolders = $adb->num_rows($folderresult);
  271. if($noofdeffolders == 0)
  272. {
  273. $insertQuery = "insert into vtiger_attachmentsfolder values (0,'Default','Contains all attachments for which a folder is not set',1,0)";
  274. $insertresult = $adb->pquery($insertQuery,array());
  275. }
  276. }
  277. }
  278. function insertintonotesrel($relid,$id)
  279. {
  280. global $adb;
  281. $dbQuery = "insert into vtiger_senotesrel values ( ?, ? )";
  282. $dbresult = $adb->pquery($dbQuery,array($relid,$id));
  283. }
  284. /*function save_related_module($module, $crmid, $with_module, $with_crmid){
  285. }*/
  286. /*
  287. * Function to get the primary query part of a report
  288. * @param - $module Primary module name
  289. * returns the query string formed on fetching the related data for report for primary module
  290. */
  291. function generateReportsQuery($module){
  292. $moduletable = $this->table_name;
  293. $moduleindex = $this->tab_name_index[$moduletable];
  294. $query = "from $moduletable
  295. inner join vtiger_crmentity on vtiger_crmentity.crmid=$moduletable.$moduleindex
  296. inner join vtiger_attachmentsfolder on vtiger_attachmentsfolder.folderid=$moduletable.folderid
  297. left join vtiger_groups as vtiger_groups".$module." on vtiger_groups".$module.".groupid = vtiger_crmentity.smownerid
  298. left join vtiger_users as vtiger_users".$module." on vtiger_users".$module.".id = vtiger_crmentity.smownerid
  299. left join vtiger_groups on vtiger_groups.groupid = vtiger_crmentity.smownerid
  300. left join vtiger_users on vtiger_users.id = vtiger_crmentity.smownerid
  301. left join vtiger_users as vtiger_lastModifiedBy".$module." on vtiger_lastModifiedBy".$module.".id = vtiger_crmentity.modifiedby ";
  302. return $query;
  303. }
  304. /*
  305. * Function to get the secondary query part of a report
  306. * @param - $module primary module name
  307. * @param - $secmodule secondary module name
  308. * returns the query string formed on fetching the related data for report for secondary module
  309. */
  310. function generateReportsSecQuery($module,$secmodule){
  311. $query = $this->getRelationQuery($module,$secmodule,"vtiger_notes","notesid");
  312. $query .=" left join vtiger_crmentity as vtiger_crmentityDocuments on vtiger_crmentityDocuments.crmid=vtiger_notes.notesid and vtiger_crmentityDocuments.deleted=0
  313. left join vtiger_attachmentsfolder on vtiger_attachmentsfolder.folderid=vtiger_notes.folderid
  314. left join vtiger_groups as vtiger_groupsDocuments on vtiger_groupsDocuments.groupid = vtiger_crmentityDocuments.smownerid
  315. left join vtiger_users as vtiger_usersDocuments on vtiger_usersDocuments.id = vtiger_crmentityDocuments.smownerid
  316. left join vtiger_users as vtiger_lastModifiedByDocuments on vtiger_lastModifiedByDocuments.id = vtiger_crmentityDocuments.modifiedby ";
  317. return $query;
  318. }
  319. /*
  320. * Function to get the relation tables for related modules
  321. * @param - $secmodule secondary module name
  322. * returns the array with table names and fieldnames storing relations between module and this module
  323. */
  324. function setRelationTables($secmodule){
  325. $rel_tables = array();
  326. return $rel_tables[$secmodule];
  327. }
  328. // Function to unlink all the dependent entities of the given Entity by Id
  329. function unlinkDependencies($module, $id) {
  330. global $log;
  331. /*//Backup Documents Related Records
  332. $se_q = 'SELECT crmid FROM vtiger_senotesrel WHERE notesid = ?';
  333. $se_res = $this->db->pquery($se_q, array($id));
  334. if ($this->db->num_rows($se_res) > 0) {
  335. for($k=0;$k < $this->db->num_rows($se_res);$k++)
  336. {
  337. $se_id = $this->db->query_result($se_res,$k,"crmid");
  338. $params = array($id, RB_RECORD_DELETED, 'vtiger_senotesrel', 'notesid', 'crmid', $se_id);
  339. $this->db->pquery('INSERT INTO vtiger_relatedlists_rb VALUES (?,?,?,?,?,?)', $params);
  340. }
  341. }
  342. $sql = 'DELETE FROM vtiger_senotesrel WHERE notesid = ?';
  343. $this->db->pquery($sql, array($id));*/
  344. parent::unlinkDependencies($module, $id);
  345. }
  346. // Function to unlink an entity with given Id from another entity
  347. function unlinkRelationship($id, $return_module, $return_id) {
  348. global $log;
  349. if(empty($return_module) || empty($return_id)) return;
  350. $sql = 'DELETE FROM vtiger_senotesrel WHERE notesid = ? AND crmid = ?';
  351. $this->db->pquery($sql, array($id, $return_id));
  352. $sql = 'DELETE FROM vtiger_crmentityrel WHERE (crmid=? AND relmodule=? AND relcrmid=?) OR (relcrmid=? AND module=? AND crmid=?)';
  353. $params = array($id, $return_module, $return_id, $id, $return_module, $return_id);
  354. $this->db->pquery($sql, $params);
  355. }
  356. // Function to get fieldname for uitype 27 assuming that documents have only one file type field
  357. function getFileTypeFieldName(){
  358. global $adb,$log;
  359. $query = 'SELECT fieldname from vtiger_field where tabid = ? and uitype = ?';
  360. $tabid = getTabid('Documents');
  361. $filetype_uitype = 27;
  362. $res = $adb->pquery($query,array($tabid,$filetype_uitype));
  363. $fieldname = null;
  364. if(isset($res)){
  365. $rowCount = $adb->num_rows($res);
  366. if($rowCount > 0){
  367. $fieldname = $adb->query_result($res,0,'fieldname');
  368. }
  369. }
  370. return $fieldname;
  371. }
  372. // Function to get fieldname for uitype 28 assuming that doc has only one file upload type
  373. function getFile_FieldName(){
  374. global $adb,$log;
  375. $query = 'SELECT fieldname from vtiger_field where tabid = ? and uitype = ?';
  376. $tabid = getTabid('Documents');
  377. $filename_uitype = 28;
  378. $res = $adb->pquery($query,array($tabid,$filename_uitype));
  379. $fieldname = null;
  380. if(isset($res)){
  381. $rowCount = $adb->num_rows($res);
  382. if($rowCount > 0){
  383. $fieldname = $adb->query_result($res,0,'fieldname');
  384. }
  385. }
  386. return $fieldname;
  387. }
  388. /**
  389. * Check the existence of folder by folderid
  390. */
  391. function isFolderPresent($folderid) {
  392. global $adb;
  393. $result = $adb->pquery("SELECT folderid FROM vtiger_attachmentsfolder WHERE folderid = ?", array($folderid));
  394. if(!empty($result) && $adb->num_rows($result) > 0) return true;
  395. return false;
  396. }
  397. /**
  398. * Customizing the restore procedure.
  399. */
  400. function restore($modulename, $id) {
  401. parent::restore($modulename, $id);
  402. global $adb;
  403. $fresult = $adb->pquery("SELECT folderid FROM vtiger_notes WHERE notesid = ?", array($id));
  404. if(!empty($fresult) && $adb->num_rows($fresult)) {
  405. $folderid = $adb->query_result($fresult, 0, 'folderid');
  406. if(!$this->isFolderPresent($folderid)) {
  407. // Re-link to default folder
  408. $adb->pquery("UPDATE vtiger_notes set folderid = 1 WHERE notesid = ?", array($id));
  409. }
  410. }
  411. }
  412. function getQueryByModuleField($module, $fieldname, $srcrecord, $query) {
  413. if($module == "MailManager") {
  414. $tempQuery = split('WHERE', $query);
  415. if(!empty($tempQuery[1])) {
  416. $where = " vtiger_notes.filelocationtype = 'I' AND vtiger_notes.filename != '' AND vtiger_notes.filestatus != 0 AND ";
  417. $query = $tempQuery[0].' WHERE '.$where.$tempQuery[1];
  418. } else{
  419. $query = $tempQuery[0].' WHERE '.$tempQuery;
  420. }
  421. return $query;
  422. }
  423. }
  424. }
  425. ?>