PluginProbe
Packeta / 1.5.4
Packeta v1.5.4
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.4, at src/Packetery/Module/Order/PacketAutoSubmitter.php

173 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->getPacketAutoSubmissionEventForPaymentGateway(
133 $this->optionsProvider->sanitizePaymentGatewayId( $paymentGateway->id )
134 );
135 if ( null === $mappingEventForGateway || $mappingEventForGateway !== $event ) {
136 return;
137 }
138
139 $this->packetSubmitter->submitPacket(
140 $wcOrder,
141 $this->shouldUpdateOrderStatus( $triggeredByFrontend )
142 );
143 }
144
145 /**
146 * Tells if WC order status should be updated.
147 *
148 * @param bool|null $triggeredByFrontend Tells if submission is triggered by frontend action.
149 *
150 * @return bool
151 */
152 private function shouldUpdateOrderStatus( ?bool $triggeredByFrontend ): bool {
153 return ( false === $triggeredByFrontend && $this->optionsProvider->isOrderStatusAutoChangeEnabled() ) ||
154 ( true === $triggeredByFrontend && $this->optionsProvider->isOrderStatusAutoChangeForAutoSubmitAtFrontendEnabled() );
155 }
156
157 /**
158 * Handles event async.
159 *
160 * @param string $event Event.
161 * @param int $orderId Order ID.
162 *
163 * @return void
164 */
165 public function handleEventAsync( string $event, int $orderId ): void {
166 if ( false === $this->optionsProvider->isPacketAutoSubmissionEnabled() ) {
167 return;
168 }
169 as_schedule_single_action( time(), self::HOOK_NAME_HANDLE_EVENT, [ $event, $orderId, is_admin() === false ] );
170 }
171
172 }
173