PageRenderTime 49ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/modules/Emails/views/MassSaveAjax.php

https://bitbucket.org/thomashii/vtigercrm-6-for-postgresql
PHP | 263 lines | 194 code | 41 blank | 28 comment | 37 complexity | 677bbe561aca7e7f154523dfeec9f823 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 Emails_MassSaveAjax_View extends Vtiger_Footer_View {
  11. function __construct() {
  12. parent::__construct();
  13. $this->exposeMethod('massSave');
  14. }
  15. public function checkPermission(Vtiger_Request $request) {
  16. $moduleName = $request->getModule();
  17. if (!Users_Privileges_Model::isPermitted($moduleName, 'Save')) {
  18. throw new AppException(vtranslate($moduleName).' '.vtranslate('LBL_NOT_ACCESSIBLE'));
  19. }
  20. }
  21. public function process(Vtiger_Request $request) {
  22. $mode = $request->getMode();
  23. if(!empty($mode)) {
  24. echo $this->invokeExposedMethod($mode, $request);
  25. return;
  26. }
  27. }
  28. /**
  29. * Function Sends/Saves mass emails
  30. * @param <Vtiger_Request> $request
  31. */
  32. public function massSave(Vtiger_Request $request) {
  33. global $upload_badext;
  34. $adb = PearDatabase::getInstance();
  35. $moduleName = $request->getModule();
  36. $currentUserModel = Users_Record_Model::getCurrentUserModel();
  37. $recordIds = $this->getRecordsListFromRequest($request);
  38. $documentIds = $request->get('documentids');
  39. // This is either SENT or SAVED
  40. $flag = $request->get('flag');
  41. $result = Vtiger_Util_Helper::transformUploadedFiles($_FILES, true);
  42. $_FILES = $result['file'];
  43. $recordId = $request->get('record');
  44. if(!empty($recordId)) {
  45. $recordModel = Vtiger_Record_Model::getInstanceById($recordId,$moduleName);
  46. $recordModel->set('mode', 'edit');
  47. }else{
  48. $recordModel = Vtiger_Record_Model::getCleanInstance($moduleName);
  49. $recordModel->set('mode', '');
  50. }
  51. $parentEmailId = $request->get('parent_id',null);
  52. $attachmentsWithParentEmail = array();
  53. if(!empty($parentEmailId) && !empty ($recordId)) {
  54. $parentEmailModel = Vtiger_Record_Model::getInstanceById($parentEmailId);
  55. $attachmentsWithParentEmail = $parentEmailModel->getAttachmentDetails();
  56. }
  57. $existingAttachments = $request->get('attachments',array());
  58. if(empty($recordId)) {
  59. if(is_array($existingAttachments)) {
  60. foreach ($existingAttachments as $index => $existingAttachInfo) {
  61. $existingAttachInfo['tmp_name'] = $existingAttachInfo['name'];
  62. $existingAttachments[$index] = $existingAttachInfo;
  63. if(array_key_exists('docid',$existingAttachInfo)) {
  64. $documentIds[] = $existingAttachInfo['docid'];
  65. unset($existingAttachments[$index]);
  66. }
  67. }
  68. }
  69. }else{
  70. //If it is edit view unset the exising attachments
  71. //remove the exising attachments if it is in edit view
  72. $attachmentsToUnlink = array();
  73. $documentsToUnlink = array();
  74. foreach($attachmentsWithParentEmail as $i => $attachInfo) {
  75. $found = false;
  76. foreach ($existingAttachments as $index => $existingAttachInfo) {
  77. if($attachInfo['fileid'] == $existingAttachInfo['fileid']) {
  78. $found = true;
  79. break;
  80. }
  81. }
  82. //Means attachment is deleted
  83. if(!$found) {
  84. if(array_key_exists('docid',$attachInfo)) {
  85. $documentsToUnlink[] = $attachInfo['docid'];
  86. }else{
  87. $attachmentsToUnlink[] = $attachInfo;
  88. }
  89. }
  90. unset($attachmentsWithParentEmail[$i]);
  91. }
  92. //Make the attachments as empty for edit view since all the attachments will already be there
  93. $existingAttachments = array();
  94. if(!empty($documentsToUnlink)) {
  95. $recordModel->deleteDocumentLink($documentsToUnlink);
  96. }
  97. if(!empty($attachmentsToUnlink)){
  98. $recordModel->deleteAttachment($attachmentsToUnlink);
  99. }
  100. }
  101. // This will be used for sending mails to each individual
  102. $toMailInfo = $request->get('toemailinfo');
  103. $to = $request->get('to');
  104. if(is_array($to)) {
  105. $to = implode(',',$to);
  106. }
  107. $recordModel->set('description', $request->get('description'));
  108. $recordModel->set('subject', $request->get('subject'));
  109. $recordModel->set('saved_toid', $to);
  110. $recordModel->set('ccmail', $request->get('cc'));
  111. $recordModel->set('bccmail', $request->get('bcc'));
  112. $recordModel->set('assigned_user_id', $currentUserModel->getId());
  113. $recordModel->set('email_flag', $flag);
  114. $recordModel->set('documentids', $documentIds);
  115. $recordModel->set('toemailinfo', $toMailInfo);
  116. foreach($toMailInfo as $recordId=>$emailValueList) {
  117. if($recordModel->getEntityType($recordId) == 'Users'){
  118. $parentIds .= $recordId.'@-1|';
  119. }else{
  120. $parentIds .= $recordId.'@1|';
  121. }
  122. }
  123. $recordModel->set('parent_id', $parentIds);
  124. //save_module still depends on the $_REQUEST, need to clean it up
  125. $_REQUEST['parent_id'] = $parentIds;
  126. $success = false;
  127. $viewer = $this->getViewer($request);
  128. if ($recordModel->checkUploadSize($documentIds)) {
  129. $recordModel->save();
  130. //To Handle existing attachments
  131. $current_user = Users_Record_Model::getCurrentUserModel();
  132. $ownerId = $recordModel->get('assigned_user_id');
  133. $date_var = date("Y-m-d H:i:s");
  134. if(is_array($existingAttachments)) {
  135. foreach ($existingAttachments as $index => $existingAttachInfo) {
  136. $file_name = $existingAttachInfo['attachment'];
  137. $path = $existingAttachInfo['path'];
  138. $fileId = $existingAttachInfo['fileid'];
  139. $oldFileName = $file_name;
  140. //SEND PDF mail will not be having file id
  141. if(!empty ($fileId)) {
  142. $oldFileName = $existingAttachInfo['fileid'].'_'.$file_name;
  143. }
  144. $oldFilePath = $path.'/'.$oldFileName;
  145. $binFile = sanitizeUploadFileName($file_name, $upload_badext);
  146. $current_id = $adb->getUniqueID("vtiger_crmentity");
  147. $filename = ltrim(basename(" " . $binFile)); //allowed filename like UTF-8 characters
  148. $filetype = $existingAttachInfo['type'];
  149. $filesize = $existingAttachInfo['size'];
  150. //get the file path inwhich folder we want to upload the file
  151. $upload_file_path = decideFilePath();
  152. $newFilePath = $upload_file_path . $current_id . "_" . $binFile;
  153. copy($oldFilePath, $newFilePath);
  154. $sql1 = "insert into vtiger_crmentity (crmid,smcreatorid,smownerid,setype,description,createdtime,modifiedtime) values(?, ?, ?, ?, ?, ?, ?)";
  155. $params1 = array($current_id, $current_user->getId(), $ownerId, $moduleName . " Attachment", $recordModel->get('description'), $adb->formatDate($date_var, true), $adb->formatDate($date_var, true));
  156. $adb->pquery($sql1, $params1);
  157. $sql2 = "insert into vtiger_attachments(attachmentsid, name, description, type, path) values(?, ?, ?, ?, ?)";
  158. $params2 = array($current_id, $filename, $recordModel->get('description'), $filetype, $upload_file_path);
  159. $result = $adb->pquery($sql2, $params2);
  160. $sql3 = 'insert into vtiger_seattachmentsrel values(?,?)';
  161. $adb->pquery($sql3, array($recordModel->getId(), $current_id));
  162. }
  163. }
  164. $success = true;
  165. if($flag == 'SENT') {
  166. $status = $recordModel->send();
  167. if ($status === true) {
  168. // This is needed to set vtiger_email_track table as it is used in email reporting
  169. $recordModel->setAccessCountValue();
  170. } else {
  171. $success = false;
  172. $message = $status;
  173. }
  174. }
  175. } else {
  176. $message = vtranslate('LBL_MAX_UPLOAD_SIZE', $moduleName).' '.vtranslate('LBL_EXCEEDED', $moduleName);
  177. }
  178. $viewer->assign('SUCCESS', $success);
  179. $viewer->assign('MESSAGE', $message);
  180. $loadRelatedList = $request->get('related_load');
  181. if(!empty($loadRelatedList)){
  182. $viewer->assign('RELATED_LOAD',true);
  183. }
  184. $viewer->view('SendEmailResult.tpl', $moduleName);
  185. }
  186. /**
  187. * Function returns the record Ids selected in the current filter
  188. * @param Vtiger_Request $request
  189. * @return integer
  190. */
  191. public function getRecordsListFromRequest(Vtiger_Request $request) {
  192. $cvId = $request->get('viewname');
  193. $selectedIds = $request->get('selected_ids');
  194. $excludedIds = $request->get('excluded_ids');
  195. if(!empty($selectedIds) && $selectedIds != 'all') {
  196. if(!empty($selectedIds) && count($selectedIds) > 0) {
  197. return $selectedIds;
  198. }
  199. }
  200. if($selectedIds == 'all'){
  201. $sourceRecord = $request->get('sourceRecord');
  202. $sourceModule = $request->get('sourceModule');
  203. if ($sourceRecord && $sourceModule) {
  204. $sourceRecordModel = Vtiger_Record_Model::getInstanceById($sourceRecord, $sourceModule);
  205. return $sourceRecordModel->getSelectedIdsList($request->get('parentModule'), $excludedIds);
  206. }
  207. $customViewModel = CustomView_Record_Model::getInstanceById($cvId);
  208. if($customViewModel) {
  209. $searchKey = $request->get('search_key');
  210. $searchValue = $request->get('search_value');
  211. $operator = $request->get('operator');
  212. if(!empty($operator)) {
  213. $customViewModel->set('operator', $operator);
  214. $customViewModel->set('search_key', $searchKey);
  215. $customViewModel->set('search_value', $searchValue);
  216. }
  217. return $customViewModel->getRecordIds($excludedIds);
  218. }
  219. }
  220. return array();
  221. }
  222. }