PluginProbe
StoreEngine — Complete eCommerce Solution with Memberships, Licensing, Affiliates & More / 2.2.0
StoreEngine — Complete eCommerce Solution with Memberships, Licensing, Affiliates & More v2.2.0
2.3.0 2.2.0 2.1.1 2.1.0 2.0.0 1.10.0 1.9.1 1.9.0 1.2.1 1.2.2 1.3.0 1.3.1 1.3.2 1.3.3 1.4.0 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.6.0 All 59 releases
storeengine / includes / classes / order-context.php

order-context.php in StoreEngine — Complete eCommerce Solution with Memberships, Licensing, Affiliates & More 2.2.0, at includes/classes/order-context.php

169 lines 4.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace StoreEngine\Classes;
4
5 if ( ! defined( 'ABSPATH' ) ) {
6 exit;
7 }
8
9 use StoreEngine\Classes\Exceptions\StoreEngineInvalidOrderStatusException;
10 use StoreEngine\Classes\Exceptions\StoreEngineInvalidOrderStatusTransitionException;
11 use StoreEngine\Classes\OrderStatus\{Active,
12 AutoDraft,
13 Cancelled,
14 Completed,
15 Draft,
16 OnHold,
17 PaymentConfirmed,
18 PaymentFailed,
19 PendingCancel,
20 PendingPayment,
21 Processing,
22 Refunded,
23 Trash};
24 use StoreEngine\Interfaces\OrderStatus;
25
26 class OrderContext {
27 private OrderStatus $order_status;
28
29 public function __construct( string $order_status ) {
30 switch ( $order_status ) {
31 case 'auto-draft':
32 $this->set_order_status( new AutoDraft() );
33 break;
34 case 'draft':
35 $this->set_order_status( new Draft() );
36 break;
37 case 'pending':
38 case 'pending_payment':
39 $this->set_order_status( new PendingPayment() );
40 break;
41 case 'pending_cancel':
42 $this->set_order_status( new PendingCancel() );
43 break;
44 case 'active':
45 $this->set_order_status( new Active() );
46 break;
47 case 'on_hold':
48 $this->set_order_status( new OnHold() );
49 break;
50 case 'processing':
51 $this->set_order_status( new Processing() );
52 break;
53 case 'payment_confirmed':
54 $this->set_order_status( new PaymentConfirmed() );
55 break;
56 case 'completed':
57 $this->set_order_status( new Completed() );
58 break;
59 case 'payment_failed':
60 $this->set_order_status( new PaymentFailed() );
61 break;
62 case 'refunded':
63 $this->set_order_status( new Refunded() );
64 break;
65 case 'cancelled':
66 $this->set_order_status( new Cancelled() );
67 break;
68 case 'trash':
69 $this->set_order_status( new Trash() );
70 break;
71 default:
72 throw StoreEngineInvalidOrderStatusException::invalid_order_status( esc_html( $order_status ) );
73 }
74 }
75
76 public function set_order_status( OrderStatus $order_status ) {
77 $this->order_status = $order_status;
78 }
79
80 public function get_order_status(): string {
81 return $this->order_status->get_status();
82 }
83
84 public function get_order_status_title(): string {
85 return $this->order_status->get_status_title();
86 }
87
88 /**
89 * @param $trigger
90 * @param Order $order
91 * @param string|array{note:string,manual_update?:bool,transaction_id:string|int} $args
92 *
93 * @return $this
94 * @throws Exceptions\StoreEngineException
95 * @throws StoreEngineInvalidOrderStatusTransitionException
96 */
97 public function proceed_to_next_status( $trigger, Order $order, $args = [] ): OrderContext {
98 if ( ! in_array( $trigger, $this->get_possible_triggers(), true ) ) {
99 throw StoreEngineInvalidOrderStatusTransitionException::invalid_order_status_transition( esc_html( $this->get_order_status() ), esc_html( $trigger ), esc_html( get_class( $this->order_status )) );
100 }
101
102 if ( is_string( $args ) ) {
103 $args = [ 'note' => $args ];
104 }
105
106 $args = wp_parse_args( $args, [
107 'note' => '',
108 'manual_update' => false,
109 'transaction_id' => '',
110 ] );
111
112 if ( ! $args['note'] ) {
113 $args['note'] = sprintf(
114 /* translators: %s: Status transition trigger name. E.g. payment_initiate, payment_confirmed, active, etc. */
115 __( 'Order status transition triggered by %s.', 'storeengine' ),
116 $trigger,
117 );
118 }
119
120
121 // transition to next stage status.
122 $this->order_status->proceed_to_next_status( $this, $trigger );
123
124 $new_status = $this->get_order_status();
125
126 // Set new status.
127 $order->update_status( $new_status, $args['note'], $args['manual_update'] );
128
129 do_action( 'storeengine/order/proceed_to_next_status', $trigger, $order, $args );
130
131 if ( ! empty( $args['transaction_id'] ) ) {
132 $order->set_transaction_id( $args['transaction_id'] );
133 }
134
135 $unpaid_statuses = [ AutoDraft::STATUS, Draft::STATUS, PendingPayment::STATUS, OnHold::STATUS ];
136
137 if ( in_array( $new_status, $unpaid_statuses, true ) ) {
138 $order->set_paid_status( 'unpaid' );
139 }
140
141 if ( PaymentFailed::STATUS === $new_status ) {
142 $order->set_paid_status( 'failed' );
143 }
144
145 if ( $new_status === Processing::STATUS && 'paid' === $order->get_paid_status() ) {
146 if ( $order->get_auto_complete_digital_order() ) {
147 $this->proceed_to_next_status( 'completed', $order, _x( 'Auto complete digital order.', 'Auto complete note for virtual product', 'storeengine' ) );
148 $order->save();
149 }
150 }
151
152 if ( $new_status === Completed::STATUS ) {
153 $order->set_date_completed_gmt( time() );
154 }
155
156 $order->save();
157
158 return $this;
159 }
160
161 public function get_possible_next_statuses(): array {
162 return $this->order_status->get_possible_next_statuses();
163 }
164
165 public function get_possible_triggers(): array {
166 return $this->order_status->get_possible_triggers();
167 }
168 }
169