PluginProbe
Packeta / 1.3.2
Packeta v1.3.2
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.3.2, at src/Packetery/Module/Upgrade.php

355 lines 10.0 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 * Constructor.
70 *
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.
75 */
76 public function __construct(
77 Order\Repository $orderRepository,
78 MessageManager $messageManager,
79 ILogger $logger,
80 Log\Repository $logRepository
81 ) {
82 $this->orderRepository = $orderRepository;
83 $this->messageManager = $messageManager;
84 $this->logger = $logger;
85 $this->logRepository = $logRepository;
86 }
87
88 /**
89 * Checks previous plugin version and runs upgrade if needed.
90 * https://www.sitepoint.com/wordpress-plugin-updates-right-way/
91 *
92 * @return void
93 */
94 public function check(): void {
95 $oldVersion = get_option( 'packetery_version' );
96 if ( Plugin::VERSION === $oldVersion ) {
97 return;
98 }
99
100 // 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 );
113 }
114
115 unregister_post_type( 'packetery_log' );
116
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 );
128 }
129
130 unregister_post_type( self::POST_TYPE_VALIDATED_ADDRESS );
131 }
132
133 if ( $oldVersion && version_compare( $oldVersion, '1.2.6', '<' ) ) {
134 $this->orderRepository->deleteOrphans();
135 }
136
137 update_option( 'packetery_version', Plugin::VERSION );
138 }
139
140 /**
141 * Migrates WP order metadata.
142 *
143 * @return void
144 */
145 private function migrateWpOrderMetadata(): void {
146 global $wpdb;
147
148 $createResult = $this->orderRepository->createTable();
149 if ( false === $createResult ) {
150 $lastError = $wpdb->last_error;
151 $this->messageManager->flash_message( __( 'Database order table was not created, you can find more information in Packeta log.', 'packeta' ), MessageManager::TYPE_ERROR );
152
153 $record = new Record();
154 $record->action = Record::ACTION_ORDER_TABLE_NOT_CREATED;
155 $record->status = Record::STATUS_ERROR;
156 $record->title = __( 'Database order table was not created.', 'packeta' );
157 $record->params = [
158 'errorMessage' => $lastError,
159 ];
160 $this->logger->add( $record );
161 }
162
163 // Did not work when called from plugins_loaded hook.
164 $orders = wc_get_orders(
165 [
166 'packetery_all' => '1',
167 'nopaging' => true,
168 ]
169 );
170
171 foreach ( $orders as $order ) {
172 $orderEntity = new Core\Entity\Order(
173 (string) $order->get_id(),
174 $this->getMetaAsNullableString( $order, self::META_CARRIER_ID )
175 );
176 $order->delete_meta_data( self::META_CARRIER_ID );
177
178 $orderEntity->setWeight( $this->getMetaAsNullableFloat( $order, self::META_WEIGHT ) );
179 $order->delete_meta_data( self::META_WEIGHT );
180
181 $orderEntity->setPacketStatus( $this->getMetaAsNullableString( $order, self::META_PACKET_STATUS ) );
182 $order->delete_meta_data( self::META_PACKET_STATUS );
183
184 $orderEntity->setIsExported( (bool) $this->getMetaAsNullableString( $order, self::META_IS_EXPORTED ) );
185 $order->delete_meta_data( self::META_IS_EXPORTED );
186
187 $orderEntity->setIsLabelPrinted( (bool) $this->getMetaAsNullableString( $order, self::META_IS_LABEL_PRINTED ) );
188 $order->delete_meta_data( self::META_IS_LABEL_PRINTED );
189
190 $orderEntity->setCarrierNumber( $this->getMetaAsNullableString( $order, self::META_CARRIER_NUMBER ) );
191 $order->delete_meta_data( self::META_CARRIER_NUMBER );
192
193 $orderEntity->setPacketId( $this->getMetaAsNullableString( $order, self::META_PACKET_ID ) );
194 $order->delete_meta_data( self::META_PACKET_ID );
195
196 $orderEntity->setSize(
197 new Core\Entity\Size(
198 $this->getMetaAsNullableFloat( $order, self::META_LENGTH ),
199 $this->getMetaAsNullableFloat( $order, self::META_WIDTH ),
200 $this->getMetaAsNullableFloat( $order, self::META_HEIGHT )
201 )
202 );
203 $order->delete_meta_data( self::META_LENGTH );
204 $order->delete_meta_data( self::META_WIDTH );
205 $order->delete_meta_data( self::META_HEIGHT );
206
207 if ( null !== $this->getMetaAsNullableString( $order, self::META_POINT_ID ) ) {
208 $orderEntity->setPickupPoint(
209 new Core\Entity\PickupPoint(
210 $this->getMetaAsNullableString( $order, self::META_POINT_ID ),
211 $this->getMetaAsNullableString( $order, self::META_POINT_NAME ),
212 $this->getMetaAsNullableString( $order, self::META_POINT_CITY ),
213 $this->getMetaAsNullableString( $order, self::META_POINT_ZIP ),
214 $this->getMetaAsNullableString( $order, self::META_POINT_STREET ),
215 $this->getMetaAsNullableString( $order, self::META_POINT_URL )
216 )
217 );
218 }
219 $order->delete_meta_data( self::META_POINT_ID );
220 $order->delete_meta_data( self::META_POINT_NAME );
221 $order->delete_meta_data( self::META_POINT_CITY );
222 $order->delete_meta_data( self::META_POINT_ZIP );
223 $order->delete_meta_data( self::META_POINT_STREET );
224 $order->delete_meta_data( self::META_POINT_URL );
225
226 $validatedAddressId = $this->getValidatedAddressIdByOrderId( (int) $order->get_id() );
227 if ( $validatedAddressId ) {
228 $validatedAddress = $this->createAddressFromPostId( $validatedAddressId );
229 $orderEntity->setAddressValidated( true );
230 $orderEntity->setDeliveryAddress( $validatedAddress );
231 }
232
233 $this->orderRepository->save( $orderEntity );
234 $order->save_meta_data();
235 }
236 }
237
238 /**
239 * Creates active widget address using woocommerce order id.
240 *
241 * @param int $addressId Address ID.
242 *
243 * @return Core\Entity\Address|null
244 */
245 public function createAddressFromPostId( int $addressId ): ?Core\Entity\Address {
246 $address = new Core\Entity\Address(
247 get_post_meta( $addressId, 'street', true ),
248 get_post_meta( $addressId, 'city', true ),
249 get_post_meta( $addressId, 'postCode', true )
250 );
251 $address->setHouseNumber( get_post_meta( $addressId, 'houseNumber', true ) );
252 $address->setCounty( get_post_meta( $addressId, 'county', true ) );
253 $address->setLongitude( get_post_meta( $addressId, 'longitude', true ) );
254 $address->setLatitude( get_post_meta( $addressId, 'latitude', true ) );
255
256 return $address;
257 }
258
259 /**
260 * Gets active address.
261 *
262 * @param int $orderId Order ID.
263 *
264 * @return int|null
265 */
266 public function getValidatedAddressIdByOrderId( int $orderId ): ?int {
267 $postIds = get_posts(
268 [
269 'post_type' => self::POST_TYPE_VALIDATED_ADDRESS,
270 'post_status' => 'any',
271 'nopaging' => true,
272 'numberposts' => 1,
273 'fields' => 'ids',
274 'post_parent' => $orderId,
275 ]
276 );
277
278 if ( empty( $postIds ) ) {
279 return null;
280 }
281
282 return (int) array_shift( $postIds );
283 }
284
285 /**
286 * Gets meta property of order as string.
287 *
288 * @param \WC_Order $order Order.
289 * @param string $key Meta order key.
290 *
291 * @return string|null
292 */
293 private function getMetaAsNullableString( \WC_Order $order, string $key ): ?string {
294 $value = $order->get_meta( $key, true );
295 return ( ( null !== $value && '' !== $value ) ? (string) $value : null );
296 }
297
298 /**
299 * Gets meta property of order as float.
300 *
301 * @param \WC_Order $order Order.
302 * @param string $key Meta order key.
303 *
304 * @return float|null
305 */
306 private function getMetaAsNullableFloat( \WC_Order $order, string $key ): ?float {
307 $value = $order->get_meta( $key, true );
308 return ( ( null !== $value && '' !== $value ) ? (float) $value : null );
309 }
310
311 /**
312 * Transforms custom query variable to meta query.
313 *
314 * @param array $queryVars Query vars.
315 * @param array $get Input values.
316 *
317 * @return array
318 */
319 public function handleCustomQueryVar( array $queryVars, array $get ): array {
320 $metaQuery = $this->addQueryVars( ( $queryVars['meta_query'] ?? [] ), $get );
321 if ( $metaQuery ) {
322 // @codingStandardsIgnoreStart
323 $queryVars['meta_query'] = $metaQuery;
324 // @codingStandardsIgnoreEnd
325 }
326
327 return $queryVars;
328 }
329
330 /**
331 * Adds query vars to fetch order list.
332 *
333 * @param array $queryVars Query vars.
334 * @param array $get Get parameters.
335 *
336 * @return array
337 */
338 private function addQueryVars( array $queryVars, array $get ): array {
339 if ( ! empty( $get['packetery_all'] ) ) {
340 $queryVars[] = [
341 'key' => self::META_CARRIER_ID,
342 'compare' => 'EXISTS',
343 ];
344 $queryVars[] = [
345 'key' => self::META_CARRIER_ID,
346 'value' => '',
347 'compare' => '!=',
348 ];
349 }
350
351 return $queryVars;
352 }
353
354 }
355