From eebe2442473a15843ffd2e6b82cf4b5ad5ca384d Mon Sep 17 00:00:00 2001 From: Yuri Kuznetsov Date: Mon, 26 Feb 2024 11:56:04 +0200 Subject: [PATCH] ref --- .../TargetList/AfterCreateDuplicate.php | 89 +++++++++++++++++++ .../metadata/recordDefs/TargetList.json | 3 +- .../Espo/Modules/Crm/Services/TargetList.php | 23 ----- 3 files changed, 91 insertions(+), 24 deletions(-) create mode 100644 application/Espo/Modules/Crm/Classes/RecordHooks/TargetList/AfterCreateDuplicate.php diff --git a/application/Espo/Modules/Crm/Classes/RecordHooks/TargetList/AfterCreateDuplicate.php b/application/Espo/Modules/Crm/Classes/RecordHooks/TargetList/AfterCreateDuplicate.php new file mode 100644 index 0000000000..0e3f3527f7 --- /dev/null +++ b/application/Espo/Modules/Crm/Classes/RecordHooks/TargetList/AfterCreateDuplicate.php @@ -0,0 +1,89 @@ +. + * + * 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\Modules\Crm\Classes\RecordHooks\TargetList; + +use Espo\Core\Acl; +use Espo\Core\Record\CreateParams; +use Espo\Core\Record\Hook\CreateHook; +use Espo\Modules\Crm\Entities\TargetList; +use Espo\Modules\Crm\Tools\TargetList\MetadataProvider; +use Espo\ORM\Entity; +use Espo\ORM\EntityManager; + +/** + * @implements CreateHook + */ +class AfterCreateDuplicate implements CreateHook +{ + public function __construct( + private Acl $acl, + private EntityManager $entityManager, + private MetadataProvider $metadataProvider + ) {} + + public function process(Entity $entity, CreateParams $params): void + { + $id = $params->getDuplicateSourceId(); + + if (!$id) { + return; + } + + $sourceEntity = $this->entityManager->getRDBRepositoryByClass(TargetList::class)->getById($id); + + if (!$sourceEntity) { + return; + } + + if (!$this->acl->check($sourceEntity, Acl\Table::ACTION_READ)) { + return; + } + + $this->duplicateLinks($entity, $sourceEntity); + } + + private function duplicateLinks(TargetList $entity, TargetList $sourceEntity): void + { + $repository = $this->entityManager->getRDBRepositoryByClass(TargetList::class); + + foreach ($this->metadataProvider->getTargetLinkList() as $link) { + $collection = $repository + ->getRelation($sourceEntity, $link) + ->where(['@relation.optedOut' => false]) + ->find(); + + foreach ($collection as $relatedEntity) { + $repository + ->getRelation($entity, $link) + ->relate($relatedEntity, ['optedOut' => false]); + } + } + } +} diff --git a/application/Espo/Modules/Crm/Resources/metadata/recordDefs/TargetList.json b/application/Espo/Modules/Crm/Resources/metadata/recordDefs/TargetList.json index a67586505b..ae3ffb6511 100644 --- a/application/Espo/Modules/Crm/Resources/metadata/recordDefs/TargetList.json +++ b/application/Espo/Modules/Crm/Resources/metadata/recordDefs/TargetList.json @@ -8,6 +8,7 @@ "Espo\\Modules\\Crm\\Classes\\FieldProcessing\\TargetList\\OptedOutCountLoader" ], "afterCreateHookClassNameList": [ - "Espo\\Modules\\Crm\\Classes\\RecordHooks\\TargetList\\AfterCreate" + "Espo\\Modules\\Crm\\Classes\\RecordHooks\\TargetList\\AfterCreate", + "Espo\\Modules\\Crm\\Classes\\RecordHooks\\TargetList\\AfterCreateDuplicate" ] } diff --git a/application/Espo/Modules/Crm/Services/TargetList.php b/application/Espo/Modules/Crm/Services/TargetList.php index 7f8d0fa7eb..421d2f4650 100644 --- a/application/Espo/Modules/Crm/Services/TargetList.php +++ b/application/Espo/Modules/Crm/Services/TargetList.php @@ -29,7 +29,6 @@ namespace Espo\Modules\Crm\Services; -use Espo\ORM\Entity; use Espo\Modules\Crm\Entities\TargetList as TargetListEntity; use Espo\Services\Record; use Espo\Core\Utils\Metadata; @@ -45,7 +44,6 @@ class TargetList extends Record $targetLinkList = $this->metadata->get(['scopes', 'TargetList', 'targetLinkList']) ?? []; - $this->duplicatingLinkList = $targetLinkList; $this->noEditAccessRequiredLinkList = $targetLinkList; foreach ($targetLinkList as $link) { @@ -53,25 +51,4 @@ class TargetList extends Record $this->linkMandatorySelectAttributeList[$link] = ['targetListIsOptedOut']; } } - - /** - * @todo Don't use additionalColumnsConditions. - */ - protected function duplicateLinks(Entity $entity, Entity $duplicatingEntity): void - { - $repository = $this->getRepository(); - - foreach ($this->duplicatingLinkList as $link) { - $linkedList = $repository - ->getRelation($duplicatingEntity, $link) - ->where(['@relation.optedOut' => false]) - ->find(); - - foreach ($linkedList as $linked) { - $repository - ->getRelation($entity, $link) - ->relate($linked, ['optedOut' => false]); - } - } - } }