Ejemplo n.º 1
0
 /**
  * @param bool $fresh
  * @return CRM_Case_XMLRepository
  */
 public static function singleton($fresh = FALSE)
 {
     if (!self::$singleton || $fresh) {
         self::$singleton = new static();
     }
     return self::$singleton;
 }
 /**
  * Get a list of managed relationship-types by searching CiviCase XML files
  *
  * @return array
  * @see CRM_Utils_Hook::managed
  * @throws CRM_Core_Exception
  */
 public static function createManagedRelationshipTypes(CRM_Case_XMLRepository $xmlRepo, CRM_Core_ManagedEntities $me)
 {
     $result = array();
     $p = new CRM_Case_XMLProcessor();
     $validRelTypes = $p->allRelationshipTypes();
     $relTypes = $xmlRepo->getAllDeclaredRelationshipTypes();
     foreach ($relTypes as $relType) {
         $managed = array('module' => 'civicrm', 'name' => "civicase:rel:{$relType}", 'entity' => 'RelationshipType', 'update' => 'never', 'cleanup' => 'unused', 'params' => array('version' => 3, 'name_a_b' => "{$relType} is", 'name_b_a' => $relType, 'label_a_b' => "{$relType} is", 'label_b_a' => $relType, 'description' => $relType, 'contact_type_a' => 'Individual', 'contact_type_b' => 'Individual', 'contact_sub_type_a' => NULL, 'contact_sub_type_b' => NULL));
         // We'll create managed-entity if this record doesn't exist yet
         // or if we previously decided to manage this record.
         if (!in_array($relType, $validRelTypes)) {
             $result[] = $managed;
         } elseif ($me->get($managed['module'], $managed['name'])) {
             $result[] = $managed;
         }
     }
     return $result;
 }
Ejemplo n.º 3
0
 /**
  * Check that the case-type names don't rely on double-munging.
  *
  * @return array<CRM_Utils_Check_Message> an empty array, or a list of warnings
  */
 public function checkCaseTypeNameConsistency()
 {
     $messages = array();
     foreach ($this->caseTypeNames as $caseTypeName) {
         $normalFile = $this->xmlRepo->findXmlFile($caseTypeName);
         $mungedFile = $this->xmlRepo->findXmlFile(CRM_Case_XMLProcessor::mungeCaseType($caseTypeName));
         if ($normalFile && $mungedFile && $normalFile == $mungedFile) {
             // ok
         } elseif ($normalFile && $mungedFile) {
             $messages[] = new CRM_Utils_Check_Message(__FUNCTION__, ts('Case type "%2" has duplicate XML files ("%3" and "%4").<br /><a href="%1">Read more about this warning</a>', array(1 => CRM_Utils_System::getWikiBaseURL() . __FUNCTION__, 2 => $caseTypeName, 3 => $normalFile, 4 => $mungedFile)), ts('CiviCase'));
         } elseif ($normalFile && !$mungedFile) {
             // ok
         } elseif (!$normalFile && $mungedFile) {
             $messages[] = new CRM_Utils_Check_Message(__FUNCTION__, ts('Case type "%2" corresponds to XML file ("%3") The XML file should be named "%4".<br /><a href="%1">Read more about this warning</a>', array(1 => CRM_Utils_System::getWikiBaseURL() . __FUNCTION__, 2 => $caseTypeName, 3 => $mungedFile, 4 => "{$caseTypeName}.xml")), ts('CiviCase'));
         } elseif (!$normalFile && !$mungedFile) {
             // ok -- probably a new or DB-based CaseType
         }
     }
     return $messages;
 }
