Toward CRM-19751: change db scmema so on_hold is INT instead of BOOLEAN.
authorAllen Shaw <allen@JoineryHQ.com>
Sun, 30 Sep 2018 00:41:09 +0000 (19:41 -0500)
committerAllen Shaw <allen@JoineryHQ.com>
Wed, 10 Oct 2018 15:14:16 +0000 (10:14 -0500)
CRM/Contact/BAO/Query.php
CRM/Core/DAO/Email.php
CRM/Core/PseudoConstant.php
tests/phpunit/CRM/Core/BAO/EmailTest.php
tests/phpunit/api/v3/MailingTest.php
xml/schema/Core/Email.xml

index e5db7e134d742be306bb136c3625f95de000788e..d738d945e727c2b6c3ea9e954391763e81da33dc 100644 (file)
@@ -5974,7 +5974,15 @@ AND   displayRelType.is_active = 1
         $wc = "contact_a.$fieldName";
       }
       else {
-        $wc = "$tableName.id";
+        // Special handling for on_hold, so that we actually use the 'where'
+        // property in order to limit the query by the on_hold status of the email,
+        // instead of using email.id which would be nonsensical.
+        if ($field['name'] == 'on_hold') {
+          $wc = "{$field['where']}";
+        }
+        else {
+          $wc = "$tableName.id";
+        }
       }
     }
     else {
index 9d7d24eba260e144da44d12bbb4309c4938c4bd7..1901e047afd46bdfe8635a425746f4dc34be3f93 100644 (file)
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/Email.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:08f53d44527d7d174b4aa1bd545b028c)
+ * (GenCodeChecksum:efd9de6842b24f9800e2a65fd2199cf4)
  */
 
 /**
@@ -71,9 +71,9 @@ class CRM_Core_DAO_Email extends CRM_Core_DAO {
   public $is_billing;
 
   /**
-   * Is this address on bounce hold?
+   * Implicit FK to civicrm_option_value where option_group = email_on_hold.
    *
-   * @var boolean
+   * @var int unsigned
    */
   public $on_hold;
 
@@ -228,9 +228,9 @@ class CRM_Core_DAO_Email extends CRM_Core_DAO {
         ],
         'on_hold' => [
           'name' => 'on_hold',
-          'type' => CRM_Utils_Type::T_BOOLEAN,
+          'type' => CRM_Utils_Type::T_INT,
           'title' => ts('On Hold'),
-          'description' => 'Is this address on bounce hold?',
+          'description' => 'Implicit FK to civicrm_option_value where option_group = email_on_hold.',
           'required' => TRUE,
           'export' => TRUE,
           'where' => 'civicrm_email.on_hold',
@@ -242,8 +242,11 @@ class CRM_Core_DAO_Email extends CRM_Core_DAO {
           'bao' => 'CRM_Core_BAO_Email',
           'localizable' => 0,
           'html' => [
-            'type' => 'CheckBox',
+            'type' => 'Select',
           ],
+          'pseudoconstant' => [
+            'callback' => 'CRM_Core_PseudoConstant::emailOnHoldOptions',
+          ]
         ],
         'is_bulkmail' => [
           'name' => 'is_bulkmail',
index 5cef5e081eb4aa7da36d8443963f24754d69c2de..a9c213ee59f7fcdc44150e1e8edb0e0045b1d373 100644 (file)
@@ -1571,4 +1571,17 @@ WHERE  id = %1
     return Civi::$statics[__CLASS__]['taxRates'];
   }
 
+  /**
+   * Get participant status class options.
+   *
+   * @return array
+   */
+  public static function emailOnHoldOptions() {
+    return array(
+      '0' => ts('No'),
+      '1' => ts('On Hold Bounce'),
+      '2' => ts('On Hold Opt Out'),
+    );
+  }
+
 }
index b2abc69c66a5275a3a3c7714762d6e09e9324a63..a97290d2fa91a58771d5fd8e3389da7b64072b1a 100644 (file)
@@ -70,7 +70,7 @@ class CRM_Core_BAO_EmailTest extends CiviUnitTestCase {
       'Database check for created email address.'
     );
 
-    // Now call add() to update on_hold=true and check record state
+    // Now call add() to update on_hold=1 ("On Hold Bounce") and check record state
     $params = array();
     $params = array(
       'id' => $emailId,
@@ -94,7 +94,31 @@ class CRM_Core_BAO_EmailTest extends CiviUnitTestCase {
       'Check if on_hold=1 in updated email record.'
     );
 
-    // Now call add() with on_hold=false and verify that reset_date is set.
+    // Now call add() to update on_hold=2 ("On Hold Opt-out") and check record state
+    $params = array();
+    $params = array(
+      'id' => $emailId,
+      'contact_id' => $contactId,
+      'on_hold' => 2,
+    );
+
+    CRM_Core_BAO_Email::add($params);
+
+    // Use assertDBNotNull to get back value of hold_date and check that it's in the current year.
+    // NOTE: The assertEquals will fail IF this test is run just as the year is changing (low likelihood).
+    $holdDate = $this->assertDBNotNull('CRM_Core_DAO_Email', $emailId, 'hold_date', 'id',
+      'Retrieve hold_date from the updated email record.'
+    );
+
+    $this->assertEquals(substr($holdDate, 0, 4), substr(date('YmdHis'), 0, 4),
+      'Compare hold_date (' . $holdDate . ') in DB to current year.'
+    );
+
+    $this->assertDBCompareValue('CRM_Core_DAO_Email', $emailId, 'on_hold', 'id', 2,
+      'Check if on_hold=2 in updated email record.'
+    );
+
+    // Now call add() with on_hold=null (not on hold) and verify that reset_date is set.
     $params = array();
     $params = array(
       'id' => $emailId,
index e480e780420d253d3ab610cfc28ae36b2d44735d..8214dfaf00fb55c7086afca4943cdf261e91e918 100644 (file)
@@ -356,7 +356,7 @@ class api_v3_MailingTest extends CiviUnitTestCase {
     ));
     $this->callAPISuccess('Email', 'create', array(
       'id' => $emailId,
-      'on_hold' => TRUE,
+      'on_hold' => 1,
     ));
 
     $this->callAPISuccess('GroupContact', 'create', array(
index bc9cedb87736ebecb3eaabe5847653cd730dcb1f..c9881ac4f89fe4aaedd8d0dd423883e389af53c7 100644 (file)
   </index>
   <field>
     <name>on_hold</name>
+    <title>On Hold</title>
     <export>true</export>
-    <type>boolean</type>
+    <type>int unsigned</type>
     <default>0</default>
     <required>true</required>
-    <comment>Is this address on bounce hold?</comment>
+    <comment>Implicit FK to civicrm_option_value where option_group = email_on_hold.</comment>
+    <pseudoconstant>
+      <callback>CRM_Core_PseudoConstant::emailOnHoldOptions</callback>
+    </pseudoconstant>
     <add>1.1</add>
     <html>
-      <type>CheckBox</type>
+      <type>Select</type>
     </html>
   </field>
   <field>