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

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