Commit | Line | Data |
---|---|---|
6a488035 | 1 | <?php |
6a488035 | 2 | /* |
bc77d7c0 TO |
3 | +--------------------------------------------------------------------+ |
4 | | Copyright CiviCRM LLC. All rights reserved. | | |
5 | | | | |
6 | | This work is published under the GNU AGPLv3 license with some | | |
7 | | permitted exceptions and without any warranty. For full license | | |
8 | | and copyright information, see https://civicrm.org/licensing | | |
9 | +--------------------------------------------------------------------+ | |
e70a7fc0 | 10 | */ |
6a488035 | 11 | |
50bfb460 SB |
12 | /** |
13 | * | |
14 | * @package CRM | |
ca5cec67 | 15 | * @copyright CiviCRM LLC https://civicrm.org/licensing |
50bfb460 SB |
16 | */ |
17 | ||
6a488035 TO |
18 | /* |
19 | * These functions have been deprecated out of API v3 Utils folder as they are not part of the | |
20 | * API. Calling API functions directly is not supported & these functions are not called by any | |
21 | * part of the API so are not really part of the api | |
22 | * | |
23 | */ | |
24 | ||
6a488035 TO |
25 | require_once 'api/v3/utils.php'; |
26 | ||
6a488035 | 27 | /** |
ea3ddccf | 28 | * Check duplicate contacts based on de-dupe parameters. |
29 | * | |
30 | * @param array $params | |
31 | * | |
32 | * @return array | |
6a488035 TO |
33 | */ |
34 | function _civicrm_api3_deprecated_check_contact_dedupe($params) { | |
35 | static $cIndieFields = NULL; | |
36 | static $defaultLocationId = NULL; | |
37 | ||
38 | $contactType = $params['contact_type']; | |
39 | if ($cIndieFields == NULL) { | |
40 | require_once 'CRM/Contact/BAO/Contact.php'; | |
41 | $cTempIndieFields = CRM_Contact_BAO_Contact::importableFields($contactType); | |
42 | $cIndieFields = $cTempIndieFields; | |
43 | ||
44 | require_once "CRM/Core/BAO/LocationType.php"; | |
45 | $defaultLocation = CRM_Core_BAO_LocationType::getDefault(); | |
46 | ||
50bfb460 | 47 | // set the value to default location id else set to 1 |
e7292422 | 48 | if (!$defaultLocationId = (int) $defaultLocation->id) { |
6a488035 TO |
49 | $defaultLocationId = 1; |
50 | } | |
51 | } | |
52 | ||
53 | require_once 'CRM/Contact/BAO/Query.php'; | |
54 | $locationFields = CRM_Contact_BAO_Query::$_locationSpecificFields; | |
55 | ||
be2fb01f | 56 | $contactFormatted = []; |
6a488035 TO |
57 | foreach ($params as $key => $field) { |
58 | if ($field == NULL || $field === '') { | |
59 | continue; | |
60 | } | |
6ce097e8 JF |
61 | // CRM-17040, Considering only primary contact when importing contributions. So contribution inserts into primary contact |
62 | // instead of soft credit contact. | |
63 | if (is_array($field) && $key != "soft_credit") { | |
6a488035 TO |
64 | foreach ($field as $value) { |
65 | $break = FALSE; | |
66 | if (is_array($value)) { | |
67 | foreach ($value as $name => $testForEmpty) { | |
68 | if ($name !== 'phone_type' && | |
69 | ($testForEmpty === '' || $testForEmpty == NULL) | |
70 | ) { | |
71 | $break = TRUE; | |
72 | break; | |
73 | } | |
74 | } | |
75 | } | |
76 | else { | |
77 | $break = TRUE; | |
78 | } | |
79 | if (!$break) { | |
80 | _civicrm_api3_deprecated_add_formatted_param($value, $contactFormatted); | |
81 | } | |
82 | } | |
83 | continue; | |
84 | } | |
85 | ||
be2fb01f | 86 | $value = [$key => $field]; |
6a488035 TO |
87 | |
88 | // check if location related field, then we need to add primary location type | |
89 | if (in_array($key, $locationFields)) { | |
90 | $value['location_type_id'] = $defaultLocationId; | |
91 | } | |
92 | elseif (array_key_exists($key, $cIndieFields)) { | |
93 | $value['contact_type'] = $contactType; | |
94 | } | |
95 | ||
96 | _civicrm_api3_deprecated_add_formatted_param($value, $contactFormatted); | |
97 | } | |
98 | ||
99 | $contactFormatted['contact_type'] = $contactType; | |
100 | ||
101 | return _civicrm_api3_deprecated_duplicate_formatted_contact($contactFormatted); | |
102 | } | |
103 | ||
104 | /** | |
105 | * take the input parameter list as specified in the data model and | |
106 | * convert it into the same format that we use in QF and BAO object | |
107 | * | |
77855840 TO |
108 | * @param array $params |
109 | * Associative array of property name/value. | |
6a488035 | 110 | * pairs to insert in new contact. |
77855840 TO |
111 | * @param array $values |
112 | * The reformatted properties that we can use internally. | |
6a488035 | 113 | * |
f4aaa82a | 114 | * @param array|bool $create Is the formatted Values array going to |
6a488035 TO |
115 | * be used for CRM_Activity_BAO_Activity::create() |
116 | * | |
117 | * @return array|CRM_Error | |
6a488035 TO |
118 | */ |
119 | function _civicrm_api3_deprecated_activity_formatted_param(&$params, &$values, $create = FALSE) { | |
120 | // copy all the activity fields as is | |
121 | $fields = CRM_Activity_DAO_Activity::fields(); | |
122 | _civicrm_api3_store_values($fields, $params, $values); | |
123 | ||
124 | require_once 'CRM/Core/OptionGroup.php'; | |
125 | $customFields = CRM_Core_BAO_CustomField::getFields('Activity'); | |
126 | ||
127 | foreach ($params as $key => $value) { | |
128 | // ignore empty values or empty arrays etc | |
129 | if (CRM_Utils_System::isNull($value)) { | |
130 | continue; | |
131 | } | |
132 | ||
133 | //Handling Custom Data | |
134 | if ($customFieldID = CRM_Core_BAO_CustomField::getKeyID($key)) { | |
135 | $values[$key] = $value; | |
136 | $type = $customFields[$customFieldID]['html_type']; | |
726e45e7 | 137 | if (CRM_Core_BAO_CustomField::isSerialized($customFields[$customFieldID])) { |
be40742b | 138 | $values[$key] = CRM_Import_Parser::unserializeCustomValue($customFieldID, $value, $type); |
6a488035 TO |
139 | } |
140 | elseif ($type == 'Select' || $type == 'Radio') { | |
141 | $customOption = CRM_Core_BAO_CustomOption::getCustomOption($customFieldID, TRUE); | |
142 | foreach ($customOption as $customFldID => $customValue) { | |
9c1bc317 CW |
143 | $val = $customValue['value'] ?? NULL; |
144 | $label = $customValue['label'] ?? NULL; | |
6a488035 TO |
145 | $label = strtolower($label); |
146 | $value = strtolower(trim($value)); | |
147 | if (($value == $label) || ($value == strtolower($val))) { | |
148 | $values[$key] = $val; | |
149 | } | |
150 | } | |
151 | } | |
152 | } | |
153 | ||
154 | if ($key == 'target_contact_id') { | |
155 | if (!CRM_Utils_Rule::integer($value)) { | |
156 | return civicrm_api3_create_error("contact_id not valid: $value"); | |
157 | } | |
158 | $contactID = CRM_Core_DAO::singleValueQuery("SELECT id FROM civicrm_contact WHERE id = $value"); | |
159 | if (!$contactID) { | |
160 | return civicrm_api3_create_error("Invalid Contact ID: There is no contact record with contact_id = $value."); | |
161 | } | |
162 | } | |
163 | } | |
164 | return NULL; | |
165 | } | |
166 | ||
167 | /** | |
168 | * This function adds the contact variable in $values to the | |
169 | * parameter list $params. For most cases, $values should have length 1. If | |
170 | * the variable being added is a child of Location, a location_type_id must | |
171 | * also be included. If it is a child of phone, a phone_type must be included. | |
172 | * | |
77855840 TO |
173 | * @param array $values |
174 | * The variable(s) to be added. | |
175 | * @param array $params | |
176 | * The structured parameter list. | |
6a488035 TO |
177 | * |
178 | * @return bool|CRM_Utils_Error | |
6a488035 TO |
179 | */ |
180 | function _civicrm_api3_deprecated_add_formatted_param(&$values, &$params) { | |
50bfb460 SB |
181 | // Crawl through the possible classes: |
182 | // Contact | |
183 | // Individual | |
184 | // Household | |
185 | // Organization | |
186 | // Location | |
187 | // Address | |
188 | ||
189 | // Phone | |
190 | // IM | |
191 | // Note | |
192 | // Custom | |
193 | ||
194 | // Cache the various object fields | |
6a488035 TO |
195 | static $fields = NULL; |
196 | ||
197 | if ($fields == NULL) { | |
be2fb01f | 198 | $fields = []; |
6a488035 TO |
199 | } |
200 | ||
50bfb460 | 201 | // first add core contact values since for other Civi modules they are not added |
6a488035 TO |
202 | require_once 'CRM/Contact/BAO/Contact.php'; |
203 | $contactFields = CRM_Contact_DAO_Contact::fields(); | |
204 | _civicrm_api3_store_values($contactFields, $values, $params); | |
205 | ||
206 | if (isset($values['contact_type'])) { | |
50bfb460 | 207 | // we're an individual/household/org property |
6a488035 | 208 | |
6a488035 TO |
209 | $fields[$values['contact_type']] = CRM_Contact_DAO_Contact::fields(); |
210 | ||
211 | _civicrm_api3_store_values($fields[$values['contact_type']], $values, $params); | |
212 | return TRUE; | |
213 | } | |
214 | ||
215 | if (isset($values['individual_prefix'])) { | |
a7488080 | 216 | if (!empty($params['prefix_id'])) { |
91bb24a7 | 217 | $prefixes = CRM_Core_PseudoConstant::get('CRM_Contact_DAO_Contact', 'prefix_id'); |
6a488035 TO |
218 | $params['prefix'] = $prefixes[$params['prefix_id']]; |
219 | } | |
220 | else { | |
221 | $params['prefix'] = $values['individual_prefix']; | |
222 | } | |
223 | return TRUE; | |
224 | } | |
225 | ||
226 | if (isset($values['individual_suffix'])) { | |
a7488080 | 227 | if (!empty($params['suffix_id'])) { |
91bb24a7 | 228 | $suffixes = CRM_Core_PseudoConstant::get('CRM_Contact_DAO_Contact', 'suffix_id'); |
6a488035 TO |
229 | $params['suffix'] = $suffixes[$params['suffix_id']]; |
230 | } | |
231 | else { | |
232 | $params['suffix'] = $values['individual_suffix']; | |
233 | } | |
234 | return TRUE; | |
235 | } | |
236 | ||
50bfb460 | 237 | // CRM-4575 |
6a488035 | 238 | if (isset($values['email_greeting'])) { |
a7488080 | 239 | if (!empty($params['email_greeting_id'])) { |
be2fb01f | 240 | $emailGreetingFilter = [ |
6b409353 | 241 | 'contact_type' => $params['contact_type'] ?? NULL, |
6a488035 | 242 | 'greeting_type' => 'email_greeting', |
be2fb01f | 243 | ]; |
6a488035 TO |
244 | $emailGreetings = CRM_Core_PseudoConstant::greeting($emailGreetingFilter); |
245 | $params['email_greeting'] = $emailGreetings[$params['email_greeting_id']]; | |
246 | } | |
247 | else { | |
248 | $params['email_greeting'] = $values['email_greeting']; | |
249 | } | |
250 | ||
251 | return TRUE; | |
252 | } | |
253 | ||
254 | if (isset($values['postal_greeting'])) { | |
a7488080 | 255 | if (!empty($params['postal_greeting_id'])) { |
be2fb01f | 256 | $postalGreetingFilter = [ |
6b409353 | 257 | 'contact_type' => $params['contact_type'] ?? NULL, |
6a488035 | 258 | 'greeting_type' => 'postal_greeting', |
be2fb01f | 259 | ]; |
6a488035 TO |
260 | $postalGreetings = CRM_Core_PseudoConstant::greeting($postalGreetingFilter); |
261 | $params['postal_greeting'] = $postalGreetings[$params['postal_greeting_id']]; | |
262 | } | |
263 | else { | |
264 | $params['postal_greeting'] = $values['postal_greeting']; | |
265 | } | |
266 | return TRUE; | |
267 | } | |
268 | ||
269 | if (isset($values['addressee'])) { | |
a7488080 | 270 | if (!empty($params['addressee_id'])) { |
be2fb01f | 271 | $addresseeFilter = [ |
6b409353 | 272 | 'contact_type' => $params['contact_type'] ?? NULL, |
6a488035 | 273 | 'greeting_type' => 'addressee', |
be2fb01f | 274 | ]; |
6a488035 TO |
275 | $addressee = CRM_Core_PseudoConstant::addressee($addresseeFilter); |
276 | $params['addressee'] = $addressee[$params['addressee_id']]; | |
277 | } | |
278 | else { | |
279 | $params['addressee'] = $values['addressee']; | |
280 | } | |
281 | return TRUE; | |
282 | } | |
283 | ||
284 | if (isset($values['gender'])) { | |
a7488080 | 285 | if (!empty($params['gender_id'])) { |
91bb24a7 | 286 | $genders = CRM_Core_PseudoConstant::get('CRM_Contact_DAO_Contact', 'gender_id'); |
6a488035 TO |
287 | $params['gender'] = $genders[$params['gender_id']]; |
288 | } | |
289 | else { | |
290 | $params['gender'] = $values['gender']; | |
291 | } | |
292 | return TRUE; | |
293 | } | |
294 | ||
df5ad245 | 295 | if (!empty($values['preferred_communication_method'])) { |
be2fb01f | 296 | $comm = []; |
91bb24a7 | 297 | $pcm = array_change_key_case(array_flip(CRM_Core_PseudoConstant::get('CRM_Contact_DAO_Contact', 'preferred_communication_method')), CASE_LOWER); |
6a488035 TO |
298 | |
299 | $preffComm = explode(',', $values['preferred_communication_method']); | |
300 | foreach ($preffComm as $v) { | |
301 | $v = strtolower(trim($v)); | |
302 | if (array_key_exists($v, $pcm)) { | |
303 | $comm[$pcm[$v]] = 1; | |
304 | } | |
305 | } | |
306 | ||
307 | $params['preferred_communication_method'] = $comm; | |
308 | return TRUE; | |
309 | } | |
310 | ||
50bfb460 | 311 | // format the website params. |
a7488080 | 312 | if (!empty($values['url'])) { |
6a488035 TO |
313 | static $websiteFields; |
314 | if (!is_array($websiteFields)) { | |
315 | require_once 'CRM/Core/DAO/Website.php'; | |
316 | $websiteFields = CRM_Core_DAO_Website::fields(); | |
317 | } | |
318 | if (!array_key_exists('website', $params) || | |
319 | !is_array($params['website']) | |
320 | ) { | |
be2fb01f | 321 | $params['website'] = []; |
6a488035 TO |
322 | } |
323 | ||
324 | $websiteCount = count($params['website']); | |
325 | _civicrm_api3_store_values($websiteFields, $values, | |
326 | $params['website'][++$websiteCount] | |
327 | ); | |
328 | ||
329 | return TRUE; | |
330 | } | |
331 | ||
332 | // get the formatted location blocks into params - w/ 3.0 format, CRM-4605 | |
a7488080 | 333 | if (!empty($values['location_type_id'])) { |
c193e786 | 334 | static $fields = NULL; |
335 | if ($fields == NULL) { | |
be2fb01f | 336 | $fields = []; |
c193e786 | 337 | } |
338 | ||
be2fb01f | 339 | foreach ([ |
6714d8d2 SL |
340 | 'Phone', |
341 | 'Email', | |
342 | 'IM', | |
343 | 'OpenID', | |
344 | 'Phone_Ext', | |
345 | ] as $block) { | |
c193e786 | 346 | $name = strtolower($block); |
347 | if (!array_key_exists($name, $values)) { | |
348 | continue; | |
349 | } | |
350 | ||
351 | if ($name == 'phone_ext') { | |
352 | $block = 'Phone'; | |
353 | } | |
354 | ||
355 | // block present in value array. | |
356 | if (!array_key_exists($name, $params) || !is_array($params[$name])) { | |
be2fb01f | 357 | $params[$name] = []; |
c193e786 | 358 | } |
359 | ||
360 | if (!array_key_exists($block, $fields)) { | |
361 | $className = "CRM_Core_DAO_$block"; | |
362 | $fields[$block] =& $className::fields(); | |
363 | } | |
364 | ||
365 | $blockCnt = count($params[$name]); | |
366 | ||
367 | // copy value to dao field name. | |
368 | if ($name == 'im') { | |
369 | $values['name'] = $values[$name]; | |
370 | } | |
371 | ||
372 | _civicrm_api3_store_values($fields[$block], $values, | |
373 | $params[$name][++$blockCnt] | |
374 | ); | |
375 | ||
376 | if (empty($params['id']) && ($blockCnt == 1)) { | |
377 | $params[$name][$blockCnt]['is_primary'] = TRUE; | |
378 | } | |
379 | ||
380 | // we only process single block at a time. | |
381 | return TRUE; | |
382 | } | |
383 | ||
384 | // handle address fields. | |
385 | if (!array_key_exists('address', $params) || !is_array($params['address'])) { | |
be2fb01f | 386 | $params['address'] = []; |
c193e786 | 387 | } |
388 | ||
389 | $addressCnt = 1; | |
390 | foreach ($params['address'] as $cnt => $addressBlock) { | |
391 | if (CRM_Utils_Array::value('location_type_id', $values) == | |
392 | CRM_Utils_Array::value('location_type_id', $addressBlock) | |
393 | ) { | |
394 | $addressCnt = $cnt; | |
395 | break; | |
396 | } | |
397 | $addressCnt++; | |
398 | } | |
399 | ||
400 | if (!array_key_exists('Address', $fields)) { | |
401 | $fields['Address'] = CRM_Core_DAO_Address::fields(); | |
402 | } | |
403 | ||
404 | // Note: we doing multiple value formatting here for address custom fields, plus putting into right format. | |
405 | // The actual formatting (like date, country ..etc) for address custom fields is taken care of while saving | |
406 | // the address in CRM_Core_BAO_Address::create method | |
407 | if (!empty($values['location_type_id'])) { | |
be2fb01f | 408 | static $customFields = []; |
c193e786 | 409 | if (empty($customFields)) { |
410 | $customFields = CRM_Core_BAO_CustomField::getFields('Address'); | |
411 | } | |
412 | // make a copy of values, as we going to make changes | |
413 | $newValues = $values; | |
414 | foreach ($values as $key => $val) { | |
415 | $customFieldID = CRM_Core_BAO_CustomField::getKeyID($key); | |
416 | if ($customFieldID && array_key_exists($customFieldID, $customFields)) { | |
417 | // mark an entry in fields array since we want the value of custom field to be copied | |
418 | $fields['Address'][$key] = NULL; | |
419 | ||
9c1bc317 | 420 | $htmlType = $customFields[$customFieldID]['html_type'] ?? NULL; |
511d0374 CW |
421 | if (CRM_Core_BAO_CustomField::isSerialized($customFields[$customFieldID]) && $val) { |
422 | $mulValues = explode(',', $val); | |
423 | $customOption = CRM_Core_BAO_CustomOption::getCustomOption($customFieldID, TRUE); | |
424 | $newValues[$key] = []; | |
425 | foreach ($mulValues as $v1) { | |
426 | foreach ($customOption as $v2) { | |
427 | if ((strtolower($v2['label']) == strtolower(trim($v1))) || | |
428 | (strtolower($v2['value']) == strtolower(trim($v1))) | |
429 | ) { | |
430 | if ($htmlType == 'CheckBox') { | |
431 | $newValues[$key][$v2['value']] = 1; | |
432 | } | |
433 | else { | |
434 | $newValues[$key][] = $v2['value']; | |
c193e786 | 435 | } |
436 | } | |
437 | } | |
511d0374 | 438 | } |
c193e786 | 439 | } |
440 | } | |
441 | } | |
442 | // consider new values | |
443 | $values = $newValues; | |
444 | } | |
445 | ||
446 | _civicrm_api3_store_values($fields['Address'], $values, $params['address'][$addressCnt]); | |
447 | ||
be2fb01f | 448 | $addressFields = [ |
c193e786 | 449 | 'county', |
450 | 'country', | |
451 | 'state_province', | |
452 | 'supplemental_address_1', | |
453 | 'supplemental_address_2', | |
454 | 'supplemental_address_3', | |
455 | 'StateProvince.name', | |
be2fb01f | 456 | ]; |
c193e786 | 457 | |
458 | foreach ($addressFields as $field) { | |
459 | if (array_key_exists($field, $values)) { | |
460 | if (!array_key_exists('address', $params)) { | |
be2fb01f | 461 | $params['address'] = []; |
c193e786 | 462 | } |
463 | $params['address'][$addressCnt][$field] = $values[$field]; | |
464 | } | |
465 | } | |
466 | ||
467 | if ($addressCnt == 1) { | |
468 | ||
469 | $params['address'][$addressCnt]['is_primary'] = TRUE; | |
470 | } | |
6a488035 TO |
471 | return TRUE; |
472 | } | |
473 | ||
474 | if (isset($values['note'])) { | |
50bfb460 | 475 | // add a note field |
6a488035 | 476 | if (!isset($params['note'])) { |
be2fb01f | 477 | $params['note'] = []; |
6a488035 TO |
478 | } |
479 | $noteBlock = count($params['note']) + 1; | |
480 | ||
be2fb01f | 481 | $params['note'][$noteBlock] = []; |
6a488035 TO |
482 | if (!isset($fields['Note'])) { |
483 | $fields['Note'] = CRM_Core_DAO_Note::fields(); | |
484 | } | |
485 | ||
486 | // get the current logged in civicrm user | |
487 | $session = CRM_Core_Session::singleton(); | |
488 | $userID = $session->get('userID'); | |
489 | ||
490 | if ($userID) { | |
491 | $values['contact_id'] = $userID; | |
492 | } | |
493 | ||
494 | _civicrm_api3_store_values($fields['Note'], $values, $params['note'][$noteBlock]); | |
495 | ||
496 | return TRUE; | |
497 | } | |
498 | ||
50bfb460 | 499 | // Check for custom field values |
6a488035 | 500 | |
a7488080 | 501 | if (empty($fields['custom'])) { |
6a488035 TO |
502 | $fields['custom'] = &CRM_Core_BAO_CustomField::getFields(CRM_Utils_Array::value('contact_type', $values), |
503 | FALSE, FALSE, NULL, NULL, FALSE, FALSE, FALSE | |
504 | ); | |
505 | } | |
506 | ||
507 | foreach ($values as $key => $value) { | |
508 | if ($customFieldID = CRM_Core_BAO_CustomField::getKeyID($key)) { | |
50bfb460 | 509 | // check if it's a valid custom field id |
6a488035 | 510 | |
6a488035 TO |
511 | if (!array_key_exists($customFieldID, $fields['custom'])) { |
512 | return civicrm_api3_create_error('Invalid custom field ID'); | |
513 | } | |
514 | else { | |
515 | $params[$key] = $value; | |
516 | } | |
517 | } | |
518 | } | |
519 | } | |
520 | ||
6a488035 TO |
521 | /** |
522 | * | |
72b3a70c | 523 | * @param array $params |
6a488035 | 524 | * |
a6c01b45 | 525 | * @return array |
353ffa53 | 526 | * <type> |
6a488035 TO |
527 | */ |
528 | function _civicrm_api3_deprecated_duplicate_formatted_contact($params) { | |
9c1bc317 CW |
529 | $id = $params['id'] ?? NULL; |
530 | $externalId = $params['external_identifier'] ?? NULL; | |
6a488035 TO |
531 | if ($id || $externalId) { |
532 | $contact = new CRM_Contact_DAO_Contact(); | |
533 | ||
534 | $contact->id = $id; | |
535 | $contact->external_identifier = $externalId; | |
536 | ||
537 | if ($contact->find(TRUE)) { | |
538 | if ($params['contact_type'] != $contact->contact_type) { | |
539 | return civicrm_api3_create_error("Mismatched contact IDs OR Mismatched contact Types"); | |
540 | } | |
541 | ||
542 | $error = CRM_Core_Error::createError("Found matching contacts: $contact->id", | |
543 | CRM_Core_Error::DUPLICATE_CONTACT, | |
544 | 'Fatal', $contact->id | |
545 | ); | |
546 | return civicrm_api3_create_error($error->pop()); | |
547 | } | |
548 | } | |
549 | else { | |
03b40a7b | 550 | $ids = CRM_Contact_BAO_Contact::getDuplicateContacts($params, $params['contact_type'], 'Unsupervised'); |
6a488035 TO |
551 | |
552 | if (!empty($ids)) { | |
553 | $ids = implode(',', $ids); | |
554 | $error = CRM_Core_Error::createError("Found matching contacts: $ids", | |
555 | CRM_Core_Error::DUPLICATE_CONTACT, | |
556 | 'Fatal', $ids | |
557 | ); | |
558 | return civicrm_api3_create_error($error->pop()); | |
559 | } | |
560 | } | |
561 | return civicrm_api3_create_success(TRUE); | |
562 | } | |
563 | ||
564 | /** | |
565 | * Validate a formatted contact parameter list. | |
566 | * | |
77855840 TO |
567 | * @param array $params |
568 | * Structured parameter list (as in crm_format_params). | |
6a488035 TO |
569 | * |
570 | * @return bool|CRM_Core_Error | |
6a488035 TO |
571 | */ |
572 | function _civicrm_api3_deprecated_validate_formatted_contact(&$params) { | |
50bfb460 | 573 | // Look for offending email addresses |
6a488035 | 574 | |
6a488035 TO |
575 | if (array_key_exists('email', $params)) { |
576 | foreach ($params['email'] as $count => $values) { | |
577 | if (!is_array($values)) { | |
578 | continue; | |
579 | } | |
580 | if ($email = CRM_Utils_Array::value('email', $values)) { | |
50bfb460 | 581 | // validate each email |
6a488035 TO |
582 | if (!CRM_Utils_Rule::email($email)) { |
583 | return civicrm_api3_create_error('No valid email address'); | |
584 | } | |
585 | ||
50bfb460 | 586 | // check for loc type id. |
a7488080 | 587 | if (empty($values['location_type_id'])) { |
6a488035 TO |
588 | return civicrm_api3_create_error('Location Type Id missing.'); |
589 | } | |
590 | } | |
591 | } | |
592 | } | |
593 | ||
50bfb460 | 594 | // Validate custom data fields |
6a488035 TO |
595 | if (array_key_exists('custom', $params) && is_array($params['custom'])) { |
596 | foreach ($params['custom'] as $key => $custom) { | |
597 | if (is_array($custom)) { | |
598 | foreach ($custom as $fieldId => $value) { | |
599 | $valid = CRM_Core_BAO_CustomValue::typecheck(CRM_Utils_Array::value('type', $value), | |
600 | CRM_Utils_Array::value('value', $value) | |
601 | ); | |
70dd449f | 602 | if (!$valid && $value['is_required']) { |
6a488035 TO |
603 | return civicrm_api3_create_error('Invalid value for custom field \'' . |
604 | CRM_Utils_Array::value('name', $custom) . '\'' | |
605 | ); | |
606 | } | |
607 | if (CRM_Utils_Array::value('type', $custom) == 'Date') { | |
608 | $params['custom'][$key][$fieldId]['value'] = str_replace('-', '', $params['custom'][$key][$fieldId]['value']); | |
609 | } | |
610 | } | |
611 | } | |
612 | } | |
613 | } | |
614 | ||
615 | return civicrm_api3_create_success(TRUE); | |
616 | } | |
617 | ||
6a488035 TO |
618 | /** |
619 | * @deprecated - this is part of the import parser not the API & needs to be moved on out | |
620 | * | |
c490a46a | 621 | * @param array $params |
f4aaa82a | 622 | * @param $onDuplicate |
6a488035 | 623 | * |
72b3a70c CW |
624 | * @return array|bool |
625 | * <type> | |
6a488035 TO |
626 | */ |
627 | function _civicrm_api3_deprecated_create_participant_formatted($params, $onDuplicate) { | |
628 | require_once 'CRM/Event/Import/Parser.php'; | |
a05662ef | 629 | if ($onDuplicate != CRM_Import_Parser::DUPLICATE_NOCHECK) { |
6a488035 TO |
630 | CRM_Core_Error::reset(); |
631 | $error = _civicrm_api3_deprecated_participant_check_params($params, TRUE); | |
632 | if (civicrm_error($error)) { | |
633 | return $error; | |
634 | } | |
635 | } | |
636 | require_once "api/v3/Participant.php"; | |
637 | return civicrm_api3_participant_create($params); | |
638 | } | |
639 | ||
640 | /** | |
641 | * | |
72b3a70c | 642 | * @param array $params |
6a488035 | 643 | * |
f4aaa82a EM |
644 | * @param bool $checkDuplicate |
645 | * | |
72b3a70c CW |
646 | * @return array|bool |
647 | * <type> | |
6a488035 TO |
648 | */ |
649 | function _civicrm_api3_deprecated_participant_check_params($params, $checkDuplicate = FALSE) { | |
650 | ||
50bfb460 | 651 | // check if participant id is valid or not |
a7488080 | 652 | if (!empty($params['id'])) { |
6a488035 TO |
653 | $participant = new CRM_Event_BAO_Participant(); |
654 | $participant->id = $params['id']; | |
655 | if (!$participant->find(TRUE)) { | |
656 | return civicrm_api3_create_error(ts('Participant id is not valid')); | |
657 | } | |
658 | } | |
659 | require_once 'CRM/Contact/BAO/Contact.php'; | |
50bfb460 | 660 | // check if contact id is valid or not |
a7488080 | 661 | if (!empty($params['contact_id'])) { |
6a488035 TO |
662 | $contact = new CRM_Contact_BAO_Contact(); |
663 | $contact->id = $params['contact_id']; | |
664 | if (!$contact->find(TRUE)) { | |
665 | return civicrm_api3_create_error(ts('Contact id is not valid')); | |
666 | } | |
667 | } | |
668 | ||
50bfb460 | 669 | // check that event id is not an template |
a7488080 | 670 | if (!empty($params['event_id'])) { |
6a488035 TO |
671 | $isTemplate = CRM_Core_DAO::getFieldValue('CRM_Event_DAO_Event', $params['event_id'], 'is_template'); |
672 | if (!empty($isTemplate)) { | |
3770b22a | 673 | return civicrm_api3_create_error(ts('Event templates are not meant to be registered.')); |
6a488035 TO |
674 | } |
675 | } | |
676 | ||
be2fb01f | 677 | $result = []; |
6a488035 TO |
678 | if ($checkDuplicate) { |
679 | if (CRM_Event_BAO_Participant::checkDuplicate($params, $result)) { | |
680 | $participantID = array_pop($result); | |
681 | ||
682 | $error = CRM_Core_Error::createError("Found matching participant record.", | |
683 | CRM_Core_Error::DUPLICATE_PARTICIPANT, | |
684 | 'Fatal', $participantID | |
685 | ); | |
686 | ||
687 | return civicrm_api3_create_error($error->pop(), | |
be2fb01f | 688 | [ |
6a488035 TO |
689 | 'contactID' => $params['contact_id'], |
690 | 'participantID' => $participantID, | |
be2fb01f | 691 | ] |
6a488035 TO |
692 | ); |
693 | } | |
694 | } | |
695 | return TRUE; | |
696 | } | |
697 | ||
5bc392e6 | 698 | /** |
c490a46a | 699 | * @param array $params |
5bc392e6 | 700 | * @param bool $dupeCheck |
100fef9d | 701 | * @param int $dedupeRuleGroupID |
5bc392e6 EM |
702 | * |
703 | * @return array|null | |
704 | */ | |
109ff2ac DL |
705 | function _civicrm_api3_deprecated_contact_check_params( |
706 | &$params, | |
707 | $dupeCheck = TRUE, | |
109ff2ac | 708 | $dedupeRuleGroupID = NULL) { |
ffec8e23 | 709 | |
710 | $requiredCheck = TRUE; | |
711 | ||
6a488035 TO |
712 | if (isset($params['id']) && is_numeric($params['id'])) { |
713 | $requiredCheck = FALSE; | |
714 | } | |
715 | if ($requiredCheck) { | |
716 | if (isset($params['id'])) { | |
be2fb01f | 717 | $required = ['Individual', 'Household', 'Organization']; |
6a488035 | 718 | } |
be2fb01f CW |
719 | $required = [ |
720 | 'Individual' => [ | |
721 | ['first_name', 'last_name'], | |
6a488035 | 722 | 'email', |
be2fb01f CW |
723 | ], |
724 | 'Household' => [ | |
6a488035 | 725 | 'household_name', |
be2fb01f CW |
726 | ], |
727 | 'Organization' => [ | |
6a488035 | 728 | 'organization_name', |
be2fb01f CW |
729 | ], |
730 | ]; | |
6a488035 | 731 | |
6a488035 | 732 | // contact_type has a limited number of valid values |
22e263ad | 733 | if (empty($params['contact_type'])) { |
81fc1677 E |
734 | return civicrm_api3_create_error("No Contact Type"); |
735 | } | |
9c1bc317 | 736 | $fields = $required[$params['contact_type']] ?? NULL; |
6a488035 TO |
737 | if ($fields == NULL) { |
738 | return civicrm_api3_create_error("Invalid Contact Type: {$params['contact_type']}"); | |
739 | } | |
740 | ||
741 | if ($csType = CRM_Utils_Array::value('contact_sub_type', $params)) { | |
742 | if (!(CRM_Contact_BAO_ContactType::isExtendsContactType($csType, $params['contact_type']))) { | |
e7292422 | 743 | return civicrm_api3_create_error("Invalid or Mismatched Contact Subtype: " . implode(', ', (array) $csType)); |
6a488035 TO |
744 | } |
745 | } | |
746 | ||
8cc574cf | 747 | if (empty($params['contact_id']) && !empty($params['id'])) { |
6a488035 TO |
748 | $valid = FALSE; |
749 | $error = ''; | |
750 | foreach ($fields as $field) { | |
751 | if (is_array($field)) { | |
752 | $valid = TRUE; | |
753 | foreach ($field as $element) { | |
a7488080 | 754 | if (empty($params[$element])) { |
6a488035 TO |
755 | $valid = FALSE; |
756 | $error .= $element; | |
757 | break; | |
758 | } | |
759 | } | |
760 | } | |
761 | else { | |
a7488080 | 762 | if (!empty($params[$field])) { |
6a488035 TO |
763 | $valid = TRUE; |
764 | } | |
765 | } | |
766 | if ($valid) { | |
767 | break; | |
768 | } | |
769 | } | |
770 | ||
771 | if (!$valid) { | |
772 | return civicrm_api3_create_error("Required fields not found for {$params['contact_type']} : $error"); | |
773 | } | |
774 | } | |
775 | } | |
776 | ||
777 | if ($dupeCheck) { | |
03b40a7b | 778 | // @todo switch to using api version |
eb5f7260 | 779 | // $dupes = civicrm_api3('Contact', 'duplicatecheck', (array('match' => $params, 'dedupe_rule_id' => $dedupeRuleGroupID))); |
780 | // $ids = $dupes['count'] ? implode(',', array_keys($dupes['values'])) : NULL; | |
be2fb01f | 781 | $ids = CRM_Contact_BAO_Contact::getDuplicateContacts($params, $params['contact_type'], 'Unsupervised', [], CRM_Utils_Array::value('check_permissions', $params), $dedupeRuleGroupID); |
6a488035 | 782 | if ($ids != NULL) { |
ffec8e23 | 783 | $error = CRM_Core_Error::createError("Found matching contacts: " . implode(',', $ids), |
784 | CRM_Core_Error::DUPLICATE_CONTACT, | |
785 | 'Fatal', $ids | |
786 | ); | |
787 | return civicrm_api3_create_error($error->pop()); | |
6a488035 TO |
788 | } |
789 | } | |
790 | ||
50bfb460 | 791 | // check for organisations with same name |
a7488080 | 792 | if (!empty($params['current_employer'])) { |
be2fb01f CW |
793 | $organizationParams = ['organization_name' => $params['current_employer']]; |
794 | $dupeIds = CRM_Contact_BAO_Contact::getDuplicateContacts($organizationParams, 'Organization', 'Supervised', [], FALSE); | |
6a488035 TO |
795 | |
796 | // check for mismatch employer name and id | |
a7488080 | 797 | if (!empty($params['employer_id']) && !in_array($params['employer_id'], $dupeIds) |
6a488035 TO |
798 | ) { |
799 | return civicrm_api3_create_error('Employer name and Employer id Mismatch'); | |
800 | } | |
801 | ||
802 | // show error if multiple organisation with same name exist | |
a7488080 | 803 | if (empty($params['employer_id']) && (count($dupeIds) > 1) |
6a488035 TO |
804 | ) { |
805 | return civicrm_api3_create_error('Found more than one Organisation with same Name.'); | |
806 | } | |
807 | } | |
808 | ||
809 | return NULL; | |
810 | } | |
811 | ||
109ff2ac | 812 | /** |
f4aaa82a | 813 | * @param $result |
100fef9d | 814 | * @param int $activityTypeID |
f4aaa82a | 815 | * |
a6c01b45 | 816 | * @return array |
353ffa53 | 817 | * <type> $params |
109ff2ac DL |
818 | */ |
819 | function _civicrm_api3_deprecated_activity_buildmailparams($result, $activityTypeID) { | |
820 | // get ready for collecting data about activity to be created | |
be2fb01f | 821 | $params = []; |
109ff2ac DL |
822 | |
823 | $params['activity_type_id'] = $activityTypeID; | |
824 | ||
040073c9 | 825 | $params['status_id'] = 'Completed'; |
3ba820ea CB |
826 | if (!empty($result['from']['id'])) { |
827 | $params['source_contact_id'] = $params['assignee_contact_id'] = $result['from']['id']; | |
828 | } | |
be2fb01f CW |
829 | $params['target_contact_id'] = []; |
830 | $keys = ['to', 'cc', 'bcc']; | |
109ff2ac DL |
831 | foreach ($keys as $key) { |
832 | if (is_array($result[$key])) { | |
833 | foreach ($result[$key] as $key => $keyValue) { | |
834 | if (!empty($keyValue['id'])) { | |
835 | $params['target_contact_id'][] = $keyValue['id']; | |
836 | } | |
837 | } | |
838 | } | |
839 | } | |
840 | $params['subject'] = $result['subject']; | |
841 | $params['activity_date_time'] = $result['date']; | |
842 | $params['details'] = $result['body']; | |
843 | ||
8913e915 D |
844 | $numAttachments = Civi::settings()->get('max_attachments_backend') ?? CRM_Core_BAO_File::DEFAULT_MAX_ATTACHMENTS_BACKEND; |
845 | for ($i = 1; $i <= $numAttachments; $i++) { | |
109ff2ac DL |
846 | if (isset($result["attachFile_$i"])) { |
847 | $params["attachFile_$i"] = $result["attachFile_$i"]; | |
848 | } | |
d97af030 D |
849 | else { |
850 | // No point looping 100 times if there's only one attachment | |
851 | break; | |
852 | } | |
109ff2ac DL |
853 | } |
854 | ||
855 | return $params; | |
856 | } |