|
|
@@ -464,6 +464,27 @@ function isValidAdminEmail($email)
|
|
|
return $email !== "" && filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
|
|
|
}
|
|
|
|
|
|
+function normalizeEmailRecipientList($emails)
|
|
|
+{
|
|
|
+ if (!is_array($emails)) {
|
|
|
+ return [];
|
|
|
+ }
|
|
|
+
|
|
|
+ $normalized = [];
|
|
|
+ $seen = [];
|
|
|
+ foreach ($emails as $email) {
|
|
|
+ $email = normalizeAdminEmail($email);
|
|
|
+ if (!isValidAdminEmail($email) || isset($seen[$email])) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ $seen[$email] = true;
|
|
|
+ $normalized[] = $email;
|
|
|
+ }
|
|
|
+
|
|
|
+ return $normalized;
|
|
|
+}
|
|
|
+
|
|
|
function getDefaultAdminDescription($username)
|
|
|
{
|
|
|
return "Admin";
|
|
|
@@ -1271,6 +1292,7 @@ function getDefaultSystemSettings()
|
|
|
"order_recipient_email" => defined("ORDER_RECIPIENT_EMAIL")
|
|
|
? ORDER_RECIPIENT_EMAIL
|
|
|
: getDefaultAdminEmail(),
|
|
|
+ "order_additional_recipients_by_organization" => [],
|
|
|
"order_confirmation_required" => defined("ORDER_CONFIRMATION_REQUIRED")
|
|
|
? (bool) ORDER_CONFIRMATION_REQUIRED
|
|
|
: false,
|
|
|
@@ -1303,6 +1325,37 @@ function normalizeSystemSettings($settings)
|
|
|
$recipientEmail = $defaults["order_recipient_email"];
|
|
|
}
|
|
|
|
|
|
+ $additionalRecipientsByOrganization = [];
|
|
|
+ $globalSeenRecipients = [];
|
|
|
+ $configuredRecipientsByOrganization =
|
|
|
+ $settings["order_additional_recipients_by_organization"] ??
|
|
|
+ $defaults["order_additional_recipients_by_organization"];
|
|
|
+ if (is_array($configuredRecipientsByOrganization)) {
|
|
|
+ foreach ($configuredRecipientsByOrganization as $organizationId => $recipients) {
|
|
|
+ $organizationId = normalizeOrganizationId($organizationId);
|
|
|
+ if ($organizationId === "") {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ $normalizedRecipients = normalizeEmailRecipientList($recipients);
|
|
|
+ $uniqueRecipients = [];
|
|
|
+ foreach ($normalizedRecipients as $recipient) {
|
|
|
+ if (isset($globalSeenRecipients[$recipient])) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ $globalSeenRecipients[$recipient] = true;
|
|
|
+ $uniqueRecipients[] = $recipient;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (empty($uniqueRecipients)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ $additionalRecipientsByOrganization[$organizationId] = $uniqueRecipients;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
$expiryDays = isset($settings["order_confirmation_expiry_days"])
|
|
|
? (int) $settings["order_confirmation_expiry_days"]
|
|
|
: $defaults["order_confirmation_expiry_days"];
|
|
|
@@ -1316,6 +1369,7 @@ function normalizeSystemSettings($settings)
|
|
|
|
|
|
return [
|
|
|
"order_recipient_email" => $recipientEmail,
|
|
|
+ "order_additional_recipients_by_organization" => $additionalRecipientsByOrganization,
|
|
|
"order_confirmation_required" => !empty(
|
|
|
$settings["order_confirmation_required"]
|
|
|
),
|
|
|
@@ -1346,6 +1400,30 @@ function getOrderRecipientEmail()
|
|
|
return $settings["order_recipient_email"];
|
|
|
}
|
|
|
|
|
|
+function getOrderAdditionalRecipientsByOrganization()
|
|
|
+{
|
|
|
+ $settings = getSystemSettings();
|
|
|
+ $recipientsByOrganization =
|
|
|
+ $settings["order_additional_recipients_by_organization"] ?? [];
|
|
|
+
|
|
|
+ return is_array($recipientsByOrganization) ? $recipientsByOrganization : [];
|
|
|
+}
|
|
|
+
|
|
|
+function getOrderAdditionalRecipientsForOrganization($organizationId)
|
|
|
+{
|
|
|
+ $organizationId = normalizeOrganizationId($organizationId);
|
|
|
+ if ($organizationId === "") {
|
|
|
+ return [];
|
|
|
+ }
|
|
|
+
|
|
|
+ $recipientsByOrganization = getOrderAdditionalRecipientsByOrganization();
|
|
|
+ if (!isset($recipientsByOrganization[$organizationId])) {
|
|
|
+ return [];
|
|
|
+ }
|
|
|
+
|
|
|
+ return normalizeEmailRecipientList($recipientsByOrganization[$organizationId]);
|
|
|
+}
|
|
|
+
|
|
|
function isOrderConfirmationRequired()
|
|
|
{
|
|
|
$settings = getSystemSettings();
|
|
|
@@ -2387,6 +2465,16 @@ function sendConfirmedOrderAdminNotification($order)
|
|
|
if (!isValidAdminEmail($recipient)) {
|
|
|
return false;
|
|
|
}
|
|
|
+ $recipient = normalizeAdminEmail($recipient);
|
|
|
+
|
|
|
+ $ccRecipients = getOrderAdditionalRecipientsForOrganization(
|
|
|
+ $order["organization_id"] ?? "",
|
|
|
+ );
|
|
|
+ $ccRecipients = array_values(
|
|
|
+ array_filter($ccRecipients, function ($ccRecipient) use ($recipient) {
|
|
|
+ return $ccRecipient !== $recipient;
|
|
|
+ }),
|
|
|
+ );
|
|
|
|
|
|
$subject = SITE_SERVICE_NAME . ": Neue Bestellung - " . $order["id"];
|
|
|
$intro =
|
|
|
@@ -2402,15 +2490,41 @@ function sendConfirmedOrderAdminNotification($order)
|
|
|
];
|
|
|
}
|
|
|
|
|
|
- return sendEmail($recipient, $subject, $message, true, $attachments);
|
|
|
+ return sendEmail(
|
|
|
+ $recipient,
|
|
|
+ $subject,
|
|
|
+ $message,
|
|
|
+ true,
|
|
|
+ $attachments,
|
|
|
+ $ccRecipients,
|
|
|
+ );
|
|
|
}
|
|
|
|
|
|
-function sendEmail($to, $subject, $message, $isHtml = true, $attachments = [])
|
|
|
-{
|
|
|
+function sendEmail(
|
|
|
+ $to,
|
|
|
+ $subject,
|
|
|
+ $message,
|
|
|
+ $isHtml = true,
|
|
|
+ $attachments = [],
|
|
|
+ $cc = [],
|
|
|
+)
|
|
|
+{
|
|
|
+ $to = trim((string) $to);
|
|
|
+ $primaryRecipient = normalizeAdminEmail($to);
|
|
|
+ $ccRecipients = normalizeEmailRecipientList($cc);
|
|
|
+ $ccRecipients = array_values(
|
|
|
+ array_filter($ccRecipients, function ($ccRecipient) use ($primaryRecipient) {
|
|
|
+ return $ccRecipient !== $primaryRecipient;
|
|
|
+ }),
|
|
|
+ );
|
|
|
+
|
|
|
$headers = [];
|
|
|
$headers[] = "From: " . FROM_NAME . " <" . FROM_EMAIL . ">";
|
|
|
$headers[] = "Reply-To: " . FROM_EMAIL;
|
|
|
$headers[] = "X-Mailer: PHP/" . phpversion();
|
|
|
+ if (!empty($ccRecipients)) {
|
|
|
+ $headers[] = "Cc: " . implode(", ", $ccRecipients);
|
|
|
+ }
|
|
|
|
|
|
if (empty($attachments)) {
|
|
|
if ($isHtml) {
|