PluginProbe
Packeta / 1.4.1
Packeta v1.4.1
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 / PacketCanceller.php

PacketCanceller.php in Packeta 1.4.1, at src/Packetery/Module/Order/PacketCanceller.php

314 lines 8.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Class PacketCanceller
4 *
5 * @package Packetery\Api
6 */
7
8 declare( strict_types=1 );
9
10
11 namespace Packetery\Module\Order;
12
13 use Packetery\Core\Api\Soap;
14 use Packetery\Core\Entity;
15 use Packetery\Core\Log;
16 use Packetery\Module\MessageManager;
17 use Packetery\Module\Options;
18 use Packetery\Module\Plugin;
19 use PacketeryNette\Http\Request;
20
21 /**
22 * Class PacketCanceller
23 *
24 * @package Packetery\Api
25 */
26 class PacketCanceller {
27
28 public const ACTION_CANCEL_PACKET = 'cancel_packet';
29 public const PARAM_ORDER_ID = 'order_id';
30 public const PARAM_REDIRECT_TO = 'packetery_redirect_to';
31 public const REDIRECT_TO_ORDER_GRID = 'order-grid';
32 public const REDIRECT_TO_ORDER_DETAIL = 'order-detail';
33
34 /**
35 * SOAP API Client.
36 *
37 * @var Soap\Client SOAP API Client.
38 */
39 private $soapApiClient;
40
41 /**
42 * Order repository.
43 *
44 * @var Repository
45 */
46 private $orderRepository;
47
48 /**
49 * ILogger.
50 *
51 * @var Log\ILogger
52 */
53 private $logger;
54
55 /**
56 * Request.
57 *
58 * @var Request
59 */
60 private $request;
61
62 /**
63 * Options provider.
64 *
65 * @var Options\Provider
66 */
67 private $optionsProvider;
68
69 /**
70 * Message manager.
71 *
72 * @var MessageManager
73 */
74 private $messageManager;
75
76 /**
77 * Constructor.
78 *
79 * @param Soap\Client $soapApiClient Soap client API.
80 * @param Log\ILogger $logger Logger.
81 * @param Repository $orderRepository Order repository.
82 * @param Request $request Request.
83 * @param Options\Provider $optionsProvider Options provider.
84 * @param MessageManager $messageManager Message manager.
85 */
86 public function __construct(
87 Soap\Client $soapApiClient,
88 Log\ILogger $logger,
89 Repository $orderRepository,
90 Request $request,
91 Options\Provider $optionsProvider,
92 MessageManager $messageManager
93 ) {
94 $this->soapApiClient = $soapApiClient;
95 $this->logger = $logger;
96 $this->orderRepository = $orderRepository;
97 $this->request = $request;
98 $this->optionsProvider = $optionsProvider;
99 $this->messageManager = $messageManager;
100 }
101
102 /**
103 * Creates nonce action name.
104 *
105 * @param string $action Action.
106 * @param string $orderNumber Order number.
107 *
108 * @return string
109 */
110 public static function createNonceAction( string $action, string $orderNumber ): string {
111 return $action . '_' . $orderNumber;
112 }
113
114 /**
115 * Process actions.
116 *
117 * @return void
118 */
119 public function processActions(): void {
120 $action = $this->request->getQuery( Plugin::PARAM_PACKETERY_ACTION );
121 if ( self::ACTION_CANCEL_PACKET !== $action ) {
122 return;
123 }
124
125 $redirectTo = $this->request->getQuery( self::PARAM_REDIRECT_TO );
126 $order = null;
127 $orderId = $this->getOrderId();
128 if ( null !== $orderId ) {
129 $order = $this->orderRepository->getById( $orderId );
130 }
131
132 if ( null === $order ) {
133 $record = new Log\Record();
134 $record->action = Log\Record::ACTION_PACKET_CANCEL;
135 $record->status = Log\Record::STATUS_ERROR;
136 $record->orderId = null;
137 $record->title = __( 'Packet cancel error', 'packeta' );
138 $record->params = [
139 'referer' => (string) $this->request->getReferer(),
140 'errorMessage' => 'Order not found',
141 ];
142
143 $this->logger->add( $record );
144
145 $this->messageManager->flash_message( __( 'Order not found', 'packeta' ), MessageManager::TYPE_ERROR );
146 $this->redirectTo( $redirectTo, $order );
147 return;
148 }
149
150 if ( 1 !== wp_verify_nonce( $this->request->getQuery( Plugin::PARAM_NONCE ), self::createNonceAction( self::ACTION_CANCEL_PACKET, $order->getNumber() ) ) ) {
151 $this->messageManager->flash_message( __( 'Link has expired. Please try again.', 'packeta' ), MessageManager::TYPE_ERROR );
152 $this->redirectTo( $redirectTo, $order );
153 return;
154 }
155
156 $this->cancelPacket( $order );
157 $this->redirectTo( $redirectTo, $order );
158 }
159
160 /**
161 * Redirects.
162 *
163 * @param string $redirectTo Redirect to.
164 * @param Entity\Order|null $order Order.
165 *
166 * @return void
167 */
168 private function redirectTo( string $redirectTo, ?Entity\Order $order ): void {
169 if ( self::REDIRECT_TO_ORDER_GRID === $redirectTo ) {
170 $packetCancelLink = add_query_arg(
171 [
172 'post_type' => 'shop_order',
173 ],
174 admin_url( 'edit.php' )
175 );
176
177 if ( wp_safe_redirect( $packetCancelLink ) ) {
178 exit;
179 }
180 }
181
182 if ( self::REDIRECT_TO_ORDER_DETAIL === $redirectTo && null !== $order ) {
183 $packetCancelLink = add_query_arg(
184 [
185 'post_type' => 'shop_order',
186 'post' => $order->getNumber(),
187 'action' => 'edit',
188 ],
189 admin_url( 'post.php' )
190 );
191
192 if ( wp_safe_redirect( $packetCancelLink ) ) {
193 exit;
194 }
195 }
196 }
197
198 /**
199 * Cancels single packet.
200 *
201 * @param Entity\Order $order Order ID.
202 *
203 * @return void
204 */
205 public function cancelPacket( Entity\Order $order ): void {
206 if ( null === $order->getPacketId() ) {
207 $record = new Log\Record();
208 $record->action = Log\Record::ACTION_PACKET_CANCEL;
209 $record->status = Log\Record::STATUS_ERROR;
210 $record->orderId = $order->getNumber();
211 $record->title = __( 'Packet cancel error', 'packeta' );
212 $record->params = [
213 'orderId' => $order->getNumber(),
214 'packetId' => $order->getPacketId(),
215 'referer' => (string) $this->request->getReferer(),
216 'errorMessage' => 'Packet could not be cancelled',
217 ];
218
219 $this->logger->add( $record );
220
221 $this->messageManager->flash_message( __( 'Packet could not be cancelled', 'packeta' ), MessageManager::TYPE_ERROR );
222 return;
223 }
224
225 $request = new Soap\Request\CancelPacket( (int) $order->getPacketId() );
226 $result = $this->soapApiClient->cancelPacket( $request );
227
228 if ( ! $result->hasFault() ) {
229 $record = new Log\Record();
230 $record->action = Log\Record::ACTION_PACKET_CANCEL;
231 $record->status = Log\Record::STATUS_SUCCESS;
232 $record->orderId = $order->getNumber();
233 $record->title = __( 'Packet cancel success', 'packeta' );
234 $record->params = [
235 'orderId' => $order->getNumber(),
236 'packetId' => $order->getPacketId(),
237 ];
238
239 $this->logger->add( $record );
240 }
241
242 if ( $result->hasFault() ) {
243 $record = new Log\Record();
244 $record->action = Log\Record::ACTION_PACKET_CANCEL;
245 $record->status = Log\Record::STATUS_ERROR;
246 $record->orderId = $order->getNumber();
247 $record->title = __( 'Packet cancel error', 'packeta' );
248 $record->params = [
249 'orderId' => $order->getNumber(),
250 'packetId' => $order->getPacketId(),
251 'errorMessage' => $result->getFaultString(),
252 ];
253
254 $this->logger->add( $record );
255 }
256
257 if ( $this->shouldRevertSubmission( $result ) ) {
258 $order->setIsExported( false );
259 $order->setIsLabelPrinted( false );
260 $order->setCarrierNumber( null );
261 $order->setPacketStatus( null );
262 $order->setPacketId( null );
263 $this->orderRepository->save( $order );
264
265 if ( $result->hasFault() ) {
266 $this->messageManager->flash_message( __( 'Packet could not be canceled in the Packeta system, packet was canceled only in the order list.', 'packeta' ), MessageManager::TYPE_SUCCESS );
267 }
268
269 if ( ! $result->hasFault() ) {
270 $this->messageManager->flash_message( __( 'Packet has been successfully canceled both in the order list and the Packeta system.', 'packeta' ), MessageManager::TYPE_SUCCESS );
271 }
272 }
273
274 if ( ! $this->shouldRevertSubmission( $result ) ) {
275 $this->messageManager->flash_message( __( 'Failed to cancel packet. See Packeta log for more details.', 'packeta' ), MessageManager::TYPE_ERROR );
276 }
277 }
278
279 /**
280 * Should revert local order submission to Packeta.
281 *
282 * @param Soap\Response\CancelPacket|null $result Packeta API result.
283 *
284 * @return bool
285 */
286 public function shouldRevertSubmission( ?Soap\Response\CancelPacket $result ): bool {
287 if ( null === $result ) {
288 return false;
289 }
290
291 $revertSubmission = ! $result->hasFault();
292
293 if ( $result->hasCancelNotAllowedFault() && $this->optionsProvider->isPacketCancellationForced() ) {
294 $revertSubmission = true;
295 }
296
297 return $revertSubmission;
298 }
299
300 /**
301 * Gets order ID.
302 *
303 * @return int|null
304 */
305 private function getOrderId(): ?int {
306 $orderId = $this->request->getQuery( self::PARAM_ORDER_ID );
307 if ( is_numeric( $orderId ) ) {
308 return (int) $orderId;
309 }
310
311 return null;
312 }
313 }
314