/**
  * @param LoggerInterface $logger
  * @param bool            $dryRun
  */
 protected function addActivityContactColumns(LoggerInterface $logger, $dryRun = false)
 {
     $hasSchemaChanges = false;
     $toSchema = clone $this->schema;
     $contactingActivityClasses = $this->activityContactProvider->getSupportedActivityClasses();
     $entities = $this->getConfigurableEntitiesData($logger);
     foreach ($entities as $entityClassName => $config) {
         // Skipp excluded entity
         if (TargetExcludeList::isExcluded($entityClassName)) {
             continue;
         }
         if ($this->canAddField($config, $contactingActivityClasses)) {
             $tableName = $this->getTableName($config, $entityClassName);
             // Process only existing tables
             if (!$toSchema->hasTable($tableName)) {
                 continue;
             }
             $table = $toSchema->getTable($tableName);
             $tableColumns = $table->getColumns();
             /**
              * Check if entity already has all needed columns.
              * If at least one is not present we should check and add it.
              */
             if ($this->hasEntityNeededColumns($tableColumns)) {
                 continue;
             }
             foreach (ActivityScope::$fieldsConfiguration as $fieldName => $fieldConfig) {
                 if (!$table->hasColumn($fieldName)) {
                     $hasSchemaChanges = $this->addColumn($table, $fieldName, $fieldConfig);
                 }
             }
         }
     }
     $this->runSchemaRelated($logger, $dryRun, $hasSchemaChanges, $toSchema);
 }
 /**
  * @param LoggerInterface $logger
  * @param bool            $dryRun
  */
 protected function addActivityContactColumns(LoggerInterface $logger, $dryRun = false)
 {
     $hasSchemaChanges = false;
     $toSchema = clone $this->schema;
     $contactingActivityClasses = $this->activityContactProvider->getSupportedActivityClasses();
     $entities = $this->getConfigurableEntitiesData($logger);
     foreach ($entities as $entityClassName => $config) {
         if (isset($config['extend']['is_extend'], $config['activity']['activities']) && $config['extend']['is_extend'] == true && $config['activity']['activities'] && array_intersect($contactingActivityClasses, $config['activity']['activities'])) {
             if (isset($config['extend']['schema']['doctrine'][$entityClassName]['table'])) {
                 $tableName = $config['extend']['schema']['doctrine'][$entityClassName]['table'];
             } else {
                 $tableName = $this->metadataHelper->getTableNameByEntityClass($entityClassName);
             }
             // Process only existing tables
             if (!$toSchema->hasTable($tableName)) {
                 continue;
             }
             $table = $toSchema->getTable($tableName);
             $tableColumns = $table->getColumns();
             /**
              * Check if entity already has all needed columns.
              * If at least one is not present we should check and add it.
              */
             if (false === (bool) array_diff(array_keys(ActivityScope::$fieldsConfiguration), array_intersect(array_keys($tableColumns), array_keys(ActivityScope::$fieldsConfiguration)))) {
                 continue;
             }
             foreach (ActivityScope::$fieldsConfiguration as $fieldName => $fieldConfig) {
                 if (!$table->hasColumn($fieldName)) {
                     $hasSchemaChanges = true;
                     $table->addColumn($fieldName, $fieldConfig['type'], ['notnull' => false, OroOptions::KEY => array_merge([ExtendOptionsManager::MODE_OPTION => $fieldConfig['mode']], $fieldConfig['options'])]);
                 }
             }
         }
     }
     if ($hasSchemaChanges) {
         // Run schema related SQLs manually because this query run when diff is already calculated by schema tool
         $comparator = new Comparator();
         $platform = $this->connection->getDatabasePlatform();
         $schemaDiff = $comparator->compare($this->schema, $toSchema);
         foreach ($schemaDiff->toSql($platform) as $query) {
             $this->logQuery($logger, $query);
             if (!$dryRun) {
                 $this->connection->query($query);
             }
         }
     }
 }
 /**
  * {@inheritdoc}
  */
 public function preUpdate()
 {
     /** @var ConfigProvider $extendConfigProvider */
     $extendConfigProvider = $this->configManager->getProvider('extend');
     /** @var ConfigProvider $activityConfigProvider */
     $activityConfigProvider = $this->configManager->getProvider('activity');
     $contactingActivityClasses = $this->activityContactProvider->getSupportedActivityClasses();
     $entityConfigs = $extendConfigProvider->getConfigs();
     foreach ($entityConfigs as $entityConfig) {
         if ($entityConfig->is('is_extend')) {
             $entityClassName = $entityConfig->getId()->getClassName();
             // Skipp excluded entity
             if (TargetExcludeList::isExcluded($entityClassName)) {
                 continue;
             }
             /**
              * Check if entity has any activity from contact activities group
              */
             $entityActivities = $activityConfigProvider->getConfig($entityClassName)->get('activities');
             if (!$entityActivities || !array_intersect($contactingActivityClasses, $entityActivities)) {
                 continue;
             }
             /** @var ConfigInterface[] $entityFields */
             $entityFields = $extendConfigProvider->getConfigs($entityClassName);
             $entityFieldNames = array_map(function (ConfigInterface $item) {
                 return $item->getId()->getFieldName();
             }, $entityFields);
             /**
              * Check if entity already has all needed fields.
              * If at least one is not present we should check and add it too.
              */
             if (false === (bool) array_diff(array_keys(ActivityScope::$fieldsConfiguration), array_intersect($entityFieldNames, array_keys(ActivityScope::$fieldsConfiguration)))) {
                 continue;
             }
             foreach (ActivityScope::$fieldsConfiguration as $fieldName => $fieldConfig) {
                 if (!in_array($fieldName, $entityFieldNames)) {
                     $this->configManager->createConfigFieldModel($entityClassName, $fieldName, $fieldConfig['type'], $fieldConfig['mode']);
                     $this->updateConfigs($entityClassName, $fieldName, $fieldConfig['options']);
                 }
             }
         }
     }
 }