Files
piratepoet/mailpoet/lib/Cron/Workers/WooCommercePastOrders.php
David Remer 7ac2065b1a Track purchases regardless of status but return revenue status correctly
When we apply this commit every purchase will be tracked. When the shop manager updates an order
the status will be updated. For the statistics it will only return values for purchases with
the 'completed' status

[MAILPOET-5485]
2023-09-11 12:14:33 +02:00

81 lines
2.6 KiB
PHP

<?php // phpcs:ignore SlevomatCodingStandard.TypeHints.DeclareStrictTypes.DeclareStrictTypesMissing
namespace MailPoet\Cron\Workers;
use MailPoet\Entities\ScheduledTaskEntity;
use MailPoet\Entities\StatisticsClickEntity;
use MailPoet\Statistics\StatisticsClicksRepository;
use MailPoet\Statistics\Track\WooCommercePurchases;
use MailPoet\WooCommerce\Helper as WCHelper;
use MailPoetVendor\Carbon\Carbon;
class WooCommercePastOrders extends SimpleWorker {
const TASK_TYPE = 'woocommerce_past_orders';
const BATCH_SIZE = 20;
/** @var WCHelper */
private $woocommerceHelper;
/** @var WooCommercePurchases */
private $woocommercePurchases;
/** @var StatisticsClicksRepository */
private $statisticsClicksRepository;
public function __construct(
WCHelper $woocommerceHelper,
StatisticsClicksRepository $statisticsClicksRepository,
WooCommercePurchases $woocommercePurchases
) {
$this->woocommerceHelper = $woocommerceHelper;
$this->woocommercePurchases = $woocommercePurchases;
$this->statisticsClicksRepository = $statisticsClicksRepository;
parent::__construct();
}
public function checkProcessingRequirements() {
return $this->woocommerceHelper->isWooCommerceActive() && empty($this->getCompletedTasks()); // run only once
}
public function processTaskStrategy(ScheduledTaskEntity $task, $timer) {
$oldestClick = $this->statisticsClicksRepository->findOneBy([], ['createdAt' => 'asc']);
if (!$oldestClick instanceof StatisticsClickEntity) {
return true;
}
// continue from 'last_processed_id' from previous run
$meta = $task->getMeta();
$lastId = isset($meta['last_processed_id']) ? $meta['last_processed_id'] : 0;
add_filter('posts_where', function ($where = '') use ($lastId) {
global $wpdb;
return $where . " AND {$wpdb->prefix}posts.ID > " . $lastId;
}, 10, 2);
$orderIds = $this->woocommerceHelper->wcGetOrders([
'date_completed' => '>=' . (($createdAt = $oldestClick->getCreatedAt()) ? $createdAt->format('Y-m-d H:i:s') : null),
'orderby' => 'ID',
'order' => 'ASC',
'limit' => self::BATCH_SIZE,
'return' => 'ids',
]);
if (empty($orderIds)) {
return true;
}
foreach ($orderIds as $orderId) {
$this->woocommercePurchases->trackPurchase($orderId, false);
}
$task->setMeta(['last_processed_id' => end($orderIds)]);
$this->scheduledTasksRepository->persist($task);
$this->scheduledTasksRepository->flush();
return false;
}
public function getNextRunDate() {
return Carbon::createFromTimestamp($this->wp->currentTime('timestamp')); // schedule immediately
}
}