automatewoo/includes/Orders/Observers/CustomerLastPurchasedDateUpdater.php
fei-source 47d3c9a8b6 Update to v6.2.2
Source: GrootMade/Festinger Vault
2026-03-15 08:31:15 +08:00

109 lines
2.6 KiB
PHP

<?php
namespace AutomateWoo\Orders\Observers;
use AutomateWoo\ActionScheduler\ActionSchedulerInterface;
use AutomateWoo\Customer;
use AutomateWoo\Customer_Factory;
use AutomateWoo\Orders\Observers\Traits\HandleOrderDeleted;
use AutomateWoo\Orders\Observers\Traits\HandleOrderStatusChanged;
use AutomateWoo\Orders\StatusTransition;
use WC_Order;
/**
* Class CustomerLastPurchasedDateUpdater
*
* Updates the 'last_purchased' customer field based on order activity.
*
* @since 5.2.0
*/
class CustomerLastPurchasedDateUpdater {
use HandleOrderStatusChanged;
use HandleOrderDeleted;
/**
* @var ActionSchedulerInterface
*/
protected $action_scheduler;
/**
* CustomerLastPurchasedDateUpdater constructor.
*
* @param ActionSchedulerInterface $action_scheduler
*/
public function __construct( ActionSchedulerInterface $action_scheduler ) {
$this->action_scheduler = $action_scheduler;
}
/**
* Register hooks.
*/
public function register() {
$this->add_handle_order_status_changed_hooks();
$this->add_handle_order_deleted_hooks();
add_action( 'automatewoo/async_update_customer_last_purchase_date', [ $this, 'process_async_update' ] );
}
/**
* Handle an order status change.
*
* @param WC_Order $order
* @param StatusTransition $transition
*/
protected function handle_order_status_changed( WC_Order $order, StatusTransition $transition ) {
$customer = Customer_Factory::get_by_order( $order );
if ( ! $customer ) {
return;
}
if ( $transition->is_becoming_paid() || $transition->is_becoming_unpaid() ) {
$this->process_update( $customer );
}
}
/**
* Handle before order is deleted or trashed.
*
* @param WC_Order $order
*/
protected function handle_order_deleted( WC_Order $order ) {
$customer = Customer_Factory::get_by_order( $order );
if ( $customer ) {
// Process the update after the order deletion has finished.
$this->action_scheduler->schedule_immediate(
'automatewoo/async_update_customer_last_purchase_date',
[ $customer->get_id() ]
);
}
}
/**
* @param int $customer_id
*/
public function process_async_update( int $customer_id ) {
$customer = Customer_Factory::get( $customer_id );
if ( $customer ) {
$this->process_update( $customer );
}
}
/**
* Recalculate last_purchased date for customer.
*
* @param Customer $customer
*/
protected function process_update( Customer $customer ) {
$last_paid_order = $customer->get_nth_last_paid_order( 1 );
if ( $last_paid_order ) {
$date = $last_paid_order->get_date_created();
} else {
$date = null;
}
$customer->set_date_last_purchased( $date );
$customer->save();
}
}