diff --git a/CRM/Core/BAO/CustomField.php b/CRM/Core/BAO/CustomField.php
index 67cc1142d5a8..cf05c109b2e9 100644
--- a/CRM/Core/BAO/CustomField.php
+++ b/CRM/Core/BAO/CustomField.php
@@ -1068,7 +1068,7 @@ public static function addQuickFormElement(
);
}
- if ($field->data_type == 'EntityReference') {
+ elseif ($field->data_type == 'EntityReference') {
$fieldAttributes['entity'] = $field->fk_entity;
$element = $qf->addAutocomplete($elementName, $label, $fieldAttributes, $useRequired && !$search);
}
diff --git a/CRM/Core/Payment/PayPalImpl.php b/CRM/Core/Payment/PayPalImpl.php
index bbaa04114c52..763e2df050cb 100644
--- a/CRM/Core/Payment/PayPalImpl.php
+++ b/CRM/Core/Payment/PayPalImpl.php
@@ -544,7 +544,7 @@ public function doDirectPayment(&$params) {
public function doPaymentPayPalButton(&$params) {
$args = [];
- $result = $this->setStatusPaymentPending([]);
+ $result = [];
$this->initialize($args, 'DoDirectPayment');
@@ -606,7 +606,6 @@ public function doPaymentPayPalButton(&$params) {
}
/* Success */
- $result = $this->setStatusPaymentCompleted($result);
$doQueryParams = [
'gross_amount' => $apiResult['amt'] ?? NULL,
'trxn_id' => $apiResult['transactionid'] ?? NULL,
diff --git a/CRM/Dedupe/Merger.php b/CRM/Dedupe/Merger.php
index 669ec64c9503..4068a5c36ea1 100644
--- a/CRM/Dedupe/Merger.php
+++ b/CRM/Dedupe/Merger.php
@@ -9,6 +9,7 @@
+--------------------------------------------------------------------+
*/
+use Civi\Api4\Contact;
use Civi\Api4\CustomGroup;
/**
@@ -685,7 +686,18 @@ protected static function updateContact(int $contactID, $params): void {
// This parameter causes blank fields to be be emptied out.
// We can probably remove.
$params['updateBlankLocInfo'] = TRUE;
+ if (empty($params['contact_type']) || ($params['contact_type'] === 'Organization' && empty($params['organization_name']))) {
+ // Ensuring this is set addresses https://lab.civicrm.org/dev/core/-/issues/4156
+ // but not that RM_Dedupe_MergerTest::testMergeWithEmployer covers this scenario
+ // so refactoring of this is safe.
+ $contact = Contact::get(FALSE)->addWhere('id', '=', $contactID)->addSelect('organization_name', 'contact_type')->execute()->first();
+ $params['contact_type'] = $contact['contact_type'];
+ if (empty($params['organization_name']) && $params['contact_type'] === 'Organization') {
+ $params['organization_name'] = $contact['organization_name'];
+ }
+ }
$data = self::formatProfileContactParams($params, $contactID);
+
CRM_Contact_BAO_Contact::create($data);
}
@@ -707,13 +719,12 @@ private static function formatProfileContactParams(
int $contactID
) {
- $data = $contactDetails = [];
+ $data = ['contact_type' => $params['contact_type']];
// get the contact details (hier)
$details = CRM_Contact_BAO_Contact::getHierContactDetails($contactID, []);
$contactDetails = $details[$contactID];
- $data['contact_type'] = $contactDetails['contact_type'] ?? NULL;
$data['contact_sub_type'] = $contactDetails['contact_sub_type'] ?? NULL;
//fix contact sub type CRM-5125
@@ -993,10 +1004,6 @@ private static function formatProfileContactParams(
}
}
- if (!isset($data['contact_type'])) {
- $data['contact_type'] = 'Individual';
- }
-
return $data;
}
diff --git a/ext/afform/admin/ang/afGuiEditor/elements/afGuiContainer.component.js b/ext/afform/admin/ang/afGuiEditor/elements/afGuiContainer.component.js
index 06c8648d1a13..79382e2ba4d7 100644
--- a/ext/afform/admin/ang/afGuiEditor/elements/afGuiContainer.component.js
+++ b/ext/afform/admin/ang/afGuiEditor/elements/afGuiContainer.component.js
@@ -78,9 +78,10 @@
}
};
- this.getSearchDisplay = function(node) {
- var searchKey = $scope.getSearchKey(node);
- if (searchKey) {
+ // Finds a SearchDisplay within this container or within the fieldset containing this container
+ this.getSearchDisplay = function() {
+ var searchKey = ctrl.getDataEntity();
+ if (searchKey && !ctrl.entityName) {
return afGui.getSearchDisplay.apply(null, searchKey.split('.'));
}
};
@@ -416,8 +417,7 @@
var joinType = ctrl.entityName.split('-join-');
entityType = joinType[1] || (ctrl.editor && ctrl.editor.getEntity(joinType[0]).type);
} else {
- var searchKey = ctrl.getDataEntity(),
- searchDisplay = afGui.getSearchDisplay.apply(null, searchKey.split('.')),
+ var searchDisplay = ctrl.getSearchDisplay(),
fieldName = fieldKey.substr(fieldKey.indexOf('.') + 1),
prefix = _.includes(fieldKey, '.') ? fieldKey.split('.')[0] : null;
if (prefix) {
diff --git a/ext/afform/admin/ang/afGuiEditor/elements/afGuiField.component.js b/ext/afform/admin/ang/afGuiEditor/elements/afGuiField.component.js
index 1550f94faaf0..66136f86f657 100644
--- a/ext/afform/admin/ang/afGuiEditor/elements/afGuiField.component.js
+++ b/ext/afform/admin/ang/afGuiEditor/elements/afGuiField.component.js
@@ -89,8 +89,8 @@
this.getDefn = function() {
var defn = afGui.getField(ctrl.container.getFieldEntityType(ctrl.node.name), ctrl.node.name);
// Calc fields are specific to a search display, not part of the schema
- if (!defn && ctrl.container.getSearchDisplay(ctrl.container.node)) {
- var searchDisplay = ctrl.container.getSearchDisplay(ctrl.container.node);
+ if (!defn && ctrl.container.getSearchDisplay()) {
+ var searchDisplay = ctrl.container.getSearchDisplay();
defn = _.findWhere(searchDisplay.calc_fields, {name: ctrl.node.name});
}
defn = defn || {
diff --git a/ext/civiimport/Civi/Api4/Event/Subscriber/ImportSubscriber.php b/ext/civiimport/Civi/Api4/Event/Subscriber/ImportSubscriber.php
index 9ae91301b3dc..069fc9f272f7 100644
--- a/ext/civiimport/Civi/Api4/Event/Subscriber/ImportSubscriber.php
+++ b/ext/civiimport/Civi/Api4/Event/Subscriber/ImportSubscriber.php
@@ -171,7 +171,7 @@ private function isTableChange(GenericHookEvent $event): bool {
public function onApiAuthorize(AuthorizeEvent $event): void {
$apiRequest = $event->getApiRequest();
$entity = $apiRequest['entity'];
- if (strpos($entity, 'Import_') === 0) {
+ if (strpos($entity, 'Import_') === 0 && !in_array($event->getActionName(), ['getFields', 'getActions', 'checkAccess'], TRUE)) {
$userJobID = (int) (str_replace('Import_', '', $entity));
if (!UserJob::get(TRUE)->addWhere('id', '=', $userJobID)->selectRowCount()->execute()->count()) {
throw new UnauthorizedException('Import access not permitted');
diff --git a/release-notes.md b/release-notes.md
index 060b9b5def47..301b09319089 100644
--- a/release-notes.md
+++ b/release-notes.md
@@ -15,6 +15,17 @@ Other resources for identifying changes are:
* https://github.com/civicrm/civicrm-joomla
* https://github.com/civicrm/civicrm-wordpress
+## CiviCRM 5.60.0
+
+Released April 5, 2023
+
+- **[Synopsis](release-notes/5.60.0.md#synopsis)**
+- **[Features](release-notes/5.60.0.md#features)**
+- **[Bugs resolved](release-notes/5.60.0.md#bugs)**
+- **[Miscellany](release-notes/5.60.0.md#misc)**
+- **[Credits](release-notes/5.60.0.md#credits)**
+- **[Feedback](release-notes/5.60.0.md#feedback)**
+
## CiviCRM 5.59.0
Released March 1, 2023
diff --git a/release-notes/5.60.0.md b/release-notes/5.60.0.md
new file mode 100644
index 000000000000..d6143be9b471
--- /dev/null
+++ b/release-notes/5.60.0.md
@@ -0,0 +1,407 @@
+# CiviCRM 5.60.0
+
+Released April 5, 2023
+
+- **[Synopsis](#synopsis)**
+- **[Features](#features)**
+- **[Bugs resolved](#bugs)**
+- **[Miscellany](#misc)**
+- **[Credits](#credits)**
+- **[Feedback](#feedback)**
+
+## Synopsis
+
+| *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? | |
+
+## Features
+
+## Bugs resolved
+
+### Core CiviCRM
+
+- **Load submitted `fieldSeparator` on back on `Import Datasource` screen ([25758](https://github.com/civicrm/civicrm-core/pull/25758))**
+
+- **Remove the correct extraneous field separator field ([25753](https://github.com/civicrm/civicrm-core/pull/25753))**
+
+- **PayPal Prp IPN - Fix incorrect option_group update ([25724](https://github.com/civicrm/civicrm-core/pull/25724))**
+
+- **Fix for 5.59 upgrade on multilingual ([25733](https://github.com/civicrm/civicrm-core/pull/25733))**
+
+- **Contribution pages crash for logged-in users when CiviMember is disabled ([25729](https://github.com/civicrm/civicrm-core/pull/25729))**
+
+- **(dev/core#4147) Add test and fix for various flaky tokens ([25704](https://github.com/civicrm/civicrm-core/pull/25704))**
+
+- **dev/core#4145 Prevent fatal on event sched reminders when CiviEvent enabled ([25703](https://github.com/civicrm/civicrm-core/pull/25703))**
+
+- **Stricter typing in Apiv4 ([25706](https://github.com/civicrm/civicrm-core/pull/25706))**
+
+- **Remove deprecated function calls to Event::del, Membership functions del, OptionValue ([25705](https://github.com/civicrm/civicrm-core/pull/25705))**
+
+- **5.59 ([25702](https://github.com/civicrm/civicrm-core/pull/25702))**
+
+- **Remove deprecated use of $ids ([25698](https://github.com/civicrm/civicrm-core/pull/25698))**
+
+- **5.59 to master ([25699](https://github.com/civicrm/civicrm-core/pull/25699))**
+
+- **Delete long-deprecated functions ([25696](https://github.com/civicrm/civicrm-core/pull/25696))**
+
+- **Pull over a few more deprecations + blockDelete deprecation ([25695](https://github.com/civicrm/civicrm-core/pull/25695))**
+
+- **Address portions of deprecated code replacement ([25693](https://github.com/civicrm/civicrm-core/pull/25693))**
+
+- **Deprecations for Mailing::delete functions ([25691](https://github.com/civicrm/civicrm-core/pull/25691))**
+
+- **Deprecations for delete on ACL entities ([25690](https://github.com/civicrm/civicrm-core/pull/25690))**
+
+- **Remove deprecated functions from tests ([25688](https://github.com/civicrm/civicrm-core/pull/25688))**
+
+- **Remove 2020-deprecated handling of `legacyAddressCreate` ([25686](https://github.com/civicrm/civicrm-core/pull/25686))**
+
+- **Remove function noisily deprecated when the world was young (2020) ([25685](https://github.com/civicrm/civicrm-core/pull/25685))**
+
+- **Remove deprecated function call ([25684](https://github.com/civicrm/civicrm-core/pull/25684))**
+
+- **Afform - Filter autocomplete fields belonging to a search display ([25646](https://github.com/civicrm/civicrm-core/pull/25646))**
+
+- **dev/core#4146 Remove (old) Smarty-forward incompatible syntax from Address.tpl ([25669](https://github.com/civicrm/civicrm-core/pull/25669))**
+
+- **Add gentle deprecation to `debug_log_message` ([25683](https://github.com/civicrm/civicrm-core/pull/25683))**
+
+- **Log Smarty debug to it's own channel ([25682](https://github.com/civicrm/civicrm-core/pull/25682))**
+
+- **Smarty notice fix on bank_account_number ([25680](https://github.com/civicrm/civicrm-core/pull/25680))**
+
+- **Remove unnecessary pass-by-reference ([25678](https://github.com/civicrm/civicrm-core/pull/25678))**
+
+- **Remove code deprecated in 2018 ([25679](https://github.com/civicrm/civicrm-core/pull/25679))**
+
+- **Remove empty on location - it should always be set now ([25675](https://github.com/civicrm/civicrm-core/pull/25675))**
+
+- **Afform: Allow selecting case for relationship ([25618](https://github.com/civicrm/civicrm-core/pull/25618))**
+
+- **Fix e-notice pattern around location not defined in formButtons.tpl ([25668](https://github.com/civicrm/civicrm-core/pull/25668))**
+
+- **closes core#4070 - respect default return path ([25309](https://github.com/civicrm/civicrm-core/pull/25309))**
+
+- **dev/core#4127 move cms user parameters to userSystem ([25585](https://github.com/civicrm/civicrm-core/pull/25585))**
+
+- **SearchKit - Clarify how to view SQL output ([25671](https://github.com/civicrm/civicrm-core/pull/25671))**
+
+- **Remove unused variables ([25670](https://github.com/civicrm/civicrm-core/pull/25670))**
+
+- **Remove unused property - not used since import code refactor `_lineCount` ([25466](https://github.com/civicrm/civicrm-core/pull/25466))**
+
+- **Remove conditional assignment around `is_deductible` ([25237](https://github.com/civicrm/civicrm-core/pull/25237))**
+
+- **Event test cleanup, fix test to use submitted form values, rather than require a lot of contorting ([25621](https://github.com/civicrm/civicrm-core/pull/25621))**
+
+- **Extend testing for ContributionConfirm & consolidate `isSeparateMembershipPayment` ([25270](https://github.com/civicrm/civicrm-core/pull/25270))**
+
+- **Fix mixin to use `addTemplateDir` ([25667](https://github.com/civicrm/civicrm-core/pull/25667))**
+
+- **Add noisy deprecation to deprecated function, after universe search ([25662](https://github.com/civicrm/civicrm-core/pull/25662))**
+
+- **(NFC) crmURL - Add examples and whitespace. Crosslink docs. ([25665](https://github.com/civicrm/civicrm-core/pull/25665))**
+
+- **Remove forward incompatible syntax from template ([25664](https://github.com/civicrm/civicrm-core/pull/25664))**
+
+- **Add `crmUrl function` to smarty in the standard way ([25661](https://github.com/civicrm/civicrm-core/pull/25661))**
+
+- **run `civix update` on `recaptcha`, `legacyCustomSearches`, `financialacls` ([25663](https://github.com/civicrm/civicrm-core/pull/25663))**
+
+- **ext/* - General update to civix v23.02.0 ([25659](https://github.com/civicrm/civicrm-core/pull/25659))**
+
+- **Smarty - {htxt} blocks should not be evaluated unless needed ([25653](https://github.com/civicrm/civicrm-core/pull/25653))**
+
+- **HTML definition for subscription history date ([25655](https://github.com/civicrm/civicrm-core/pull/25655))**
+
+- **5.59 ([25660](https://github.com/civicrm/civicrm-core/pull/25660))**
+
+- **Notice fix on preferred_language, when null ([25656](https://github.com/civicrm/civicrm-core/pull/25656))**
+
+- **Remove legacy handling of locks for discontinued mysql/mariaDB versions ([25654](https://github.com/civicrm/civicrm-core/pull/25654))**
+
+- **Event registration activity target ([25650](https://github.com/civicrm/civicrm-core/pull/25650))**
+
+- **Php8.x compatibility - do not try to count NULL ([25652](https://github.com/civicrm/civicrm-core/pull/25652))**
+
+- **Smarty - Fix warnings about 'mb_truncate' modifier ([25651](https://github.com/civicrm/civicrm-core/pull/25651))**
+
+- **dev/core#4126 - Fix force-url parameters on case dashboard ([25649](https://github.com/civicrm/civicrm-core/pull/25649))**
+
+- **Allow (some) permissions with colons ([23782](https://github.com/civicrm/civicrm-core/pull/23782))**
+
+- **Update Smarty addTemplateDir function signature to future smarty ([25248](https://github.com/civicrm/civicrm-core/pull/25248))**
+
+- **(dev/core#4106) Add filter on pledge payment in contribution report t… ([25629](https://github.com/civicrm/civicrm-core/pull/25629))**
+
+- **Reduce processing load in test `assertAPIFailure` ([25648](https://github.com/civicrm/civicrm-core/pull/25648))**
+
+- **Deprecate unused, exception class with non-standard name-spacing ([25641](https://github.com/civicrm/civicrm-core/pull/25641))**
+
+- **Make job ID accessible to searchkit for joblog ([24746](https://github.com/civicrm/civicrm-core/pull/24746))**
+
+- **dev/core#4127 move Drupal stuff in getCiviSourceStorage to Drupal use… ([25587](https://github.com/civicrm/civicrm-core/pull/25587))**
+
+- **Fix add version for civicrm_custom_field.fk_entity ([25642](https://github.com/civicrm/civicrm-core/pull/25642))**
+
+- **Fix handling of invalid sql query during import ([25600](https://github.com/civicrm/civicrm-core/pull/25600))**
+
+- **5.59 to master ([25640](https://github.com/civicrm/civicrm-core/pull/25640))**
+
+- **Fix master-only regression - upgrade script is in wrong version ([25638](https://github.com/civicrm/civicrm-core/pull/25638))**
+
+- **dev/core#4127 move is_drupal to use userSystem logger ([25573](https://github.com/civicrm/civicrm-core/pull/25573))**
+
+- **5.59 ([25637](https://github.com/civicrm/civicrm-core/pull/25637))**
+
+- **Add 'SavePoint' to import to statusBounce back to ([25602](https://github.com/civicrm/civicrm-core/pull/25602))**
+
+- **Move form specific code to the form ([25457](https://github.com/civicrm/civicrm-core/pull/25457))**
+
+- **Make dedupe exceptions searchable in SearchKit ([25522](https://github.com/civicrm/civicrm-core/pull/25522))**
+
+- **E-notice fix Ical display ([25612](https://github.com/civicrm/civicrm-core/pull/25612))**
+
+- **dev/core#4112 Privatise `prevNextCache` functions ([25392](https://github.com/civicrm/civicrm-core/pull/25392))**
+
+- **Reduce unneeded DNS queries during OAuth flow ([25446](https://github.com/civicrm/civicrm-core/pull/25446))**
+
+- **composer require --dev yoast/phpunit-polyfills ([25631](https://github.com/civicrm/civicrm-core/pull/25631))**
+
+- **Extra deprecation for clarity on token function `convertPseudoConstantsUsingMetadata` ([25511](https://github.com/civicrm/civicrm-core/pull/25511))**
+
+- **Angular Coder: Fix unescaping of quotes breaking attributes ([25630](https://github.com/civicrm/civicrm-core/pull/25630))**
+
+- **EntityRef - Format custom field display value on QuickForms ([25632](https://github.com/civicrm/civicrm-core/pull/25632))**
+
+- **Add new EntityReference custom field type ([25471](https://github.com/civicrm/civicrm-core/pull/25471))**
+
+- **getStatus() should be returning a string ([25441](https://github.com/civicrm/civicrm-core/pull/25441))**
+
+- **Add setting to disable Smarty in scheduled reminders ([25444](https://github.com/civicrm/civicrm-core/pull/25444))**
+
+- **Regression: Fix DB syntax error on Parse address scheduled job ([25616](https://github.com/civicrm/civicrm-core/pull/25616))**
+
+- **Afform: Fix broken syntax for saving reciprocal relationships ([25620](https://github.com/civicrm/civicrm-core/pull/25620))**
+
+- **Always show "add more buttons" dropdown in searchkit view ([25596](https://github.com/civicrm/civicrm-core/pull/25596))**
+
+- **[REF][PHP8.2] Remove unnecessary dynamic property ([25622](https://github.com/civicrm/civicrm-core/pull/25622))**
+
+- **[REF][PHP8.2] Fix use of self in callables deprecation ([25625](https://github.com/civicrm/civicrm-core/pull/25625))**
+
+- **[REF][PHP8.2] Tidy up properties on api_v3_GroupContactTest ([25626](https://github.com/civicrm/civicrm-core/pull/25626))**
+
+- **[REF][PHP8.2] Tidy up properties in CRM_Event_BAO_EventPermissionsTest ([25623](https://github.com/civicrm/civicrm-core/pull/25623))**
+
+- **(REF) Remove test reference to property which no longer exists ([25624](https://github.com/civicrm/civicrm-core/pull/25624))**
+
+- **Php8.2 test fix, remove one instance of undeclared property ([25619](https://github.com/civicrm/civicrm-core/pull/25619))**
+
+- **Stop loading unused `relatedObjects` ([25617](https://github.com/civicrm/civicrm-core/pull/25617))**
+
+- **[NFC] doc block fix ([25610](https://github.com/civicrm/civicrm-core/pull/25610))**
+
+- **dev/core#4127 move mailing workflow check to userSystem ([25586](https://github.com/civicrm/civicrm-core/pull/25586))**
+
+- **Remove function deprecated a year ago ([25615](https://github.com/civicrm/civicrm-core/pull/25615))**
+
+- **Fix test to test the thing it was written to test ([25608](https://github.com/civicrm/civicrm-core/pull/25608))**
+
+- **[NFC] php8.2 support in test class `ActivitySearchTest` ([25607](https://github.com/civicrm/civicrm-core/pull/25607))**
+
+- **distmaker - Fix export of WordPress patches ([25599](https://github.com/civicrm/civicrm-core/pull/25599))**
+
+- **Make private function private ([25604](https://github.com/civicrm/civicrm-core/pull/25604))**
+
+- **Disambiguate `Address.state_province_id:abbr` ([25550](https://github.com/civicrm/civicrm-core/pull/25550))**
+
+- **update entity mapping logic for profile fields to include contact subtypes ([25570](https://github.com/civicrm/civicrm-core/pull/25570))**
+
+- **Allow OAuth redirect URI to be overridden in client or provider config ([25445](https://github.com/civicrm/civicrm-core/pull/25445))**
+
+- **(REF) Tidy up unused params in api_v3_ContributionSoftTest ([25322](https://github.com/civicrm/civicrm-core/pull/25322))**
+
+- **APIv4 - Limited support for casting ([25595](https://github.com/civicrm/civicrm-core/pull/25595))**
+
+- **Remove unused constants left over from import cleanup ([25601](https://github.com/civicrm/civicrm-core/pull/25601))**
+
+- **api4 explorer: make boolean params work in cv (short syntax) ([25589](https://github.com/civicrm/civicrm-core/pull/25589))**
+
+- **Disambiguate `Address.state_province_id:abbr` (PHP asort) ([25552](https://github.com/civicrm/civicrm-core/pull/25552))**
+
+- **Filter expired searches from search kit results ([25568](https://github.com/civicrm/civicrm-core/pull/25568))**
+
+- **Fix empty values of Note on Import contribution ([25569](https://github.com/civicrm/civicrm-core/pull/25569))**
+
+- **Deprecate unused `CRM_Core_BAO_UFField::copy()` function ([25594](https://github.com/civicrm/civicrm-core/pull/25594))**
+
+- **dev/core#4127 move ipAddress to userSystem ([25572](https://github.com/civicrm/civicrm-core/pull/25572))**
+
+- **Fix more schema checks to use mysql DATABASE() function, deprecate php function ([25593](https://github.com/civicrm/civicrm-core/pull/25593))**
+
+- **Remove empty function ([25592](https://github.com/civicrm/civicrm-core/pull/25592))**
+
+- **Fix Contact import e-notice on preview screen ([25302](https://github.com/civicrm/civicrm-core/pull/25302))**
+
+- **dev/core#4127 use userSystem method to check for Views ([25571](https://github.com/civicrm/civicrm-core/pull/25571))**
+
+- **[REF] Fix undefined variable notice in WordPress tests ([25591](https://github.com/civicrm/civicrm-core/pull/25591))**
+
+- **5.59 ([25590](https://github.com/civicrm/civicrm-core/pull/25590))**
+
+- **5.59 ([25584](https://github.com/civicrm/civicrm-core/pull/25584))**
+
+- **5.59 ([25582](https://github.com/civicrm/civicrm-core/pull/25582))**
+
+- **5.59 ([25581](https://github.com/civicrm/civicrm-core/pull/25581))**
+
+- **CiviContribute - Fix warning about 'suppressedEmails' when generating PDF ([25576](https://github.com/civicrm/civicrm-core/pull/25576))**
+
+- **Smarty {ts} - For extensions, use fallback similar to E::ts() and JS ts() ([25383](https://github.com/civicrm/civicrm-core/pull/25383))**
+
+- **Make `activity_type_id` available to `links` hook, test ([25565](https://github.com/civicrm/civicrm-core/pull/25565))**
+
+- **Make unshared `getTree` function private, remove never passed params ([25517](https://github.com/civicrm/civicrm-core/pull/25517))**
+
+- **5.59 to master ([25567](https://github.com/civicrm/civicrm-core/pull/25567))**
+
+- **Preliminary cleanup, comments, type hints ([25564](https://github.com/civicrm/civicrm-core/pull/25564))**
+
+- **dev/core#4076 split up the theme method ([25329](https://github.com/civicrm/civicrm-core/pull/25329))**
+
+- **Fix fatal error on upgrade success screen ([25554](https://github.com/civicrm/civicrm-core/pull/25554))**
+
+- **Mailing Summary Report: support pseudofields ([25560](https://github.com/civicrm/civicrm-core/pull/25560))**
+
+- **[REF][PHP8.2] Remove use of dynamic properties in CRM_Contact_Form_Task_EmailTest ([25562](https://github.com/civicrm/civicrm-core/pull/25562))**
+
+- **[REF][PHP8.2] Get rid of dynamic properties in CRM_Core_Payment_AuthorizeNetTest ([25561](https://github.com/civicrm/civicrm-core/pull/25561))**
+
+- **[REF][PHP8.2] Stop use of dynamic property in AdditionalPaymentTest ([25559](https://github.com/civicrm/civicrm-core/pull/25559))**
+
+- **[REF][PHP8.2] Use variable instead of dynmaic property (CRM_Group_Page_AjaxTest) ([25558](https://github.com/civicrm/civicrm-core/pull/25558))**
+
+- **[REF][PHP8.2] Declare property in CRM_Pledge_BAO_PledgeBlockTest ([25557](https://github.com/civicrm/civicrm-core/pull/25557))**
+
+- **[REF][PHP8.2] Declare property in CRM_Utils_FakeObject ([25556](https://github.com/civicrm/civicrm-core/pull/25556))**
+
+- **A couple of minor smarty notice fixes ([25514](https://github.com/civicrm/civicrm-core/pull/25514))**
+
+- **Upgrade test to use more recent methodology for testing forms ([25551](https://github.com/civicrm/civicrm-core/pull/25551))**
+
+- **Smarty notice fix ([25544](https://github.com/civicrm/civicrm-core/pull/25544))**
+
+- **Remove always-NULL `$singleRecord` variable ([25519](https://github.com/civicrm/civicrm-core/pull/25519))**
+
+- **Enotice fix, pledge block on UserDashboard ([25546](https://github.com/civicrm/civicrm-core/pull/25546))**
+
+- **SearchKit - Configurable action menu tasks per-search-display ([25521](https://github.com/civicrm/civicrm-core/pull/25521))**
+
+- **Do not use reference for Object parameter, death to `_NULLObject` ([25541](https://github.com/civicrm/civicrm-core/pull/25541))**
+
+- **Remove invalid 'world_region' => 'India' from test ([25540](https://github.com/civicrm/civicrm-core/pull/25540))**
+
+- **Fix a couple more places to use mysql DATABASE() function ([25537](https://github.com/civicrm/civicrm-core/pull/25537))**
+
+- **5.59 ([25538](https://github.com/civicrm/civicrm-core/pull/25538))**
+
+- **Typo executequery => executeQuery ([25539](https://github.com/civicrm/civicrm-core/pull/25539))**
+
+- **NFC cleanup in test class ([25524](https://github.com/civicrm/civicrm-core/pull/25524))**
+
+- **Use mysql DATABASE() function instead of php code ([25530](https://github.com/civicrm/civicrm-core/pull/25530))**
+
+- **5.59 ([25531](https://github.com/civicrm/civicrm-core/pull/25531))**
+
+- **Use `DATABASE()` function rather than lossa code ([25528](https://github.com/civicrm/civicrm-core/pull/25528))**
+
+- **Enotice fix on userDashboard with contributions, replace deprecated functions with api4v calls ([24861](https://github.com/civicrm/civicrm-core/pull/24861))**
+
+- **5.59 ([25526](https://github.com/civicrm/civicrm-core/pull/25526))**
+
+- **Bump dompdf/dompdf from 2.0.2 to 2.0.3 ([25520](https://github.com/civicrm/civicrm-core/pull/25520))**
+
+- **Add noisy deprecation to `replaceHookTokens` ([25510](https://github.com/civicrm/civicrm-core/pull/25510))**
+
+- **dev/core#4117 Add is_current to UserJob, Search ([25516](https://github.com/civicrm/civicrm-core/pull/25516))**
+
+- **Remove never-true IF ([25518](https://github.com/civicrm/civicrm-core/pull/25518))**
+
+- **Remove interaction with complex legacy `getTree` function ([25395](https://github.com/civicrm/civicrm-core/pull/25395))**
+
+- **only load dedupe rules for the chosen entity ([25515](https://github.com/civicrm/civicrm-core/pull/25515))**
+
+- **Post divide code tidy up ([25195](https://github.com/civicrm/civicrm-core/pull/25195))**
+
+- **(dev/core#4028) make CRM_Admin_Form_Setting_UF more CMS agnostic ([25328](https://github.com/civicrm/civicrm-core/pull/25328))**
+
+- **Fully deprecate `CRM_Utils_Token::getMembershipTokenDetails`, `CRM_Utils_Token::replaceEntityTokens` ([25507](https://github.com/civicrm/civicrm-core/pull/25507))**
+
+- **PaymentProcessor - Use ajax refresh ([25512](https://github.com/civicrm/civicrm-core/pull/25512))**
+
+- **Fully deprecate `CRM_Core_SelectValues::eventTokens()` ([25509](https://github.com/civicrm/civicrm-core/pull/25509))**
+
+- **Add extra test, comment how it could be used to fix bug ([25503](https://github.com/civicrm/civicrm-core/pull/25503))**
+
+- **Remove unused variable ([25508](https://github.com/civicrm/civicrm-core/pull/25508))**
+
+- **Fully deprecate `CRM_Core_SelectValues::membershipTokens()` ([25506](https://github.com/civicrm/civicrm-core/pull/25506))**
+
+- **Fully deprecate legacy contributionTokens ([25505](https://github.com/civicrm/civicrm-core/pull/25505))**
+
+- **API4: Allow save() to match on null values ([24971](https://github.com/civicrm/civicrm-core/pull/24971))**
+
+- **Fix Scheduled reminders form to use tokenProcessor to get token list ([25052](https://github.com/civicrm/civicrm-core/pull/25052))**
+
+- **Default to supporting partial locales ([25063](https://github.com/civicrm/civicrm-core/pull/25063))**
+
+- **fix the id help instead use class help ([25487](https://github.com/civicrm/civicrm-core/pull/25487))**
+
+- **[REF][PHP8.2] Refactor properties on CRM_Event_Form_SearchTest ([25501](https://github.com/civicrm/civicrm-core/pull/25501))**
+
+- **[REF][PHP8.2] Declare dynamic property in two SMS tests ([25502](https://github.com/civicrm/civicrm-core/pull/25502))**
+
+- **dev/drupal#176 - allow symfony 6 ([25499](https://github.com/civicrm/civicrm-core/pull/25499))**
+
+- **(REF) Remove unused setup from AdhocMailingTest ([25500](https://github.com/civicrm/civicrm-core/pull/25500))**
+
+- **dev/drupal#176 - Move cache/integrationtest only used for testing into require-dev ([25054](https://github.com/civicrm/civicrm-core/pull/25054))**
+
+- **Fix user profile file fields not saving. ([80](https://github.com/civicrm/civicrm-drupal-8/pull/80))**
+
+- **[REF] Add support for composer installers v2 which seems to be needed… ([79](https://github.com/civicrm/civicrm-drupal-8/pull/79))**
+
+- **update CiviCrmTestBase setup() method declaration to match BrowserTestBase ([78](https://github.com/civicrm/civicrm-drupal-8/pull/78))**
+
+- **CiviCRM Stable Version bump ([291](https://github.com/civicrm/civicrm-wordpress/pull/291))**
+
+- **5.59 ([290](https://github.com/civicrm/civicrm-wordpress/pull/290))**
+
+## Miscellany
+
+## Credits
+
+This release was developed by the following code authors:
+
+AGH Strategies - Alice Frumin, Andie Hunt; anemirovsky; BrightMinded Ltd - Bradley Taylor; CiviCRM - Coleman Watts, Tim Otten; CiviDesk - Yashodha Chaku; Coop SymbioTIC - Mathieu Lutfy; Dave D; dependabot[bot]; ES-Progress - Sandor Semsey; Freeform Solutions - Herb van den Dool; Fuzion - Jitendra Purohit; iXiam - Luciano Spiegel; JMA Consulting - Seamus Lee; Lemniscus - Noah Miller; Megaphone Technology Consulting - Jon Goldberg; MJW Consulting - Matthew Wire; PERORA SRL - Samuele Masetto; Progressive Technology Project - Jamie McClelland; Skvare - Mark Hanna; Tadpole Collective - Kevin Cristiano; Third Sector Design - Kurund Jalmi, Michael McAndrew; Wikimedia Foundation - Eileen McNaughton
+
+Most authors also reviewed code for this release; in addition, the following
+reviewers contributed their comments:
+
+Agileware - Francis Whittle, Justin Freeman; Andreas Howiller; BeccaTregenna; Blackfly Solutions - Alan Dixon; BrightMinded Ltd - Bradley Taylor; civibot[bot]; civicrm-builder; CiviCRM - Coleman Watts, Tim Otten; CiviDesk - Yashodha Chaku; Dave D; Freeform Solutions - Herb van den Dool; Fuzion - Luke Stewart; Jens Schuppe; JMA Consulting - Joe Murray, Seamus Lee; Lemniscus - Noah Miller; Megaphone Technology Consulting - Brienne Kordis, Jon Goldberg; MJW Consulting - Matthew Wire; Squiffle Consulting - Aidan Saunders; Stephen Palmstrom; Tadpole Collective - Kevin Cristiano; Third Sector Design - Michael McAndrew; Wikimedia Foundation - Eileen McNaughton
+
+## Feedback
+
+These release notes are edited by Alice Frumin and Andie Hunt. If you'd like
+to provide feedback on them, please log in to https://chat.civicrm.org/civicrm
+and contact `@agh1`.
diff --git a/tests/phpunit/CRM/Dedupe/MergerTest.php b/tests/phpunit/CRM/Dedupe/MergerTest.php
index 9aad35e896b8..c821f75d183d 100644
--- a/tests/phpunit/CRM/Dedupe/MergerTest.php
+++ b/tests/phpunit/CRM/Dedupe/MergerTest.php
@@ -1,5 +1,7 @@
callAPISuccess('Contact', 'create', [
'id' => $duplicateContactID1,
- "{$customFieldName}" => 'def',
+ $customFieldName => 'def',
]);
$this->assertCustomFieldValue($duplicateContactID1, 'def', $customFieldName);
@@ -1453,7 +1455,28 @@ public function testMergeWithDeclaredSearchJoin(): void {
CRM_Core_DAO_AllCoreTables::flush();
$contact1 = $this->individualCreate();
$contact2 = $this->individualCreate(['api.Im.create' => ['name' => 'chat_handle']]);
- $this->callAPISuccess('Contact', 'merge', ['to_keep_id' => $contact1, 'to_remove_id' => $contact2]);
+ $this->callAPISuccess('Contact', 'merge', [
+ 'to_keep_id' => $contact1,
+ 'to_remove_id' => $contact2,
+ ]);
+ }
+
+ /**
+ * Test that organization name is updated for employees of merged organizations..
+ *
+ * @throws \CRM_Core_Exception
+ */
+ public function testMergeWithEmployer(): void {
+ $organizationToRemoveID = $this->organizationCreate(['organization_name' => 'remove']);
+ $organizationToKeepID = $this->organizationCreate(['organization_name' => 'keep']);
+ $individualID = $this->createContactWithEmployerRelationship([
+ 'contact_id_b' => $organizationToRemoveID,
+ ]);
+ $employerName = Contact::get()->addSelect('organization_name')->addWhere('id', '=', $individualID)->execute()->first()['organization_name'];
+ $this->assertEquals('remove', $employerName);
+ $this->callAPISuccess('Contact', 'merge', ['to_keep_id' => $organizationToKeepID, 'to_remove_id' => $organizationToRemoveID, 'mode' => 'aggressive']);
+ $employerName = Contact::get()->addSelect('organization_name')->addWhere('id', '=', $individualID)->execute()->first()['organization_name'];
+ $this->assertEquals('keep', $employerName);
}
/**