/var/www/html_uk/wp-content/plugins/automatewoo/includes/Jobs/AbandonedCarts.php


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
<?php

namespace AutomateWoo\Jobs;

use 
AutomateWoo\ActionScheduler\ActionSchedulerInterface;
use 
AutomateWoo\Cart;
use 
AutomateWoo\Cart_Factory;
use 
AutomateWoo\Cart_Query;
use 
AutomateWoo\DateTime;
use 
AutomateWoo\Jobs\Traits\ValidateItemAsIntegerId;
use 
AutomateWoo\OptionsStore;
use 
AutomateWoo\Options;
use 
Exception;

defined'ABSPATH' ) || exit;

/**
 * Finds active carts that appear to be abandoned and changes their status.
 *
 * @since 5.1.0
 */
class AbandonedCarts extends AbstractRecurringBatchedActionSchedulerJob {

    use 
ValidateItemAsIntegerId;

    
/**
     * @var OptionsStore $options_store
     */
    
protected $options_store;

    
/**
     * AbstractBatchedJob constructor.
     *
     * @param ActionSchedulerInterface  $action_scheduler
     * @param ActionSchedulerJobMonitor $monitor
     * @param OptionsStore              $options_store
     */
    
public function __constructActionSchedulerInterface $action_schedulerActionSchedulerJobMonitor $monitorOptionsStore $options_store ) {
        
$this->options_store $options_store;
        
parent::__construct$action_scheduler$monitor );
    }

    
/**
     * Get the name of the job.
     *
     * @return string
     */
    
public function get_name() {
        return 
'abandoned_carts';
    }

    
/**
     * Get the base abandoned carts query for this job.
     *
     * @return Cart_Query
     * @throws Exception On date error.
     */
    
protected function get_base_abandoned_carts_query() {
        
$timeout_date = new DateTime();
        
$timeout_date->sub(
            new 
\DateInterval(
                
sprintf'PT%dM'absint$this->options_store->get_abandoned_cart_timeout() ) )
            )
        );

        return ( new 
Cart_Query() )
            ->
where_statusCart::STATUS_ACTIVE )
            ->
where_date_modified$timeout_date'<' )
            ->
set_ordering'last_modified''DESC' );
    }

    
/**
     * Can the job start.
     *
     * Because this job runs every 2 minutes this method is over-ridden here to prevent a create batch action from
     * being created every 2 minutes.
     *
     * @return bool Returns true if the job can start.
     *
     * @throws Exception On date parse error.
     */
    
protected function can_start(): bool {
        if (
            ! 
$this->options_store->get_cart_tracking_enabled() ||
            ! 
$this->get_base_abandoned_carts_query()->has_results() ) {
            return 
false;
        }

        return 
parent::can_start();
    }

    
/**
     * Get a new batch of items.
     *
     * @param int   $batch_number The batch number increments for each new batch in the job cycle.
     * @param array $args         The args for this instance of the job. Args are already validated.
     *
     * @return int[]
     * @throws Exception On date parse error.
     */
    
protected function get_batchint $batch_number, array $args ) {
        return 
$this->get_base_abandoned_carts_query()
            ->
set_limit$this->get_batch_size() )
            ->
get_results_as_ids();
    }

    
/**
     * Process a single item.
     *
     * @param int   $cart_id
     * @param array $args The args for this instance of the job. Args are already validated.
     *
     * @throws JobException If item can't be found.
     */
    
protected function process_item$cart_id, array $args ) {
        
$cart Cart_Factory::get$cart_id );

        if ( ! 
$cart ) {
            throw 
JobException::item_not_found();
        }

        
$cart->update_status'abandoned' );
    }

    
/**
     * Return the recurring job's interval in seconds.
     *
     * @return int The interval for this action
     */
    
public function get_interval(): int {
        return 
JobService::TWO_MINUTE_INTERVAL;
    }

    
/**
     * If cart tracking is not enabled then disable the job to prevent
     * recurring actions from being scheduled.
     *
     * @since 6.0.28
     *
     * @return bool
     */
    
public function is_enabled(): bool {
        return 
Options::abandoned_cart_enabled();
    }
}