Ejemplo n.º 4
0
 /**
  * Check that the case-type names don't rely on double-munging.
  *
  * @return array<CRM_Utils_Check_Message>
  *   An empty array, or a list of warnings
  */
 public function checkCaseTypeNameConsistency()
 {
     $messages = array();
     foreach ($this->caseTypeNames as $caseTypeName) {
         $normalFile = $this->xmlRepo->findXmlFile($caseTypeName);
         $mungedFile = $this->xmlRepo->findXmlFile(CRM_Case_XMLProcessor::mungeCaseType($caseTypeName));
         if ($normalFile && $mungedFile && $normalFile == $mungedFile) {
             // ok
         } elseif ($normalFile && $mungedFile) {
             $messages[] = new CRM_Utils_Check_Message(__FUNCTION__ . $caseTypeName, ts('Case type "%1" has duplicate XML files ("%2" and "%3")', array(1 => $caseTypeName, 2 => $normalFile, 3 => $mungedFile)) . '<br /><a href="' . CRM_Utils_System::getWikiBaseURL() . __FUNCTION__ . '">' . ts('Read more about this warning') . '</a>', ts('CiviCase'), \Psr\Log\LogLevel::WARNING, 'fa-puzzle-piece');
         } elseif ($normalFile && !$mungedFile) {
             // ok
         } elseif (!$normalFile && $mungedFile) {
             $messages[] = new CRM_Utils_Check_Message(__FUNCTION__ . $caseTypeName, ts('Case type "%1" corresponds to XML file ("%2") The XML file should be named "%3".', array(1 => $caseTypeName, 2 => $mungedFile, 3 => "{$caseTypeName}.xml")) . '<br /><a href="' . CRM_Utils_System::getWikiBaseURL() . __FUNCTION__ . '">' . ts('Read more about this warning') . '</a>', ts('CiviCase'), \Psr\Log\LogLevel::WARNING, 'fa-puzzle-piece');
         } elseif (!$normalFile && !$mungedFile) {
             // ok -- probably a new or DB-based CaseType
         }
     }
     return $messages;
 }
Ejemplo n.º 5
0
 /**
  * Get a list of managed relationship-types by searching CiviCase XML files.
  *
  * @param \CRM_Case_XMLRepository $xmlRepo
  * @param \CRM_Core_ManagedEntities $me
  *
  * @return array
  * @see CRM_Utils_Hook::managed
  */
 public static function createManagedRelationshipTypes(CRM_Case_XMLRepository $xmlRepo, CRM_Core_ManagedEntities $me)
 {
     $result = array();
     if (!isset(Civi::$statics[__CLASS__]['reltypes'])) {
         $relationshipInfo = CRM_Core_PseudoConstant::relationshipType('label', TRUE, NULL);
         Civi::$statics[__CLASS__]['reltypes'] = CRM_Utils_Array::collect(CRM_Case_XMLProcessor::REL_TYPE_CNAME, $relationshipInfo);
     }
     $validRelTypes = Civi::$statics[__CLASS__]['reltypes'];
     $relTypes = $xmlRepo->getAllDeclaredRelationshipTypes();
     foreach ($relTypes as $relType) {
         $managed = array('module' => 'civicrm', 'name' => "civicase:rel:{$relType}", 'entity' => 'RelationshipType', 'update' => 'never', 'cleanup' => 'unused', 'params' => array('version' => 3, 'name_a_b' => "{$relType} is", 'name_b_a' => $relType, 'label_a_b' => "{$relType} is", 'label_b_a' => $relType, 'description' => $relType, 'contact_type_a' => 'Individual', 'contact_type_b' => 'Individual', 'contact_sub_type_a' => NULL, 'contact_sub_type_b' => NULL));
         // We'll create managed-entity if this record doesn't exist yet
         // or if we previously decided to manage this record.
         if (!in_array($relType, $validRelTypes)) {
             $result[] = $managed;
         } elseif ($me->get($managed['module'], $managed['name'])) {
             $result[] = $managed;
         }
     }
     return $result;
 }
Ejemplo n.º 6
0
 /**
  * Run all system checks.
  *
  * This functon is wrapped by the System.check api.
  *
  * Calls hook_civicrm_check() for extensions to add or modify messages.
  * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_check
  *
  * @param bool $max
  *   Whether to return just the maximum non-hushed severity
  *
  * @return array
  *   Array of CRM_Utils_Check_Message objects
  */
 public static function checkAll($max = FALSE)
 {
     $checks = array();
     $checks[] = new CRM_Utils_Check_Security();
     $checks[] = new CRM_Utils_Check_Env();
     $compInfo = CRM_Core_Component::getEnabledComponents();
     foreach ($compInfo as $compObj) {
         switch ($compObj->info['name']) {
             case 'CiviCase':
                 $checks[] = new CRM_Utils_Check_Case(CRM_Case_XMLRepository::singleton(), CRM_Case_PseudoConstant::caseType('name'));
                 break;
             default:
         }
     }
     $messages = array();
     foreach ($checks as $check) {
         $messages = array_merge($messages, $check->checkAll());
     }
     CRM_Utils_Hook::check($messages);
     uasort($messages, array(__CLASS__, 'severitySort'));
     $maxSeverity = 1;
     foreach ($messages as $message) {
         if (!$message->isVisible()) {
             continue;
         }
         $maxSeverity = max(1, $message->getLevel());
         break;
     }
     Civi::settings()->set('systemStatusCheckResult', $maxSeverity);
     return $max ? $maxSeverity : $messages;
 }
