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