Fix unreleased api change
authorEileen McNaughton <emcnaughton@wikimedia.org>
Tue, 15 Jun 2021 21:40:57 +0000 (09:40 +1200)
committerEileen McNaughton <emcnaughton@wikimedia.org>
Tue, 15 Jun 2021 22:06:37 +0000 (10:06 +1200)
An unreleased change adds the entity ids for membership to the return values.

However, on digging into further cleanup I realised that the entity ids are in
the line item array, along with other values which may or may not be useful,
and it's cleaner, more complete and more maintainable to return the line_items.

It requires an extra foreach loop in the calling code but
I don't see that as a downside.

We should change this in the rc so what is released is consistent

Test cover in testSubmitRecur & other tests in CRM_Member_Form_MembershipTest

CRM/Member/Form/Membership.php
api/v3/Order.php
tests/phpunit/CRMTraits/Financial/OrderTrait.php

index fb53ee21015c87514e27ad7f3738bb3420e7f9f4..ed0442b8d59254daf77e245983268d5efdce823f 100644 (file)
@@ -1168,7 +1168,7 @@ DESC limit 1");
           ]
         );
         $this->ids['Contribution'] = $contribution['id'];
-        $this->setMembershipIDs($contribution['values'][$contribution['id']]['membership_id']);
+        $this->setMembershipIDsFromOrder($contribution);
 
         //create new soft-credit record, CRM-13981
         if ($softParams) {
@@ -1988,4 +1988,17 @@ DESC limit 1");
     return array_merge($this->getFormMembershipParams(), $this->getMembershipParameters()[$membershipTypeID]);
   }
 
+  /**
+   * @param array $contribution
+   */
+  protected function setMembershipIDsFromOrder(array $contribution): void {
+    $ids = [];
+    foreach ($contribution['values'][$contribution['id']]['line_item'] as $line) {
+      if ($line['entity_table'] ?? '' === 'civicrm_membership') {
+        $ids[] = $line['entity_id'];
+      }
+    }
+    $this->setMembershipIDs($ids);
+  }
+
 }
index 2a9a5e4936cdfebe46023c621776845b9e480f35..870b07fbd44253baec3415a32a700c5c3bed1d33 100644 (file)
@@ -76,9 +76,9 @@ function civicrm_api3_order_create(array $params): array {
   $entity = NULL;
   $entityIds = [];
   $params['contribution_status_id'] = 'Pending';
+  $priceSetID = NULL;
 
   if (!empty($params['line_items']) && is_array($params['line_items'])) {
-    $priceSetID = NULL;
     CRM_Contribute_BAO_Contribution::checkLineItems($params);
     foreach ($params['line_items'] as $lineItems) {
       $entityParams = $lineItems['params'] ?? [];
@@ -149,6 +149,8 @@ function civicrm_api3_order_create(array $params): array {
   }
 
   $contribution = civicrm_api3('Contribution', 'create', $contributionParams);
+  $contribution['values'][$contribution['id']]['line_item'] = $params['line_item'][$priceSetID] ?? [];
+
   // add payments
   if ($entity && !empty($contribution['id'])) {
     foreach ($entityIds as $entityId) {
@@ -161,7 +163,6 @@ function civicrm_api3_order_create(array $params): array {
         $paymentParams += $entityParams;
       }
       elseif ($entity === 'membership') {
-        $contribution['values'][$contribution['id']]['membership_id'][] = $entityId;
         $paymentParams['isSkipLineItem'] = TRUE;
       }
       civicrm_api3($entity . '_payment', 'create', $paymentParams);
index 1ea8177966a7da5678b30dd57a10562268e10185..ae0eff8c78f2cfa7f1837cc64c0c9111c26ff865 100644 (file)
@@ -127,7 +127,12 @@ trait CRMTraits_Financial_OrderTrait {
     ]);
 
     $this->ids['Contribution'][0] = $order['id'];
-    $this->ids['Membership']['order'] = $order['values'][$order['id']]['membership_id'][0];
+    foreach ($order['values'][$order['id']]['line_item'] as $line) {
+      if (($line['entity_table'] ?? '') === 'civicrm_membership') {
+        $this->ids['Membership']['order'] = $line['entity_id'];
+      }
+    }
+
   }
 
   /**