Ejemplo n.º 7
0
 /**
  * @return SimpleXMLElement|NULL
  */
 public function getXml()
 {
     if ($this->xml === NULL) {
         $this->xml = \CRM_Case_XMLRepository::singleton()->retrieve($this->getCaseType());
     }
     return $this->xml;
 }
Ejemplo n.º 8
0
/**
 * Format definition.
 *
 * @param array $result
 *
 * @return array
 * @throws \CRM_Core_Exception
 */
function _civicrm_api3_case_type_get_formatResult(&$result)
{
    foreach ($result['values'] as $key => $caseType) {
        $caseTypeName = isset($caseType['name']) ? $caseType['name'] : CRM_Core_DAO::getFieldValue('CRM_Case_DAO_CaseType', $caseType['id'], 'name', 'id', TRUE);
        $xml = CRM_Case_XMLRepository::singleton()->retrieve($caseTypeName);
        if ($xml) {
            $result['values'][$key]['definition'] = CRM_Case_BAO_CaseType::convertXmlToDefinition($xml);
        } else {
            $result['values'][$key]['definition'] = array();
        }
        $result['values'][$key]['is_forkable'] = CRM_Case_BAO_CaseType::isForkable($result['values'][$key]['id']);
        $result['values'][$key]['is_forked'] = CRM_Case_BAO_CaseType::isForked($result['values'][$key]['id']);
    }
    return $result;
}
Ejemplo n.º 9
0
 public function testGetRoleReferenceCount_23()
 {
     $repo = new CRM_Case_XMLRepository(array('CaseTypeWithTwoRoles', 'CaseTypeWithThreeRoles', 'CaseTypeWithSingleActivityType'), array('CaseTypeWithTwoRoles' => new SimpleXMLElement($this->fixtures['CaseTypeWithTwoRoles']), 'CaseTypeWithThreeRoles' => new SimpleXMLElement($this->fixtures['CaseTypeWithThreeRoles']), 'CaseTypeWithSingleActivityType' => new SimpleXMLElement($this->fixtures['CaseTypeWithSingleActivityType'])));
     $this->assertEquals(0, $repo->getRelationshipReferenceCount('Single Role'));
     $this->assertEquals(2, $repo->getRelationshipReferenceCount('First Role'));
     $this->assertEquals(2, $repo->getRelationshipReferenceCount('Second Role'));
     $this->assertEquals(1, $repo->getRelationshipReferenceCount('Third Role'));
 }
Ejemplo n.º 10
0
 /**
  * Run some sanity checks.
  *
  * This could become a hook so that CiviCRM can run both built-in
  * configuration & sanity checks, and modules/extensions can add
  * their own checks.
  *
  * We might even expose the results of these checks on the Wordpress
  * plugin status page or the Drupal admin/reports/status path.
  *
  * @return array
  *   Array of messages
  * @link https://api.drupal.org/api/drupal/modules%21system%21system.api.php/function/hook_requirements
  */
 public function checkAll()
 {
     $checks = array();
     $checks[] = new CRM_Utils_Check_Security();
     $checks[] = new CRM_Utils_Check_Env();
     $compInfo = CRM_Core_Component::getEnabledComponents();
     foreach ($compInfo as $compObj) {
         switch ($compObj->info['name']) {
             case 'CiviCase':
                 $checks[] = new CRM_Utils_Check_Case(CRM_Case_XMLRepository::singleton(), CRM_Case_PseudoConstant::caseType('name'));
                 break;
             default:
         }
     }
     $messages = array();
     foreach ($checks as $check) {
         $messages = array_merge($messages, $check->checkAll());
     }
     CRM_Utils_Hook::check($messages);
     return $messages;
 }
 /**
  * Tears down the fixture, for example, closes a network connection.
  * This method is called after a test is executed.
  *
  * @access protected
  */
 function tearDown()
 {
     $this->quickCleanup($this->tablesToTruncate, TRUE);
     $this->customDirectories(array('template_path' => FALSE));
     CRM_Case_XMLRepository::singleton(TRUE);
 }
