Zitieren
Modul: Kunden mit nicht ausgelieferter Bestellung seit xy Stunden eine Nachricht schicken
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') ?
Benutzeravatar
Administrator
Zitieren
Re: Modul: Kunden mit nicht ausgelieferter Bestellung seit xy Stunden eine Nachricht schicken
Evtl. so:

Code: Alles auswählen

$orderWriteService = StaticGXCoreLoader::getService('OrderWrite');
Zitieren
Re: Modul: Kunden mit nicht ausgelieferter Bestellung seit xy Stunden eine Nachricht schicken
Danke, das funzt!!

Hatte nur gedacht, dass der Service dann auch den Emailversand anstößt, aber DAS ist in dem Service offenbar nicht vorgesehen...
Benutzeravatar
Administrator
Zitieren
Re: Modul: Kunden mit nicht ausgelieferter Bestellung seit xy Stunden eine Nachricht schicken
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().
Antworten