From e34c927427b48816dfbb517e8ab47f4500dac70d Mon Sep 17 00:00:00 2001 From: magnolia61 Date: Sat, 12 Jan 2019 20:50:29 +0100 Subject: [PATCH] Add freeform relative date for 'This Fiscal Year' --- CRM/Utils/Date.php | 61 ++++++++++++++++------------ tests/phpunit/CRM/Utils/DateTest.php | 57 +++++++++++++++++++++++++- 2 files changed, 89 insertions(+), 29 deletions(-) diff --git a/CRM/Utils/Date.php b/CRM/Utils/Date.php index fa96fca47f..252fd6ab79 100644 --- a/CRM/Utils/Date.php +++ b/CRM/Utils/Date.php @@ -1114,13 +1114,6 @@ class CRM_Utils_Date { switch ($unit) { case 'year': switch ($relativeTerm) { - case 'this': - $from['d'] = $from['M'] = 1; - $to['d'] = 31; - $to['M'] = 12; - $to['Y'] = $from['Y'] = $now['year']; - break; - case 'previous': $from['M'] = $from['d'] = 1; $to['d'] = 31; @@ -1227,15 +1220,29 @@ class CRM_Utils_Date { break; default: - if ($relativeTermPrefix === 'ending') { - $to['d'] = $now['mday']; - $to['M'] = $now['mon']; - $to['Y'] = $now['year']; - $to['H'] = 23; - $to['i'] = $to['s'] = 59; - $from = self::intervalAdd('year', -$relativeTermSuffix, $to); - $from = self::intervalAdd('second', 1, $from); + switch ($relativeTermPrefix) { + + case 'ending': + $to['d'] = $now['mday']; + $to['M'] = $now['mon']; + $to['Y'] = $now['year']; + $to['H'] = 23; + $to['i'] = $to['s'] = 59; + $from = self::intervalAdd('year', -$relativeTermSuffix, $to); + $from = self::intervalAdd('second', 1, $from); + break; + + case 'this': + $from['d'] = $from['M'] = 1; + $to['d'] = 31; + $to['M'] = 12; + $to['Y'] = $from['Y'] = $now['year']; + if (is_numeric($relativeTermSuffix)) { + $from['Y'] -= ($relativeTermSuffix - 1); + } + break; } + break; } break; @@ -1249,10 +1256,15 @@ class CRM_Utils_Date { $from['Y'] = $fYear; $fiscalYear = mktime(0, 0, 0, $from['M'], $from['d'] - 1, $from['Y'] + 1); $fiscalEnd = explode('-', date("Y-m-d", $fiscalYear)); - $to['d'] = $fiscalEnd['2']; $to['M'] = $fiscalEnd['1']; $to['Y'] = $fiscalEnd['0']; + $to['H'] = 23; + $to['i'] = $to['s'] = 59; + if (is_numeric($relativeTermSuffix)) { + $from = self::intervalAdd('year', (-$relativeTermSuffix), $to); + $from = self::intervalAdd('second', 1, $from); + } break; case 'previous': @@ -1263,6 +1275,8 @@ class CRM_Utils_Date { $to['d'] = $fiscalEnd['2']; $to['M'] = $fiscalEnd['1']; $to['Y'] = $fiscalEnd['0']; + $to['H'] = 23; + $to['i'] = $to['s'] = 59; } else { $from['Y'] = $fYear - $relativeTermSuffix; @@ -1271,6 +1285,8 @@ class CRM_Utils_Date { $to['d'] = $fiscalEnd['2']; $to['M'] = $fiscalEnd['1']; $to['Y'] = $fYear; + $to['H'] = 23; + $to['i'] = $to['s'] = 59; } break; @@ -1856,17 +1872,8 @@ class CRM_Utils_Date { break; } - foreach ([ - 'from', - 'to', - ] as $item) { - if (!empty($$item)) { - $dateRange[$item] = self::format($$item); - } - else { - $dateRange[$item] = NULL; - } - } + $dateRange['from'] = empty($from) ? NULL : self::format($from); + $dateRange['to'] = empty($to) ? NULL : self::format($to); return $dateRange; } diff --git a/tests/phpunit/CRM/Utils/DateTest.php b/tests/phpunit/CRM/Utils/DateTest.php index 82b8f4efa7..e0ea0778a1 100644 --- a/tests/phpunit/CRM/Utils/DateTest.php +++ b/tests/phpunit/CRM/Utils/DateTest.php @@ -97,15 +97,23 @@ class CRM_Utils_DateTest extends CiviUnitTestCase { Civi::settings()->set('fiscalYearStart', ['M' => 7, 'd' => 1]); $fiscalYearStartYear = (strtotime('now') > strtotime((date('Y-07-01')))) ? date('Y') : (date('Y') - 1); + // this_2 = 'These 2 Fiscal years' + $date = CRM_Utils_Date::relativeToAbsolute('this_2', 'fiscal_year'); + $this->assertEquals([ + 'from' => ($fiscalYearStartYear - 1) . '0701000000', + 'to' => ($fiscalYearStartYear + 1) . '0630235959', + ], $date, 'relative term is this_2.fiscal_year'); + foreach ($sequence as $relativeString) { $date = CRM_Utils_Date::relativeToAbsolute($relativeString, 'fiscal_year'); $this->assertEquals([ 'from' => $fiscalYearStartYear . '0701', - 'to' => ($fiscalYearStartYear + 1) . '0630', + 'to' => ($fiscalYearStartYear + 1) . '0630235959', ], $date, 'relative term is ' . $relativeString); $fiscalYearStartYear--; } + } /** @@ -126,6 +134,14 @@ class CRM_Utils_DateTest extends CiviUnitTestCase { $year--; } + + // this_2 = 'These 2 years' + $date = CRM_Utils_Date::relativeToAbsolute('this_2', 'year'); + $thisYear = date('Y'); + $this->assertEquals([ + 'from' => ($thisYear - 1) . '0101', + 'to' => $thisYear . '1231', + ], $date, 'relative term is this_2 year'); } /** @@ -165,6 +181,43 @@ class CRM_Utils_DateTest extends CiviUnitTestCase { ], $date, 'relative term is ending.week'); } + /** + * Test relativeToAbsolute function on a range of year options. + * + * Go backwards one year at a time through the sequence. + */ + public function testRelativeThisFiscal() { + $relativeDateValues = [ + 'ending.week' => '- 6 days', + 'ending_30.day' => '- 29 days', + 'ending.year' => '- 1 year + 1 day', + 'ending_90.day' => '- 89 days', + 'ending_60.day' => '- 59 days', + 'ending_2.year' => '- 2 years + 1 day', + 'ending_3.year' => '- 3 years + 1 day', + 'ending_18.year' => '- 18 years + 1 day', + 'ending_18.quarter' => '- 54 months + 1 day', + 'ending_18.week' => '- 18 weeks + 1 day', + 'ending_18.month' => '- 18 months + 1 day', + 'ending_18.day' => '- 17 days', + ]; + + foreach ($relativeDateValues as $key => $value) { + $parts = explode('.', $key); + $date = CRM_Utils_Date::relativeToAbsolute($parts[0], $parts[1]); + $this->assertEquals([ + 'from' => date('Ymd000000', strtotime($value)), + 'to' => date('Ymd235959'), + ], $date, 'relative term is ' . $key); + } + + $date = CRM_Utils_Date::relativeToAbsolute('ending', 'month'); + $this->assertEquals([ + 'from' => date('Ymd000000', strtotime('- 29 days')), + 'to' => date('Ymd235959'), + ], $date, 'relative term is ending.week'); + } + /** * Test relativeToAbsolute function on a range of year options. * @@ -205,7 +258,7 @@ class CRM_Utils_DateTest extends CiviUnitTestCase { $offset = (substr($relativeString, -1, 1)); $this->assertEquals([ 'from' => $lastFiscalYearEnd - $offset . '0701', - 'to' => $lastFiscalYearEnd . '0630', + 'to' => $lastFiscalYearEnd . '0630235959', ], $date, 'relative term is ' . $relativeString); } } -- 2.25.1