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

351 lines 9.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 * 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 update_option( 'packetery_version', Plugin::VERSION );
134 }
135
136 /**
137 * Migrates WP order metadata.
138 *
139 * @return void
140 */
141 private function migrateWpOrderMetadata(): void {
142 global $wpdb;
143
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 // Did not work when called from plugins_loaded hook.
160 $orders = wc_get_orders(
161 [
162 'packetery_all' => '1',
163 'nopaging' => true,
164 ]
165 );
166
167 foreach ( $orders as $order ) {
168 $orderEntity = new Core\Entity\Order(
169 (string) $order->get_id(),
170 $this->getMetaAsNullableString( $order, self::META_CARRIER_ID )
171 );
172 $order->delete_meta_data( self::META_CARRIER_ID );
173
174 $orderEntity->setWeight( Core\Helper::simplifyWeight( $this->getMetaAsNullableFloat( $order, self::META_WEIGHT ) ) );
175 $order->delete_meta_data( self::META_WEIGHT );
176
177 $orderEntity->setPacketStatus( $this->getMetaAsNullableString( $order, self::META_PACKET_STATUS ) );
178 $order->delete_meta_data( self::META_PACKET_STATUS );
179
180 $orderEntity->setIsExported( (bool) $this->getMetaAsNullableString( $order, self::META_IS_EXPORTED ) );
181 $order->delete_meta_data( self::META_IS_EXPORTED );
182
183 $orderEntity->setIsLabelPrinted( (bool) $this->getMetaAsNullableString( $order, self::META_IS_LABEL_PRINTED ) );
184 $order->delete_meta_data( self::META_IS_LABEL_PRINTED );
185
186 $orderEntity->setCarrierNumber( $this->getMetaAsNullableString( $order, self::META_CARRIER_NUMBER ) );
187 $order->delete_meta_data( self::META_CARRIER_NUMBER );
188
189 $orderEntity->setPacketId( $this->getMetaAsNullableString( $order, self::META_PACKET_ID ) );
190 $order->delete_meta_data( self::META_PACKET_ID );
191
192 $orderEntity->setSize(
193 new Core\Entity\Size(
194 $this->getMetaAsNullableFloat( $order, self::META_LENGTH ),
195 $this->getMetaAsNullableFloat( $order, self::META_WIDTH ),
196 $this->getMetaAsNullableFloat( $order, self::META_HEIGHT )
197 )
198 );
199 $order->delete_meta_data( self::META_LENGTH );
200 $order->delete_meta_data( self::META_WIDTH );
201 $order->delete_meta_data( self::META_HEIGHT );
202
203 if ( null !== $this->getMetaAsNullableString( $order, self::META_POINT_ID ) ) {
204 $orderEntity->setPickupPoint(
205 new Core\Entity\PickupPoint(
206 $this->getMetaAsNullableString( $order, self::META_POINT_ID ),
207 $this->getMetaAsNullableString( $order, self::META_POINT_NAME ),
208 $this->getMetaAsNullableString( $order, self::META_POINT_CITY ),
209 $this->getMetaAsNullableString( $order, self::META_POINT_ZIP ),
210 $this->getMetaAsNullableString( $order, self::META_POINT_STREET ),
211 $this->getMetaAsNullableString( $order, self::META_POINT_URL )
212 )
213 );
214 }
215 $order->delete_meta_data( self::META_POINT_ID );
216 $order->delete_meta_data( self::META_POINT_NAME );
217 $order->delete_meta_data( self::META_POINT_CITY );
218 $order->delete_meta_data( self::META_POINT_ZIP );
219 $order->delete_meta_data( self::META_POINT_STREET );
220 $order->delete_meta_data( self::META_POINT_URL );
221
222 $validatedAddressId = $this->getValidatedAddressIdByOrderId( (int) $order->get_id() );
223 if ( $validatedAddressId ) {
224 $validatedAddress = $this->createAddressFromPostId( $validatedAddressId );
225 $orderEntity->setAddressValidated( true );
226 $orderEntity->setDeliveryAddress( $validatedAddress );
227 }
228
229 $this->orderRepository->save( $orderEntity );
230 $order->save_meta_data();
231 }
232 }
233
234 /**
235 * Creates active widget address using woocommerce order id.
236 *
237 * @param int $addressId Address ID.
238 *
239 * @return Core\Entity\Address|null
240 */
241 public function createAddressFromPostId( int $addressId ): ?Core\Entity\Address {
242 $address = new Core\Entity\Address(
243 get_post_meta( $addressId, 'street', true ),
244 get_post_meta( $addressId, 'city', true ),
245 get_post_meta( $addressId, 'postCode', true )
246 );
247 $address->setHouseNumber( get_post_meta( $addressId, 'houseNumber', true ) );
248 $address->setCounty( get_post_meta( $addressId, 'county', true ) );
249 $address->setLongitude( get_post_meta( $addressId, 'longitude', true ) );
250 $address->setLatitude( get_post_meta( $addressId, 'latitude', true ) );
251
252 return $address;
253 }
254
255 /**
256 * Gets active address.
257 *
258 * @param int $orderId Order ID.
259 *
260 * @return int|null
261 */
262 public function getValidatedAddressIdByOrderId( int $orderId ): ?int {
263 $postIds = get_posts(
264 [
265 'post_type' => self::POST_TYPE_VALIDATED_ADDRESS,
266 'post_status' => 'any',
267 'nopaging' => true,
268 'numberposts' => 1,
269 'fields' => 'ids',
270 'post_parent' => $orderId,
271 ]
272 );
273
274 if ( empty( $postIds ) ) {
275 return null;
276 }
277
278 return (int) array_shift( $postIds );
279 }
280
281 /**
282 * Gets meta property of order as string.
283 *
284 * @param \WC_Order $order Order.
285 * @param string $key Meta order key.
286 *
287 * @return string|null
288 */
289 private function getMetaAsNullableString( \WC_Order $order, string $key ): ?string {
290 $value = $order->get_meta( $key, true );
291 return ( ( null !== $value && '' !== $value ) ? (string) $value : null );
292 }
293
294 /**
295 * Gets meta property of order as float.
296 *
297 * @param \WC_Order $order Order.
298 * @param string $key Meta order key.
299 *
300 * @return float|null
301 */
302 private function getMetaAsNullableFloat( \WC_Order $order, string $key ): ?float {
303 $value = $order->get_meta( $key, true );
304 return ( ( null !== $value && '' !== $value ) ? (float) $value : null );
305 }
306
307 /**
308 * Transforms custom query variable to meta query.
309 *
310 * @param array $queryVars Query vars.
311 * @param array $get Input values.
312 *
313 * @return array
314 */
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
321 }
322
323 return $queryVars;
324 }
325
326 /**
327 * Adds query vars to fetch order list.
328 *
329 * @param array $queryVars Query vars.
330 * @param array $get Get parameters.
331 *
332 * @return array
333 */
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 ];
345 }
346
347 return $queryVars;
348 }
349
350 }
351