/var/www/html_uk/wp-content/plugins/automatewoo/includes/Async_Events/BookingStatusChanged.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
<?php

namespace AutomateWoo\Async_Events;

use 
AutomateWoo\ActionScheduler\ActionSchedulerInterface;
use 
AutomateWoo\Proxies\Bookings;

defined'ABSPATH' ) || exit;

/**
 * Class BookingStatusChanged
 *
 * @since 5.3.0
 * @package AutomateWoo
 */
class BookingStatusChanged extends Abstract_Async_Event {

    const 
NAME 'booking_status_changed';

    
/**
     * @var Bookings
     */
    
protected $bookings_proxy;

    
/**
     * BookingStatusChanged constructor.
     *
     * @since 6.0.18
     *
     * @param ActionSchedulerInterface $action_scheduler
     * @param Bookings                 $bookings_proxy
     */
    
public function __constructActionSchedulerInterface $action_schedulerBookings $bookings_proxy ) {
        
$this->bookings_proxy $bookings_proxy;
        
parent::__construct$action_scheduler );
    }

    
/**
     * Init the event.
     */
    
public function init() {
        
add_action'woocommerce_booking_status_changed', [ $this'schedule_event' ], 30);
    }

    
/**
     * Schedule bookings status change event for consumption by triggers.
     *
     * Doesn't dispatch for 'was-in-cart' status changes because this status isn't a real booking status and essentially
     * functions as a 'trash' status. The was in cart is used when a booking cart item is removed from the cart.
     *
     * @param string $from       Previous status.
     * @param string $to         New (current) status.
     * @param int    $booking_id Booking id.
     */
    
public function schedule_eventstring $fromstring $toint $booking_id ) {
        
$was_in_cart 'was-in-cart';
        if ( 
$to === $was_in_cart || $from === $was_in_cart ) {
            
// Don't dispatch an event for 'was-in-cart' status changes
            
return;
        }

        
$booking $this->bookings_proxy->get_booking$booking_id );

        
// When the the user is a guest and adds the booking to the cart, the booking is not associated with an order yet neither a customer.
        // So runnning this workflow for this booking will only log errors as the data layer needs a customer to run the workflow.
        // See BookingDataLayer::generate_booking_data_layer
        
if ( ( ! $booking->get_order() || ! is_a$booking->get_order(), 'WC_Order' ) ) && ! $booking->get_customer_id() && $to === 'in-cart' ) {
            return;
        }

        
$this->create_async_event(
            [
                
$booking_id,
                
$from,
                
$to,
            ]
        );
    }
}