Extend fiscal year relative options to better match other periods
authoreileen <emcnaughton@wikimedia.org>
Tue, 15 May 2018 11:19:39 +0000 (23:19 +1200)
committereileen <emcnaughton@wikimedia.org>
Tue, 15 May 2018 22:05:39 +0000 (10:05 +1200)
CRM/Utils/Date.php
tests/phpunit/CRM/Utils/DateTest.php

index 5f7d7512ddaa3c10fbfe988098853d6b5a7077c7..3d4570d7e194fdca20ffdd930f027345d3323a91 100644 (file)
@@ -1027,8 +1027,8 @@ class CRM_Utils_Date {
   /**
    * Resolves the given relative time interval into finite time limits.
    *
-   * @param array $relativeTerm
-   *   Relative time frame like this, previous, etc.
+   * @param string $relativeTerm
+   *   Relative time frame: this, previous, previous_1.
    * @param int $unit
    *   Frequency unit like year, month, week etc.
    *
@@ -1039,6 +1039,9 @@ class CRM_Utils_Date {
     $now = getdate();
     $from = $to = $dateRange = array();
     $from['H'] = $from['i'] = $from['s'] = 0;
+    $relativeTermParts = explode('_', $relativeTerm);
+    $relativeTermPrefix = $relativeTermParts[0];
+    $relativeTermSuffix = isset($relativeTermParts[1]) ? $relativeTermParts[1] : '';
 
     switch ($unit) {
       case 'year':
@@ -1162,7 +1165,7 @@ class CRM_Utils_Date {
         $from['d'] = $config->fiscalYearStart['d'];
         $from['M'] = $config->fiscalYearStart['M'];
         $fYear = self::calculateFiscalYear($from['d'], $from['M']);
-        switch ($relativeTerm) {
+        switch ($relativeTermPrefix) {
           case 'this':
             $from['Y'] = $fYear;
             $fiscalYear = mktime(0, 0, 0, $from['M'], $from['d'] - 1, $from['Y'] + 1);
@@ -1174,12 +1177,22 @@ class CRM_Utils_Date {
             break;
 
           case 'previous':
-            $from['Y'] = $fYear - 1;
-            $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'];
+            if (!is_numeric($relativeTermSuffix)) {
+              $from['Y'] = ($relativeTermSuffix === 'before') ? $fYear - 2 : $fYear - 1;
+              $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'];
+            }
+            else {
+              $from['Y'] = $fYear - $relativeTermSuffix;
+              $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'] = $fYear;
+            }
             break;
 
           case 'next':
@@ -1745,7 +1758,7 @@ class CRM_Utils_Date {
    *   Fiscal Start Month.
    *
    * @return int
-   *   $fy       Current Fiscl Year
+   *   $fy       Current Fiscal Year
    */
   public static function calculateFiscalYear($fyDate, $fyMonth) {
     $date = date("Y-m-d");
index 76a230a8dca64ed18aa183b4914356a20982666b..faa661c9e21b28af4d4f3f632f53a04569327054 100644 (file)
@@ -87,4 +87,90 @@ class CRM_Utils_DateTest extends CiviUnitTestCase {
     $this->assertEquals($expectedTo, $calculatedTo);
   }
 
+  /**
+   * Test relativeToAbsolute function on a range of fiscal year options.
+   *
+   * Go backwards one year at a time through the sequence.
+   */
+  public function testRelativeToAbsoluteFiscalYear() {
+    $sequence = ['this', 'previous', 'previous_before'];
+    Civi::settings()->set('fiscalYearStart', ['M' => 7, 'd' => 1]);
+    $fiscalYearStartYear = (strtotime('now') > strtotime((date('Y-07-01')))) ? date('Y') : (date('Y') - 1);
+
+    foreach ($sequence as $relativeString) {
+      $date = CRM_Utils_Date::relativeToAbsolute($relativeString, 'fiscal_year');
+      $this->assertEquals([
+        'from' => $fiscalYearStartYear . '0701',
+        'to' => ($fiscalYearStartYear + 1) . '0630'
+      ], $date, 'relative term is ' . $relativeString);
+
+      $fiscalYearStartYear--;
+    }
+  }
+
+  /**
+   * Test relativeToAbsolute function on a range of year options.
+   *
+   * Go backwards one year at a time through the sequence.
+   */
+  public function testRelativeToAbsoluteYear() {
+    $sequence = ['this', 'previous', 'previous_before'];
+    $year = date('Y');
+
+    foreach ($sequence as $relativeString) {
+      $date = CRM_Utils_Date::relativeToAbsolute($relativeString, 'year');
+      $this->assertEquals([
+        'from' => $year . '0101',
+        'to' => $year . '1231',
+      ], $date, 'relative term is ' . $relativeString);
+
+      $year--;
+    }
+  }
+
+  /**
+   * Test relativeToAbsolute function on a range of year options.
+   *
+   * Go backwards one year at a time through the sequence.
+   */
+  public function testRelativeToAbsoluteYearRange() {
+    $sequence = ['previous_2'];
+    $lastYear = (date('Y') - 1);
+
+    foreach ($sequence as $relativeString) {
+      $date = CRM_Utils_Date::relativeToAbsolute($relativeString, 'year');
+      // For previous 2 years the range is e.g 2016-01-01 to 2017-12-31 so we have to subtract
+      // one from the range count to reflect the calendar year being one less apart due
+      // to it being from the beginning of one to the end of the next.
+      $offset = (substr($relativeString, -1, 1)) - 1;
+      $this->assertEquals([
+        'from' => $lastYear - $offset . '0101',
+        'to' => $lastYear  . '1231',
+      ], $date, 'relative term is ' . $relativeString);
+    }
+  }
+
+  /**
+   * Test relativeToAbsolute function on a range of year options.
+   *
+   * Go backwards one year at a time through the sequence.
+   */
+  public function testRelativeToAbsoluteFiscalYearRange() {
+    $sequence = ['previous_2', 'previous_3', 'previous_4'];
+    Civi::settings()->set('fiscalYearStart', ['M' => 7, 'd' => 1]);
+    $lastFiscalYearEnd = (strtotime('now') > strtotime((date('Y-07-01')))) ? (date('Y')) : (date('Y') - 1);
+
+    foreach ($sequence as $relativeString) {
+      $date = CRM_Utils_Date::relativeToAbsolute($relativeString, 'fiscal_year');
+      // For previous 2 years the range is e.g 2015-07-01 to 2017-06-30 so we have to subtract
+      // one from the range count to reflect the calendar year being one less apart due
+      // to it being from the beginning of one to the end of the next.
+      $offset = (substr($relativeString, -1, 1));
+      $this->assertEquals([
+        'from' => $lastFiscalYearEnd - $offset . '0701',
+        'to' => $lastFiscalYearEnd  . '0630',
+      ], $date, 'relative term is ' . $relativeString);
+    }
+  }
+
 }