Merge pull request #18962 from colemanw/dashboardPerms
authorSeamus Lee <seamuslee001@gmail.com>
Fri, 13 Nov 2020 00:26:01 +0000 (11:26 +1100)
committerGitHub <noreply@github.com>
Fri, 13 Nov 2020 00:26:01 +0000 (11:26 +1100)
API - Finer-grained permisions for the dashboard & dashlet entities

CRM/Contribute/BAO/Contribution.php
CRM/Contribute/Form/Contribution.php
CRM/Core/I18n/PseudoConstant.php
CRM/Core/Payment/AuthorizeNetIPN.php
CRM/Custom/Form/Option.php
contributor-key.yml
ext/oauth-client/CRM/OAuth/Page/Return.php
ext/oauth-client/templates/CRM/OAuth/Page/Return.tpl
release-notes/5.32.0.md
tests/phpunit/CRM/Core/Payment/AuthorizeNetIPNTest.php
tests/phpunit/CiviTest/CiviUnitTestCase.php

index 2f5c8769d82d430a3c65f01aad017d856be6b87a..3d095bbd94439fc5541ab2e886db27450c36791b 100644 (file)
@@ -2626,10 +2626,6 @@ LEFT JOIN  civicrm_contribution contribution ON ( componentPayment.contribution_
       $recurringContribution = civicrm_api3('ContributionRecur', 'getsingle', [
         'id' => $contributionParams['contribution_recur_id'],
       ]);
-      if (!empty($recurringContribution['campaign_id'])) {
-        // CRM-17718 the campaign id on the contribution recur record should get precedence.
-        $contributionParams['campaign_id'] = $recurringContribution['campaign_id'];
-      }
       if (!empty($recurringContribution['financial_type_id'])) {
         // CRM-17718 the campaign id on the contribution recur record should get precedence.
         $contributionParams['financial_type_id'] = $recurringContribution['financial_type_id'];
@@ -2652,10 +2648,20 @@ LEFT JOIN  civicrm_contribution contribution ON ( componentPayment.contribution_
       else {
         $contributionParams['financial_type_id'] = $templateContribution['financial_type_id'];
       }
-      foreach (['contact_id', 'currency', 'source'] as $fieldName) {
-        $contributionParams[$fieldName] = $templateContribution[$fieldName];
+      foreach (['contact_id', 'currency', 'source', 'amount_level', 'address_id'] as $fieldName) {
+        if (isset($templateContribution[$fieldName])) {
+          $contributionParams[$fieldName] = $templateContribution[$fieldName];
+        }
+      }
+      if (!empty($recurringContribution['campaign_id'])) {
+        // CRM-17718 the campaign id on the contribution recur record should get precedence.
+        $contributionParams['campaign_id'] = $recurringContribution['campaign_id'];
+      }
+      if (!isset($contributionParams['campaign_id']) && isset($templateContribution['campaign_id'])) {
+        // Fall back on value from the previous contribution if not passed in as input
+        // or loadable from the recurring contribution.
+        $contributionParams['campaign_id'] = $templateContribution['campaign_id'];
       }
-
       $contributionParams['source'] = $contributionParams['source'] ?: ts('Recurring contribution');
 
       //CRM-18805 -- Contribution page not recorded on recurring transactions, Recurring contribution payments
@@ -4856,101 +4862,6 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac
     return $contributeSettings[$name] ?? NULL;
   }
 
-  /**
-   * This function process contribution related objects.
-   *
-   * @param int $contributionId
-   * @param int $statusId
-   * @param int|null $previousStatusId
-   *
-   * @param string $receiveDate
-   *
-   * @return null|string
-   */
-  public static function transitionComponentWithReturnMessage($contributionId, $statusId, $previousStatusId = NULL, $receiveDate = NULL) {
-    $statusMsg = NULL;
-    if (!$contributionId || !$statusId) {
-      return $statusMsg;
-    }
-
-    $params = [
-      'contribution_id' => $contributionId,
-      'contribution_status_id' => $statusId,
-      'previous_contribution_status_id' => $previousStatusId,
-      'receive_date' => $receiveDate,
-    ];
-
-    $updateResult = CRM_Contribute_BAO_Contribution::transitionComponents($params);
-
-    if (!is_array($updateResult) ||
-      !($updatedComponents = CRM_Utils_Array::value('updatedComponents', $updateResult)) ||
-      !is_array($updatedComponents) ||
-      empty($updatedComponents)
-    ) {
-      return $statusMsg;
-    }
-
-    // get the user display name.
-    $sql = "
-   SELECT  display_name as displayName
-     FROM  civicrm_contact
-LEFT JOIN  civicrm_contribution on (civicrm_contribution.contact_id = civicrm_contact.id )
-    WHERE  civicrm_contribution.id = {$contributionId}";
-    $userDisplayName = CRM_Core_DAO::singleValueQuery($sql);
-
-    // get the status message for user.
-    foreach ($updatedComponents as $componentName => $updatedStatusId) {
-
-      if ($componentName == 'CiviMember') {
-        $updatedStatusName = CRM_Utils_Array::value($updatedStatusId,
-          CRM_Member_PseudoConstant::membershipStatus()
-        );
-
-        $statusNameMsgPart = 'updated';
-        switch ($updatedStatusName) {
-          case 'Cancelled':
-          case 'Expired':
-            $statusNameMsgPart = $updatedStatusName;
-            break;
-        }
-
-        $statusMsg .= "<br />" . ts("Membership for %1 has been %2.", [
-          1 => $userDisplayName,
-          2 => $statusNameMsgPart,
-        ]);
-      }
-
-      if ($componentName == 'CiviEvent') {
-        $updatedStatusName = CRM_Utils_Array::value($updatedStatusId,
-          CRM_Event_PseudoConstant::participantStatus()
-        );
-        if ($updatedStatusName == 'Cancelled') {
-          $statusMsg .= "<br />" . ts("Event Registration for %1 has been Cancelled.", [1 => $userDisplayName]);
-        }
-        elseif ($updatedStatusName == 'Registered') {
-          $statusMsg .= "<br />" . ts("Event Registration for %1 has been updated.", [1 => $userDisplayName]);
-        }
-      }
-
-      if ($componentName == 'CiviPledge') {
-        $updatedStatusName = CRM_Utils_Array::value($updatedStatusId,
-          CRM_Contribute_PseudoConstant::contributionStatus(NULL, 'name')
-        );
-        if ($updatedStatusName == 'Cancelled') {
-          $statusMsg .= "<br />" . ts("Pledge Payment for %1 has been Cancelled.", [1 => $userDisplayName]);
-        }
-        elseif ($updatedStatusName == 'Failed') {
-          $statusMsg .= "<br />" . ts("Pledge Payment for %1 has been Failed.", [1 => $userDisplayName]);
-        }
-        elseif ($updatedStatusName == 'Completed') {
-          $statusMsg .= "<br />" . ts("Pledge Payment for %1 has been updated.", [1 => $userDisplayName]);
-        }
-      }
-    }
-
-    return $statusMsg;
-  }
-
   /**
    * Get the contribution as it is in the database before being updated.
    *
index d453df3a7c9e482fbf5ab3310130541979402172..c28a695d92ef3c6d9114f623c9a106029c70a1f1 100644 (file)
@@ -1602,13 +1602,12 @@ class CRM_Contribute_Form_Contribution extends CRM_Contribute_Form_AbstractEditP
 
       // process associated membership / participant, CRM-4395
       if ($contribution->id && $action & CRM_Core_Action::UPDATE) {
-        $this->statusMessage[] = CRM_Contribute_BAO_Contribution::transitionComponentWithReturnMessage($contribution->id,
-          $contribution->contribution_status_id,
-          CRM_Utils_Array::value('contribution_status_id',
-            $this->_values
-          ),
-          $contribution->receive_date
-        );
+        CRM_Contribute_BAO_Contribution::transitionComponents([
+          'contribution_id' => $contribution->id,
+          'contribution_status_id' => $contribution->contribution_status_id,
+          'previous_contribution_status_id' => $this->_values['contribution_status_id'] ?? NULL,
+          'receive_date' => $contribution->receive_date,
+        ]);
       }
 
       array_unshift($this->statusMessage, ts('The contribution record has been saved.'));
index 5d1c8793d7d5e4b158415f253c4e1d3c04cd206c..6c4576b3ba3ea294964b7b08a568262ebfeb3451 100644 (file)
@@ -47,6 +47,7 @@ class CRM_Core_I18n_PseudoConstant {
       $longForShortMapping['fr'] = defined("CIVICRM_LANGUAGE_MAPPING_FR") ? CIVICRM_LANGUAGE_MAPPING_FR : 'fr_FR';
       $longForShortMapping['pt'] = defined("CIVICRM_LANGUAGE_MAPPING_PT") ? CIVICRM_LANGUAGE_MAPPING_PT : 'pt_PT';
       $longForShortMapping['es'] = defined("CIVICRM_LANGUAGE_MAPPING_ES") ? CIVICRM_LANGUAGE_MAPPING_ES : 'es_ES';
+      $longForShortMapping['nl'] = defined("CIVICRM_LANGUAGE_MAPPING_NL") ? CIVICRM_LANGUAGE_MAPPING_NL : 'nl_NL';
     }
     return $longForShortMapping;
   }
index 04042b587a8adcb7909c498f088668bc398eb0be..607fcc1fec21d1c43cafe3559e5a9880a43469f7 100644 (file)
@@ -96,23 +96,16 @@ class CRM_Core_Payment_AuthorizeNetIPN extends CRM_Core_Payment_BaseIPN {
         // create a contribution and then get it processed
         $contribution = new CRM_Contribute_BAO_Contribution();
         $contribution->contact_id = $ids['contact'];
-        $contribution->financial_type_id = $objects['contributionType']->id;
         $contribution->contribution_page_id = $ids['contributionPage'];
         $contribution->contribution_recur_id = $ids['contributionRecur'];
         $contribution->receive_date = $input['receive_date'];
-        $contribution->currency = $objects['contribution']->currency;
-        $contribution->amount_level = $objects['contribution']->amount_level;
-        $contribution->address_id = $objects['contribution']->address_id;
-        $contribution->campaign_id = $objects['contribution']->campaign_id;
-
-        $objects['contribution'] = &$contribution;
       }
       $input['payment_processor_id'] = $paymentProcessorID;
       $isFirstOrLastRecurringPayment = $this->recur($input, [
         'related_contact' => $ids['related_contact'] ?? NULL,
-        'participant' => !empty($objects['participant']) ? $objects['participant']->id : NULL,
+        'participant' => NULL,
         'contributionRecur' => $contributionRecur->id,
-      ], $contributionRecur, $objects['contribution'], $first);
+      ], $contributionRecur, $contribution, $first);
 
       if ($isFirstOrLastRecurringPayment) {
         //send recurring Notification email for user
index 7b4441074c33b565d959456f3990476fdd34bb06..60c941c3dbdb1ad38f63daeec2ff7c3cbb02ba54 100644 (file)
@@ -484,6 +484,7 @@ SELECT count(*)
       }
     }
 
+    CRM_Core_BAO_CustomOption::updateValue($customOption->id, $customOption->value);
     $customOption->save();
 
     $msg = ts('Your multiple choice option \'%1\' has been saved', [1 => $customOption->label]);
index 48a2c548d266ca23739b9cbb7560c4c8d6742ce3..980c98f3ee87c999b321b113517c11fc38e0fd0a 100644 (file)
   name        : Justin Freeman
   organization: Agileware
 
+- github      : jvos
+
 - github      : kainuk
   name        : Klaas Eikelboom
   organization: CiviCoop
   organization: Circle Interactive
   jira        : marshCircle
 
+- github      : masetto
+  organization: PERORA SRL
+  name        : Samuele Masetto
+
 - github      : mathavanveda
   name        : Mathavan Veeramuthu
   organization: Veda Consulting
   name        : Martin Hansen
   organization: PeaceWorks Technology Solutions
 
+- github      : maxtsero
+  name        : Max Tsero
+  organization: Atomic Development
+
 - github      : mc0e
   name        : Andrew McNaughton
   jira        : mc0e
   organization: Electronic Frontier Foundation
   jira        : mfb
 
+- github      : mglaman
+  name        : Matt Glaman
+  organization: Centarro
+     
 - github      : mgribaudo
   name        : Marcello Gribaudo
   jira        : mgribaudo
index 4fcb35c4ed9426b0518c1dae9ce2c3ef82e2b02d..b3df41301ae31df6c07df518c76a64a82999ead9 100644 (file)
@@ -6,16 +6,33 @@ class CRM_OAuth_Page_Return extends CRM_Core_Page {
   const TTL = 3600;
 
   public function run() {
+    $json = function ($d) {
+      return json_encode($d, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
+    };
+
     $state = self::loadState(CRM_Utils_Request::retrieve('state', 'String'));
+    if (CRM_Core_Permission::check('manage OAuth client')) {
+      $this->assign('state', $state);
+      $this->assign('stateJson', $json($state ?? NULL));
+    }
 
     if (CRM_Utils_Request::retrieve('error', 'String')) {
+      CRM_Utils_System::setTitle(ts('OAuth Error'));
       $error = CRM_Utils_Array::subset($_GET, ['error', 'error_description', 'error_uri']);
       $event = \Civi\Core\Event\GenericHookEvent::create([
         'error' => $error['error'] ?? NULL,
         'description' => $error['description'] ?? NULL,
         'uri' => $error['uri'] ?? NULL,
+        'state' => $state,
       ]);
       Civi::dispatcher()->dispatch('hook_civicrm_oauthReturnError', $event);
+
+      Civi::log()->info('OAuth returned error', [
+        'error' => $error,
+        'state' => $state,
+      ]);
+
+      $this->assign('error', $error ?? NULL);
     }
     elseif ($authCode = CRM_Utils_Request::retrieve('code', 'String')) {
       $client = \Civi\Api4\OAuthClient::get(0)->addWhere('id', '=', $state['clientId'])->execute()->single();
@@ -37,18 +54,17 @@ class CRM_OAuth_Page_Return extends CRM_Core_Page {
       if ($nextUrl !== NULL) {
         CRM_Utils_System::redirect($nextUrl);
       }
+
+      CRM_Utils_System::setTitle(ts('OAuth Token Created'));
+      if (CRM_Core_Permission::check('manage OAuth client')) {
+        $this->assign('token', CRM_OAuth_BAO_OAuthSysToken::redact($tokenRecord));
+        $this->assign('tokenJson', $json(CRM_OAuth_BAO_OAuthSysToken::redact($tokenRecord)));
+      }
     }
     else {
       throw new \Civi\OAuth\OAuthException("OAuth: Unrecognized return request");
     }
 
-    $json = function ($d) {
-      return json_encode($d, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
-    };
-    $this->assign('state', $json($state));
-    $this->assign('token', $json($tokenRecord ?? NULL));
-    $this->assign('error', $json($error ?? NULL));
-
     parent::run();
   }
 
index 30e6334f33be18cb9d53e585787de5c34c3cc4f4..09395084624d69d4c628635ce065fad70bea57ef 100644 (file)
@@ -1,10 +1,41 @@
-<h3>Welcome back</h3>
+{if $error}
+    <div class="crm-accordion-wrapper">
+        <div class="crm-accordion-header">
+            {ts}OAuth Error Details{/ts}
+        </div>
+        <div class="crm-accordion-body">
+            <ul>
+                <li><strong>{ts}Error type:{/ts}</strong> {$error.error|escape:'html'}</li>
+                <li><strong>{ts}Error description:{/ts}</strong>
+                    <pre>{$error.error_description|escape:'html'}</pre>
+                </li>
+                <li><strong>{ts}Error URI:{/ts}</strong> <code>{$error.error_uri|escape:'html'}</code></li>
+            </ul>
+        </div>
+    </div>
+{else}
+    <p>{ts}An OAuth token was created!{/ts}</p>
+    <p>{ts}There is no clear "next step", so this may be a new integration. Please update the integration to define a next step via "hook_civicrm_oauthReturn" or "landingUrl".{/ts}</p>
+{/if}
 
-<h4>State:</h4>
-<pre>{$state}</pre>
+{if $stateJson}
+    <div class="crm-accordion-wrapper collapsed">
+        <div class="crm-accordion-header">
+            {ts}OAuth State{/ts}
+        </div>
+        <div class="crm-accordion-body">
+            <pre>{$stateJson}</pre>
+        </div>
+    </div>
+{/if}
 
-<h4>Token:</h4>
-<pre>{$token}</pre>
-
-<h4>Error</h4>
-<pre>{$error}</pre>
\ No newline at end of file
+{if $tokenJson}
+    <div class="crm-accordion-wrapper collapsed">
+        <div class="crm-accordion-header">
+            {ts}OAuth Token{/ts}
+        </div>
+        <div class="crm-accordion-body">
+            <pre>{$tokenJson}</pre>
+        </div>
+    </div>
+{/if}
index 2acf7169d2056790f1ef7c84498db89614f498a7..c78fa24d18f9d6167c73ddbb5df05900e4198e4d 100644 (file)
@@ -13,354 +13,579 @@ Released December 2, 2020
 
 | *Does this version...?*                                         |         |
 |:--------------------------------------------------------------- |:-------:|
-| Fix security vulnerabilities?                                   |         |
-| Change the database schema?                                     |         |
-| Alter the API?                                                  |         |
-| Require attention to configuration options?                     |         |
-| Fix problems installing or upgrading to a previous version?     |         |
-| Introduce features?                                             |         |
-| Fix bugs?                                                       |         |
+| Fix security vulnerabilities?                                   |   no    |
+| **Change the database schema?**                                 | **yes** |
+| **Alter the API?**                                              | **yes** |
+| Require attention to configuration options?                     |   no    |
+| **Fix problems installing or upgrading to a previous version?** | **yes** |
+| **Introduce features?**                                         | **yes** |
+| **Fix bugs?**                                                   | **yes** |
 
 ## <a name="features"></a>Features
 
 ### Core CiviCRM
 
-- **crm- Missing Summary ([18913](https://github.com/civicrm/civicrm-core/pull/18913))**
+- **Display public title and description on profiles and unsubscribe/subscribe
+  forms as appropriate if set
+  ([18645](https://github.com/civicrm/civicrm-core/pull/18645))**
 
-- **CRM-5048 Missing Summary ([18859](https://github.com/civicrm/civicrm-core/pull/18859))**
+  Starts to make use of the new front end title and description fields on
+  unsubscribe, subscribe and user dashboard pages.
 
-- **CRM-9362 Missing Summary ([18411](https://github.com/civicrm/civicrm-core/pull/18411))**
+- **Allow custom fields of type Autocomplete-Select to be multivalued
+  ([18449](https://github.com/civicrm/civicrm-core/pull/18449))**
 
-- **CRM- Missing Summary ([115](https://github.com/civicrm/civicrm-backdrop/pull/115))**
+  Adds support for multi-select for auto-complete custom fields.
 
-## <a name="bugs"></a>Bugs resolved
-
-### Core CiviCRM
+- **Add more columns for Activity Report (Work towards
+  [dev/core#2104](https://lab.civicrm.org/dev/core/-/issues/2104):
+  [18827](https://github.com/civicrm/civicrm-core/pull/18827) and
+  [18840](https://github.com/civicrm/civicrm-core/pull/18840))**
 
-- **get log date from tables available in query with data instead of last table ([18868](https://github.com/civicrm/civicrm-core/pull/18868))**
+  Improves the Activity Report by adding columns for:
+    - Birth Date of the target contact
+    - Gender of the target contact
 
-- **Adds performance improvement when browsing the report logs ([18851](https://github.com/civicrm/civicrm-core/pull/18851))**
+- **More accurate language around social media sharing
+  ([18743](https://github.com/civicrm/civicrm-core/pull/18743))**
 
-- **Schema handler fixes ([18932](https://github.com/civicrm/civicrm-core/pull/18932))**
+  Improves user experience by clarifying language around social media sharing.
 
-- **5.31.0 - Set version. Update notes. ([18933](https://github.com/civicrm/civicrm-core/pull/18933))**
+- **Adds performance improvement when browsing the report logs
+  ([18851](https://github.com/civicrm/civicrm-core/pull/18851))**
 
-- **5.31 ([18931](https://github.com/civicrm/civicrm-core/pull/18931))**
+  Improves performance when browsing the logs.
 
-- **closes financial/#156: Set contribution status to refunded even if cancelled_payment_id is set ([18930](https://github.com/civicrm/civicrm-core/pull/18930))**
+- **Clean up search actions in core to make them available from search builder
+  (Work Towards [dev/core#2066](https://lab.civicrm.org/dev/core/-/issues/2066):
+  [18773](https://github.com/civicrm/civicrm-core/pull/18773),
+  [18783](https://github.com/civicrm/civicrm-core/pull/18783),
+  [18768](https://github.com/civicrm/civicrm-core/pull/18768) and
+  [18767](https://github.com/civicrm/civicrm-core/pull/18767))**
 
-- **dev/core#2166 - E_NOTICE when deleting mail account ([18927](https://github.com/civicrm/civicrm-core/pull/18927))**
+  Preliminary cleanup of code to move towards making search actions available
+  from search builder.
 
-- **dev/mail#2141 - MailSettings - Add button+API for testing a connection ([18911](https://github.com/civicrm/civicrm-core/pull/18911))**
+- **Lotsa new features for the Search Kit extension
+  ([18876](https://github.com/civicrm/civicrm-core/pull/18876))**
 
-- **5.31 to master ([18923](https://github.com/civicrm/civicrm-core/pull/18923))**
+  Integrates Search Kit/Afform. Adds a standalone page for viewing search kit
+  displays. Adds first search kit display type "table". Adds search kit display
+  entity and UI. Adds CRUD form for managing saved search kit searches.
 
-- **Add UI metadata for payment_processor_id on financialTrxn ([18917](https://github.com/civicrm/civicrm-core/pull/18917))**
+- **Search ext: Add links to search admin and improve links in displays
+  ([18909](https://github.com/civicrm/civicrm-core/pull/18909))**
 
-- **dev/core#2139 fix defaulting for multi-select custom fields ([18907](https://github.com/civicrm/civicrm-core/pull/18907))**
+  Improves links in search kit results.
 
-- **Search ext: Fix validation and saving on search admin screen ([18919](https://github.com/civicrm/civicrm-core/pull/18919))**
+- **SavedSearch - Add name and label columns
+  ([18809](https://github.com/civicrm/civicrm-core/pull/18809))**
 
-- **dev/core#2141 - Add "oauth-client" extension (hidden) ([18914](https://github.com/civicrm/civicrm-core/pull/18914))**
+  Adds 2 database columns: `name` and `label` for the SavedSearch entity. This
+  is needed by the new Search Kit extension.
 
-- **dev/core#2148 - Incorrect use of ts, quotes, escape in log call ([18864](https://github.com/civicrm/civicrm-core/pull/18864))**
+- **Add entity paths to schema & APIv4
+  ([18887](https://github.com/civicrm/civicrm-core/pull/18887))**
 
-- **Use standard names for entity paths and add a few more paths ([18915](https://github.com/civicrm/civicrm-core/pull/18915))**
+  Adds metadata to some entities (hopefully more will be added in the
+  future) for the paths at which they can be created/updated/viewed/deleted. The
+  metadata is accessed via the DAO, and exposed to APIv4.
 
-- **CRM_Core_Error::formatFooException - Don't bomb on 'Error' ([18910](https://github.com/civicrm/civicrm-core/pull/18910))**
+- **Use standard names for entity paths and add a few more paths
+  ([18915](https://github.com/civicrm/civicrm-core/pull/18915))**
 
-- **Search ext: Add links to search admin and improve links in displays ([18909](https://github.com/civicrm/civicrm-core/pull/18909))**
+  Standardizes entity paths.
 
-- **dev/core#2141 - composer.json - Require league/oauth2-{client,google}  ([18908](https://github.com/civicrm/civicrm-core/pull/18908))**
+- **APIv4 - Add `$result->single()` helper
+  ([18871](https://github.com/civicrm/civicrm-core/pull/18871))**
 
-- **5.31 ([18904](https://github.com/civicrm/civicrm-core/pull/18904))**
+  Improves developer-experience when using APIv4 by adding a helper function to
+  retrieve just one result.
 
-- **dev/core#2043 Remove instance of pass-by-ref ([18802](https://github.com/civicrm/civicrm-core/pull/18802))**
+- **Update CRM_Utils_Constant::value to support env variables
+  ([18806](https://github.com/civicrm/civicrm-core/pull/18806))**
 
-- **Move call to update related pledges on contribution cancel to extension ([18894](https://github.com/civicrm/civicrm-core/pull/18894))**
+  Extends the ability to set a variable using env to any variable accessed via
+  CRM_Utils_Constant::value.
 
-- **Remove IPN reference to _relatedObjects, deprecate property ([18895](https://github.com/civicrm/civicrm-core/pull/18895))**
+- **Angular Loader: Allow modules to specify permissions to add client-side
+  ([18754](https://github.com/civicrm/civicrm-core/pull/18754))**
 
-- **[Ref] Simplify params ([18896](https://github.com/civicrm/civicrm-core/pull/18896))**
+  Makes it possible for angular modules to define permissions.
 
-- **[REF] Simplify use of shared code. ([18900](https://github.com/civicrm/civicrm-core/pull/18900))**
+- **AngularLoader: Support 'settingsFactory' callbacks in angular modules.
+  ([18731](https://github.com/civicrm/civicrm-core/pull/18731))**
 
-- **Remove deprecated code ([18903](https://github.com/civicrm/civicrm-core/pull/18903))**
+  Allows Angular modules with complex/expensive data to provide it with a
+  callback, which will only be invoked if the module is actively loaded on the
+  page.
 
-- **Add postProcess hook to MessageTemplates ([18807](https://github.com/civicrm/civicrm-core/pull/18807))**
+### CiviContribute
 
-- **[REF] Remove silly if ([18897](https://github.com/civicrm/civicrm-core/pull/18897))**
+- **Use of <th> tags for labels on Contribution Amounts tab gives them unique
+  styling
+  ([dev/user-interface#34](https://lab.civicrm.org/dev/user-interface/-/issues/34):
+  [18850](https://github.com/civicrm/civicrm-core/pull/18850))**
 
-- **dev/core#2141 - Add hook_civicrm_alterMailStore ([18902](https://github.com/civicrm/civicrm-core/pull/18902))**
+  Makes the look and feel when configuring Contribution Forms more consistent.
 
-- **[Ref] Move sending the email back out of the recur function ([18852](https://github.com/civicrm/civicrm-core/pull/18852))**
+- **[Meta] Does CiviCRM have a single defined application HTTP entry point which
+  routes all requests?
+  (Work Towards [dev/cloud-native#16](https://lab.civicrm.org/dev/cloud-native/-/issues/16):
+  [17969](https://github.com/civicrm/civicrm-core/pull/17969))**
 
-- **5.31 to master ([18893](https://github.com/civicrm/civicrm-core/pull/18893))**
+  Migrates the Contribution Page widget extern url to use the normal CMS routing
+  mechanism.
 
-- **dev/core#927 Move handling of participant.cancel from BaseIPN to  contributioncancelactions ([18881](https://github.com/civicrm/civicrm-core/pull/18881))**
+- **Add UI metadata for payment_processor_id on financialTrxn
+  ([18917](https://github.com/civicrm/civicrm-core/pull/18917))**
 
-- **[Ref] Use direct version of participant id ([18882](https://github.com/civicrm/civicrm-core/pull/18882))**
+  Improve metadata for `financialTrxn`.
 
-- **Hack away at false negative test fails ([18892](https://github.com/civicrm/civicrm-core/pull/18892))**
+### CiviMail
 
-- **5.31 ([18891](https://github.com/civicrm/civicrm-core/pull/18891))**
+- **OAuth2 administration (email focus) (Work Towards
+  [dev/core#2141](https://lab.civicrm.org/dev/core/-/issues/2141):
+  [18902](https://github.com/civicrm/civicrm-core/pull/18902),
+  [18914](https://github.com/civicrm/civicrm-core/pull/18914),
+  [18885](https://github.com/civicrm/civicrm-core/pull/18885) and
+  [18908](https://github.com/civicrm/civicrm-core/pull/18908))**
 
-- **Add entity paths to schema & APIv4 ([18887](https://github.com/civicrm/civicrm-core/pull/18887))**
+  Adds a new hook `hook_civicrm_alterMailStore` which can be used to add or
+  modify a driver. Adds a hidden `oauth-client` extension for connecting to
+  OAuth2-based-web-services. Adds a UI to "Add Mail Account". Adds two
+  libraries: "league/oauth2-client" and "league/oauth2-google".
 
-- **Lotsa new features for the Search Kit extension ([18876](https://github.com/civicrm/civicrm-core/pull/18876))**
+- **MailSettings - Add button+API for testing a connection
+  ([18911](https://github.com/civicrm/civicrm-core/pull/18911))**
 
-- **Deprecate hook_civicrm_crudLink ([18888](https://github.com/civicrm/civicrm-core/pull/18888))**
+  Adds a button (and API action) to the Edit Mail Account form to test the
+  connection.
 
-- **dev/core#2141 - "Add Mail Account" - Allow hookable listing of setup links ([18885](https://github.com/civicrm/civicrm-core/pull/18885))**
+- **Add postProcess hook to MessageTemplates
+  ([18807](https://github.com/civicrm/civicrm-core/pull/18807))**
 
-- **(NFC) Fix typo in Money valueFormat depretation warning ([18886](https://github.com/civicrm/civicrm-core/pull/18886))**
+  Makes it so extension developers can use the 'postProcess' hook to access
+  'MessageTemplates'.
 
-- **/dev/core#2152: Merge contacts keep case roles ([18884](https://github.com/civicrm/civicrm-core/pull/18884))**
+### WordPress Integration
 
-- **Remove always-true & otherwise silly if ([18883](https://github.com/civicrm/civicrm-core/pull/18883))**
+- **MySQL socket while using CiviCRM installer
+  ([dev/wordpress#35](https://lab.civicrm.org/dev/wordpress/-/issues/35):
+  [18913](https://github.com/civicrm/civicrm-core/pull/18913))**
 
-- **Fix extension generated DAO files to pass civilint ([18879](https://github.com/civicrm/civicrm-core/pull/18879))**
+  Ensures `civicrm-setup` can handle database connections with unix sockets.
 
-- **Merge branch 5.31 into master ([18875](https://github.com/civicrm/civicrm-core/pull/18875))**
+## <a name="bugs"></a>Bugs resolved
 
-- **Participant Calculate/Fees: fix ts usage, simplify wording ([18874](https://github.com/civicrm/civicrm-core/pull/18874))**
+### Core CiviCRM
 
-- **dev/core#1879 Fix inconsistent ability to view event information ([18712](https://github.com/civicrm/civicrm-core/pull/18712))**
+- **Fix main contact uf url on merge screen
+  ([18742](https://github.com/civicrm/civicrm-core/pull/18742))**
 
-- **Show only Active SMS provider List on Mass SMS form ([18867](https://github.com/civicrm/civicrm-core/pull/18867))**
+  Ensures the UF url of the main contact on the merge screen points to the
+  correct user.
 
-- **dev/core#2150 Re-enact the recapture validation by validating the res… ([18872](https://github.com/civicrm/civicrm-core/pull/18872))**
+- **Fix sendconfirmation api to override receipt params
+  ([18789](https://github.com/civicrm/civicrm-core/pull/18789))**
 
-- **APIv4 - Add `$result->single()` helper ([18871](https://github.com/civicrm/civicrm-core/pull/18871))**
+  Ensures params in `sendconfirmation` API take precedence over receipt params.
 
-- **ClassLoader - Fix autoloading of `API_Exception` ([18870](https://github.com/civicrm/civicrm-core/pull/18870))**
+- **"Non-static method CRM_Contact_Page_AJAX::pdfFormat() should not be called
+  statically" when changing the page format on print/merge document
+  ([dev/core#2110](https://lab.civicrm.org/dev/core/-/issues/2110):
+  [18726](https://github.com/civicrm/civicrm-core/pull/18726))**
 
-- **Refactor entityParams in Order.Create API so it is easier to understand/modify ([18306](https://github.com/civicrm/civicrm-core/pull/18306))**
+  Fixes notices when generating PDFs.
 
-- **(core/dev#2104) Add gender column for target contact to activity report ([18840](https://github.com/civicrm/civicrm-core/pull/18840))**
+- **updated italian provinces
+  ([18859](https://github.com/civicrm/civicrm-core/pull/18859))**
 
-- **dev/core#927 Move cancelling of related memberships to extension from BaseIPN ([18853](https://github.com/civicrm/civicrm-core/pull/18853))**
+  Ensures that the right abbreviations are used for Italian provinces.
 
-- **Move filtering of unpermitted options for reports/ search select to financialacl extension ([18849](https://github.com/civicrm/civicrm-core/pull/18849))**
+- **APIv4 Activity::update() causes target contacts and assignees to be deleted
+  ([dev/core#1428](https://lab.civicrm.org/dev/core/-/issues/1428):
+  [18720](https://github.com/civicrm/civicrm-core/pull/18720))**
 
-- **dev/core#2146 - Long unicode contact names get truncated badly causing a crash ([18862](https://github.com/civicrm/civicrm-core/pull/18862))**
+  Adds a test.
 
-- **APIv4 - Fix type coersion of non-string input ([18860](https://github.com/civicrm/civicrm-core/pull/18860))**
+- **APIv4 - Fix type coersion of non-string input
+  ([18860](https://github.com/civicrm/civicrm-core/pull/18860))**
 
-- **Remove meaningless legacy code ([18856](https://github.com/civicrm/civicrm-core/pull/18856))**
+  Fixes APIv4 to not accidentally change non-string input to string.
 
-- **5.31 ([18861](https://github.com/civicrm/civicrm-core/pull/18861))**
+- **Participant Calculate/Fees: fix ts usage, simplify wording
+  ([18874](https://github.com/civicrm/civicrm-core/pull/18874))**
 
-- **Fix campaign_id handling for batch entry ([18792](https://github.com/civicrm/civicrm-core/pull/18792))**
+  Fixes an incorrect use of ts, which assumes how strings can be concatenated.
+  It also makes it difficult to use Word Replacements.
 
-- **Set id after save for the mailing component in the postProcess ([18808](https://github.com/civicrm/civicrm-core/pull/18808))**
+- **Cancel first contribution associated to membership, cancels the membership
+  ([dev/core#927](https://lab.civicrm.org/dev/core/-/issues/927):
+  [18814](https://github.com/civicrm/civicrm-core/pull/18814),
+  [18812](https://github.com/civicrm/civicrm-core/pull/18812),
+  [18853](https://github.com/civicrm/civicrm-core/pull/18853),
+  [18786](https://github.com/civicrm/civicrm-core/pull/18786),
+  [18881](https://github.com/civicrm/civicrm-core/pull/18881),
+  [18813](https://github.com/civicrm/civicrm-core/pull/18813) and
+  [18784](https://github.com/civicrm/civicrm-core/pull/18784))**
 
-- **Move CRM_Member_BAO_MembershipType::getPermissionedMembershipTypes to financial acl extension ([18848](https://github.com/civicrm/civicrm-core/pull/18848))**
+- **When default changed for an alphanumeric multi-select custom field
+  defaulting breaks for that field on backend
+  forms.([dev/core#2139](https://lab.civicrm.org/dev/core/-/issues/2139):
+  [18907](https://github.com/civicrm/civicrm-core/pull/18907))**
 
-- **backdrop#116 Override sessionStart function and use backdrop function… ([18745](https://github.com/civicrm/civicrm-core/pull/18745))**
+- **Long cyrillic names give error Data too long for column sort_name when
+  saving a contact
+  ([dev/core#2146](https://lab.civicrm.org/dev/core/-/issues/2146):
+  [18862](https://github.com/civicrm/civicrm-core/pull/18862))**
 
-- **Get phone_type by name. dev/core#2138 ([18842](https://github.com/civicrm/civicrm-core/pull/18842))**
+- **Incorrect use of quotes and escape and ts in CRM_Core_DAO::copyValues
+  ([dev/core#2148](https://lab.civicrm.org/dev/core/-/issues/2148):
+  [18864](https://github.com/civicrm/civicrm-core/pull/18864))**
 
-- **dev/user-interface#34 Replace <th> with <td> on ContributionPage configuration Amount tab ([18850](https://github.com/civicrm/civicrm-core/pull/18850))**
+- **CiviCRM reCAPTCHA Util not validating user tokens on form submission
+  ([dev/core#2150](https://lab.civicrm.org/dev/core/-/issues/2150):
+  [18872](https://github.com/civicrm/civicrm-core/pull/18872) and
+  [311](https://github.com/civicrm/civicrm-packages/pull/311))**
 
-- **dev/financial#152 [REF] Clean up interaction with contribution recur object ([18835](https://github.com/civicrm/civicrm-core/pull/18835))**
+- **Fix the Test Result (1 failure / -190)
+  E2E.Core.PrevNextTest.testDeleteByCacheKey recurring test issue
+  ([dev/core#2029](https://lab.civicrm.org/dev/core/-/issues/2029):
+  [18846](https://github.com/civicrm/civicrm-core/pull/18846))**
 
-- **dev/core#927 preliminary cleanup ([18813](https://github.com/civicrm/civicrm-core/pull/18813))**
+- **Merge - ensure location entities remaining on deleted contacts have
+  is_primary integrity
+  ([dev/core#2047](https://lab.civicrm.org/dev/core/-/issues/2047):
+  [18555](https://github.com/civicrm/civicrm-core/pull/18555))**
 
-- **dev/core#2029 exclude ornery test ([18846](https://github.com/civicrm/civicrm-core/pull/18846))**
+- **Eliminate unused query on CRM_Core_BAO_CustomQuery::_construct
+  ([dev/core#2079](https://lab.civicrm.org/dev/core/-/issues/2079):
+  [18668](https://github.com/civicrm/civicrm-core/pull/18668))**
 
-- **[REF] Determine values where they are needed rather than passing them  around (in tested function) ([18837](https://github.com/civicrm/civicrm-core/pull/18837))**
+- **get log date from tables available in query with data instead of last table
+  ([18868](https://github.com/civicrm/civicrm-core/pull/18868))**
 
-- **5.31 to master ([18847](https://github.com/civicrm/civicrm-core/pull/18847))**
+- **Search ext: Fix validation and saving on search admin screen
+  ([18919](https://github.com/civicrm/civicrm-core/pull/18919))**
 
-- **dev/core#2140 Fix site path for Drupal 8 and 9 ([18843](https://github.com/civicrm/civicrm-core/pull/18843))**
+- **CRM_Core_Error::formatFooException - Don't bomb on 'Error'
+  ([18910](https://github.com/civicrm/civicrm-core/pull/18910))**
 
-- **5.31 ([18839](https://github.com/civicrm/civicrm-core/pull/18839))**
+- **ClassLoader - Fix autoloading of `API_Exception`
+  ([18870](https://github.com/civicrm/civicrm-core/pull/18870))**
 
-- **5.31 ([18836](https://github.com/civicrm/civicrm-core/pull/18836))**
+- **SavedSearch: add UI_name index to upgrade script
+  ([18811](https://github.com/civicrm/civicrm-core/pull/18811))**
 
-- **[REF] Minor extraction ([18829](https://github.com/civicrm/civicrm-core/pull/18829))**
+- **Fix pluralize function for words like 'display'
+  ([18778](https://github.com/civicrm/civicrm-core/pull/18778))**
 
-- **Remove a few lines of deprecated code ([18826](https://github.com/civicrm/civicrm-core/pull/18826))**
+- **class.api.php: In remote api calls, allow referer and useragent to be set.
+  ([18400](https://github.com/civicrm/civicrm-core/pull/18400))**
 
-- **(core/dev#2104) Add birth date column for target contact to activity … ([18827](https://github.com/civicrm/civicrm-core/pull/18827))**
+- **Typo in call to fixSchemaDifferencesForAll
+  ([18762](https://github.com/civicrm/civicrm-core/pull/18762))**
 
-- **[REF] Include contributioncancelactions extension in dismaker and reg… ([18825](https://github.com/civicrm/civicrm-core/pull/18825))**
+- **Rationalise date formatting
+  ([18805](https://github.com/civicrm/civicrm-core/pull/18805))**
 
-- **dev/core#927 Remove code to update recur on cancel & fail where there is no recur ([18814](https://github.com/civicrm/civicrm-core/pull/18814))**
+### CiviCampaign
 
-- **[REF] Extract handling for loading contribution recur object. ([18746](https://github.com/civicrm/civicrm-core/pull/18746))**
+- **Fix campaign_id handling for batch entry
+  ([18792](https://github.com/civicrm/civicrm-core/pull/18792))**
 
-- **5.31 ([18818](https://github.com/civicrm/civicrm-core/pull/18818))**
+  Fixes a bug whereby `campaign_id` is not updated on batch entry if it has been
+  added to the profile.
 
-- **(NFC) dev/core#2029 - Make assertions in PrevNextTest more skimmable ([18822](https://github.com/civicrm/civicrm-core/pull/18822))**
+### CiviCase
 
-- **dev/core#2115 Move some more financialacl code to a hook within the extension ([18740](https://github.com/civicrm/civicrm-core/pull/18740))**
+- **Merging contacts removes case roles
+  ([dev/core#2152](https://lab.civicrm.org/dev/core/-/issues/2152):
+  [18884](https://github.com/civicrm/civicrm-core/pull/18884))**
 
-- **dev/financial#152 move code only relevant to repeattransaction into that function ([18815](https://github.com/civicrm/civicrm-core/pull/18815))**
+### CiviContribute
 
-- **dev/core#927 Enable contribution cancel actions extension ([18812](https://github.com/civicrm/civicrm-core/pull/18812))**
+- **finish 'this round' of completeOrder cleanup
+  ([dev/financial#152](https://lab.civicrm.org/dev/financial/-/issues/152):
+  [18631](https://github.com/civicrm/civicrm-core/pull/18631),
+  [18734](https://github.com/civicrm/civicrm-core/pull/18734),
+  [18732](https://github.com/civicrm/civicrm-core/pull/18732),
+  [18733](https://github.com/civicrm/civicrm-core/pull/18733),
+  [18728](https://github.com/civicrm/civicrm-core/pull/18728),
+  [18629](https://github.com/civicrm/civicrm-core/pull/18629),
+  [18835](https://github.com/civicrm/civicrm-core/pull/18835),
+  [18730](https://github.com/civicrm/civicrm-core/pull/18730),
+  [18729](https://github.com/civicrm/civicrm-core/pull/18729).
+  [18737](https://github.com/civicrm/civicrm-core/pull/18737),
+  [18735](https://github.com/civicrm/civicrm-core/pull/18735),
+  [18744](https://github.com/civicrm/civicrm-core/pull/18744),
+  [18736](https://github.com/civicrm/civicrm-core/pull/18736) and
+  [18815](https://github.com/civicrm/civicrm-core/pull/18815))**
 
-- **Rationalise date formatting ([18805](https://github.com/civicrm/civicrm-core/pull/18805))**
+  Cleans up how `completeOrder` deals with `payment_processor_id` (solely as an
+  input param).
 
-- **SavedSearch: add UI_name index to upgrade script ([18811](https://github.com/civicrm/civicrm-core/pull/18811))**
+- **Thank-you letter incorrect contribution currency
+  ([dev/financial#111](https://lab.civicrm.org/dev/financial/-/issues/111):
+  [18714](https://github.com/civicrm/civicrm-core/pull/18714) and
+  [18715](https://github.com/civicrm/civicrm-core/pull/18715))**
 
-- **dev/core#927 add first test on cancel  ([18786](https://github.com/civicrm/civicrm-core/pull/18786))**
+  Ensures that when a contribution is made using a currency other than the
+  default currency, the contribution tokens: {contribution.total_amount}
+  {contribution.fee_amount} {contribution.net_amount} correctly display the
+  currency.
 
-- **Update CRM_Utils_Constant::value to support env variables ([18806](https://github.com/civicrm/civicrm-core/pull/18806))**
+- **PayPal payment processor uses deprecated methods, breaking functionality
+  (Work Towards [dev/core#2034](https://lab.civicrm.org/dev/core/-/issues/2034):
+  [18540](https://github.com/civicrm/civicrm-core/pull/18540))**
 
-- **Declare support for cancelRecurring in manual processor ([18804](https://github.com/civicrm/civicrm-core/pull/18804))**
+  Fixes the PayPal standard cancel url.
 
-- **Remove always-true IF ([18803](https://github.com/civicrm/civicrm-core/pull/18803))**
+- **Declare support for cancelRecurring in manual processor
+  ([18804](https://github.com/civicrm/civicrm-core/pull/18804))**
 
-- **dev/core#927 Add shell extension to move contribution cancel actions into ([18784](https://github.com/civicrm/civicrm-core/pull/18784))**
+  Ensure that when no processor id is present the cancel form is loaded (as
+  opposed to the enable-disable form).
 
-- **SavedSearch - Add name and label columns ([18809](https://github.com/civicrm/civicrm-core/pull/18809))**
+- **Refund status not set correctly when cancelled_payment_id is set
+  ([dev/financial#156](https://lab.civicrm.org/dev/financial/-/issues/156):
+  [18930](https://github.com/civicrm/civicrm-core/pull/18930))**
 
-- **Display public title and description on profiles and unsubscribe/subs… ([18645](https://github.com/civicrm/civicrm-core/pull/18645))**
+- **Contribution confirmation page should not display the name of payment
+  processor type ([17568](https://github.com/civicrm/civicrm-core/pull/17568))**
 
-- **Remove always true if ([18801](https://github.com/civicrm/civicrm-core/pull/18801))**
+- **PCP 'Your Message' should use WYSIWYG
+  ([18411](https://github.com/civicrm/civicrm-core/pull/18411))**
 
-- **Add test for recurring links and clean up method of retrieving recurring ([18790](https://github.com/civicrm/civicrm-core/pull/18790))**
+### CiviEvent
 
-- **Replace BAO calls with api calls in test class ([18798](https://github.com/civicrm/civicrm-core/pull/18798))**
+- **.ical files not populating correctly for sites with ACL's configured for
+  events ([dev/core#1879](https://lab.civicrm.org/dev/core/-/issues/1879):
+  [18712](https://github.com/civicrm/civicrm-core/pull/18712))**
 
-- **Switch to calling api ([18797](https://github.com/civicrm/civicrm-core/pull/18797))**
+### CiviMail
 
-- **Switch to calling the api ([18796](https://github.com/civicrm/civicrm-core/pull/18796))**
+- **Set id after save for the mailing component in the postProcess
+  ([18808](https://github.com/civicrm/civicrm-core/pull/18808))**
 
-- **unit test for #18306 - order create api test for contribution ([18785](https://github.com/civicrm/civicrm-core/pull/18785))**
+- **"Notice: Undefined index: domain" when deleting a mail account
+  ([dev/core#2166](https://lab.civicrm.org/dev/core/-/issues/2166):
+  [18927](https://github.com/civicrm/civicrm-core/pull/18927))**
 
-- **Fix sendconfirmation api to override receipt params ([18789](https://github.com/civicrm/civicrm-core/pull/18789))**
+- **crmMailing - Only load Angular settings if they're needed
+  ([18749](https://github.com/civicrm/civicrm-core/pull/18749))**
 
-- **[Test] - Fix some tests to call API not BAO ([18795](https://github.com/civicrm/civicrm-core/pull/18795))**
+### CiviSMS
 
-- **Remove instances of variable variables ([18791](https://github.com/civicrm/civicrm-core/pull/18791))**
+- **Error in the selected phone to send an SMS when the Mobile type label is
+  modified ([dev/core#2138](https://lab.civicrm.org/dev/core/-/issues/2138):
+  [18842](https://github.com/civicrm/civicrm-core/pull/18842))**
 
-- **[Ref] Minor code extraction ([18739](https://github.com/civicrm/civicrm-core/pull/18739))**
+- **Show only Active SMS provider List on Mass SMS form
+  ([18867](https://github.com/civicrm/civicrm-core/pull/18867))**
 
-- **5.31 ([18788](https://github.com/civicrm/civicrm-core/pull/18788))**
+### Backdrop Integration
 
-- **dev/core#2034 Fix paypal standard cancel url ([18540](https://github.com/civicrm/civicrm-core/pull/18540))**
+- **Override sessionStart function and use backdrop functions as appropriate
+  (related to
+  [backdrop#116](https://github.com/civicrm/civicrm-backdrop/issues/116):
+  [18745](https://github.com/civicrm/civicrm-core/pull/18745))**
 
-- **dev/core#2066 Use shared function to set the next url ([18773](https://github.com/civicrm/civicrm-core/pull/18773))**
+  Overrides the backdrop Session start function in DrupalBase.php to use the
+  backdrop specific functions
 
-- **dev/core#2066 Further cleanup on search actions ([18783](https://github.com/civicrm/civicrm-core/pull/18783))**
+- **Resolve #110 Sync repo with CiviCRM-Drupal repo
+  ([115](https://github.com/civicrm/civicrm-backdrop/pull/115))**
 
-- **Contribution confirmation page should not display the name of payment processor type ([17568](https://github.com/civicrm/civicrm-core/pull/17568))**
+### Drupal Integration
 
-- **Fix pluralize function for words like 'display' ([18778](https://github.com/civicrm/civicrm-core/pull/18778))**
+- **Do not manually construct the site path during Drupal8+ setup
+  ([dev/core#2140](https://lab.civicrm.org/dev/core/-/issues/2140):
+  [18843](https://github.com/civicrm/civicrm-core/pull/18843))**
 
-- **5.31 ([18777](https://github.com/civicrm/civicrm-core/pull/18777))**
+- **D8 Install checks run via Drupal Status Report - gives misleading warnings.
+  ([dev/drupal#137](https://lab.civicrm.org/dev/drupal/-/issues/137):
+  [18581](https://github.com/civicrm/civicrm-core/pull/18581))**
 
-- **[REF] Search ext: Reorganize code into modules ([18775](https://github.com/civicrm/civicrm-core/pull/18775))**
+### Joomla Integration
 
-- **class.api.php: In remote api calls, allow referer and useragent to be set. ([18400](https://github.com/civicrm/civicrm-core/pull/18400))**
+- **[Joomla 4.0] CiviCRM cannot be installed on Joomla 4.0 alpha
+  ([dev/joomla#14](https://lab.civicrm.org/dev/joomla/-/issues/14):
+  [52](https://github.com/civicrm/civicrm-joomla/pull/52))**
 
-- **5.31 to master ([18774](https://github.com/civicrm/civicrm-core/pull/18774))**
+### Wordpress Integration
 
-- **Test for event#43 ([18761](https://github.com/civicrm/civicrm-core/pull/18761))**
+- **Protect against undefined index query in heartbeat callback
+  ([220](https://github.com/civicrm/civicrm-wordpress/pull/220))**
 
-- **5.31 ([18770](https://github.com/civicrm/civicrm-core/pull/18770))**
+## <a name="misc"></a>Miscellany
 
-- **dev/core#2066 Extract getSelectedIDs ([18768](https://github.com/civicrm/civicrm-core/pull/18768))**
+- **Schema handler fixes
+  ([18932](https://github.com/civicrm/civicrm-core/pull/18932))**
 
-- **dev/core#2066 Use shared function to set the next url ([18767](https://github.com/civicrm/civicrm-core/pull/18767))**
+- **[cq] Do not pass by reference where avoidable
+  ([dev/core#2043](https://lab.civicrm.org/dev/core/-/issues/2043):
+  [18802](https://github.com/civicrm/civicrm-core/pull/18802))**
 
-- **Allow custom fields of type Autocomplete-Select to be multivalued ([18449](https://github.com/civicrm/civicrm-core/pull/18449))**
+- **Move financialACLs to a core extension (Work Towards
+  [dev/core#2115](https://lab.civicrm.org/dev/core/-/issues/2115):
+  [18738](https://github.com/civicrm/civicrm-core/pull/18738) and
+  [18740](https://github.com/civicrm/civicrm-core/pull/18740))**
 
-- **5.31 ([18764](https://github.com/civicrm/civicrm-core/pull/18764))**
+- **Move call to update related pledges on contribution cancel to extension
+  ([18894](https://github.com/civicrm/civicrm-core/pull/18894))**
 
-- **dev/drupal#137 - Alternate PR - On drupal status report need different check when civi is already installed ([18581](https://github.com/civicrm/civicrm-core/pull/18581))**
+- **Move filtering of unpermitted options for reports/ search select to
+  financialacl extension
+  ([18849](https://github.com/civicrm/civicrm-core/pull/18849))**
 
-- **Typo in call to fixSchemaDifferencesForAll ([18762](https://github.com/civicrm/civicrm-core/pull/18762))**
+- **Move CRM_Member_BAO_MembershipType::getPermissionedMembershipTypes to
+  financial acl extension
+  ([18848](https://github.com/civicrm/civicrm-core/pull/18848))**
 
-- **5.31 ([18757](https://github.com/civicrm/civicrm-core/pull/18757))**
+- **Replace BAO calls with api calls in test class
+  ([18798](https://github.com/civicrm/civicrm-core/pull/18798))**
 
-- **Angular Loader: Allow modules to specify permissions to add client-side ([18754](https://github.com/civicrm/civicrm-core/pull/18754))**
+- **Switch to calling api
+  ([18797](https://github.com/civicrm/civicrm-core/pull/18797))**
 
-- **5.31 to master ([18756](https://github.com/civicrm/civicrm-core/pull/18756))**
+- **Switch to calling the api
+  ([18796](https://github.com/civicrm/civicrm-core/pull/18796))**
 
-- **Extract setNextUrl ([18750](https://github.com/civicrm/civicrm-core/pull/18750))**
+- **Extract setNextUrl
+  ([18750](https://github.com/civicrm/civicrm-core/pull/18750))**
 
-- **crmMailing - Only load Angular settings if they're needed ([18749](https://github.com/civicrm/civicrm-core/pull/18749))**
+- **Deprecate hook_civicrm_crudLink
+  ([18888](https://github.com/civicrm/civicrm-core/pull/18888))**
 
-- **AngularLoader: Support 'settingsFactory' callbacks in angular modules. ([18731](https://github.com/civicrm/civicrm-core/pull/18731))**
+- **Fix extension generated DAO files to pass civilint
+  ([18879](https://github.com/civicrm/civicrm-core/pull/18879))**
 
-- **[REF] Replace long if block with early return ([18747](https://github.com/civicrm/civicrm-core/pull/18747))**
+- **Hack away at false negative test fails
+  ([18892](https://github.com/civicrm/civicrm-core/pull/18892))**
 
-- **dev/financial#152 simplify passed parameters ([18744](https://github.com/civicrm/civicrm-core/pull/18744))**
+- **Remove always-true IF
+  ([18803](https://github.com/civicrm/civicrm-core/pull/18803))**
 
-- **More accurate language around social media sharing ([18743](https://github.com/civicrm/civicrm-core/pull/18743))**
+- **Remove always true if
+  ([18801](https://github.com/civicrm/civicrm-core/pull/18801))**
 
-- **Fix main contact uf url on merge screen ([18742](https://github.com/civicrm/civicrm-core/pull/18742))**
+- **Remove always-true & otherwise silly if
+  ([18883](https://github.com/civicrm/civicrm-core/pull/18883))**
 
-- **dev/core#2115 remove reference to financialACLs in bounce ([18738](https://github.com/civicrm/civicrm-core/pull/18738))**
+- **Remove IPN reference to _relatedObjects, deprecate property
+  ([18895](https://github.com/civicrm/civicrm-core/pull/18895))**
 
-- **dev/financial#152 simplify interaction with membership, deprecate function ([18735](https://github.com/civicrm/civicrm-core/pull/18735))**
+- **Remove deprecated code
+  ([18903](https://github.com/civicrm/civicrm-core/pull/18903))**
 
-- **dev/financial#152 simplify passed parameters ([18736](https://github.com/civicrm/civicrm-core/pull/18736))**
+- **Remove a few lines of deprecated code
+  ([18826](https://github.com/civicrm/civicrm-core/pull/18826))**
 
-- **dev/core#2079 Eliminate unused query on CRM_Core_BAO_CustomQuery::_construct ([18668](https://github.com/civicrm/civicrm-core/pull/18668))**
+- **Remove instances of variable variables
+  ([18791](https://github.com/civicrm/civicrm-core/pull/18791))**
 
-- **[REF]  Separate export form classes out & simplify task handling ([18589](https://github.com/civicrm/civicrm-core/pull/18589))**
+- **Remove meaningless legacy code
+  ([18856](https://github.com/civicrm/civicrm-core/pull/18856))**
 
-- **dev/core#2047 Fix merge code so that deleted contacts are not left without a primary address ([18555](https://github.com/civicrm/civicrm-core/pull/18555))**
+- **Refactor entityParams in Order.Create API so it is easier to
+  understand/modify
+  ([18306](https://github.com/civicrm/civicrm-core/pull/18306))**
 
-- **dev/financial#152 remove unused parameter ([18737](https://github.com/civicrm/civicrm-core/pull/18737))**
+- **[REF] Minor simplification - don't use a variable for table name
+  ([18651](https://github.com/civicrm/civicrm-core/pull/18651))**
 
-- **[REF] Minor simplification - don't use a variable for table name ([18651](https://github.com/civicrm/civicrm-core/pull/18651))**
+- **[REF] Remove silly if
+  ([18897](https://github.com/civicrm/civicrm-core/pull/18897))**
 
-- **dev/financial#152 Pass contribution directly to completeOrder ([18728](https://github.com/civicrm/civicrm-core/pull/18728))**
+- **[Ref] Move sending the email back out of the recur function
+  ([18852](https://github.com/civicrm/civicrm-core/pull/18852))**
 
-- **dev/financial#152 [REF] Extract getMembershipID ([18733](https://github.com/civicrm/civicrm-core/pull/18733))**
+- **[Ref] Use direct version of participant id
+  ([18882](https://github.com/civicrm/civicrm-core/pull/18882))**
 
-- **dev/financial#152 Remove unreachable code ([18734](https://github.com/civicrm/civicrm-core/pull/18734))**
+- **[Ref] Simplify params
+  ([18896](https://github.com/civicrm/civicrm-core/pull/18896))**
 
-- **[Test] Ensure all APIv4 entities have basic info ([18727](https://github.com/civicrm/civicrm-core/pull/18727))**
+- **[REF] Simplify use of shared code.
+  ([18900](https://github.com/civicrm/civicrm-core/pull/18900))**
 
-- **dev/financial#152 Remove unused parameters from BaseIPN->failed signature ([18732](https://github.com/civicrm/civicrm-core/pull/18732))**
+- **[REF] Minor extraction
+  ([18829](https://github.com/civicrm/civicrm-core/pull/18829))**
 
-- **dev/financial#152 Remove unused parameters from BaseIPN->cancelled signature ([18730](https://github.com/civicrm/civicrm-core/pull/18730))**
+- **[REF] Determine values where they are needed rather than passing them
+  around (in tested function)
+  ([18837](https://github.com/civicrm/civicrm-core/pull/18837))**
 
-- **dev/financial#152 Clean up & test contributionPageID handling ([18729](https://github.com/civicrm/civicrm-core/pull/18729))**
+- **[REF] Include contributioncancelactions extension in dismaker and reg…
+  ([18825](https://github.com/civicrm/civicrm-core/pull/18825))**
 
-- **dev/core#2110 - Warning "Non-static method CRM_Contact_Page_AJAX::pdfFormat() should not be called statically" when changing the page format on print/merge document ([18726](https://github.com/civicrm/civicrm-core/pull/18726))**
+- **[REF] Extract handling for loading contribution recur object.
+  ([18746](https://github.com/civicrm/civicrm-core/pull/18746))**
 
-- **dev/financial#152 [REF] Parse ids before sending to single function (minor simplification) ([18631](https://github.com/civicrm/civicrm-core/pull/18631))**
+- **[REF] Replace long if block with early return
+  ([18747](https://github.com/civicrm/civicrm-core/pull/18747))**
 
-- **dev/financial#152 [REF] Parse ids before sending to recur function (minor simplification) ([18629](https://github.com/civicrm/civicrm-core/pull/18629))**
+- **[REF] Upgrade DomPDF to v0.8.6
+  ([18688](https://github.com/civicrm/civicrm-core/pull/18688))**
 
-- **dev/cloud-native#16 Migrate Contribution Page widget extern url to us… ([17969](https://github.com/civicrm/civicrm-core/pull/17969))**
+- **[REF]  Separate export form classes out & simplify task handling
+  ([18589](https://github.com/civicrm/civicrm-core/pull/18589))**
 
-- **5.31 ([18725](https://github.com/civicrm/civicrm-core/pull/18725))**
+- **[REF] Search ext: Reorganize code into modules
+  ([18775](https://github.com/civicrm/civicrm-core/pull/18775))**
 
-- **dev/core#1428 Add test for Activity::update() ([18720](https://github.com/civicrm/civicrm-core/pull/18720))**
+- **[Ref] Minor code extraction
+  ([18739](https://github.com/civicrm/civicrm-core/pull/18739))**
 
-- **dev/financial#11 Expand unit test to ensure that the correct currency… ([18715](https://github.com/civicrm/civicrm-core/pull/18715))**
+- **[Test] - Fix some tests to call API not BAO
+  ([18795](https://github.com/civicrm/civicrm-core/pull/18795))**
 
-- **Financial#111: Contribution tokens always display amount with default… ([18714](https://github.com/civicrm/civicrm-core/pull/18714))**
+- **[Test] Ensure all APIv4 entities have basic info
+  ([18727](https://github.com/civicrm/civicrm-core/pull/18727))**
 
-- **[REF] Upgrade DomPDF to v0.8.6 ([18688](https://github.com/civicrm/civicrm-core/pull/18688))**
+- **Test for event#43
+  ([18761](https://github.com/civicrm/civicrm-core/pull/18761))**
 
-- **Protect against undefined index query in heartbeat callback ([220](https://github.com/civicrm/civicrm-wordpress/pull/220))**
+- **Add test for recurring links and clean up method of retrieving recurring
+  ([18790](https://github.com/civicrm/civicrm-core/pull/18790))**
 
-- **(dev/joomla#14) Joomla 4.0 compatibility fixes ([52](https://github.com/civicrm/civicrm-joomla/pull/52))**
+- **unit test for #18306 - order create api test for contribution
+  ([18785](https://github.com/civicrm/civicrm-core/pull/18785))**
 
-- **dev/core#2150 Update checking of response function to work with v2 api ([311](https://github.com/civicrm/civicrm-packages/pull/311))**
+- **(NFC) Fix typo in Money valueFormat depretation warning
+  ([18886](https://github.com/civicrm/civicrm-core/pull/18886))**
 
-## <a name="misc"></a>Miscellany
+- **(NFC) Make assertions in PrevNextTest more skimmable
+  ([dev/core#2029](https://lab.civicrm.org/dev/core/-/issues/2029):
+  [18822](https://github.com/civicrm/civicrm-core/pull/18822))**
 
 ## <a name="credits"></a>Credits
 
 This release was developed by the following code authors:
 
-AGH Strategies - Alice Frumin, Andrew Hunt; Agileware - Francis Whittle, Justin Freeman, Pengyi Zhang; Andrew Thompson; Christian Wach; Circle Interactive - Pradeep Nayak; CiviCoop - Jaap Jansma; CiviCRM - Coleman Watts, Tim Otten; CiviDesk - Sunil Pawar, Yashodha Chaku; CiviFirst - John Kirk; CompuCorp - Debarshi Bhaumik; Coop SymbioTIC - Mathieu Lutfy; Dave D; Diego Muñio; Freeform Solutions - Herb van den Dool; Fuzion - Jitendra Purohit; iXiam - Luciano Spiegel, Vangelis Pantazis; JMA Consulting - Monish Deb, Seamus Lee; John Kingsnorth; masetto; Megaphone Technology Consulting - Jon Goldberg; mglaman; MJW Consulting - Matthew Wire; Nicol Wistreich; Progressive Technology Project - Jamie McClelland; Richard van Oosterhout; Squiffle Consulting - Aidan Saunders; Wikimedia Foundation - Eileen McNaughton
+AGH Strategies - Alice Frumin, Andrew Hunt; Agileware - Francis Whittle, Justin
+Freeman, Pengyi Zhang; Andrew Thompson; Christian Wach; Circle Interactive -
+Pradeep Nayak; CiviCoop - Jaap Jansma; CiviCRM - Coleman Watts, Tim Otten;
+CiviDesk - Sunil Pawar, Yashodha Chaku; CiviFirst - John Kirk; CompuCorp -
+Debarshi Bhaumik; Coop SymbioTIC - Mathieu Lutfy; Dave D; Diego Muñio; Freeform
+Solutions - Herb van den Dool; Fuzion - Jitendra Purohit; iXiam - Luciano
+Spiegel, Vangelis Pantazis; JMA Consulting - Monish Deb, Seamus Lee; John
+Kingsnorth; Megaphone Technology Consulting - Jon Goldberg; mglaman; MJW
+Consulting - Matthew Wire; Nicol Wistreich; PERORA SRL- Samuele Masetto;
+Progressive Technology Project - Jamie McClelland; Richard van Oosterhout;
+Squiffle Consulting - Aidan Saunders; Wikimedia Foundation - Eileen McNaughton
 
 Most authors also reviewed code for this release; in addition, the following
 reviewers contributed their comments:
 
-AGH Strategies - Alice Frumin; Agileware - Justin Freeman; Andrew Thompson; Artful Robot - Rich Lott; Australian Greens - John Twyman; Circle Interactive - Pradeep Nayak; civibot[bot]; civicrm-builder; CiviCRM - Coleman Watts, Tim Otten; CiviDesk - Sunil Pawar, Yashodha Chaku; Coop SymbioTIC - Mathieu Lutfy; Dave D; Diego Muñio; Freeform Solutions - Herb van den Dool; Fuzion - Jitendra Purohit, Luke Stewart; Greenpeace Central and Eastern Europe - Patrick Figel; iXiam - Vangelis Pantazis; JMA Consulting - Joe Murray, Monish Deb, Seamus Lee; jvos; Lighthouse Consulting and Design - Brian Shaughnessy; masetto; maxtsero; Megaphone Technology Consulting - Jon Goldberg; mglaman; MJCO - Mikey O'Toole; MJW Consulting - Matthew Wire; Nicol Wistreich; Semper IT - Karin Gerritsen; Tadpole Collective - Kevin Cristiano; Wikimedia Foundation - Eileen McNaughton
+Artful Robot - Rich Lott; Atomic Development - Max Tsero; Australian Greens -
+John Twyman; Centarro - Matt Glaman; Fuzion - Luke Stewart; Greenpeace Central
+and Eastern Europe - Patrick Figel; JMA Consulting - Joe Murray; jvos;
+Lighthouse Consulting and Design - Brian Shaughnessy; Megaphone Technology
+Consulting - Jon Goldberg; MJCO - Mikey O'Toole; Semper IT - Karin Gerritsen;
+Tadpole Collective - Kevin Cristiano;
 
 ## <a name="feedback"></a>Feedback
 
index 2b04f7a484f721a24408e081e482d5216cb89731..5953eb796cbfa97775a3d3b970cd0104340c9532 100644 (file)
@@ -164,10 +164,13 @@ class CRM_Core_Payment_AuthorizeNetIPNTest extends CiviUnitTestCase {
     $contribution = $this->callAPISuccess('contribution', 'get', [
       'contribution_recur_id' => $this->_contributionRecurID,
       'sequential' => 1,
-    ]);
-    $this->assertEquals(2, $contribution['count']);
-    $this->assertEquals('second_one', $contribution['values'][1]['trxn_id']);
-    $this->assertEquals(date('Y-m-d'), date('Y-m-d', strtotime($contribution['values'][1]['receive_date'])));
+    ])['values'];
+    $this->assertCount(2, $contribution);
+    $secondContribution = $contribution[1];
+    $this->assertEquals('second_one', $secondContribution['trxn_id']);
+    $this->assertEquals(date('Y-m-d'), date('Y-m-d', strtotime($secondContribution['receive_date'])));
+    $this->assertEquals('expensive', $secondContribution['amount_level']);
+    $this->assertEquals($this->ids['campaign'][0], $secondContribution['campaign_id']);
   }
 
   /**
index 429249e2bde6284fe6523863db54285e737801c6..8d540ed0554aeb5ab05fab91fd5c35ed23c5f689 100644 (file)
@@ -2504,6 +2504,7 @@ VALUES
    * @throws \CRM_Core_Exception
    */
   public function setupRecurringPaymentProcessorTransaction($recurParams = [], $contributionParams = []) {
+    $this->ids['campaign'][0] = $this->callAPISuccess('Campaign', 'create', ['title' => 'get the money'])['id'];
     $contributionParams = array_merge([
       'total_amount' => '200',
       'invoice_id' => $this->_invoiceID,
@@ -2515,6 +2516,8 @@ VALUES
       'is_test' => 0,
       'receive_date' => '2019-07-25 07:34:23',
       'skipCleanMoney' => TRUE,
+      'amount_level' => 'expensive',
+      'campaign_id' => $this->ids['campaign'][0],
     ], $contributionParams);
     $contributionRecur = $this->callAPISuccess('contribution_recur', 'create', array_merge([
       'contact_id' => $this->_contactID,