]> CyberLeo.Net >> Repos - Github/sugarcrm.git/blob - modules/ProjectTask/ProjectTask.php
Release 6.2.4
[Github/sugarcrm.git] / modules / ProjectTask / ProjectTask.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-2011 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
43
44
45
46
47
48
49
50 class ProjectTask extends SugarBean {
51         // database table columns
52         var $id;
53         var $date_entered;
54         var $date_modified;
55         //var $assigned_user_id;
56         //var $modified_user_id;
57         //var $created_by;
58         var $name;
59     var $description;
60     var $project_id;
61     var $project_task_id;
62     var $date_start;
63     var $date_finish;
64     var $duration;
65     var $duration_unit;
66     var $percent_complete;
67     var $parent_task_id;
68     var $predecessors;
69     var $priority;
70
71         // related information
72         var $assigned_user_name;
73         var $parent_name;
74         var $depends_on_name;
75         var $email_id;
76
77         var $table_name = 'project_task';
78         var $object_name = 'ProjectTask';
79         var $module_dir = 'ProjectTask';
80
81         var $field_name_map;
82         var $new_schema = true;
83
84         var $relationship_fields = array(
85                 'email_id' => 'emails',
86         );
87
88         //////////////////////////////////////////////////////////////////
89         // METHODS
90         //////////////////////////////////////////////////////////////////
91
92         /*
93          *
94          */
95         function ProjectTask($init=true)
96         {
97                 parent::SugarBean();
98                 if ($init) {
99                         // default value for a clean instantiation
100                         $this->utilization = 100;
101         
102                         global $current_user;
103                         if(empty($current_user))
104                         {
105                                 $this->assigned_user_id = 1;
106                                 $admin_user = new User();
107                                 $admin_user->retrieve($this->assigned_user_id);
108                                 $this->assigned_user_name = $admin_user->user_name;
109                         }
110                         else
111                         {
112                                 $this->assigned_user_id = $current_user->id;
113                                 $this->assigned_user_name = $current_user->user_name;
114                         }
115                         
116                 }
117         }
118         
119         function save($check_notify = FALSE){
120                 $id = parent::save($check_notify);
121         $this->updateParentProjectTaskPercentage();
122         return $id;
123         }
124         
125         /**
126          * overriding the base class function to do a join with users table
127          */
128
129         /*
130          *
131          */
132    function fill_in_additional_detail_fields()
133    {
134       $this->assigned_user_name = get_assigned_user_name($this->assigned_user_id);
135       $this->project_name = $this->_get_project_name($this->project_id);
136                 /*
137         $this->depends_on_name = $this->_get_depends_on_name($this->depends_on_id);
138                 if(empty($this->depends_on_name))
139                 {
140                         $this->depends_on_id = '';
141                 }
142                 $this->parent_name = $this->_get_parent_name($this->parent_id);
143                 if(empty($this->parent_name))
144                 {
145                         $this->parent_id = '';
146                 }
147         */
148    }
149
150         /*
151          *
152          */
153    function fill_in_additional_list_fields()
154    {
155       $this->assigned_user_name = get_assigned_user_name($this->assigned_user_id);
156       //$this->parent_name = $this->_get_parent_name($this->parent_id);
157       $this->project_name = $this->_get_project_name($this->project_id);
158    }
159
160         /*
161          *
162          */
163         function get_summary_text()
164         {
165                 return $this->name;
166         }
167
168         /*
169          *
170          */
171         function _get_depends_on_name($depends_on_id)
172         {
173                 $return_value = '';
174
175                 $query  = "SELECT name, assigned_user_id FROM {$this->table_name} WHERE id='{$depends_on_id}'";
176                 $result = $this->db->query($query,true," Error filling in additional detail fields: ");
177                 $row = $this->db->fetchByAssoc($result);
178                 if($row != null)
179                 {
180                         $this->depends_on_name_owner = $row['assigned_user_id'];
181                         $this->depends_on_name_mod = 'ProjectTask';
182                         $return_value = $row['name'];
183                 }
184
185                 return $return_value;
186         }
187
188     function _get_project_name($project_id)
189     {
190         $return_value = '';
191
192         $query  = "SELECT name, assigned_user_id FROM project WHERE id='{$project_id}'";
193         $result = $this->db->query($query,true," Error filling in additional detail fields: ");
194         $row = $this->db->fetchByAssoc($result);
195         if($row != null)
196         {
197             //$this->parent_name_owner = $row['assigned_user_id'];
198             //$this->parent_name_mod = 'Project';
199             $return_value = $row['name'];
200         }
201
202         return $return_value;
203     }
204         /*
205          *
206          */
207         function _get_parent_name($parent_id)
208         {
209                 $return_value = '';
210
211                 $query  = "SELECT name, assigned_user_id FROM project WHERE id='{$parent_id}'";
212                 $result = $this->db->query($query,true," Error filling in additional detail fields: ");
213                 $row = $this->db->fetchByAssoc($result);
214                 if($row != null)
215                 {
216                         $this->parent_name_owner = $row['assigned_user_id'];
217                         $this->parent_name_mod = 'Project';
218                         $return_value = $row['name'];
219                 }
220
221                 return $return_value;
222         }
223
224         /*
225          *
226          */
227         function build_generic_where_clause ($the_query_string)
228         {
229                 $where_clauses = array();
230                 $the_query_string = $GLOBALS['db']->quote($the_query_string);
231                 array_push($where_clauses, "project_task.name like '$the_query_string%'");
232
233                 $the_where = "";
234                 foreach($where_clauses as $clause)
235                 {
236                         if($the_where != "") $the_where .= " or ";
237                         $the_where .= $clause;
238                 }
239
240                 return $the_where;
241         }
242
243         function get_list_view_data(){
244                 global $action, $currentModule, $focus, $current_module_strings, $app_list_strings, $timedate, $locale;
245                 $today = $timedate->handle_offset(date($GLOBALS['timedate']->get_db_date_time_format(), time()), $timedate->dbDayFormat, true);
246                 $task_fields =$this->get_list_view_array();
247                 //$date_due = $timedate->to_db_date($task_fields['DATE_DUE'],false);
248         if (isset($this->parent_type)) 
249                         $task_fields['PARENT_MODULE'] = $this->parent_type;
250                 /*
251         if ($this->status != "Completed" && $this->status != "Deferred" ) {
252                         $task_fields['SET_COMPLETE'] = "<a href='index.php?return_module=$currentModule&return_action=$action&return_id=" . ((!empty($focus->id)) ? $focus->id : "") . "&module=ProjectTask&action=EditView&record={$this->id}&status=Completed'>".SugarThemeRegistry::current()->getImage("close_inline","alt='Close' border='0'")."</a>";
253                 }
254         
255                 if( $date_due   < $today){
256                         $task_fields['DATE_DUE']= "<font class='overdueTask'>".$task_fields['DATE_DUE']."</font>";
257                 }else if( $date_due     == $today ){
258                         $task_fields['DATE_DUE'] = "<font class='todaysTask'>".$task_fields['DATE_DUE']."</font>";
259                 }else{
260                         $task_fields['DATE_DUE'] = "<font class='futureTask'>".$task_fields['DATE_DUE']."</font>";
261                 }
262         */
263
264         if ( !isset($task_fields["FIRST_NAME"]) )
265             $task_fields["FIRST_NAME"] = '';
266         if ( !isset($task_fields["LAST_NAME"]) )
267             $task_fields["LAST_NAME"] = '';
268                 $task_fields['CONTACT_NAME']= $locale->getLocaleFormattedName($task_fields["FIRST_NAME"],$task_fields["LAST_NAME"]);
269                 $task_fields['TITLE'] = '';
270                 if (!empty($task_fields['CONTACT_NAME'])) {
271                         $task_fields['TITLE'] .= $current_module_strings['LBL_LIST_CONTACT'].": ".$task_fields['CONTACT_NAME'];
272                 }
273
274                 return $task_fields;
275         }
276         
277         function bean_implements($interface){
278                 switch($interface){
279                         case 'ACL':return true;
280                 }
281                 return false;
282         }
283         function listviewACLHelper(){
284                 $array_assign = parent::listviewACLHelper();
285                 $is_owner = false;
286                 if(!empty($this->parent_name)){
287                         
288                         if(!empty($this->parent_name_owner)){
289                                 global $current_user;
290                                 $is_owner = $current_user->id == $this->parent_name_owner;
291                         }
292                 }
293                         if(ACLController::checkAccess('Project', 'view', $is_owner)){
294                                 $array_assign['PARENT'] = 'a';
295                         }else{
296                                 $array_assign['PARENT'] = 'span';
297                         }
298                 $is_owner = false;
299                 if(!empty($this->depends_on_name)){
300                         
301                         if(!empty($this->depends_on_name_owner)){
302                                 global $current_user;
303                                 $is_owner = $current_user->id == $this->depends_on_name_owner;
304                         }
305                 }
306                         if( ACLController::checkAccess('ProjectTask', 'view', $is_owner)){
307                                 $array_assign['PARENT_TASK'] = 'a';
308                         }else{
309                                 $array_assign['PARENT_TASK'] = 'span';
310                         }
311                 
312                 return $array_assign;
313         }
314         
315     function create_export_query(&$order_by, &$where, $relate_link_join='')
316     {
317         $custom_join = $this->custom_fields->getJOIN(true, true,$where);
318                 if($custom_join)
319                                 $custom_join['join'] .= $relate_link_join;
320                 $query = "SELECT
321                                 project_task.*,
322                 users.user_name as assigned_user_name ";
323         if($custom_join){
324                         $query .=  $custom_join['select'];
325                 }
326         $query .= " FROM project_task ";
327         
328                 if($custom_join){
329                         $query .=  $custom_join['join'];
330                 }
331         $query .= " LEFT JOIN users
332                         ON project_task.assigned_user_id=users.id ";
333
334         $where_auto = " project_task.deleted=0 ";
335
336         if($where != "")
337                 $query .= "where ($where) AND ".$where_auto;
338         else
339             $query .= "where ".$where_auto;
340
341         if(!empty($order_by)){
342                 //check to see if order by variable already has table name by looking for dot "."
343                 $table_defined_already = strpos($order_by, ".");
344
345                 if($table_defined_already === false){
346                         //table not defined yet, define accounts to avoid "ambigous column" SQL error 
347                         $query .= " ORDER BY $order_by";
348                 }else{
349                         //table already defined, just add it to end of query
350                     $query .= " ORDER BY $order_by";    
351                 }           
352         }
353         return $query;
354     }
355
356
357         public function updateParentProjectTaskPercentage()
358         {
359                 if (empty($this->parent_task_id))
360                 {
361                         return;
362                 }
363                 $projectId = $this->project_id;
364                 if (!empty($projectId))
365                 {
366                         $project = new Project();
367                         $project->retrieve($projectId);
368                         $projectTasks = $project->getAllProjectTasks();
369                         $dependentTaskId = $this->parent_task_id;
370                         $collectPercentage = 0;
371                         $parentProjectTask = false;
372                         foreach ($projectTasks as $key => $value)
373                         {
374                                 if ($value->project_task_id == $dependentTaskId)
375                                 {
376                                         $parentProjectTask = $value;
377                                         continue;
378                                 }
379                                 $collectPercentage += $value->percent_complete;
380                         }
381                         if ($parentProjectTask)
382                         {
383                                 $parentProjectTask->percent_complete = round($collectPercentage / (count($projectTasks) - 1));
384                                 $parentProjectTask->save(isset($GLOBALS['check_notify']) ? $GLOBALS['check_notify'] : '');
385                         }
386                 }
387         }
388 }
389
390 function getUtilizationDropdown($focus, $field, $value, $view) {
391         global $app_list_strings;       
392
393         if($view == 'EditView') {
394                 global $app_list_strings;
395         $html = '<select name="'.$field.'">';
396         $html .= get_select_options_with_id($app_list_strings['project_task_utilization_options'], $value);
397         $html .= '</select>';
398         return $html;
399     }
400        
401     return translate('project_task_utilization_options', '', $focus->$field);    
402 }       
403 ?>