Fix pricefield pseudoconstant.
authoreileen <emcnaughton@wikimedia.org>
Wed, 20 May 2020 02:58:52 +0000 (14:58 +1200)
committereileen <emcnaughton@wikimedia.org>
Thu, 21 May 2020 22:23:41 +0000 (10:23 +1200)
The price field turns out not to be returning pseudoconstant fields for 2 reasons
1) the label field is defined but the name field is not
2) any price fields with no domain are filtered out. In my single domain db this is
all of them.

I think we can safely understand NULL domain_id as 'not restricted by domain'. For some tables
(membershipType) it is a required field but for PriceField it is not.

I would be inclined to say it should be required less often. However, where it is required thenn
the OR IS NULL should never be true

CRM/Core/PseudoConstant.php
CRM/Price/BAO/PriceField.php
CRM/Price/BAO/PriceSet.php
CRM/Price/DAO/PriceField.php
api/v3/Generic.php
tests/phpunit/CRM/Price/BAO/PriceFieldTest.php
tests/phpunit/CRM/Price/BAO/PriceSetTest.php
xml/schema/Price/PriceField.xml

index 911189b5e12f9b4ba7f64cb7b9c0df5dcc01ab76..e158ee21f0a8ab0086ffecd1e897c1fb84a79f0e 100644 (file)
@@ -1527,7 +1527,7 @@ WHERE  id = %1
     }
     // Filter domain specific options
     if (in_array('domain_id', $availableFields)) {
-      $wheres[] = 'domain_id = ' . CRM_Core_Config::domainID();
+      $wheres[] = 'domain_id = ' . CRM_Core_Config::domainID() . ' OR  domain_id is NULL';
     }
     $queryParams = [
       1 => [$params['keyColumn'], 'String', CRM_Core_DAO::QUERY_FORMAT_NO_QUOTES],
index 8f7cc8e1b5583919da0cec82c60771db685bfc01..f48cd14e832c0ab29ce77ca46265d7f3d8dacf13 100644 (file)
@@ -9,14 +9,6 @@
  +--------------------------------------------------------------------+
  */
 
-/**
- *
- * @package CRM
- * @copyright CiviCRM LLC https://civicrm.org/licensing
- * $Id$
- *
- */
-
 /**
  * Business objects for managing price fields.
  *
index 7983cc531ba93806bdd11cae12e78a91550647e8..732aa5dd8e45e3137238c9fa2921f0a9d726ee1b 100644 (file)
@@ -71,6 +71,7 @@ class CRM_Price_BAO_PriceSet extends CRM_Price_DAO_PriceSet {
     $priceSetBAO->save();
 
     CRM_Utils_Hook::post($hook, 'PriceSet', $priceSetBAO->id, $priceSetBAO);
+    unset(\Civi::$statics['CRM_Core_PseudoConstant']);
     return $priceSetBAO;
   }
 
@@ -1171,6 +1172,7 @@ WHERE  id = %1";
     $copy->save();
 
     CRM_Utils_Hook::copy('Set', $copy);
+    unset(\Civi::$statics['CRM_Core_PseudoConstant']);
     return $copy;
   }
 
index 56dc69ac28974cefb4e3012a4e1ab9f1d0cb9eed..987ae6614fd66b8787cd7e5faf0d4432d9f179f5 100644 (file)
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Price/PriceField.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:88307b88d5be27887068a778e663b0a2)
+ * (GenCodeChecksum:691cc70f15386dd0c2cd4ab63f9798af)
  */
 
 /**
@@ -204,6 +204,7 @@ class CRM_Price_DAO_PriceField extends CRM_Core_DAO {
             'table' => 'civicrm_price_set',
             'keyColumn' => 'id',
             'labelColumn' => 'title',
+            'nameColumn' => 'name',
           ],
         ],
         'name' => [
index d8f2e92db4adcdedbe0aef19a39de6e211b8d95f..0eef89a7a2f6114876af58579cf4df0607e48c75 100644 (file)
@@ -406,6 +406,7 @@ function civicrm_api3_generic_replace($apiRequest) {
  *
  * @return array
  *   Array of results
+ * @throws \CiviCRM_API3_Exception
  */
 function civicrm_api3_generic_getoptions($apiRequest) {
   // Resolve aliases.
index 7d3c7a7faac40a417d14f73dd1a3b37beee2502b..e6374edc71592adc594fb34c1857659cf6501c93 100644 (file)
  */
 class CRM_Price_BAO_PriceFieldTest extends CiviUnitTestCase {
 
-  /**
-   * Sets up the fixtures.
-   */
-  protected function setUp() {
-    parent::setUp();
-  }
-
-  /**
-   * Tears down the fixture.
-   */
-  protected function tearDown() {
-  }
-
   /**
    * Test that when re-submitting the price field values with the option ids added
    * in the format that the contribution page / event page configuration screen
    * does it it doesn't duplicate the options
+   *
+   * @throws \CRM_Core_Exception
    */
   public function testSubmitPriceFieldWithOptions() {
-    $this->priceSet = civicrm_api3('PriceSet', 'create', [
+    $priceSet = $this->callAPISuccess('PriceSet', 'create', [
       'is_active' => 1,
       'extends' => 2,
       'is_quick_config' => 1,
@@ -42,7 +31,7 @@ class CRM_Price_BAO_PriceFieldTest extends CiviUnitTestCase {
       'name' => 'test_price_set',
       'title' => 'Test Price Set',
     ]);
-    $this->priceFieldParams = [
+    $priceFieldParams = [
       'name' => 'contribution_amount',
       'is_active' => 1,
       'weight' => 2,
@@ -66,11 +55,11 @@ class CRM_Price_BAO_PriceFieldTest extends CiviUnitTestCase {
         3 => 3,
       ],
       'default_option' => 2,
-      'price_set_id' => $this->priceSet['id'],
+      'price_set_id' => $priceSet['id'],
     ];
-    $this->priceField = civicrm_api3('PriceField', 'create', $this->priceFieldParams);
-    $this->priceFieldParams['id'] = $this->priceField['id'];
-    $fieldOptions = civicrm_api3('PriceFieldValue', 'get', ['price_field_id' => $this->priceField['id']]);
+    $priceField = $this->callAPISuccess('PriceField', 'create', $priceFieldParams);
+    $priceFieldParams['id'] = $priceField['id'];
+    $fieldOptions = $this->callAPISuccess('PriceFieldValue', 'get', ['price_field_id' => $priceField['id']]);
     foreach ($fieldOptions['values'] as $fieldOption) {
       if ($fieldOption['amount'] < 20) {
         $key = 1;
@@ -81,11 +70,18 @@ class CRM_Price_BAO_PriceFieldTest extends CiviUnitTestCase {
       else {
         $key = 3;
       }
-      $this->priceFieldParams['option_id'][$key] = $fieldOption['id'];
+      $priceFieldParams['option_id'][$key] = $fieldOption['id'];
     }
-    $this->priceFieldParams['default_option'] = 3;
-    $options = $this->callAPISuccess('PriceFieldValue', 'get', ['price_field_id' => $this->priceField['id']]);
+    $priceFieldParams['default_option'] = 3;
+    $options = $this->callAPISuccess('PriceFieldValue', 'get', ['price_field_id' => $priceField['id']]);
     $this->assertEquals(3, $options['count']);
   }
 
+  /**
+   * Test the name can be retrieved from the id using the pseudoConstant.
+   */
+  public function testGetFromPseudoConstant() {
+    $this->assertNotEmpty(CRM_Core_PseudoConstant::getKey('CRM_Price_BAO_PriceField', 'price_set_id', 'default_contribution_amount'));
+  }
+
 }
index d6d9265fb4e238ec4cd422c59601c53e6252f9c3..1c311ed327f7c632b15cf31b1b27a5751556ac91 100644 (file)
@@ -33,6 +33,8 @@ class CRM_Price_BAO_PriceSetTest extends CiviUnitTestCase {
    *
    * (these are denoted as 'quickConfig' in the code - but quickConfig is only supposed to refer to the
    * configuration interface - there should be no different post process.
+   *
+   * @throws \CRM_Core_Exception
    */
   public function testGetAmountLevelTextAmount() {
     $priceSetID = $this->eventPriceSetCreate(9);
@@ -49,6 +51,8 @@ class CRM_Price_BAO_PriceSetTest extends CiviUnitTestCase {
 
   /**
    * CRM-20237 Test that Copied price set does not generate long name and unneded information
+   *
+   * @throws \CRM_Core_Exception
    */
   public function testCopyPriceSet() {
     $priceSetID = $this->eventPriceSetCreate(9);
@@ -79,6 +83,8 @@ class CRM_Price_BAO_PriceSetTest extends CiviUnitTestCase {
   /**
    * Test CRM_Price_BAO_PriceSet::getMembershipCount() that return correct number of
    *   membership type occurances against it's corresponding member orgaisation
+   *
+   * @throws \CRM_Core_Exception
    */
   public function testGetMembershipCount() {
     // create two organisations
index c3ac6dd662ec5894d4134f2b639d46afad3113b4..0c2c1af3c1a811f468e5a33afc5139fe16d32346 100644 (file)
@@ -27,6 +27,7 @@
     <pseudoconstant>
       <table>civicrm_price_set</table>
       <keyColumn>id</keyColumn>
+      <nameColumn>name</nameColumn>
       <labelColumn>title</labelColumn>
     </pseudoconstant>
     <add>1.8</add>