]> CyberLeo.Net >> Repos - Github/sugarcrm.git/blob - include/generic/SugarWidgets/SugarWidgetFielddatetime.php
Release 6.5.15
[Github/sugarcrm.git] / include / generic / SugarWidgets / SugarWidgetFielddatetime.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-2013 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 class SugarWidgetFieldDateTime extends SugarWidgetReportField
42 {
43         var $reporter;
44         var $assigned_user=null;
45
46     function SugarWidgetFieldDateTime($layout_manager)
47     {
48         parent::SugarWidgetReportField($layout_manager);
49     }
50
51         // get the reporter attribute
52     // deprecated, now called in the constructor
53     /**
54      * @deprecated
55      */
56         function getReporter() {
57         }
58
59         // get the assigned user of the report
60         function getAssignedUser()
61         {
62                 $json_obj = getJSONobj();
63
64                 $report_def_str = $json_obj->decode($this->reporter->report_def_str);
65
66                 if(empty($report_def_str['assigned_user_id'])) return null;
67
68                 $this->assigned_user = new User();
69                 $this->assigned_user->retrieve($report_def_str['assigned_user_id']);
70                 return $this->assigned_user;
71         }
72
73         function queryFilterOn($layout_def)
74         {
75                 global $timedate;
76         $begin = $layout_def['input_name0'];
77         $hasTime = $this->hasTime($begin);
78         $date = $timedate->fromString($begin);
79
80         if (!$hasTime) {
81             return $this->queryDay(
82                 $layout_def,
83                 $date
84             );
85         }
86
87         return $this->queryDateOp(
88             $this->_get_column_select($layout_def),
89             $date,
90             '=',
91             "datetime"
92         );
93         }
94
95     /**
96      * expandDate
97      *
98      * This function helps to convert a date only value to have a time value as well.  It first checks
99      * to see if a time value exists.  If a time value exists, the function just returns the date value
100      * passed in.  If the date value is the 'Today' macro then some special processing occurs as well.
101      * Finally the time portion is applied depending on whether or not this date should be for the end
102      * in which case the 23:59:59 time value is applied otherwise 00:00:00 is used.
103      *
104      * @param $date String value of the date value to expand
105      * @param bool $end Boolean value indicating whether or not this is for an end time period or not
106      * @return $date TimeDate object with time value applied
107      */
108         protected function expandDate($date, $end = false)
109         {
110             global $timedate;
111             if($this->hasTime($date)) {
112                 return $date;
113             }
114
115         //C.L. Bug 48616 - If the $date is set to the Today macro, then adjust accordingly
116         if(strtolower($date) == 'today')
117         {
118            $startEnd = $timedate->getDayStartEndGMT($timedate->getNow(true));
119            return $end ? $startEnd['end'] : $startEnd['start'];
120         }
121
122         $parsed = $timedate->fromDbDate($date);
123         $date = $timedate->tzUser(new SugarDateTime());
124         $date->setDate($parsed->year, $parsed->month, $parsed->day);
125
126             if($end) {
127                 return $date->setTime(23, 59, 59);
128             } else {
129                 return $date->setTime(0, 0, 0);
130             }
131         }
132
133         function queryFilterBefore($layout_def)
134         {
135         $begin = $this->expandDate($layout_def['input_name0']);
136         return $this->queryDateOp($this->_get_column_select($layout_def), $begin, '<', "datetime");
137         }
138
139         function queryFilterAfter($layout_def)
140         {
141         $begin = $this->expandDate($layout_def['input_name0'], true);
142         return $this->queryDateOp($this->_get_column_select($layout_def), $begin, '>', "datetime");
143         }
144
145         function queryFilterBetween_Dates($layout_def)
146         {
147         $begin = $this->expandDate($layout_def['input_name0']);
148         $end = $this->expandDate($layout_def['input_name1'], true);
149         $column = $this->_get_column_select($layout_def);
150             return "(".$this->queryDateOp($column, $begin, ">=", "datetime")." AND ".
151             $this->queryDateOp($column, $end, "<=", "datetime").")\n";
152         }
153
154         function queryFilterNot_Equals_str($layout_def)
155         {
156                 global $timedate;
157
158         $column = $this->_get_column_select($layout_def);
159         $begin = $layout_def['input_name0'];
160         $hasTime = $this->hasTime($begin);
161         if(!$hasTime){
162             $end = $this->expandDate($begin, true);
163             $begin = $this->expandDate($begin);
164             $cond = $this->queryDateOp($column, $begin, "<", "datetime")." OR ".
165                 $this->queryDateOp($column, $end, ">", "datetime");
166         } else {
167             $cond =  $this->queryDateOp($column, $begin, "!=", "datetime");
168         }
169         return "($column IS NULL OR $cond)";
170         }
171
172     /**
173      * Get assigned or logged in user's current date and time value.
174      * @param boolean $timestamp Format of return value, if set to true, return unix like timestamp , else a formatted date.
175      */
176         function get_users_current_date_time($timestamp=false)
177         {
178                 global $current_user;
179         global $timedate;
180
181         $begin = TimeDate::getInstance()->nowDb();
182         //kbrill bug #13884
183         //$begin = $timedate->to_display_date_time($begin,true,true,$this->assigned_user);
184                 $begin = $timedate->handle_offset($begin, $timedate->get_db_date_time_format(), false, $this->assigned_user);
185
186         if (!$timestamp) {
187                 return $begin;
188         } else {
189                 $begin_parts = explode(' ', $begin);
190                 $date_parts=explode('-', $begin_parts[0]);
191                 $time_parts=explode(':', $begin_parts[1]);
192                 $curr_timestamp=mktime($time_parts[0],$time_parts[1],0,$date_parts[1], $date_parts[2],$date_parts[0]);
193                 return $curr_timestamp;
194         }
195
196         }
197         /**
198          * Get specified date and time for a particalur day, in current user's timezone.
199          * @param int $days Adjust date by this number of days, negative values are valid.
200          * @param time string falg for desired time value, start: minimum time, end: maximum time, default: current time
201          */
202         function get_db_date($days,$time) {
203         global $timedate;
204
205         $begin = date($GLOBALS['timedate']->get_db_date_time_format(), time()+(86400 * $days));  //gmt date with day adjustment applied.
206         //kbrill bug #13884
207         //$begin = $timedate->to_display_date_time($begin,true,true,$this->assigned_user);
208                 $begin = $timedate->handle_offset($begin, $timedate->get_db_date_time_format(), false, $this->assigned_user);
209
210         if ($time=='start') {
211             $begin_parts = explode(' ', $begin);
212             $be = $begin_parts[0] . ' 00:00:00';
213         }
214         else if ($time=='end') {
215             $begin_parts = explode(' ', $begin);
216             $be = $begin_parts[0] . ' 23:59:59';
217         } else {
218             $be=$begin;
219         }
220
221         //convert date to db format without converting to GMT.
222         $begin = $timedate->handle_offset($be, $timedate->get_db_date_time_format(), false, $this->assigned_user);
223
224         return $begin;
225         }
226
227         /**
228          * Get filter string for a date field.
229          * @param array layout_def field def for field being filtered
230          * @param string $begin start date value (in DB format)
231          * @param string $end End date value (in DB format)
232          */
233         function get_start_end_date_filter(& $layout_def, $begin,$end)
234         {
235             if (isset ($layout_def['rel_field'])) {
236                 $field_name = $this->reporter->db->convert(
237                     $this->reporter->db->convert($this->_get_column_select($layout_def), 'date_format', '%Y-%m-%d'),
238                     "CONCAT",
239                     array("' '", $this->reporter->db->convert($layout_def['rel_field'], 'time_format'))
240                 );
241             } else {
242                $field_name = $this->_get_column_select($layout_def);
243             }
244             return $field_name.">=".$this->reporter->db->quoted($begin)." AND ".$field_name."<=".$this->reporter->db->quoted($end)."\n";
245         }
246
247         /**
248          * Create query for binary operation of field of certain type
249          * Produces query like:
250          * arg1 op to_date(arg2), e.g.:
251          *              date_closed < '2009-12-01'
252          * @param string $arg1 1st arg - column name
253          * @param string|DateTime $arg2 2nd arg - value to be converted
254          * @param string $op
255          * @param string $type
256          */
257     protected function queryDateOp($arg1, $arg2, $op, $type)
258     {
259         global $timedate;
260         if($arg2 instanceof DateTime) {
261             $arg2 = $timedate->asDbType($arg2, $type);
262         }
263         return "$arg1 $op ".$this->reporter->db->convert($this->reporter->db->quoted($arg2), $type)."\n";
264     }
265
266     /**
267      * Return current date in required user's TZ
268      * @return SugarDateTime
269      */
270     protected function now()
271     {
272         global $timedate;
273         return $timedate->tzUser($timedate->getNow(), $this->getAssignedUser());
274     }
275
276         /**
277      * Create query from the beginning to the end of certain day
278      * @param array $layout_def
279      * @param SugarDateTime $day
280      */
281     protected function queryDay($layout_def, SugarDateTime $day)
282     {
283         $begin = $day->get_day_begin();
284         $end = $day->get_day_end();
285         return $this->get_start_end_date_filter($layout_def,$begin->asDb(),$end->asDb());
286     }
287
288         function queryFilterTP_yesterday($layout_def)
289         {
290                 global $timedate;
291                 return $this->queryDay($layout_def, $this->now()->get("-1 day"));
292         }
293
294         function queryFilterTP_today($layout_def)
295         {
296                 global $timedate;
297                 return $this->queryDay($layout_def, $this->now());
298         }
299
300         function queryFilterTP_tomorrow(& $layout_def)
301         {
302                 global $timedate;
303                 return $this->queryDay($layout_def, $this->now()->get("+1 day"));
304         }
305
306         function queryFilterTP_last_7_days($layout_def)
307         {
308                 global $timedate;
309
310                 $begin = $this->now()->get("-6 days")->get_day_begin();
311                 $end = $this->now()->get_day_end();
312
313                 return $this->get_start_end_date_filter($layout_def,$begin->asDb(),$end->asDb());
314         }
315
316         function queryFilterTP_next_7_days($layout_def)
317         {
318                 global $timedate;
319
320                 $begin = $this->now()->get_day_begin();
321                 $end = $this->now()->get("+6 days")->get_day_end();
322
323                 return $this->get_start_end_date_filter($layout_def,$begin->asDb(),$end->asDb());
324         }
325
326     /**
327      * Create query from the beginning to the end of certain month
328      * @param array $layout_def
329      * @param SugarDateTime $month
330      */
331     protected function queryMonth($layout_def, $month)
332     {
333         $begin = $month->setTime(0, 0, 0);
334         $end = clone($begin);
335                 $end->setDate($begin->year, $begin->month, $begin->days_in_month)->setTime(23, 59, 59);
336         return $this->get_start_end_date_filter($layout_def,$begin->asDb(),$end->asDb());
337     }
338
339     function queryFilterTP_last_month($layout_def)
340         {
341                 global $timedate;
342                 $month = $this->now();
343                 return $this->queryMonth($layout_def, $month->setDate($month->year, $month->month-1, 1));
344         }
345
346         function queryFilterTP_this_month($layout_def)
347         {
348                 global $timedate;
349
350         //Bug 62414 - take timezone into account when determining current month
351         $now = $this->now();
352         $timezoneOffset = $timedate->getUserUTCOffset();
353         $timezoneOffset = "$timezoneOffset minutes";
354         $now->modify($timezoneOffset);
355
356         return $this->queryMonth($layout_def, $now->get_day_by_index_this_month(0));
357         }
358
359         function queryFilterTP_next_month($layout_def)
360         {
361                 global $timedate;
362                 $month = $this->now();
363                 return $this->queryMonth($layout_def, $month->setDate($month->year, $month->month+1, 1));
364         }
365
366         function queryFilterTP_last_30_days($layout_def)
367         {
368                 global $timedate;
369                 $begin = $this->now()->get("-29 days")->get_day_begin();
370                 $end = $this->now()->get_day_end();
371                 return $this->get_start_end_date_filter($layout_def,$begin->asDb(),$end->asDb());
372         }
373
374         function queryFilterTP_next_30_days($layout_def)
375         {
376                 global $timedate;
377                 $begin = $this->now()->get_day_begin();
378                 $end = $this->now()->get("+29 days")->get_day_end();
379                 return $this->get_start_end_date_filter($layout_def,$begin->asDb(),$end->asDb());
380         }
381
382
383         function queryFilterTP_this_quarter($layout_def)
384         {
385                 global $timedate;
386                 $begin = $this->now();
387                 $begin->setDate($begin->year, floor(($begin->month-1)/3)*3+1, 1)->setTime(0, 0);
388                 $end = $begin->get("+3 month")->setTime(23, 59, 59);
389                 return $this->get_start_end_date_filter($layout_def,$begin->asDb(),$end->asDb());
390         }
391
392         function queryFilterTP_last_year($layout_def)
393         {
394                 global $timedate;
395                 $begin = $this->now();
396                 $begin->setDate($begin->year-1, 1, 1)->setTime(0, 0);
397                 $end = clone $begin;
398                 $end->setDate($end->year, 12, 31)->setTime(23, 59, 59);
399                 return $this->get_start_end_date_filter($layout_def,$begin->asDb(),$end->asDb());
400         }
401
402         function queryFilterTP_this_year($layout_def)
403         {
404                 global $timedate;
405                 $begin = $this->now();
406                 $begin->setDate($begin->year, 1, 1)->setTime(0, 0);
407                 $end = clone $begin;
408                 $end->setDate($end->year, 12, 31)->setTime(23, 59, 59);
409                 return $this->get_start_end_date_filter($layout_def,$begin->asDb(),$end->asDb());
410         }
411
412         function queryFilterTP_next_year(& $layout_def)
413         {
414                 global $timedate;
415                 $begin = $this->now();
416                 $begin->setDate($begin->year+1, 1, 1)->setTime(0, 0);
417                 $end = clone $begin;
418                 $end->setDate($end->year, 12, 31)->setTime(23, 59, 59);
419                 return $this->get_start_end_date_filter($layout_def,$begin->asDb(),$end->asDb());
420         }
421
422         function queryGroupBy($layout_def)
423         {
424                 // i guess qualifier and column_function are the same..
425                 if (!empty ($layout_def['qualifier'])) {
426                         $func_name = 'queryGroupBy'.$layout_def['qualifier'];
427                         if (method_exists($this, $func_name)) {
428                                 return $this-> $func_name ($layout_def)." \n";
429                         }
430                 }
431                 return parent :: queryGroupBy($layout_def)." \n";
432         }
433
434         function queryOrderBy($layout_def)
435         {
436         if (!empty ($layout_def['qualifier'])) {
437                         $func_name ='queryOrderBy'.$layout_def['qualifier'];
438                         if (method_exists($this, $func_name)) {
439                                 return $this-> $func_name ($layout_def)."\n";
440                         }
441                 }
442                 $order_by = parent :: queryOrderBy($layout_def)."\n";
443                 return $order_by;
444         }
445
446     function displayListPlain($layout_def) {
447         global $timedate;
448         $content = parent:: displayListPlain($layout_def);
449         // awu: this if condition happens only in Reports where group by month comes back as YYYY-mm format
450         if (count(explode('-',$content)) == 2){
451             return $content;
452         // if date field
453         }elseif(substr_count($layout_def['type'], 'date') > 0){
454             // if date time field
455             if(substr_count($layout_def['type'], 'time') > 0 && $this->get_time_part($content)!= false){
456                 $td = $timedate->to_display_date_time($content);
457                 return $td;
458             }else{// if date only field
459                 $td = $timedate->to_display_date($content, false); // Avoid PHP notice of returning by reference.
460                 return $td;
461             }
462         }
463     }
464
465     function get_time_part($date_time_value)
466     {
467         global $timedate;
468
469         $date_parts=$timedate->split_date_time($date_time_value);
470         if (count($date_parts) > 1) {
471             return $date_parts[1];
472         } else {
473             return false;
474         }
475     }
476
477     function displayList($layout_def) {
478         global $timedate;
479         // i guess qualifier and column_function are the same..
480         if (!empty ($layout_def['column_function'])) {
481             $func_name = 'displayList'.$layout_def['column_function'];
482             if (method_exists($this, $func_name)) {
483                 return $this-> $func_name ($layout_def);
484             }
485         }
486         $content = parent :: displayListPlain($layout_def);
487         return $timedate->to_display_date_time($content);
488     }
489
490         function querySelect(& $layout_def) {
491                 // i guess qualifier and column_function are the same..
492                 if (!empty ($layout_def['column_function'])) {
493                         $func_name = 'querySelect'.$layout_def['column_function'];
494                         if (method_exists($this, $func_name)) {
495                                 return $this-> $func_name ($layout_def)." \n";
496                         }
497                 }
498                 return parent :: querySelect($layout_def)." \n";
499         }
500         function & displayListday(& $layout_def) {
501         $value = parent:: displayListPlain($layout_def);
502         return $value;
503         }
504
505         function & displayListyear(& $layout_def) {
506                 global $app_list_strings;
507         $value = parent:: displayListPlain($layout_def);
508         return $value;
509         }
510
511         function displayListmonth($layout_def)
512         {
513                 global $app_list_strings;
514                 $display = '';
515                 $match = array();
516         if (preg_match('/(\d{4})-(\d\d)/', $this->displayListPlain($layout_def), $match)) {
517                         $match[2] = preg_replace('/^0/', '', $match[2]);
518                         $display = $app_list_strings['dom_cal_month_long'][$match[2]]." {$match[1]}";
519                 }
520                 return $display;
521
522         }
523
524     /**
525      * Returns part of query for select
526      *
527      * @param array $layout_def for field
528      * @return string part of select query with year & month only
529      */
530     function querySelectmonth($layout_def)
531     {
532         $return = $this->_get_column_select($layout_def);
533         if ($layout_def['type'] == 'datetime')
534         {
535             $return = $this->reporter->db->convert($return, 'add_tz_offset');
536         }
537         return $this->reporter->db->convert($return, "date_format", array('%Y-%m')) . ' ' . $this->_get_column_alias($layout_def) . "\n";
538     }
539
540     /**
541      * Returns part of query for group by
542      *
543      * @param array $layout_def for field
544      * @return string part of group by query with year & month only
545      */
546     function queryGroupByMonth($layout_def)
547     {
548         $return = $this->_get_column_select($layout_def);
549         if ($layout_def['type'] == 'datetime')
550         {
551             $return = $this->reporter->db->convert($return, 'add_tz_offset');
552         }
553         return $this->reporter->db->convert($return, "date_format", array('%Y-%m')) . "\n";
554     }
555
556     /**
557      * For oracle we have to return order by string like group by string instead of return field alias
558      *
559      * @param array $layout_def definition of field
560      * @return string order by string for field
561      */
562     function queryOrderByMonth($layout_def)
563     {
564         $return = $this->_get_column_select($layout_def);
565         if ($layout_def['type'] == 'datetime')
566         {
567             $return = $this->reporter->db->convert($return, 'add_tz_offset');
568         }
569         $orderBy = $this->reporter->db->convert($return, "date_format", array('%Y-%m'));
570
571         if (empty($layout_def['sort_dir']) || $layout_def['sort_dir'] == 'a')
572         {
573             return $orderBy . " ASC\n";
574         }
575         else
576         {
577             return $orderBy . " DESC\n";
578         }
579     }
580
581     /**
582      * Returns part of query for select
583      *
584      * @param array $layout_def for field
585      * @return string part of select query with year & month & day
586      */
587     function querySelectday($layout_def)
588     {
589         $return = $this->_get_column_select($layout_def);
590         if ($layout_def['type'] == 'datetime')
591         {
592             $return = $this->reporter->db->convert($return, 'add_tz_offset');
593         }
594         return $this->reporter->db->convert($return, "date_format", array('%Y-%m-%d')) . ' ' . $this->_get_column_alias($layout_def) . "\n";
595     }
596
597     /**
598      * Returns part of query for group by
599      *
600      * @param array $layout_def for field
601      * @return string part of group by query with year & month & day
602      */
603     function queryGroupByDay($layout_def)
604     {
605         $return = $this->_get_column_select($layout_def);
606         if ($layout_def['type'] == 'datetime')
607         {
608             $return = $this->reporter->db->convert($return, 'add_tz_offset');
609         }
610         return $this->reporter->db->convert($return, "date_format", array('%Y-%m-%d')) . "\n";
611     }
612
613     /**
614      * Returns part of query for select
615      *
616      * @param array $layout_def for field
617      * @return string part of select query with year only
618      */
619     function querySelectyear($layout_def)
620     {
621         $return = $this->_get_column_select($layout_def);
622         if ($layout_def['type'] == 'datetime')
623         {
624             $return = $this->reporter->db->convert($return, 'add_tz_offset');
625         }
626         return $this->reporter->db->convert($return, "date_format", array('%Y')) . ' ' . $this->_get_column_alias($layout_def) . "\n";
627     }
628
629     /**
630      * Returns part of query for group by
631      *
632      * @param array $layout_def for field
633      * @return string part of group by query with year only
634      */
635     function queryGroupByYear($layout_def)
636     {
637         $return = $this->_get_column_select($layout_def);
638         if ($layout_def['type'] == 'datetime')
639         {
640             $return = $this->reporter->db->convert($return, 'add_tz_offset');
641         }
642         return $this->reporter->db->convert($return, "date_format", array('%Y')) . "\n";
643     }
644
645         function querySelectquarter($layout_def)
646         {
647             $column = $this->_get_column_select($layout_def);
648             return $this->reporter->db->convert($this->reporter->db->convert($column, "date_format", array('%Y')),
649                         'CONCAT',
650                     array("'-'", $this->reporter->db->convert($column, "quarter")))
651                 ." ".$this->_get_column_alias($layout_def)."\n";
652         }
653
654         function displayListquarter(& $layout_def) {
655                 $match = array();
656         if (preg_match('/(\d{4})-(\d)/', $this->displayListPlain($layout_def), $match)) {
657                         return "Q".$match[2]." ".$match[1];
658                 }
659                 return '';
660
661         }
662
663         function queryGroupByQuarter($layout_def)
664         {
665                 $this->getReporter();
666         $column = $this->_get_column_select($layout_def);
667             return $this->reporter->db->convert($this->reporter->db->convert($column, "date_format", array('%Y')),
668                         'CONCAT',
669                     array("'-'", $this->reporter->db->convert($column, "quarter")));
670         }
671
672     /**
673      * For oracle we have to return order by string like group by string instead of return field alias
674      *
675      * @param array $layout_def definition of field
676      * @return string order by string for field
677      */
678     public function queryOrderByQuarter($layout_def)
679     {
680         $column = $this->_get_column_select($layout_def);
681         $orderBy = $this->reporter->db->convert(
682             $this->reporter->db->convert($column, "date_format", array('%Y')),
683             'CONCAT',
684             array("'-'", $this->reporter->db->convert($column, "quarter"))
685         );
686
687
688         if (empty($layout_def['sort_dir']) || $layout_def['sort_dir'] == 'a')
689         {
690             return $orderBy . " ASC\n";
691         }
692         else
693         {
694             return $orderBy . " DESC\n";
695         }
696     }
697
698     function displayInput(&$layout_def) {
699         global $timedate, $current_language, $app_strings;
700         $home_mod_strings = return_module_language($current_language, 'Home');
701         $filterTypes = array(' '                 => $app_strings['LBL_NONE'],
702                              'TP_today'         => $home_mod_strings['LBL_TODAY'],
703                              'TP_yesterday'     => $home_mod_strings['LBL_YESTERDAY'],
704                              'TP_tomorrow'      => $home_mod_strings['LBL_TOMORROW'],
705                              'TP_this_month'    => $home_mod_strings['LBL_THIS_MONTH'],
706                              'TP_this_year'     => $home_mod_strings['LBL_THIS_YEAR'],
707                              'TP_last_30_days'  => $home_mod_strings['LBL_LAST_30_DAYS'],
708                              'TP_last_7_days'   => $home_mod_strings['LBL_LAST_7_DAYS'],
709                              'TP_last_month'    => $home_mod_strings['LBL_LAST_MONTH'],
710                              'TP_last_year'     => $home_mod_strings['LBL_LAST_YEAR'],
711                              'TP_next_30_days'  => $home_mod_strings['LBL_NEXT_30_DAYS'],
712                              'TP_next_7_days'   => $home_mod_strings['LBL_NEXT_7_DAYS'],
713                              'TP_next_month'    => $home_mod_strings['LBL_NEXT_MONTH'],
714                              'TP_next_year'     => $home_mod_strings['LBL_NEXT_YEAR'],
715                              );
716
717         $cal_dateformat = $timedate->get_cal_date_format();
718         $str = "<select name='type_{$layout_def['name']}'>";
719         $str .= get_select_options_with_id($filterTypes, (empty($layout_def['input_name0']) ? '' : $layout_def['input_name0']));
720 //        foreach($filterTypes as $value => $label) {
721 //            $str .= '<option value="' . $value . '">' . $label. '</option>';
722 //        }
723         $str .= "</select>";
724
725
726         return $str;
727     }
728
729     /**
730      * @param  $date
731      * @return bool false if the date is a only a date, true if the date includes time.
732      */
733     protected function hasTime($date)
734     {
735         return strlen(trim($date)) < 11 ? false : true;
736     }
737
738 }