PluginProbe
Packeta / 1.6.3
Packeta v1.6.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 / Carrier / Updater.php

Updater.php in Packeta 1.6.3, at src/Packetery/Module/Carrier/Updater.php

294 lines 7.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Packeta carrier updater
4 *
5 * @package Packetery
6 */
7
8 declare( strict_types=1 );
9
10 namespace Packetery\Module\Carrier;
11
12 use Packetery\Core\Log\ILogger;
13 use Packetery\Core\Log\Record;
14
15 /**
16 * Class CarrierUpdater.
17 *
18 * @package Packetery
19 */
20 class Updater {
21
22 /**
23 * Log messages.
24 *
25 * @var array
26 */
27 private $logMessages = [];
28
29 /**
30 * Carrier repository.
31 *
32 * @var Repository
33 */
34 private $carrier_repository;
35
36 /**
37 * Logger.
38 *
39 * @var ILogger
40 */
41 private $logger;
42
43 /**
44 * CarrierUpdater constructor.
45 *
46 * @param Repository $carrier_repository Carrier repository.
47 * @param ILogger $logger Logger.
48 */
49 public function __construct( Repository $carrier_repository, ILogger $logger ) {
50 $this->carrier_repository = $carrier_repository;
51 $this->logger = $logger;
52 }
53
54 /**
55 * Validates data from API.
56 *
57 * @param array $carriers Data retrieved from API.
58 *
59 * @return bool
60 */
61 public function validate_carrier_data( array $carriers ): bool {
62 foreach ( $carriers as $carrier ) {
63 if ( ! isset(
64 $carrier['id'],
65 $carrier['name'],
66 $carrier['country'],
67 $carrier['currency'],
68 $carrier['pickupPoints'],
69 $carrier['apiAllowed'],
70 $carrier['separateHouseNumber'],
71 $carrier['customsDeclarations'],
72 $carrier['requiresEmail'],
73 $carrier['requiresPhone'],
74 $carrier['requiresSize'],
75 $carrier['disallowsCod'],
76 $carrier['maxWeight']
77 ) ) {
78 return false;
79 }
80 }
81
82 return true;
83 }
84
85 /**
86 * Maps input data to storage structure.
87 *
88 * @param array $carriers Validated data retrieved from API.
89 *
90 * @return array data to store in db
91 */
92 private function carriers_mapper( array $carriers ): array {
93 $mapped_data = array();
94
95 $carrier_boolean_params = array(
96 'is_pickup_points' => 'pickupPoints',
97 'has_carrier_direct_label' => 'apiAllowed',
98 'separate_house_number' => 'separateHouseNumber',
99 'customs_declarations' => 'customsDeclarations',
100 'requires_email' => 'requiresEmail',
101 'requires_phone' => 'requiresPhone',
102 'requires_size' => 'requiresSize',
103 'disallows_cod' => 'disallowsCod',
104 );
105
106 foreach ( $carriers as $carrier ) {
107 $carrier_id = (int) $carrier['id'];
108 $carrier_data = array(
109 'name' => $carrier['name'],
110 'country' => $carrier['country'],
111 'currency' => $carrier['currency'],
112 'max_weight' => (float) $carrier['maxWeight'],
113 'deleted' => false,
114 );
115 foreach ( $carrier_boolean_params as $column_name => $param_name ) {
116 $carrier_data[ $column_name ] = ( 'true' === $carrier[ $param_name ] );
117 }
118 $mapped_data[ $carrier_id ] = $carrier_data;
119 }
120
121 return $mapped_data;
122 }
123
124 /**
125 * Saves carriers.
126 *
127 * @param array $carriers Validated data retrieved from API.
128 */
129 public function save( array $carriers ): void {
130 $mapped_data = $this->carriers_mapper( $carriers );
131 $carriersInDb = $this->carrier_repository->getAllRawIndexed();
132 foreach ( $mapped_data as $carrier_id => $carrier ) {
133 if ( ! empty( $carriersInDb[ $carrier_id ] ) ) {
134 $this->carrier_repository->update( $carrier, (int) $carrier_id );
135 $differences = $this->getArrayDifferences( $carriersInDb[ $carrier_id ], $carrier );
136 if ( ! empty( $differences ) ) {
137 $this->addLogEntry(
138 // translators: %s is carrier name.
139 sprintf( __( 'Carrier parameters changed for carrier "%s".', 'packeta' ), $carrier['name'] ) . ' ' .
140
141 __( 'New parameters', 'packeta' ) . ': ' . implode( ', ', $differences )
142 );
143 }
144 unset( $carriersInDb[ $carrier_id ] );
145 } else {
146 $carrier['id'] = $carrier_id;
147 $this->carrier_repository->insert( $carrier );
148 $this->addLogEntry(
149 // translators: %s is carrier name.
150 sprintf( __( 'A new carrier "%s" has been added.', 'packeta' ), $carrier['name'] )
151 );
152 }
153 }
154
155 if ( ! empty( $carriersInDb ) ) {
156 $this->carrier_repository->set_as_deleted( array_keys( $carriersInDb ) );
157 foreach ( $carriersInDb as $deletedCarrier ) {
158 if ( true === (bool) $deletedCarrier['deleted'] ) {
159 continue;
160 }
161 $this->addLogEntry(
162 // translators: %s is carrier name.
163 sprintf( __( 'Carrier "%s" has been removed.', 'packeta' ), $deletedCarrier['name'] )
164 );
165 }
166 }
167
168 if ( ! empty( $this->logMessages ) ) {
169 set_transient( CountryListingPage::TRANSIENT_CARRIER_CHANGES, true );
170 } else {
171 delete_transient( CountryListingPage::TRANSIENT_CARRIER_CHANGES );
172 }
173 }
174
175 /**
176 * Gets array changes as array of strings.
177 *
178 * @param array $old Previous version.
179 * @param array $new New version.
180 *
181 * @return string[]
182 */
183 private function getArrayDifferences( array $old, array $new ): array {
184 $differences = [];
185 $columnSettings = $this->getColumnSettings();
186
187 foreach ( $old as $key => $oldValue ) {
188 if ( 'id' === $key ) {
189 continue;
190 }
191
192 if ( 'deleted' === $key ) {
193 if ( '1' === (string) $oldValue && isset( $new['name'] ) ) {
194 $differences[ $key ] = __( 'carrier was re-enabled', 'packeta' );
195 }
196 continue;
197 }
198
199 $newValue = (string) $new[ $key ];
200 if ( $columnSettings[ $key ]['isBoolean'] ) {
201 $newValue = ( '1' === $newValue ? $newValue : '0' );
202 $oldValue = ( '1' === (string) $oldValue ? (string) $oldValue : '0' );
203 }
204 if ( (string) $oldValue === $newValue ) {
205 continue;
206 }
207 if ( $columnSettings[ $key ]['isBoolean'] ) {
208 $newValue = ( '1' === $newValue ? __( 'yes', 'packeta' ) : __( 'no', 'packeta' ) );
209 $oldValue = ( '1' === $oldValue ? __( 'yes', 'packeta' ) : __( 'no', 'packeta' ) );
210 }
211 $differences[ $key ] = $columnSettings[ $key ]['label'] . ': ' . $oldValue . ' => ' . $newValue;
212 }
213
214 return $differences;
215 }
216
217 /**
218 * Adds log entry.
219 *
220 * @param string $message Message.
221 *
222 * @return void
223 */
224 private function addLogEntry( string $message ): void {
225 $this->logMessages[] = $message;
226
227 $record = new Record();
228 $record->action = Record::ACTION_CARRIER_LIST_UPDATE;
229 $record->status = Record::STATUS_SUCCESS;
230 $record->title = $message;
231 $record->params = [];
232 $this->logger->add( $record );
233 }
234
235 /**
236 * Gets translations and isBoolean properties for column names.
237 *
238 * @return array[]
239 */
240 private function getColumnSettings(): array {
241 return [
242 'name' => [
243 'label' => __( 'name', 'packeta' ),
244 'isBoolean' => false,
245 ],
246 'is_pickup_points' => [
247 'label' => __( 'offers own pickup points', 'packeta' ),
248 'isBoolean' => true,
249 ],
250 'has_carrier_direct_label' => [
251 'label' => __( 'supports direct labels', 'packeta' ),
252 'isBoolean' => true,
253 ],
254 'separate_house_number' => [
255 'label' => __( 'requires separate house number', 'packeta' ),
256 'isBoolean' => true,
257 ],
258 'customs_declarations' => [
259 'label' => __( 'requires completion of customs declarations', 'packeta' ),
260 'isBoolean' => true,
261 ],
262 'requires_email' => [
263 'label' => __( 'requires email', 'packeta' ),
264 'isBoolean' => true,
265 ],
266 'requires_phone' => [
267 'label' => __( 'requires phone number', 'packeta' ),
268 'isBoolean' => true,
269 ],
270 'requires_size' => [
271 'label' => __( 'requires package size', 'packeta' ),
272 'isBoolean' => true,
273 ],
274 'disallows_cod' => [
275 'label' => __( 'disallows COD', 'packeta' ),
276 'isBoolean' => true,
277 ],
278 'country' => [
279 'label' => __( 'country', 'packeta' ),
280 'isBoolean' => false,
281 ],
282 'currency' => [
283 'label' => __( 'currency', 'packeta' ),
284 'isBoolean' => false,
285 ],
286 'max_weight' => [
287 'label' => __( 'maximum weight (kg)', 'packeta' ),
288 'isBoolean' => false,
289 ],
290 ];
291 }
292
293 }
294