--- a/busui/owa/modules/base/classes/timePeriod.php +++ b/busui/owa/modules/base/classes/timePeriod.php @@ -1,1 +1,396 @@ - + + * @copyright Copyright © 2008 Peter Adams + * @license http://www.gnu.org/copyleft/gpl.html GPL v2.0 + * @category owa + * @package owa + * @version $Revision$ + * @since owa 1.0.0 + */ + + +class owa_timePeriod { + + var $period; + var $startDate; + var $endDate; + var $label; + var $diff_years; + var $diff_months; + var $diff_days; + + function __construct() { + + //parent::__construct(); + + $this->startDate = owa_coreAPI::supportClassFactory('base', 'date'); + $this->endDate = owa_coreAPI::supportClassFactory('base', 'date'); + } + + function set($value = '', $map = array()) { + + $this->period = $value; + $this->_setDates($map); + $this->_setLabel($value); + $this->_setDifferences(); + } + + function getStartDate() { + return $this->startDate; + } + + function getEndDate() { + return $this->endDate; + } + + function getLabel() { + return $this->label; + } + + function get() { + return $this->period; + } + + function _setLabel($value) { + + if ($value === 'date_range') { + // Set date labels + $this->label = $this->startDate->getLabel() . ' - ' . $this->endDate->getLabel(); + } elseif ($value === 'day') { + + $this->label = $this->startDate->getLabel() . ' - ' . $this->startDate->getLabel(); + + } else { + + $periods = $this->getPeriodLabels(); + $this->label = $periods[$value]['label']; + } + } + + /** + * Array of Reporting Periods + * + * @return array + */ + function getPeriodLabels() { + + return array( + + 'today' => array('label' => 'Today'), + 'yesterday' => array('label' => 'Yesterday'), + 'this_week' => array('label' => 'This Week'), + 'this_month' => array('label' => 'This Month'), + 'this_year' => array('label' => 'This Year'), + 'last_week' => array('label' => 'Last Week'), + 'last_month' => array('label' => 'Last Month'), + 'last_year' => array('label' => 'Last Year'), + //'last_half_hour' => array('label' => 'The Last 30 Minutes'), + //'last_hour' => array('label' => 'Last Hour'), + //'last_24_hours' => array('label' => 'Last 24 Hours'), + 'last_seven_days' => array('label' => 'Last Seven Days'), + 'last_thirty_days' => array('label' => 'Last Thirty Days'), + 'same_day_last_week' => array('label' => 'Same Day last Week'), + 'same_week_last_year' => array('label' => 'Same Week Last Year'), + 'same_month_last_year' => array('label' => 'Same Month Last Year'), + 'date_range' => array('label' => 'Date Range') + //'time_range' => array('label' => 'Time Range') + ); + + } + + function _setDates($map = array()) { + + $time_now = owa_lib::time_now(); + $nowDate = owa_coreAPI::supportClassFactory('base', 'date'); + $nowDate->set(time(), 'timestamp'); + + switch ($this->period) { + + case "today": + + $start = mktime(0, 0, 0, $time_now['month'], $time_now['day'], $time_now['year']); + $end = $start + 3600 * 24 -1; + break; + + case "last_24_hours": + $end = $time_now['timestamp']; + $start = $end - 3600*24; + break; + + case "last_hour": + $end = $time_now['timestamp']; + $start = $end - 3600; + break; + + case "last_half_hour": + $end = $time_now['timestamp']; + $start = $end - 1800; + break; + + case "last_seven_days": + //$end = mktime(0, 0, 0, $time_now['month'], $time_now['day']+1, $time_now['year']); + $end = mktime(23, 59, 59, $time_now['month'], $time_now['day'], $time_now['year']); + $start = $end - 3600*24*7; + break; + + case "this_week": + $end = mktime(23, 59, 59, $time_now['month'], $time_now['day'], $time_now['year']) + + ((6 - $nowDate->get('day_of_week')) * 3600 * 24); + $start = mktime(0, 0, 0, $time_now['month'], $time_now['day'], $time_now['year']) - + ($nowDate->get('day_of_week') * 3600 * 24); + break; + + case "this_month": + $start = mktime(0, 0, 0, $time_now['month'], 1 , $time_now['year']); + $end = mktime(23, 59, 59, $time_now['month'], $nowDate->get('num_days_in_month'), $time_now['year']); + break; + + case "this_year": + $start = mktime(0, 0, 0, 1, 1, $time_now['year']); + $end = mktime(23, 59, 59, 12, 31, $time_now['year']); + break; + + case "yesterday": + $end = mktime(0, 0, 0, $time_now['month'], $time_now['day'], $time_now['year']); + $start = $end - 3600*24; + $end = $end - 1; + break; + + case "last_week": + $day = ($time_now['day'] - $time_now['dayofweek']) - 7; + $start = mktime(0, 0, 0, $time_now['month'], $day, $time_now['year']); + $end = $start + 3600*24*7; + break; + + case "last_month": + $month = $time_now['month'] - 1; + $start = mktime(0, 0, 0, $month, 1, $time_now['year']); + $last = owa_coreAPI::supportClassFactory('base', 'date'); + $last->set($start, 'timestamp'); + $end = mktime(23, 59, 59, $last->get('month'), $last->get('num_days_in_month'), $last->get('year')); + break; + + case "last_year": + $year = $time_now['year'] - 1; + $start = mktime(0, 0, 0, 1, 1, $year); + $end = mktime(23, 59, 59, 12, 31, $year); + break; + + case "same_day_last_week": + $start = mktime(0, 0, 0, $time_now['month'], $time_now['day'], $time_now['year']) - 3600*24*7; + $end = $start + (3600*24) - 1; + break; + /// + case "same_month_last_year": + $year = $time_now['year'] - 1; + $month = $time_now['month']; + $start = mktime(0, 0, 0, $month, 1, $year); + $last = owa_coreAPI::supportClassFactory('base', 'date'); + $last->set($start, 'timestamp'); + $end = mktime(23, 59, 59, $month, $last->get('num_days_in_month'), $year); + break; + + case "all_time": + $end = time(); + $start = mktime(0, 0, 0, 1, 1, 1969); + break; + + case "last_thirty_days": + $end = mktime(23, 59, 59, $time_now['month'], $time_now['day'], $time_now['year']); + $start = ($end + 1) - (30 * 3600 * 24); + break; + + case "date_range": + list($year, $month, $day) = sscanf($map['startDate'], "%4d%2d%2d"); + $start = mktime(0, 0, 0, $month, $day, $year); + list($year, $month, $day) = sscanf($map['endDate'], "%4d%2d%2d"); + $end = mktime(23, 59, 59, $month, $day, $year); + + break; + + case "time_range": + $start = $map['startTime']; + $end = $map['endTime']; + break; + + case "day": + list($year, $month, $day) = sscanf($map['startDate'], "%4d%2d%2d"); + $start = mktime(0, 0, 0, $month, $day, $year); + $end = mktime(23, 59, 59, $month, $day, $year); + break; + + } + + $this->startDate->set($start, 'timestamp'); + $this->endDate->set($end, 'timestamp'); + } + + function getPeriodProperties() { + + $period_params = array(); + $period_params['period'] = $this->get(); + + if ($period_params['period'] === 'date_range') { + + $period_params['startDate'] = $this->startDate->getYyyymmdd(); + $period_params['endDate'] = $this->endDate->getYyyymmdd(); + + } elseif ($period_params['period'] === 'time_range') { + + $period_params['startTime'] = $this->startDate->getTimestamp(); + $period_params['endTime'] = $this->endDate->getTimestamp(); + } + + return $period_params; + + } + + function getAllInfo() { + + $info = array(); + $info['period'] = $this->get(); + $info['startDate'] = $this->startDate->getYyyymmdd(); + $info['endDate'] = $this->endDate->getYyyymmdd(); + $info['startTime'] = $this->startDate->getTimestamp(); + $info['endTime'] = $this->endDate->getTimestamp(); + $info['label'] = $this->getLabel(); + + return $info; + } + + function _setDifferences() { + + // calc years diff + $start = $this->startDate->getYyyymmdd(); + $end = $this->endDate->getYyyymmdd(); + $diff = $this->getDateDifference($start, $end); + + $this->diff_years = $diff['YearsSince']; + $this->diff_months = $diff['MonthsSince']; + $this->diff_days = $diff['DaysSince']; + } + + function getMonthsDifference() { + + return $this->diff_months; + } + + function getYearsDifference() { + + return $this->diff_years; + } + + function getDaysDifference() { + + return $this->diff_days; + } + + // Function used to take two date strings, and returns an associative array + // with different formats for the difference between the dates. + // based on function by: tchapin at gmail dot com + // -------------------- + // Variables: + // StartDateString (String - MM/DD/YYYY) + // EndDateString (String - MM/DD/YYYY) + // -------------------- + // Example: $DateDiffAry = GetDateDifference('01/09/2008', '02/11/2009'); + // print_r($DateDiffAry); + // -------------------- + // Returns Something Like: + /* + Array + ( + [YearsSince] => 1.0931506849315 + [MonthsSince] => 13.117808219178 + [DaysSince] => 399 + [HoursSince] => 9576 + [MinutesSince] => 574560 + [SecondsSince] => 34473600 + [NiceString] => 1 year, 1 month, and 2 days + [NiceString2] => Years: 1, Months: 1, Days: 2 + ) + */ + function getDateDifference($StartDateString=NULL, $EndDateString=NULL) { + $ReturnArray = array(); + + $SDSplit = sscanf($StartDateString,'%4d%2d%2d'); + $StartDate = mktime(0,0,0,$SDSplit[1],$SDSplit[2],$SDSplit[0]); + + $EDSplit = sscanf($EndDateString,'%4d%2d%2d'); + $EndDate = mktime(0,0,0,$EDSplit[1],$EDSplit[2],$EDSplit[0]); + + $DateDifference = $EndDate-$StartDate; + + $ReturnArray['YearsSince'] = $DateDifference/60/60/24/365; + $ReturnArray['MonthsSince'] = $DateDifference/60/60/24/365*12; + $ReturnArray['DaysSince'] = $DateDifference/60/60/24; + $ReturnArray['HoursSince'] = $DateDifference/60/60; + $ReturnArray['MinutesSince'] = $DateDifference/60; + $ReturnArray['SecondsSince'] = $DateDifference; + + $y1 = date("Y", $StartDate); + $m1 = date("m", $StartDate); + $d1 = date("d", $StartDate); + $y2 = date("Y", $EndDate); + $m2 = date("m", $EndDate); + $d2 = date("d", $EndDate); + + $diff = ''; + $diff2 = ''; + if (($EndDate - $StartDate)<=0) { + // Start date is before or equal to end date! + $diff = "0 days"; + $diff2 = "Days: 0"; + } else { + + $y = $y2 - $y1; + $m = $m2 - $m1; + $d = $d2 - $d1; + $daysInMonth = date("t",$StartDate); + if ($d<0) {$m--;$d=$daysInMonth+$d;} + if ($m<0) {$y--;$m=12+$m;} + $daysInMonth = date("t",$m2); + + // Nicestring ("1 year, 1 month, and 5 days") + if ($y>0) $diff .= $y==1 ? "1 year" : "$y years"; + if ($y>0 && $m>0) $diff .= ", "; + if ($m>0) $diff .= $m==1? "1 month" : "$m months"; + if (($m>0||$y>0) && $d>0) $diff .= ", and "; + if ($d>0) $diff .= $d==1 ? "1 day" : "$d days"; + + // Nicestring 2 ("Years: 1, Months: 1, Days: 1") + if ($y>0) $diff2 .= $y==1 ? "Years: 1" : "Years: $y"; + if ($y>0 && $m>0) $diff2 .= ", "; + if ($m>0) $diff2 .= $m==1? "Months: 1" : "Months: $m"; + if (($m>0||$y>0) && $d>0) $diff2 .= ", "; + if ($d>0) $diff2 .= $d==1 ? "Days: 1" : "Days: $d"; + + } + + $ReturnArray['NiceString'] = $diff; + $ReturnArray['NiceString2'] = $diff2; + return $ReturnArray; + } +} + +?>