Seite 1 von 1

Modul: Kunden mit nicht ausgelieferter Bestellung seit xy Stunden eine Nachricht schicken

Verfasst: 18 Jul 2025, 10:39
von Burkhard
Wollte gerne Lieferstatusanfragen-Emails vorbeugen, indem ich Kunden mit einem bestimmten Bestellstatus (z.B. Zahlung eingegangen oder Ratenzahlung authorized) deren Bestellung über x Tage alt ist eine Nachricht über die Gambio Services sende per Cronjob. Sowas wie: "Wir arbeiten mit Hochtouren... Danke für die Geduld, bleiben Sie gechilled" ;-)

ich renne aber immer ins Memory Limit sobald ich den OrderWriteService anwerfe - sogar wenn ich danach einen exit; platziere zum Testen, und wenn ich das Memory Limit auf 1024 MB hochsetze. Da ist doch was nicht normal, oder?

Code: Alles auswählen

<?php
ini_set('memory_limit', '1024M');
$allowedToken = 'meinsichereraccesstoken123';
$token = $_GET['token'] ?? '';

if (!ctype_alnum($token) || $token !== $allowedToken) {
    http_response_code(403);
    die('Zugriff verweigert.');
}

require_once __DIR__ . '/includes/application_top.php';

$sourceStatusIds = [5, 6, 175];
$notifyCustomer = true;
$minOrderAgeInHours = 96;

// OrderWriteService instanziieren
$orderWriteService = MainFactory::create('OrderWriteService');

$testOrderId = isset($_GET['testOrderId']) ? (int)$_GET['testOrderId'] : 0;
echo $testOrderId;

if ($testOrderId > 0) {
    $query = xtc_db_query("
        SELECT orders_id, customers_name, customers_id, date_purchased, orders_status
        FROM orders
        WHERE orders_id = $testOrderId limit 1
    ");
} else {
    $escapedStatusIds = array_map('intval', $sourceStatusIds);
    $inClause = implode(',', $escapedStatusIds);
    $query = xtc_db_query("
        SELECT orders_id, customers_name, customers_id, date_purchased, orders_status
        FROM orders
        WHERE orders_status IN ($inClause) limit 2
    ");
}

while ($order = xtc_db_fetch_array($query)) {
    $orderId = (int)$order['orders_id'];
    $customerId = (int)$order['customers_id'];
    $currentStatusId = (int)$order['orders_status'];

    $orderAge = (time() - strtotime($order['date_purchased'])) / 3600;
    if ($orderAge < $minOrderAgeInHours) {
        continue;
    }

    $comment = 'Wir haben Ihre Bestellung nicht vergessen, brauchen aber aus logistischen Gründen noch etwas Zeit. Bitte sehen Sie von Rückfragen zum Bestellstatus ab, außer bei dringenden Fällen.';

	try {
		// Update Order Status und add Status History Entry mit Benachrichtigung
		$orderWriteService->updateOrderStatus(
			new IdType($orderId),
			new IntType($currentStatusId),
			new StringType($comment),
			new BoolType($notifyCustomer),
			new IdType($customerId) //
		);
	} catch (Exception $e) {
		echo "Fehler: " . $e->getMessage();
	}
}

echo 'Benachrichtigungen abgeschlossen.';

Gibts da einen schlankeren Weg als MainFactory::create('OrderWriteService') ?

Re: Modul: Kunden mit nicht ausgelieferter Bestellung seit xy Stunden eine Nachricht schicken

Verfasst: 18 Jul 2025, 10:56
von Dominik Späte
Evtl. so:

Code: Alles auswählen

$orderWriteService = StaticGXCoreLoader::getService('OrderWrite');

Re: Modul: Kunden mit nicht ausgelieferter Bestellung seit xy Stunden eine Nachricht schicken

Verfasst: 18 Jul 2025, 12:48
von Burkhard
Danke, das funzt!!

Hatte nur gedacht, dass der Service dann auch den Emailversand anstößt, aber DAS ist in dem Service offenbar nicht vorgesehen...

Re: Modul: Kunden mit nicht ausgelieferter Bestellung seit xy Stunden eine Nachricht schicken

Verfasst: 18 Jul 2025, 12:55
von Dominik Späte
Ja, nee, leider nicht. Ich habe ähnliche Skripte zur automatischen Benachrichtigung bei Statusänderung nach Import von Sendungsnummern etc. Die verwenden tatsächlich genau den Code und verschicken die E-Mail dann mit xtc_php_mail().