entityManager = $entityManager; $this->htmlizerFactory = $htmlizerFactory; $this->emailSender = $emailSender; $this->config = $config; $this->templateFileManager = $templateFileManager; $this->metadata = $metadata; $this->language = $language; $this->log = $log; } public function process(StdClass $data): void { $userId = $data->userId ?? null; $assignerUserId = $data->assignerUserId ?? null; $entityId = $data->entityId ?? null; $entityType = $data->entityType ?? null; if ( !$userId || !$assignerUserId || !$entityId || !$entityType ) { throw new Error(); } $user = $this->entityManager->getEntity('User', $userId); if (!$user) { return; } if ($user->isPortal()) { return; } $preferences = $this->entityManager->getEntity('Preferences', $userId); if (!$preferences) { return; } if (!$preferences->get('receiveAssignmentEmailNotifications')) { return; } $ignoreList = $preferences->get('assignmentEmailNotificationsIgnoreEntityTypeList') ?? []; if (in_array($entityType, $ignoreList)) { return; } $assignerUser = $this->entityManager->getEntity('User', $assignerUserId); $entity = $this->entityManager->getEntity($entityType, $entityId); if (!$entity) { return; } if (!$assignerUser) { return; } $this->loadParentNameFields($entity); if (!$entity->hasLinkMultipleField('assignedUsers')) { if ($entity->get('assignedUserId') !== $userId) { return; } } $emailAddress = $user->get('emailAddress'); if (!$emailAddress) { return; } $email = $this->entityManager->getEntity('Email'); $subjectTpl = $this->templateFileManager->getTemplate('assignment', 'subject', $entity->getEntityType()); $bodyTpl = $this->templateFileManager->getTemplate('assignment', 'body', $entity->getEntityType()); $subjectTpl = str_replace(["\n", "\r"], '', $subjectTpl); $recordUrl = rtrim($this->config->get('siteUrl'), '/') . '/#' . $entity->getEntityType() . '/view/' . $entity->id; $templateData = [ 'userName' => $user->get('name'), 'assignerUserName' => $assignerUser->get('name'), 'recordUrl' => $recordUrl, 'entityType' => $this->language->translate($entity->getEntityType(), 'scopeNames'), ]; $templateData['entityTypeLowerFirst'] = Util::mbLowerCaseFirst($templateData['entityType']); $subject = $this->getHtmlizer()->render( $entity, $subjectTpl, 'assignment-email-subject-' . $entity->getEntityType(), $templateData, true ); $body = $this->getHtmlizer()->render( $entity, $bodyTpl, 'assignment-email-body-' . $entity->getEntityType(), $templateData, true ); $email->set([ 'subject' => $subject, 'body' => $body, 'isHtml' => true, 'to' => $emailAddress, 'isSystem' => true, 'parentId' => $entity->id, 'parentType' => $entity->getEntityType(), ]); try { $this->emailSender->send($email); } catch (Exception $e) { $this->log->error('EmailNotification: [' . $e->getCode() . '] ' .$e->getMessage()); } } protected function getHtmlizer(): Htmlizer { if (!$this->htmlizer) { $this->htmlizer = $this->htmlizerFactory->create(true); } return $this->htmlizer; } protected function loadParentNameFields(Entity $entity): void { $fieldDefs = $this->metadata->get(['entityDefs', $entity->getEntityType(), 'fields'], []); foreach ($fieldDefs as $field => $defs) { if (isset($defs['type']) && $defs['type'] == 'linkParent') { $entity->loadParentNameField($field); } } } }