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

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

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