APIv4 - Add NOW() date function
authorColeman Watts <coleman@civicrm.org>
Thu, 5 May 2022 14:42:20 +0000 (10:42 -0400)
committerColeman Watts <coleman@civicrm.org>
Thu, 5 May 2022 14:48:52 +0000 (10:48 -0400)
Adds a function for NOW which returns the full date+time, and distinguishes
it from CURDATE which just returns the date part.

Civi/Api4/Query/SqlFunctionCURDATE.php
Civi/Api4/Query/SqlFunctionNOW.php [new file with mode: 0644]
tests/phpunit/api/v4/Action/SqlFunctionTest.php

index 951e4498c533395eafa6b3dfd73df1f1b6762638..dc843b28ed3d5aba4b33405f9df94f71cb2aeae2 100644 (file)
@@ -18,6 +18,8 @@ class SqlFunctionCURDATE extends SqlFunction {
 
   protected static $category = self::CATEGORY_DATE;
 
+  protected static $dataType = 'Date';
+
   protected static function params(): array {
     return [];
   }
@@ -26,7 +28,7 @@ class SqlFunctionCURDATE extends SqlFunction {
    * @return string
    */
   public static function getTitle(): string {
-    return ts('Now');
+    return ts('Today');
   }
 
   /**
diff --git a/Civi/Api4/Query/SqlFunctionNOW.php b/Civi/Api4/Query/SqlFunctionNOW.php
new file mode 100644 (file)
index 0000000..d6764c6
--- /dev/null
@@ -0,0 +1,41 @@
+<?php
+/*
+ +--------------------------------------------------------------------+
+ | Copyright CiviCRM LLC. All rights reserved.                        |
+ |                                                                    |
+ | This work is published under the GNU AGPLv3 license with some      |
+ | permitted exceptions and without any warranty. For full license    |
+ | and copyright information, see https://civicrm.org/licensing       |
+ +--------------------------------------------------------------------+
+ */
+
+namespace Civi\Api4\Query;
+
+/**
+ * Sql function
+ */
+class SqlFunctionNOW extends SqlFunction {
+
+  protected static $category = self::CATEGORY_DATE;
+
+  protected static $dataType = 'Timestamp';
+
+  protected static function params(): array {
+    return [];
+  }
+
+  /**
+   * @return string
+   */
+  public static function getTitle(): string {
+    return ts('Now');
+  }
+
+  /**
+   * @return string
+   */
+  public static function getDescription(): string {
+    return ts('The current date and time.');
+  }
+
+}
index 9da481501c37112051674ef408dc527cdce47fc5..3641a51a80c1359981e5f5ac2c21c18fe234033b 100644 (file)
@@ -245,6 +245,32 @@ class SqlFunctionTest extends UnitTestCase {
     }
   }
 
+  public function testCurrentDate() {
+    $lastName = uniqid(__FUNCTION__);
+    $sampleData = [
+      ['first_name' => 'abc', 'last_name' => $lastName, 'birth_date' => 'now'],
+      ['first_name' => 'def', 'last_name' => $lastName, 'birth_date' => 'now - 1 year'],
+      ['first_name' => 'def', 'last_name' => $lastName, 'birth_date' => 'now - 10 year'],
+    ];
+    Contact::save(FALSE)
+      ->setRecords($sampleData)
+      ->execute();
+
+    $result = Contact::get(FALSE)
+      ->addWhere('last_name', '=', $lastName)
+      ->addWhere('birth_date', '=', 'CURDATE()', TRUE)
+      ->selectRowCount()
+      ->execute();
+    $this->assertCount(1, $result);
+
+    $result = Contact::get(FALSE)
+      ->addWhere('last_name', '=', $lastName)
+      ->addWhere('birth_date', '<', 'DATE(NOW())', TRUE)
+      ->selectRowCount()
+      ->execute();
+    $this->assertCount(2, $result);
+  }
+
   public function testRandFunction() {
     Contact::save(FALSE)
       ->setRecords(array_fill(0, 6, []))