PluginProbe
Packeta / 1.5.0
Packeta v1.5.0
2.3.2 2.3.1 trunk 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.3.0 1.3.1 1.3.2 1.4 1.4.1 1.4.2 1.4.3 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 All 56 releases
packeta / src / Packetery / Module / Order / PacketAutoSubmitter.php

PacketAutoSubmitter.php in Packeta 1.5.0, at src/Packetery/Module/Order/PacketAutoSubmitter.php

171 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 * Class PacketAutoSubmitter
4 *
5 * @package Packetery\Module\Order
6 */
7
8 declare( strict_types=1 );
9
10 namespace Packetery\Module\Order;
11
12 use Packetery\Module;
13
14 /**
15 * Class PacketAutoSubmitter
16 *
17 * @package Packetery\Module\Order
18 */
19 class PacketAutoSubmitter {
20
21 private const HOOK_NAME_HANDLE_EVENT = 'packetery_auto_submission_handle_event';
22
23 public const EVENT_ON_ORDER_COMPLETED = 'onOrderCompleted';
24 public const EVENT_ON_ORDER_PROCESSING = 'onOrderProcessing';
25 public const EVENT_ON_ORDER_CREATION_FE = 'onOrderCreationFE';
26
27 /**
28 * Options provider.
29 *
30 * @var Module\Options\Provider
31 */
32 private $optionsProvider;
33
34 /**
35 * Packet submitter.
36 *
37 * @var PacketSubmitter
38 */
39 private $packetSubmitter;
40
41 /**
42 * Options page.
43 *
44 * @var Module\Options\Page
45 */
46 private $optionsPage;
47
48 /**
49 * Order repository.
50 *
51 * @var Repository
52 */
53 private $orderRepository;
54
55 /**
56 * Constructor.
57 *
58 * @param Module\Options\Provider $optionsProvider Options provider.
59 * @param PacketSubmitter $packetSubmitter Packet submitter.
60 * @param Module\Options\Page $optionsPage Options page.
61 * @param Repository $orderRepository Order repository.
62 */
63 public function __construct(
64 Module\Options\Provider $optionsProvider,
65 PacketSubmitter $packetSubmitter,
66 Module\Options\Page $optionsPage,
67 Repository $orderRepository
68 ) {
69 $this->optionsProvider = $optionsProvider;
70 $this->packetSubmitter = $packetSubmitter;
71 $this->optionsPage = $optionsPage;
72 $this->orderRepository = $orderRepository;
73 }
74
75 /**
76 * Registers listeners.
77 *
78 * @return void
79 */
80 public function register(): void {
81 if ( false === $this->optionsProvider->isPacketAutoSubmissionEnabled() ) {
82 return;
83 }
84
85 add_action( self::HOOK_NAME_HANDLE_EVENT, [ $this, 'handleEvent' ], 10, 3 );
86
87 $mappedEvents = $this->optionsProvider->getPacketAutoSubmissionMappedUniqueEvents();
88 foreach ( $mappedEvents as $mappedEvent ) {
89 if ( self::EVENT_ON_ORDER_COMPLETED === $mappedEvent ) {
90 add_action(
91 'woocommerce_order_status_completed',
92 function ( int $orderId ): void {
93 $this->handleEvent( self::EVENT_ON_ORDER_COMPLETED, $orderId, is_admin() === false );
94 }
95 );
96 continue;
97 }
98
99 if ( self::EVENT_ON_ORDER_PROCESSING === $mappedEvent ) {
100 add_action(
101 'woocommerce_order_status_processing',
102 function ( int $orderId ): void {
103 $this->handleEvent( self::EVENT_ON_ORDER_PROCESSING, $orderId, is_admin() === false );
104 }
105 );
106 }
107 }
108 }
109
110 /**
111 * Handle event.
112 *
113 * @param string $event Event.
114 * @param int $orderId WC Order.
115 * @param bool|null $triggeredByFrontend Tells if event is triggered by frontend logic. NULL is passed when data from previous versions are being processed.
116 *
117 * @return void
118 */
119 public function handleEvent( string $event, int $orderId, ?bool $triggeredByFrontend = null ): void {
120 if ( false === $this->optionsProvider->isPacketAutoSubmissionEnabled() ) {
121 return;
122 }
123
124 $wcOrder = $this->orderRepository->getWcOrderById( $orderId );
125 assert( null !== $wcOrder, 'WC order has to be present' );
126
127 $paymentGateway = wc_get_payment_gateway_by_order( $wcOrder );
128 if ( false === $this->optionsPage->hasPaymentGateway( $paymentGateway ) ) {
129 return;
130 }
131
132 $mappingEventForGateway = $this->optionsProvider->getPacketAutoSubmissionEvenForPaymentGateway( $paymentGateway->id );
133 if ( null === $mappingEventForGateway || $mappingEventForGateway !== $event ) {
134 return;
135 }
136
137 $this->packetSubmitter->submitPacket(
138 $wcOrder,
139 $this->shouldUpdateOrderStatus( $triggeredByFrontend )
140 );
141 }
142
143 /**
144 * Tells if WC order status should be updated.
145 *
146 * @param bool|null $triggeredByFrontend Tells if submission is triggered by frontend action.
147 *
148 * @return bool
149 */
150 private function shouldUpdateOrderStatus( ?bool $triggeredByFrontend ): bool {
151 return ( false === $triggeredByFrontend && $this->optionsProvider->isOrderStatusAutoChangeEnabled() ) ||
152 ( true === $triggeredByFrontend && $this->optionsProvider->isOrderStatusAutoChangeForAutoSubmitAtFrontendEnabled() );
153 }
154
155 /**
156 * Handles event async.
157 *
158 * @param string $event Event.
159 * @param int $orderId Order ID.
160 *
161 * @return void
162 */
163 public function handleEventAsync( string $event, int $orderId ): void {
164 if ( false === $this->optionsProvider->isPacketAutoSubmissionEnabled() ) {
165 return;
166 }
167 as_schedule_single_action( time(), self::HOOK_NAME_HANDLE_EVENT, [ $event, $orderId, is_admin() === false ] );
168 }
169
170 }
171