2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
3 /*********************************************************************************
4 * SugarCRM Community Edition is a customer relationship management program developed by
5 * SugarCRM, Inc. Copyright (C) 2004-2013 SugarCRM Inc.
7 * This program is free software; you can redistribute it and/or modify it under
8 * the terms of the GNU Affero General Public License version 3 as published by the
9 * Free Software Foundation with the addition of the following permission added
10 * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
11 * IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY
12 * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
14 * This program is distributed in the hope that it will be useful, but WITHOUT
15 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16 * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
19 * You should have received a copy of the GNU Affero General Public License along with
20 * this program; if not, see http://www.gnu.org/licenses or write to the Free
21 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
24 * You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road,
25 * SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com.
27 * The interactive user interfaces in modified source and object code versions
28 * of this program must display Appropriate Legal Notices, as required under
29 * Section 5 of the GNU Affero General Public License version 3.
31 * In accordance with Section 7(b) of the GNU Affero General Public License version 3,
32 * these Appropriate Legal Notices must retain the display of the "Powered by
33 * SugarCRM" logo. If the display of the logo is not reasonably feasible for
34 * technical reasons, the Appropriate Legal Notices must display the words
35 * "Powered by SugarCRM".
36 ********************************************************************************/
38 /*********************************************************************************
40 * Description: TODO: To be written.
41 * Portions created by SugarCRM are Copyright (C) SugarCRM, Inc.
42 * All Rights Reserved.
43 * Contributor(s): ______________________________________..
44 ********************************************************************************/
50 require_once('include/upload_file.php');
52 // Note is used to store customer information.
53 class Note extends SugarBean {
59 var $modified_user_id;
60 var $assigned_user_id;
63 var $modified_by_name;
67 // handle to an upload_file object
70 var $embed_flag; // inline image flag
81 var $module_dir = "Notes";
82 var $default_note_name_dom = array('Meeting notes', 'Reminder');
83 var $table_name = "notes";
84 var $new_schema = true;
85 var $object_name = "Note";
86 var $importable = true;
88 // This is used to retrieve related fields from form posts.
89 var $additional_column_fields = Array('contact_name', 'contact_phone', 'contact_email', 'parent_name','first_name','last_name');
97 function safeAttachmentName() {
100 //get position of last "." in file name
101 $file_ext_beg = strrpos($this->filename, ".");
105 if($file_ext_beg !== false) {
106 $file_ext = substr($this->filename, $file_ext_beg + 1);
109 //check to see if this is a file with extension located in "badext"
110 foreach($sugar_config['upload_badext'] as $badExt) {
111 if(strtolower($file_ext) == strtolower($badExt)) {
112 //if found, then append with .txt and break out of lookup
113 $this->name = $this->name . ".txt";
114 $this->file_mime_type = 'text/';
115 $this->filename = $this->filename . ".txt";
116 break; // no need to look for more
123 * overrides SugarBean's method.
124 * If a system setting is set, it will mark all related notes as deleted, and attempt to delete files that are
125 * related to those notes
126 * @param string id ID
128 function mark_deleted($id) {
129 global $sugar_config;
131 if($this->parent_type == 'Emails') {
132 if(isset($sugar_config['email_default_delete_attachments']) && $sugar_config['email_default_delete_attachments'] == true) {
133 $removeFile = "upload://$id";
134 if(file_exists($removeFile)) {
135 if(!unlink($removeFile)) {
136 $GLOBALS['log']->error("*** Could not unlink() file: [ {$removeFile} ]");
143 parent::mark_deleted($id);
146 function deleteAttachment($isduplicate="false"){
147 if($this->ACLAccess('edit')){
148 if($isduplicate=="true"){
151 $removeFile = "upload://{$this->id}";
153 if(!empty($this->doc_type) && !empty($this->doc_id)){
154 $document = ExternalAPIFactory::loadAPI($this->doc_type);
156 $response = $document->deleteDoc($this);
157 $this->doc_type = '';
160 $this->filename = '';
161 $this->file_mime_type = '';
163 if(file_exists($removeFile)) {
164 if(!unlink($removeFile)) {
165 $GLOBALS['log']->error("*** Could not unlink() file: [ {$removeFile} ]");
167 $this->filename = '';
168 $this->file_mime_type = '';
174 $this->filename = '';
175 $this->file_mime_type = '';
185 function get_summary_text() {
186 return "$this->name";
189 function create_export_query(&$order_by, &$where, $relate_link_join='')
191 $custom_join = $this->getCustomJoin(true, true, $where);
192 $custom_join['join'] .= $relate_link_join;
193 $query = "SELECT notes.*, contacts.first_name, contacts.last_name, users.user_name as assigned_user_name ";
195 $query .= $custom_join['select'];
197 $query .= " FROM notes ";
199 $query .= " LEFT JOIN contacts ON notes.contact_id=contacts.id ";
200 $query .= " LEFT JOIN users ON notes.assigned_user_id=users.id ";
202 $query .= $custom_join['join'];
204 $where_auto = " notes.deleted=0 AND (contacts.deleted IS NULL OR contacts.deleted=0)";
207 $query .= "where $where AND ".$where_auto;
209 $query .= "where ".$where_auto;
212 $query .= " ORDER BY ". $this->process_order_by($order_by, null);
214 $query .= " ORDER BY notes.name";
219 function fill_in_additional_list_fields() {
220 $this->fill_in_additional_detail_fields();
223 function fill_in_additional_detail_fields() {
224 parent::fill_in_additional_detail_fields();
225 //TODO: Seems odd we need to clear out these values so that list views don't show the previous rows value if current value is blank
226 $this->getRelatedFields('Contacts', $this->contact_id, array('name'=>'contact_name', 'phone_work'=>'contact_phone') );
227 if(!empty($this->contact_name)){
229 $emailAddress = new SugarEmailAddress();
230 $this->contact_email = $emailAddress->getPrimaryAddress(false, $this->contact_id, 'Contacts');
233 if(isset($this->contact_id) && $this->contact_id != '') {
234 $contact = new Contact();
235 $contact->retrieve($this->contact_id);
236 if(isset($contact->id)) {
237 $this->contact_name = $contact->full_name;
243 function get_list_view_data()
245 $note_fields = $this->get_list_view_array();
246 global $app_list_strings, $focus, $action, $currentModule,$mod_strings, $sugar_config;
248 if(isset($this->parent_type)) {
249 $note_fields['PARENT_MODULE'] = $this->parent_type;
252 if(!empty($this->filename)) {
253 if(file_exists("upload://{$this->id}")){
254 $note_fields['FILENAME'] = $this->filename;
255 $note_fields['FILE_URL'] = UploadFile::get_upload_url($this);
258 if(isset($this->contact_id) && $this->contact_id != '') {
259 $contact = new Contact();
260 $contact->retrieve($this->contact_id);
261 if(isset($contact->id)) {
262 $this->contact_name = $contact->full_name;
265 if(isset($this->contact_name)){
266 $note_fields['CONTACT_NAME'] = $this->contact_name;
269 global $current_language;
270 $mod_strings = return_module_language($current_language, 'Notes');
271 $note_fields['STATUS']=$mod_strings['LBL_NOTE_STATUS'];
277 function listviewACLHelper() {
278 $array_assign = parent::listviewACLHelper();
280 if(!empty($this->parent_name)) {
281 if(!empty($this->parent_name_owner)) {
282 global $current_user;
283 $is_owner = $current_user->id == $this->parent_name_owner;
287 if(!ACLController::moduleSupportsACL($this->parent_type) || ACLController::checkAccess($this->parent_type, 'view', $is_owner)) {
288 $array_assign['PARENT'] = 'a';
290 $array_assign['PARENT'] = 'span';
294 if(!empty($this->contact_name)) {
295 if(!empty($this->contact_name_owner)) {
296 global $current_user;
297 $is_owner = $current_user->id == $this->contact_name_owner;
301 if( ACLController::checkAccess('Contacts', 'view', $is_owner)) {
302 $array_assign['CONTACT'] = 'a';
304 $array_assign['CONTACT'] = 'span';
307 return $array_assign;
310 function bean_implements($interface) {
312 case 'ACL':return true;