OpenXE/classes/Modules/Ticket/Importer/InboxTicketImporter.php
2021-05-21 08:49:41 +02:00

166 lines
4.7 KiB
PHP

<?php
declare(strict_types=1);
namespace Xentral\Modules\Ticket\Importer;
use DateTimeInterface;
use Xentral\Components\MailClient\Client\MailClientInterface;
use Xentral\Modules\SystemMailer\Data\EmailBackupAccount;
use Xentral\Modules\Ticket\Service\TicketGateway;
use Xentral\Modules\Ticket\Service\TicketService;
use Xentral\Modules\Ticket\Wrapper\EmailBackupWrapper;
class InboxTicketImporter
{
/** @var TicketGateway $gateway */
private $gateway;
/** @var TicketService $service */
private $service;
/** @var TicketFormatter $formatter */
private $formatter;
/** @var EmailBackupWrapper $emailBackupService */
private $emailBackupService;
/**
* @param TicketGateway $gateway
* @param TicketService $service
* @param TicketFormatter $formatter
* @param EmailBackupWrapper $emailBackupService
*/
public function __construct(
TicketGateway $gateway,
TicketService $service,
TicketFormatter $formatter,
EmailBackupWrapper $emailBackupService
) {
$this->gateway = $gateway;
$this->service = $service;
$this->formatter = $formatter;
$this->emailBackupService = $emailBackupService;
}
/**
* @param MailClientInterface $client
* @param DateTimeInterface|null $fromDate
*
* @return string[]|array
*/
public function searchImportableEmails(MailClientInterface $client, DateTimeInterface $fromDate = null): array
{
if ($fromDate !== null) {
$criteria = sprintf('UNSEEN SINCE %s', $fromDate->format('d-M-Y'));
} else {
$criteria = 'UNSEEN';
}
return $client->searchMessages($criteria);
}
/**
* @param EmailBackupAccount $mailAccount
* @param MailClientInterface $client
* @param int $messageId
* @param int $userId
*
* @return void
*/
public function importTicket(
EmailBackupAccount $mailAccount,
MailClientInterface $client,
int $messageId,
int $userId
): void {
//fetch message
$message = $client->fetchMessage($messageId);
//format several values
$sender = $message->getSender()->getEmail();
$subject = $message->getSubject();
$timestamp = $message->getDate()->getTimestamp();
$attachments = $message->getAttachments();
$plainText = $message->getPlainTextBody();
if ($plainText === null) {
$plainText = '';
}
$htmlText = $message->getHtmlBody();
if (empty($htmlText)) {
$htmlText = nl2br($plainText);
}
if (
$this->emailBackupService->existsEmailBackup(
$mailAccount->getId(),
$sender,
$subject,
$timestamp
)
) {
$emailBackupId = $this->emailBackupService->createEmailBackup(
$mailAccount->getId(),
$subject,
$sender,
$plainText,
$htmlText,
$timestamp,
count($attachments) > 0
);
//TODO: store attachment files (filesystem)
}
//extract ticket number from email subject
$ticketNumber = $this->tryGetTicketNumberFromSubject($subject);
if ($ticketNumber !== null && !$this->gateway->existsTicketNumber($ticketNumber)) {
$projectId = $mailAccount->getProjectId() !== 0
? $mailAccount->getProjectId()
: 1;
$ticketId = $this->service->createTicket();
}
if ($ticketNumber !== null) {
$this->service->addTicketMessage(
$ticketNumber,
$timestamp,
$htmlText,
$subject,
$message->getSender()->getName(),
$message->getSender()->getEmail(),
TicketGateway::STATUS_NEW,
$message->getSender()->getName(),
$message->getReplyToAddress()
);
}
//if the email was a ticket related mark the emailbackup as ticket related
if ($ticketNumber !== null) {
//mark emailbackup as ticketmessage
//save ticket headers
}
if (/* autoresponder is active */true) {
//send autoresponse
}
if (/* email delete is active */true) {
//delete email
}
}
/**
* @param string $subject
*
* @return string|null
*/
private function tryGetTicketNumberFromSubject(string $subject): ?string
{
if (!preg_match("/Ticket #(\d{12})/i", $subject, $matches)) {
return null;
}
return $matches[1];
}
}