bundles/Insign/FormDataBundle/Event/FormDataSavedListener.php line 243

Open in your IDE?
  1. <?php
  2. /**
  3.  * Copyright insign gmbh. All rights reserved.
  4.  * See COPYING.txt for license details.
  5.  */
  6. declare(strict_types=1);
  7. namespace Insign\FormDataBundle\Event;
  8. use Carbon\Carbon;
  9. use Insign\FormDataBundle\Model\Authorization;
  10. use Insign\FormDataBundle\Services\Api\EncryptionInterface;
  11. use Insign\FormDataBundle\Services\Constants;
  12. use Insign\FormDataBundle\Services\DataHelper;
  13. use Insign\FormDataBundle\Services\Mailer;
  14. use Insign\FormDataBundle\Services\PdfGenerator;
  15. use Insign\FormDataBundle\Services\WorkflowHandler;
  16. use Pimcore\Model\Asset;
  17. use Pimcore\Model\DataObject\Krankheitsmeldung;
  18. use Pimcore\Model\DataObject\Unfallmeldung;
  19. use Psr\Log\LoggerInterface;
  20. use Pimcore\Event\Model\ElementEventInterface;
  21. use Pimcore\Event\Model\DataObjectEvent;
  22. use Pimcore\Model\Search\Backend\Data as SearchBackendData;
  23. class FormDataSavedListener
  24. {
  25.     private $lastArtzeugnisDate;
  26.     protected Mailer $mailer;
  27.     protected EncryptionInterface $encryption;
  28.     protected PdfGenerator $pdfGenerator;
  29.     protected LoggerInterface $logger;
  30.     private DataHelper $dataHelper;
  31.     private WorkflowHandler $workflowHandler;
  32.     public function __construct(
  33.         LoggerInterface $logger,
  34.         Mailer $mailer,
  35.         DataHelper $dataHelper,
  36.         WorkflowHandler $workflowHandler,
  37.         EncryptionInterface $encryption,
  38.         PdfGenerator $pdfGenerator
  39.     ){
  40.         $this->logger $logger;
  41.         $this->mailer $mailer;
  42.         $this->encryption $encryption;
  43.         $this->pdfGenerator $pdfGenerator;
  44.         $this->dataHelper $dataHelper;
  45.         $this->workflowHandler $workflowHandler;
  46.     }
  47.     /**
  48.      * @param $sickness
  49.      * @return array
  50.      */
  51.     protected function getSicknessMedicalReports($sickness)
  52.     {
  53.         $medicalReportBlocks $sickness->getArztzeugnisse();
  54.         $doctorsCertificates = [];
  55.         foreach ($medicalReportBlocks as $medicalReportBlock) {
  56.             $reportFile $medicalReportBlock['Arztzeugnis'] ?? false;
  57.             if($reportFile) {
  58.                 $assetsId $reportFile->getData()->getInternal() ?? false;
  59.                 if($assetsId) {
  60.                     $doctorsCertificates[] = Asset::getById($assetsId);
  61.                 }
  62.             }
  63.         }
  64.         return $doctorsCertificates;
  65.     }
  66.     protected function getSicknessStartDate($sickness)
  67.     {
  68.         $startDate $sickness->getKrankheitsbeginn();
  69.         return ($startDate instanceof  Carbon) ? $startDate->format('d.m.Y') : '';
  70.     }
  71.     public function onSicknessCreate($event): void
  72.     {
  73.         $data $event->getData();
  74.         $uuid $data ['uuid'];
  75.         /** @var Krankheitsmeldung $sickness */
  76.         $sickness $data ['sickness'];
  77.         //$medicalReports = $this->getSicknessMedicalReports($sickness);
  78.         $sicknessStartDate $this->getSicknessStartDate($sickness);
  79.         $name $sickness->getVorname_erkrankte_Person().' '$sickness->getNachname_erkrankte_Person();
  80.         $email $sickness->getE_Mail_zustaendige_Person();
  81.         $url sprintf("%s%s%s"$this->encryption->getReactFormUrl(), 'auth/'$uuid);
  82.         $attachPdf $this->pdfGenerator->getPdfPath($sickness);
  83.         $subject sprintf('Krankmeldung %s vom %s'$name$sicknessStartDate);
  84.         $type = (int) $sickness->getFormular();
  85.         $template = ($type === 1) ? 'verwaltung-und-schule.html.twig' 'except-verwaltung-and-schule.html.twig';
  86.         $emailBody $this->mailer->getBody(
  87.             sprintf('@InsignFormData/email/create/sickness/%s'$template),
  88.             ['name'=>$name'start_date' => $sicknessStartDate'update_url' => $url]
  89.         );
  90.         $cc $this->mailer->getFormCCEmail();
  91.         $this->sendEmailCreate($email$emailBody$subject$attachPdf$cc);
  92.         $this->workflowHandler->processWorkflowLog($sickness7'Form user');
  93.         try {
  94.             $searchBackend = new SearchBackendData($sickness);
  95.             $searchBackend->save();
  96.         } catch (\Exception $e) {
  97.         }
  98.     }
  99.     public function onSicknessCreateFailed($event)
  100.     {
  101.     }
  102.     public function onSicknessAuthEmail($event)
  103.     {
  104.         $data $event->getData();
  105.         $uuid $data ['uuid'];
  106.         /** @var Krankheitsmeldung $sickness */
  107.         $sickness $data ['sickness'];
  108.         $expiredAt = ( new \DateTime())
  109.             ->modify(Constants::AUTH_TIME_VALIDITY)
  110.             ->format('Y-m-d H:i:s');
  111.         $sicknessStartDate $this->getSicknessStartDate($sickness);
  112.         $authorization = new Authorization();
  113.         $authorization->setUuid($uuid);
  114.         $authorization->setExpired($expiredAt);
  115.         $authorization->setLevel(1);
  116.         $authorization->setStatus(1);
  117.         $authorization->save();
  118.         $authId $authorization->getId();
  119.         $data json_encode(['uuid'=>$uuid'id' => $authId]);
  120.         $encryptedData $this->encryption->encrypt($data);
  121.         $url sprintf("%s%s%s"$this->encryption->getReactFormUrl(), 'update/krankheitsmeldung/'$encryptedData);
  122.         $name $sickness->getNachname_erkrankte_Person().' '.$sickness->getVorname_erkrankte_Person();
  123.         $email $sickness->getE_Mail_zustaendige_Person();
  124.         $subject 'Authentifizierung Fallaktualisierung Krankheitsmeldung';
  125.         $emailBody $this->mailer->getBody(
  126.             '@InsignFormData/email/update_auth.html.twig',
  127.             [
  128.                 'name' => $name,
  129.                 'date' => $sicknessStartDate,
  130.                 'uuid' => $uuid,
  131.                 'id' => $authId,
  132.                 'url' => $url
  133.             ]
  134.         );
  135.         $this->sendEmailCreate($email$emailBody$subject'');
  136.     }
  137.     public function onSicknessAuthIsValid($event)
  138.     {
  139.         $data $event->getData();
  140.         $uuid $data ['uuid'];
  141.         /** @var Krankheitsmeldung $sickness */
  142.         $sickness $data ['sickness'];
  143.         /** @var Authorization $authorization */
  144.         $authorization $data ['authorization'];
  145.         if($authorization->getLevel() == 1) {
  146.             $now = new \DateTime();
  147.             $now->modify(Constants::AUTH_TIME_UPDATE_EXPIRE);
  148.             $expiredAt $now->format('Y-m-d H:i:s');
  149.             $authorization->setLevel(2);
  150.             $authorization->setExpired($expiredAt);
  151.             $authorization->save();
  152.         }
  153.     }
  154.     /**
  155.      * This event update Arztzeugnisse_vom and Arztzeugnisse_bis field of the sickness
  156.      * @param ElementEventInterface $event
  157.      * @return void
  158.      */
  159.     public function onDataObjectPreSave(ElementEventInterface $event): void
  160.     {
  161.         if ($event instanceof DataObjectEvent) {
  162.             $sickness $event->getObject();
  163.             if($sickness instanceof Krankheitsmeldung) {
  164.                 $isPublished $sickness->isPublished();
  165.                 $this->lastArtzeugnisDate $sickness->getArztzeugnisse_bis();
  166.                 $sicknessStartDate $this->dataHelper->findSicknessDate($sicknesstruetrue);
  167.                 $validityDate $this->dataHelper->findSicknessDate($sicknessfalsetrue);
  168.                 if($sicknessStartDate instanceof  Carbon) {
  169.                     $sickness->setArztzeugnisse_vom($sicknessStartDate);
  170.                 }
  171.                 if($validityDate instanceof  Carbon) {
  172.                     $sickness->setArztzeugnisse_bis($validityDate);
  173.                 }
  174.             }
  175.         }
  176.     }
  177.     public function onDataObjectPostSave(ElementEventInterface $event): void
  178.     {
  179.         if ($event instanceof DataObjectEvent) {
  180.             $sickness $event->getObject();
  181.             if($sickness instanceof Krankheitsmeldung && $sickness->isPublished()) {
  182.                 $arztzeugnisseBis $sickness->getArztzeugnisse_bis();
  183.                 if($this->lastArtzeugnisDate instanceof Carbon && $arztzeugnisseBis->ne($this->lastArtzeugnisDate)) {
  184.                     //trigger Update in camunda
  185.                     $this->dataHelper->workflowUpdate($sickness);
  186.                 }
  187.             }
  188.         }
  189.     }
  190.     public function onSicknessAuthIsInValid()
  191.     {
  192.     }
  193.     public function onAccidentCreate($event)
  194.     {
  195.         $data $event->getData();
  196.         $uuid $data ['uuid'];
  197.         /** @var Unfallmeldung $accident */
  198.         $accident $data ['accident'];
  199.         $attachPdf $this->pdfGenerator->getPdfPath($accident);
  200.         $name $accident->getNachname_verunfallte_Person().' '$accident->getVorname_verunfallte_Person();
  201.         $email $accident->getE_Mail_meldende_Person();
  202.         $accidentStartDate $accident->getUnfalldatum()->format('d.m.Y');
  203.         $subject sprintf('Unfallmeldung %s vom %s'$name$accidentStartDate);
  204.         $emailBody $this->mailer->getBody(
  205.            '@InsignFormData/email/create/accident/create_accident.html.twig',
  206.             ['name'=>$name'start_date' => $accidentStartDate]
  207.         );
  208.         $cc $this->mailer->getFormCCEmail();
  209.         $this->sendEmailCreate($email$emailBody$subject$attachPdf$cc);
  210.         try {
  211.             $searchBackend = new SearchBackendData($accident);
  212.             $searchBackend->save();
  213.         } catch (\Exception $e) {
  214.         }
  215.     }
  216.     public function onAccidentCreateFailed($event)
  217.     {
  218.     }
  219.     public function onSicknessUpdate($event)
  220.     {
  221.     }
  222.     public function onSicknessUpdateFailed($event)
  223.     {
  224.     }
  225.     //sickness updated successfully
  226.     public function onSicknessUpdateSaved($event)
  227.     {
  228.         //update
  229.         $data $event->getData();
  230.         $uuid $data ['uuid'];
  231.         /** @var Krankheitsmeldung $sickness */
  232.         $sickness $data ['sickness'];
  233.         $sicknessStartDate =  $this->getSicknessStartDate($sickness);
  234.         $name $sickness->getVorname_erkrankte_Person().' '$sickness->getNachname_erkrankte_Person();
  235.         $email $sickness->getE_Mail_zustaendige_Person();
  236.         $subject sprintf('Statusmeldung %s '$name);
  237.         $attachPdf $this->pdfGenerator->getPdfPath($sickness);
  238.         $template 'sickness_status_update.html.twig';
  239.         $emailBody $this->mailer->getBody(
  240.             sprintf('@InsignFormData/email/%s'$template),
  241.             ['name'=>$name'start_date' => $sicknessStartDate, ]
  242.         );
  243.         $cc $this->mailer->getFormCCEmail();
  244.         $this->sendEmailCreate($email$emailBody$subject$attachPdf$cc);
  245.     }
  246.     public function sendTestEmail()
  247.     {
  248.         $this->sendEmail('insign_test_email.html.twig', ['name'=>'test''start_date' => '']);
  249.     }
  250.     public function onMaiciousFileFound($event)
  251.     {
  252.         $data $event->getData();
  253.         $uuid $data ['uuid'];
  254.         $files $data ['fileNames'];
  255.         $isJson = function($string) {
  256.             json_decode($string);
  257.             return json_last_error() === JSON_ERROR_NONE;
  258.         };
  259.         $files $isJson($files) ? implode(','json_decode($files)) : $files;
  260.         $subject 'Schädliche Datei erkannt';
  261.         $emailBody $this->mailer->getBody(
  262.             '@InsignFormData/email/malicious-file-found.html.twig',
  263.             ['uuid'=>$uuid'name' => $files]
  264.         );
  265.         $this->sendEmailCreate('anwendungen@aio.so.ch'$emailBody$subject'');
  266.     }
  267.     private function sendEmail(string $template, array $parameters, array $attachments = [], $objects ='')
  268.     {
  269.         try {
  270.             $this->mailer->setTemplate($template)
  271.                 ->setParameter($parameters)
  272.                 ->setAttachmets($attachments)
  273.                 ->send();
  274.         } catch (\Exception $e) {
  275.             $this->logger->error($e->getMessage());
  276.         }
  277.     }
  278.     private function sendEmailCreate($to$emailBody$subject$attachPdfstring $cc '')
  279.     {
  280.         $mailer $this->mailer->getEmailObject();
  281.         $mailer->subject($subject)
  282.             ->to($to)
  283.             ->html($emailBody);
  284.         if(file_exists($attachPdf)) {
  285.             $mailer->attachFromPath($attachPdfstr_replace(' ''_'$subject).'.pdf''application/pdf');
  286.         }
  287.         if($cc !== '') {
  288.             $mailer->addCc($cc);
  289.         }
  290.         try {
  291.             $mailer->send();
  292.         } catch (\Exception $e) {
  293.             $this->logger->error($e->getMessage());
  294.         }
  295.     }
  296. }