PluginProbe
Packeta / 2.0.9
Packeta v2.0.9
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 / GridExtender.php

GridExtender.php in Packeta 2.0.9, at src/Packetery/Module/Order/GridExtender.php

469 lines 14.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Class GridExtender.
4 *
5 * @package Packetery\Order
6 */
7
8 declare( strict_types=1 );
9
10 namespace Packetery\Module\Order;
11
12 use Packetery\Core;
13 use Packetery\Core\CoreHelper;
14 use Packetery\Latte\Engine;
15 use Packetery\Module\Carrier\CarrierOptionsFactory;
16 use Packetery\Module\ContextResolver;
17 use Packetery\Module\EntityFactory\SizeFactory;
18 use Packetery\Module\Exception\InvalidCarrierException;
19 use Packetery\Module\Framework\WpAdapter;
20 use Packetery\Module\Log\Purger;
21 use Packetery\Module\ModuleHelper;
22 use Packetery\Module\Plugin;
23 use Packetery\Nette\Http\Request;
24 use WC_Order;
25
26 use function esc_html;
27
28 /**
29 * Class GridExtender.
30 *
31 * @package Packetery\Order
32 */
33 class GridExtender {
34
35 private const TEMPLATE_GRID_COLUMN_WEIGHT = PACKETERY_PLUGIN_DIR . '/template/order/grid-column-weight.latte';
36
37 /**
38 * Generic CoreHelper.
39 *
40 * @var CoreHelper
41 */
42 private $coreHelper;
43
44 /**
45 * Latte Engine.
46 *
47 * @var Engine
48 */
49 private $latteEngine;
50
51 /**
52 * Http Request.
53 *
54 * @var Request
55 */
56 private $httpRequest;
57
58 /**
59 * Order repository.
60 *
61 * @var Repository
62 */
63 private $orderRepository;
64
65 /**
66 * Order Validator.
67 *
68 * @var Core\Validator\Order
69 */
70 private $orderValidator;
71
72 /**
73 * Context resolver.
74 *
75 * @var ContextResolver
76 */
77 private $contextResolver;
78
79 /**
80 * Carrier options factory.
81 *
82 * @var CarrierOptionsFactory
83 */
84 private $carrierOptionsFactory;
85
86 /**
87 * WordPress Adapter.
88 *
89 * @var WpAdapter
90 */
91 private $wpAdapter;
92
93 /**
94 * Module helper
95 *
96 * @var ModuleHelper
97 */
98 private $moduleHelper;
99
100 /**
101 * @var SizeFactory
102 */
103 private $sizeFactory;
104
105 /**
106 * GridExtender constructor.
107 *
108 * @param CoreHelper $coreHelper CoreHelper.
109 * @param Engine $latteEngine Latte Engine.
110 * @param Request $httpRequest Http Request.
111 * @param Repository $orderRepository Order repository.
112 * @param OrderValidatorFactory $orderValidatorFactory Order validator.
113 * @param ContextResolver $contextResolver Context resolver.
114 * @param CarrierOptionsFactory $carrierOptionsFactory Carrier options factory.
115 * @param WpAdapter $wpAdapter WordPress adapter.
116 * @param ModuleHelper $moduleHelper Module helper.
117 * @param SizeFactory $sizeFactory Size factory.
118 */
119 public function __construct(
120 CoreHelper $coreHelper,
121 Engine $latteEngine,
122 Request $httpRequest,
123 Repository $orderRepository,
124 OrderValidatorFactory $orderValidatorFactory,
125 ContextResolver $contextResolver,
126 CarrierOptionsFactory $carrierOptionsFactory,
127 WpAdapter $wpAdapter,
128 ModuleHelper $moduleHelper,
129 SizeFactory $sizeFactory
130 ) {
131 $this->coreHelper = $coreHelper;
132 $this->latteEngine = $latteEngine;
133 $this->httpRequest = $httpRequest;
134 $this->orderRepository = $orderRepository;
135 $this->orderValidator = $orderValidatorFactory->create();
136 $this->contextResolver = $contextResolver;
137 $this->carrierOptionsFactory = $carrierOptionsFactory;
138 $this->wpAdapter = $wpAdapter;
139 $this->moduleHelper = $moduleHelper;
140 $this->sizeFactory = $sizeFactory;
141 }
142
143 /**
144 * Adds custom filtering links to order grid.
145 *
146 * @param string[] $htmlLinks Array of html links.
147 *
148 * @return string[]
149 */
150 public function addFilterLinks( array $htmlLinks ): array {
151 $latteParams = [
152 'link' => ModuleHelper::getOrderGridUrl(
153 [
154 'filter_action' => 'packetery_filter_link',
155 'packetery_to_submit' => '1',
156 'packetery_to_print' => false,
157 ]
158 ),
159 'title' => __( 'Packeta orders to submit', 'packeta' ),
160 'orderCount' => $this->orderRepository->countOrdersToSubmit(),
161 'active' => ( $this->httpRequest->getQuery( 'packetery_to_submit' ) === '1' ),
162 ];
163 $htmlLinks[] = $this->latteEngine->renderToString( PACKETERY_PLUGIN_DIR . '/template/order/filter-link.latte', $latteParams );
164
165 $latteParams = [
166 'link' => ModuleHelper::getOrderGridUrl(
167 [
168 'filter_action' => 'packetery_filter_link',
169 'packetery_to_submit' => false,
170 'packetery_to_print' => '1',
171 ]
172 ),
173 'title' => __( 'Packeta orders to print', 'packeta' ),
174 'orderCount' => $this->orderRepository->countOrdersToPrint(),
175 'active' => ( $this->httpRequest->getQuery( 'packetery_to_print' ) === '1' ),
176 ];
177 $htmlLinks[] = $this->latteEngine->renderToString( PACKETERY_PLUGIN_DIR . '/template/order/filter-link.latte', $latteParams );
178
179 return $htmlLinks;
180 }
181
182 /**
183 * Adds select to order grid.
184 */
185 public function renderOrderTypeSelect(): void {
186 if ( $this->contextResolver->isOrderGridPage() === false ) {
187 return;
188 }
189
190 $linkFilters = [];
191
192 if ( $this->httpRequest->getQuery( 'packetery_to_submit' ) !== null ) {
193 $linkFilters['packetery_to_submit'] = '1';
194 }
195
196 if ( $this->httpRequest->getQuery( 'packetery_to_print' ) !== null ) {
197 $linkFilters['packetery_to_print'] = '1';
198 }
199
200 $this->latteEngine->render(
201 PACKETERY_PLUGIN_DIR . '/template/order/type-select.latte',
202 [
203 'packeteryOrderType' => $this->httpRequest->getQuery( 'packetery_order_type' ),
204 'linkFilters' => $linkFilters,
205 'translations' => [
206 'packetaMethodType' => __( 'Packeta shipping method', 'packeta' ),
207 'carrierPackets' => __( 'Carrier packets', 'packeta' ),
208 'packetaPickupPointPackets' => __( 'Packeta pickup points packets', 'packeta' ),
209 ],
210 ]
211 );
212 }
213
214 /**
215 * Gets weight cell content.
216 *
217 * @param Core\Entity\Order $order Order.
218 *
219 * @return string
220 */
221 public function getWeightCellContent( Core\Entity\Order $order ): string {
222 return $this->latteEngine->renderToString(
223 self::TEMPLATE_GRID_COLUMN_WEIGHT,
224 $this->getWeightCellContentParams( $order )
225 );
226 }
227
228 /**
229 * Gets weight cell content.
230 *
231 * @param Core\Entity\Order $order Order.
232 *
233 * @return array{orderNumber: null|string, weight: null|float}
234 */
235 private function getWeightCellContentParams( Core\Entity\Order $order ): array {
236 return [
237 'orderNumber' => $order->getNumber(),
238 'weight' => $order->getFinalWeight(),
239 ];
240 }
241
242 /**
243 * Get Order Entity from cache
244 *
245 * @param int $orderId Order ID.
246 *
247 * @return Core\Entity\Order|null
248 * @throws InvalidCarrierException InvalidCarrierException.
249 */
250 private function getOrderByIdCached( int $orderId ): ?Core\Entity\Order {
251 static $ordersCache;
252
253 if ( ! isset( $ordersCache[ $orderId ] ) ) {
254 $ordersCache[ $orderId ] = $this->orderRepository->getById( $orderId );
255 }
256
257 return $ordersCache[ $orderId ] ?? null;
258 }
259
260 /**
261 * Fills custom order list columns.
262 *
263 * @param string|mixed $column Current order column name.
264 * @param WC_Order|int|mixed $wcOrder WC Order.
265 */
266 public function fillCustomOrderListColumns( $column, $wcOrder ): void {
267 if ( is_string( $column ) === false ) {
268 return;
269 }
270
271 if ( $wcOrder instanceof WC_Order ) {
272 $orderId = $wcOrder->get_id();
273 } elseif ( is_numeric( $wcOrder ) ) {
274 $orderId = (int) $wcOrder;
275 } else {
276 return;
277 }
278
279 try {
280 $order = $this->getOrderByIdCached( $orderId );
281 } catch ( InvalidCarrierException $exception ) {
282 if ( $column === 'packetery' ) {
283 echo esc_html( $exception->getMessage() );
284 }
285
286 return;
287 }
288 if ( $order === null ) {
289 return;
290 }
291
292 switch ( $column ) {
293 case 'packetery_weight':
294 $this->latteEngine->render(
295 self::TEMPLATE_GRID_COLUMN_WEIGHT,
296 $this->getWeightCellContentParams( $order )
297 );
298
299 break;
300 case 'packetery_destination':
301 $pickupPoint = $order->getPickupPoint();
302 if ( $pickupPoint !== null ) {
303 $pointName = $pickupPoint->getName();
304 $pointId = $pickupPoint->getId();
305 if ( ! $order->isExternalCarrier() ) {
306 echo esc_html( "$pointName ($pointId)" );
307 } else {
308 echo esc_html( $pointName );
309 }
310
311 break;
312 }
313
314 $homeDeliveryCarrierOptions = $this->carrierOptionsFactory->createByCarrierId( $order->getCarrier()->getId() );
315 echo esc_html( $homeDeliveryCarrierOptions->getName() );
316
317 break;
318 case 'packetery_packet_id':
319 $packetId = $order->getPacketId();
320 $packetClaimId = $order->getPacketClaimId();
321 $latteParams = [
322 'order' => $order,
323 'packetIdTrackingUrl' => null,
324 'packetClaimIdTrackingUrl' => null,
325 'translations' => [
326 'packetClaimTracking' => __( 'Packet claim tracking', 'packeta' ),
327 ],
328 ];
329
330 if ( $packetId !== null ) {
331 $latteParams['packetIdTrackingUrl'] = $this->coreHelper->getTrackingUrl( $packetId );
332 }
333
334 if ( $packetClaimId !== null ) {
335 $latteParams['packetClaimIdTrackingUrl'] = $this->coreHelper->getTrackingUrl( $packetClaimId );
336 }
337
338 $this->latteEngine->render(
339 PACKETERY_PLUGIN_DIR . '/template/order/grid-column-tracking.latte',
340 $latteParams
341 );
342
343 break;
344 case 'packetery':
345 $encodedOrderGridParams = rawurlencode( $this->httpRequest->getUrl()->getQuery() );
346 $packetSubmitUrl = add_query_arg(
347 [
348 PacketActionsCommonLogic::PARAM_ORDER_ID => $order->getNumber(),
349 Plugin::PARAM_PACKETERY_ACTION => PacketActionsCommonLogic::ACTION_SUBMIT_PACKET,
350 PacketActionsCommonLogic::PARAM_REDIRECT_TO => PacketActionsCommonLogic::REDIRECT_TO_ORDER_GRID,
351 Plugin::PARAM_NONCE => wp_create_nonce( PacketActionsCommonLogic::createNonceAction( PacketActionsCommonLogic::ACTION_SUBMIT_PACKET, $order->getNumber() ) ),
352 PacketActionsCommonLogic::PARAM_ORDER_GRID_PARAMS => $encodedOrderGridParams,
353 ],
354 admin_url( 'admin.php' )
355 );
356 $printLink = add_query_arg(
357 [
358 'page' => LabelPrint::MENU_SLUG,
359 LabelPrint::LABEL_TYPE_PARAM => ( $order->isExternalCarrier() ? LabelPrint::ACTION_CARRIER_LABELS : LabelPrint::ACTION_PACKETA_LABELS ),
360 'id' => $order->getNumber(),
361 'packet_id' => $order->getPacketId(),
362 'offset' => 0,
363 PacketActionsCommonLogic::PARAM_ORDER_GRID_PARAMS => $encodedOrderGridParams,
364 ],
365 admin_url( 'admin.php' )
366 );
367 $packetCancelLink = add_query_arg(
368 [
369 PacketActionsCommonLogic::PARAM_ORDER_ID => $order->getNumber(),
370 PacketActionsCommonLogic::PARAM_PACKET_ID => $order->getPacketId(),
371 Plugin::PARAM_PACKETERY_ACTION => PacketActionsCommonLogic::ACTION_CANCEL_PACKET,
372 PacketActionsCommonLogic::PARAM_REDIRECT_TO => PacketActionsCommonLogic::REDIRECT_TO_ORDER_GRID,
373 Plugin::PARAM_NONCE => wp_create_nonce( PacketActionsCommonLogic::createNonceAction( PacketActionsCommonLogic::ACTION_CANCEL_PACKET, $order->getNumber() ) ),
374 PacketActionsCommonLogic::PARAM_ORDER_GRID_PARAMS => $encodedOrderGridParams,
375 ],
376 admin_url( 'admin.php' )
377 );
378
379 $this->latteEngine->render(
380 PACKETERY_PLUGIN_DIR . '/template/order/grid-column-packetery.latte',
381 [
382 'order' => $order,
383 'dimensions' => $this->sizeFactory->createSizeInSetDimensionUnit( $order ),
384 'orderIsSubmittable' => $this->orderValidator->isValid( $order ),
385 'isPossibleExtendPacketPickUpDate' => $order->isPossibleExtendPacketPickUpDate(),
386 'storedUntil' => $this->coreHelper->getStringFromDateTime( $order->getStoredUntil(), CoreHelper::DATEPICKER_FORMAT ),
387 'orderWarningFields' => Form::getInvalidFieldsFromValidationResult( $this->orderValidator->validate( $order ) ),
388 'packetSubmitUrl' => $packetSubmitUrl,
389 'packetCancelLink' => $packetCancelLink,
390 'printLink' => $printLink,
391 'helper' => $this->coreHelper,
392 'datePickerFormat' => CoreHelper::DATEPICKER_FORMAT,
393 'logPurgerDatetimeModifier' => $this->wpAdapter->getOption( Purger::PURGER_OPTION_NAME, Purger::PURGER_MODIFIER_DEFAULT ),
394 'packetDeliverOn' => $this->coreHelper->getStringFromDateTime( $order->getDeliverOn(), CoreHelper::DATEPICKER_FORMAT ),
395 'translations' => [
396 'printLabel' => __( 'Print label', 'packeta' ),
397 'setAdditionalPacketInfo' => __( 'Set additional packet information', 'packeta' ),
398 'setStoredUntil' => __( 'Set the pickup date extension', 'packeta' ),
399 'packetSubmissionNotPossible' => __( 'It is not possible to submit the shipment because all the information required for this shipment is not filled.', 'packeta' ),
400 'submitToPacketa' => __( 'Submit to Packeta', 'packeta' ),
401 // translators: %s: Order number.
402 'reallyCancelPacketHeading' => sprintf( __( 'Order #%s', 'packeta' ), $order->getCustomNumber() ),
403 // translators: %s: Packet number.
404 'reallyCancelPacket' => sprintf( __( 'Do you really wish to cancel parcel number %s?', 'packeta' ), (string) $order->getPacketId() ),
405
406 'cancelPacket' => __( 'Cancel packet', 'packeta' ),
407 'lastErrorFromApi' => __( 'Last error from Packeta API', 'packeta' ),
408 ],
409 ]
410 );
411
412 break;
413 case 'packetery_packet_status':
414 echo esc_html( PacketStatusResolver::getTranslatedName( $order->getPacketStatus() ) );
415
416 break;
417 case 'packetery_packet_stored_until':
418 $this->latteEngine->render(
419 PACKETERY_PLUGIN_DIR . '/template/order/grid-column-stored-until.latte',
420 [
421 'orderNumber' => $order->getNumber(),
422 'storedUntil' => $this->moduleHelper->getTranslatedStringFromDateTime( $order->getStoredUntil() ) ?? '',
423 ]
424 );
425
426 break;
427 }
428 }
429
430 /**
431 * Add order list columns.
432 *
433 * @param string[] $columns Order list columns.
434 *
435 * @return string[] All columns.
436 */
437 public function addOrderListColumns( array $columns ): array {
438 $newColumns = array();
439
440 foreach ( $columns as $columnName => $columnInfo ) {
441 $newColumns[ $columnName ] = $columnInfo;
442
443 if ( $columnName === 'order_total' ) {
444 $newColumns['packetery_weight'] = __( 'Weight', 'packeta' );
445 $newColumns['packetery'] = __( 'Packeta', 'packeta' );
446 $newColumns['packetery_packet_id'] = __( 'Tracking No.', 'packeta' );
447 $newColumns['packetery_packet_status'] = __( 'Packeta packet status', 'packeta' );
448 $newColumns['packetery_packet_stored_until'] = __( 'Stored until', 'packeta' );
449 $newColumns['packetery_destination'] = __( 'Pickup point or carrier', 'packeta' );
450 }
451 }
452
453 return $newColumns;
454 }
455
456 /**
457 * Add order list sortable columns.
458 *
459 * @param string[] $columns Order list columns.
460 *
461 * @return string[] All columns.
462 */
463 public function makeOrderListSpecificColumnsSortable( array $columns ): array {
464 $metaKey = 'packetery_packet_stored_until';
465
466 return wp_parse_args( [ 'packetery_packet_stored_until' => $metaKey ], $columns );
467 }
468 }
469