PluginProbe
Packeta / 1.4.1
Packeta v1.4.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 / Upgrade.php

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

412 lines 11.9 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
16 /**
17 * Class Upgrade.
18 */
19 class Upgrade {
20
21 const POST_TYPE_VALIDATED_ADDRESS = 'packetery_address';
22
23 const META_LENGTH = 'packetery_length';
24 const META_WIDTH = 'packetery_width';
25 const META_HEIGHT = 'packetery_height';
26 const META_PACKET_STATUS = 'packetery_packet_status';
27 const META_WEIGHT = 'packetery_weight';
28 const META_CARRIER_ID = 'packetery_carrier_id';
29 const META_IS_EXPORTED = 'packetery_is_exported';
30 const META_IS_LABEL_PRINTED = 'packetery_is_label_printed';
31 const META_CARRIER_NUMBER = 'packetery_carrier_number';
32 const META_PACKET_ID = 'packetery_packet_id';
33 const META_POINT_ID = 'packetery_point_id';
34 const META_POINT_NAME = 'packetery_point_name';
35 const META_POINT_CITY = 'packetery_point_city';
36 const META_POINT_ZIP = 'packetery_point_zip';
37 const META_POINT_STREET = 'packetery_point_street';
38 const META_POINT_URL = 'packetery_point_url';
39
40 /**
41 * Order repository.
42 *
43 * @var Order\Repository
44 */
45 private $orderRepository;
46
47 /**
48 * Message manager.
49 *
50 * @var MessageManager
51 */
52 private $messageManager;
53
54 /**
55 * Logger.
56 *
57 * @var ILogger
58 */
59 private $logger;
60
61 /**
62 * Log repository.
63 *
64 * @var Log\Repository
65 */
66 private $logRepository;
67
68 /**
69 * Carrier repository.
70 *
71 * @var Carrier\Repository
72 */
73 private $carrierRepository;
74
75 /**
76 * WPDB.
77 *
78 * @var \wpdb
79 */
80 private $wpdb;
81
82 /**
83 * Constructor.
84 *
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.
91 */
92 public function __construct(
93 Order\Repository $orderRepository,
94 MessageManager $messageManager,
95 ILogger $logger,
96 Log\Repository $logRepository,
97 \wpdb $wpdb,
98 Carrier\Repository $carrierRepository
99 ) {
100 $this->orderRepository = $orderRepository;
101 $this->messageManager = $messageManager;
102 $this->logger = $logger;
103 $this->logRepository = $logRepository;
104 $this->wpdb = $wpdb;
105 $this->carrierRepository = $carrierRepository;
106 }
107
108 /**
109 * Checks previous plugin version and runs upgrade if needed.
110 * https://www.sitepoint.com/wordpress-plugin-updates-right-way/
111 *
112 * @return void
113 */
114 public function check(): void {
115 $oldVersion = get_option( 'packetery_version' );
116 if ( Plugin::VERSION === $oldVersion ) {
117 return;
118 }
119
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 );
125
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 }
135
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 );
140
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 }
150
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 );
163 }
164
165 unregister_post_type( 'packetery_log' );
166
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 );
178 }
179
180 unregister_post_type( self::POST_TYPE_VALIDATED_ADDRESS );
181 }
182
183 if ( $oldVersion && version_compare( $oldVersion, '1.2.6', '<' ) ) {
184 $this->orderRepository->deleteOrphans();
185 }
186
187 if ( $oldVersion && version_compare( $oldVersion, '1.4', '<' ) ) {
188 $this->logRepository->addOrderIdColumn();
189 $this->orderRepository->addAdultContentColumn();
190 $this->orderRepository->addValueColumn();
191 $this->orderRepository->addCodColumn();
192 }
193
194 update_option( 'packetery_version', Plugin::VERSION );
195 }
196
197 /**
198 * Migrates WP order metadata.
199 *
200 * @return void
201 */
202 private function migrateWpOrderMetadata(): void {
203 global $wpdb;
204
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 // Did not work when called from plugins_loaded hook.
221 $orders = wc_get_orders(
222 [
223 'packetery_all' => '1',
224 'nopaging' => true,
225 ]
226 );
227
228 foreach ( $orders as $order ) {
229 $orderEntity = new Core\Entity\Order(
230 (string) $order->get_id(),
231 $this->getMetaAsNullableString( $order, self::META_CARRIER_ID )
232 );
233 $order->delete_meta_data( self::META_CARRIER_ID );
234
235 $orderEntity->setWeight( $this->getMetaAsNullableFloat( $order, self::META_WEIGHT ) );
236 $order->delete_meta_data( self::META_WEIGHT );
237
238 $orderEntity->setPacketStatus( $this->getMetaAsNullableString( $order, self::META_PACKET_STATUS ) );
239 $order->delete_meta_data( self::META_PACKET_STATUS );
240
241 $orderEntity->setIsExported( (bool) $this->getMetaAsNullableString( $order, self::META_IS_EXPORTED ) );
242 $order->delete_meta_data( self::META_IS_EXPORTED );
243
244 $orderEntity->setIsLabelPrinted( (bool) $this->getMetaAsNullableString( $order, self::META_IS_LABEL_PRINTED ) );
245 $order->delete_meta_data( self::META_IS_LABEL_PRINTED );
246
247 $orderEntity->setCarrierNumber( $this->getMetaAsNullableString( $order, self::META_CARRIER_NUMBER ) );
248 $order->delete_meta_data( self::META_CARRIER_NUMBER );
249
250 $orderEntity->setPacketId( $this->getMetaAsNullableString( $order, self::META_PACKET_ID ) );
251 $order->delete_meta_data( self::META_PACKET_ID );
252
253 $orderEntity->setSize(
254 new Core\Entity\Size(
255 $this->getMetaAsNullableFloat( $order, self::META_LENGTH ),
256 $this->getMetaAsNullableFloat( $order, self::META_WIDTH ),
257 $this->getMetaAsNullableFloat( $order, self::META_HEIGHT )
258 )
259 );
260 $order->delete_meta_data( self::META_LENGTH );
261 $order->delete_meta_data( self::META_WIDTH );
262 $order->delete_meta_data( self::META_HEIGHT );
263
264 if ( null !== $this->getMetaAsNullableString( $order, self::META_POINT_ID ) ) {
265 $orderEntity->setPickupPoint(
266 new Core\Entity\PickupPoint(
267 $this->getMetaAsNullableString( $order, self::META_POINT_ID ),
268 $this->getMetaAsNullableString( $order, self::META_POINT_NAME ),
269 $this->getMetaAsNullableString( $order, self::META_POINT_CITY ),
270 $this->getMetaAsNullableString( $order, self::META_POINT_ZIP ),
271 $this->getMetaAsNullableString( $order, self::META_POINT_STREET ),
272 $this->getMetaAsNullableString( $order, self::META_POINT_URL )
273 )
274 );
275 }
276 $order->delete_meta_data( self::META_POINT_ID );
277 $order->delete_meta_data( self::META_POINT_NAME );
278 $order->delete_meta_data( self::META_POINT_CITY );
279 $order->delete_meta_data( self::META_POINT_ZIP );
280 $order->delete_meta_data( self::META_POINT_STREET );
281 $order->delete_meta_data( self::META_POINT_URL );
282
283 $validatedAddressId = $this->getValidatedAddressIdByOrderId( (int) $order->get_id() );
284 if ( $validatedAddressId ) {
285 $validatedAddress = $this->createAddressFromPostId( $validatedAddressId );
286 $orderEntity->setAddressValidated( true );
287 $orderEntity->setDeliveryAddress( $validatedAddress );
288 }
289
290 $this->orderRepository->save( $orderEntity );
291 $order->save_meta_data();
292 }
293 }
294
295 /**
296 * Creates active widget address using woocommerce order id.
297 *
298 * @param int $addressId Address ID.
299 *
300 * @return Core\Entity\Address|null
301 */
302 public function createAddressFromPostId( int $addressId ): ?Core\Entity\Address {
303 $address = new Core\Entity\Address(
304 get_post_meta( $addressId, 'street', true ),
305 get_post_meta( $addressId, 'city', true ),
306 get_post_meta( $addressId, 'postCode', true )
307 );
308 $address->setHouseNumber( get_post_meta( $addressId, 'houseNumber', true ) );
309 $address->setCounty( get_post_meta( $addressId, 'county', true ) );
310 $address->setLongitude( get_post_meta( $addressId, 'longitude', true ) );
311 $address->setLatitude( get_post_meta( $addressId, 'latitude', true ) );
312
313 return $address;
314 }
315
316 /**
317 * Gets active address.
318 *
319 * @param int $orderId Order ID.
320 *
321 * @return int|null
322 */
323 public function getValidatedAddressIdByOrderId( int $orderId ): ?int {
324 $postIds = get_posts(
325 [
326 'post_type' => self::POST_TYPE_VALIDATED_ADDRESS,
327 'post_status' => 'any',
328 'nopaging' => true,
329 'numberposts' => 1,
330 'fields' => 'ids',
331 'post_parent' => $orderId,
332 ]
333 );
334
335 if ( empty( $postIds ) ) {
336 return null;
337 }
338
339 return (int) array_shift( $postIds );
340 }
341
342 /**
343 * Gets meta property of order as string.
344 *
345 * @param \WC_Order $order Order.
346 * @param string $key Meta order key.
347 *
348 * @return string|null
349 */
350 private function getMetaAsNullableString( \WC_Order $order, string $key ): ?string {
351 $value = $order->get_meta( $key, true );
352 return ( ( null !== $value && '' !== $value ) ? (string) $value : null );
353 }
354
355 /**
356 * Gets meta property of order as float.
357 *
358 * @param \WC_Order $order Order.
359 * @param string $key Meta order key.
360 *
361 * @return float|null
362 */
363 private function getMetaAsNullableFloat( \WC_Order $order, string $key ): ?float {
364 $value = $order->get_meta( $key, true );
365 return ( ( null !== $value && '' !== $value ) ? (float) $value : null );
366 }
367
368 /**
369 * Transforms custom query variable to meta query.
370 *
371 * @param array $queryVars Query vars.
372 * @param array $get Input values.
373 *
374 * @return array
375 */
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
382 }
383
384 return $queryVars;
385 }
386
387 /**
388 * Adds query vars to fetch order list.
389 *
390 * @param array $queryVars Query vars.
391 * @param array $get Get parameters.
392 *
393 * @return array
394 */
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 ];
406 }
407
408 return $queryVars;
409 }
410
411 }
412