dev/core#1936 Make the label column on price_field_value table not required
authorSeamus Lee <seamuslee001@gmail.com>
Tue, 11 Aug 2020 21:44:16 +0000 (07:44 +1000)
committerSeamus Lee <seamuslee001@gmail.com>
Tue, 11 Aug 2020 22:04:39 +0000 (08:04 +1000)
CRM/Core/I18n/SchemaStructure.php
CRM/Price/DAO/PriceFieldValue.php
CRM/Upgrade/Incremental/php/FiveTwentyEight.php
Civi/Api4/Service/Spec/Provider/PriceFieldValueCreationSpecProvider.php
tests/phpunit/CRM/Price/BAO/PriceFieldValueTest.php
xml/schema/Price/PriceFieldValue.xml

index ecadf83929c92afe8751d3ef86a9ba1f984827ae..02a51c9a7874743830aacb42da5238c55b6519fa 100644 (file)
@@ -154,7 +154,7 @@ class CRM_Core_I18n_SchemaStructure {
           'help_post' => "text COMMENT 'Description and/or help text to display after this field.'",
         ],
         'civicrm_price_field_value' => [
-          'label' => "varchar(255) NOT NULL COMMENT 'Price field option label'",
+          'label' => "varchar(255) DEFAULT NULL COMMENT 'Price field option label'",
           'description' => "text DEFAULT NULL COMMENT 'Price field option description.'",
           'help_pre' => "text DEFAULT NULL COMMENT 'Price field option pre help text.'",
           'help_post' => "text DEFAULT NULL COMMENT 'Price field option post field help.'",
@@ -586,7 +586,6 @@ class CRM_Core_I18n_SchemaStructure {
         'civicrm_price_field_value' => [
           'label' => [
             'type' => "Text",
-            'required' => "true",
           ],
           'description' => [
             'type' => "TextArea",
index d510c14b62d2932e308347a3aae70f5e07a1b0b7..01aff179797e27985e54b00c84879293489a1e71 100644 (file)
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Price/PriceFieldValue.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:28432a14b1b1523380eb41e8e481037d)
+ * (GenCodeChecksum:11a02f3576be10e8c2a0ea47a19e2dac)
  */
 
 /**
@@ -226,10 +226,10 @@ class CRM_Price_DAO_PriceFieldValue extends CRM_Core_DAO {
           'type' => CRM_Utils_Type::T_STRING,
           'title' => ts('Name'),
           'description' => ts('Price field option name'),
-          'required' => TRUE,
           'maxlength' => 255,
           'size' => CRM_Utils_Type::HUGE,
           'where' => 'civicrm_price_field_value.name',
+          'default' => 'NULL',
           'table_name' => 'civicrm_price_field_value',
           'entity' => 'PriceFieldValue',
           'bao' => 'CRM_Price_BAO_PriceFieldValue',
@@ -244,10 +244,10 @@ class CRM_Price_DAO_PriceFieldValue extends CRM_Core_DAO {
           'type' => CRM_Utils_Type::T_STRING,
           'title' => ts('Label'),
           'description' => ts('Price field option label'),
-          'required' => TRUE,
           'maxlength' => 255,
           'size' => CRM_Utils_Type::HUGE,
           'where' => 'civicrm_price_field_value.label',
+          'default' => 'NULL',
           'table_name' => 'civicrm_price_field_value',
           'entity' => 'PriceFieldValue',
           'bao' => 'CRM_Price_BAO_PriceFieldValue',
index b035cfb16e3e7e501833bf39fe68db321a28dd72..01c899a7dedcfa168236ada4b93aab9d6228acca 100644 (file)
@@ -46,6 +46,37 @@ class CRM_Upgrade_Incremental_php_FiveTwentyEight extends CRM_Upgrade_Incrementa
     }
   }
 
+  /**
+   * Upgrade function.
+   *
+   * @param string $rev
+   */
+  public function upgrade_5_28_1($rev) {
+    $this->addTask(ts('Upgrade DB to %1: SQL', [1 => $rev]), 'runSql', $rev);
+    $this->addTask('Make label field non required on price field value', 'priceFieldValueLabelNonRequired');
+  }
+
+  /**
+   * Make the price field value label column non required
+   * @return bool
+   */
+  public static function priceFieldValueLabelNonRequired() {
+    $domain = new CRM_Core_DAO_Domain();
+    $domain->find(TRUE);
+    if ($domain->locales) {
+      $locales = explode(CRM_Core_DAO::VALUE_SEPARATOR, $domain->locales);
+      foreach ($locales as $locale) {
+        CRM_Core_DAO::executeQuery("ALTER TABLE civicrm_price_field_value CHANGE `label_{$locale}` `label_{$locale}` varchar(255) DEFAULT NULL  COMMENT 'Price field option label'", [], TRUE, NULL, FALSE, FALSE);
+        CRM_Core_DAO::executeQuery("UPDATE civicrm_price_field_value SET label_{$locale} = NULL WHERE label_{$locale} = 'null'", [], TRUE, NULL, FALSE, FALSE);
+      }
+    }
+    else {
+      CRM_Core_DAO::executeQuery("ALTER TABLE civicrm_price_field_value CHANGE `label` `label` varchar(255) DEFAULT NULL  COMMENT 'Price field option label'", [], TRUE, NULL, FALSE, FALSE);
+      CRM_Core_DAO::executeQuery("UPDATE civicrm_price_field_value SET label = NULL WHERE label = 'null'", [], TRUE, NULL, FALSE, FALSE);
+    }
+    return TRUE;
+  }
+
   public static function createWpFilesMessage() {
     if (!function_exists('civi_wp')) {
       return '';
index 00c6b19d1e6c8952e0cb0ce32d98cecbd077b5ea..76cfa28739ca56efc33468c96fb543465ce4b09f 100644 (file)
@@ -29,6 +29,8 @@ class PriceFieldValueCreationSpecProvider implements Generic\SpecProviderInterfa
   public function modifySpec(RequestSpec $spec) {
     // Name will be auto-generated from label if not supplied
     $spec->getFieldByName('name')->setRequired(FALSE);
+    // Ensure that label is required this matches v3 API but doesn't match DAO because form fields allow for NULLs
+    $spec->getFieldByName('label')->setRequired(TRUE);
   }
 
   /**
index b4b0911e81499a99a412e34e706fb090fbef3478..23261b4c66bfc491b71ef46b0fe9988d4c79e961 100644 (file)
@@ -39,4 +39,43 @@ class CRM_Price_BAO_PriceFieldValueTest extends CiviUnitTestCase {
     $this->assertEquals('visibility', $fields['visibility_id']['pseudoconstant']['optionGroupName']);
   }
 
+  public function testEmptyStringLabel() {
+    // Put stuff here that should happen before all tests in this unit.
+    $priceSetParams = [
+      'name' => 'default_goat_priceset',
+      'title' => 'Goat accommodation',
+      'is_active' => 1,
+      'help_pre' => "Where does your goat sleep",
+      'help_post' => "thank you for your time",
+      'extends' => 2,
+      'financial_type_id' => 1,
+      'is_quick_config' => 1,
+      'is_reserved' => 1,
+    ];
+
+    $price_set = $this->callAPISuccess('price_set', 'create', $priceSetParams);
+    $this->priceSetID = $price_set['id'];
+
+    $priceFieldParams = [
+      'price_set_id' => $this->priceSetID,
+      'name' => 'grassvariety',
+      'label' => 'Grass Variety',
+      'html_type' => 'Text',
+      'is_enter_qty' => 1,
+      'is_active' => 1,
+    ];
+    $priceField = $this->callAPISuccess('price_field', 'create', $priceFieldParams);
+    $this->priceFieldID = $priceField['id'];
+    $this->_params = [
+      'price_field_id' => $this->priceFieldID,
+      'name' => 'rye_grass',
+      'label' => '',
+      'amount' => 1,
+      'financial_type_id' => 1,
+    ];
+    $priceFieldValue = CRM_Price_BAO_PriceFieldValue::create($this->_params);
+    $priceFieldValue->find(TRUE);
+    $this->assertEquals('', $priceFieldValue->label);
+  }
+
 }
index 74c649b916729353fbeecdde983ae791901cbbc0..2290d96282893aeaad029d8aa2b3cd672204a57e 100644 (file)
     <title>Name</title>
     <length>255</length>
     <comment>Price field option name</comment>
-    <required>true</required>
     <html>
       <type>Text</type>
     </html>
     <add>3.3</add>
+    <default>NULL</default>
   </field>
   <field>
     <name>label</name>
     <length>255</length>
     <localizable>true</localizable>
     <comment>Price field option label</comment>
-    <required>true</required>
     <html>
       <type>Text</type>
     </html>
     <add>3.3</add>
+    <default>NULL</default>
   </field>
   <field>
     <name>description</name>