Ejemplo n.º 12
0
 /**
  * Run some sanity checks.
  *
  * This could become a hook so that CiviCRM can run both built-in
  * configuration & sanity checks, and modules/extensions can add
  * their own checks.
  *
  * We might even expose the results of these checks on the Wordpress
  * plugin status page or the Drupal admin/reports/status path.
  *
  * @return array
  *   Array of messages
  * @link https://api.drupal.org/api/drupal/modules%21system%21system.api.php/function/hook_requirements
  */
 public function checkAll($showHushed = FALSE)
 {
     $checks = array();
     $checks[] = new CRM_Utils_Check_Security();
     $checks[] = new CRM_Utils_Check_Env();
     $compInfo = CRM_Core_Component::getEnabledComponents();
     foreach ($compInfo as $compObj) {
         switch ($compObj->info['name']) {
             case 'CiviCase':
                 $checks[] = new CRM_Utils_Check_Case(CRM_Case_XMLRepository::singleton(), CRM_Case_PseudoConstant::caseType('name'));
                 break;
             default:
         }
     }
     $messages = array();
     foreach ($checks as $check) {
         $messages = array_merge($messages, $check->checkAll());
     }
     CRM_Utils_Hook::check($messages);
     if (!$showHushed) {
         foreach ($messages as $key => $message) {
             $hush = self::checkHushSnooze($message);
             if ($hush) {
                 unset($messages[$key]);
             }
         }
     }
     uasort($messages, array(__CLASS__, 'severitySort'));
     return $messages;
 }
Ejemplo n.º 13
0
 /**
  * Test create methods with xml file.
  *
  * Success expected.
  */
 public function testCaseTypeCreateWithDefinition()
 {
     // Create Case Type
     $params = $this->fixtures['Application_with_Definition'];
     $result = $this->callAPISuccess('CaseType', 'create', $params);
     $id = $result['id'];
     // Check result
     $result = $this->callAPISuccess('CaseType', 'get', array('id' => $id));
     $this->assertEquals($result['values'][$id]['id'], $id);
     $this->assertEquals($result['values'][$id]['title'], $params['title']);
     $this->assertEquals($result['values'][$id]['definition'], $params['definition']);
     $caseXml = CRM_Case_XMLRepository::singleton()->retrieve('Application_with_Definition');
     $this->assertTrue($caseXml instanceof SimpleXMLElement);
 }
Ejemplo n.º 14
0
 /**
  * Determine if modifications are allowed on the case-type
  *
  * @param int $caseTypeId
  * @return bool
  *   TRUE if the definition can be modified
  */
 public static function isForkable($caseTypeId)
 {
     $caseTypeName = CRM_Core_DAO::getFieldValue('CRM_Case_DAO_CaseType', $caseTypeId, 'name', 'id', TRUE);
     if ($caseTypeName) {
         // if file-based definition explicitly disables "forkable" option, then don't allow changes to definition
         $fileDefinition = CRM_Case_XMLRepository::singleton()->retrieveFile($caseTypeName);
         if ($fileDefinition && isset($fileDefinition->forkable)) {
             return CRM_Utils_String::strtobool((string) $fileDefinition->forkable);
         }
     }
     return TRUE;
 }
Ejemplo n.º 15
0
 /**
  * @param $caseType
  *
  * @return FALSE|SimpleXMLElement
  */
 public function retrieve($caseType)
 {
     return CRM_Case_XMLRepository::singleton()->retrieve($caseType);
 }
