PluginProbe
Packeta / 2.1
Packeta v2.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 / Repository.php

Repository.php in Packeta 2.1, at src/Packetery/Module/Order/Repository.php

722 lines 21.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Class Repository.
4 *
5 * @package Packetery\Module\Order
6 */
7
8 declare( strict_types=1 );
9
10 namespace Packetery\Module\Order;
11
12 use DateTimeImmutable;
13 use Exception;
14 use Packetery\Core\CoreHelper;
15 use Packetery\Core\Entity;
16 use Packetery\Core\Entity\Order;
17 use Packetery\Core\Entity\PickupPoint;
18 use Packetery\Module\Carrier;
19 use Packetery\Module\Carrier\PacketaPickupPointsConfig;
20 use Packetery\Module\CustomsDeclaration;
21 use Packetery\Module\Exception\InvalidCarrierException;
22 use Packetery\Module\ModuleHelper;
23 use Packetery\Module\Shipping\ShippingProvider;
24 use Packetery\Module\WpdbAdapter;
25 use WC_Order;
26 use WP_Post;
27
28 /**
29 * Class Repository.
30 *
31 * @package Packetery\Module\Order
32 */
33 class Repository {
34
35 /**
36 * WpdbAdapter.
37 *
38 * @var WpdbAdapter
39 */
40 private $wpdbAdapter;
41
42 /**
43 * Order factory.
44 *
45 * @var Builder
46 */
47 private $builder;
48
49 /**
50 * CoreHelper.
51 *
52 * @var CoreHelper
53 */
54 private $coreHelper;
55
56 /**
57 * Internal pickup points config.
58 *
59 * @var PacketaPickupPointsConfig
60 */
61 private $pickupPointsConfig;
62
63 /**
64 * Carrier repository.
65 *
66 * @var Carrier\EntityRepository
67 */
68 private $carrierRepository;
69
70 /**
71 * Customs declaration repository.
72 *
73 * @var CustomsDeclaration\Repository
74 */
75 private $customsDeclarationRepository;
76
77 /**
78 * Repository constructor.
79 *
80 * @param WpdbAdapter $wpdbAdapter WpdbAdapter.
81 * @param Builder $orderFactory Order factory.
82 * @param CoreHelper $coreHelper CoreHelper.
83 * @param PacketaPickupPointsConfig $pickupPointsConfig Internal pickup points config.
84 * @param Carrier\EntityRepository $carrierRepository Carrier repository.
85 * @param CustomsDeclaration\Repository $customsDeclarationRepository Customs declaration repository.
86 */
87 public function __construct(
88 WpdbAdapter $wpdbAdapter,
89 Builder $orderFactory,
90 CoreHelper $coreHelper,
91 PacketaPickupPointsConfig $pickupPointsConfig,
92 Carrier\EntityRepository $carrierRepository,
93 CustomsDeclaration\Repository $customsDeclarationRepository
94 ) {
95 $this->wpdbAdapter = $wpdbAdapter;
96 $this->builder = $orderFactory;
97 $this->coreHelper = $coreHelper;
98 $this->pickupPointsConfig = $pickupPointsConfig;
99 $this->carrierRepository = $carrierRepository;
100 $this->customsDeclarationRepository = $customsDeclarationRepository;
101 }
102
103 /**
104 * Applies custom order status filter.
105 *
106 * @param array<string, string|null> $clauses Query clauses.
107 * @param \WP_Query|null $queryObject WP Query.
108 * @param array<string, string|null> $paramValues Param values.
109 *
110 * @return void
111 */
112 private function applyCustomFilters( array &$clauses, ?\WP_Query $queryObject, array $paramValues ): void {
113 /**
114 * Filters order statuses to exclude in Packeta order list filtering.
115 *
116 * @since 1.4
117 *
118 * @param array $orderStatusesToExclude Order statuses to exclude.
119 * @param \WP_Query|null $queryObject WP Query.
120 * @param array $paramValues Param values.
121 */
122 $orderStatusesToExclude = (array) apply_filters( 'packetery_exclude_orders_with_status', [], $queryObject, $paramValues );
123 if ( count( $orderStatusesToExclude ) === 0 ) {
124 return;
125 }
126
127 if ( ModuleHelper::isHposEnabled() ) {
128 $clauses['where'] .= sprintf( ' AND `%s`.`status` NOT IN (%s)', $this->wpdbAdapter->wcOrders, $this->wpdbAdapter->prepareInClause( $orderStatusesToExclude ) );
129 } else {
130 $clauses['where'] .= sprintf( ' AND `%s`.`post_status` NOT IN (%s)', $this->wpdbAdapter->posts, $this->wpdbAdapter->prepareInClause( $orderStatusesToExclude ) );
131 }
132 }
133
134 /**
135 * Extends SQL query clauses.
136 *
137 * @param array<string, string> $clauses Clauses.
138 * @param \WP_Query|null $queryObject Query object.
139 * @param array<string, string|null> $paramValues Param values.
140 *
141 * @return array<string, string>
142 */
143 public function processClauses( array $clauses, ?\WP_Query $queryObject, array $paramValues ): array {
144 if ( ModuleHelper::isHposEnabled() ) {
145 $clauses['join'] .= ' LEFT JOIN `' . $this->wpdbAdapter->packeteryOrder . '` ON `' . $this->wpdbAdapter->packeteryOrder . '`.`id` = `' . $this->wpdbAdapter->wcOrders . '`.`id`';
146 } else {
147 $clauses['join'] .= ' LEFT JOIN `' . $this->wpdbAdapter->packeteryOrder . '` ON `' . $this->wpdbAdapter->packeteryOrder . '`.`id` = `' . $this->wpdbAdapter->posts . '`.`id`';
148 }
149
150 if ( isset( $paramValues['packetery_carrier_id'] ) && $paramValues['packetery_carrier_id'] !== '' ) {
151 $clauses['where'] .= ' AND `' . $this->wpdbAdapter->packeteryOrder . '`.`carrier_id` = "' . esc_sql( $paramValues['packetery_carrier_id'] ) . '"';
152 $this->applyCustomFilters( $clauses, $queryObject, $paramValues );
153 }
154 if ( isset( $paramValues['packetery_to_submit'] ) && $paramValues['packetery_to_submit'] !== '' ) {
155 $clauses['where'] .= ' AND `' . $this->wpdbAdapter->packeteryOrder . '`.`carrier_id` IS NOT NULL ';
156 $clauses['where'] .= ' AND `' . $this->wpdbAdapter->packeteryOrder . '`.`is_exported` = false ';
157 $this->applyCustomFilters( $clauses, $queryObject, $paramValues );
158 }
159 if ( isset( $paramValues['packetery_to_print'] ) && $paramValues['packetery_to_print'] !== '' ) {
160 $clauses['where'] .= ' AND `' . $this->wpdbAdapter->packeteryOrder . '`.`packet_id` IS NOT NULL ';
161 $clauses['where'] .= ' AND `' . $this->wpdbAdapter->packeteryOrder . '`.`is_label_printed` = false ';
162 $this->applyCustomFilters( $clauses, $queryObject, $paramValues );
163 }
164 if ( isset( $paramValues['packetery_order_type'] ) && $paramValues['packetery_order_type'] !== '' ) {
165 if ( $paramValues['packetery_order_type'] === Entity\Carrier::INTERNAL_PICKUP_POINTS_ID ) {
166 $comparison = 'IN';
167 } else {
168 $comparison = 'NOT IN';
169 }
170 $internalCarriers = array_keys( $this->carrierRepository->getNonFeedCarriers() );
171 $internalCarriers[] = Entity\Carrier::INTERNAL_PICKUP_POINTS_ID;
172 $clauses['where'] .= ' AND `' . $this->wpdbAdapter->packeteryOrder . '`.`carrier_id` ' . $comparison . ' (' . $this->wpdbAdapter->prepareInClause( $internalCarriers ) . ')';
173 $this->applyCustomFilters( $clauses, $queryObject, $paramValues );
174 }
175 if ( isset( $paramValues['orderby'] ) && $paramValues['orderby'] === 'packetery_packet_stored_until' ) {
176 if ( $paramValues['order'] === 'asc' ) {
177 $clauses['orderby'] = '`' . $this->wpdbAdapter->packeteryOrder . '`.`stored_until` ASC';
178 }
179 if ( $paramValues['order'] === 'desc' ) {
180 $clauses['orderby'] = '`' . $this->wpdbAdapter->packeteryOrder . '`.`stored_until` DESC';
181 }
182 }
183
184 return $clauses;
185 }
186
187 /**
188 * Create table to store orders.
189 *
190 * @return bool
191 */
192 public function createOrAlterTable(): bool {
193 $createTableQuery = 'CREATE TABLE ' . $this->wpdbAdapter->packeteryOrder . ' (
194 `id` bigint(20) unsigned NOT NULL,
195 `carrier_id` varchar(15) NOT NULL,
196 `is_exported` tinyint(1) NOT NULL,
197 `packet_id` varchar(15) NULL,
198 `packet_claim_id` varchar(15) NULL,
199 `packet_claim_password` varchar(10) NULL,
200 `is_label_printed` tinyint(1) NOT NULL,
201 `point_id` varchar(50) NULL,
202 `point_name` varchar(150) NULL,
203 `point_url` varchar(255) NULL,
204 `point_street` varchar(120) NULL,
205 `point_zip` varchar(10) NULL,
206 `point_city` varchar(70) NULL,
207 `address_validated` tinyint(1) NOT NULL,
208 `delivery_address` text NULL,
209 `weight` float NULL,
210 `length` float NULL,
211 `width` float NULL,
212 `height` float NULL,
213 `adult_content` tinyint(1) NULL,
214 `value` double NULL,
215 `cod` double NULL,
216 `api_error_message` text NULL,
217 `api_error_date` datetime NULL,
218 `carrier_number` varchar(50) NULL,
219 `packet_status` varchar(30) NULL,
220 `stored_until` date NULL,
221 `deliver_on` date NULL,
222 `car_delivery_id` varchar(15) NULL,
223 PRIMARY KEY (`id`)
224 ) ' . $this->wpdbAdapter->get_charset_collate();
225
226 return $this->wpdbAdapter->dbDelta( $createTableQuery, $this->wpdbAdapter->packeteryOrder );
227 }
228
229 /**
230 * @throws InvalidCarrierException InvalidCarrierException.
231 */
232 public function getById( int $id ): ?Order {
233 $wcOrder = $this->getWcOrderById( $id );
234 if ( $wcOrder === null ) {
235 return null;
236 }
237
238 return $this->getByWcOrder( $wcOrder );
239 }
240
241 /**
242 * Ignores InvalidCarrierException.
243 */
244 public function getByIdWithValidCarrier( int $id ): ?Order {
245 $wcOrder = $this->getWcOrderById( $id );
246 if ( $wcOrder === null ) {
247 return null;
248 }
249
250 return $this->getByWcOrderWithValidCarrier( $wcOrder );
251 }
252
253 /**
254 * Returns Packeta order, or null.
255 *
256 * @param int $id Order ID.
257 *
258 * @return Order|null
259 */
260 public function findById( int $id ): ?Order {
261 $wcOrder = $this->getWcOrderById( $id );
262 if ( $wcOrder === null ) {
263 return null;
264 }
265
266 $result = $this->getDataById( $wcOrder->get_id() );
267 if ( $result === null ) {
268 return null;
269 }
270
271 try {
272 return $this->builder->build( $wcOrder, $result );
273 } catch ( InvalidCarrierException $invalidCarrierException ) {
274 return null;
275 }
276 }
277
278 /**
279 * Gets Packeta order data by id.
280 *
281 * @param int $id Order id.
282 *
283 * @return object|null
284 */
285 public function getDataById( int $id ): ?object {
286 return $this->wpdbAdapter->get_row(
287 $this->wpdbAdapter->prepare(
288 '
289 SELECT `o`.* FROM `' . $this->wpdbAdapter->packeteryOrder . '` `o`
290 ' . $this->getWcOrderJoinClause() . '
291 WHERE `o`.`id` = %d',
292 $id
293 )
294 );
295 }
296
297 private function getDataByWcOrder( WC_Order $wcOrder ): ?object {
298 if ( ! ShippingProvider::wcOrderHasOurMethod( $wcOrder ) ) {
299 return null;
300 }
301
302 $packeteryOrderData = $this->getDataById( $wcOrder->get_id() );
303 if ( ! is_object( $packeteryOrderData ) ) {
304 return null;
305 }
306
307 return $packeteryOrderData;
308 }
309
310 /**
311 * @throws InvalidCarrierException
312 */
313 public function getByWcOrder( WC_Order $wcOrder ): ?Order {
314 $packeteryOrderData = $this->getDataByWcOrder( $wcOrder );
315 if ( $packeteryOrderData === null ) {
316 return null;
317 }
318
319 return $this->builder->build( $wcOrder, $packeteryOrderData );
320 }
321
322 /**
323 * Ignores InvalidCarrierException.
324 */
325 public function getByWcOrderWithValidCarrier( WC_Order $wcOrder ): ?Order {
326 $packeteryOrderData = $this->getDataByWcOrder( $wcOrder );
327 if ( $packeteryOrderData === null ) {
328 return null;
329 }
330
331 try {
332 return $this->builder->build( $wcOrder, $packeteryOrderData );
333 } catch ( InvalidCarrierException $invalidCarrierException ) {
334 return null;
335 }
336 }
337
338 /**
339 * Transforms order to DB array.
340 *
341 * @param Order $order Order.
342 *
343 * @return array<string, bool|float|int|string|null>
344 */
345 private function orderToDbArray( Order $order ): array {
346 $point = $order->getPickupPoint();
347 if ( $point === null ) {
348 $point = new PickupPoint();
349 }
350
351 $deliveryAddress = null;
352 if ( $order->isAddressValidated() && $order->getDeliveryAddress() !== null ) {
353 $deliveryAddress = wp_json_encode( $order->getDeliveryAddress()->export() );
354 }
355
356 $apiErrorDateTime = $order->getLastApiErrorDateTime();
357 if ( $apiErrorDateTime !== null ) {
358 $apiErrorDateTime = $apiErrorDateTime->format( CoreHelper::MYSQL_DATETIME_FORMAT );
359 }
360
361 $data = [
362 'id' => (int) $order->getNumber(),
363 'carrier_id' => $order->getCarrier()->getId(),
364 'is_exported' => (int) $order->isExported(),
365 'packet_id' => $order->getPacketId(),
366 'packet_claim_id' => $order->getPacketClaimId(),
367 'packet_claim_password' => $order->getPacketClaimPassword(),
368 'packet_status' => $order->getPacketStatus(),
369 'stored_until' => $this->coreHelper->getStringFromDateTime( $order->getStoredUntil(), CoreHelper::DATEPICKER_FORMAT ),
370 'is_label_printed' => (int) $order->isLabelPrinted(),
371 'carrier_number' => $order->getCarrierNumber(),
372 'weight' => $order->getWeight(),
373 'car_delivery_id' => $order->getCarDeliveryId(),
374 'point_id' => $point->getId(),
375 'point_name' => $point->getName(),
376 'point_url' => $point->getUrl(),
377 'point_street' => $point->getStreet(),
378 'point_zip' => $point->getZip(),
379 'point_city' => $point->getCity(),
380 'address_validated' => (int) $order->isAddressValidated(),
381 'delivery_address' => $deliveryAddress,
382 'length' => $order->getLength(),
383 'width' => $order->getWidth(),
384 'height' => $order->getHeight(),
385 'adult_content' => $order->containsAdultContent(),
386 'cod' => $order->getManualCod(),
387 'value' => $order->getManualValue(),
388 'api_error_message' => $order->getLastApiErrorMessage(),
389 'api_error_date' => $apiErrorDateTime,
390 'deliver_on' => $this->coreHelper->getStringFromDateTime( $order->getDeliverOn(), CoreHelper::DATEPICKER_FORMAT ),
391 ];
392
393 return $data;
394 }
395
396 /**
397 * Saves order.
398 *
399 * @param Order $order Order.
400 *
401 * @return void
402 */
403 public function save( Order $order ): void {
404 $this->saveData( $this->orderToDbArray( $order ) );
405 }
406
407 /**
408 * Saves order data.
409 *
410 * @param array<string, int|string|null|DateTimeImmutable> $orderData Order data.
411 *
412 * @return void
413 */
414 public function saveData( array $orderData ): void {
415 $this->onBeforeDataInsertion( $orderData );
416 $this->wpdbAdapter->insertReplaceHelper( $this->wpdbAdapter->packeteryOrder, $orderData, null, 'REPLACE' );
417 }
418
419 /**
420 * Calls logic before order data replace/insert.
421 *
422 * @param array<string, string|null|DateTimeImmutable> $orderData Order data.
423 * @return void
424 */
425 private function onBeforeDataInsertion( array $orderData ): void {
426 $pointId = $orderData['point_id'] ?? null;
427 $carrierId = $orderData['carrier_id'] ?? null;
428 /**
429 * Tells if Packeta debug logs are enabled.
430 *
431 * @since 1.7.2
432 */
433 $isLoggingActive = (bool) apply_filters( 'packeta_enable_debug_logs', false );
434
435 if ( ( $pointId !== null && $pointId !== '' ) || ! $isLoggingActive || ! $this->pickupPointsConfig->isInternalPickupPointCarrier( $carrierId ) ) {
436 return;
437 }
438
439 $wcLogger = wc_get_logger();
440 $dataToLog = [
441 'order' => $orderData,
442 'trace' => array_map(
443 static function ( array $item ): array {
444 return [
445 'file' => sprintf( '%s(%s)', $item['file'], $item['line'] ),
446 'method' => sprintf( '%s%s%s(...)', $item['class'] ?? '', $item['type'] ?? '', $item['function'] ),
447 ];
448 },
449 ( new Exception() )->getTrace()
450 ),
451 ];
452 $wcLogger->warning(
453 sprintf(
454 'Required value for the pickup point order is not set: %s',
455 wp_json_encode( $dataToLog, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE )
456 ),
457 [ 'source' => 'packeta' ]
458 );
459 }
460
461 /**
462 * Loads order entities by list of ids.
463 *
464 * @param string[] $orderIds Order ids.
465 *
466 * @return Order[]
467 */
468 public function getByIds( array $orderIds ): array {
469 if ( count( $orderIds ) === 0 ) {
470 return [];
471 }
472
473 $wpdbAdapter = $this->wpdbAdapter;
474 $ordersIdsPlaceholder = implode( ', ', array_fill( 0, count( $orderIds ), '%d' ) );
475 $packeteryOrdersResult = $wpdbAdapter->get_results(
476 $wpdbAdapter->prepare(
477 'SELECT * FROM `' . $wpdbAdapter->packeteryOrder . '`
478 WHERE `id` IN (' . $ordersIdsPlaceholder . ')',
479 $orderIds
480 ),
481 OBJECT_K
482 );
483
484 $orderEntities = [];
485 foreach ( $orderIds as $orderId ) {
486 if ( ! isset( $packeteryOrdersResult[ $orderId ] ) ) {
487 continue;
488 }
489
490 $wcOrder = $this->getWcOrderById( (int) $orderId );
491 assert( $wcOrder !== null, 'WC order has to be present' );
492
493 try {
494 $orderEntities[ $orderId ] = $this->builder->build( $wcOrder, $packeteryOrdersResult[ $orderId ] );
495 } catch ( InvalidCarrierException $exception ) {
496 continue;
497 }
498 }
499
500 return $orderEntities;
501 }
502
503 /**
504 * Finds orders.
505 *
506 * @param string[] $allowedPacketStatuses Allowed packet statuses.
507 * @param string[] $allowedOrderStatuses Allowed order statuses.
508 * @param int $maxDays Max number of days of single packet sync.
509 * @param int $limit Number of records.
510 *
511 * @return \Generator<int>
512 * @throws Exception Exception.
513 */
514 public function findStatusSyncingOrderIds( array $allowedPacketStatuses, array $allowedOrderStatuses, int $maxDays, int $limit ): \Generator {
515 $dateLimit = CoreHelper::now()->modify( '- ' . $maxDays . ' days' )->format( 'Y-m-d H:i:s' );
516
517 $andWhere = [ '`o`.`packet_id` IS NOT NULL' ];
518 $hposEnabled = ModuleHelper::isHposEnabled();
519
520 if ( $hposEnabled ) {
521 $andWhere[] = $this->wpdbAdapter->prepare( '`wc_o`.`date_created_gmt` >= %s', $dateLimit );
522 } else {
523 $andWhere[] = $this->wpdbAdapter->prepare( '`wp_p`.`post_date_gmt` >= %s', $dateLimit );
524 }
525
526 $orPacketStatus = [];
527 $orPacketStatus[] = '`o`.`packet_status` IS NULL';
528
529 if ( count( $allowedPacketStatuses ) > 0 ) {
530 $orPacketStatus[] = '`o`.`packet_status` IN (' . $this->wpdbAdapter->prepareInClause( $allowedPacketStatuses ) . ')';
531 }
532
533 if ( count( $orPacketStatus ) > 0 ) {
534 $andWhere[] = '(' . implode( ' OR ', $orPacketStatus ) . ')';
535 }
536
537 if ( count( $allowedOrderStatuses ) > 0 && $hposEnabled ) {
538 $andWhere[] = '`wc_o`.`status` IN (' . $this->wpdbAdapter->prepareInClause( $allowedOrderStatuses ) . ')';
539 } elseif ( count( $allowedOrderStatuses ) > 0 && $hposEnabled === false ) {
540 $andWhere[] = '`wp_p`.`post_status` IN (' . $this->wpdbAdapter->prepareInClause( $allowedOrderStatuses ) . ')';
541 } else {
542 $andWhere[] = '1 = 0';
543 }
544
545 $where = '';
546 if ( count( $andWhere ) > 0 ) {
547 $where = ' WHERE ' . implode( ' AND ', $andWhere );
548 }
549
550 if ( $hposEnabled ) {
551 $orderBy = ' ORDER BY `wc_o`.`date_created_gmt` ';
552 } else {
553 $orderBy = ' ORDER BY `wp_p`.`post_date_gmt` ';
554 }
555
556 $sql = $this->wpdbAdapter->prepare(
557 '
558 SELECT `o`.`id` FROM `' . $this->wpdbAdapter->packeteryOrder . '` `o`
559 ' . $this->getWcOrderJoinClause() . '
560 ' . $where . '
561 ' . $orderBy . '
562 LIMIT %d',
563 $limit
564 );
565
566 $rows = $this->wpdbAdapter->get_results( $sql );
567
568 foreach ( $rows as $row ) {
569 $wcOrder = $this->getWcOrderById( (int) $row->id );
570 if ( $wcOrder === null || ! ShippingProvider::wcOrderHasOurMethod( $wcOrder ) ) {
571 continue;
572 }
573
574 yield (int) $row->id;
575 }
576 }
577
578 /**
579 * Counts order to be submitted.
580 *
581 * @return int
582 */
583 public function countOrdersToSubmit(): int {
584 return $this->countOrders( [ 'packetery_to_submit' => '1' ] );
585 }
586
587 /**
588 * Counts order to be printed.
589 *
590 * @return int
591 */
592 public function countOrdersToPrint(): int {
593 return $this->countOrders( [ 'packetery_to_print' => '1' ] );
594 }
595
596 /**
597 * Counts orders by given params.
598 *
599 * @param array<string, string> $params Params.
600 *
601 * @return int
602 */
603 private function countOrders( array $params ): int {
604 $clauses = [ 'join' => '' ];
605
606 if ( ModuleHelper::isHposEnabled() ) {
607 $clauses['select'] = ' SELECT COUNT(DISTINCT `' . $this->wpdbAdapter->wcOrders . '`.`id`) ';
608 $clauses['from'] = ' FROM `' . $this->wpdbAdapter->wcOrders . '` ';
609 } else {
610 $clauses['select'] = ' SELECT COUNT(DISTINCT `' . $this->wpdbAdapter->posts . '`.`ID`) ';
611 $clauses['from'] = ' FROM `' . $this->wpdbAdapter->posts . '` ';
612 }
613
614 $clauses['where'] = ' WHERE `' . $this->wpdbAdapter->packeteryOrder . '`.`id` IS NOT NULL ';
615 $clauses = $this->processClauses( $clauses, null, $params );
616
617 return (int) $this->wpdbAdapter->get_var(
618 $clauses['select'] .
619 $clauses['from'] .
620 $clauses['join'] .
621 $clauses['where']
622 );
623 }
624
625 /**
626 * Gets WC Order join clause.
627 *
628 * @return string
629 */
630 public function getWcOrderJoinClause(): string {
631 $packeteryTableAlias = 'o';
632
633 if ( ModuleHelper::isHposEnabled() ) {
634 $sourceTableAlias = 'wc_o';
635
636 return sprintf(
637 'JOIN `%s` `%s` ON `%s`.`id` = `%s`.`id`',
638 $this->wpdbAdapter->wcOrders,
639 $sourceTableAlias,
640 $sourceTableAlias,
641 $packeteryTableAlias
642 );
643 }
644
645 $sourceTableAlias = 'wp_p';
646
647 return sprintf(
648 'JOIN `%s` `%s` ON `%s`.`ID` = `%s`.`id`',
649 $this->wpdbAdapter->posts,
650 $sourceTableAlias,
651 $sourceTableAlias,
652 $packeteryTableAlias
653 );
654 }
655
656 /**
657 * Deletes all custom table records linked to permanently deleted orders.
658 *
659 * @return void
660 */
661 public function deleteOrphans(): void {
662 if ( ModuleHelper::isHposEnabled() ) {
663 $this->wpdbAdapter->query(
664 'DELETE `' . $this->wpdbAdapter->packeteryOrder . '` FROM `' . $this->wpdbAdapter->packeteryOrder . '`
665 LEFT JOIN `' . $this->wpdbAdapter->wcOrders . '` ON `' . $this->wpdbAdapter->wcOrders . '`.`id` = `' . $this->wpdbAdapter->packeteryOrder . '`.`id`
666 WHERE `' . $this->wpdbAdapter->wcOrders . '`.`id` IS NULL'
667 );
668
669 return;
670 }
671
672 $this->wpdbAdapter->query(
673 'DELETE `' . $this->wpdbAdapter->packeteryOrder . '` FROM `' . $this->wpdbAdapter->packeteryOrder . '`
674 LEFT JOIN `' . $this->wpdbAdapter->posts . '` ON `' . $this->wpdbAdapter->posts . '`.`ID` = `' . $this->wpdbAdapter->packeteryOrder . '`.`id`
675 WHERE `' . $this->wpdbAdapter->posts . '`.`ID` IS NULL'
676 );
677 }
678
679 /**
680 * Deletes order data including customs declaration and its items from custom tables.
681 *
682 * @param int $orderId Order id.
683 *
684 * @return void
685 */
686 public function delete( int $orderId ): void {
687 $this->customsDeclarationRepository->delete( (string) $orderId );
688 $this->wpdbAdapter->delete( $this->wpdbAdapter->packeteryOrder, [ 'id' => $orderId ], '%d' );
689 }
690
691 /**
692 * Fires after post deletion.
693 *
694 * @param int $postId Post id.
695 * @param WP_Post $post Post object.
696 *
697 * @return void
698 */
699 public function deletedPostHook( int $postId, WP_Post $post ): void {
700 // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
701 if ( $post->post_type === 'shop_order' ) {
702 $this->delete( $postId );
703 }
704 }
705
706 /**
707 * Gets WC_Order object.
708 *
709 * @param int $id Order id.
710 *
711 * @return WC_Order|null
712 */
713 public function getWcOrderById( int $id ): ?WC_Order {
714 $result = wc_get_order( $id );
715 if ( $result instanceof WC_Order ) {
716 return $result;
717 }
718
719 return null;
720 }
721 }
722