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-2011 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 ********************************************************************************/
43 require_once("include/upload_file.php");
45 require_once('include/utils/db_utils.php');
47 global $currentModule;
53 global $app_list_strings;
54 //we don't want the parent module's string file, but rather the string file specifc to this subpanel
55 global $current_language,$beanList,$beanFiles;
56 $current_module_strings = return_module_language($current_language, 'Activities');
58 // history_list is the means of passing data to a SubPanelView.
59 $bean = $beanList[$_REQUEST['module_name']];
60 require_once($beanFiles[$bean]);
70 function Popup_Picker() {
76 function process_page() {
80 global $app_list_strings;
81 global $currentModule;
88 $history_list = array();
90 if(!empty($_REQUEST['record'])) {
91 $result = $focus->retrieve($_REQUEST['record']);
94 sugar_die($app_strings['ERROR_NO_RECORD']);
98 $activitiesRels = array('tasks' => 'Task', 'meetings' => 'Meeting', 'calls' => 'Call', 'emails' => 'Email', 'notes' => 'Note');
99 //Setup the arrays to store the linked records.
100 foreach($activitiesRels as $relMod => $beanName) {
101 $varname = "focus_" . $relMod . "_list";
104 foreach($focus->get_linked_fields() as $field => $def) {
105 if ($focus->load_relationship($field)) {
106 $relTable = $focus->$field->getRelatedTableName();
107 if (in_array($relTable, array_keys($activitiesRels)))
109 $varname = "focus_" . $relTable . "_list";
110 $$varname = sugarArrayMerge($$varname, $focus->get_linked_beans($field,$activitiesRels[$relTable]));
116 foreach ($focus_tasks_list as $task) {
118 if (empty($task->date_due) || $task->date_due == '0000-00-00') {
122 $date_due = $task->date_due;
125 if ($task->status != "Not Started" && $task->status != "In Progress" && $task->status != "Pending Input") {
126 $history_list[] = array('name' => $task->name,
131 'status' => $task->status,
132 'parent_id' => $task->parent_id,
133 'parent_type' => $task->parent_type,
134 'parent_name' => $task->parent_name,
135 'contact_id' => $task->contact_id,
136 'contact_name' => $task->contact_name,
137 'date_modified' => $date_due,
138 'description' => $this->getTaskDetails($task),
139 'date_type' => $app_strings['DATA_TYPE_DUE'],
140 'sort_value' => strtotime($task->fetched_row['date_due'].' GMT'),
143 $open_activity_list[] = array('name' => $task->name,
148 'status' => $task->status,
149 'parent_id' => $task->parent_id,
150 'parent_type' => $task->parent_type,
151 'parent_name' => $task->parent_name,
152 'contact_id' => $task->contact_id,
153 'contact_name' => $task->contact_name,
154 'date_due' => $date_due,
155 'description' => $this->getTaskDetails($task),
156 'date_type' => $app_strings['DATA_TYPE_DUE']
161 foreach ($focus_meetings_list as $meeting) {
163 if (empty($meeting->contact_id) && empty($meeting->contact_name)) {
164 $meeting_contacts = $meeting->get_linked_beans('contacts','Contact');
165 if (!empty($meeting_contacts[0]->id) && !empty($meeting_contacts[0]->name)) {
166 $meeting->contact_id = $meeting_contacts[0]->id;
167 $meeting->contact_name = $meeting_contacts[0]->name;
170 if ($meeting->status != "Planned") {
171 $history_list[] = array('name' => $meeting->name,
172 'id' => $meeting->id,
175 'module' => "Meetings",
176 'status' => $meeting->status,
177 'parent_id' => $meeting->parent_id,
178 'parent_type' => $meeting->parent_type,
179 'parent_name' => $meeting->parent_name,
180 'contact_id' => $meeting->contact_id,
181 'contact_name' => $meeting->contact_name,
182 'date_modified' => $meeting->date_start,
183 'description' => $this->formatDescription($meeting->description),
184 'date_type' => $app_strings['DATA_TYPE_START'],
185 'sort_value' => strtotime($meeting->fetched_row['date_start'].' GMT'),
188 $open_activity_list[] = array('name' => $meeting->name,
189 'id' => $meeting->id,
192 'module' => "Meetings",
193 'status' => $meeting->status,
194 'parent_id' => $meeting->parent_id,
195 'parent_type' => $meeting->parent_type,
196 'parent_name' => $meeting->parent_name,
197 'contact_id' => $meeting->contact_id,
198 'contact_name' => $meeting->contact_name,
199 'date_due' => $meeting->date_start,
200 'description' => $this->formatDescription($meeting->description),
201 'date_type' => $app_strings['DATA_TYPE_START']
206 foreach ($focus_calls_list as $call) {
208 if (empty($call->contact_id) && empty($call->contact_name)) {
209 $call_contacts = $call->get_linked_beans('contacts','Contact');
210 if (!empty($call_contacts[0]->id) && !empty($call_contacts[0]->name)) {
211 $call->contact_id = $call_contacts[0]->id;
212 $call->contact_name = $call_contacts[0]->name;
216 if ($call->status != "Planned") {
217 $history_list[] = array('name' => $call->name,
220 'direction' => $call->direction,
222 'status' => $call->status,
223 'parent_id' => $call->parent_id,
224 'parent_type' => $call->parent_type,
225 'parent_name' => $call->parent_name,
226 'contact_id' => $call->contact_id,
227 'contact_name' => $call->contact_name,
228 'date_modified' => $call->date_start,
229 'description' => $this->formatDescription($call->description),
230 'date_type' => $app_strings['DATA_TYPE_START'],
231 'sort_value' => strtotime($call->fetched_row['date_start'].' GMT'),
234 $open_activity_list[] = array('name' => $call->name,
236 'direction' => $call->direction,
239 'status' => $call->status,
240 'parent_id' => $call->parent_id,
241 'parent_type' => $call->parent_type,
242 'parent_name' => $call->parent_name,
243 'contact_id' => $call->contact_id,
244 'contact_name' => $call->contact_name,
245 'date_due' => $call->date_start,
246 'description' => $this->formatDescription($call->description),
247 'date_type' => $app_strings['DATA_TYPE_START']
252 foreach ($focus_emails_list as $email) {
254 if (empty($email->contact_id) && empty($email->contact_name)) {
255 $email_contacts = $email->get_linked_beans('contacts','Contact');
256 if (!empty($email_contacts[0]->id) && !empty($email_contacts[0]->name)) {
257 $email->contact_id = $email_contacts[0]->id;
258 $email->contact_name = $email_contacts[0]->name;
261 $history_list[] = array('name' => $email->name,
265 'module' => "Emails",
267 'parent_id' => $email->parent_id,
268 'parent_type' => $email->parent_type,
269 'parent_name' => $email->parent_name,
270 'contact_id' => $email->contact_id,
271 'contact_name' => $email->contact_name,
272 'date_modified' => $email->date_start." ".$email->time_start,
273 'description' => $this->getEmailDetails($email),
274 'date_type' => $app_strings['DATA_TYPE_SENT'],
275 'sort_value' => strtotime($email->fetched_row['date_sent'].' GMT'),
279 // Bug 46439 'No email archived when clicking on View Summary' (All condition)
280 if (method_exists($focus,'get_unlinked_email_query'))
282 $queryArray = $focus->get_unlinked_email_query(array('return_as_array'=>'true'));
283 $query = $queryArray['select'];
284 $query .= $queryArray['from'];
285 if (!empty($queryArray['join_tables']))
287 foreach ($queryArray['join_tables'] as $join_table)
289 if ($join_table != '')
291 $query .= ', '.$join_table.' ';
295 $query .= $queryArray['join'];
296 $query .= $queryArray['where'];
297 $emails = new Email();
298 $focus_unlinked_emails_list = $emails->process_list_query($query, 0);
299 $focus_unlinked_emails_list = $focus_unlinked_emails_list['list'];
300 foreach ($focus_unlinked_emails_list as $email)
302 $email->retrieve($email->id);
303 $history_list[] = array(
304 'name' => $email->name,
308 'module' => "Emails",
310 'parent_id' => $email->parent_id,
311 'parent_type' => $email->parent_type,
312 'parent_name' => $email->parent_name,
313 'contact_id' => $email->contact_id,
314 'contact_name' => $email->contact_name,
315 'date_modified' => $email->date_start." ".$email->time_start,
316 'description' => $this->getEmailDetails($email),
317 'date_type' => $app_strings['DATA_TYPE_SENT'],
318 'sort_value' => strtotime($email->fetched_row['date_sent'].' GMT'),
321 } //end Unlinked Emails
323 foreach ($focus_notes_list as $note) {
325 $history_list[] = array('name' => $note->name,
331 'parent_id' => $note->parent_id,
332 'parent_type' => $note->parent_type,
333 'parent_name' => $note->parent_name,
334 'contact_id' => $note->contact_id,
335 'contact_name' => $note->contact_name,
336 'date_modified' => $note->date_modified,
337 'description' => $this->formatDescription($note->description),
338 'date_type' => $app_strings['DATA_TYPE_MODIFIED'],
339 'sort_value' => strtotime($note->fetched_row['date_modified'].' GMT'),
341 if(!empty($note->filename)) {
342 $count = count($history_list);
344 $history_list[$count]['filename'] = $note->filename;
345 $history_list[$count]['fileurl'] = UploadFile::get_url($note->filename,$note->id);
349 $xtpl=new XTemplate ('modules/Activities/Popup_picker.html');
351 $xtpl->assign('MOD', $mod_strings);
352 $xtpl->assign('APP', $app_strings);
353 insert_popup_header();
356 echo "<table width='100%' cellpadding='0' cellspacing='0'><tr><td>";
357 echo getClassicModuleTitle($focus->module_dir, array(translate('LBL_MODULE_NAME', $focus->module_dir),$focus->name), false);
358 echo "</td><td align='right' class='moduleTitle'>";
359 echo "<A href='javascript:print();' class='utilsLink'><img src='".SugarThemeRegistry::current()->getImageURL("print.gif")."' width='13' height='13' alt='".$app_strings['LNK_PRINT']."' border='0' align='absmiddle'></a> <A href='javascript:print();' class='utilsLink'>".$app_strings['LNK_PRINT']."</A>\n";
360 echo "</td></tr></table>";
363 if (count($history_list) > 0) $history_list = array_csort($history_list, 'sort_value', SORT_DESC);
364 foreach($history_list as $activity)
366 $activity_fields = array(
367 'ID' => $activity['id'],
368 'NAME' => $activity['name'],
369 'MODULE' => $activity['module'],
370 'CONTACT_NAME' => $activity['contact_name'],
371 'CONTACT_ID' => $activity['contact_id'],
372 'PARENT_TYPE' => $activity['parent_type'],
373 'PARENT_NAME' => $activity['parent_name'],
374 'PARENT_ID' => $activity['parent_id'],
375 'DATE' => $activity['date_modified'],
376 'DESCRIPTION' => $activity['description'],
377 'DATE_TYPE' => $activity['date_type']
379 if (empty($activity['direction'])) {
380 $activity_fields['TYPE'] = $app_list_strings['activity_dom'][$activity['type']];
383 $activity_fields['TYPE'] = $app_list_strings['call_direction_dom'][$activity['direction']].' '.$app_list_strings['activity_dom'][$activity['type']];
386 switch ($activity['type']) {
388 $activity_fields['STATUS'] = $app_list_strings['call_status_dom'][$activity['status']];
391 $activity_fields['STATUS'] = $app_list_strings['meeting_status_dom'][$activity['status']];
394 $activity_fields['STATUS'] = $app_list_strings['task_status_dom'][$activity['status']];
398 if (isset($activity['location'])) $activity_fields['LOCATION'] = $activity['location'];
399 if (isset($activity['filename'])) {
400 $activity_fields['ATTACHMENT'] = "<a href='index.php?entryPoint=download&id=".$activity['id']."&type=Notes' target='_blank'>".SugarThemeRegistry::current()->getImage("attachment","alt='".$activity['filename']."' border='0' align='absmiddle'")."</a>";
403 if (isset($activity['parent_type'])) $activity_fields['PARENT_MODULE'] = $activity['parent_type'];
405 $xtpl->assign("ACTIVITY", $activity_fields);
406 $xtpl->assign("ACTIVITY_MODULE_PNG", SugarThemeRegistry::current()->getImage($activity_fields['MODULE'].'','border="0" alt="'.$activity_fields['NAME'].'"'));
410 //todo move to themes
411 $xtpl->assign("ROW_COLOR", 'oddListRow');
412 $xtpl->assign("BG_COLOR", $odd_bg);
416 //todo move to themes
417 $xtpl->assign("ROW_COLOR", 'evenListRow');
418 $xtpl->assign("BG_COLOR", $even_bg);
421 if(!empty($activity_fields['DESCRIPTION'])) {
422 $xtpl->parse("history.row.description");
424 $xtpl->parse("history.row");
427 $xtpl->parse("history");
428 $xtpl->out("history");
429 insert_popup_footer();
432 function getEmailDetails($email){
435 if(!empty($email->to_addrs)){
436 $details .= "To: ".$email->to_addrs."<br>";
438 if(!empty($email->from_addr)){
439 $details .= "From: ".$email->from_addr."<br>";
441 if(!empty($email->cc_addrs)){
442 $details .= "CC: ".$email->cc_addrs."<br>";
444 if(!empty($email->from_addr) || !empty($email->cc_addrs) || !empty($email->to_addrs)){
448 // cn: bug 8433 - history does not distinguish b/t text/html emails
449 $details .= empty($email->description_html)
450 ? $this->formatDescription($email->description)
451 : $this->formatDescription(strip_tags(br2nl(from_html($email->description_html))));
456 function getTaskDetails($task){
460 if (!empty($task->date_start) && $task->date_start != '0000-00-00') {
461 $details .= $app_strings['DATA_TYPE_START'].$task->date_start."<br>";
464 $details .= $this->formatDescription($task->description);
469 function formatDescription($description){
470 return nl2br($description);
472 } // end of class Popup_Picker