CRM-16523 refactor completetransation to call hooks
authoreileenmcnaugton <eileen@fuzion.co.nz>
Mon, 3 Aug 2015 13:38:46 +0000 (01:38 +1200)
committereileenmcnaugton <eileen@fuzion.co.nz>
Tue, 4 Aug 2015 05:30:27 +0000 (17:30 +1200)
CRM/Contribute/BAO/Contribution.php
api/v3/MembershipLog.php [new file with mode: 0644]
tests/phpunit/api/v3/ContributionTest.php

index fe12852abbb772e158b30da007fa9a29401bd251..95ed819381482a74821d96139ecccf2313f9c40f 100644 (file)
@@ -2250,9 +2250,8 @@ WHERE  contribution_id = %1 ";
    * @throws Exception
    */
   public function composeMessageArray(&$input, &$ids, &$values, $recur = FALSE, $returnMessageText = TRUE) {
-    if (empty($this->_relatedObjects)) {
-      $this->loadRelatedObjects($input, $ids);
-    }
+    $this->loadRelatedObjects($input, $ids);
+
     if (empty($this->_component)) {
       $this->_component = CRM_Utils_Array::value('component', $input);
     }
@@ -4004,11 +4003,14 @@ WHERE con.id = {$contributionId}
       }
 
       if (!empty($memberships)) {
-        $membershipsUpdate = array();
         foreach ($memberships as $membershipTypeIdKey => $membership) {
-          $membershipParams = (array) $membership;
           if ($membership) {
-            $format = '%Y%m%d';
+            $membershipParams = array(
+              'id' => $membership->id,
+              'contact_id' => $membership->contact_id,
+              'is_test' => $membership->is_test,
+              'membership_type_id' => $membership->membership_type_id,
+            );
 
             $currentMembership = CRM_Member_BAO_Membership::getContactMembership($membershipParams['contact_id'],
               $membershipParams['membership_type_id'],
@@ -4032,7 +4034,10 @@ LIMIT 1;";
             }
             $dao->free();
 
-            $num_terms = $contribution->getNumTermsByContributionAndMembershipType($membershipParams['membership_type_id'], $primaryContributionID);
+            $membershipParams['num_terms'] = $contribution->getNumTermsByContributionAndMembershipType(
+              $membershipParams['membership_type_id'],
+              $primaryContributionID
+            );
             if ($currentMembership) {
               /*
                * Fixed FOR CRM-4433
@@ -4044,16 +4049,11 @@ LIMIT 1;";
               // @todo - we should pass membership_type_id instead of null here but not
               // adding as not sure of testing
               $dates = CRM_Member_BAO_MembershipType::getRenewalDatesForMembershipType($membershipParams['id'],
-                $changeDate, NULL, $num_terms
+                $changeDate, NULL, $membershipParams['num_terms']
               );
 
               $dates['join_date'] = $currentMembership['join_date'];
             }
-            else {
-              $membershipParams = array_merge($membershipParams,
-                CRM_Member_BAO_MembershipType::getDatesForMembershipType($membershipParams['membership_type_id'], NULL, NULL, NULL, $num_terms)
-              );
-            }
 
             //get the status for membership.
             $calcStatus = CRM_Member_BAO_MembershipStatus::getMembershipStatusByDate($dates['start_date'],
@@ -4071,40 +4071,10 @@ LIMIT 1;";
             $membershipParams['is_override'] = FALSE;
             civicrm_api3('Membership', 'create', $membershipParams);
 
-            $membershipLog = $membershipParams;
-
-            $logStartDate = $membershipParams['start_date'];
-            if (!empty($dates['log_start_date'])) {
-              $logStartDate = CRM_Utils_Date::customFormat($dates['log_start_date'], $format);
-              $logStartDate = CRM_Utils_Date::isoToMysql($logStartDate);
-            }
-
-            $membershipLog['start_date'] = $logStartDate;
-            $membershipLog['membership_id'] = $membership->id;
-            $membershipLog['modified_id'] = $membership->contact_id;
-            $membershipLog['modified_date'] = date('Ymd');
-            $membershipLog['membership_type_id'] = $membership->membership_type_id;
-
-            CRM_Member_BAO_MembershipLog::add($membershipLog, CRM_Core_DAO::$_nullArray);
-
             //update related Memberships.
             CRM_Member_BAO_Membership::updateRelatedMemberships($membership->id, $membershipParams);
-
-            //update the membership type key of membership relatedObjects array
-            //if it has changed after membership update
-            if ($membershipTypeIdKey != $membership->membership_type_id) {
-              $membershipsUpdate[$membership->membership_type_id] = $membership;
-              $contribution->_relatedObjects['membership'][$membership->membership_type_id] = $membership;
-              unset($contribution->_relatedObjects['membership'][$membershipTypeIdKey]);
-              unset($memberships[$membershipTypeIdKey]);
-            }
           }
         }
-        //update the memberships object with updated membershipTypeId data
-        //if membershipTypeId has changed after membership update
-        if (!empty($membershipsUpdate)) {
-          $memberships = $memberships + $membershipsUpdate;
-        }
       }
     }
     else {
@@ -4340,7 +4310,7 @@ LIMIT 1;";
    * @return array
    */
   public static function sendMail(&$input, &$ids, &$objects, &$values, $recur = FALSE, $returnMessageText = FALSE) {
-    $contribution = &$objects['contribution'];
+    $contribution = $objects['contribution'];
     $input['is_recur'] = $recur;
     // set receipt from e-mail and name in value
     if (!$returnMessageText) {
diff --git a/api/v3/MembershipLog.php b/api/v3/MembershipLog.php
new file mode 100644 (file)
index 0000000..d3307b1
--- /dev/null
@@ -0,0 +1,88 @@
+<?php
+/*
+ +--------------------------------------------------------------------+
+ | CiviCRM version 4.6                                                |
+ +--------------------------------------------------------------------+
+ | Copyright CiviCRM LLC (c) 2004-2015                                |
+ +--------------------------------------------------------------------+
+ | This file is a part of CiviCRM.                                    |
+ |                                                                    |
+ | CiviCRM is free software; you can copy, modify, and distribute it  |
+ | under the terms of the GNU Affero General Public License           |
+ | Version 3, 19 November 2007 and the CiviCRM Licensing Exception.   |
+ |                                                                    |
+ | CiviCRM is distributed in the hope that it will be useful, but     |
+ | WITHOUT ANY WARRANTY; without even the implied warranty of         |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.               |
+ | See the GNU Affero General Public License for more details.        |
+ |                                                                    |
+ | You should have received a copy of the GNU Affero General Public   |
+ | License and the CiviCRM Licensing Exception along                  |
+ | with this program; if not, contact CiviCRM LLC                     |
+ | at info[AT]civicrm[DOT]org. If you have questions about the        |
+ | GNU Affero General Public License or the licensing of CiviCRM,     |
+ | see the CiviCRM license FAQ at http://civicrm.org/licensing        |
+ +--------------------------------------------------------------------+
+ */
+
+/**
+ * This api exposes CiviCRM MembershipLog records.
+ *
+ * @package CiviCRM_APIv3
+ */
+
+/**
+ * API to Create or update a MembershipLog.
+ *
+ * @param array $params
+ *   Values of MembershipLog.
+ *
+ * @return array
+ *   API result array.
+ */
+function civicrm_api3_membership_log_create($params) {
+  return _civicrm_api3_basic_create(_civicrm_api3_get_BAO(__FUNCTION__), $params);
+}
+
+/**
+ * Adjust Metadata for Create action.
+ *
+ * The metadata is used for setting defaults, documentation & validation.
+ *
+ * @param array $params
+ *   Array of parameters determined by getfields.
+ */
+function _civicrm_api3_membership_log_create_spec(&$params) {
+  $params['membership_id']['api.required'] = TRUE;
+}
+
+/**
+ * Get a Membership Log.
+ *
+ * This api is used for finding an existing membership log.
+ *
+ * @param array $params
+ *   An associative array of name/value property values of civicrm_membership_log.
+ * {getfields MembershipLog_get}
+ *
+ * @return array
+ *   API result array
+ */
+function civicrm_api3_membership_log_get($params) {
+  return _civicrm_api3_basic_get(_civicrm_api3_get_BAO(__FUNCTION__), $params);
+}
+
+/**
+ * Deletes an existing membership log.
+ *
+ * This API is used for deleting a membership log
+ * Required parameters : id of a membership log
+ *
+ * @param array $params
+ *
+ * @return array
+ *   API result array
+ */
+function civicrm_api3_membership_log_delete($params) {
+  return _civicrm_api3_basic_delete(_civicrm_api3_get_BAO(__FUNCTION__), $params);
+}
index 12661a81e7b68bc24140d2c5b4a9178939b25aec..5d16b62dc4574e26a5ab36bbb14e41be27307b5c 100644 (file)
@@ -1563,10 +1563,29 @@ class api_v3_ContributionTest extends CiviUnitTestCase {
    */
   public function testCompleteTransactionMembershipPriceSet() {
     $this->createPriceSetWithPage('membership');
+    $stateOfGrace = $this->callAPISuccess('MembershipStatus', 'getvalue', array(
+      'name' => 'Grace',
+      'return' => 'id')
+    );
     $this->setUpPendingContribution($this->_ids['price_field_value'][0]);
+    $membership = $this->callAPISuccess('membership', 'getsingle', array('id' => $this->_ids['membership']));
+    $logs = $this->callAPISuccess('MembershipLog', 'get', array(
+      'membership_id' => $this->_ids['membership'],
+    ));
+    $this->assertEquals(1, $logs['count']);
+    $this->assertEquals($stateOfGrace, $membership['status_id']);
     $this->callAPISuccess('contribution', 'completetransaction', array('id' => $this->_ids['contribution']));
     $membership = $this->callAPISuccess('membership', 'getsingle', array('id' => $this->_ids['membership']));
     $this->assertEquals(date('Y-m-d', strtotime('yesterday + 1 year')), $membership['end_date']);
+    $this->callAPISuccessGetSingle('LineItem', array(
+      'entity_id' => $this->_ids['membership'],
+      'entity_table' => 'civicrm_membership',
+    ));
+    $logs = $this->callAPISuccess('MembershipLog', 'get', array(
+      'membership_id' => $this->_ids['membership'],
+    ));
+    $this->assertEquals(2, $logs['count']);
+    $this->assertNotEquals($stateOfGrace, $logs['values'][2]['status_id']);
     $this->cleanUpAfterPriceSets();
   }
 
@@ -1661,6 +1680,7 @@ class api_v3_ContributionTest extends CiviUnitTestCase {
       'membership_type_id' => $this->_ids['membership_type'],
       'start_date' => 'yesterday - 1 year',
       'end_date' => 'yesterday',
+      'join_date' => 'yesterday - 1 year',
     ));
     $contribution = $this->callAPISuccess('contribution', 'create', array(
       'domain_id' => 1,
@@ -1916,8 +1936,8 @@ class api_v3_ContributionTest extends CiviUnitTestCase {
   }
 
   /**
-   * @param $contribution
-   * @param $context
+   * @param array $contribution
+   * @param string $context
    * @param int $instrumentId
    */
   public function _checkFinancialTrxn($contribution, $context, $instrumentId = NULL) {