From e5a012cdc7340df933eb81955ec4774235b19a7a Mon Sep 17 00:00:00 2001 From: Yuri Kuznetsov Date: Mon, 13 May 2024 12:23:32 +0300 Subject: [PATCH] 7_2 migration --- .../Upgrades/Migrations/V7_2/AfterUpgrade.php | 193 ++++++++++++++++++ 1 file changed, 193 insertions(+) create mode 100644 application/Espo/Core/Upgrades/Migrations/V7_2/AfterUpgrade.php diff --git a/application/Espo/Core/Upgrades/Migrations/V7_2/AfterUpgrade.php b/application/Espo/Core/Upgrades/Migrations/V7_2/AfterUpgrade.php new file mode 100644 index 0000000000..079e156aef --- /dev/null +++ b/application/Espo/Core/Upgrades/Migrations/V7_2/AfterUpgrade.php @@ -0,0 +1,193 @@ +. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU Affero General Public License version 3. + * + * In accordance with Section 7(b) of the GNU Affero General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. + ************************************************************************/ + +namespace Espo\Core\Upgrades\Migrations\V7_2; + +use Espo\Core\Upgrades\Migration\Script; +use Espo\Core\Utils\Metadata; +use Espo\Entities\Portal; +use Espo\Entities\Preferences; +use Espo\Entities\User; +use Espo\Modules\Crm\Entities\KnowledgeBaseArticle; +use Espo\ORM\EntityManager; +use Espo\Core\Utils\Config; + +class AfterUpgrade implements Script +{ + public function __construct( + private Metadata $metadata, + private EntityManager $entityManager, + private Config $config, + private Config\ConfigWriter $configWriter + ) {} + + public function run(): void + { + $this->updateEventMetadata(); + $this->updateTheme(); + $this->updateKbArticles(); + } + + private function updateEventMetadata(): void + { + $metadata = $this->metadata; + + $defs = $metadata->get(['scopes']); + + $toSave = false; + + foreach ($defs as $entityType => $item) { + $isCustom = $item['isCustom'] ?? false; + $type = $item['type'] ?? false; + + if (!$isCustom || $type !== 'Event') { + continue; + } + + $toSave = true; + + $metadata->set('recordDefs', $entityType, [ + 'beforeUpdateHookClassNameList' => [ + "__APPEND__", + "Espo\\Classes\\RecordHooks\\Event\\BeforeUpdatePreserveDuration" + ] + ]); + + $metadata->set('clientDefs', $entityType, [ + 'forcePatchAttributeDependencyMap' => [ + "dateEnd" => ["dateStart"], + "dateEndDate" => ["dateStartDate"] + ] + ]); + + if ($metadata->get(['entityDefs', $entityType, 'fields', 'isAllDay'])) { + $metadata->set('entityDefs', $entityType, [ + 'fields' => [ + 'isAllDay' => [ + 'readOnly' => false, + ], + ] + ]); + } + } + + if ($toSave) { + $metadata->save(); + } + } + + private function updateTheme(): void + { + $themeList = [ + 'EspoVertical', + 'HazyblueVertical', + 'VioletVertical', + 'SakuraVertical', + 'DarkVertical', + ]; + + $theme = $this->config->get('theme'); + $navbar = 'top'; + + if (in_array($theme, $themeList)) { + $theme = substr($theme, 0, -8); + $navbar = 'side'; + } + + $this->configWriter->set('theme', $theme); + $this->configWriter->set('themeParams', (object) ['navbar' => $navbar]); + $this->configWriter->save(); + + $userList = $this->entityManager->getRDBRepository(User::ENTITY_TYPE) + ->where([ + 'type' => ['regular', 'admin'] + ]) + ->find(); + + foreach ($userList as $user) { + $preferences = $this->entityManager->getEntityById(Preferences::ENTITY_TYPE, $user->getId()); + + if (!$preferences) { + continue; + } + + $theme = $preferences->get('theme'); + $navbar = 'top'; + + if (!$theme) { + continue; + } + + if (in_array($theme, $themeList)) { + $theme = substr($theme, 0, -8); + $navbar = 'side'; + } + + $preferences->set('theme', $theme); + $preferences->set('themeParams', (object) ['navbar' => $navbar]); + + $this->entityManager->saveEntity($preferences); + } + + $portalList = $this->entityManager + ->getRDBRepository(Portal::ENTITY_TYPE) + ->where([ + 'theme!=' => null, + ]) + ->find(); + + foreach ($portalList as $portal) { + $theme = $portal->get('theme'); + $navbar = 'top'; + + if (in_array($theme, $themeList)) { + $theme = substr($theme, 0, -8); + $navbar = 'side'; + } + + $portal->set('theme', $theme); + $portal->set('themeParams', (object) ['navbar' => $navbar]); + + $this->entityManager->saveEntity($portal); + } + } + + private function updateKbArticles(): void + { + $query = $this->entityManager + ->getQueryBuilder() + ->update() + ->in(KnowledgeBaseArticle::ENTITY_TYPE) + ->where(['type' => null]) + ->set(['type' => 'Article']) + ->build(); + + $this->entityManager->getQueryExecutor()->execute($query); + } +}