financial_type_id is not required for a premium product so may not be set in civicrm_...
authorMatthew Wire <devel@mrwire.co.uk>
Fri, 6 Jul 2018 21:21:20 +0000 (22:21 +0100)
committerMatthew Wire (MJW Consulting) <mjw@mjwconsult.co.uk>
Mon, 23 Jul 2018 16:58:38 +0000 (17:58 +0100)
CRM/Contribute/BAO/ManagePremiums.php
CRM/Contribute/BAO/Premium.php
CRM/Contribute/BAO/Product.php
CRM/Contribute/Form/ManagePremiums.php
tests/phpunit/CRM/Contribute/BAO/ContributionTest.php
tests/phpunit/CRM/Contribute/BAO/ProductTest.php

index a7ba644ff75220c3121d81c9f7df28a1ac10058a..f122fb0b8873fcb3d8d7f45a056e05e5df888062 100644 (file)
@@ -50,7 +50,7 @@ class CRM_Contribute_BAO_ManagePremiums extends CRM_Contribute_BAO_Product {
    * @param array $defaults
    *   (reference ) an assoc array to hold the flattened values.
    *
-   * @return CRM_Contribute_BAO_ManagePremiums
+   * @return CRM_Contribute_BAO_Product
    */
   public static function retrieve(&$params, &$defaults) {
     CRM_Core_Error::deprecatedFunctionWarning('CRM_Contribute_BAO_Product::retrieve');
index 31ace03233137e27822ff22fc5cee0d8c11bae40..a7db1d5efd48f604cc84d6f87509bdca837b4060 100644 (file)
@@ -104,31 +104,33 @@ class CRM_Contribute_BAO_Premium extends CRM_Contribute_DAO_Premium {
   public static function buildPremiumBlock(&$form, $pageID, $formItems = FALSE, $selectedProductID = NULL, $selectedOption = NULL) {
     $form->add('hidden', "selectProduct", $selectedProductID, array('id' => 'selectProduct'));
 
-    $dao = new CRM_Contribute_DAO_Premium();
-    $dao->entity_table = 'civicrm_contribution_page';
-    $dao->entity_id = $pageID;
-    $dao->premiums_active = 1;
-    CRM_Financial_BAO_FinancialType::getAvailableFinancialTypes($financialTypes, CRM_Core_Action::ADD);
-    $addWhere = "financial_type_id IN (0)";
-    if (!empty($financialTypes)) {
-      $addWhere = "financial_type_id IN (" . implode(',', array_keys($financialTypes)) . ")";
-    }
+    $premiumDao = new CRM_Contribute_DAO_Premium();
+    $premiumDao->entity_table = 'civicrm_contribution_page';
+    $premiumDao->entity_id = $pageID;
+    $premiumDao->premiums_active = 1;
 
-    if ($dao->find(TRUE)) {
-      $premiumID = $dao->id;
+    if ($premiumDao->find(TRUE)) {
+      $premiumID = $premiumDao->id;
       $premiumBlock = array();
-      CRM_Core_DAO::storeValues($dao, $premiumBlock);
+      CRM_Core_DAO::storeValues($premiumDao, $premiumBlock);
 
-      $dao = new CRM_Contribute_DAO_PremiumsProduct();
-      $dao->premiums_id = $premiumID;
-      $dao->whereAdd($addWhere);
-      $dao->orderBy('weight');
-      $dao->find();
+      CRM_Financial_BAO_FinancialType::getAvailableFinancialTypes($financialTypes, CRM_Core_Action::ADD);
+      $addWhere = "financial_type_id IN (0)";
+      if (!empty($financialTypes)) {
+        $addWhere = "financial_type_id IN (" . implode(',', array_keys($financialTypes)) . ")";
+      }
+      $addWhere = "{$addWhere} OR financial_type_id IS NULL";
+
+      $premiumsProductDao = new CRM_Contribute_DAO_PremiumsProduct();
+      $premiumsProductDao->premiums_id = $premiumID;
+      $premiumsProductDao->whereAdd($addWhere);
+      $premiumsProductDao->orderBy('weight');
+      $premiumsProductDao->find();
 
       $products = array();
-      while ($dao->fetch()) {
+      while ($premiumsProductDao->fetch()) {
         $productDAO = new CRM_Contribute_DAO_Product();
-        $productDAO->id = $dao->product_id;
+        $productDAO->id = $premiumsProductDao->product_id;
         $productDAO->is_active = 1;
         if ($productDAO->find(TRUE)) {
           if ($selectedProductID != NULL) {
index 498e2fcb287826f855e819f32e2ee52bdeddf60b..22f1f9739d24b47365a26e8bb5cfab7e910885b2 100644 (file)
@@ -134,13 +134,9 @@ class CRM_Contribute_BAO_Product extends CRM_Contribute_DAO_Product {
     $premiumsProduct = new CRM_Contribute_DAO_PremiumsProduct();
     $premiumsProduct->product_id = $productID;
     if ($premiumsProduct->find(TRUE)) {
-      $session = CRM_Core_Session::singleton();
-      $message .= ts('This Premium is being linked to <a href=\'%1\'>Online Contribution page</a>. Please remove it in order to delete this Premium.', array(1 => CRM_Utils_System::url('civicrm/admin/contribute', 'reset=1')), ts('Deletion Error'), 'error');
-      CRM_Core_Session::setStatus($message);
-      return CRM_Utils_System::redirect(CRM_Utils_System::url('civicrm/admin/contribute/managePremiums', 'reset=1&action=browse'));
+      throw new CRM_Core_Exception('Cannot delete a Premium that is linked to a Contribution page');
     }
-
-    //delete from financial Type table
+    // delete product
     $premium = new CRM_Contribute_DAO_Product();
     $premium->id = $productID;
     $premium->delete();
index c685ee0452d1447188c08da10aa602605e5b2234..37bad336abd6c96128a022cba9244df3877626a6 100644 (file)
@@ -51,7 +51,6 @@ class CRM_Contribute_Form_ManagePremiums extends CRM_Contribute_Form {
     if ($this->_id) {
       $params = array('id' => $this->_id);
       CRM_Contribute_BAO_Product::retrieve($params, $tempDefaults);
-      $imageUrl = (isset($tempDefaults['image'])) ? $tempDefaults['image'] : "";
       if (isset($tempDefaults['image']) && isset($tempDefaults['thumbnail'])) {
         $defaults['imageUrl'] = $tempDefaults['image'];
         $defaults['thumbnailUrl'] = $tempDefaults['thumbnail'];
@@ -272,7 +271,15 @@ class CRM_Contribute_Form_ManagePremiums extends CRM_Contribute_Form {
 
     // If deleting, then only delete and skip the rest of the post-processing
     if ($this->_action & CRM_Core_Action::DELETE) {
-      CRM_Contribute_BAO_Product::del($this->_id);
+      try {
+        CRM_Contribute_BAO_Product::del($this->_id);
+      }
+      catch (CRM_Core_Exception $e) {
+        $message = ts("This Premium is linked to an <a href='%1'>Online Contribution page</a>. Please remove it before deleting this Premium.", array(1 => CRM_Utils_System::url('civicrm/admin/contribute', 'reset=1')));
+        CRM_Core_Session::setStatus($message, ts('Cannot delete Premium'), 'error');
+        CRM_Core_Session::singleton()->pushUserContext(CRM_Utils_System::url('civicrm/admin/contribute/managePremiums', 'reset=1&action=browse'));
+        return;
+      }
       CRM_Core_Session::setStatus(
         ts('Selected Premium Product type has been deleted.'),
         ts('Deleted'), 'info');
@@ -287,13 +294,14 @@ class CRM_Contribute_Form_ManagePremiums extends CRM_Contribute_Form {
       $params[$field] = CRM_Utils_Rule::cleanMoney($params[$field]);
     }
 
+    // If we're updating, we need to pass in the premium product Id
     if ($this->_action & CRM_Core_Action::UPDATE) {
       $params['id'] = $this->_id;
     }
 
     $this->_processImages($params);
 
-    // Save to database
+    // Save the premium product to database
     $premium = CRM_Contribute_BAO_Product::create($params);
 
     CRM_Core_Session::setStatus(
index 83d94b00411bfeee1a6d9c63b9113365aeadca89..783bb40325398b4af8768874c003a266876f1562 100644 (file)
@@ -376,7 +376,7 @@ class CRM_Contribute_BAO_ContributionTest extends CiviUnitTestCase {
 
     $this->assertEquals('TEST Premium', $premium->name, 'Check for premium  name.');
 
-    $param = array(
+    $contributionParams = array(
       'contact_id' => $contactId,
       'currency' => 'USD',
       'financial_type_id' => 1,
@@ -395,9 +395,9 @@ class CRM_Contribute_BAO_ContributionTest extends CiviUnitTestCase {
       'thankyou_date' => '20080522',
       'sequential' => TRUE,
     );
-    $contribution = $this->callAPISuccess('Contribution', 'create', $param)['values'][0];
+    $contribution = $this->callAPISuccess('Contribution', 'create', $contributionParams)['values'][0];
 
-    $this->assertEquals($param['trxn_id'], $contribution['trxn_id'], 'Check for transcation id creation.');
+    $this->assertEquals($contributionParams['trxn_id'], $contribution['trxn_id'], 'Check for transcation id creation.');
     $this->assertEquals($contactId, $contribution['contact_id'], 'Check for contact id  creation.');
 
     //parameter for adding premium to contribution
index 6779d29be97829de489e8576571bab9398b39331..85d970a32aed98e0c4ea04985dbd46c94f631ee3 100644 (file)
@@ -50,7 +50,6 @@ class CRM_Contribute_BAO_ProductTest extends CiviUnitTestCase {
     );
 
     $product = CRM_Contribute_BAO_Product::create($params);
-
     $result = $this->assertDBNotNull('CRM_Contribute_BAO_Product', $product->id,
       'sku', 'id',
       'Database check on updated product record.'
@@ -120,14 +119,13 @@ class CRM_Contribute_BAO_ProductTest extends CiviUnitTestCase {
     );
 
     $product = CRM_Contribute_BAO_Product::create($params);
-
     CRM_Contribute_BAO_Product::del($product->id);
 
     $params = array('id' => $product->id);
-    $default = array();
-    $result = CRM_Contribute_BAO_Product::retrieve($params, $defaults);
+    $defaults = array();
+    $retrievedProduct = CRM_Contribute_BAO_Product::retrieve($params, $defaults);
 
-    $this->assertEquals(empty($result), TRUE, 'Verify product record deletion.');
+    $this->assertEquals(empty($retrievedProduct), TRUE, 'Verify product record deletion.');
   }
 
 }