4 Commits 76f03400c4 ... 4b545c7787

Autore SHA1 Messaggio Data
  Medowar 4b545c7787 adding correct recipients 2 settimane fa
  Medowar b61e2818e3 changing it to be in config, not form itself 2 settimane fa
  Medowar a8b01ece1a implementing additional notifications based on field type 2 settimane fa
  AI afe69f1277 adding favicon 1 mese fa
6 ha cambiato i file con 64 aggiunte e 8 eliminazioni
  1. 16 0
      config/form_schema.php
  2. BIN
      favicon.png
  3. 1 0
      index.php
  4. 5 6
      src/form/validator.php
  5. 23 0
      src/mail/mailer.php
  6. 19 2
      src/mail/mimemailbuilder.php

+ 16 - 0
config/form_schema.php

@@ -3,6 +3,22 @@
 declare(strict_types=1);
 
 return [
+    'additional_notifications' => [
+        [
+            'condition' => [
+                'field' => 'mitgliedsart',
+                'equals' => 'Jugend',
+            ],
+            'cc' => ['jugendwartteam@feuerwehr-freising.de'],
+        ],
+        [
+            'condition' => [
+                'field' => 'mitgliedsart',
+                'equals' => 'Spielmannszug',
+            ],
+            'cc' => ['fuehrung.spielmannszug@feuerwehr-freising.de'],
+        ],
+    ],
     'steps' => [
         [
             'title' => 'Persönliche Daten',

BIN
favicon.png


+ 1 - 0
index.php

@@ -210,6 +210,7 @@ function renderField(array $field, string $addressDisclaimerText): void
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width, initial-scale=1">
     <title><?= htmlspecialchars((string) $app['project_name']) ?></title>
+    <link rel="shortcut icon" href="favicon.png">
     <link rel="stylesheet" href="<?= htmlspecialchars(Bootstrap::url('assets/css/tokens.css')) ?>">
     <link rel="stylesheet" href="<?= htmlspecialchars(Bootstrap::url('assets/css/base.css')) ?>">
 </head>

+ 5 - 6
src/form/validator.php

@@ -101,7 +101,7 @@ final class Validator
             return false;
         }
 
-        return $this->ruleMatches($field['required_if'], $data);
+        return $this->evaluateCondition($field['required_if'], $data);
     }
 
     /** @param array<string, mixed> $field */
@@ -111,11 +111,10 @@ final class Validator
             return true;
         }
 
-        return $this->ruleMatches($field['visible_if'], $data);
+        return $this->evaluateCondition($field['visible_if'], $data);
     }
 
-    /** @param array<string, mixed> $rule */
-    private function ruleMatches(array $rule, array $data): bool
+    public function evaluateCondition(array $rule, array $data): bool
     {
         $sourceField = (string) ($rule['field'] ?? '');
         $equals = (string) ($rule['equals'] ?? '');
@@ -180,11 +179,11 @@ final class Validator
     /** @param array<string, mixed> $option */
     private function isOptionVisible(array $option, array $data): bool
     {
-        if (isset($option['visible_if']) && is_array($option['visible_if']) && !$this->ruleMatches($option['visible_if'], $data)) {
+        if (isset($option['visible_if']) && is_array($option['visible_if']) && !$this->evaluateCondition($option['visible_if'], $data)) {
             return false;
         }
 
-        if (isset($option['hidden_if']) && is_array($option['hidden_if']) && $this->ruleMatches($option['hidden_if'], $data)) {
+        if (isset($option['hidden_if']) && is_array($option['hidden_if']) && $this->evaluateCondition($option['hidden_if'], $data)) {
             return false;
         }
 

+ 23 - 0
src/mail/mailer.php

@@ -97,6 +97,25 @@ final class Mailer
         $htmlBody = $this->renderAdminHtml($submission, $isMinorSubmission, $uploadWarning);
         $textBody = $this->renderAdminText($submission, $isMinorSubmission, $uploadWarning);
 
+        $formData = (array) ($submission['form_data'] ?? []);
+        $ccEmails = [];
+        $notifications = (array) ($this->schema->raw()['additional_notifications'] ?? []);
+        $validator = new \App\Form\Validator($this->schema);
+        
+        foreach ($notifications as $notification) {
+            if (!isset($notification['condition']) || !is_array($notification['condition'])) {
+                continue;
+            }
+            if ($validator->evaluateCondition($notification['condition'], $formData)) {
+                $ccs = (array) ($notification['cc'] ?? []);
+                foreach ($ccs as $cc) {
+                    if (is_string($cc) && filter_var($cc, FILTER_VALIDATE_EMAIL)) {
+                        $ccEmails[] = trim($cc);
+                    }
+                }
+            }
+        }
+
         foreach ($recipients as $recipient) {
             if (!is_string($recipient) || $recipient === '') {
                 continue;
@@ -109,6 +128,10 @@ final class Mailer
                     ->setHtmlBody($htmlBody)
                     ->setTextBody($textBody);
 
+                foreach ($ccEmails as $ccEmail) {
+                    $mail->addCc($ccEmail);
+                }
+
                 if ($formDataPdf !== null) {
                     $mail->addAttachment($formDataPdf, 'Antragsdaten.pdf', 'application/pdf');
                 }

+ 19 - 2
src/mail/mimemailbuilder.php

@@ -18,6 +18,8 @@ final class MimeMailBuilder
     private string $textBody = '';
     /** @var array<int, array{path: string, name: string, mime: string}> */
     private array $attachments = [];
+    /** @var array<int, string> */
+    private array $cc = [];
     private string $errorInfo = '';
 
     public function setFrom(string $address, string $name = ''): self
@@ -33,6 +35,15 @@ final class MimeMailBuilder
         return $this;
     }
 
+    public function addCc(string $address): self
+    {
+        $sanitized = $this->sanitizeAddress($address);
+        if ($sanitized !== '') {
+            $this->cc[] = $sanitized;
+        }
+        return $this;
+    }
+
     public function setSubject(string $subject): self
     {
         $this->subject = $this->sanitizeHeaderText($subject);
@@ -111,11 +122,17 @@ final class MimeMailBuilder
 
         $type = $isMixed ? 'multipart/mixed' : 'multipart/alternative';
 
-        return implode("\r\n", [
+        $headers = [
             'From: ' . $from,
             'MIME-Version: 1.0',
             'Content-Type: ' . $type . '; boundary="' . $boundary . '"',
-        ]);
+        ];
+
+        if ($this->cc !== []) {
+            $headers[] = 'Cc: ' . implode(', ', $this->cc);
+        }
+
+        return implode("\r\n", $headers);
     }
 
     private function buildMixedBody(string $mixedBoundary, string $altBoundary): string