PluginProbe
Packeta / 2.0.9
Packeta v2.0.9
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/Upgrade.php +197 -132 1.42.0.9 View file →
@@ -11,8 +11,11 @@
11 11
12 12 use Packetery\Core;
13 13 use Packetery\Core\Log\ILogger;
14 14 use Packetery\Core\Log\Record;
15 +use Packetery\Module\Carrier\EntityRepository;
16 +use Packetery\Module\Options\OptionsProvider;
17 +use Packetery\Module\Upgrade\Version_1_4_2;
15 18
16 19 /**
17 20 * Class Upgrade.
18 21 */
@@ -72,38 +75,53 @@
72 75 */
73 76 private $carrierRepository;
74 77
75 78 /**
76 - * WPDB.
79 + * Customs declaration repository.
77 80 *
78 - * @var \wpdb
81 + * @var CustomsDeclaration\Repository
79 82 */
80 - private $wpdb;
83 + private $customsDeclarationRepository;
81 84
82 85 /**
83 - * Constructor.
86 + * WpdbAdapter.
84 87 *
85 - * @param Order\Repository $orderRepository Order repository.
86 - * @param MessageManager $messageManager Message manager.
87 - * @param ILogger $logger Logger.
88 - * @param Log\Repository $logRepository Log repository.
89 - * @param \wpdb $wpdb WPDB.
90 - * @param Carrier\Repository $carrierRepository Carrier repository.
88 + * @var WpdbAdapter
91 89 */
90 + private $wpdbAdapter;
91 +
92 + /**
93 + * Options provider.
94 + *
95 + * @var OptionsProvider
96 + */
97 + private $optionsProvider;
98 +
99 + /**
100 + * @var EntityRepository
101 + */
102 + private $carrierEntityRepository;
103 +
92 104 public function __construct(
93 105 Order\Repository $orderRepository,
94 106 MessageManager $messageManager,
95 107 ILogger $logger,
96 108 Log\Repository $logRepository,
97 - \wpdb $wpdb,
98 - Carrier\Repository $carrierRepository
109 + WpdbAdapter $wpdbAdapter,
110 + Carrier\Repository $carrierRepository,
111 + CustomsDeclaration\Repository $customsDeclarationRepository,
112 + OptionsProvider $optionsProvider,
113 + EntityRepository $carrierEntityRepository
99 114 ) {
100 - $this->orderRepository = $orderRepository;
101 - $this->messageManager = $messageManager;
102 - $this->logger = $logger;
103 - $this->logRepository = $logRepository;
104 - $this->wpdb = $wpdb;
105 - $this->carrierRepository = $carrierRepository;
115 + $this->orderRepository = $orderRepository;
116 + $this->messageManager = $messageManager;
117 + $this->logger = $logger;
118 + $this->logRepository = $logRepository;
119 + $this->wpdbAdapter = $wpdbAdapter;
120 + $this->carrierRepository = $carrierRepository;
121 + $this->customsDeclarationRepository = $customsDeclarationRepository;
122 + $this->optionsProvider = $optionsProvider;
123 + $this->carrierEntityRepository = $carrierEntityRepository;
106 124 }
107 125
108 126 /**
109 127 * Checks previous plugin version and runs upgrade if needed.
@@ -112,84 +130,104 @@
112 130 * @return void
113 131 */
114 132 public function check(): void {
115 133 $oldVersion = get_option( 'packetery_version' );
116 - if ( Plugin::VERSION === $oldVersion ) {
134 + if ( $oldVersion === Plugin::VERSION ) {
117 135 return;
118 136 }
119 137
120 - $this->logRepository->createTable();
121 - $createResult = $this->carrierRepository->createTable();
122 - if ( false === $createResult ) {
123 - $lastError = $this->wpdb->last_error;
124 - $this->messageManager->flash_message( __( 'Database carrier table was not created, you can find more information in Packeta log.', 'packeta' ), MessageManager::TYPE_ERROR );
138 + $this->createLogTable();
139 + $this->createCarrierTable();
140 + $this->createOrderTable();
141 + $this->createCustomsDeclarationTables();
125 142
126 - $record = new Record();
127 - $record->action = Record::ACTION_CARRIER_TABLE_NOT_CREATED;
128 - $record->status = Record::STATUS_ERROR;
129 - $record->title = __( 'Database carrier table was not created.', 'packeta' );
130 - $record->params = [
131 - 'errorMessage' => $lastError,
132 - ];
133 - $this->logger->add( $record );
134 - }
143 + // If no previous version detected, no upgrade will be run.
144 + if ( $oldVersion !== null && $oldVersion !== false ) {
145 + if ( version_compare( $oldVersion, '1.2.0', '<' ) ) {
146 + $logEntries = get_posts(
147 + [
148 + 'post_type' => 'packetery_log',
149 + 'post_status' => 'any',
150 + 'nopaging' => true,
151 + 'fields' => 'ids',
152 + ]
153 + );
154 + foreach ( $logEntries as $logEntryId ) {
155 + wp_delete_post( $logEntryId, true );
156 + }
135 157
136 - $createResult = $this->orderRepository->createTable();
137 - if ( false === $createResult ) {
138 - $lastError = $this->wpdb->last_error;
139 - $this->messageManager->flash_message( __( 'Database order table was not created, you can find more information in Packeta log.', 'packeta' ), MessageManager::TYPE_ERROR );
158 + unregister_post_type( 'packetery_log' );
140 159
141 - $record = new Record();
142 - $record->action = Record::ACTION_ORDER_TABLE_NOT_CREATED;
143 - $record->status = Record::STATUS_ERROR;
144 - $record->title = __( 'Database order table was not created.', 'packeta' );
145 - $record->params = [
146 - 'errorMessage' => $lastError,
147 - ];
148 - $this->logger->add( $record );
149 - }
160 + $this->migrateWpOrderMetadata();
161 + $addressEntries = get_posts(
162 + [
163 + 'post_type' => self::POST_TYPE_VALIDATED_ADDRESS,
164 + 'post_status' => 'any',
165 + 'nopaging' => true,
166 + 'fields' => 'ids',
167 + ]
168 + );
169 + foreach ( $addressEntries as $addressEntryId ) {
170 + wp_delete_post( $addressEntryId, true );
171 + }
150 172
151 - // If no previous version detected, no upgrade will be run.
152 - if ( $oldVersion && version_compare( $oldVersion, '1.2.0', '<' ) ) {
153 - $logEntries = get_posts(
154 - [
155 - 'post_type' => 'packetery_log',
156 - 'post_status' => 'any',
157 - 'nopaging' => true,
158 - 'fields' => 'ids',
159 - ]
160 - );
161 - foreach ( $logEntries as $logEntryId ) {
162 - wp_delete_post( $logEntryId, true );
173 + unregister_post_type( self::POST_TYPE_VALIDATED_ADDRESS );
163 174 }
164 175
165 - unregister_post_type( 'packetery_log' );
176 + if ( version_compare( $oldVersion, '1.2.6', '<' ) ) {
177 + $this->orderRepository->deleteOrphans();
178 + }
166 179
167 - $this->migrateWpOrderMetadata();
168 - $addressEntries = get_posts(
169 - [
170 - 'post_type' => self::POST_TYPE_VALIDATED_ADDRESS,
171 - 'post_status' => 'any',
172 - 'nopaging' => true,
173 - 'fields' => 'ids',
174 - ]
175 - );
176 - foreach ( $addressEntries as $addressEntryId ) {
177 - wp_delete_post( $addressEntryId, true );
180 + if ( version_compare( $oldVersion, '1.4.2', '<' ) ) {
181 + $migration = new Version_1_4_2( $this->wpdbAdapter );
182 + $migration->run();
178 183 }
179 184
180 - unregister_post_type( self::POST_TYPE_VALIDATED_ADDRESS );
181 - }
185 + if ( version_compare( $oldVersion, '1.5', '<' ) ) {
186 + wp_clear_scheduled_hook( CronService::CRON_CARRIERS_HOOK );
187 + }
182 188
183 - if ( $oldVersion && version_compare( $oldVersion, '1.2.6', '<' ) ) {
184 - $this->orderRepository->deleteOrphans();
185 - }
189 + if ( version_compare( $oldVersion, '1.6.0', '<' ) ) {
190 + wp_clear_scheduled_hook( CronService::CRON_LOG_AUTO_DELETION_HOOK );
191 + wp_clear_scheduled_hook( CronService::CRON_PACKET_STATUS_SYNC_HOOK );
192 + }
186 193
187 - if ( $oldVersion && version_compare( $oldVersion, '1.4', '<' ) ) {
188 - $this->logRepository->addOrderIdColumn();
189 - $this->orderRepository->addAdultContentColumn();
190 - $this->orderRepository->addValueColumn();
191 - $this->orderRepository->addCodColumn();
194 + if ( version_compare( $oldVersion, '1.7.0', '<' ) ) {
195 + $orderStatusAutoChange = $this->optionsProvider->isOrderStatusAutoChangeEnabled();
196 + $autoOrderStatus = $this->optionsProvider->getAutoOrderStatus();
197 + $syncSettings = $this->optionsProvider->getOptionsByName( OptionsProvider::OPTION_NAME_PACKETERY_SYNC );
198 + if ( $orderStatusAutoChange ) {
199 + $syncSettings['allow_order_status_change'] = true;
200 + }
201 + if ( $autoOrderStatus !== null ) {
202 + $syncSettings['order_status_change_packet_statuses'] = [
203 + Core\Entity\PacketStatus::RECEIVED_DATA => $autoOrderStatus,
204 + ];
205 + }
206 +
207 + update_option( OptionsProvider::OPTION_NAME_PACKETERY_SYNC, $syncSettings );
208 + }
209 +
210 + if ( version_compare( $oldVersion, '1.7.1', '<' ) ) {
211 + $syncSettings = $this->optionsProvider->getOptionsByName( OptionsProvider::OPTION_NAME_PACKETERY_SYNC );
212 + if (
213 + isset( $syncSettings['order_status_change_packet_statuses'][ Core\Entity\PacketStatus::RECEIVED_DATA ] ) &&
214 + $syncSettings['order_status_change_packet_statuses'][ Core\Entity\PacketStatus::RECEIVED_DATA ] === ''
215 + ) {
216 + unset( $syncSettings['order_status_change_packet_statuses'][ Core\Entity\PacketStatus::RECEIVED_DATA ] );
217 + update_option( OptionsProvider::OPTION_NAME_PACKETERY_SYNC, $syncSettings );
218 + }
219 + }
220 +
221 + if ( version_compare( $oldVersion, '1.8.0', '<' ) ) {
222 + $generalSettings = $this->optionsProvider->getOptionsByName( OptionsProvider::OPTION_NAME_PACKETERY );
223 + if ( isset( $generalSettings['cod_payment_method'] ) ) {
224 + $generalSettings['cod_payment_methods'] = [ $generalSettings['cod_payment_method'] ];
225 + unset( $generalSettings['cod_payment_method'] );
226 + }
227 +
228 + update_option( OptionsProvider::OPTION_NAME_PACKETERY, $generalSettings );
229 + }
192 230 }
193 231
194 232 update_option( 'packetery_version', Plugin::VERSION );
195 233 }
@@ -199,30 +237,26 @@
199 237 *
200 238 * @return void
201 239 */
202 240 private function migrateWpOrderMetadata(): void {
203 - global $wpdb;
241 + $this->createOrderTable();
204 242
205 - $createResult = $this->orderRepository->createTable();
206 - if ( false === $createResult ) {
207 - $lastError = $wpdb->last_error;
208 - $this->messageManager->flash_message( __( 'Database order table was not created, you can find more information in Packeta log.', 'packeta' ), MessageManager::TYPE_ERROR );
209 -
210 - $record = new Record();
211 - $record->action = Record::ACTION_ORDER_TABLE_NOT_CREATED;
212 - $record->status = Record::STATUS_ERROR;
213 - $record->title = __( 'Database order table was not created.', 'packeta' );
214 - $record->params = [
215 - 'errorMessage' => $lastError,
216 - ];
217 - $this->logger->add( $record );
218 - }
219 -
220 243 // Did not work when called from plugins_loaded hook.
221 244 $orders = wc_get_orders(
222 245 [
223 - 'packetery_all' => '1',
224 - 'nopaging' => true,
246 + 'nopaging' => true,
247 + // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query
248 + 'meta_query' => [
249 + [
250 + 'key' => self::META_CARRIER_ID,
251 + 'compare' => 'EXISTS',
252 + ],
253 + [
254 + 'key' => self::META_CARRIER_ID,
255 + 'compare' => '!=',
256 + 'value' => '',
257 + ],
258 + ],
225 259 ]
226 260 );
227 261
228 262 foreach ( $orders as $order ) {
@@ -227,9 +261,9 @@
227 261
228 262 foreach ( $orders as $order ) {
229 263 $orderEntity = new Core\Entity\Order(
230 264 (string) $order->get_id(),
231 - $this->getMetaAsNullableString( $order, self::META_CARRIER_ID )
265 + $this->carrierEntityRepository->getAnyById( $this->getMetaAsNullableString( $order, self::META_CARRIER_ID ) )
232 266 );
233 267 $order->delete_meta_data( self::META_CARRIER_ID );
234 268
235 269 $orderEntity->setWeight( $this->getMetaAsNullableFloat( $order, self::META_WEIGHT ) );
@@ -260,9 +294,9 @@
260 294 $order->delete_meta_data( self::META_LENGTH );
261 295 $order->delete_meta_data( self::META_WIDTH );
262 296 $order->delete_meta_data( self::META_HEIGHT );
263 297
264 - if ( null !== $this->getMetaAsNullableString( $order, self::META_POINT_ID ) ) {
298 + if ( $this->getMetaAsNullableString( $order, self::META_POINT_ID ) !== null ) {
265 299 $orderEntity->setPickupPoint(
266 300 new Core\Entity\PickupPoint(
267 301 $this->getMetaAsNullableString( $order, self::META_POINT_ID ),
268 302 $this->getMetaAsNullableString( $order, self::META_POINT_NAME ),
@@ -280,9 +314,9 @@
280 314 $order->delete_meta_data( self::META_POINT_STREET );
281 315 $order->delete_meta_data( self::META_POINT_URL );
282 316
283 317 $validatedAddressId = $this->getValidatedAddressIdByOrderId( (int) $order->get_id() );
284 - if ( $validatedAddressId ) {
318 + if ( $validatedAddressId !== null ) {
285 319 $validatedAddress = $this->createAddressFromPostId( $validatedAddressId );
286 320 $orderEntity->setAddressValidated( true );
287 321 $orderEntity->setDeliveryAddress( $validatedAddress );
288 322 }
@@ -331,9 +365,9 @@
331 365 'post_parent' => $orderId,
332 366 ]
333 367 );
334 368
335 - if ( empty( $postIds ) ) {
369 + if ( count( $postIds ) === 0 ) {
336 370 return null;
337 371 }
338 372
339 373 return (int) array_shift( $postIds );
@@ -348,9 +382,10 @@
348 382 * @return string|null
349 383 */
350 384 private function getMetaAsNullableString( \WC_Order $order, string $key ): ?string {
351 385 $value = $order->get_meta( $key, true );
352 - return ( ( null !== $value && '' !== $value ) ? (string) $value : null );
386 +
387 + return ( ( $value !== null && $value !== '' ) ? (string) $value : null );
353 388 }
354 389
355 390 /**
356 391 * Gets meta property of order as float.
@@ -361,51 +396,81 @@
361 396 * @return float|null
362 397 */
363 398 private function getMetaAsNullableFloat( \WC_Order $order, string $key ): ?float {
364 399 $value = $order->get_meta( $key, true );
365 - return ( ( null !== $value && '' !== $value ) ? (float) $value : null );
400 +
401 + return ( ( $value !== null && $value !== '' ) ? (float) $value : null );
366 402 }
367 403
368 404 /**
369 - * Transforms custom query variable to meta query.
405 + * Creates log table.
370 406 *
371 - * @param array $queryVars Query vars.
372 - * @param array $get Input values.
407 + * @return void
408 + */
409 + private function createLogTable(): void {
410 + if ( $this->logRepository->createOrAlterTable() === false ) {
411 + $this->messageManager->flash_message(
412 + // translators: %s: Short table name.
413 + sprintf( __( 'Database %s table could not be created or altered, more information might be found in WooCommerce logs.', 'packeta' ), 'log' ),
414 + MessageManager::TYPE_ERROR
415 + );
416 + }
417 + }
418 +
419 + /**
420 + * Creates carrier table.
373 421 *
374 - * @return array
422 + * @return void
375 423 */
376 - public function handleCustomQueryVar( array $queryVars, array $get ): array {
377 - $metaQuery = $this->addQueryVars( ( $queryVars['meta_query'] ?? [] ), $get );
378 - if ( $metaQuery ) {
379 - // @codingStandardsIgnoreStart
380 - $queryVars['meta_query'] = $metaQuery;
381 - // @codingStandardsIgnoreEnd
424 + private function createCarrierTable(): void {
425 + if ( $this->carrierRepository->createOrAlterTable() === false ) {
426 + $this->flashAndLog( 'carrier', Record::ACTION_CARRIER_TABLE_NOT_CREATED );
382 427 }
428 + }
383 429
384 - return $queryVars;
430 + /**
431 + * Creates order table.
432 + *
433 + * @return void
434 + */
435 + private function createOrderTable(): void {
436 + if ( $this->orderRepository->createOrAlterTable() === false ) {
437 + $this->flashAndLog( 'order', Record::ACTION_ORDER_TABLE_NOT_CREATED );
438 + }
385 439 }
386 440
387 441 /**
388 - * Adds query vars to fetch order list.
442 + * Creates order table.
389 443 *
390 - * @param array $queryVars Query vars.
391 - * @param array $get Get parameters.
392 - *
393 - * @return array
444 + * @return void
394 445 */
395 - private function addQueryVars( array $queryVars, array $get ): array {
396 - if ( ! empty( $get['packetery_all'] ) ) {
397 - $queryVars[] = [
398 - 'key' => self::META_CARRIER_ID,
399 - 'compare' => 'EXISTS',
400 - ];
401 - $queryVars[] = [
402 - 'key' => self::META_CARRIER_ID,
403 - 'value' => '',
404 - 'compare' => '!=',
405 - ];
446 + private function createCustomsDeclarationTables(): void {
447 + if ( $this->customsDeclarationRepository->createOrAlterTable() === false ) {
448 + $this->flashAndLog( 'customs_declaration', Record::ACTION_CUSTOMS_DECLARATION_TABLE_NOT_CREATED );
406 449 }
407 450
408 - return $queryVars;
451 + if ( $this->customsDeclarationRepository->createOrAlterItemTable() === false ) {
452 + $this->flashAndLog( 'customs_declaration_item', Record::ACTION_CUSTOMS_DECLARATION_ITEM_TABLE_NOT_CREATED );
453 + }
409 454 }
410 455
456 + /**
457 + * Flashes error and logs to Packeta log.
458 + *
459 + * @param string $table Short table name.
460 + * @param string $action Log action.
461 + *
462 + * @return void
463 + */
464 + private function flashAndLog( string $table, string $action ): void {
465 + // translators: %s: Short table name.
466 + $flashMessage = sprintf( __( 'Database %s table of Packeta plugin could not be created or altered, you can find more information in Packeta log.', 'packeta' ), $table );
467 + $this->messageManager->flash_message( $flashMessage, MessageManager::TYPE_ERROR );
468 +
469 + $record = new Record();
470 + $record->action = $action;
471 + $record->status = Record::STATUS_ERROR;
472 + // translators: %s: Short table name.
473 + $record->title = sprintf( __( 'Database %s table could not be created or altered, more information might be found in WooCommerce logs.', 'packeta' ), $table );
474 + $this->logger->add( $record );
475 + }
411 476 }