- $compPermissions = [
- 'CiviCase' => [
- 'administer CiviCase',
- 'access my cases and activities',
- 'access all cases and activities',
- ],
- 'CiviMail' => ['access CiviMail'],
- 'CiviEvent' => ['access CiviEvent'],
- 'CiviGrant' => ['access CiviGrant'],
- 'CiviPledge' => ['access CiviPledge'],
- 'CiviMember' => ['access CiviMember'],
- 'CiviReport' => ['access CiviReport'],
- 'CiviContribute' => ['access CiviContribute'],
- 'CiviCampaign' => ['administer CiviCampaign'],
- ];
+ $permittedActivityTypes = self::getPermittedActivityTypes();
+ return isset($permittedActivityTypes[$activityTypeID]);
+ }
+
+ /**
+ * Get the activity types the user is permitted to access.
+ *
+ * The types are filtered by the components they have access to. ie. a user
+ * with access CiviContribute but not CiviMember will see contribution related
+ * activities and activities with no component (e.g meetings) but not member related ones.
+ *
+ * @return array
+ */
+ protected static function getPermittedActivityTypes() {
+ $userID = (int) CRM_Core_Session::getLoggedInContactID();
+ if (!isset(Civi::$statics[__CLASS__]['permitted_activity_types'][$userID])) {
+ $permittedActivityTypes = [];
+ $components = self::activityComponents(FALSE);
+ $componentClause = empty($components) ? '' : (' OR component_id IN (' . implode(', ', array_keys($components)) . ')');
+
+ $types = CRM_Core_DAO::executeQuery(
+ "
+ SELECT option_value.value activity_type_id
+ FROM civicrm_option_value option_value
+INNER JOIN civicrm_option_group grp ON (grp.id = option_group_id AND grp.name = 'activity_type')
+ WHERE component_id IS NULL $componentClause")->fetchAll();
+ foreach ($types as $type) {
+ $permittedActivityTypes[$type['activity_type_id']] = (int) $type['activity_type_id'];
+ }
+ Civi::$statics[__CLASS__]['permitted_activity_types'][$userID] = $permittedActivityTypes;
+ }
+ return Civi::$statics[__CLASS__]['permitted_activity_types'][$userID];
+ }