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 / Api / Internal / OrderController.php

OrderController.php in Packeta trunk, at src/Packetery/Module/Api/Internal/OrderController.php

339 lines 11.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Class OrderController
4 *
5 * @package Packetery
6 */
7
8 declare( strict_types=1 );
9
10 namespace Packetery\Module\Api\Internal;
11
12 use Packetery\Core\CoreHelper;
13 use Packetery\Core\Entity\Size;
14 use Packetery\Core\Validator;
15 use Packetery\Module\Exception\InvalidCarrierException;
16 use Packetery\Module\Forms\FormData\OrderFormData;
17 use Packetery\Module\Forms\StoredUntilFormFactory;
18 use Packetery\Module\Framework\WpAdapter;
19 use Packetery\Module\Options\OptionsProvider;
20 use Packetery\Module\Order;
21 use Packetery\Module\Order\Form;
22 use Packetery\Module\Order\GridExtender;
23 use Packetery\Module\Order\OrderValidatorFactory;
24 use Packetery\Module\Order\PacketSetStoredUntil;
25 use Packetery\Module\Order\Repository;
26 use WP_Error;
27 use WP_REST_Controller;
28 use WP_REST_Request;
29 use WP_REST_Response;
30 use WP_REST_Server;
31
32 /**
33 * Class OrderController
34 *
35 * @package Packetery
36 */
37 final class OrderController extends WP_REST_Controller {
38
39 /**
40 * Router.
41 *
42 * @var OrderRouter
43 */
44 private $router;
45
46 /**
47 * Order modal.
48 *
49 * @var Form
50 */
51 private $orderForm;
52
53 /**
54 * Order repository.
55 *
56 * @var Order\Repository
57 */
58 private $orderRepository;
59
60 /**
61 * Grid extender service.
62 *
63 * @var GridExtender
64 */
65 private $gridExtender;
66
67 /**
68 * Order validator.
69 *
70 * @var Validator\Order
71 */
72 private $orderValidator;
73
74 /**
75 * CoreHelper.
76 *
77 * @var CoreHelper
78 */
79 private $coreHelper;
80
81 /**
82 * Stored until Form Factory
83 *
84 * @var StoredUntilFormFactory
85 */
86 private $storedUntilFormFactory;
87
88 /**
89 * Packet Set Stored Until
90 *
91 * @var PacketSetStoredUntil
92 */
93 private $packetSetStoredUntil;
94
95 /**
96 * Options provider.
97 *
98 * @var OptionsProvider
99 */
100 private $optionsProvider;
101
102 /**
103 * @var WpAdapter
104 */
105 private $wpAdapter;
106
107 /**
108 * Controller constructor.
109 *
110 * @param OrderRouter $router Router.
111 * @param Repository $orderRepository Order repository.
112 * @param GridExtender $gridExtender Grid extender.
113 * @param OrderValidatorFactory $orderValidatorFactory Order validator.
114 * @param CoreHelper $coreHelper CoreHelper.
115 * @param Form $orderForm Order form.
116 * @param StoredUntilFormFactory $storedUntilFormFactory Stored until Form Factory.
117 * @param PacketSetStoredUntil $packetSetStoredUntil Packet Set Stored Until.
118 * @param OptionsProvider $optionsProvider Options provider.
119 */
120 public function __construct(
121 OrderRouter $router,
122 Repository $orderRepository,
123 GridExtender $gridExtender,
124 OrderValidatorFactory $orderValidatorFactory,
125 CoreHelper $coreHelper,
126 Form $orderForm,
127 StoredUntilFormFactory $storedUntilFormFactory,
128 PacketSetStoredUntil $packetSetStoredUntil,
129 OptionsProvider $optionsProvider,
130 WpAdapter $wpAdapter
131 ) {
132 $this->orderForm = $orderForm;
133 $this->orderRepository = $orderRepository;
134 $this->gridExtender = $gridExtender;
135 $this->orderValidator = $orderValidatorFactory->create();
136 $this->coreHelper = $coreHelper;
137 $this->router = $router;
138 $this->storedUntilFormFactory = $storedUntilFormFactory;
139 $this->packetSetStoredUntil = $packetSetStoredUntil;
140 $this->optionsProvider = $optionsProvider;
141 $this->wpAdapter = $wpAdapter;
142 }
143
144 /**
145 * Register the routes of the controller.
146 *
147 * @return void
148 */
149 public function registerRoutes(): void {
150 $this->router->registerRoute(
151 OrderRouter::PATH_SAVE_MODAL,
152 [
153 [
154 'methods' => WP_REST_Server::EDITABLE,
155 'callback' => [ $this, 'saveModal' ],
156 'permission_callback' => function () {
157 return current_user_can( 'edit_posts' );
158 },
159 ],
160 ]
161 );
162
163 $this->router->registerRoute(
164 OrderRouter::PATH_SAVE_STORED_UNTIL,
165 [
166 [
167 'methods' => WP_REST_Server::EDITABLE,
168 'callback' => [ $this, 'saveStoredUntil' ],
169 'permission_callback' => function () {
170 return current_user_can( 'edit_posts' );
171 },
172 ],
173 ]
174 );
175 }
176
177 /**
178 * @param WP_REST_Request<string[]> $request
179 *
180 * @return WP_REST_Response|WP_Error
181 */
182 // phpcs:ignore Squiz.Commenting.FunctionComment.IncorrectTypeHint
183 public function saveModal( WP_REST_Request $request ) {
184 $data = [];
185 $parameters = $request->get_body_params();
186 $packeteryDeliverOn = $parameters['packeteryDeliverOn'] ?? null;
187 $orderId = (int) $parameters['orderId'];
188
189 $form = $this->orderForm->create();
190 $form->setValues(
191 [
192 Form::FIELD_WEIGHT => $parameters['packeteryWeight'],
193 Form::FIELD_ORIGINAL_WEIGHT => $parameters['packeteryOriginalWeight'],
194 Form::FIELD_WIDTH => $parameters['packeteryWidth'] ?? null,
195 Form::FIELD_LENGTH => $parameters['packeteryLength'] ?? null,
196 Form::FIELD_HEIGHT => $parameters['packeteryHeight'] ?? null,
197 Form::FIELD_ADULT_CONTENT => isset( $parameters['hasPacketeryAdultContent'] ) && $parameters['hasPacketeryAdultContent'] === 'true',
198 Form::FIELD_COD => $parameters['packeteryCOD'] ?? null,
199 Form::FIELD_CALCULATED_COD => $parameters['packeteryCalculatedCod'] ?? null,
200 Form::FIELD_VALUE => $parameters['packeteryValue'] ?? null,
201 Form::FIELD_CALCULATED_VALUE => $parameters['packeteryCalculatedValue'] ?? null,
202 Form::FIELD_DELIVER_ON => $packeteryDeliverOn,
203 ]
204 );
205
206 if ( $form->isValid() === false ) {
207 return new WP_Error( 'form_invalid', implode( ', ', $form->getErrors() ), 400 );
208 }
209
210 try {
211 $order = $this->orderRepository->getById( $orderId );
212 } catch ( InvalidCarrierException $exception ) {
213 return new WP_Error( 'order_not_loaded', $exception->getMessage(), 400 );
214 }
215 if ( $order === null ) {
216 return new WP_Error( 'order_not_loaded', __( 'Order could not be loaded.', 'packeta' ), 400 );
217 }
218 /** @var OrderFormData $orderFormData */
219 $orderFormData = $form->getValues( OrderFormData::class );
220
221 $size = new Size(
222 $this->optionsProvider->getSanitizedDimensionValueInMm( $orderFormData->packeteryLength ),
223 $this->optionsProvider->getSanitizedDimensionValueInMm( $orderFormData->packeteryWidth ),
224 $this->optionsProvider->getSanitizedDimensionValueInMm( $orderFormData->packeteryHeight )
225 );
226
227 if ( $orderFormData->packeteryWeight !== (float) $orderFormData->packeteryOriginalWeight ) {
228 $order->setWeight( $orderFormData->packeteryWeight );
229 }
230
231 if ( $orderFormData->packeteryCOD !== (float) $orderFormData->packeteryCalculatedCod ) {
232 $order->setManualCod( $orderFormData->packeteryCOD );
233 } else {
234 $order->setManualCod( null );
235 }
236 $order->setAdultContent( $orderFormData->packeteryAdultContent );
237 if ( $orderFormData->packeteryValue !== (float) $orderFormData->packeteryCalculatedValue ) {
238 $order->setManualValue( $orderFormData->packeteryValue );
239 } else {
240 $order->setManualValue( null );
241 }
242 $order->setSize( $size );
243 $order->setDeliverOn( $this->coreHelper->getDateTimeFromString( $packeteryDeliverOn ) );
244
245 $invalidFields = $this->orderForm->getInvalidFieldsFromValidationResult( $this->orderValidator->validate( $order ) );
246 $invalidFieldsMessage = $this->orderForm->getInvalidFieldsMessageFromValidationResult( $invalidFields, $order );
247
248 $updatedRowCount = $this->orderRepository->save( $order );
249 if ( $updatedRowCount === false ) {
250 return new WP_Error( 'order_not_updated', (string) $this->wpAdapter->__( 'An error occurred while saving the order. More details in WC log.', 'packeta' ), 400 );
251 }
252
253 $data['message'] = __( 'Success', 'packeta' );
254 $data['data'] = [
255 'fragments' => [
256 sprintf( '[data-packetery-order-id="%d"][data-packetery-order-grid-cell-weight]', $orderId ) => $this->gridExtender->getWeightCellContent( $order ),
257 ],
258 Form::FIELD_WEIGHT => $order->getFinalWeight(),
259 Form::FIELD_ORIGINAL_WEIGHT => $order->getCalculatedWeight(),
260 Form::FIELD_LENGTH => CoreHelper::trimDecimalPlaces( $orderFormData->packeteryLength, $this->optionsProvider->getDimensionsNumberOfDecimals() ),
261 Form::FIELD_WIDTH => CoreHelper::trimDecimalPlaces( $orderFormData->packeteryWidth, $this->optionsProvider->getDimensionsNumberOfDecimals() ),
262 Form::FIELD_HEIGHT => CoreHelper::trimDecimalPlaces( $orderFormData->packeteryHeight, $this->optionsProvider->getDimensionsNumberOfDecimals() ),
263 Form::FIELD_ADULT_CONTENT => $order->containsAdultContent(),
264 Form::FIELD_COD => $order->getFinalCod(),
265 Form::FIELD_CALCULATED_COD => $order->getCalculatedCod(),
266 Form::FIELD_VALUE => $order->getFinalValue(),
267 Form::FIELD_CALCULATED_VALUE => $order->getCalculatedValue(),
268 Form::FIELD_DELIVER_ON => $this->coreHelper->getStringFromDateTime( $order->getDeliverOn(), CoreHelper::DATEPICKER_FORMAT ),
269 'orderIsSubmittable' => $this->orderValidator->isValid( $order ),
270 'orderWarningFields' => $invalidFields,
271 'invalidFieldsMessage' => $invalidFieldsMessage,
272 'hasOrderManualWeight' => $order->hasManualWeight(),
273 'hasOrderManualCod' => $order->hasManualCod(),
274 'hasOrderManualValue' => $order->hasManualValue(),
275 ];
276
277 return new WP_REST_Response( $data, 200 );
278 }
279
280 /**
281 * @param WP_REST_Request<string[]> $request
282 *
283 * @return WP_REST_Response|WP_Error
284 */
285 // phpcs:ignore Squiz.Commenting.FunctionComment.IncorrectTypeHint
286 public function saveStoredUntil( WP_REST_Request $request ) {
287 $data = [];
288 $parameters = $request->get_body_params();
289 $orderId = (int) $parameters['orderId'];
290 $storedUntil = $parameters['packeteryStoredUntil'] ?? null;
291
292 $form = $this->storedUntilFormFactory->createForm( sprintf( '%s_form', Order\StoredUntilModal::MODAL_ID ) );
293 $form->setValues(
294 [
295 'packetery_stored_until' => $storedUntil,
296 ]
297 );
298
299 if ( $form->isValid() === false ) {
300 return new WP_Error( 'form_invalid', implode( ', ', $form->getErrors() ), 400 );
301 }
302
303 try {
304 $order = $this->orderRepository->getById( $orderId );
305 } catch ( InvalidCarrierException $exception ) {
306 return new WP_Error( 'order_not_loaded', $exception->getMessage(), 400 );
307 }
308 if ( $order === null ) {
309 return new WP_Error( 'order_not_loaded', __( 'Order could not be loaded.', 'packeta' ), 400 );
310 }
311
312 $errorMessage = $this->packetSetStoredUntil->setStoredUntil( $order, $order->getPacketId(), $this->coreHelper->getDateTimeFromString( $storedUntil ) );
313
314 if ( $errorMessage !== null ) {
315 return new WP_Error( 'packetery_fault', $errorMessage, 400 );
316 }
317
318 $order->setStoredUntil( $this->coreHelper->getDateTimeFromString( $storedUntil ) );
319
320 $updatedRowCount = $this->orderRepository->save( $order );
321 if ( $updatedRowCount === false ) {
322 return new WP_Error( 'order_not_updated', (string) $this->wpAdapter->__( 'Date set in the Packeta system, but an error occurred while saving the order. More details in WC log.', 'packeta' ), 400 );
323 }
324
325 $invalidFields = $this->orderForm->getInvalidFieldsFromValidationResult( $this->orderValidator->validate( $order ) );
326 $invalidFieldsMessage = $this->orderForm->getInvalidFieldsMessageFromValidationResult( $invalidFields, $order );
327
328 $data['message'] = __( 'Success', 'packeta' );
329 $data['data'] = [
330 'packeteryStoredUntil' => $order->getStoredUntil(),
331 'orderIsSubmittable' => $this->orderValidator->isValid( $order ),
332 'orderWarningFields' => $invalidFields,
333 'invalidFieldsMessage' => $invalidFieldsMessage,
334 ];
335
336 return new WP_REST_Response( $data, 200 );
337 }
338 }
339