<?php
/**
* Copyright insign gmbh. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);
namespace Insign\FormDataBundle\Event;
use Carbon\Carbon;
use Insign\FormDataBundle\Model\Authorization;
use Insign\FormDataBundle\Services\Api\EncryptionInterface;
use Insign\FormDataBundle\Services\Constants;
use Insign\FormDataBundle\Services\DataHelper;
use Insign\FormDataBundle\Services\Mailer;
use Insign\FormDataBundle\Services\PdfGenerator;
use Insign\FormDataBundle\Services\WorkflowHandler;
use Pimcore\Model\Asset;
use Pimcore\Model\DataObject\Krankheitsmeldung;
use Pimcore\Model\DataObject\Unfallmeldung;
use Psr\Log\LoggerInterface;
use Pimcore\Event\Model\ElementEventInterface;
use Pimcore\Event\Model\DataObjectEvent;
use Pimcore\Model\Search\Backend\Data as SearchBackendData;
class FormDataSavedListener
{
private $lastArtzeugnisDate;
protected Mailer $mailer;
protected EncryptionInterface $encryption;
protected PdfGenerator $pdfGenerator;
protected LoggerInterface $logger;
private DataHelper $dataHelper;
private WorkflowHandler $workflowHandler;
public function __construct(
LoggerInterface $logger,
Mailer $mailer,
DataHelper $dataHelper,
WorkflowHandler $workflowHandler,
EncryptionInterface $encryption,
PdfGenerator $pdfGenerator
){
$this->logger = $logger;
$this->mailer = $mailer;
$this->encryption = $encryption;
$this->pdfGenerator = $pdfGenerator;
$this->dataHelper = $dataHelper;
$this->workflowHandler = $workflowHandler;
}
/**
* @param $sickness
* @return array
*/
protected function getSicknessMedicalReports($sickness)
{
$medicalReportBlocks = $sickness->getArztzeugnisse();
$doctorsCertificates = [];
foreach ($medicalReportBlocks as $medicalReportBlock) {
$reportFile = $medicalReportBlock['Arztzeugnis'] ?? false;
if($reportFile) {
$assetsId = $reportFile->getData()->getInternal() ?? false;
if($assetsId) {
$doctorsCertificates[] = Asset::getById($assetsId);
}
}
}
return $doctorsCertificates;
}
protected function getSicknessStartDate($sickness)
{
$startDate = $sickness->getKrankheitsbeginn();
return ($startDate instanceof Carbon) ? $startDate->format('d.m.Y') : '';
}
public function onSicknessCreate($event): void
{
$data = $event->getData();
$uuid = $data ['uuid'];
/** @var Krankheitsmeldung $sickness */
$sickness = $data ['sickness'];
//$medicalReports = $this->getSicknessMedicalReports($sickness);
$sicknessStartDate = $this->getSicknessStartDate($sickness);
$name = $sickness->getVorname_erkrankte_Person().' '. $sickness->getNachname_erkrankte_Person();
$email = $sickness->getE_Mail_zustaendige_Person();
$url = sprintf("%s%s%s", $this->encryption->getReactFormUrl(), 'auth/', $uuid);
$attachPdf = $this->pdfGenerator->getPdfPath($sickness);
$subject = sprintf('Krankmeldung %s vom %s', $name, $sicknessStartDate);
$type = (int) $sickness->getFormular();
$template = ($type === 1) ? 'verwaltung-und-schule.html.twig' : 'except-verwaltung-and-schule.html.twig';
$emailBody = $this->mailer->getBody(
sprintf('@InsignFormData/email/create/sickness/%s', $template),
['name'=>$name, 'start_date' => $sicknessStartDate, 'update_url' => $url]
);
$cc = $this->mailer->getFormCCEmail();
$this->sendEmailCreate($email, $emailBody, $subject, $attachPdf, $cc);
$this->workflowHandler->processWorkflowLog($sickness, 7, 'Form user');
try {
$searchBackend = new SearchBackendData($sickness);
$searchBackend->save();
} catch (\Exception $e) {
}
}
public function onSicknessCreateFailed($event)
{
}
public function onSicknessAuthEmail($event)
{
$data = $event->getData();
$uuid = $data ['uuid'];
/** @var Krankheitsmeldung $sickness */
$sickness = $data ['sickness'];
$expiredAt = ( new \DateTime())
->modify(Constants::AUTH_TIME_VALIDITY)
->format('Y-m-d H:i:s');
$sicknessStartDate = $this->getSicknessStartDate($sickness);
$authorization = new Authorization();
$authorization->setUuid($uuid);
$authorization->setExpired($expiredAt);
$authorization->setLevel(1);
$authorization->setStatus(1);
$authorization->save();
$authId = $authorization->getId();
$data = json_encode(['uuid'=>$uuid, 'id' => $authId]);
$encryptedData = $this->encryption->encrypt($data);
$url = sprintf("%s%s%s", $this->encryption->getReactFormUrl(), 'update/krankheitsmeldung/', $encryptedData);
$name = $sickness->getNachname_erkrankte_Person().' '.$sickness->getVorname_erkrankte_Person();
$email = $sickness->getE_Mail_zustaendige_Person();
$subject = 'Authentifizierung Fallaktualisierung Krankheitsmeldung';
$emailBody = $this->mailer->getBody(
'@InsignFormData/email/update_auth.html.twig',
[
'name' => $name,
'date' => $sicknessStartDate,
'uuid' => $uuid,
'id' => $authId,
'url' => $url
]
);
$this->sendEmailCreate($email, $emailBody, $subject, '');
}
public function onSicknessAuthIsValid($event)
{
$data = $event->getData();
$uuid = $data ['uuid'];
/** @var Krankheitsmeldung $sickness */
$sickness = $data ['sickness'];
/** @var Authorization $authorization */
$authorization = $data ['authorization'];
if($authorization->getLevel() == 1) {
$now = new \DateTime();
$now->modify(Constants::AUTH_TIME_UPDATE_EXPIRE);
$expiredAt = $now->format('Y-m-d H:i:s');
$authorization->setLevel(2);
$authorization->setExpired($expiredAt);
$authorization->save();
}
}
/**
* This event update Arztzeugnisse_vom and Arztzeugnisse_bis field of the sickness
* @param ElementEventInterface $event
* @return void
*/
public function onDataObjectPreSave(ElementEventInterface $event): void
{
if ($event instanceof DataObjectEvent) {
$sickness = $event->getObject();
if($sickness instanceof Krankheitsmeldung) {
$isPublished = $sickness->isPublished();
$this->lastArtzeugnisDate = $sickness->getArztzeugnisse_bis();
$sicknessStartDate = $this->dataHelper->findSicknessDate($sickness, true, true);
$validityDate = $this->dataHelper->findSicknessDate($sickness, false, true);
if($sicknessStartDate instanceof Carbon) {
$sickness->setArztzeugnisse_vom($sicknessStartDate);
}
if($validityDate instanceof Carbon) {
$sickness->setArztzeugnisse_bis($validityDate);
}
}
}
}
public function onDataObjectPostSave(ElementEventInterface $event): void
{
if ($event instanceof DataObjectEvent) {
$sickness = $event->getObject();
if($sickness instanceof Krankheitsmeldung && $sickness->isPublished()) {
$arztzeugnisseBis = $sickness->getArztzeugnisse_bis();
if($this->lastArtzeugnisDate instanceof Carbon && $arztzeugnisseBis->ne($this->lastArtzeugnisDate)) {
//trigger Update in camunda
$this->dataHelper->workflowUpdate($sickness);
}
}
}
}
public function onSicknessAuthIsInValid()
{
}
public function onAccidentCreate($event)
{
$data = $event->getData();
$uuid = $data ['uuid'];
/** @var Unfallmeldung $accident */
$accident = $data ['accident'];
$attachPdf = $this->pdfGenerator->getPdfPath($accident);
$name = $accident->getNachname_verunfallte_Person().' '. $accident->getVorname_verunfallte_Person();
$email = $accident->getE_Mail_meldende_Person();
$accidentStartDate = $accident->getUnfalldatum()->format('d.m.Y');
$subject = sprintf('Unfallmeldung %s vom %s', $name, $accidentStartDate);
$emailBody = $this->mailer->getBody(
'@InsignFormData/email/create/accident/create_accident.html.twig',
['name'=>$name, 'start_date' => $accidentStartDate]
);
$cc = $this->mailer->getFormCCEmail();
$this->sendEmailCreate($email, $emailBody, $subject, $attachPdf, $cc);
try {
$searchBackend = new SearchBackendData($accident);
$searchBackend->save();
} catch (\Exception $e) {
}
}
public function onAccidentCreateFailed($event)
{
}
public function onSicknessUpdate($event)
{
}
public function onSicknessUpdateFailed($event)
{
}
//sickness updated successfully
public function onSicknessUpdateSaved($event)
{
//update
$data = $event->getData();
$uuid = $data ['uuid'];
/** @var Krankheitsmeldung $sickness */
$sickness = $data ['sickness'];
$sicknessStartDate = $this->getSicknessStartDate($sickness);
$name = $sickness->getVorname_erkrankte_Person().' '. $sickness->getNachname_erkrankte_Person();
$email = $sickness->getE_Mail_zustaendige_Person();
$subject = sprintf('Statusmeldung %s ', $name);
$attachPdf = $this->pdfGenerator->getPdfPath($sickness);
$template = 'sickness_status_update.html.twig';
$emailBody = $this->mailer->getBody(
sprintf('@InsignFormData/email/%s', $template),
['name'=>$name, 'start_date' => $sicknessStartDate, ]
);
$cc = $this->mailer->getFormCCEmail();
$this->sendEmailCreate($email, $emailBody, $subject, $attachPdf, $cc);
}
public function sendTestEmail()
{
$this->sendEmail('insign_test_email.html.twig', ['name'=>'test', 'start_date' => '']);
}
public function onMaiciousFileFound($event)
{
$data = $event->getData();
$uuid = $data ['uuid'];
$files = $data ['fileNames'];
$isJson = function($string) {
json_decode($string);
return json_last_error() === JSON_ERROR_NONE;
};
$files = $isJson($files) ? implode(',', json_decode($files)) : $files;
$subject = 'Schädliche Datei erkannt';
$emailBody = $this->mailer->getBody(
'@InsignFormData/email/malicious-file-found.html.twig',
['uuid'=>$uuid, 'name' => $files]
);
$this->sendEmailCreate('anwendungen@aio.so.ch', $emailBody, $subject, '');
}
private function sendEmail(string $template, array $parameters, array $attachments = [], $objects ='')
{
try {
$this->mailer->setTemplate($template)
->setParameter($parameters)
->setAttachmets($attachments)
->send();
} catch (\Exception $e) {
$this->logger->error($e->getMessage());
}
}
private function sendEmailCreate($to, $emailBody, $subject, $attachPdf, string $cc = '')
{
$mailer = $this->mailer->getEmailObject();
$mailer->subject($subject)
->to($to)
->html($emailBody);
if(file_exists($attachPdf)) {
$mailer->attachFromPath($attachPdf, str_replace(' ', '_', $subject).'.pdf', 'application/pdf');
}
if($cc !== '') {
$mailer->addCc($cc);
}
try {
$mailer->send();
} catch (\Exception $e) {
$this->logger->error($e->getMessage());
}
}
}