]> CyberLeo.Net >> Repos - Github/sugarcrm.git/blob - modules/Calendar/Calendar.php
Release 6.5.0beta4
[Github/sugarcrm.git] / modules / Calendar / Calendar.php
1 <?php
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-2012 SugarCRM Inc.
6  * 
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.
13  * 
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
17  * details.
18  * 
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
22  * 02110-1301 USA.
23  * 
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.
26  * 
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.
30  * 
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  ********************************************************************************/
37
38
39
40
41
42 require_once('include/utils/activity_utils.php');
43 require_once('modules/Calendar/CalendarUtils.php');
44 require_once('modules/Calendar/CalendarActivity.php');
45
46
47 class Calendar {
48         
49         public $view = 'week'; // current view
50         public $style; // calendar style (basic or advanced)
51         public $dashlet = false; // if is displayed in dashlet  
52         public $date_time; // current date
53         
54         public $show_tasks = true;
55         public $show_calls = true;
56         public $enable_repeat = true;   
57
58         public $time_step = 60; // time step of each slot in minutes
59                 
60         public $acts_arr = array(); // Array of activities objects      
61         public $items = array(); // Array of activities data to be displayed    
62         public $shared_ids = array(); // ids of users for shared view
63         
64         
65         public $cells_per_day; // entire 24h day count of slots         
66         public $grid_start_ts; // start timestamp of calendar grid
67         
68         public $day_start_time; // working day start time in format '11:00'
69         public $day_end_time; // working day end time in format '11:00'
70         public $scroll_slot; // first slot of working day
71         public $celcount; // count of slots in a working day    
72         
73         /**
74          * constructor
75          * @param string $view 
76          * @param array $time_arr 
77          */     
78         function __construct($view = "day", $time_arr = array()){
79                 global $current_user, $timedate;        
80                 
81                 $this->view = $view;            
82
83                 if(!in_array($this->view,array('day','week','month','year','shared')))
84                         $this->view = 'week';
85                 
86                 $date_arr = array();
87                 if(!empty($_REQUEST['day']))
88                         $_REQUEST['day'] = intval($_REQUEST['day']);
89                 if(!empty($_REQUEST['month']))
90                         $_REQUEST['month'] = intval($_REQUEST['month']);
91
92                 if (!empty($_REQUEST['day']))
93                         $date_arr['day'] = $_REQUEST['day'];
94                 if (!empty($_REQUEST['month']))
95                         $date_arr['month'] = $_REQUEST['month'];
96                 if (!empty($_REQUEST['week']))
97                         $date_arr['week'] = $_REQUEST['week'];
98
99                 if (!empty($_REQUEST['year'])){
100                         if ($_REQUEST['year'] > 2037 || $_REQUEST['year'] < 1970){
101                                 print("Sorry, calendar cannot handle the year you requested");
102                                 print("<br>Year must be between 1970 and 2037");
103                                 exit;
104                         }
105                         $date_arr['year'] = $_REQUEST['year'];
106                 }
107
108                 if(empty($_REQUEST['day']))
109                         $_REQUEST['day'] = "";
110                 if(empty($_REQUEST['week']))
111                         $_REQUEST['week'] = "";
112                 if(empty($_REQUEST['month']))
113                         $_REQUEST['month'] = "";
114                 if(empty($_REQUEST['year']))
115                         $_REQUEST['year'] = "";
116
117                 // if date is not set in request use current date
118                 if(empty($date_arr) || !isset($date_arr['year']) || !isset($date_arr['month']) || !isset($date_arr['day']) ){   
119                         $today = $timedate->getNow(true);
120                         $date_arr = array(
121                               'year' => $today->year,
122                               'month' => $today->month,
123                               'day' => $today->day,
124                         );
125                 }
126                 
127                 $current_date_db = $date_arr['year']."-".str_pad($date_arr['month'],2,"0",STR_PAD_LEFT)."-".str_pad($date_arr['day'],2,"0",STR_PAD_LEFT);
128                 $this->date_time = $GLOBALS['timedate']->fromString($current_date_db);  
129                                 
130                 $this->show_tasks = $current_user->getPreference('show_tasks');
131                 if(is_null($this->show_tasks))
132                         $this->show_tasks = SugarConfig::getInstance()->get('calendar.show_tasks_by_default',true);             
133                 $this->show_calls = $current_user->getPreference('show_calls');
134                 if(is_null($this->show_calls))
135                         $this->show_calls = SugarConfig::getInstance()->get('calendar.show_calls_by_default',true);
136                         
137                 $this->enable_repeat = SugarConfig::getInstance()->get('calendar.enable_repeat',true);  
138
139                 if(in_array($this->view,array('month','shared','year'))){
140                         $this->style = "basic"; 
141                 }else{
142                         $displayTimeslots = $GLOBALS['current_user']->getPreference('calendar_display_timeslots');
143                         if (is_null($displayTimeslots)) {
144                                 $displayTimeslots = SugarConfig::getInstance()->get('calendar.display_timeslots', true);
145                         }
146                         if ($displayTimeslots) {
147                                 $this->style = "advanced";
148                         } else {
149                                 $this->style = "basic";
150                         }
151                 }
152                 
153                 $this->day_start_time = $current_user->getPreference('day_start_time');
154                 if(is_null($this->day_start_time))
155                         $this->day_start_time = SugarConfig::getInstance()->get('calendar.default_day_start',"08:00");
156                 $this->day_end_time = $current_user->getPreference('day_end_time');
157                 if(is_null($this->day_end_time))
158                         $this->day_end_time = SugarConfig::getInstance()->get('calendar.default_day_end',"19:00");
159                         
160                 if($this->view == "day"){
161                         $this->time_step = SugarConfig::getInstance()->get('calendar.day_timestep',15);
162                 }else if($this->view == "week" || $this->view == "shared"){
163                         $this->time_step = SugarConfig::getInstance()->get('calendar.week_timestep',30);
164                 }else if($this->view == "month"){
165                         $this->time_step = SugarConfig::getInstance()->get('calendar.month_timestep',60);
166                 }else{
167                         $this->time_step = 60;
168                 }
169                 $this->cells_per_day = 24 * (60 / $this->time_step);            
170                 $this->calculate_grid_start_ts();
171                 $this->calculate_day_range();           
172         }
173         
174         /**
175          * Load activities data to array
176          */             
177         public function load_activities(){
178                 $field_list = CalendarUtils::get_fields();
179                 
180                 foreach($this->acts_arr as $user_id => $acts){  
181                         foreach($acts as $act){
182                                                                                         
183                                         $item = array();
184                                         $item['user_id'] = $user_id;
185                                         $item['module_name'] = $act->sugar_bean->module_dir;
186                                         $item['type'] = strtolower($act->sugar_bean->object_name);
187                                         $item['assigned_user_id'] = $act->sugar_bean->assigned_user_id;
188                                         $item['record'] = $act->sugar_bean->id;         
189                                         $item['name'] = $act->sugar_bean->name;
190                                         
191                                         if(isset($act->sugar_bean->duration_hours)){
192                                                 $item['duration_hours'] = $act->sugar_bean->duration_hours;
193                                                 $item['duration_minutes'] = $act->sugar_bean->duration_minutes;
194                                         }                               
195                                                                 
196                                         $item['detail'] = 0;
197                                         $item['edit'] = 0;
198                                         
199                                         if($act->sugar_bean->ACLAccess('DetailView'))
200                                                 $item['detail'] = 1;                                            
201                                         if($act->sugar_bean->ACLAccess('Save'))
202                                                 $item['edit'] = 1;                                      
203                                                 
204                                         if(empty($act->sugar_bean->id)){
205                                                 $item['detail'] = 0;
206                                                 $item['edit'] = 0;
207                                         }
208                                         
209                                         if(!empty($act->sugar_bean->repeat_parent_id))
210                                                 $item['repeat_parent_id'] = $act->sugar_bean->repeat_parent_id;                                 
211                                         
212                                         if($item['detail'] == 1){
213                                                 if(isset($field_list[$item['module_name']])){
214                                                         foreach($field_list[$item['module_name']] as $field){
215                                                                 if(!isset($item[$field])){
216                                                                         $item[$field] = $act->sugar_bean->$field;
217                                                                         if(empty($item[$field]))
218                                                                                 $item[$field] = "";
219                                                                 }
220                                                         }                                       
221                                                 }                               
222                                         }
223                                         
224                                         if(!isset($item['duration_hours']) || empty($item['duration_hours']))
225                                                 $item['duration_hours'] = 0;
226                                         if(!isset($item['duration_minutes']) || empty($item['duration_minutes']))
227                                                 $item['duration_minutes'] = 0;  
228                                                 
229                                         $item = array_merge($item,CalendarUtils::get_time_data($act->sugar_bean));                      
230                         
231                                         $this->items[] = $item;
232                         }
233                 }
234         }       
235         
236         /**
237          * initialize ids of shared users
238          */     
239         public function init_shared(){
240                 global $current_user;
241                 
242                 
243                 $user_ids = $current_user->getPreference('shared_ids');
244                 if(!empty($user_ids) && count($user_ids) != 0 && !isset($_REQUEST['shared_ids'])) {
245                         $this->shared_ids = $user_ids;
246                 }else if(isset($_REQUEST['shared_ids']) && count($_REQUEST['shared_ids']) > 0){
247                         $this->shared_ids = $_REQUEST['shared_ids'];
248                         $current_user->setPreference('shared_ids', $_REQUEST['shared_ids']);
249                 }else{
250                         $this->shared_ids = array($current_user->id);                           
251                 }
252         }
253         
254         /**
255          * Calculate timestamp the calendar grid should be started from 
256          */
257         protected function calculate_grid_start_ts(){
258         
259                 if($this->view == "week" || $this->view == "shared"){
260                         $week_start = CalendarUtils::get_first_day_of_week($this->date_time);
261                         $this->grid_start_ts = $week_start->format('U') + $week_start->getOffset(); 
262                 }else if($this->view == "month"){
263                         $month_start = $this->date_time->get_day_by_index_this_month(0);
264                         $week_start = CalendarUtils::get_first_day_of_week($month_start);
265                         $this->grid_start_ts = $week_start->format('U') + $week_start->getOffset(); // convert to timestamp, ignore tz
266                 }else if($this->view == "day"){
267                         $this->grid_start_ts = $this->date_time->format('U') + $this->date_time->getOffset();
268                 }       
269         }
270         
271         /**
272          * calculate count of timeslots per visible day, calculates day start and day end in minutes 
273          */     
274         function calculate_day_range(){ 
275                 
276                 list($hour_start,$minute_start) =  explode(":",$this->day_start_time);          
277                 list($hour_end,$minute_end) =  explode(":",$this->day_end_time);
278                 $this->scroll_slot = intval($hour_start * (60 / $this->time_step) + ($minute_start / $this->time_step));
279                 $this->celcount = (($hour_end * 60 + $minute_end) - ($hour_start * 60 + $minute_start)) / $this->time_step;
280         }       
281         
282         /**
283          * loads array of objects
284          * @param User $user user object
285          * @param string $type
286          */     
287         public function add_activities($user,$type='sugar'){
288                 global $timedate;
289                 $start_date_time = $this->date_time;
290                 if($this->view == 'week' || $this->view == 'shared'){           
291                         $start_date_time = CalendarUtils::get_first_day_of_week($this->date_time);
292                         $end_date_time = $start_date_time->get("+7 days");
293                 }else if($this->view == 'month'){
294                         $start_date_time = $this->date_time->get_day_by_index_this_month(0);    
295                         $end_date_time = $start_date_time->get("+".$start_date_time->format('t')." days");
296                         $start_date_time = CalendarUtils::get_first_day_of_week($start_date_time);
297                         $end_date_time = CalendarUtils::get_first_day_of_week($end_date_time)->get("+7 days");
298                 }else{
299                         $end_date_time = $this->date_time->get("+1 day");
300                 }
301                 
302                 $start_date_time = $start_date_time->get("-5 days"); // 5 days step back to fetch multi-day activities that
303
304                 $acts_arr = array();
305                 if($type == 'vfb'){
306                                 $acts_arr = CalendarActivity::get_freebusy_activities($user, $start_date_time, $end_date_time);
307                 }else{
308                                 $acts_arr = CalendarActivity::get_activities($user->id, $this->show_tasks, $start_date_time, $end_date_time, $this->view,$this->show_calls);
309                 }
310                 
311                 $this->acts_arr[$user->id] = $acts_arr;  
312         }
313
314         /**
315          * Get date string of next or previous calendar grid
316          * @param string $direction next or previous
317          * @return string
318          */
319         public function get_neighbor_date_str($direction){
320                 if($direction == "previous")
321                         $sign = "-";
322                 else 
323                         $sign = "+";
324                         
325                 if($this->view == 'month'){
326             $day = $this->date_time->get_day_by_index_this_month(0)->get($sign."1 month")->get_day_begin(1);
327                 }else if($this->view == 'week' || $this->view == 'shared'){
328                         $day = CalendarUtils::get_first_day_of_week($this->date_time);
329                         $day = $day->get($sign."7 days");
330                 }else if($this->view == 'day'){
331                         $day = $this->date_time->get($sign."1 day")->get_day_begin();
332                 }else if($this->view == 'year'){
333                         $day = $this->date_time->get($sign."1 year")->get_day_begin();
334                 }else{
335                         return "get_neighbor_date_str: notdefined for this view";
336                 }
337                 return $day->get_date_str();
338         }
339
340 }
341
342 ?>