Ejemplo n.º 16
0
 /**
  * @param bool $triggerRebuild
  * @param bool $sessionReset
  *
  * @throws Exception
  */
 public static function rebuildMenuAndCaches($triggerRebuild = FALSE, $sessionReset = FALSE)
 {
     $config = CRM_Core_Config::singleton();
     $config->clearModuleList();
     // also cleanup all caches
     $config->cleanupCaches($sessionReset || CRM_Utils_Request::retrieve('sessionReset', 'Boolean', CRM_Core_DAO::$_nullObject, FALSE, 0, 'GET'));
     CRM_Core_Menu::store();
     // also reset navigation
     CRM_Core_BAO_Navigation::resetNavigation();
     // also cleanup module permissions
     $config->cleanupPermissions();
     // rebuild word replacement cache - pass false to prevent operations redundant with this fn
     CRM_Core_BAO_WordReplacement::rebuild(FALSE);
     Civi::service('settings_manager')->flush();
     // Clear js caches
     CRM_Core_Resources::singleton()->flushStrings()->resetCacheCode();
     CRM_Case_XMLRepository::singleton(TRUE);
     // also rebuild triggers if requested explicitly
     if ($triggerRebuild || CRM_Utils_Request::retrieve('triggerRebuild', 'Boolean', CRM_Core_DAO::$_nullObject, FALSE, 0, 'GET')) {
         CRM_Core_DAO::triggerRebuild();
     }
     CRM_Core_DAO_AllCoreTables::reinitializeCache(TRUE);
     CRM_Core_ManagedEntities::singleton(TRUE)->reconcile();
     //CRM-16257 update Config.IDS.ini might be an old copy
     CRM_Core_IDS::createConfigFile(TRUE);
 }
Ejemplo n.º 17
0
 /**
  * @inheritDoc
  */
 public function getReferenceCounts($dao)
 {
     $result = array();
     if ($dao instanceof CRM_Core_DAO_OptionValue) {
         /** @var $dao CRM_Core_DAO_OptionValue */
         $activity_type_gid = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_OptionGroup', 'activity_type', 'id', 'name');
         if ($activity_type_gid == $dao->option_group_id) {
             $count = CRM_Case_XMLRepository::singleton()->getActivityReferenceCount($dao->name);
             if ($count > 0) {
                 $result[] = array('name' => 'casetypexml:activities', 'type' => 'casetypexml', 'count' => $count);
             }
         }
     } elseif ($dao instanceof CRM_Contact_DAO_RelationshipType) {
         /** @var $dao CRM_Contact_DAO_RelationshipType */
         $count = CRM_Case_XMLRepository::singleton()->getRelationshipReferenceCount($dao->{CRM_Case_XMLProcessor::REL_TYPE_CNAME});
         if ($count > 0) {
             $result[] = array('name' => 'casetypexml:relationships', 'type' => 'casetypexml', 'count' => $count);
         }
     }
     return $result;
 }
Ejemplo n.º 18
0
 /**
  * @param bool $triggerRebuild
  * @param bool $sessionReset
  *
  * @throws Exception
  */
 static function rebuildMenuAndCaches($triggerRebuild = FALSE, $sessionReset = FALSE)
 {
     $config = CRM_Core_Config::singleton();
     $config->clearModuleList();
     // also cleanup all caches
     $config->cleanupCaches($sessionReset || CRM_Utils_Request::retrieve('sessionReset', 'Boolean', CRM_Core_DAO::$_nullObject, FALSE, 0, 'GET'));
     CRM_Core_Menu::store();
     // also reset navigation
     CRM_Core_BAO_Navigation::resetNavigation();
     // also cleanup module permissions
     $config->cleanupPermissions();
     // also rebuild word replacement cache
     CRM_Core_BAO_WordReplacement::rebuild();
     // Clear dynamic js files
     CRM_Utils_File::flushDynamicResources();
     CRM_Core_BAO_Setting::updateSettingsFromMetaData();
     CRM_Core_Resources::singleton()->resetCacheCode();
     CRM_Case_XMLRepository::singleton(TRUE);
     // also rebuild triggers if requested explicitly
     if ($triggerRebuild || CRM_Utils_Request::retrieve('triggerRebuild', 'Boolean', CRM_Core_DAO::$_nullObject, FALSE, 0, 'GET')) {
         CRM_Core_DAO::triggerRebuild();
     }
     CRM_Core_DAO_AllCoreTables::reinitializeCache(TRUE);
     CRM_Core_ManagedEntities::singleton(TRUE)->reconcile();
 }