Commit | Line | Data |
---|---|---|
6a488035 TO |
1 | <?php |
2 | /* | |
3 | +--------------------------------------------------------------------+ | |
bc77d7c0 | 4 | | Copyright CiviCRM LLC. All rights reserved. | |
6a488035 | 5 | | | |
bc77d7c0 TO |
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 | | |
6a488035 | 9 | +--------------------------------------------------------------------+ |
d25dd0ee | 10 | */ |
6a488035 TO |
11 | |
12 | /** | |
13 | * | |
14 | * @package CRM | |
ca5cec67 | 15 | * @copyright CiviCRM LLC https://civicrm.org/licensing |
6a488035 TO |
16 | */ |
17 | ||
18 | /** | |
67d19299 | 19 | * Class contains functions for individual contact type. |
6a488035 TO |
20 | */ |
21 | class CRM_Contact_BAO_Individual extends CRM_Contact_DAO_Contact { | |
22 | ||
23 | /** | |
67d19299 | 24 | * Class constructor. |
6a488035 | 25 | */ |
6ea503d4 TO |
26 | public function __construct() { |
27 | } | |
6a488035 TO |
28 | |
29 | /** | |
fe482240 | 30 | * Function is used to format the individual contact values. |
6a488035 | 31 | * |
77c5b619 TO |
32 | * @param array $params |
33 | * (reference ) an assoc array of name/value pairs. | |
f6b81482 | 34 | * @param CRM_Contact_BAO_Contact $contact |
77c5b619 | 35 | * Contact object. |
6a488035 | 36 | * |
16b10e64 | 37 | * @return CRM_Contact_BAO_Contact |
6a488035 | 38 | */ |
00be9182 | 39 | public static function format(&$params, &$contact) { |
6a488035 | 40 | if (!self::dataExists($params)) { |
5396af74 | 41 | return NULL; |
6a488035 TO |
42 | } |
43 | ||
44 | // "null" value for example is passed by dedupe merge in order to empty. | |
45 | // Display name computation shouldn't consider such values. | |
be2fb01f | 46 | foreach (['first_name', 'middle_name', 'last_name', 'nick_name', 'formal_title', 'birth_date', 'deceased_date'] as $displayField) { |
6a488035 TO |
47 | if (CRM_Utils_Array::value($displayField, $params) == "null") { |
48 | $params[$displayField] = ''; | |
49 | } | |
50 | } | |
51 | ||
353ffa53 | 52 | $sortName = $displayName = ''; |
dcb14808 | 53 | $firstName = trim($params['first_name'] ?? ''); |
54 | $middleName = trim($params['middle_name'] ?? ''); | |
55 | $lastName = trim($params['last_name'] ?? ''); | |
353ffa53 TO |
56 | $nickName = CRM_Utils_Array::value('nick_name', $params, ''); |
57 | $prefix_id = CRM_Utils_Array::value('prefix_id', $params, ''); | |
58 | $suffix_id = CRM_Utils_Array::value('suffix_id', $params, ''); | |
e171748b | 59 | $formalTitle = CRM_Utils_Array::value('formal_title', $params, ''); |
6a488035 TO |
60 | |
61 | // get prefix and suffix names | |
6a488035 TO |
62 | $prefix = $suffix = NULL; |
63 | if ($prefix_id) { | |
874347bd | 64 | $params['individual_prefix'] = $prefix = CRM_Core_PseudoConstant::getLabel('CRM_Contact_DAO_Contact', 'prefix_id', $prefix_id); |
6a488035 TO |
65 | } |
66 | if ($suffix_id) { | |
874347bd | 67 | $params['individual_suffix'] = $suffix = CRM_Core_PseudoConstant::getLabel('CRM_Contact_DAO_Contact', 'suffix_id', $suffix_id); |
6a488035 TO |
68 | } |
69 | ||
70 | $params['is_deceased'] = CRM_Utils_Array::value('is_deceased', $params, FALSE); | |
71 | ||
72 | $individual = NULL; | |
73 | if ($contact->id) { | |
74 | $individual = new CRM_Contact_BAO_Contact(); | |
75 | $individual->id = $contact->id; | |
76 | if ($individual->find(TRUE)) { | |
77 | ||
78 | //lets allow to update single name field though preserveDBName | |
79 | //but if db having null value and params contain value, CRM-4330. | |
be2fb01f | 80 | $useDBNames = []; |
6a488035 | 81 | |
be2fb01f | 82 | foreach (['last', 'middle', 'first', 'nick'] as $name) { |
6a488035 TO |
83 | $dbName = "{$name}_name"; |
84 | $value = $individual->$dbName; | |
85 | ||
86 | // the db has name values | |
8cc574cf | 87 | if ($value && !empty($params['preserveDBName'])) { |
6a488035 TO |
88 | $useDBNames[] = $name; |
89 | } | |
90 | } | |
91 | ||
be2fb01f | 92 | foreach (['prefix', 'suffix'] as $name) { |
6a488035 TO |
93 | $dbName = "{$name}_id"; |
94 | $value = $individual->$dbName; | |
8cc574cf | 95 | if ($value && !empty($params['preserveDBName'])) { |
6a488035 TO |
96 | $useDBNames[] = $name; |
97 | } | |
98 | } | |
99 | ||
8cc574cf | 100 | if ($individual->formal_title && !empty($params['preserveDBName'])) { |
e171748b OB |
101 | $useDBNames[] = 'formal_title'; |
102 | } | |
103 | ||
6a488035 TO |
104 | // CRM-4430 |
105 | //1. preserve db name if want | |
106 | //2. lets get value from param if exists. | |
107 | //3. if not in params, lets get from db. | |
108 | ||
be2fb01f | 109 | foreach (['last', 'middle', 'first', 'nick'] as $name) { |
6a488035 | 110 | $phpName = "{$name}Name"; |
353ffa53 TO |
111 | $dbName = "{$name}_name"; |
112 | $value = $individual->$dbName; | |
6a488035 | 113 | if (in_array($name, $useDBNames)) { |
353ffa53 | 114 | $params[$dbName] = $value; |
6a488035 | 115 | $contact->$dbName = $value; |
353ffa53 | 116 | $$phpName = $value; |
6a488035 TO |
117 | } |
118 | elseif (array_key_exists($dbName, $params)) { | |
119 | $$phpName = $params[$dbName]; | |
120 | } | |
121 | elseif ($value) { | |
122 | $$phpName = $value; | |
123 | } | |
124 | } | |
125 | ||
be2fb01f | 126 | foreach (['prefix', 'suffix'] as $name) { |
353ffa53 | 127 | $dbName = "{$name}_id"; |
6a488035 TO |
128 | |
129 | $value = $individual->$dbName; | |
130 | if (in_array($name, $useDBNames)) { | |
131 | $params[$dbName] = $value; | |
132 | $contact->$dbName = $value; | |
133 | if ($value) { | |
ec5cc0a3 | 134 | $$name = CRM_Core_PseudoConstant::getLabel('CRM_Contact_DAO_Contact', $dbName, $value); |
6a488035 TO |
135 | } |
136 | else { | |
309a09df | 137 | $$name = NULL; |
6a488035 TO |
138 | } |
139 | } | |
140 | elseif (array_key_exists($dbName, $params)) { | |
6a488035 TO |
141 | // CRM-5278 |
142 | if (!empty($params[$dbName])) { | |
309a09df | 143 | $$name = CRM_Core_PseudoConstant::getLabel('CRM_Contact_DAO_Contact', $dbName, $params[$dbName]); |
6a488035 TO |
144 | } |
145 | } | |
146 | elseif ($value) { | |
ec5cc0a3 | 147 | $$name = CRM_Core_PseudoConstant::getLabel('CRM_Contact_DAO_Contact', $dbName, $value); |
6a488035 TO |
148 | } |
149 | } | |
e171748b OB |
150 | |
151 | if (in_array('formal_title', $useDBNames)) { | |
152 | $params['formal_title'] = $individual->formal_title; | |
353ffa53 TO |
153 | $contact->formal_title = $individual->formal_title; |
154 | $formalTitle = $individual->formal_title; | |
e171748b OB |
155 | } |
156 | elseif (array_key_exists('formal_title', $params)) { | |
157 | $formalTitle = $params['formal_title']; | |
158 | } | |
159 | elseif ($individual->formal_title) { | |
160 | $formalTitle = $individual->formal_title; | |
161 | } | |
6a488035 TO |
162 | } |
163 | } | |
164 | ||
6a488035 TO |
165 | if ($lastName || $firstName || $middleName) { |
166 | // make sure we have values for all the name fields. | |
167 | $formatted = $params; | |
be2fb01f | 168 | $nameParams = [ |
6a488035 TO |
169 | 'first_name' => $firstName, |
170 | 'middle_name' => $middleName, | |
171 | 'last_name' => $lastName, | |
172 | 'nick_name' => $nickName, | |
173 | 'individual_suffix' => $suffix, | |
174 | 'individual_prefix' => $prefix, | |
175 | 'prefix_id' => $prefix_id, | |
176 | 'suffix_id' => $suffix_id, | |
e171748b | 177 | 'formal_title' => $formalTitle, |
be2fb01f | 178 | ]; |
6a488035 TO |
179 | // make sure we have all the name fields. |
180 | foreach ($nameParams as $name => $value) { | |
a7488080 | 181 | if (empty($formatted[$name]) && $value) { |
6a488035 TO |
182 | $formatted[$name] = $value; |
183 | } | |
184 | } | |
185 | ||
be2fb01f | 186 | $tokens = []; |
6a488035 | 187 | CRM_Utils_Hook::tokens($tokens); |
be2fb01f | 188 | $tokenFields = []; |
874347bd | 189 | foreach ($tokens as $catTokens) { |
6a488035 TO |
190 | foreach ($catTokens as $token => $label) { |
191 | $tokenFields[] = $token; | |
192 | } | |
193 | } | |
194 | ||
195 | //build the sort name. | |
aaffa79f | 196 | $format = Civi::settings()->get('sort_name_format'); |
6a488035 | 197 | $sortName = CRM_Utils_Address::format($formatted, $format, |
4c49535e | 198 | FALSE, FALSE, $tokenFields |
6a488035 TO |
199 | ); |
200 | $sortName = trim($sortName); | |
201 | ||
202 | //build the display name. | |
aaffa79f | 203 | $format = Civi::settings()->get('display_name_format'); |
6a488035 | 204 | $displayName = CRM_Utils_Address::format($formatted, $format, |
4c49535e | 205 | FALSE, FALSE, $tokenFields |
6a488035 TO |
206 | ); |
207 | $displayName = trim($displayName); | |
208 | } | |
209 | ||
210 | //start further check for email. | |
211 | if (empty($sortName) || empty($displayName)) { | |
212 | $email = NULL; | |
a7488080 | 213 | if (!empty($params['email']) && |
6a488035 TO |
214 | is_array($params['email']) |
215 | ) { | |
216 | foreach ($params['email'] as $emailBlock) { | |
217 | if (isset($emailBlock['is_primary'])) { | |
218 | $email = $emailBlock['email']; | |
219 | break; | |
220 | } | |
221 | } | |
222 | } | |
9c1bc317 | 223 | $uniqId = $params['user_unique_id'] ?? NULL; |
6a488035 TO |
224 | if (!$email && $contact->id) { |
225 | $email = CRM_Contact_BAO_Contact::getPrimaryEmail($contact->id); | |
226 | } | |
227 | } | |
228 | ||
229 | //now set the names. | |
be2fb01f | 230 | $names = ['displayName' => 'display_name', 'sortName' => 'sort_name']; |
6a488035 TO |
231 | foreach ($names as $value => $name) { |
232 | if (empty($$value)) { | |
233 | if ($email) { | |
234 | $$value = $email; | |
235 | } | |
236 | elseif ($uniqId) { | |
237 | $$value = $uniqId; | |
238 | } | |
c10e7177 | 239 | elseif (!empty($params[$name])) { |
240 | $$value = $params[$name]; | |
241 | } | |
242 | // If we have nothing else going on set sort_name to display_name. | |
243 | elseif ($displayName) { | |
244 | $$value = $displayName; | |
245 | } | |
6a488035 TO |
246 | } |
247 | //finally if we could not pass anything lets keep db. | |
248 | if (!empty($$value)) { | |
249 | $contact->$name = $$value; | |
250 | } | |
251 | } | |
252 | ||
253 | $format = CRM_Utils_Date::getDateFormat('birth'); | |
254 | if ($date = CRM_Utils_Array::value('birth_date', $params)) { | |
be2fb01f | 255 | if (in_array($format, [ |
353ffa53 | 256 | 'dd-mm', |
5396af74 | 257 | 'mm/dd', |
be2fb01f | 258 | ])) { |
6a488035 TO |
259 | $separator = '/'; |
260 | if ($format == 'dd-mm') { | |
261 | $separator = '-'; | |
262 | } | |
263 | $date = $date . $separator . '1902'; | |
264 | } | |
be2fb01f | 265 | elseif (in_array($format, [ |
5396af74 | 266 | 'yy-mm', |
be2fb01f | 267 | ])) { |
6a488035 TO |
268 | $date = $date . '-01'; |
269 | } | |
be2fb01f | 270 | elseif (in_array($format, [ |
5396af74 | 271 | 'M yy', |
be2fb01f | 272 | ])) { |
6a488035 TO |
273 | $date = $date . '-01'; |
274 | } | |
be2fb01f | 275 | elseif (in_array($format, [ |
5396af74 | 276 | 'yy', |
be2fb01f | 277 | ])) { |
6a488035 TO |
278 | $date = $date . '-01-01'; |
279 | } | |
280 | $contact->birth_date = CRM_Utils_Date::processDate($date); | |
281 | } | |
282 | elseif ($contact->birth_date) { | |
283 | $contact->birth_date = CRM_Utils_Date::isoToMysql($contact->birth_date); | |
284 | } | |
285 | ||
286 | if ($date = CRM_Utils_Array::value('deceased_date', $params)) { | |
be2fb01f | 287 | if (in_array($format, [ |
353ffa53 | 288 | 'dd-mm', |
5396af74 | 289 | 'mm/dd', |
be2fb01f | 290 | ])) { |
6a488035 TO |
291 | $separator = '/'; |
292 | if ($format == 'dd-mm') { | |
293 | $separator = '-'; | |
294 | } | |
295 | $date = $date . $separator . '1902'; | |
296 | } | |
be2fb01f | 297 | elseif (in_array($format, [ |
5396af74 | 298 | 'yy-mm', |
be2fb01f | 299 | ])) { |
6a488035 TO |
300 | $date = $date . '-01'; |
301 | } | |
be2fb01f | 302 | elseif (in_array($format, [ |
5396af74 | 303 | 'M yy', |
be2fb01f | 304 | ])) { |
6a488035 TO |
305 | $date = $date . '-01'; |
306 | } | |
be2fb01f | 307 | elseif (in_array($format, [ |
5396af74 | 308 | 'yy', |
be2fb01f | 309 | ])) { |
6a488035 TO |
310 | $date = $date . '-01-01'; |
311 | } | |
312 | ||
313 | $contact->deceased_date = CRM_Utils_Date::processDate($date); | |
314 | } | |
315 | elseif ($contact->deceased_date) { | |
316 | $contact->deceased_date = CRM_Utils_Date::isoToMysql($contact->deceased_date); | |
317 | } | |
318 | ||
319 | if ($middle_name = CRM_Utils_Array::value('middle_name', $params)) { | |
320 | $contact->middle_name = $middle_name; | |
321 | } | |
322 | ||
323 | return $contact; | |
324 | } | |
325 | ||
326 | /** | |
67d19299 | 327 | * Regenerates display_name for contacts with given prefixes/suffixes. |
6a488035 | 328 | * |
77c5b619 TO |
329 | * @param array $ids |
330 | * The array with the prefix/suffix id governing which contacts to regenerate. | |
331 | * @param int $action | |
332 | * The action describing whether prefix/suffix was UPDATED or DELETED. | |
6a488035 | 333 | */ |
00be9182 | 334 | public static function updateDisplayNames(&$ids, $action) { |
6a488035 TO |
335 | // get the proper field name (prefix_id or suffix_id) and its value |
336 | $fieldName = ''; | |
337 | foreach ($ids as $key => $value) { | |
338 | switch ($key) { | |
339 | case 'individualPrefix': | |
340 | $fieldName = 'prefix_id'; | |
341 | $fieldValue = $value; | |
342 | break 2; | |
343 | ||
344 | case 'individualSuffix': | |
345 | $fieldName = 'suffix_id'; | |
346 | $fieldValue = $value; | |
347 | break 2; | |
348 | } | |
349 | } | |
350 | if ($fieldName == '') { | |
351 | return; | |
352 | } | |
353 | ||
354 | // query for the affected individuals | |
353ffa53 TO |
355 | $fieldValue = CRM_Utils_Type::escape($fieldValue, 'Integer'); |
356 | $contact = new CRM_Contact_BAO_Contact(); | |
6a488035 TO |
357 | $contact->$fieldName = $fieldValue; |
358 | $contact->find(); | |
359 | ||
360 | // iterate through the affected individuals and rebuild their display_names | |
361 | while ($contact->fetch()) { | |
362 | $contact = new CRM_Contact_BAO_Contact(); | |
363 | $contact->id = $contact->contact_id; | |
364 | if ($action == CRM_Core_Action::DELETE) { | |
365 | $contact->$fieldName = 'NULL'; | |
366 | $contact->save(); | |
367 | } | |
368 | $contact->display_name = $contact->displayName(); | |
369 | $contact->save(); | |
370 | } | |
371 | } | |
372 | ||
373 | /** | |
fe482240 | 374 | * Creates display name. |
6a488035 | 375 | * |
a6c01b45 CW |
376 | * @return string |
377 | * the constructed display name | |
6a488035 | 378 | */ |
00be9182 | 379 | public function displayName() { |
e6c4755b CW |
380 | $prefix = CRM_Core_PseudoConstant::get('CRM_Contact_DAO_Contact', 'prefix_id'); |
381 | $suffix = CRM_Core_PseudoConstant::get('CRM_Contact_DAO_Contact', 'suffix_id'); | |
6a488035 TO |
382 | return str_replace(' ', ' ', trim($prefix[$this->prefix_id] . ' ' . $this->first_name . ' ' . $this->middle_name . ' ' . $this->last_name . ' ' . $suffix[$this->suffix_id])); |
383 | } | |
384 | ||
385 | /** | |
fe482240 | 386 | * Check if there is data to create the object. |
6a488035 | 387 | * |
77c5b619 | 388 | * @param array $params |
6a488035 | 389 | * |
5396af74 | 390 | * @return bool |
6a488035 | 391 | */ |
c10e7177 | 392 | public static function dataExists($params) { |
6a488035 TO |
393 | if ($params['contact_type'] == 'Individual') { |
394 | return TRUE; | |
395 | } | |
396 | ||
397 | return FALSE; | |
398 | } | |
96025800 | 399 | |
6a488035 | 400 | } |