-
Notifications
You must be signed in to change notification settings - Fork 8
/
Automation.php
161 lines (135 loc) · 5.37 KB
/
Automation.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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
<?php
/**
* Initializes blocks in WordPress.
*
* @package WooCommerce/Blocks
*/
namespace Vendidero\Germanized\Shipments;
use Vendidero\Germanized\Shipments\Admin\MetaBox;
use WC_Order;
defined( 'ABSPATH' ) || exit;
class Automation {
public static function init() {
if ( 'yes' === Package::get_setting( 'auto_enable' ) ) {
$statuses = (array) Package::get_setting( 'auto_statuses' );
if ( ! empty( $statuses ) ) {
foreach( $statuses as $status ) {
$status = str_replace( 'wc-', '', $status );
add_action( 'woocommerce_order_status_' . $status, array( __CLASS__, 'maybe_create_shipments' ), 10, 1 );
}
} else {
add_action( 'woocommerce_new_order', array( __CLASS__, 'maybe_create_shipments' ), 10, 1 );
}
}
if ( 'yes' === Package::get_setting( 'auto_order_shipped_completed_enable' ) ) {
add_action( 'woocommerce_gzd_shipments_order_shipped', array( __CLASS__, 'mark_order_completed' ), 10 );
}
if ( 'yes' === Package::get_setting( 'auto_order_completed_shipped_enable' ) ) {
add_action( 'woocommerce_order_status_changed', array( __CLASS__, 'maybe_mark_shipments_shipped' ), 150, 4 );
}
}
/**
* @param $order_id
* @param $old_status
* @param $new_status
* @param WC_Order $order
*/
public static function maybe_mark_shipments_shipped( $order_id, $old_status, $new_status, $order ) {
/**
* Filter to decide which order status is used to determine if a order
* is completed or not to update contained shipment statuses to shipped.
* Does only take effect if the automation option has been set within the shipment settings.
*
* @param string $status The current order status.
* @param integer $order_id The order id.
*
* @since 3.0.5
* @package Vendidero/Germanized/Shipments
*/
if ( apply_filters( 'woocommerce_gzd_shipments_order_completed_status', 'completed', $order_id ) === $new_status ) {
// Make sure that MetaBox is saved before we process automation
if ( self::is_admin_edit_order_request() ) {
add_action( 'woocommerce_process_shop_order_meta', array( __CLASS__, 'mark_shipments_shipped' ), 70 );
} else {
self::mark_shipments_shipped( $order_id );
}
}
}
private static function is_admin_edit_order_request() {
return ( isset( $_POST['action'] ) && 'editpost' === $_POST['action'] && isset( $_POST['post_type'] ) && 'shop_order' === $_POST['post_type'] );
}
public static function mark_shipments_shipped( $order_id ) {
if ( $order = wc_get_order( $order_id ) ) {
if ( $shipment_order = wc_gzd_get_shipment_order( $order ) ) {
foreach( $shipment_order->get_simple_shipments() as $shipment ) {
if ( ! $shipment->has_status( array( 'shipped', 'delivered' ) ) ) {
$shipment->update_status( 'shipped' );
}
}
}
}
}
/**
* Mark the order as completed if the order is fully shipped.
*
* @param $order_id
*/
public static function mark_order_completed( $order_id ) {
if ( $order = wc_get_order( $order_id ) ) {
/**
* Filter to adjust the new status of an order after all it's required
* shipments have been marked as shipped. Does only take effect if the automation option has been set
* within the shipment settings.
*
* @param string $status The order status to be used.
* @param integer $order_id The order id.
*
* @since 3.0.5
* @package Vendidero/Germanized/Shipments
*/
$order->update_status( apply_filters( 'woocommerce_gzd_shipment_order_completed_status', 'completed', $order_id ) , _x( 'Order is fully shipped.', 'shipments', 'woocommerce-germanized-shipments' ) );
}
}
public static function create_shipments( $order_id, $enable_auto_filter = true ) {
$shipment_status = Package::get_setting( 'auto_default_status' );
if ( empty( $shipment_status ) ) {
$shipment_status = 'processing';
}
/**
* Filter to disable automatically creating shipments for a specific order.
*
* @param string $enable Whether to create or not create shipments.
* @param integer $order_id The order id.
*
* @since 3.1.0
* @package Vendidero/Germanized/Shipments
*/
if ( $enable_auto_filter && ! apply_filters( 'woocommerce_gzd_auto_create_shipments_for_order', true, $order_id ) ) {
return;
}
if ( $order_shipment = wc_gzd_get_shipment_order( $order_id ) ) {
$shipments = $order_shipment->get_simple_shipments();
foreach( $shipments as $shipment ) {
if ( $shipment->is_editable() ) {
$shipment->sync();
$shipment->sync_items();
$shipment->save();
}
}
if ( $order_shipment->needs_shipping() ) {
$shipment = wc_gzd_create_shipment( $order_shipment, array( 'props' => array( 'status' => $shipment_status ) ) );
if ( ! is_wp_error( $shipment ) ) {
$order_shipment->add_shipment( $shipment );
}
}
}
}
public static function maybe_create_shipments( $order_id ) {
// Make sure that MetaBox is saved before we process automation
if ( self::is_admin_edit_order_request() ) {
add_action( 'woocommerce_process_shop_order_meta', array( __CLASS__, 'create_shipments' ), 70 );
} else {
self::create_shipments( $order_id );
}
}
}