diff --git a/Layout/default/Mailtemplate/Form.php b/Layout/default/Mailtemplate/Form.php index 786b193e4..21cfed86f 100644 --- a/Layout/default/Mailtemplate/Form.php +++ b/Layout/default/Mailtemplate/Form.php @@ -151,10 +151,13 @@ function initEditor() { tinymce.init({ //font_formats: "Arial=arial,sans-serif;", + images_dataimg_filter: function(img) { + return img.hasAttribute('internal-blob'); + }, selector: '#body_html', language: 'de', skin: "tinymce-5", - plugins: ' code link autolink lists table', + plugins: ' code link autolink lists table image media', paste_block_drop: true, paste_as_text: true, paste_data_images: true, diff --git a/application/Preorder/Preorder.php b/application/Preorder/Preorder.php index 2557a3cc7..ae4f778b1 100644 --- a/application/Preorder/Preorder.php +++ b/application/Preorder/Preorder.php @@ -414,7 +414,7 @@ class Preorder extends mfBaseModel { return $to; } - private function getPropertiesAsArray() { + public function getPropertiesAsArray() { $preorder = clone $this; unset($preorder->data, $preorder->_old_data, $preorder->db, $preorder->log); $status = $this->getProperty("status"); @@ -426,6 +426,11 @@ class Preorder extends mfBaseModel { if(substr($key, 0, 1) == "\0") continue; $return[$key] = $value; } + + $return["status_code"] = $status->code; + $return["status_name"] = $status->name; + $return["contact_fullname"] = $this->getCompanyOrName(); + return $return; } @@ -635,6 +640,30 @@ class Preorder extends mfBaseModel { return true; } + public function getCompanyOrName() { + $company = trim($this->company); + if($company) { + return $company; + } + return $this->getFullName(); + } + + public function getFullName() { + // Assumes "Firma1 Firma2" or "firstname lastname" as readable form + $name = ""; + + if($this->firstname && $this->lastname) { + $name = $this->firstname . " " . $this->lastname; + } elseif($this->lastname) { + $name = $this->lastname; + } elseif($this->firstname) { + $name = $this->firstname; + } + + return $name; + + } + public function setOrCreateOaid($oaid_attributes = false) { $campaign = new Preordercampaign($this->preordercampaign_id); //var_dump($campaign);exit; diff --git a/lib/mvcfronk/mfBase/mfBaseModel.php b/lib/mvcfronk/mfBase/mfBaseModel.php index 5b1aa08bb..5444b534e 100644 --- a/lib/mvcfronk/mfBase/mfBaseModel.php +++ b/lib/mvcfronk/mfBase/mfBaseModel.php @@ -366,7 +366,11 @@ class mfBaseModel { } public function __unset($name) { - unset($this->data->$name); + if($name === "data") { + unset($this->data); + } else { + unset($this->data->$name); + } } public function __debugInfo() { diff --git a/scripts/preorder/custom_notifications/init.php b/scripts/preorder/custom_notifications/init.php index ff5583228..5534398ab 100644 --- a/scripts/preorder/custom_notifications/init.php +++ b/scripts/preorder/custom_notifications/init.php @@ -22,15 +22,19 @@ function logMessage($message): void { echo "[" . date("Y-m-d H:i:s") . "] " . $message . "\n"; } -function sendPreorderEmail($mailtemplate, $preordercampaign, $preorder, $email_type = "300-custom") { +function sendPreorderEmail($mailtemplate, $preordercampaign, $preorder, $email_type = "300-custom", $custom_replacers = []) { $data = ["preorder" => $preorder->getPropertiesAsArray()]; foreach(["adb_hausnummer", "adb_wohneinheit"] as $prop) { $obj = $preorder->getProperty($prop); if($obj) { $obj_data = (array) $obj->data; - unset($obj->data, $obj->_old_data, $obj->db, $obj->log); - $data[$prop] = array_merge((array) $obj, $obj_data); + //unset($obj->data, $obj->_old_data, $obj->db, $obj->log); + foreach($obj as $key => $value) { + if($key == "data" || $key == "_old_data" || $key == "db" || $key == "log") continue; + $data[$prop][$key] = $value; + } + $data[$prop] = array_merge((array) $data[$prop], $obj_data); } else { $data[$prop] = null; } @@ -43,6 +47,13 @@ function sendPreorderEmail($mailtemplate, $preordercampaign, $preorder, $email_t } } + if(count($custom_replacers)) { + foreach($custom_replacers as $key => $value) { + if(!$key) continue; + $replacers[$key] = $value; + } + } + $subject = $mailtemplate->getVariableReplacedSubject($replacers); $body = ""; $body .= $mailtemplate->renderBody($replacers); diff --git a/scripts/preorder/custom_notifications/send-preorder-custom-new-noticiation.php b/scripts/preorder/custom_notifications/send-preorder-custom-new-noticiation.php deleted file mode 100644 index 6c8097d78..000000000 --- a/scripts/preorder/custom_notifications/send-preorder-custom-new-noticiation.php +++ /dev/null @@ -1,84 +0,0 @@ -query($sql); - -if ($res->num_rows == 0) { - logMessage("No preorders found for custom 300-new-order notification."); - exit; -} - -logMessage("Found " . $res->num_rows . " preorders for 300-custom-new-order notification."); - -while($row = $res->fetch_assoc()) { - logMessage("Processing Preorder ID: " . $row['id']); - $preorder_id = $row['id']; - $campaign_name = $row['campaign_name']; - $mailtemplate_id = $row['mailtemplate_id']; - $wohneinheit_status_code = $row['wohneinheit_status_code']; - $wohneinheit_status_name = $row['wohneinheit_status_name']; - - logMessage("Wohneinheit Status: {$wohneinheit_status_code} ({$wohneinheit_status_name})"); - - $preorder = new Preorder($preorder_id); - if (!$preorder || !$preorder->id) { - logMessage("Preorder with ID $preorder_id not found. Skipping."); - continue; - } - - $preordercampaign = new Preordercampaign($preorder->preordercampaign_id); - if (!$preordercampaign || !$preordercampaign->id) { - logMessage("Preordercampaign with ID {$preorder->preordercampaign_id} not found. Skipping."); - continue; - } - - $mailtemplate = new Mailtemplate($mailtemplate_id); - if(!$mailtemplate || !$mailtemplate->id) { - logMessage("Mailtemplate with ID $mailtemplate_id not found. Skipping."); - continue; - } - - logMessage("Preparing to send email for Preorder ID: $preorder_id, Campaign: $campaign_name"); - - sendPreorderEmail( - $mailtemplate, - $preordercampaign, - $preorder, - "300-custom-new-order" - ); -} - -logMessage("Completed processing 300-custom-new-order notifications."); - -?> \ No newline at end of file diff --git a/scripts/preorder/custom_notifications/send-preorder-custom-new-notification.php b/scripts/preorder/custom_notifications/send-preorder-custom-new-notification.php new file mode 100644 index 000000000..80f61bfc8 --- /dev/null +++ b/scripts/preorder/custom_notifications/send-preorder-custom-new-notification.php @@ -0,0 +1,160 @@ +setTimezone(new DateTimeZone("Europe/Vienna")); + +$allowed_netowners = [4807]; // vorerst nur RML + +$sql = "SELECT + p.id, + p.type, + p.preordercampaign_id, + p.adb_wohneinheit_id, + pc.name as campaign_name, + ps_current.code as current_status_code, + ps_current.name as current_status_name, + w.id as wohneinheit_id, + adb_status.code as wohneinheit_status_code, + adb_status.name as wohneinheit_status_name, + pcsmt.mailtemplate_id, + pcsmt.logical_config +FROM `" . FRONKDB_DBNAME . "`.Preorder p +INNER JOIN `" . FRONKDB_DBNAME . "`.Preordercampaign pc ON p.preordercampaign_id = pc.id +INNER JOIN `" . FRONKDB_DBNAME . "`.PreordercampaignStatusnotificationMailtemplate pcsmt ON pc.id = pcsmt.preordercampaign_id +INNER JOIN `" . FRONKDB_DBNAME . "`.Preorderstatus ps_current ON p.status_id = ps_current.id +INNER JOIN `" . ADDRESSDB_DBNAME . "`.Wohneinheit w ON p.adb_wohneinheit_id = w.id +INNER JOIN `" . ADDRESSDB_DBNAME . "`.Status adb_status ON w.status_id = adb_status.id +LEFT JOIN `" . FRONKDB_DBNAME . "`.PreorderStatusnotificationLog psnl ON p.id = psnl.preorder_id AND psnl.email_type = '300-custom-new-order' +WHERE p.type = 'order' + AND p.adb_wohneinheit_id IS NOT NULL -- Must have a wohneinheit linked + AND adb_status.code < 300 -- Wohneinheit status must be less than 300 + -- AND adb_status.type = 'wohneinheit' -- Ensure we're checking the right status type + AND pcsmt.notification_type = 'logical' + AND JSON_EXTRACT(pcsmt.logical_config, '$.type') = '300-custom-new-order' + AND psnl.id IS NULL -- No existing '300-custom-new-order' notification + AND p.create > ".$earliest_order_date->getTimestamp()." -- no older than \$earliest_order_date + -- AND p.create < (UNIX_TIMESTAMP(NOW()) - 86400) -- Only consider preorders older than 24 hours +ORDER BY p.id ASC;"; + +$res = $db->query($sql); + +if ($res->num_rows == 0) { + logMessage("No preorders found for custom 300-new-order notification."); + exit; +} + +logMessage("Found " . $res->num_rows . " preorders for 300-custom-new-order notification."); + +while($row = $res->fetch_assoc()) { + logMessage("Processing Preorder ID: " . $row['id']); + $preorder_id = $row['id']; + $campaign_name = $row['campaign_name']; + $mailtemplate_id = $row['mailtemplate_id']; + $wohneinheit_status_code = $row['wohneinheit_status_code']; + $wohneinheit_status_name = $row['wohneinheit_status_name']; + + logMessage("Wohneinheit Status: {$wohneinheit_status_code} ({$wohneinheit_status_name})"); + + $preorder = new Preorder($preorder_id); + if (!$preorder || !$preorder->id) { + logMessage("Preorder with ID $preorder_id not found. Skipping."); + continue; + } + + if($preorder->status->code >= 899) { + logMessage("Preorder with ID $preorder_id has status {$preorder->status->code} ({$preorder->status->name}). Skipping."); + continue; + } + + $preordercampaign = new Preordercampaign($preorder->preordercampaign_id); + if (!$preordercampaign || !$preordercampaign->id) { + logMessage("Preordercampaign with ID {$preorder->preordercampaign_id} not found. Skipping."); + continue; + } + + $netowner_id = $preordercampaign->network->owner_id; + if(!$netowner_id) { + logMessage("No Netowner ID found for Preorder ID $preorder_id. Skipping."); + continue; + } + + if(!in_array($netowner_id, $allowed_netowners)) { + continue; + } + + $mailtemplate = new Mailtemplate($mailtemplate_id); + if(!$mailtemplate || !$mailtemplate->id) { + logMessage("Mailtemplate with ID $mailtemplate_id not found. Skipping."); + continue; + } + + logMessage("Preparing to send email for Preorder ID: $preorder_id, Campaign: $campaign_name"); + + + //var_dump($preorder);exit; + // find correct price embed based on actual setup price + $po = PreordercampaignOperatorModel::getFirst(["preordercampaign_id" => $preordercampaign->id, "isp_id" => $preorder->partner_id]); + if(!$po) { + $po = PreordercampaignOperatorModel::getFirst(["preordercampaign_id" => $preordercampaign->id, "operator_id" => $preorder->partner_id]); + } + if(!$po) { + logMessage("No Netoperator found for Preorder ID $preorder_id and Campaign ID {$preordercampaign->id}. Skipping."); + continue; + } + //var_dump($po);exit; + + $netoperator = new Address($po->operator_id); + if(!$netoperator) { + logMessage("No Netoperator found for Preorder ID $preorder_id and Campaign ID {$preordercampaign->id}. Skipping."); + continue; + } + + if($preorder->order_date) { + $order_date = new DateTime('@'.$preorder->order_date); + } else { + $order_date = new DateTime('@'.$preorder->create); + } + $order_date->setTime(4,0,0); + $order_date->setTimezone(new DateTimeZone("Europe/Vienna")); + + $product = PreorderProduct::getFirst(["type" => "enduser_setup"]); + if(!$product) { + logMessage("operator_setup price not found! Preorder $preorder_id"); + continue; + } + + $product->setNetownerId($netowner_id); + $product->setNetoperatorId($netoperator->id); + $price = $product->getCampaignPrice($preorder->preordercampaign_id, $order_date->format("Y-m-d")); + + if(!$price) { + logMessage("No price found for Preorder ID $preorder_id and Campaign ID {$preordercampaign->id}. Skipping."); + continue; + } + + $price_setup = $price->price_setup; + + $template_embed_name = "{{EMBED:tpl-rml-neue-bestellung-preistext-option1-gratis}}"; + if($price_setup > 0.0000) { + $template_embed_name = "{{EMBED:tpl-rml-neue-bestellung-preistext-option2-preis}}"; + } + + sendPreorderEmail( + $mailtemplate, + $preordercampaign, + $preorder, + "300-custom-new-order", + [ + "RML_NEW_ORDER_PRICE_OPTION_EMBED" => $template_embed_name, + "price_setup" => number_format($price_setup, 2, ",", "."), + ], + ); + +} + +logMessage("Completed processing 300-custom-new-order notifications."); + +?> \ No newline at end of file