$params['contact_sub_type'] = 'null';
}
- // Fixed contact source.
- if (isset($params['contact_source'])) {
- $params['source'] = $params['contact_source'];
- }
-
if (isset($params['preferred_communication_method']) && is_array($params['preferred_communication_method'])) {
CRM_Utils_Array::formatArrayKeys($params['preferred_communication_method']);
$contact->preferred_communication_method = CRM_Utils_Array::implodePadded($params['preferred_communication_method']);
unset($params['preferred_communication_method']);
}
+ $defaults = ['source' => CRM_Utils_Array::value('contact_source', $params)];
+ if ($params['contact_type'] === 'Organization' && isset($params['organization_name'])) {
+ $defaults['display_name'] = $params['organization_name'];
+ $defaults['sort_name'] = $params['organization_name'];
+ }
+ if ($params['contact_type'] === 'Household' && isset($params['household_name'])) {
+ $defaults['display_name'] = $params['household_name'];
+ $defaults['sort_name'] = $params['household_name'];
+ }
+ $params = array_merge($defaults, $params);
+
$allNull = $contact->copyValues($params);
$contact->id = CRM_Utils_Array::value('contact_id', $params);
if ($contact->contact_type == 'Individual') {
$allNull = FALSE;
-
+ // @todo allow the lines below to be overridden by input or hooks & add tests,
+ // as has been done for households and organizations.
// Format individual fields.
CRM_Contact_BAO_Individual::format($params, $contact);
}
- elseif ($contact->contact_type == 'Household') {
- if (isset($params['household_name'])) {
- $allNull = FALSE;
- $contact->display_name = $contact->sort_name = CRM_Utils_Array::value('household_name', $params, '');
- }
- }
- elseif ($contact->contact_type == 'Organization') {
- if (isset($params['organization_name'])) {
- $allNull = FALSE;
- $contact->display_name = $contact->sort_name = CRM_Utils_Array::value('organization_name', $params, '');
- }
- }
+
if (strlen($contact->display_name) > 128) {
$contact->display_name = substr($contact->display_name, 0, 128);
}
$contact->copyValues($updateParams);
$contact->save();
+ CRM_Core_BAO_Log::register($contact->id, 'civicrm_contact', $contact->id);
CRM_Utils_Hook::post('update', $contact->contact_type, $contact->id, $contact);
'caseId' => NULL,
'context' => 'activity',
);
- return CRM_Activity_BAO_Activity::deprecatedGetActivitiesCount($input);
+ return CRM_Activity_BAO_Activity::getActivitiesCount($input);
case 'mailing':
$params = array('contact_id' => $contactId);
* @param bool $checkPermissions
* @param int $ruleGroupID
* ID of the rule group to be used if an override is desirable.
+ * @param array $contextParams
+ * The context if relevant, eg. ['event_id' => X]
*
* @return array
*/
- public static function getDuplicateContacts($input, $contactType, $rule = 'Unsupervised', $excludedContactIDs = array(), $checkPermissions = TRUE, $ruleGroupID = NULL) {
+ public static function getDuplicateContacts($input, $contactType, $rule = 'Unsupervised', $excludedContactIDs = [], $checkPermissions = TRUE, $ruleGroupID = NULL, $contextParams = []) {
$dedupeParams = CRM_Dedupe_Finder::formatParams($input, $contactType);
$dedupeParams['check_permission'] = $checkPermissions;
- $ids = CRM_Dedupe_Finder::dupesByParams($dedupeParams, $contactType, $rule, $excludedContactIDs, $ruleGroupID);
- return $ids;
+ $dedupeParams['contact_type'] = $contactType;
+ $dedupeParams['rule'] = $rule;
+ $dedupeParams['rule_group_id'] = $ruleGroupID;
+ $dedupeParams['excluded_contact_ids'] = $excludedContactIDs;
+ $dedupeResults['ids'] = [];
+ $dedupeResults['handled'] = FALSE;
+ CRM_Utils_Hook::findDuplicates($dedupeParams, $dedupeResults, $contextParams);
+ if (!$dedupeResults['handled']) {
+ $dedupeResults['ids'] = CRM_Dedupe_Finder::dupesByParams($dedupeParams, $contactType, $rule, $excludedContactIDs, $ruleGroupID);
+ }
+ return $dedupeResults['ids'];
}
/**
* @param bool $checkPermissions
* @param int $ruleGroupID
* ID of the rule group to be used if an override is desirable.
+ * @param array $contextParams
+ * The context if relevant, eg. ['event_id' => X]
*
* @return int|NULL
*/
- public static function getFirstDuplicateContact($input, $contactType, $rule = 'Unsupervised', $excludedContactIDs = array(), $checkPermissions = TRUE, $ruleGroupID = NULL) {
- $ids = self::getDuplicateContacts($input, $contactType, $rule, $excludedContactIDs, $checkPermissions, $ruleGroupID);
+ public static function getFirstDuplicateContact($input, $contactType, $rule = 'Unsupervised', $excludedContactIDs = [], $checkPermissions = TRUE, $ruleGroupID = NULL, $contextParams = []) {
+ $ids = self::getDuplicateContacts($input, $contactType, $rule, $excludedContactIDs, $checkPermissions, $ruleGroupID, $contextParams);
if (empty($ids)) {
return NULL;
}
}
/**
- * Checks permission to create new contacts from entityRef widget
- *
- * Note: other components must return an array of links from this function,
- * but Contacts are given special treatment - the links are in javascript already.
+ * @param array $appendProfiles
+ * Name of profile(s) to append to each link.
*
- * @return bool
+ * @return array
*/
- public static function entityRefCreateLinks() {
- return CRM_Core_Permission::check([['profile create', 'profile listings and forms']]);
+ public static function getEntityRefCreateLinks($appendProfiles = []) {
+ // You'd think that "create contacts" would be the permission to check,
+ // But new contact popups are profile forms and those use their own permissions.
+ if (!CRM_Core_Permission::check([['profile create', 'profile listings and forms']])) {
+ return FALSE;
+ }
+ $profiles = [];
+ foreach (CRM_Contact_BAO_ContactType::basicTypes() as $contactType) {
+ $profiles[] = 'new_' . strtolower($contactType);
+ }
+ $retrieved = civicrm_api3('uf_group', 'get', [
+ 'name' => ['IN' => array_merge($profiles, (array) $appendProfiles)],
+ 'is_active' => 1,
+ ]);
+ $links = $append = [];
+ if (!empty($retrieved['values'])) {
+ $icons = [
+ 'individual' => 'fa-user',
+ 'organization' => 'fa-building',
+ 'household' => 'fa-home',
+ ];
+ foreach ($retrieved['values'] as $id => $profile) {
+ if (in_array($profile['name'], $profiles)) {
+ $links[] = array(
+ 'label' => $profile['title'],
+ 'url' => CRM_Utils_System::url('civicrm/profile/create', "reset=1&context=dialog&gid=$id",
+ NULL, NULL, FALSE, FALSE, TRUE),
+ 'type' => ucfirst(str_replace('new_', '', $profile['name'])),
+ 'icon' => CRM_Utils_Array::value(str_replace('new_', '', $profile['name']), $icons),
+ );
+ }
+ else {
+ $append[] = $id;
+ }
+ }
+ foreach ($append as $id) {
+ foreach ($links as &$link) {
+ $link['url'] .= ",$id";
+ }
+ }
+ }
+ return $links;
}
/**
public static function getEntityRefFilters() {
return [
['key' => 'contact_type', 'value' => ts('Contact Type')],
- ['key' => 'group', 'value' => ts('Group'), 'entity' => 'group_contact'],
- ['key' => 'tag', 'value' => ts('Tag'), 'entity' => 'entity_tag'],
- ['key' => 'state_province', 'value' => ts('State/Province'), 'entity' => 'address'],
- ['key' => 'country', 'value' => ts('Country'), 'entity' => 'address'],
+ ['key' => 'group', 'value' => ts('Group'), 'entity' => 'GroupContact'],
+ ['key' => 'tag', 'value' => ts('Tag'), 'entity' => 'EntityTag'],
+ ['key' => 'state_province', 'value' => ts('State/Province'), 'entity' => 'Address'],
+ ['key' => 'country', 'value' => ts('Country'), 'entity' => 'Address'],
['key' => 'gender_id', 'value' => ts('Gender'), 'condition' => ['contact_type' => 'Individual']],
['key' => 'is_deceased', 'value' => ts('Deceased'), 'condition' => ['contact_type' => 'Individual']],
['key' => 'contact_id', 'value' => ts('Contact ID'), 'type' => 'text'],