PageRenderTime 46ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 1ms

/modules/MailManager/src/models/Draft.php

https://bitbucket.org/jhunsinfotech/blue-blues
PHP | 318 lines | 267 code | 39 blank | 12 comment | 62 complexity | 5b3b09e3f606c86ec0491510e074b34a MD5 | raw file
Possible License(s): LGPL-2.1, GPL-2.0, LGPL-3.0
  1. <?php
  2. /*+**********************************************************************************
  3. * The contents of this file are subject to the vtiger CRM Public License Version 1.1
  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 'data/CRMEntity.php';
  11. include_once 'include/Webservices/Query.php';
  12. include_once 'include/Webservices/Create.php';
  13. include_once 'include/Webservices/Update.php';
  14. include_once 'modules/MailManager/config.inc.php';
  15. include_once 'modules/MailManager/src/controllers/UploadController.php';
  16. include_once dirname(__FILE__).'/DraftFolder.php';
  17. class MailManager_Model_DraftEmail {
  18. static $totalDraftCount;
  19. static function getInstance() {
  20. return new self();
  21. }
  22. function folderInstance() {
  23. return new MailManager_Model_DraftFolder();
  24. }
  25. function searchDraftMails($q, $type, $page, $limit, $folder) {
  26. if($type == "all") {
  27. $where = $this->constructAllClause($q);
  28. } else {
  29. $where = $type ." LIKE '%". $q ."%'" ;
  30. }
  31. $where = " AND ".$where;
  32. $draftMails = $this->getDrafts($page, $limit, $folder, $where);
  33. return $draftMails;
  34. }
  35. function constructAllClause($query) {
  36. $fields = array('bccmail','ccmail','subject','saved_toid','description');
  37. for($i=0; $i<count($fields); $i++) {
  38. if($i == count($fields)-1) {
  39. $clause .= $fields[$i]." LIKE '%".$query."%'";
  40. } else {
  41. $clause .= $fields[$i]." LIKE '%".$query."%' OR ";
  42. }
  43. }
  44. return $clause;
  45. }
  46. function getDrafts($page, $limit, $folder, $where = null) {
  47. global $current_user;
  48. $handler = vtws_getModuleHandlerFromName('Emails', $current_user);
  49. $meta = $handler->getMeta();
  50. if(!$meta->hasReadAccess()) {
  51. return false;
  52. }
  53. if(!empty($page)) {
  54. $limitClause = "LIMIT ".($limit*$page).", ".$limit;
  55. } else {
  56. $limitClause = "LIMIT 0, ".$limit;
  57. }
  58. $query = "SELECT * FROM Emails where email_flag='SAVED' $where $limitClause;";
  59. $draftMails = vtws_query($query, $current_user);
  60. for($i=0; $i<count($draftMails); $i++) {
  61. foreach($draftMails[$i] as $fieldname=>$fieldvalue) {
  62. if($fieldname == "saved_toid" || $fieldname == "ccmail" || $fieldname == "bccmail") {
  63. if(!empty($fieldvalue)) {
  64. $value = implode(',',Zend_Json::decode($fieldvalue));
  65. if(strlen($value) > 45) {
  66. $value = substr($value, 0, 45)."....";
  67. }
  68. $draftMails[$i][$fieldname] = $value;
  69. }
  70. } else if($fieldname == "id") {
  71. $emailId = vtws_getIdComponents($fieldvalue);
  72. $draftMails[$i][$fieldname] = $emailId[1];
  73. }
  74. }
  75. }
  76. if($where) {
  77. $folder->setPaging($limit*$page+1, $limit*$page+$limit, $limit, count($draftMails), $page);
  78. } else {
  79. $total = $this->getTotalDraftCount();
  80. $folder->setPaging($limit*$page+1, $limit*$page+$limit, $limit, $total, $page);
  81. }
  82. $folder->setMails($draftMails);
  83. return $draftMails ;
  84. }
  85. function getTotalDraftCount() {
  86. global $adb, $current_user;
  87. if(empty(self::$totalDraftCount)) {
  88. $DraftRes = $query = "SELECT * FROM Emails where email_flag='SAVED';";
  89. $draftMails = vtws_query($query, $current_user);
  90. self::$totalDraftCount = count($draftMails);
  91. return self::$totalDraftCount;
  92. } else {
  93. return self::$totalDraftCount;
  94. }
  95. }
  96. function getDraftMail($request) {
  97. global $adb, $current_user;
  98. $handler = vtws_getModuleHandlerFromName('Emails', $current_user);
  99. $meta = $handler->getMeta();
  100. if(!$meta->hasReadAccess()) {
  101. return false;
  102. }
  103. $id = vtws_getWebserviceEntityId('Emails', $request->get('id'));
  104. $draftMail = vtws_query("SELECT * FROM Emails where id = $id;", $current_user);
  105. $emailId = vtws_getIdComponents($id);
  106. $draftMail['attachments'] = $this->getAttachmentDetails($emailId[1]);
  107. $draftMail[0]['id'] = $request->get('id');
  108. return $draftMail;
  109. }
  110. function getAttachmentDetails($crmid) {
  111. global $adb;
  112. $documentRes = $adb->pquery("SELECT * FROM vtiger_senotesrel
  113. INNER JOIN vtiger_crmentity ON vtiger_senotesrel.notesid = vtiger_crmentity.crmid AND vtiger_senotesrel.crmid = ?
  114. INNER JOIN vtiger_notes ON vtiger_notes.notesid = vtiger_senotesrel.notesid
  115. INNER JOIN vtiger_seattachmentsrel ON vtiger_seattachmentsrel.crmid = vtiger_notes.notesid
  116. INNER JOIN vtiger_attachments ON vtiger_attachments.attachmentsid = vtiger_seattachmentsrel.attachmentsid
  117. WHERE vtiger_crmentity.deleted = 0", array($crmid));
  118. if($adb->num_rows($documentRes)) {
  119. for($i=0; $i<$adb->num_rows($documentRes); $i++) {
  120. $draftMail[$i]['name'] = $adb->query_result($documentRes, $i, 'filename');
  121. $filesize = $adb->query_result($documentRes, $i, 'filesize');
  122. $draftMail[$i]['size'] = $this->getFormattedFileSize($filesize);
  123. $draftMail[$i]['docid'] = $adb->query_result($documentRes, $i, 'notesid');
  124. $draftMail[$i]['path'] = $adb->query_result($documentRes, $i, 'path');
  125. $draftMail[$i]['fileid'] = $adb->query_result($documentRes, $i, 'attachmentsid');
  126. $draftMail[$i]['attachment'] = $adb->query_result($documentRes, $i, 'name');
  127. }
  128. }
  129. return $draftMail;
  130. }
  131. function saveDraft($request) {
  132. global $current_user, $adb;
  133. if(!MailManager::checkModuleWriteAccessForCurrentUser('Emails')) {
  134. return false;
  135. }
  136. $email = CRMEntity::getInstance('Emails');
  137. $to_string = rtrim($request->get('to'), ',');
  138. $cc_string = rtrim($request->get('cc'), ',');
  139. $bcc_string= rtrim($request->get('bcc'), ',');
  140. $parentIds = $this->getParentFromEmails($to_string);
  141. $emailId = $request->get('emailid');
  142. $subject = $request->get('subject');
  143. $email = CRMEntity::getInstance('Emails');
  144. $email->column_fields['assigned_user_id'] = $current_user->id;
  145. $email->column_fields['date_start'] = date('Y-m-d');
  146. $email->column_fields['time_start'] = date('H:i');
  147. $email->column_fields['parent_id'] = $parentIds;
  148. $email->column_fields['subject'] = (!empty($subject)) ? $subject : "No Subject";
  149. $email->column_fields['description'] = $request->get('body');
  150. $email->column_fields['activitytype'] = 'Emails';
  151. $email->column_fields['from_email'] = $fromEmail;
  152. $email->column_fields['saved_toid'] = (!empty($to_string)) ? $to_string : "SAVED";
  153. $email->column_fields['ccmail'] = $cc_string;
  154. $email->column_fields['bccmail'] = $bcc_string;
  155. $email->column_fields['email_flag'] = 'SAVED';
  156. if(empty($emailId)) {
  157. $email->save('Emails');
  158. } else {
  159. $email->id = $emailId;
  160. $email->mode = 'edit';
  161. $email->save('Emails');
  162. }
  163. //save parent and email relation, to show up in Emails section of the parent
  164. $this->saveEmailParentRel($email->id, $parentIds);
  165. return $email->id;
  166. }
  167. function saveEmailParentRel($emailId, $parentIds) {
  168. global $adb;
  169. $myids = explode("|", $parentIds); //2@71|
  170. if(!empty($emailId)) {
  171. $adb->pquery("delete from vtiger_seactivityrel where activityid=?",array($emailId)); //remove all previous relation
  172. }
  173. for ($i=0; $i<(count($myids)); $i++) {
  174. $realid = explode("@",$myids[$i]);
  175. if(!empty($realid[0]) && !empty($emailId)) {
  176. // this is needed as we might save the mail in draft mode earlier
  177. $result = $adb->pquery("SELECT * FROM vtiger_seactivityrel WHERE crmid=? AND activityid=?",array($realid[0], $emailId));
  178. if(!$adb->num_rows($result)) {
  179. $adb->pquery('INSERT INTO vtiger_seactivityrel(crmid, activityid) VALUES(?,?)',array($realid[0], $emailId));
  180. }
  181. }
  182. }
  183. }
  184. function getFromEmailAddress() {
  185. global $adb, $current_user;
  186. $fromEmail = false;
  187. if (Vtiger_Version::check('5.2.0', '>=')) {
  188. $smtpFromResult = $adb->pquery('SELECT from_email_field FROM vtiger_systems WHERE server_type=?', array('email'));
  189. if ($adb->num_rows($smtpFromResult)) {
  190. $fromEmail = decode_html($adb->query_result($smtpFromResult, 0, 'from_email_field'));
  191. }
  192. }
  193. if (empty($fromEmail)) $fromEmail = $current_user->column_fields['email1'];
  194. return $fromEmail;
  195. }
  196. function saveAttachment($request) {
  197. global $current_user, $adb;
  198. //need to handle earlier as Emails save will save the uploaded files from $_FILES
  199. $uploadResponse = $this->handleUpload();
  200. $emailId = $this->saveDraft($request);
  201. if($emailId != false) {
  202. if($uploadResponse && $uploadResponse['success'] == true) {
  203. // Link document to base record
  204. if(!empty($uploadResponse['docid'])) $this->saveEmailDocumentRel($emailId, $uploadResponse['docid']);
  205. if(!empty($uploadResponse['attachid'])) $this->saveAttachmentRel($emailId, $uploadResponse['attachid']);
  206. }
  207. $uploadResponse['emailid'] = $emailId;
  208. } else {
  209. $uploadResponse['error'] = true;
  210. }
  211. return $uploadResponse;
  212. }
  213. function getParentFromEmails($to_string) {
  214. global $current_user;
  215. if (!empty($to_string)) {
  216. $toArray = explode(',', $to_string);
  217. foreach($toArray as $to) {
  218. $relatedtos = MailManager::lookupMailInVtiger(trim($to), $current_user);
  219. if (!empty($relatedtos) && is_array($relatedtos)) {
  220. for($i=0; $i<count($relatedtos); $i++) {
  221. $relateto = vtws_getIdComponents($relatedtos[$i]['record']);
  222. $parentIds .= $relateto[1]."@1|";
  223. }
  224. }
  225. }
  226. }
  227. return $parentIds;
  228. }
  229. function handleUpload() {
  230. global $upload_maxsize;
  231. $allowedFileExtension = array();
  232. $uploadLimit = ConfigPrefs::get('MAXUPLOADLIMIT', $upload_maxsize);
  233. $filePath = decideFilePath();
  234. $upload = new MailManager_Uploader($allowedFileExtension, $uploadLimit);
  235. return $upload->handleUpload($filePath, false);
  236. }
  237. function saveEmailDocumentRel($emailId, $documentId) {
  238. global $adb;
  239. if(!empty($emailId) && !empty($documentId)) {
  240. $adb->pquery("INSERT INTO vtiger_senotesrel(crmid, notesid) VALUES(?,?)",
  241. Array($emailId, $documentId));
  242. }
  243. }
  244. function saveAttachmentRel($crmid, $attachId) {
  245. global $adb;
  246. if(!empty($crmid) && !empty($attachId)) {
  247. $adb->pquery("INSERT INTO vtiger_seattachmentsrel(crmid, attachmentsid) VALUES(?,?)",
  248. Array($crmid, $attachId));
  249. }
  250. }
  251. function deleteMail($ids) {
  252. global $current_user;
  253. $focus = CRMEntity::getInstance('Emails');
  254. $idList = explode(',', $ids);
  255. foreach($idList as $id) {
  256. $focus->trash('Emails', $id);
  257. }
  258. }
  259. function deleteAttachment($request) {
  260. global $adb;
  261. $emailid = $request->get('emailid');
  262. $docid = $request->get('docid');
  263. if(!empty($docid) && !empty($emailid)) {
  264. $adb->pquery("DELETE FROM vtiger_senotesrel WHERE crmid = ? AND notesid = ?", array($emailid, $docid));
  265. return true;
  266. }
  267. return false;
  268. }
  269. function getFormattedFileSize($filesize) {
  270. if($filesize < 1024)
  271. $filesize = sprintf("%0.2f",round($filesize, 2)).'b';
  272. elseif($filesize > 1024 && $filesize < 1048576)
  273. $filesize = sprintf("%0.2f",round($filesize/1024, 2)).'kB';
  274. else if($filesize > 1048576)
  275. $filesize = sprintf("%0.2f",round($filesize/(1024*1024), 2)).'MB';
  276. return $filesize;
  277. }
  278. }
  279. ?>