APIv4 - Correctly return date-only custom field values without the time
authorColeman Watts <coleman@civicrm.org>
Fri, 28 Jan 2022 01:23:33 +0000 (20:23 -0500)
committerColeman Watts <coleman@civicrm.org>
Fri, 28 Jan 2022 01:39:00 +0000 (20:39 -0500)
Civi/Api4/Utils/FormattingUtil.php
tests/phpunit/api/v4/Action/BasicCustomFieldTest.php

index f537e73b5e8b91406dada370c348dcdc7d594394..5c20a9ef5bda8d0a9378d13371e2b358aa47df41 100644 (file)
@@ -338,6 +338,10 @@ class FormattingUtil {
         case 'Money':
         case 'Float':
           return (float) $value;
+
+        case 'Date':
+          // Strip time from date-only fields
+          return substr($value, 0, 10);
       }
     }
     return $value;
index 4cc32bbcf010bbbce27909a2dcd2647f4066d7d1..d9728385a7d81704d5bb552cad86ebca4484586f 100644 (file)
@@ -457,4 +457,45 @@ class BasicCustomFieldTest extends BaseCustomValueTest {
     $this->assertEquals(['One' => 1, 'Two' => 2, 'Three' => 3, 'Four' => 4], $getValues('controlGroup'));
   }
 
+  /**
+   * Ensure custom date fields only return the date part
+   */
+  public function testCustomDateFields(): void {
+    $cgName = uniqid('My');
+
+    CustomGroup::create(FALSE)
+      ->addValue('title', $cgName)
+      ->addValue('extends', 'Contact')
+      ->addChain('field1', CustomField::create()
+        ->addValue('label', 'DateOnly')
+        ->addValue('custom_group_id', '$id')
+        ->addValue('html_type', 'Select Date')
+        ->addValue('data_type', 'Date')
+        ->addValue('date_format', 'mm/dd/yy'))
+      ->addChain('field2', CustomField::create()
+        ->addValue('label', 'DateTime')
+        ->addValue('custom_group_id', '$id')
+        ->addValue('html_type', 'Select Date')
+        ->addValue('data_type', 'Date')
+        ->addValue('date_format', 'mm/dd/yy')
+        ->addValue('time_format', '1'))
+      ->execute();
+
+    $cid = Contact::create(FALSE)
+      ->addValue('first_name', 'Parent')
+      ->addValue('last_name', 'Tester')
+      ->addValue("$cgName.DateOnly", '2025-05-10')
+      ->addValue("$cgName.DateTime", '2025-06-11 12:15:30')
+      ->execute()
+      ->first()['id'];
+    $contact = Contact::get(FALSE)
+      ->addSelect('custom.*')
+      ->addWhere('id', '=', $cid)
+      ->execute()->first();
+    // Date field should only return date part
+    $this->assertEquals('2025-05-10', $contact["$cgName.DateOnly"]);
+    // Date time field should return all
+    $this->assertEquals('2025-06-11 12:15:30', $contact["$cgName.DateTime"]);
+  }
+
 }