entityManager = $entityManager; $this->smtpParams = $smtpParams; $this->emailSender = $emailSender; $this->config = $config; $this->dateTime = $dateTime; $this->language = $language; $this->number = $number; $this->fileManager = $fileManager; $this->templateFileManager = $templateFileManager; $this->htmlizerFactory = $htmlizerFactory; } public function sendInvitation(Entity $entity, Entity $invitee, string $link): void { $uid = $this->entityManager->getNewEntity('UniqueId'); $uid->set('data', [ 'eventType' => $entity->getEntityType(), 'eventId' => $entity->getId(), 'inviteeId' => $invitee->getId(), 'inviteeType' => $invitee->getEntityType(), 'link' => $link, ]); if ($entity->get('dateEnd')) { $terminateAt = $entity->get('dateEnd'); } else { $dt = new DateTime(); $dt->modify('+1 month'); $terminateAt = $dt->format('Y-m-d H:i:s'); } $uid->set([ 'targetId' => $entity->getId(), 'targetType' => $entity->getEntityType(), 'terminateAt' => $terminateAt, ]); $this->entityManager->saveEntity($uid); $emailAddress = $invitee->get('emailAddress'); if (empty($emailAddress)) { return; } $email = $this->entityManager->getNewEntity('Email'); $email->set('to', $emailAddress); $subjectTpl = $this->templateFileManager->getTemplate('invitation', 'subject', $entity->getEntityType(), 'Crm'); $bodyTpl = $this->templateFileManager->getTemplate('invitation', 'body', $entity->getEntityType(), 'Crm'); $subjectTpl = str_replace(["\n", "\r"], '', $subjectTpl); $data = []; $siteUrl = rtrim($this->config->get('siteUrl'), '/'); $recordUrl = $siteUrl . '/#' . $entity->getEntityType() . '/view/' . $entity->getId(); $data['recordUrl'] = $recordUrl; $data['acceptLink'] = $siteUrl . '?entryPoint=eventConfirmation&action=accept&uid=' . $uid->get('name'); $data['declineLink'] = $siteUrl . '?entryPoint=eventConfirmation&action=decline&uid=' . $uid->get('name'); $data['tentativeLink'] = $siteUrl . '?entryPoint=eventConfirmation&action=tentative&uid=' . $uid->get('name'); if ($invitee instanceof User) { $data['isUser'] = true; $htmlizer = $this->htmlizerFactory->createForUser($invitee); } else { $htmlizer = $this->htmlizerFactory->createNoAcl(); } $data['inviteeName'] = $invitee->get('name'); $data['entityType'] = $this->language->translateLabel($entity->getEntityType(), 'scopeNames'); $data['entityTypeLowerFirst'] = Util::mbLowerCaseFirst($data['entityType']); $subject = $htmlizer->render( $entity, $subjectTpl, 'invitation-email-subject-' . $entity->getEntityType(), $data, true, true ); $body = $htmlizer->render( $entity, $bodyTpl, 'invitation-email-body-' . $entity->getEntityType(), $data, false, true ); $email->set('subject', $subject); $email->set('body', $body); $email->set('isHtml', true); $attachmentName = ucwords($this->language->translateLabel($entity->getEntityType(), 'scopeNames')) . '.ics'; $attachment = $this->entityManager->getNewEntity('Attachment'); $attachment->set([ 'name' => $attachmentName, 'type' => 'text/calendar', 'contents' => $this->getIcsContents($entity), ]); $message = new Message(); $sender = $this->emailSender->create(); if ($this->smtpParams) { $sender->withSmtpParams($this->smtpParams); } $sender ->withMessage($message) ->withAttachments([$attachment]) ->send($email); } protected function getIcsContents(Entity $entity): string { $user = $this->entityManager ->getRDBRepository($entity->getEntityType()) ->getRelation($entity, 'assignedUser') ->findOne(); $who = ''; $email = ''; if ($user) { $who = $user->get('name'); $email = $user->get('emailAddress'); } $ics = new Ics('//EspoCRM//EspoCRM Calendar//EN', [ 'startDate' => strtotime($entity->get('dateStart')), 'endDate' => strtotime($entity->get('dateEnd')), 'uid' => $entity->getId(), 'summary' => $entity->get('name'), 'who' => $who, 'email' => $email, 'description' => $entity->get('description'), ]); return $ics->get(); } }