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

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

293 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 __( 'New parameters', 'packeta' ) . ': ' . implode( ', ', $differences )
141 );
142 }
143 unset( $carriersInDb[ $carrier_id ] );
144 } else {
145 $carrier['id'] = $carrier_id;
146 $this->carrier_repository->insert( $carrier );
147 $this->addLogEntry(
148 // translators: %s is carrier name.
149 sprintf( __( 'A new carrier "%s" has been added.', 'packeta' ), $carrier['name'] )
150 );
151 }
152 }
153
154 if ( ! empty( $carriersInDb ) ) {
155 $this->carrier_repository->set_as_deleted( array_keys( $carriersInDb ) );
156 foreach ( $carriersInDb as $deletedCarrier ) {
157 if ( true === (bool) $deletedCarrier['deleted'] ) {
158 continue;
159 }
160 $this->addLogEntry(
161 // translators: %s is carrier name.
162 sprintf( __( 'Carrier "%s" has been removed.', 'packeta' ), $deletedCarrier['name'] )
163 );
164 }
165 }
166
167 if ( ! empty( $this->logMessages ) ) {
168 set_transient( CountryListingPage::TRANSIENT_CARRIER_CHANGES, true );
169 } else {
170 delete_transient( CountryListingPage::TRANSIENT_CARRIER_CHANGES );
171 }
172 }
173
174 /**
175 * Gets array changes as array of strings.
176 *
177 * @param array $old Previous version.
178 * @param array $new New version.
179 *
180 * @return string[]
181 */
182 private function getArrayDifferences( array $old, array $new ): array {
183 $differences = [];
184 $columnSettings = $this->getColumnSettings();
185
186 foreach ( $old as $key => $oldValue ) {
187 if ( 'id' === $key ) {
188 continue;
189 }
190
191 if ( 'deleted' === $key ) {
192 if ( '1' === (string) $oldValue && isset( $new['name'] ) ) {
193 $differences[ $key ] = __( 'carrier was re-enabled', 'packeta' );
194 }
195 continue;
196 }
197
198 $newValue = (string) $new[ $key ];
199 if ( $columnSettings[ $key ]['isBoolean'] ) {
200 $newValue = ( '1' === $newValue ? $newValue : '0' );
201 $oldValue = ( '1' === (string) $oldValue ? (string) $oldValue : '0' );
202 }
203 if ( (string) $oldValue === $newValue ) {
204 continue;
205 }
206 if ( $columnSettings[ $key ]['isBoolean'] ) {
207 $newValue = ( '1' === $newValue ? __( 'yes', 'packeta' ) : __( 'no', 'packeta' ) );
208 $oldValue = ( '1' === $oldValue ? __( 'yes', 'packeta' ) : __( 'no', 'packeta' ) );
209 }
210 $differences[ $key ] = $columnSettings[ $key ]['label'] . ': ' . $oldValue . ' => ' . $newValue;
211 }
212
213 return $differences;
214 }
215
216 /**
217 * Adds log entry.
218 *
219 * @param string $message Message.
220 *
221 * @return void
222 */
223 private function addLogEntry( string $message ): void {
224 $this->logMessages[] = $message;
225
226 $record = new Record();
227 $record->action = Record::ACTION_CARRIER_LIST_UPDATE;
228 $record->status = Record::STATUS_SUCCESS;
229 $record->title = $message;
230 $record->params = [];
231 $this->logger->add( $record );
232 }
233
234 /**
235 * Gets translations and isBoolean properties for column names.
236 *
237 * @return array[]
238 */
239 private function getColumnSettings(): array {
240 return [
241 'name' => [
242 'label' => __( 'name', 'packeta' ),
243 'isBoolean' => false,
244 ],
245 'is_pickup_points' => [
246 'label' => __( 'offers own pickup points', 'packeta' ),
247 'isBoolean' => true,
248 ],
249 'has_carrier_direct_label' => [
250 'label' => __( 'supports direct labels', 'packeta' ),
251 'isBoolean' => true,
252 ],
253 'separate_house_number' => [
254 'label' => __( 'requires separate house number', 'packeta' ),
255 'isBoolean' => true,
256 ],
257 'customs_declarations' => [
258 'label' => __( 'requires completion of customs declarations', 'packeta' ),
259 'isBoolean' => true,
260 ],
261 'requires_email' => [
262 'label' => __( 'requires email', 'packeta' ),
263 'isBoolean' => true,
264 ],
265 'requires_phone' => [
266 'label' => __( 'requires phone number', 'packeta' ),
267 'isBoolean' => true,
268 ],
269 'requires_size' => [
270 'label' => __( 'requires package size', 'packeta' ),
271 'isBoolean' => true,
272 ],
273 'disallows_cod' => [
274 'label' => __( 'disallows COD', 'packeta' ),
275 'isBoolean' => true,
276 ],
277 'country' => [
278 'label' => __( 'country', 'packeta' ),
279 'isBoolean' => false,
280 ],
281 'currency' => [
282 'label' => __( 'currency', 'packeta' ),
283 'isBoolean' => false,
284 ],
285 'max_weight' => [
286 'label' => __( 'maximum weight (kg)', 'packeta' ),
287 'isBoolean' => false,
288 ],
289 ];
290 }
291
292 }
293