PluginProbe
Packeta / 1.4.3
Packeta v1.4.3
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 / Upgrade.php

Upgrade.php in Packeta 1.4.3, at src/Packetery/Module/Upgrade.php

418 lines 12.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Class Upgrade.
4 *
5 * @package Packetery\Module
6 */
7
8 declare( strict_types=1 );
9
10 namespace Packetery\Module;
11
12 use Packetery\Core;
13 use Packetery\Core\Log\ILogger;
14 use Packetery\Core\Log\Record;
15 use Packetery\Module\Upgrade\Version_1_4_2;
16
17 /**
18 * Class Upgrade.
19 */
20 class Upgrade {
21
22 const POST_TYPE_VALIDATED_ADDRESS = 'packetery_address';
23
24 const META_LENGTH = 'packetery_length';
25 const META_WIDTH = 'packetery_width';
26 const META_HEIGHT = 'packetery_height';
27 const META_PACKET_STATUS = 'packetery_packet_status';
28 const META_WEIGHT = 'packetery_weight';
29 const META_CARRIER_ID = 'packetery_carrier_id';
30 const META_IS_EXPORTED = 'packetery_is_exported';
31 const META_IS_LABEL_PRINTED = 'packetery_is_label_printed';
32 const META_CARRIER_NUMBER = 'packetery_carrier_number';
33 const META_PACKET_ID = 'packetery_packet_id';
34 const META_POINT_ID = 'packetery_point_id';
35 const META_POINT_NAME = 'packetery_point_name';
36 const META_POINT_CITY = 'packetery_point_city';
37 const META_POINT_ZIP = 'packetery_point_zip';
38 const META_POINT_STREET = 'packetery_point_street';
39 const META_POINT_URL = 'packetery_point_url';
40
41 /**
42 * Order repository.
43 *
44 * @var Order\Repository
45 */
46 private $orderRepository;
47
48 /**
49 * Message manager.
50 *
51 * @var MessageManager
52 */
53 private $messageManager;
54
55 /**
56 * Logger.
57 *
58 * @var ILogger
59 */
60 private $logger;
61
62 /**
63 * Log repository.
64 *
65 * @var Log\Repository
66 */
67 private $logRepository;
68
69 /**
70 * Carrier repository.
71 *
72 * @var Carrier\Repository
73 */
74 private $carrierRepository;
75
76 /**
77 * WPDB.
78 *
79 * @var \wpdb
80 */
81 private $wpdb;
82
83 /**
84 * Constructor.
85 *
86 * @param Order\Repository $orderRepository Order repository.
87 * @param MessageManager $messageManager Message manager.
88 * @param ILogger $logger Logger.
89 * @param Log\Repository $logRepository Log repository.
90 * @param \wpdb $wpdb WPDB.
91 * @param Carrier\Repository $carrierRepository Carrier repository.
92 */
93 public function __construct(
94 Order\Repository $orderRepository,
95 MessageManager $messageManager,
96 ILogger $logger,
97 Log\Repository $logRepository,
98 \wpdb $wpdb,
99 Carrier\Repository $carrierRepository
100 ) {
101 $this->orderRepository = $orderRepository;
102 $this->messageManager = $messageManager;
103 $this->logger = $logger;
104 $this->logRepository = $logRepository;
105 $this->wpdb = $wpdb;
106 $this->carrierRepository = $carrierRepository;
107 }
108
109 /**
110 * Checks previous plugin version and runs upgrade if needed.
111 * https://www.sitepoint.com/wordpress-plugin-updates-right-way/
112 *
113 * @return void
114 */
115 public function check(): void {
116 $oldVersion = get_option( 'packetery_version' );
117 if ( Plugin::VERSION === $oldVersion ) {
118 return;
119 }
120
121 $this->logRepository->createTable();
122 $createResult = $this->carrierRepository->createTable();
123 if ( false === $createResult ) {
124 $lastError = $this->wpdb->last_error;
125 $this->messageManager->flash_message( __( 'Database carrier table was not created, you can find more information in Packeta log.', 'packeta' ), MessageManager::TYPE_ERROR );
126
127 $record = new Record();
128 $record->action = Record::ACTION_CARRIER_TABLE_NOT_CREATED;
129 $record->status = Record::STATUS_ERROR;
130 $record->title = __( 'Database carrier table was not created.', 'packeta' );
131 $record->params = [
132 'errorMessage' => $lastError,
133 ];
134 $this->logger->add( $record );
135 }
136
137 $createResult = $this->orderRepository->createTable();
138 if ( false === $createResult ) {
139 $lastError = $this->wpdb->last_error;
140 $this->messageManager->flash_message( __( 'Database order table was not created, you can find more information in Packeta log.', 'packeta' ), MessageManager::TYPE_ERROR );
141
142 $record = new Record();
143 $record->action = Record::ACTION_ORDER_TABLE_NOT_CREATED;
144 $record->status = Record::STATUS_ERROR;
145 $record->title = __( 'Database order table was not created.', 'packeta' );
146 $record->params = [
147 'errorMessage' => $lastError,
148 ];
149 $this->logger->add( $record );
150 }
151
152 // If no previous version detected, no upgrade will be run.
153 if ( $oldVersion && version_compare( $oldVersion, '1.2.0', '<' ) ) {
154 $logEntries = get_posts(
155 [
156 'post_type' => 'packetery_log',
157 'post_status' => 'any',
158 'nopaging' => true,
159 'fields' => 'ids',
160 ]
161 );
162 foreach ( $logEntries as $logEntryId ) {
163 wp_delete_post( $logEntryId, true );
164 }
165
166 unregister_post_type( 'packetery_log' );
167
168 $this->migrateWpOrderMetadata();
169 $addressEntries = get_posts(
170 [
171 'post_type' => self::POST_TYPE_VALIDATED_ADDRESS,
172 'post_status' => 'any',
173 'nopaging' => true,
174 'fields' => 'ids',
175 ]
176 );
177 foreach ( $addressEntries as $addressEntryId ) {
178 wp_delete_post( $addressEntryId, true );
179 }
180
181 unregister_post_type( self::POST_TYPE_VALIDATED_ADDRESS );
182 }
183
184 if ( $oldVersion && version_compare( $oldVersion, '1.2.6', '<' ) ) {
185 $this->orderRepository->deleteOrphans();
186 }
187
188 if ( $oldVersion && version_compare( $oldVersion, '1.4', '<' ) ) {
189 $this->logRepository->addOrderIdColumn();
190 $this->orderRepository->addAdultContentColumn();
191 $this->orderRepository->addValueColumn();
192 $this->orderRepository->addCodColumn();
193 }
194
195 if ( $oldVersion && version_compare( $oldVersion, '1.4.2', '<' ) ) {
196 $version_1_4_2 = new Version_1_4_2( $this->wpdb );
197 $version_1_4_2->run();
198 }
199
200 update_option( 'packetery_version', Plugin::VERSION );
201 }
202
203 /**
204 * Migrates WP order metadata.
205 *
206 * @return void
207 */
208 private function migrateWpOrderMetadata(): void {
209 global $wpdb;
210
211 $createResult = $this->orderRepository->createTable();
212 if ( false === $createResult ) {
213 $lastError = $wpdb->last_error;
214 $this->messageManager->flash_message( __( 'Database order table was not created, you can find more information in Packeta log.', 'packeta' ), MessageManager::TYPE_ERROR );
215
216 $record = new Record();
217 $record->action = Record::ACTION_ORDER_TABLE_NOT_CREATED;
218 $record->status = Record::STATUS_ERROR;
219 $record->title = __( 'Database order table was not created.', 'packeta' );
220 $record->params = [
221 'errorMessage' => $lastError,
222 ];
223 $this->logger->add( $record );
224 }
225
226 // Did not work when called from plugins_loaded hook.
227 $orders = wc_get_orders(
228 [
229 'packetery_all' => '1',
230 'nopaging' => true,
231 ]
232 );
233
234 foreach ( $orders as $order ) {
235 $orderEntity = new Core\Entity\Order(
236 (string) $order->get_id(),
237 $this->getMetaAsNullableString( $order, self::META_CARRIER_ID )
238 );
239 $order->delete_meta_data( self::META_CARRIER_ID );
240
241 $orderEntity->setWeight( $this->getMetaAsNullableFloat( $order, self::META_WEIGHT ) );
242 $order->delete_meta_data( self::META_WEIGHT );
243
244 $orderEntity->setPacketStatus( $this->getMetaAsNullableString( $order, self::META_PACKET_STATUS ) );
245 $order->delete_meta_data( self::META_PACKET_STATUS );
246
247 $orderEntity->setIsExported( (bool) $this->getMetaAsNullableString( $order, self::META_IS_EXPORTED ) );
248 $order->delete_meta_data( self::META_IS_EXPORTED );
249
250 $orderEntity->setIsLabelPrinted( (bool) $this->getMetaAsNullableString( $order, self::META_IS_LABEL_PRINTED ) );
251 $order->delete_meta_data( self::META_IS_LABEL_PRINTED );
252
253 $orderEntity->setCarrierNumber( $this->getMetaAsNullableString( $order, self::META_CARRIER_NUMBER ) );
254 $order->delete_meta_data( self::META_CARRIER_NUMBER );
255
256 $orderEntity->setPacketId( $this->getMetaAsNullableString( $order, self::META_PACKET_ID ) );
257 $order->delete_meta_data( self::META_PACKET_ID );
258
259 $orderEntity->setSize(
260 new Core\Entity\Size(
261 $this->getMetaAsNullableFloat( $order, self::META_LENGTH ),
262 $this->getMetaAsNullableFloat( $order, self::META_WIDTH ),
263 $this->getMetaAsNullableFloat( $order, self::META_HEIGHT )
264 )
265 );
266 $order->delete_meta_data( self::META_LENGTH );
267 $order->delete_meta_data( self::META_WIDTH );
268 $order->delete_meta_data( self::META_HEIGHT );
269
270 if ( null !== $this->getMetaAsNullableString( $order, self::META_POINT_ID ) ) {
271 $orderEntity->setPickupPoint(
272 new Core\Entity\PickupPoint(
273 $this->getMetaAsNullableString( $order, self::META_POINT_ID ),
274 $this->getMetaAsNullableString( $order, self::META_POINT_NAME ),
275 $this->getMetaAsNullableString( $order, self::META_POINT_CITY ),
276 $this->getMetaAsNullableString( $order, self::META_POINT_ZIP ),
277 $this->getMetaAsNullableString( $order, self::META_POINT_STREET ),
278 $this->getMetaAsNullableString( $order, self::META_POINT_URL )
279 )
280 );
281 }
282 $order->delete_meta_data( self::META_POINT_ID );
283 $order->delete_meta_data( self::META_POINT_NAME );
284 $order->delete_meta_data( self::META_POINT_CITY );
285 $order->delete_meta_data( self::META_POINT_ZIP );
286 $order->delete_meta_data( self::META_POINT_STREET );
287 $order->delete_meta_data( self::META_POINT_URL );
288
289 $validatedAddressId = $this->getValidatedAddressIdByOrderId( (int) $order->get_id() );
290 if ( $validatedAddressId ) {
291 $validatedAddress = $this->createAddressFromPostId( $validatedAddressId );
292 $orderEntity->setAddressValidated( true );
293 $orderEntity->setDeliveryAddress( $validatedAddress );
294 }
295
296 $this->orderRepository->save( $orderEntity );
297 $order->save_meta_data();
298 }
299 }
300
301 /**
302 * Creates active widget address using woocommerce order id.
303 *
304 * @param int $addressId Address ID.
305 *
306 * @return Core\Entity\Address|null
307 */
308 public function createAddressFromPostId( int $addressId ): ?Core\Entity\Address {
309 $address = new Core\Entity\Address(
310 get_post_meta( $addressId, 'street', true ),
311 get_post_meta( $addressId, 'city', true ),
312 get_post_meta( $addressId, 'postCode', true )
313 );
314 $address->setHouseNumber( get_post_meta( $addressId, 'houseNumber', true ) );
315 $address->setCounty( get_post_meta( $addressId, 'county', true ) );
316 $address->setLongitude( get_post_meta( $addressId, 'longitude', true ) );
317 $address->setLatitude( get_post_meta( $addressId, 'latitude', true ) );
318
319 return $address;
320 }
321
322 /**
323 * Gets active address.
324 *
325 * @param int $orderId Order ID.
326 *
327 * @return int|null
328 */
329 public function getValidatedAddressIdByOrderId( int $orderId ): ?int {
330 $postIds = get_posts(
331 [
332 'post_type' => self::POST_TYPE_VALIDATED_ADDRESS,
333 'post_status' => 'any',
334 'nopaging' => true,
335 'numberposts' => 1,
336 'fields' => 'ids',
337 'post_parent' => $orderId,
338 ]
339 );
340
341 if ( empty( $postIds ) ) {
342 return null;
343 }
344
345 return (int) array_shift( $postIds );
346 }
347
348 /**
349 * Gets meta property of order as string.
350 *
351 * @param \WC_Order $order Order.
352 * @param string $key Meta order key.
353 *
354 * @return string|null
355 */
356 private function getMetaAsNullableString( \WC_Order $order, string $key ): ?string {
357 $value = $order->get_meta( $key, true );
358 return ( ( null !== $value && '' !== $value ) ? (string) $value : null );
359 }
360
361 /**
362 * Gets meta property of order as float.
363 *
364 * @param \WC_Order $order Order.
365 * @param string $key Meta order key.
366 *
367 * @return float|null
368 */
369 private function getMetaAsNullableFloat( \WC_Order $order, string $key ): ?float {
370 $value = $order->get_meta( $key, true );
371 return ( ( null !== $value && '' !== $value ) ? (float) $value : null );
372 }
373
374 /**
375 * Transforms custom query variable to meta query.
376 *
377 * @param array $queryVars Query vars.
378 * @param array $get Input values.
379 *
380 * @return array
381 */
382 public function handleCustomQueryVar( array $queryVars, array $get ): array {
383 $metaQuery = $this->addQueryVars( ( $queryVars['meta_query'] ?? [] ), $get );
384 if ( $metaQuery ) {
385 // @codingStandardsIgnoreStart
386 $queryVars['meta_query'] = $metaQuery;
387 // @codingStandardsIgnoreEnd
388 }
389
390 return $queryVars;
391 }
392
393 /**
394 * Adds query vars to fetch order list.
395 *
396 * @param array $queryVars Query vars.
397 * @param array $get Get parameters.
398 *
399 * @return array
400 */
401 private function addQueryVars( array $queryVars, array $get ): array {
402 if ( ! empty( $get['packetery_all'] ) ) {
403 $queryVars[] = [
404 'key' => self::META_CARRIER_ID,
405 'compare' => 'EXISTS',
406 ];
407 $queryVars[] = [
408 'key' => self::META_CARRIER_ID,
409 'value' => '',
410 'compare' => '!=',
411 ];
412 }
413
414 return $queryVars;
415 }
416
417 }
418