PluginProbe
Packeta / trunk
Packeta vtrunk
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 / Order / PacketSynchronizer.php

PacketSynchronizer.php in Packeta trunk, at src/Packetery/Module/Order/PacketSynchronizer.php

264 lines 7.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Class Synchronizer
4 *
5 * @package Packetery\Module\Order
6 */
7
8 declare( strict_types=1 );
9
10 namespace Packetery\Module\Order;
11
12 use Packetery\Core\Api;
13 use Packetery\Core\Entity\Order;
14 use Packetery\Core\Entity\PacketStatus;
15 use Packetery\Core\Log;
16 use Packetery\Module\Exception\InvalidPasswordException;
17 use Packetery\Module\Framework\WcAdapter;
18 use Packetery\Module\Framework\WpAdapter;
19 use Packetery\Module\Options\OptionsProvider;
20
21 /**
22 * Class Synchronizer
23 *
24 * @package Packetery\Module\Order
25 */
26 class PacketSynchronizer {
27
28 private const HOOK_NAME_SYNC_ORDER_STATUS = 'packetery_sync_order_status';
29
30 /**
31 * API soap client.
32 *
33 * @var Api\Soap\Client
34 */
35 private $apiSoapClient;
36
37 /**
38 * Options provider.
39 *
40 * @var OptionsProvider
41 */
42 private $optionsProvider;
43
44 /**
45 * Logger.
46 *
47 * @var Log\ILogger
48 */
49 private $logger;
50
51 /**
52 * Order repository.
53 *
54 * @var Repository
55 */
56 private $orderRepository;
57
58 /**
59 * WC order actions.
60 *
61 * @var WcOrderActions
62 */
63 private $wcOrderActions;
64
65 /**
66 * WC adapter.
67 *
68 * @var WcAdapter
69 */
70 private $wcAdapter;
71
72 /**
73 * WP adapter.
74 *
75 * @var WpAdapter
76 */
77 private $wpAdapter;
78
79 /**
80 * Constructor.
81 *
82 * @param Api\Soap\Client $apiSoapClient API soap client.
83 * @param Log\ILogger $logger Logger.
84 * @param OptionsProvider $optionsProvider Options provider.
85 * @param Repository $orderRepository Order repository.
86 * @param WcOrderActions $wcOrderActions WC order actions.
87 * @param WcAdapter $wcAdapter WC adapter.
88 * @param WpAdapter $wpAdapter WP adapter.
89 */
90 public function __construct(
91 Api\Soap\Client $apiSoapClient,
92 Log\ILogger $logger,
93 OptionsProvider $optionsProvider,
94 Repository $orderRepository,
95 WcOrderActions $wcOrderActions,
96 WcAdapter $wcAdapter,
97 WpAdapter $wpAdapter
98 ) {
99 $this->apiSoapClient = $apiSoapClient;
100 $this->logger = $logger;
101 $this->optionsProvider = $optionsProvider;
102 $this->orderRepository = $orderRepository;
103 $this->wcOrderActions = $wcOrderActions;
104 $this->wcAdapter = $wcAdapter;
105 $this->wpAdapter = $wpAdapter;
106 }
107
108 /**
109 * Register hook.
110 *
111 * @return void
112 */
113 public function register() {
114 add_action( self::HOOK_NAME_SYNC_ORDER_STATUS, [ $this, 'syncStatusById' ] );
115 }
116
117 /**
118 * Synchronizes packets.
119 *
120 * @return void
121 * @throws \Exception Exception.
122 */
123 public function syncStatuses(): void {
124 $syncingOrderIds = $this->orderRepository->findStatusSyncingOrderIds(
125 $this->optionsProvider->getStatusSyncingPacketStatuses( $this->getDefaultPacketStatuses() ),
126 $this->optionsProvider->getExistingStatusSyncingOrderStatuses(),
127 $this->optionsProvider->getMaxDaysOfPacketStatusSyncing(),
128 $this->optionsProvider->getMaxStatusSyncingPackets()
129 );
130
131 foreach ( $syncingOrderIds as $orderId ) {
132 $this->wcAdapter->asScheduleSingleAction( time(), self::HOOK_NAME_SYNC_ORDER_STATUS, [ $orderId ] );
133 }
134 }
135
136 /**
137 * Synchronizes status for one order.
138 *
139 * @param int $orderId Order id.
140 *
141 * @return void
142 */
143 public function syncStatusById( int $orderId ): void {
144 $order = $this->orderRepository->getById( $orderId );
145 if ( $order === null ) {
146 return;
147 }
148
149 $this->syncStatus( $order );
150 }
151
152 /**
153 * Synchronizes status for one order.
154 *
155 * @param Order $order Order.
156 *
157 * @return void
158 * @throws InvalidPasswordException InvalidPasswordException.
159 */
160 public function syncStatus( Order $order ): void {
161 $packetId = $order->getPacketId();
162
163 $request = new Api\Soap\Request\PacketStatus( $packetId );
164 $response = $this->apiSoapClient->packetStatus( $request );
165
166 if ( $response->hasFault() ) {
167 $record = new Log\Record();
168 $record->action = Log\Record::ACTION_PACKET_STATUS_SYNC;
169 $record->status = Log\Record::STATUS_ERROR;
170 $record->title = __( 'Packet status could not be synchronized.', 'packeta' );
171 $record->params = [
172 'orderId' => $order->getNumber(),
173 'packetId' => $request->getPacketId(),
174 'errorMessage' => $response->getFaultString(),
175 ];
176 $record->orderId = $order->getNumber();
177 $this->logger->add( $record );
178
179 if ( $response->hasWrongPassword() ) {
180 throw new InvalidPasswordException( 'Wrong password.' );
181 }
182
183 return;
184 }
185
186 $storedUntilResponse = $response->getStoredUntil();
187 $storedUntilOrder = $order->getStoredUntil();
188
189 if ( $storedUntilResponse === $storedUntilOrder && $response->getCodeText() === $order->getPacketStatus() ) {
190 return;
191 }
192
193 if ( $storedUntilResponse !== $storedUntilOrder ) {
194 $order->setStoredUntil( $storedUntilResponse );
195 }
196
197 if ( $response->getCodeText() !== $order->getPacketStatus() ) {
198 $order->setPacketStatus( $response->getCodeText() );
199 $this->wcOrderActions->updateOrderStatus( $order->getNumber(), $response->getCodeText() );
200 }
201
202 $this->orderRepository->save( $order );
203 }
204
205 /**
206 * @return PacketStatus[]
207 */
208 public function getDefaultPacketStatuses(): array {
209 $result = [];
210
211 foreach ( $this->getPacketStatuses() as $statusName => $status ) {
212 if ( ! $status->hasDefaultSynchronization() ) {
213 continue;
214 }
215
216 $result[ $statusName ] = $status;
217 }
218
219 return $result;
220 }
221
222 /**
223 * Gets packet statuses and default values.
224 *
225 * @return PacketStatus[]
226 */
227 public function getPacketStatuses(): array {
228 return [
229 PacketStatus::RECEIVED_DATA =>
230 new PacketStatus( PacketStatus::RECEIVED_DATA, $this->wpAdapter->__( 'Awaiting consignment', 'packeta' ), true ),
231 PacketStatus::ARRIVED =>
232 new PacketStatus( PacketStatus::ARRIVED, $this->wpAdapter->__( 'Accepted at depot', 'packeta' ), true ),
233 PacketStatus::PREPARED_FOR_DEPARTURE =>
234 new PacketStatus( PacketStatus::PREPARED_FOR_DEPARTURE, $this->wpAdapter->__( 'On the way', 'packeta' ), true ),
235 PacketStatus::DEPARTED =>
236 new PacketStatus( PacketStatus::DEPARTED, $this->wpAdapter->__( 'Departed from depot', 'packeta' ), true ),
237 PacketStatus::READY_FOR_PICKUP =>
238 new PacketStatus( PacketStatus::READY_FOR_PICKUP, $this->wpAdapter->__( 'Ready for pick-up', 'packeta' ), true ),
239 PacketStatus::HANDED_TO_CARRIER =>
240 new PacketStatus( PacketStatus::HANDED_TO_CARRIER, $this->wpAdapter->__( 'Handed over to carrier company', 'packeta' ), true ),
241 PacketStatus::DELIVERED =>
242 new PacketStatus( PacketStatus::DELIVERED, $this->wpAdapter->__( 'Delivered', 'packeta' ), false ),
243 PacketStatus::POSTED_BACK =>
244 new PacketStatus( PacketStatus::POSTED_BACK, $this->wpAdapter->__( 'Return (on the way back)', 'packeta' ), true ),
245 PacketStatus::RETURNED =>
246 new PacketStatus( PacketStatus::RETURNED, $this->wpAdapter->__( 'Returned to sender', 'packeta' ), false ),
247 PacketStatus::CANCELLED =>
248 new PacketStatus( PacketStatus::CANCELLED, $this->wpAdapter->__( 'Cancelled', 'packeta' ), false ),
249 PacketStatus::COLLECTED =>
250 new PacketStatus( PacketStatus::COLLECTED, $this->wpAdapter->__( 'Parcel has been collected', 'packeta' ), true ),
251 PacketStatus::CUSTOMS =>
252 new PacketStatus( PacketStatus::CUSTOMS, $this->wpAdapter->__( 'Customs declaration process', 'packeta' ), true ),
253 PacketStatus::REVERSE_PACKET_ARRIVED =>
254 new PacketStatus( PacketStatus::REVERSE_PACKET_ARRIVED, $this->wpAdapter->__( 'Reverse parcel has been accepted at our pick up point', 'packeta' ), true ),
255 PacketStatus::DELIVERY_ATTEMPT =>
256 new PacketStatus( PacketStatus::DELIVERY_ATTEMPT, $this->wpAdapter->__( 'Unsuccessful delivery attempt of parcel', 'packeta' ), true ),
257 PacketStatus::REJECTED_BY_RECIPIENT =>
258 new PacketStatus( PacketStatus::REJECTED_BY_RECIPIENT, $this->wpAdapter->__( 'Rejected by recipient response', 'packeta' ), true ),
259 PacketStatus::UNKNOWN =>
260 new PacketStatus( PacketStatus::UNKNOWN, $this->wpAdapter->__( 'Unknown parcel status', 'packeta' ), false ),
261 ];
262 }
263 }
264