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 +215 -89 1.2.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 */
@@ -65,25 +68,60 @@
65 68 */
66 69 private $logRepository;
67 70
68 71 /**
69 - * Constructor.
72 + * Carrier repository.
70 73 *
71 - * @param Order\Repository $orderRepository Order repository.
72 - * @param MessageManager $messageManager Message manager.
73 - * @param ILogger $logger Logger.
74 - * @param Log\Repository $logRepository Log repository.
74 + * @var Carrier\Repository
75 75 */
76 + private $carrierRepository;
77 +
78 + /**
79 + * Customs declaration repository.
80 + *
81 + * @var CustomsDeclaration\Repository
82 + */
83 + private $customsDeclarationRepository;
84 +
85 + /**
86 + * WpdbAdapter.
87 + *
88 + * @var WpdbAdapter
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 +
76 104 public function __construct(
77 105 Order\Repository $orderRepository,
78 106 MessageManager $messageManager,
79 107 ILogger $logger,
80 - Log\Repository $logRepository
108 + Log\Repository $logRepository,
109 + WpdbAdapter $wpdbAdapter,
110 + Carrier\Repository $carrierRepository,
111 + CustomsDeclaration\Repository $customsDeclarationRepository,
112 + OptionsProvider $optionsProvider,
113 + EntityRepository $carrierEntityRepository
81 114 ) {
82 - $this->orderRepository = $orderRepository;
83 - $this->messageManager = $messageManager;
84 - $this->logger = $logger;
85 - $this->logRepository = $logRepository;
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;
86 124 }
87 125
88 126 /**
89 127 * Checks previous plugin version and runs upgrade if needed.
@@ -92,43 +130,104 @@
92 130 * @return void
93 131 */
94 132 public function check(): void {
95 133 $oldVersion = get_option( 'packetery_version' );
96 - if ( Plugin::VERSION === $oldVersion ) {
134 + if ( $oldVersion === Plugin::VERSION ) {
97 135 return;
98 136 }
99 137
138 + $this->createLogTable();
139 + $this->createCarrierTable();
140 + $this->createOrderTable();
141 + $this->createCustomsDeclarationTables();
142 +
100 143 // If no previous version detected, no upgrade will be run.
101 - if ( $oldVersion && version_compare( $oldVersion, '1.2.0', '<' ) ) {
102 - $this->logRepository->createTable();
103 - $logEntries = get_posts(
104 - [
105 - 'post_type' => 'packetery_log',
106 - 'post_status' => 'any',
107 - 'nopaging' => true,
108 - 'fields' => 'ids',
109 - ]
110 - );
111 - foreach ( $logEntries as $logEntryId ) {
112 - wp_delete_post( $logEntryId, true );
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 + }
157 +
158 + unregister_post_type( 'packetery_log' );
159 +
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 + }
172 +
173 + unregister_post_type( self::POST_TYPE_VALIDATED_ADDRESS );
113 174 }
114 175
115 - unregister_post_type( 'packetery_log' );
176 + if ( version_compare( $oldVersion, '1.2.6', '<' ) ) {
177 + $this->orderRepository->deleteOrphans();
178 + }
116 179
117 - $this->migrateWpOrderMetadata();
118 - $addressEntries = get_posts(
119 - [
120 - 'post_type' => self::POST_TYPE_VALIDATED_ADDRESS,
121 - 'post_status' => 'any',
122 - 'nopaging' => true,
123 - 'fields' => 'ids',
124 - ]
125 - );
126 - foreach ( $addressEntries as $addressEntryId ) {
127 - 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();
128 183 }
129 184
130 - unregister_post_type( self::POST_TYPE_VALIDATED_ADDRESS );
185 + if ( version_compare( $oldVersion, '1.5', '<' ) ) {
186 + wp_clear_scheduled_hook( CronService::CRON_CARRIERS_HOOK );
187 + }
188 +
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 + }
193 +
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 + }
131 230 }
132 231
133 232 update_option( 'packetery_version', Plugin::VERSION );
134 233 }
@@ -138,30 +237,26 @@
138 237 *
139 238 * @return void
140 239 */
141 240 private function migrateWpOrderMetadata(): void {
142 - global $wpdb;
241 + $this->createOrderTable();
143 242
144 - $createResult = $this->orderRepository->createTable();
145 - if ( false === $createResult ) {
146 - $lastError = $wpdb->last_error;
147 - $this->messageManager->flash_message( __( 'orderTableNotCreatedMoreInformationInPacketaLog', 'packetery' ), MessageManager::TYPE_ERROR );
148 -
149 - $record = new Record();
150 - $record->action = Record::ACTION_ORDER_TABLE_NOT_CREATED;
151 - $record->status = Record::STATUS_ERROR;
152 - $record->title = __( 'orderTableNotCreated', 'packetery' );
153 - $record->params = [
154 - 'errorMessage' => $lastError,
155 - ];
156 - $this->logger->add( $record );
157 - }
158 -
159 243 // Did not work when called from plugins_loaded hook.
160 244 $orders = wc_get_orders(
161 245 [
162 - 'packetery_all' => '1',
163 - '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 + ],
164 259 ]
165 260 );
166 261
167 262 foreach ( $orders as $order ) {
@@ -166,13 +261,13 @@
166 261
167 262 foreach ( $orders as $order ) {
168 263 $orderEntity = new Core\Entity\Order(
169 264 (string) $order->get_id(),
170 - $this->getMetaAsNullableString( $order, self::META_CARRIER_ID )
265 + $this->carrierEntityRepository->getAnyById( $this->getMetaAsNullableString( $order, self::META_CARRIER_ID ) )
171 266 );
172 267 $order->delete_meta_data( self::META_CARRIER_ID );
173 268
174 - $orderEntity->setWeight( Core\Helper::simplifyWeight( $this->getMetaAsNullableFloat( $order, self::META_WEIGHT ) ) );
269 + $orderEntity->setWeight( $this->getMetaAsNullableFloat( $order, self::META_WEIGHT ) );
175 270 $order->delete_meta_data( self::META_WEIGHT );
176 271
177 272 $orderEntity->setPacketStatus( $this->getMetaAsNullableString( $order, self::META_PACKET_STATUS ) );
178 273 $order->delete_meta_data( self::META_PACKET_STATUS );
@@ -199,9 +294,9 @@
199 294 $order->delete_meta_data( self::META_LENGTH );
200 295 $order->delete_meta_data( self::META_WIDTH );
201 296 $order->delete_meta_data( self::META_HEIGHT );
202 297
203 - if ( null !== $this->getMetaAsNullableString( $order, self::META_POINT_ID ) ) {
298 + if ( $this->getMetaAsNullableString( $order, self::META_POINT_ID ) !== null ) {
204 299 $orderEntity->setPickupPoint(
205 300 new Core\Entity\PickupPoint(
206 301 $this->getMetaAsNullableString( $order, self::META_POINT_ID ),
207 302 $this->getMetaAsNullableString( $order, self::META_POINT_NAME ),
@@ -219,9 +314,9 @@
219 314 $order->delete_meta_data( self::META_POINT_STREET );
220 315 $order->delete_meta_data( self::META_POINT_URL );
221 316
222 317 $validatedAddressId = $this->getValidatedAddressIdByOrderId( (int) $order->get_id() );
223 - if ( $validatedAddressId ) {
318 + if ( $validatedAddressId !== null ) {
224 319 $validatedAddress = $this->createAddressFromPostId( $validatedAddressId );
225 320 $orderEntity->setAddressValidated( true );
226 321 $orderEntity->setDeliveryAddress( $validatedAddress );
227 322 }
@@ -270,9 +365,9 @@
270 365 'post_parent' => $orderId,
271 366 ]
272 367 );
273 368
274 - if ( empty( $postIds ) ) {
369 + if ( count( $postIds ) === 0 ) {
275 370 return null;
276 371 }
277 372
278 373 return (int) array_shift( $postIds );
@@ -287,9 +382,10 @@
287 382 * @return string|null
288 383 */
289 384 private function getMetaAsNullableString( \WC_Order $order, string $key ): ?string {
290 385 $value = $order->get_meta( $key, true );
291 - return ( ( null !== $value && '' !== $value ) ? (string) $value : null );
386 +
387 + return ( ( $value !== null && $value !== '' ) ? (string) $value : null );
292 388 }
293 389
294 390 /**
295 391 * Gets meta property of order as float.
@@ -300,51 +396,81 @@
300 396 * @return float|null
301 397 */
302 398 private function getMetaAsNullableFloat( \WC_Order $order, string $key ): ?float {
303 399 $value = $order->get_meta( $key, true );
304 - return ( ( null !== $value && '' !== $value ) ? (float) $value : null );
400 +
401 + return ( ( $value !== null && $value !== '' ) ? (float) $value : null );
305 402 }
306 403
307 404 /**
308 - * Transforms custom query variable to meta query.
405 + * Creates log table.
309 406 *
310 - * @param array $queryVars Query vars.
311 - * @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.
312 421 *
313 - * @return array
422 + * @return void
314 423 */
315 - public function handleCustomQueryVar( array $queryVars, array $get ): array {
316 - $metaQuery = $this->addQueryVars( ( $queryVars['meta_query'] ?? [] ), $get );
317 - if ( $metaQuery ) {
318 - // @codingStandardsIgnoreStart
319 - $queryVars['meta_query'] = $metaQuery;
320 - // @codingStandardsIgnoreEnd
424 + private function createCarrierTable(): void {
425 + if ( $this->carrierRepository->createOrAlterTable() === false ) {
426 + $this->flashAndLog( 'carrier', Record::ACTION_CARRIER_TABLE_NOT_CREATED );
321 427 }
428 + }
322 429
323 - 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 + }
324 439 }
325 440
326 441 /**
327 - * Adds query vars to fetch order list.
442 + * Creates order table.
328 443 *
329 - * @param array $queryVars Query vars.
330 - * @param array $get Get parameters.
331 - *
332 - * @return array
444 + * @return void
333 445 */
334 - private function addQueryVars( array $queryVars, array $get ): array {
335 - if ( ! empty( $get['packetery_all'] ) ) {
336 - $queryVars[] = [
337 - 'key' => self::META_CARRIER_ID,
338 - 'compare' => 'EXISTS',
339 - ];
340 - $queryVars[] = [
341 - 'key' => self::META_CARRIER_ID,
342 - 'value' => '',
343 - 'compare' => '!=',
344 - ];
446 + private function createCustomsDeclarationTables(): void {
447 + if ( $this->customsDeclarationRepository->createOrAlterTable() === false ) {
448 + $this->flashAndLog( 'customs_declaration', Record::ACTION_CUSTOMS_DECLARATION_TABLE_NOT_CREATED );
345 449 }
346 450
347 - return $queryVars;
451 + if ( $this->customsDeclarationRepository->createOrAlterItemTable() === false ) {
452 + $this->flashAndLog( 'customs_declaration_item', Record::ACTION_CUSTOMS_DECLARATION_ITEM_TABLE_NOT_CREATED );
453 + }
348 454 }
349 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 + }
350 476 }