<?php
namespace App\Library\Subscribers;
use App\Library\Database;
use App\Library\Event\GrapperProcessEvent;
use App\Library\Event\statisticEvent;
use App\Library\Mailer as MailHandler;
use App\models\acount;
use App\models\grapperStatistik;
use DateInterval;
use DateTime;
use Doctrine\DBAL\Exception;
use Exception as CoreException;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
use Symfony\Component\Mime\Email;
use Twig\Environment;
use Twig\Error\LoaderError;
use Twig\Error\RuntimeError;
use Twig\Error\SyntaxError;
use Twig\Loader\ArrayLoader;
class StatisticSubscriber implements EventSubscriberInterface
{
const STATISTICS_TEMPLATE = __DIR__ . '/../../templates/statistics.html.twig';
/**
* @return array[]
*/
public static function getSubscribedEvents():array
{
return [
statisticEvent::EVENT=>[
['runStatistics',1000],
],
GrapperProcessEvent::EVENT_STATISTIC=>[
['createStatistic', 1000],
]
];
}
/**
* @param Database $database
* @param MailHandler $mailer
*/
public function __construct(
private readonly Database $database,
private readonly MailHandler $mailer
){
}
/**
* @param GrapperProcessEvent $event
* @return void
*/
public function createStatistic(GrapperProcessEvent $event):void
{
$statistics = new grapperStatistik(null, $event->getCustomerId(), $event->getAddressId());
$this->database->insert(grapperStatistik::CREATE_STATISTIC,$statistics->toInserArray());
}
/**
* @throws TransportExceptionInterface
* @throws RuntimeError
* @throws LoaderError
* @throws SyntaxError
* @throws Exception
* @throws CoreException
*/
public function runStatistics(statisticEvent $event):void{
$this->mailer->initFree($_ENV['MAILER_DSN']);
$stmt = $this->database->getConnection()->prepare(acount::GET_ALL_GRAPPER_CUSTOMERS);
$resultSet = $stmt->executeQuery();
$loader = new ArrayLoader(
[
'html.twig'=>file_get_contents(self::STATISTICS_TEMPLATE)
]
);
$twig = new Environment($loader, [
'cache'=>__DIR__.'/../../var/twig',
]);
$now = new DateTime();
$delta = new DateInterval('P7D');
$now->sub($delta);
while($row = $resultSet->fetchAssociative()){
$stmt = $this->database->getConnection()->prepare(grapperStatistik::FETCH_STATISTICS);
$stmt->bindValue(1, $now->format('Y-m-d H:i:s'));
$stmt->bindValue(2, $row['ID']);
$rowResultSet = $stmt->executeQuery();
$dataArray = [];
while($arrayResult = $rowResultSet->fetchAssociative()){
$date = new DateTime($arrayResult['created']);
$dateString = $date->format('d.m.Y');
if(!array_key_exists($dateString, $dataArray)){
$dataArray[$dateString] = [
'events'=>0,
'calls'=>0,
'mailsSent'=>0,
];
}
$dataArray[$dateString]['events'] += (int)$arrayResult['event_count'];
$dataArray[$dateString]['calls'] += (int)$arrayResult['meldemodul_call'];
$dataArray[$dateString]['mailsSent']++;
}
$templateData = [
'Name'=>$row['Name'],
'Vorname'=>$row['Vorname'],
'Firma'=>$row['Firma'],
'Strasse'=>$row['Strasse'],
'Plz'=>$row['Plz'],
'Ort'=>$row['Ort'],
'Land'=>$row['Land'],
'Statistics'=>$dataArray
];
$mail = $twig->render('html.twig', $templateData);
$email = new Email();
$email->to(MailHandler::TEAM_ADDRESS);
//$email->to($row['EMail']);
$email->subject('Event Scout Übersicht der letzten Woche');
$email->html($mail);
$email->from(MailHandler::NO_REPLY);
$email->addReplyTo(MailHandler::SUPPORT);
$this->mailer->getMailer()->send($email);
}
}
}