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 / Labels / CarrierLabelService.php

CarrierLabelService.php in Packeta trunk, at src/Packetery/Module/Labels/CarrierLabelService.php

187 lines 4.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 declare( strict_types=1 );
4
5 namespace Packetery\Module\Labels;
6
7 use Packetery\Core\Api\Soap\Client;
8 use Packetery\Core\Api\Soap\Request;
9 use Packetery\Core\Api\Soap\Response;
10 use Packetery\Core\Log;
11 use Packetery\Core\Log\ILogger;
12 use Packetery\Module\Framework\WpAdapter;
13 use Packetery\Module\MessageManager;
14 use Packetery\Module\Order\Repository;
15
16 class CarrierLabelService {
17
18 /**
19 * @var Client
20 */
21 private $soapApiClient;
22
23 /**
24 * @var MessageManager
25 */
26 private $messageManager;
27
28 /**
29 * @var ILogger
30 */
31 private $logger;
32
33 /**
34 * @var Repository
35 */
36 private $orderRepository;
37
38 /**
39 * @var WpAdapter
40 */
41 private $wpAdapter;
42
43 public function __construct(
44 Client $soapApiClient,
45 MessageManager $messageManager,
46 ILogger $logger,
47 Repository $orderRepository,
48 WpAdapter $wpAdapter
49 ) {
50 $this->soapApiClient = $soapApiClient;
51 $this->messageManager = $messageManager;
52 $this->logger = $logger;
53 $this->orderRepository = $orderRepository;
54 $this->wpAdapter = $wpAdapter;
55 }
56
57 /**
58 * Gets carrier packet numbers from API.
59 *
60 * @param string[] $packetIds
61 *
62 * @return array<int, array{packetId: string, courierNumber: string}>
63 */
64 public function getPacketIdsWithCourierNumbers( array $packetIds ): array {
65 $pairs = [];
66 foreach ( $packetIds as $orderId => $packetId ) {
67 $existingCarrierNumber = $this->getExistingCarrierNumber( (int) $orderId, $packetId );
68 if ( $existingCarrierNumber !== null ) {
69 $pairs[ $orderId ] = $existingCarrierNumber;
70
71 continue;
72 }
73
74 $request = new Request\PacketCourierNumber( $packetId );
75 $response = $this->soapApiClient->packetCourierNumber( $request );
76 if ( $response->hasFault() ) {
77 $continueProcessing = $this->handleApiError( $request, $response, (int) $orderId, $packetId );
78 if ( $continueProcessing === false ) {
79 return [];
80 }
81
82 continue;
83 }
84
85 $pairs[ $orderId ] = $this->handleApiSuccess( $response, (int) $orderId, $packetId );
86 }
87
88 return $pairs;
89 }
90
91 /**
92 * @return array{packetId: string, courierNumber: string}|null
93 */
94 private function getExistingCarrierNumber( int $orderId, string $packetId ): ?array {
95 $order = $this->orderRepository->getByIdWithValidCarrier( $orderId );
96 if ( $order !== null && $order->getCarrierNumber() !== null ) {
97 return [
98 'packetId' => $packetId,
99 'courierNumber' => $order->getCarrierNumber(),
100 ];
101 }
102
103 return null;
104 }
105
106 private function handleApiError( Request\PacketCourierNumber $request, Response\PacketCourierNumber $response, int $orderId, string $packetId ): bool {
107 if ( $response->hasWrongPassword() ) {
108 $this->messageManager->flash_message(
109 $this->wpAdapter->__( 'Please set a proper API password.', 'packeta' ),
110 MessageManager::TYPE_ERROR
111 );
112
113 return false;
114 }
115
116 $this->logError( $request, $response, $orderId );
117
118 $wcOrder = $this->orderRepository->getWcOrderById( $orderId );
119 $order = null;
120 if ( $wcOrder !== null ) {
121 $order = $this->orderRepository->getByWcOrderWithValidCarrier( $wcOrder );
122 }
123
124 if ( $order !== null ) {
125 $order->updateApiErrorMessage( $response->getFaultString() );
126 $this->orderRepository->save( $order );
127 }
128 if ( $wcOrder !== null ) {
129 $wcOrder->add_order_note(
130 sprintf(
131 // translators: %s represents shipment id
132 $this->wpAdapter->__( 'Packeta: Unable to obtain carrier tracking number for shipment Z%s.', 'packeta' ),
133 $packetId
134 )
135 );
136 $wcOrder->save();
137 }
138
139 return true;
140 }
141
142 private function logError( Request\PacketCourierNumber $request, Response\PacketCourierNumber $response, int $orderId ): void {
143 $record = new Log\Record();
144 $record->action = Log\Record::ACTION_CARRIER_NUMBER_RETRIEVING;
145 $record->status = Log\Record::STATUS_ERROR;
146 $record->title = __( 'Carrier number could not be retrieved.', 'packeta' );
147 $record->params = [
148 'packetId' => $request->getPacketId(),
149 'errorMessage' => $response->getFaultString(),
150 ];
151 $record->orderId = $orderId;
152 $this->logger->add( $record );
153 }
154
155 /**
156 * @return array{packetId: string, courierNumber: string}
157 */
158 private function handleApiSuccess( Response\PacketCourierNumber $response, int $orderId, string $packetId ): array {
159 $wcOrder = $this->orderRepository->getWcOrderById( $orderId );
160 $order = null;
161 if ( $wcOrder !== null ) {
162 $order = $this->orderRepository->getByWcOrderWithValidCarrier( $wcOrder );
163 }
164
165 if ( $order !== null ) {
166 $order->setCarrierNumber( $response->getNumber() );
167 $this->orderRepository->save( $order );
168 }
169 if ( $wcOrder !== null ) {
170 $wcOrder->add_order_note(
171 sprintf(
172 // translators: %1$s represents shipment id and %2$s is carrier tracking number
173 $this->wpAdapter->__( 'Packeta: Shipment Z%1$s was assigned carrier tracking number: %2$s.', 'packeta' ),
174 $packetId,
175 $response->getNumber()
176 )
177 );
178 $wcOrder->save();
179 }
180
181 return [
182 'packetId' => $packetId,
183 'courierNumber' => $response->getNumber(),
184 ];
185 }
186 }
187