user = $user; $this->entityManager = $entityManager; $this->userChecker = $userChecker; $this->serviceFactory = $serviceFactory; $this->aclManager = $aclManager; } public function process(Entity $entity, Params $params): void { /** @var EmailEntity $entity */ if (!in_array($entity->get('status'), ['Archived', 'Sent', 'Being Imported'])) { return; } if ($params->getOption('isJustSent')) { $previousUserIdList = []; } else { $previousUserIdList = $entity->getFetched('usersIds'); if (!is_array($previousUserIdList)) { $previousUserIdList = []; } } $dateSent = $entity->get('dateSent'); if (!$dateSent) { return; } try { $dt = new DateTime($dateSent); } catch (Exception $e) { return; } if ($dt->diff(new DateTime())->days > self::DAYS_THRESHOLD) { return; } $emailUserIdList = $entity->get('usersIds'); if (is_null($emailUserIdList) || !is_array($emailUserIdList)) { return; } $userIdList = []; foreach ($emailUserIdList as $userId) { if ( !in_array($userId, $userIdList) && !in_array($userId, $previousUserIdList) && $userId !== $this->user->getId() ) { $userIdList[] = $userId; } } $data = [ 'emailId' => $entity->getId(), 'emailName' => $entity->get('name'), ]; /** @var EmailRepository $emailRepository */ $emailRepository = $this->entityManager->getRepository('Email'); /** @var EmailAddressRepository $emailAddressRepository */ $emailAddressRepository = $this->entityManager->getRepository('EmailAddress'); if (!$entity->has('from')) { $emailRepository->loadFromField($entity); } if (!$entity->has('to')) { $emailRepository->loadToField($entity); } $person = null; $from = $entity->get('from'); if ($from) { $person = $emailAddressRepository->getEntityByAddress($from, null, ['User', 'Contact', 'Lead']); if ($person) { $data['personEntityType'] = $person->getEntityType(); $data['personEntityName'] = $person->get('name'); $data['personEntityId'] = $person->getId(); } } $userIdFrom = null; if ($person && $person->getEntityType() === 'User') { $userIdFrom = $person->getId(); } if (empty($data['personEntityId'])) { $data['fromString'] = EmailService::parseFromName($entity->get('fromString')); if (empty($data['fromString']) && $from) { $data['fromString'] = $from; } } $parent = null; if ($entity->get('parentId') && $entity->get('parentType')) { $parent = $this->entityManager->getEntity($entity->get('parentType'), $entity->get('parentId')); } $account = null; if ($entity->get('accountId')) { $account = $this->entityManager->getEntity('Account', $entity->get('accountId')); } foreach ($userIdList as $userId) { if (!$userId) { continue; } if ($userIdFrom === $userId) { continue; } if ($entity->getLinkMultipleColumn('users', 'inTrash', $userId)) { continue; } if (!$this->userChecker->checkAssignment('Email', $userId)) { continue; } if ( $params->getOption('isBeingImported') || $params->getOption('isJustSent') ) { $folderId = $entity->getLinkMultipleColumn('users', 'folderId', $userId); if ($folderId) { if ( $this->entityManager ->getRDBRepository('EmailFolder') ->where([ 'id' => $folderId, 'skipNotifications' => true, ]) ->count() ) { continue; } } } /** @var User|null $user */ $user = $this->entityManager->getEntity('User', $userId); if (!$user) { continue; } if ($user->isPortal()) { continue; } if (!$this->aclManager->checkScope($user, 'Email')) { continue; } $isArchivedOrBeingImported = $entity->get('status') === 'Archived' || $params->getOption('isBeingImported'); if ( $isArchivedOrBeingImported && $parent && $this->getStreamService()->checkIsFollowed($parent, $userId) ) { continue; } if ( $isArchivedOrBeingImported && $account && $this->getStreamService()->checkIsFollowed($account, $userId) ) { continue; } $existing = $this->entityManager ->getRDBRepository(Notification::ENTITY_TYPE) ->where([ 'type' => Notification::TYPE_EMAIL_RECEIVED, 'userId' => $userId, 'relatedId' => $entity->getId(), 'relatedType' => 'Email', ]) ->select(['id']) ->findOne(); if ($existing) { continue; } $this->entityManager->createEntity(Notification::ENTITY_TYPE, [ 'type' => Notification::TYPE_EMAIL_RECEIVED, 'userId' => $userId, 'data' => $data, 'relatedId' => $entity->getId(), 'relatedType' => 'Email', ]); } } private function getStreamService(): StreamService { if (empty($this->streamService)) { $this->streamService = $this->serviceFactory->create('Stream'); } return $this->streamService; } }