<?php
namespace App\EventSubscriber;
use Pimcore\Db;
use Pimcore\Mail;
use Knp\Snappy\Pdf;
use Knp\Snappy\Image;
use Pimcore\Model\Asset;
use App\Service\EmailService;
use App\Service\TwitterService;
use App\Service\NotificationService;
use Pimcore\Model\DataObject\Report;
use Pimcore\Model\DataObject\Customer;
use Pimcore\Event\Model\DataObjectEvent;
use Symfony\Component\Templating\EngineInterface;
use App\C2IntegrationBundle\Service\C2Service;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class ReportEventListener
{
private $c2Service;
public function __construct(protected NotificationService $notificationService, private EmailService $emailService, private Pdf $snappy, private TwitterService $twitterService, private Image $snappyImage, private EngineInterface $twig)
{
$this->c2Service = new C2Service();
}
public function onObjectPublish(DataObjectEvent $event)
{
$object = $event->getObject();
$tokens = [];
if (($object instanceof Report) && ($object->isPublished(true)) && ($object->getIsMannedReport() !== true)) {
$reportType = $object->getReportType()?->getName() ?? 'Historical Report';
$organizations = $object->getOrganization();
if ($organizations) {
foreach ($organizations as $organization) {
$users = Customer::getByOrganization($organization);
foreach ($users as $user) {
if ($user?->getDeviceToken()) {
$tokens[] = $user->getDeviceToken();
}
}
}
} else {
$db = Db::get();
$select = $db->createQueryBuilder();
$select->select('customer.deviceToken');
$select->from('object_query_customer', 'customer');
$select->innerJoin('customer', 'object_query_user_role', 'userRole', 'userRole.oo_id = customer.role__id');
$select->andWhere("userRole.name = " . $db->quote(USER_ROLES['CLIENT_ADMIN']) . " OR userRole.name = " . $db->quote(USER_ROLES['CLIENT_USER']));
$select->andWhere("customer.deviceToken != " . $db->quote(null));
$result = $db->fetchAllAssociative($select);
$deviceTokens = array_column($result, 'deviceToken');
foreach ($deviceTokens as $user) {
$tokens[] = $user;
}
}
if (!empty($tokens)) {
$this->notificationService->sendNotification('Report', 'NCM Has published ' . $reportType, $tokens);
}
if ($reportType != 'Historical Report') {
// $fileName = '_custom_weather_report.pdf';
// $reportPath = '/report/ReportPdf';
// if ($object->getReportType()?->getKey() == 'MannForecastReport') {
// $template = 'pdf/report_pdf_template.html.twig';
// }elseif ($object->getReportType()?->getKey() == 'advance-custom-weather-report') {
// $template = 'pdf/advance_custom_report_pdf_template.html.twig';
// $fileName = '_advance_custom_weather_report.pdf';
// $reportPath = '/report/advanceCustomReportPdf';
// }else {
// $template = 'pdf/automatic_report_pdf_template.html.twig';
// }
// new code added for new templates start
// Determine the template and path based on the report type
$templates = [
'arabian-gulf-report' => 'pdfReportTemplates/arabian-gulf-report.html.twig',
'red-sea-report' => 'pdfReportTemplates/red-sea-report.html.twig',
'custom-weather-report' => 'pdfReportTemplates/custom-weather-report.html.twig',
'10-day-forecast-report' => 'pdfReportTemplates/ten-day-forecast-report.html.twig',
'mashaer-weather-report' => 'pdfReportTemplates/mashaer-weather-report.html.twig',
'advance-custom-weather-report' => 'pdfReportTemplates/advance-custom-weather-report.html.twig',
];
$defaultTemplate = 'pdfReportTemplates/automatic_report_pdf_template.html.twig';
$reportKey = $object->getReportType()?->getReportkey();
$template = $templates[$reportKey] ?? $defaultTemplate;
// Determine report path
$reportPaths = [
'red-sea-report' => '/report/advanceCustomReportPdf',
'custom-weather-report' => '/report/advanceCustomReportPdf',
'10-day-forecast-report' => '/report/advanceCustomReportPdf',
'mashaer-weather-report' => '/report/advanceCustomReportPdf',
'advance-custom-weather-report' => '/report/advanceCustomReportPdf',
];
$reportPath = $reportPaths[$reportKey] ?? '/report/ReportPdf';
// new code added for new templates end
$parameter = [
'data' => $object,
'reportTitleEn' => $object->getReportTitle('en'),
'reportTitleAr' => $object->getReportTitle('ar'),
'reportDescriptionEn' => $object->getDescription('en'),
'reportDescriptionAr' => $object->getDescription('ar'),
'reportDisclaimerEn' => $object->getReportDisclaimer('en'), // new
'reportDisclaimerAr' => $object->getReportDisclaimer('ar'), // new
'additionalNoteEn' => $object->getAdditionalNote('en'), // new
'additionalNoteAr' => $object->getAdditionalNote('ar'), // new
'stateOfTheSeaEn' => $object->getStateOfTheSea('en'), // new
'stateOfTheSeaAr' => $object->getStateOfTheSea('ar'), // new
'waveHeightEn' => $object->getWaveHeight('en'), // new
'waveHeightAr' => $object->getWaveHeight('ar'), // new
'surfaceWindEn' => $object->getSurfaceWind('en'), // new
'surfaceWindAr' => $object->getSurfaceWind('ar'), // new
'publishOnPdf' => $object->getPublishOnPdf() == true ? true : false, // new
'reportType' => $object->getReportType()?->getReportkey(),
'template' => $template,
];
$language = ['en', 'ar'];
$pdfasset = [];
foreach ($language as $lang) {
$parameter['lang'] = $lang;
$pdf = \App\Lib\Utility::generatePdf($parameter, $this->snappy);
// new code added for new templates start
// Set file name and report path
$pdfReportName = ($object->getReportType()?->getName($lang) ?? 'Report') . '_' . date('d-m-Y') . '_' . rand(0, 10000) . '_' . time() . '.pdf';
$reportPath .= '/emails/' . $object->getId();
// new code added for new templates end
$asset = \App\Lib\Utility::createAsset($pdf, $pdfReportName, $reportPath);
if ($asset instanceof Asset) {
$pdfasset[$lang] = $asset;
} else {
$pdfasset[$lang] = '';
}
}
// $object->setAssetAr($pdfasset['ar']);
// $object->setAsset($pdfasset['en']);
$object->save();
}
$emails = [];
if ($object->getEmails()) {
$email = explode(",", $object->getEmails());
$emails = array_merge($email, $emails);
}
if ($object->getSendEmail()) {
if ($organizations) {
foreach ($organizations as $organization) {
$users = Customer::getByOrganization($organization);
foreach ($users as $user) {
if ($user?->getEmail()) {
$emails[] = $user->getEmail();
}
}
}
}
}
if ($emails) {
foreach ($emails as $email) {
$emailAlertTemplate = '/email/report_email';
$param = [
'body' => 'NCM Has published ' . $reportType
];
$purpose = REPORT_MESSAGE;
$html = $this->twig->render('email/report_email_template.html.twig', $param);
$mailSent = $this->c2Service->sendCustomReportEmail($_ENV['CUSTOM_REPORT_TEMPLATE'], $object->getId(), $email, $html, $subject = "اشعار مخصص لتوقع حالة طقس معرفة مسبقاً", [$pdfasset['en'], $pdfasset['ar']], $purpose);
// $mailSent = $this->emailService->sendMail($param, $email, $emailAlertTemplate, $subject = "اشعار مخصص لتوقع حالة طقس معرفة مسبقاً", [$pdfasset['en']->getData(), $pdfasset['ar']->getData()],[$pdfasset['en']->getFilename(),$pdfasset['ar']->getFilename()],[$pdfasset['en']->getMimeType(), $pdfasset['ar']->getMimeType()]);
}
$pdfasset['en']->delete();
$pdfasset['ar']->delete();
}
if ($object->getForTwitterChannel()) {
$parameter = [
'data' => $object,
'reportTitleEn' => $object->getReportTitle('en'),
'reportTitleAr' => $object->getReportTitle('ar'),
'reportDescriptionEn' => $object->getDescription('en'),
'reportDescriptionAr' => $object->getDescription('ar'),
'reportDisclaimerEn' => $object->getReportDisclaimer('en'), // new
'reportDisclaimerAr' => $object->getReportDisclaimer('ar'), // new
'additionalNoteEn' => $object->getAdditionalNote('en'), // new
'additionalNoteAr' => $object->getAdditionalNote('ar'), // new
'stateOfTheSeaEn' => $object->getStateOfTheSea('en'), // new
'stateOfTheSeaAr' => $object->getStateOfTheSea('ar'), // new
'waveHeightEn' => $object->getWaveHeight('en'), // new
'waveHeightAr' => $object->getWaveHeight('ar'), // new
'surfaceWindEn' => $object->getSurfaceWind('en'), // new
'surfaceWindAr' => $object->getSurfaceWind('ar'), // new
'publishOnPdf' => $object->getPublishOnPdf() == true ? true : false, // new
'lang' => 'ar'
];
// if ($object->getReportType()?->getKey() == 'advance-custom-weather-report') {
// $templateImage = 'pdf/advance_custom_report_pdf_template.html.twig';
// $fileName = '_advance_custom_weather_report.pdf';
// $reportPath = '/report/advanceCustomReportPdf';
// }else {
// $templateImage = 'pdf/automatic_report_pdf_template.html.twig';
// }
// new code added for new templates start
// Determine the template and path based on the report type
$templateImage = [
'arabian-gulf-report' => 'pdfReportTemplates/arabian-gulf-report.html.twig',
'red-sea-report' => 'pdfReportTemplates/red-sea-report.html.twig',
'custom-weather-report' => 'pdfReportTemplates/custom-weather-report.html.twig',
'10-day-forecast-report' => 'pdfReportTemplates/ten-day-forecast-report.html.twig',
'mashaer-weather-report' => 'pdfReportTemplates/mashaer-weather-report.html.twig',
'advance-custom-weather-report' => 'pdfReportTemplates/advance-custom-weather-report.html.twig',
];
// new code added for new templates end
$defaultTemplate = 'pdfReportTemplates/automatic_report_pdf_template.html.twig';
$reportKey = $object->getReportType()?->getReportkey();
$templateImage = $templateImage[$reportKey] ?? $defaultTemplate;
$html = $this->twig->render($templateImage, $parameter);
$this->snappyImage->setOption('enable-local-file-access', true);
$this->snappyImage->setOption('width', '2500');
$this->snappyImage->setOption('height', '2500');
$this->snappyImage->setOption('format', 'jpeg');
// $this->snappyImage->setOption('transparent', true);
$image = $this->snappyImage->getOutputFromHtml($html);
$asset = \App\Lib\Utility::createAsset($image, rand(0, 10000) . '_' . time() . '_custom_weather_report.jpeg', 'ReportImages');
$asset_path = PIMCORE_PROJECT_ROOT . '/public/var/assets' . $asset->getPath() . $asset->getFileName();
$media_id = $this->twitterService->uploadMedia($asset_path, 'Custom Weather Report has Published');
if ($media_id) {
// $this->twitterService->postTweet('Custom Weather Report has Published.', $media_id["result"]);
$asset->delete();
}
}
}
}
}