Completed 300-custom-new-order Mailtemplate handling for RML

This commit is contained in:
Frank Schubert
2025-06-13 05:40:17 +02:00
parent 05fe36679f
commit fdcac66a84
5 changed files with 140 additions and 17 deletions

View File

@@ -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 = "<html><head></head><body>";
$body .= $mailtemplate->renderBody($replacers);

View File

@@ -1,7 +1,12 @@
<?php
global $db;
require_once 'init.php';
require_once __DIR__.'/init.php';
$earliest_order_date = new DateTime("2025-05-01");
$earliest_order_date->setTimezone(new DateTimeZone("Europe/Vienna"));
$allowed_netowners = [4807]; // vorerst nur RML
$sql = "SELECT
p.id,
@@ -16,20 +21,22 @@ $sql = "SELECT
adb_status.name as wohneinheit_status_name,
pcsmt.mailtemplate_id,
pcsmt.logical_config
FROM Preorder p
INNER JOIN Preordercampaign pc ON p.preordercampaign_id = pc.id
INNER JOIN PreordercampaignStatusnotificationMailtemplate pcsmt ON pc.id = pcsmt.preordercampaign_id
INNER JOIN Preorderstatus ps_current ON p.status_id = ps_current.id
INNER JOIN addressdb.Wohneinheit w ON p.adb_wohneinheit_id = w.id
INNER JOIN addressdb.Status adb_status ON w.status_id = adb_status.id
LEFT JOIN PreorderStatusnotificationLog psnl ON p.id = psnl.preorder_id AND psnl.email_type = '300-custom-new-order'
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 300
AND adb_status.type = 'wohneinheit' -- Ensure we're checking the right status type
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);
@@ -57,12 +64,27 @@ while($row = $res->fetch_assoc()) {
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.");
@@ -71,12 +93,66 @@ while($row = $res->fetch_assoc()) {
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"
"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.");