Merge pull request #5046 from totten/master-resolver
[civicrm-core.git] / CRM / Case / XMLProcessor / Process.php
CommitLineData
6a488035
TO
1<?php
2/*
3 +--------------------------------------------------------------------+
39de6fd5 4 | CiviCRM version 4.6 |
6a488035 5 +--------------------------------------------------------------------+
06b69b18 6 | Copyright CiviCRM LLC (c) 2004-2014 |
6a488035
TO
7 +--------------------------------------------------------------------+
8 | This file is a part of CiviCRM. |
9 | |
10 | CiviCRM is free software; you can copy, modify, and distribute it |
11 | under the terms of the GNU Affero General Public License |
12 | Version 3, 19 November 2007 and the CiviCRM Licensing Exception. |
13 | |
14 | CiviCRM is distributed in the hope that it will be useful, but |
15 | WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
17 | See the GNU Affero General Public License for more details. |
18 | |
19 | You should have received a copy of the GNU Affero General Public |
20 | License and the CiviCRM Licensing Exception along |
21 | with this program; if not, contact CiviCRM LLC |
22 | at info[AT]civicrm[DOT]org. If you have questions about the |
23 | GNU Affero General Public License or the licensing of CiviCRM, |
24 | see the CiviCRM license FAQ at http://civicrm.org/licensing |
25 +--------------------------------------------------------------------+
d25dd0ee 26 */
6a488035
TO
27
28/**
29 *
30 * @package CRM
06b69b18 31 * @copyright CiviCRM LLC (c) 2004-2014
6a488035
TO
32 * $Id$
33 *
34 */
35class CRM_Case_XMLProcessor_Process extends CRM_Case_XMLProcessor {
4c6ce474
EM
36 /**
37 * @param $caseType
c490a46a 38 * @param array $params
4c6ce474 39 *
cde2037d 40 * @return bool
4c6ce474
EM
41 * @throws Exception
42 */
00be9182 43 public function run($caseType, &$params) {
6a488035
TO
44 $xml = $this->retrieve($caseType);
45
46 if ($xml === FALSE) {
47 $docLink = CRM_Utils_System::docURL2("user/case-management/setup");
48 CRM_Core_Error::fatal(ts("Configuration file could not be retrieved for case type = '%1' %2.",
353ffa53
TO
49 array(1 => $caseType, 2 => $docLink)
50 ));
6a488035
TO
51 return FALSE;
52 }
53
54 $xmlProcessorProcess = new CRM_Case_XMLProcessor_Process();
55 $this->_isMultiClient = $xmlProcessorProcess->getAllowMultipleCaseClients();
56
57 $this->process($xml, $params);
58 }
59
4c6ce474
EM
60 /**
61 * @param $caseType
62 * @param $fieldSet
63 * @param bool $isLabel
64 * @param bool $maskAction
65 *
66 * @return array|bool|mixed
67 * @throws Exception
68 */
00be9182 69 public function get($caseType, $fieldSet, $isLabel = FALSE, $maskAction = FALSE) {
6a488035
TO
70 $xml = $this->retrieve($caseType);
71 if ($xml === FALSE) {
72 $docLink = CRM_Utils_System::docURL2("user/case-management/setup");
73 CRM_Core_Error::fatal(ts("Unable to load configuration file for the referenced case type: '%1' %2.",
353ffa53
TO
74 array(1 => $caseType, 2 => $docLink)
75 ));
6a488035
TO
76 return FALSE;
77 }
78
79 switch ($fieldSet) {
80 case 'CaseRoles':
81 return $this->caseRoles($xml->CaseRoles);
82
83 case 'ActivitySets':
84 return $this->activitySets($xml->ActivitySets);
85
86 case 'ActivityTypes':
87 return $this->activityTypes($xml->ActivityTypes, FALSE, $isLabel, $maskAction);
88 }
89 }
90
4c6ce474
EM
91 /**
92 * @param $xml
c490a46a 93 * @param array $params
4c6ce474
EM
94 *
95 * @throws Exception
96 */
00be9182 97 public function process($xml, &$params) {
6a488035 98 $standardTimeline = CRM_Utils_Array::value('standardTimeline', $params);
353ffa53 99 $activitySetName = CRM_Utils_Array::value('activitySetName', $params);
6a488035
TO
100 $activityTypeName = CRM_Utils_Array::value('activityTypeName', $params);
101
102 if ('Open Case' == CRM_Utils_Array::value('activityTypeName', $params)) {
103 // create relationships for the ones that are required
104 foreach ($xml->CaseRoles as $caseRoleXML) {
105 foreach ($caseRoleXML->RelationshipType as $relationshipTypeXML) {
106 if ((int ) $relationshipTypeXML->creator == 1) {
107 if (!$this->createRelationships((string ) $relationshipTypeXML->name,
353ffa53
TO
108 $params
109 )
110 ) {
6a488035
TO
111 CRM_Core_Error::fatal();
112 return FALSE;
113 }
114 }
115 }
116 }
117 }
118
119 if ('Change Case Start Date' == CRM_Utils_Array::value('activityTypeName', $params)) {
120 // delete all existing activities which are non-empty
121 $this->deleteEmptyActivity($params);
122 }
123
124 foreach ($xml->ActivitySets as $activitySetsXML) {
125 foreach ($activitySetsXML->ActivitySet as $activitySetXML) {
126 if ($standardTimeline) {
127 if ((boolean ) $activitySetXML->timeline) {
128 return $this->processStandardTimeline($activitySetXML,
129 $params
130 );
131 }
132 }
133 elseif ($activitySetName) {
134 $name = (string ) $activitySetXML->name;
135 if ($name == $activitySetName) {
136 return $this->processActivitySet($activitySetXML,
137 $params
138 );
139 }
140 }
141 }
142 }
143 }
144
4c6ce474
EM
145 /**
146 * @param $activitySetXML
c490a46a 147 * @param array $params
4c6ce474 148 */
00be9182 149 public function processStandardTimeline($activitySetXML, &$params) {
448e7600 150 if ('Change Case Type' == CRM_Utils_Array::value('activityTypeName', $params)
353ffa53
TO
151 && CRM_Utils_Array::value('resetTimeline', $params, TRUE)
152 ) {
6a488035
TO
153 // delete all existing activities which are non-empty
154 $this->deleteEmptyActivity($params);
155 }
156
157 foreach ($activitySetXML->ActivityTypes as $activityTypesXML) {
158 foreach ($activityTypesXML as $activityTypeXML) {
159 $this->createActivity($activityTypeXML, $params);
160 }
161 }
162 }
163
4c6ce474
EM
164 /**
165 * @param $activitySetXML
c490a46a 166 * @param array $params
4c6ce474 167 */
00be9182 168 public function processActivitySet($activitySetXML, &$params) {
6a488035
TO
169 foreach ($activitySetXML->ActivityTypes as $activityTypesXML) {
170 foreach ($activityTypesXML as $activityTypeXML) {
171 $this->createActivity($activityTypeXML, $params);
172 }
173 }
174 }
175
4c6ce474
EM
176 /**
177 * @param $caseRolesXML
178 * @param bool $isCaseManager
179 *
180 * @return array|mixed
181 */
00be9182 182 public function &caseRoles($caseRolesXML, $isCaseManager = FALSE) {
6a488035
TO
183 $relationshipTypes = &$this->allRelationshipTypes();
184
185 $result = array();
186 foreach ($caseRolesXML as $caseRoleXML) {
187 foreach ($caseRoleXML->RelationshipType as $relationshipTypeXML) {
188 $relationshipTypeName = (string ) $relationshipTypeXML->name;
189 $relationshipTypeID = array_search($relationshipTypeName,
190 $relationshipTypes
191 );
192 if ($relationshipTypeID === FALSE) {
193 continue;
194 }
195
196 if (!$isCaseManager) {
197 $result[$relationshipTypeID] = $relationshipTypeName;
198 }
199 elseif ($relationshipTypeXML->manager) {
200 return $relationshipTypeID;
201 }
202 }
203 }
204 return $result;
205 }
206
4c6ce474 207 /**
100fef9d 208 * @param string $relationshipTypeName
c490a46a 209 * @param array $params
4c6ce474
EM
210 *
211 * @return bool
212 * @throws Exception
213 */
00be9182 214 public function createRelationships($relationshipTypeName, &$params) {
6a488035
TO
215 $relationshipTypes = &$this->allRelationshipTypes();
216 // get the relationship id
217 $relationshipTypeID = array_search($relationshipTypeName, $relationshipTypes);
218
219 if ($relationshipTypeID === FALSE) {
220 $docLink = CRM_Utils_System::docURL2("user/case-management/setup");
221 CRM_Core_Error::fatal(ts('Relationship type %1, found in case configuration file, is not present in the database %2',
353ffa53
TO
222 array(1 => $relationshipTypeName, 2 => $docLink)
223 ));
6a488035
TO
224 return FALSE;
225 }
226
227 $client = $params['clientID'];
228 if (!is_array($client)) {
229 $client = array($client);
230 }
231
232 foreach ($client as $key => $clientId) {
233 $relationshipParams = array(
234 'relationship_type_id' => $relationshipTypeID,
235 'contact_id_a' => $clientId,
236 'contact_id_b' => $params['creatorID'],
237 'is_active' => 1,
238 'case_id' => $params['caseID'],
239 'start_date' => date("Ymd"),
240 );
241
242 if (!$this->createRelationship($relationshipParams)) {
243 CRM_Core_Error::fatal();
244 return FALSE;
245 }
246 }
247 return TRUE;
248 }
249
4c6ce474 250 /**
c490a46a 251 * @param array $params
4c6ce474
EM
252 *
253 * @return bool
254 */
00be9182 255 public function createRelationship(&$params) {
6a488035
TO
256 $dao = new CRM_Contact_DAO_Relationship();
257 $dao->copyValues($params);
258 // only create a relationship if it does not exist
259 if (!$dao->find(TRUE)) {
260 $dao->save();
261 }
262 return TRUE;
263 }
264
4c6ce474
EM
265 /**
266 * @param $activityTypesXML
267 * @param bool $maxInst
268 * @param bool $isLabel
269 * @param bool $maskAction
270 *
271 * @return array
272 */
00be9182 273 public function activityTypes($activityTypesXML, $maxInst = FALSE, $isLabel = FALSE, $maskAction = FALSE) {
6a488035
TO
274 $activityTypes = &$this->allActivityTypes(TRUE, TRUE);
275 $result = array();
276 foreach ($activityTypesXML as $activityTypeXML) {
277 foreach ($activityTypeXML as $recordXML) {
278 $activityTypeName = (string ) $recordXML->name;
353ffa53 279 $maxInstances = (string ) $recordXML->max_instances;
6a488035
TO
280 $activityTypeInfo = CRM_Utils_Array::value($activityTypeName, $activityTypes);
281
282 if ($activityTypeInfo['id']) {
283 if ($maskAction) {
284 if ($maskAction == 'edit' && '0' === (string ) $recordXML->editable) {
285 $result[$maskAction][] = $activityTypeInfo['id'];
286 }
287 }
288 else {
289 if (!$maxInst) {
290 //if we want,labels of activities should be returned.
291 if ($isLabel) {
292 $result[$activityTypeInfo['id']] = $activityTypeInfo['label'];
293 }
294 else {
295 $result[$activityTypeInfo['id']] = $activityTypeName;
296 }
297 }
298 else {
299 if ($maxInstances) {
300 $result[$activityTypeName] = $maxInstances;
301 }
302 }
303 }
304 }
305 }
306 }
307
308 // call option value hook
309 CRM_Utils_Hook::optionValues($result, 'case_activity_type');
310
311 return $result;
312 }
313
e19323c9
TO
314 /**
315 * @param SimpleXMLElement $caseTypeXML
316 * @return array<string> symbolic activity-type names
317 */
00be9182 318 public function getDeclaredActivityTypes($caseTypeXML) {
e19323c9 319 $result = array();
83151a3f
DJ
320
321 if (!empty($caseTypeXML->ActivityTypes) && $caseTypeXML->ActivityTypes->ActivityType) {
322 foreach ($caseTypeXML->ActivityTypes->ActivityType as $activityTypeXML) {
323 $result[] = (string) $activityTypeXML->name;
e19323c9 324 }
83151a3f 325 }
e19323c9 326
83151a3f
DJ
327 if (!empty($caseTypeXML->ActivitySets) && $caseTypeXML->ActivitySets->ActivitySet) {
328 foreach ($caseTypeXML->ActivitySets->ActivitySet as $activitySetXML) {
329 if ($activitySetXML->ActivityTypes && $activitySetXML->ActivityTypes->ActivityType) {
330 foreach ($activitySetXML->ActivityTypes->ActivityType as $activityTypeXML) {
331 $result[] = (string) $activityTypeXML->name;
e19323c9
TO
332 }
333 }
334 }
335 }
83151a3f 336
e19323c9
TO
337 $result = array_unique($result);
338 sort($result);
339 return $result;
340 }
341
342 /**
343 * @param SimpleXMLElement $caseTypeXML
344 * @return array<string> symbolic relationship-type names
345 */
00be9182 346 public function getDeclaredRelationshipTypes($caseTypeXML) {
e19323c9 347 $result = array();
83151a3f
DJ
348
349 if (!empty($caseTypeXML->CaseRoles) && $caseTypeXML->CaseRoles->RelationshipType) {
350 foreach ($caseTypeXML->CaseRoles->RelationshipType as $relTypeXML) {
351 $result[] = (string) $relTypeXML->name;
e19323c9
TO
352 }
353 }
83151a3f 354
e19323c9
TO
355 $result = array_unique($result);
356 sort($result);
357 return $result;
358 }
359
4c6ce474 360 /**
c490a46a 361 * @param array $params
4c6ce474 362 */
00be9182 363 public function deleteEmptyActivity(&$params) {
e7e657f0 364 $activityContacts = CRM_Core_OptionGroup::values('activity_contacts', FALSE, FALSE, FALSE, NULL, 'name');
9e74e3ce 365 $targetID = CRM_Utils_Array::key('Activity Targets', $activityContacts);
8ef12e64 366
6a488035
TO
367 $query = "
368DELETE a
369FROM civicrm_activity a
91da6cd5
DL
370INNER JOIN civicrm_activity_contact t ON t.activity_id = a.id
371WHERE t.contact_id = %1
9e74e3ce 372AND t.record_type_id = $targetID
6a488035
TO
373AND a.is_auto = 1
374AND a.is_current_revision = 1
375";
376 $sqlParams = array(1 => array($params['clientID'], 'Integer'));
377 CRM_Core_DAO::executeQuery($query, $sqlParams);
378 }
379
4c6ce474 380 /**
c490a46a 381 * @param array $params
4c6ce474
EM
382 *
383 * @return bool
384 */
00be9182 385 public function isActivityPresent(&$params) {
6a488035
TO
386 $query = "
387SELECT count(a.id)
388FROM civicrm_activity a
389INNER JOIN civicrm_case_activity ca on ca.activity_id = a.id
390WHERE a.activity_type_id = %1
391AND ca.case_id = %2
392AND a.is_deleted = 0
393";
394
e547f744 395 $sqlParams = array(
353ffa53 396 1 => array($params['activityTypeID'], 'Integer'),
6a488035
TO
397 2 => array($params['caseID'], 'Integer'),
398 );
399 $count = CRM_Core_DAO::singleValueQuery($query, $sqlParams);
400
401 // check for max instance
6f55186b 402 $caseType = CRM_Case_BAO_Case::getCaseType($params['caseID'], 'name');
6a488035
TO
403 $maxInstance = self::getMaxInstance($caseType, $params['activityTypeName']);
404
405 return $maxInstance ? ($count < $maxInstance ? FALSE : TRUE) : FALSE;
406 }
407
4c6ce474
EM
408 /**
409 * @param $activityTypeXML
c490a46a 410 * @param array $params
4c6ce474
EM
411 *
412 * @return bool
413 * @throws CRM_Core_Exception
414 * @throws Exception
415 */
00be9182 416 public function createActivity($activityTypeXML, &$params) {
6a488035 417 $activityTypeName = (string) $activityTypeXML->name;
353ffa53 418 $activityTypes = &$this->allActivityTypes(TRUE, TRUE);
6a488035
TO
419 $activityTypeInfo = CRM_Utils_Array::value($activityTypeName, $activityTypes);
420
421 if (!$activityTypeInfo) {
422 $docLink = CRM_Utils_System::docURL2("user/case-management/setup");
423 CRM_Core_Error::fatal(ts('Activity type %1, found in case configuration file, is not present in the database %2',
353ffa53
TO
424 array(1 => $activityTypeName, 2 => $docLink)
425 ));
6a488035
TO
426 return FALSE;
427 }
428
429 $activityTypeID = $activityTypeInfo['id'];
430
431 if (isset($activityTypeXML->status)) {
432 $statusName = (string) $activityTypeXML->status;
433 }
434 else {
435 $statusName = 'Scheduled';
436 }
437
438 if ($this->_isMultiClient) {
439 $client = $params['clientID'];
440 }
441 else {
442 $client = array(1 => $params['clientID']);
443 }
444
445 //set order
446 $orderVal = '';
447 if (isset($activityTypeXML->order)) {
448 $orderVal = (string) $activityTypeXML->order;
449 }
450
451 if ($activityTypeName == 'Open Case') {
452 $activityParams = array(
453 'activity_type_id' => $activityTypeID,
454 'source_contact_id' => $params['creatorID'],
455 'is_auto' => FALSE,
456 'is_current_revision' => 1,
457 'subject' => CRM_Utils_Array::value('subject', $params) ? $params['subject'] : $activityTypeName,
458 'status_id' => CRM_Core_OptionGroup::getValue('activity_status',
459 $statusName,
460 'name'
461 ),
462 'target_contact_id' => $client,
463 'medium_id' => CRM_Utils_Array::value('medium_id', $params),
464 'location' => CRM_Utils_Array::value('location', $params),
465 'details' => CRM_Utils_Array::value('details', $params),
466 'duration' => CRM_Utils_Array::value('duration', $params),
467 'weight' => $orderVal,
468 );
469 }
470 else {
471 $activityParams = array(
472 'activity_type_id' => $activityTypeID,
473 'source_contact_id' => $params['creatorID'],
474 'is_auto' => TRUE,
475 'is_current_revision' => 1,
476 'status_id' => CRM_Core_OptionGroup::getValue('activity_status',
477 $statusName,
478 'name'
479 ),
480 'target_contact_id' => $client,
481 'weight' => $orderVal,
482 );
483 }
484
485 //parsing date to default preference format
486 $params['activity_date_time'] = CRM_Utils_Date::processDate($params['activity_date_time']);
487
488 if ($activityTypeName == 'Open Case') {
489 // we don't set activity_date_time for auto generated
490 // activities, but we want it to be set for open case.
491 $activityParams['activity_date_time'] = $params['activity_date_time'];
492 if (array_key_exists('custom', $params) && is_array($params['custom'])) {
493 $activityParams['custom'] = $params['custom'];
494 }
495
496 // Add parameters for attachments
497
498 $numAttachments = CRM_Core_BAO_Setting::getItem(CRM_Core_BAO_Setting::SYSTEM_PREFERENCES_NAME, 'max_attachments');
481a74f4 499 for ($i = 1; $i <= $numAttachments; $i++) {
6a488035 500 $attachName = "attachFile_$i";
481a74f4 501 if (isset($params[$attachName]) && !empty($params[$attachName])) {
6a488035
TO
502 $activityParams[$attachName] = $params[$attachName];
503 }
504 }
505 }
506 else {
507 $activityDate = NULL;
508 //get date of reference activity if set.
509 if ($referenceActivityName = (string) $activityTypeXML->reference_activity) {
510
511 //we skip open case as reference activity.CRM-4374.
a7488080 512 if (!empty($params['resetTimeline']) && $referenceActivityName == 'Open Case') {
6a488035
TO
513 $activityDate = $params['activity_date_time'];
514 }
515 else {
516 $referenceActivityInfo = CRM_Utils_Array::value($referenceActivityName, $activityTypes);
517 if ($referenceActivityInfo['id']) {
518 $caseActivityParams = array('activity_type_id' => $referenceActivityInfo['id']);
519
520 //if reference_select is set take according activity.
521 if ($referenceSelect = (string) $activityTypeXML->reference_select) {
522 $caseActivityParams[$referenceSelect] = 1;
523 }
524
525 $referenceActivity = CRM_Case_BAO_Case::getCaseActivityDates($params['caseID'], $caseActivityParams, TRUE);
526
527 if (is_array($referenceActivity)) {
528 foreach ($referenceActivity as $aId => $details) {
529 $activityDate = CRM_Utils_Array::value('activity_date', $details);
530 break;
531 }
532 }
533 }
534 }
535 }
536 if (!$activityDate) {
537 $activityDate = $params['activity_date_time'];
538 }
539 list($activity_date, $activity_time) = CRM_Utils_Date::setDateDefaults($activityDate);
540 $activityDateTime = CRM_Utils_Date::processDate($activity_date, $activity_time);
541 //add reference offset to date.
542 if ((int) $activityTypeXML->reference_offset) {
543 $activityDateTime = CRM_Utils_Date::intervalAdd('day', (int) $activityTypeXML->reference_offset,
544 $activityDateTime
545 );
546 }
547
548 $activityParams['activity_date_time'] = CRM_Utils_Date::format($activityDateTime);
549 }
550
551 // if same activity is already there, skip and dont touch
552 $params['activityTypeID'] = $activityTypeID;
553 $params['activityTypeName'] = $activityTypeName;
554 if ($this->isActivityPresent($params)) {
555 return TRUE;
556 }
557 $activityParams['case_id'] = $params['caseID'];
a7488080 558 if (!empty($activityParams['is_auto'])) {
6a488035
TO
559 $activityParams['skipRecentView'] = TRUE;
560 }
561
562 $activity = CRM_Activity_BAO_Activity::create($activityParams);
563
564 if (!$activity) {
565 CRM_Core_Error::fatal();
566 return FALSE;
567 }
568
569 // create case activity record
570 $caseParams = array(
571 'activity_id' => $activity->id,
572 'case_id' => $params['caseID'],
573 );
574 CRM_Case_BAO_Case::processCaseActivity($caseParams);
575 return TRUE;
576 }
577
4c6ce474
EM
578 /**
579 * @param $activitySetsXML
580 *
581 * @return array
582 */
00be9182 583 public static function activitySets($activitySetsXML) {
6a488035
TO
584 $result = array();
585 foreach ($activitySetsXML as $activitySetXML) {
586 foreach ($activitySetXML as $recordXML) {
587 $activitySetName = (string ) $recordXML->name;
588 $activitySetLabel = (string ) $recordXML->label;
589 $result[$activitySetName] = $activitySetLabel;
590 }
591 }
592
593 return $result;
594 }
595
4c6ce474
EM
596 /**
597 * @param $caseType
598 * @param null $activityTypeName
599 *
600 * @return array|bool|mixed
601 * @throws Exception
602 */
00be9182 603 public function getMaxInstance($caseType, $activityTypeName = NULL) {
6a488035
TO
604 $xml = $this->retrieve($caseType);
605
606 if ($xml === FALSE) {
607 CRM_Core_Error::fatal();
608 return FALSE;
609 }
610
611 $activityInstances = $this->activityTypes($xml->ActivityTypes, TRUE);
612 return $activityTypeName ? CRM_Utils_Array::value($activityTypeName, $activityInstances) : $activityInstances;
613 }
614
4c6ce474
EM
615 /**
616 * @param $caseType
617 *
618 * @return array|mixed
619 */
00be9182 620 public function getCaseManagerRoleId($caseType) {
6a488035
TO
621 $xml = $this->retrieve($caseType);
622 return $this->caseRoles($xml->CaseRoles, TRUE);
623 }
624
708d8fa2
TO
625 /**
626 * @param string $caseType
627 * @return array<\Civi\CCase\CaseChangeListener>
628 */
00be9182 629 public function getListeners($caseType) {
708d8fa2
TO
630 $xml = $this->retrieve($caseType);
631 $listeners = array();
632 if ($xml->Listeners && $xml->Listeners->Listener) {
633 foreach ($xml->Listeners->Listener as $listenerXML) {
634 $class = (string) $listenerXML;
635 $listeners[] = new $class();
636 }
637 }
638 return $listeners;
639 }
640
4c6ce474
EM
641 /**
642 * @return int
643 */
00be9182 644 public function getRedactActivityEmail() {
6a488035
TO
645 $xml = $this->retrieve("Settings");
646 return ( string ) $xml->RedactActivityEmail ? 1 : 0;
647 }
648
649 /**
fe482240 650 * Retrieves AllowMultipleCaseClients setting.
6a488035 651 *
a6c01b45
CW
652 * @return string
653 * 1 if allowed, 0 if not
6a488035 654 */
00be9182 655 public function getAllowMultipleCaseClients() {
6a488035
TO
656 $xml = $this->retrieve("Settings");
657 if ($xml) {
658 return ( string ) $xml->AllowMultipleCaseClients ? 1 : 0;
659 }
660 return 0;
661 }
662
663 /**
fe482240 664 * Retrieves NaturalActivityTypeSort setting.
6a488035 665 *
a6c01b45
CW
666 * @return string
667 * 1 if natural, 0 if alphabetic
6a488035 668 */
00be9182 669 public function getNaturalActivityTypeSort() {
6a488035
TO
670 $xml = $this->retrieve("Settings");
671 return ( string ) $xml->NaturalActivityTypeSort ? 1 : 0;
672 }
96025800 673
6a488035 674}