These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
1 | <?php |
||
2 | |||
3 | /* |
||
4 | * This file is part of EC-CUBE |
||
5 | * |
||
6 | * Copyright(c) LOCKON CO.,LTD. All Rights Reserved. |
||
7 | * |
||
8 | * http://www.lockon.co.jp/ |
||
9 | * |
||
10 | * For the full copyright and license information, please view the LICENSE |
||
11 | * file that was distributed with this source code. |
||
12 | */ |
||
13 | |||
14 | namespace Eccube\Controller\Admin\Order; |
||
15 | |||
16 | use Doctrine\Common\Collections\ArrayCollection; |
||
17 | use Doctrine\Common\Collections\Criteria; |
||
18 | use Eccube\Controller\AbstractController; |
||
19 | use Eccube\Entity\Master\CustomerStatus; |
||
20 | use Eccube\Entity\Master\OrderItemType; |
||
21 | use Eccube\Entity\Master\OrderStatus; |
||
22 | use Eccube\Entity\Order; |
||
23 | use Eccube\Entity\Shipping; |
||
24 | use Eccube\Event\EccubeEvents; |
||
25 | use Eccube\Event\EventArgs; |
||
26 | use Eccube\Form\Type\AddCartType; |
||
27 | use Eccube\Form\Type\Admin\OrderType; |
||
28 | use Eccube\Form\Type\Admin\SearchCustomerType; |
||
29 | use Eccube\Form\Type\Admin\SearchProductType; |
||
30 | use Eccube\Repository\CategoryRepository; |
||
31 | use Eccube\Repository\CustomerRepository; |
||
32 | use Eccube\Repository\DeliveryRepository; |
||
33 | use Eccube\Repository\Master\DeviceTypeRepository; |
||
34 | use Eccube\Repository\Master\OrderItemTypeRepository; |
||
35 | use Eccube\Repository\Master\OrderStatusRepository; |
||
36 | use Eccube\Repository\OrderRepository; |
||
37 | use Eccube\Repository\ProductRepository; |
||
38 | use Eccube\Service\OrderHelper; |
||
39 | use Eccube\Service\OrderStateMachine; |
||
40 | use Eccube\Service\PurchaseFlow\Processor\OrderNoProcessor; |
||
41 | use Eccube\Service\PurchaseFlow\PurchaseContext; |
||
42 | use Eccube\Service\PurchaseFlow\PurchaseException; |
||
43 | use Eccube\Service\PurchaseFlow\PurchaseFlow; |
||
44 | use Eccube\Service\TaxRuleService; |
||
45 | use Knp\Component\Pager\Paginator; |
||
46 | use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; |
||
47 | use Symfony\Component\HttpFoundation\Request; |
||
48 | use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; |
||
49 | use Symfony\Component\Routing\Annotation\Route; |
||
50 | use Symfony\Component\Routing\RouterInterface; |
||
51 | use Symfony\Component\Serializer\Serializer; |
||
52 | use Symfony\Component\Serializer\SerializerInterface; |
||
53 | |||
54 | class EditController extends AbstractController |
||
55 | { |
||
56 | /** |
||
57 | * @var TaxRuleService |
||
58 | */ |
||
59 | protected $taxRuleService; |
||
60 | |||
61 | /** |
||
62 | * @var DeviceTypeRepository |
||
63 | */ |
||
64 | protected $deviceTypeRepository; |
||
65 | |||
66 | /** |
||
67 | * @var ProductRepository |
||
68 | */ |
||
69 | protected $productRepository; |
||
70 | |||
71 | /** |
||
72 | * @var CategoryRepository |
||
73 | */ |
||
74 | protected $categoryRepository; |
||
75 | |||
76 | /** |
||
77 | * @var CustomerRepository |
||
78 | */ |
||
79 | protected $customerRepository; |
||
80 | |||
81 | /** |
||
82 | * @var Serializer |
||
83 | */ |
||
84 | protected $serializer; |
||
85 | |||
86 | /** |
||
87 | * @var DeliveryRepository |
||
88 | */ |
||
89 | protected $deliveryRepository; |
||
90 | |||
91 | /** |
||
92 | * @var PurchaseFlow |
||
93 | */ |
||
94 | protected $purchaseFlow; |
||
95 | |||
96 | /** |
||
97 | * @var OrderRepository |
||
98 | */ |
||
99 | protected $orderRepository; |
||
100 | |||
101 | /** |
||
102 | * @var OrderNoProcessor |
||
103 | */ |
||
104 | protected $orderNoProcessor; |
||
105 | |||
106 | /** |
||
107 | * @var OrderItemTypeRepository |
||
108 | */ |
||
109 | protected $orderItemTypeRepository; |
||
110 | |||
111 | /** |
||
112 | * @var OrderStateMachine |
||
113 | */ |
||
114 | protected $orderStateMachine; |
||
115 | |||
116 | /** |
||
117 | * @var OrderStatusRepository |
||
118 | */ |
||
119 | protected $orderStatusRepository; |
||
120 | |||
121 | /** |
||
122 | * @var OrderHelper |
||
123 | */ |
||
124 | private $orderHelper; |
||
125 | |||
126 | /** |
||
127 | * EditController constructor. |
||
128 | * |
||
129 | * @param TaxRuleService $taxRuleService |
||
130 | * @param DeviceTypeRepository $deviceTypeRepository |
||
131 | * @param ProductRepository $productRepository |
||
132 | * @param CategoryRepository $categoryRepository |
||
133 | * @param CustomerRepository $customerRepository |
||
134 | * @param SerializerInterface $serializer |
||
135 | 10 | * @param DeliveryRepository $deliveryRepository |
|
136 | * @param PurchaseFlow $orderPurchaseFlow |
||
137 | * @param OrderRepository $orderRepository |
||
138 | * @param OrderNoProcessor $orderNoProcessor |
||
139 | * @param OrderItemTypeRepository $orderItemTypeRepository |
||
140 | * @param OrderStatusRepository $orderStatusRepository |
||
141 | * @param OrderStateMachine $orderStateMachine |
||
142 | * @param OrderHelper $orderHelper |
||
143 | */ |
||
144 | public function __construct( |
||
145 | TaxRuleService $taxRuleService, |
||
146 | DeviceTypeRepository $deviceTypeRepository, |
||
147 | ProductRepository $productRepository, |
||
148 | CategoryRepository $categoryRepository, |
||
149 | CustomerRepository $customerRepository, |
||
150 | 10 | SerializerInterface $serializer, |
|
151 | 10 | DeliveryRepository $deliveryRepository, |
|
152 | 10 | PurchaseFlow $orderPurchaseFlow, |
|
153 | 10 | OrderRepository $orderRepository, |
|
154 | 10 | OrderNoProcessor $orderNoProcessor, |
|
155 | 10 | OrderItemTypeRepository $orderItemTypeRepository, |
|
156 | 10 | OrderStatusRepository $orderStatusRepository, |
|
157 | 10 | OrderStateMachine $orderStateMachine, |
|
158 | 10 | OrderHelper $orderHelper |
|
159 | 10 | ) { |
|
160 | 10 | $this->taxRuleService = $taxRuleService; |
|
161 | 10 | $this->deviceTypeRepository = $deviceTypeRepository; |
|
162 | 10 | $this->productRepository = $productRepository; |
|
163 | $this->categoryRepository = $categoryRepository; |
||
164 | $this->customerRepository = $customerRepository; |
||
165 | $this->serializer = $serializer; |
||
166 | $this->deliveryRepository = $deliveryRepository; |
||
167 | $this->purchaseFlow = $orderPurchaseFlow; |
||
168 | $this->orderRepository = $orderRepository; |
||
169 | $this->orderNoProcessor = $orderNoProcessor; |
||
170 | $this->orderItemTypeRepository = $orderItemTypeRepository; |
||
171 | $this->orderStatusRepository = $orderStatusRepository; |
||
172 | 7 | $this->orderStateMachine = $orderStateMachine; |
|
173 | $this->orderHelper = $orderHelper; |
||
174 | 7 | } |
|
175 | 7 | ||
176 | /** |
||
177 | 7 | * 受注登録/編集画面. |
|
178 | * |
||
179 | 3 | * @Route("/%eccube_admin_route%/order/new", name="admin_order_new") |
|
180 | 3 | * @Route("/%eccube_admin_route%/order/{id}/edit", requirements={"id" = "\d+"}, name="admin_order_edit") |
|
181 | * @Template("@admin/Order/edit.twig") |
||
182 | 4 | */ |
|
183 | 4 | public function index(Request $request, $id = null, RouterInterface $router) |
|
184 | { |
||
185 | $TargetOrder = null; |
||
186 | $OriginOrder = null; |
||
187 | |||
188 | if (null === $id) { |
||
189 | 7 | // 空のエンティティを作成. |
|
190 | 7 | $TargetOrder = new Order(); |
|
191 | 7 | $TargetOrder->addShipping((new Shipping())->setOrder($TargetOrder)); |
|
192 | 4 | ||
193 | $preOrderId = $this->orderHelper->createPreOrderId(); |
||
194 | $TargetOrder->setPreOrderId($preOrderId); |
||
195 | 7 | } else { |
|
196 | $TargetOrder = $this->orderRepository->find($id); |
||
197 | 7 | if (null === $TargetOrder) { |
|
198 | throw new NotFoundHttpException(); |
||
199 | 7 | } |
|
200 | 7 | } |
|
201 | 7 | ||
202 | // 編集前の受注情報を保持 |
||
203 | 7 | $OriginOrder = clone $TargetOrder; |
|
204 | $OriginItems = new ArrayCollection(); |
||
205 | 7 | foreach ($TargetOrder->getOrderItems() as $Item) { |
|
206 | $OriginItems->add($Item); |
||
207 | 7 | } |
|
208 | |||
209 | 7 | $builder = $this->formFactory->createBuilder(OrderType::class, $TargetOrder); |
|
210 | 7 | ||
211 | $event = new EventArgs( |
||
212 | 7 | [ |
|
213 | 5 | 'builder' => $builder, |
|
214 | 'OriginOrder' => $OriginOrder, |
||
215 | 5 | 'TargetOrder' => $TargetOrder, |
|
216 | 5 | ], |
|
217 | 5 | $request |
|
218 | 5 | ); |
|
219 | $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_INDEX_INITIALIZE, $event); |
||
220 | 5 | ||
221 | $form = $builder->getForm(); |
||
222 | 5 | ||
223 | $form->handleRequest($request); |
||
224 | 5 | $purchaseContext = new PurchaseContext($OriginOrder, $OriginOrder->getCustomer()); |
|
225 | |||
226 | 5 | if ($form->isSubmitted() && $form['OrderItems']->isValid()) { |
|
227 | $event = new EventArgs( |
||
228 | [ |
||
229 | 'builder' => $builder, |
||
230 | 'OriginOrder' => $OriginOrder, |
||
231 | 'TargetOrder' => $TargetOrder, |
||
232 | 5 | 'PurchaseContext' => $purchaseContext, |
|
233 | ], |
||
234 | $request |
||
235 | ); |
||
236 | $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_INDEX_PROGRESS, $event); |
||
237 | |||
238 | $flowResult = $this->purchaseFlow->validate($TargetOrder, $purchaseContext); |
||
239 | 5 | ||
240 | if ($flowResult->hasWarning()) { |
||
241 | 5 | foreach ($flowResult->getWarning() as $warning) { |
|
242 | $this->addWarning($warning->getMessage(), 'admin'); |
||
243 | 5 | } |
|
244 | } |
||
245 | 5 | ||
246 | 5 | if ($flowResult->hasError()) { |
|
247 | foreach ($flowResult->getErrors() as $error) { |
||
248 | $this->addError($error->getMessage(), 'admin'); |
||
249 | } |
||
250 | } |
||
251 | |||
252 | 5 | // 登録ボタン押下 |
|
253 | 5 | switch ($request->get('mode')) { |
|
254 | case 'register': |
||
255 | log_info('受注登録開始', [$TargetOrder->getId()]); |
||
256 | 5 | ||
257 | if (!$flowResult->hasError() && $form->isValid()) { |
||
258 | 3 | try { |
|
259 | $this->purchaseFlow->prepare($TargetOrder, $purchaseContext); |
||
260 | $this->purchaseFlow->commit($TargetOrder, $purchaseContext); |
||
261 | } catch (PurchaseException $e) { |
||
262 | $this->addError($e->getMessage(), 'admin'); |
||
263 | break; |
||
264 | } |
||
265 | |||
266 | 3 | $OldStatus = $OriginOrder->getOrderStatus(); |
|
267 | $NewStatus = $TargetOrder->getOrderStatus(); |
||
268 | 3 | ||
269 | // ステータスが変更されている場合はステートマシンを実行. |
||
270 | if ($TargetOrder->getId() && $OldStatus->getId() != $NewStatus->getId()) { |
||
271 | 5 | // 発送済に変更された場合は, 発送日をセットする. |
|
272 | 5 | if ($NewStatus->getId() == OrderStatus::DELIVERED) { |
|
273 | $TargetOrder->getShippings()->map(function (Shipping $Shipping) { |
||
274 | 5 | if (!$Shipping->isShipped()) { |
|
275 | 3 | $Shipping->setShippingDate(new \DateTime()); |
|
276 | 3 | } |
|
277 | }); |
||
278 | } |
||
279 | 5 | // ステートマシンでステータスは更新されるので, 古いステータスに戻す. |
|
280 | $TargetOrder->setOrderStatus($OldStatus); |
||
281 | // FormTypeでステータスの遷移チェックは行っているのでapplyのみ実行. |
||
282 | 5 | $this->orderStateMachine->apply($TargetOrder, $NewStatus); |
|
283 | 5 | } |
|
284 | |||
285 | $this->entityManager->persist($TargetOrder); |
||
286 | 5 | $this->entityManager->flush(); |
|
287 | 5 | ||
288 | 5 | foreach ($OriginItems as $Item) { |
|
289 | if ($TargetOrder->getOrderItems()->contains($Item) === false) { |
||
290 | $this->entityManager->remove($Item); |
||
291 | 5 | } |
|
292 | } |
||
293 | 5 | $this->entityManager->flush(); |
|
294 | 5 | ||
295 | 5 | // 新規登録時はMySQL対応のためflushしてから採番 |
|
296 | 5 | $this->orderNoProcessor->process($TargetOrder, $purchaseContext); |
|
297 | $this->entityManager->flush(); |
||
298 | 5 | ||
299 | // 会員の場合、購入回数、購入金額などを更新 |
||
300 | 5 | if ($Customer = $TargetOrder->getCustomer()) { |
|
301 | $this->orderRepository->updateOrderSummary($Customer); |
||
302 | 5 | $this->entityManager->flush($Customer); |
|
303 | } |
||
304 | 5 | ||
305 | $event = new EventArgs( |
||
306 | 5 | [ |
|
307 | 'form' => $form, |
||
308 | 'OriginOrder' => $OriginOrder, |
||
309 | 'TargetOrder' => $TargetOrder, |
||
310 | 'Customer' => $Customer, |
||
311 | ], |
||
312 | $request |
||
313 | ); |
||
314 | $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_INDEX_COMPLETE, $event); |
||
315 | |||
316 | 2 | $this->addSuccess('admin.common.save_complete', 'admin'); |
|
317 | 2 | ||
318 | log_info('受注登録完了', [$TargetOrder->getId()]); |
||
319 | 2 | ||
320 | View Code Duplication | if ($returnLink = $form->get('return_link')->getData()) { |
|
321 | 2 | try { |
|
322 | 2 | // $returnLinkはpathの形式で渡される. pathが存在するかをルータでチェックする. |
|
323 | 2 | $pattern = '/^'.preg_quote($request->getBasePath(), '/').'/'; |
|
324 | $returnLink = preg_replace($pattern, '', $returnLink); |
||
325 | 2 | $result = $router->match($returnLink); |
|
0 ignored issues
–
show
|
|||
326 | // パラメータのみ抽出 |
||
327 | 2 | $params = array_filter($result, function ($key) { |
|
328 | return 0 !== \strpos($key, '_'); |
||
329 | 2 | }, ARRAY_FILTER_USE_KEY); |
|
330 | |||
331 | // pathからurlを再構築してリダイレクト. |
||
332 | 2 | return $this->redirectToRoute($result['_route'], $params); |
|
333 | 2 | } catch (\Exception $e) { |
|
334 | // マッチしない場合はログ出力してスキップ. |
||
335 | 2 | log_warning('URLの形式が不正です。'); |
|
336 | } |
||
337 | 2 | } |
|
338 | 2 | ||
339 | 2 | return $this->redirectToRoute('admin_order_edit', ['id' => $TargetOrder->getId()]); |
|
340 | } |
||
341 | 2 | ||
342 | break; |
||
343 | 2 | default: |
|
344 | break; |
||
345 | 2 | } |
|
346 | } |
||
347 | |||
348 | 2 | // 会員検索フォーム |
|
349 | 2 | $builder = $this->formFactory |
|
350 | 2 | ->createBuilder(SearchCustomerType::class); |
|
351 | 2 | ||
352 | 2 | $event = new EventArgs( |
|
353 | 2 | [ |
|
354 | 'builder' => $builder, |
||
355 | 'OriginOrder' => $OriginOrder, |
||
356 | 'TargetOrder' => $TargetOrder, |
||
357 | ], |
||
358 | 2 | $request |
|
359 | 2 | ); |
|
360 | 2 | $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_SEARCH_CUSTOMER_INITIALIZE, $event); |
|
361 | 2 | ||
362 | 2 | $searchCustomerModalForm = $builder->getForm(); |
|
363 | 2 | ||
364 | // 商品検索フォーム |
||
365 | $builder = $this->formFactory |
||
366 | ->createBuilder(SearchProductType::class); |
||
367 | |||
368 | $event = new EventArgs( |
||
369 | [ |
||
370 | 'builder' => $builder, |
||
371 | 'OriginOrder' => $OriginOrder, |
||
372 | 'TargetOrder' => $TargetOrder, |
||
373 | ], |
||
374 | $request |
||
375 | ); |
||
376 | $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_SEARCH_PRODUCT_INITIALIZE, $event); |
||
377 | |||
378 | $searchProductModalForm = $builder->getForm(); |
||
379 | 1 | ||
380 | // 配送業者のお届け時間 |
||
381 | 1 | $times = []; |
|
382 | 1 | $deliveries = $this->deliveryRepository->findAll(); |
|
383 | 1 | View Code Duplication | foreach ($deliveries as $Delivery) { |
384 | 1 | $deliveryTimes = $Delivery->getDeliveryTimes(); |
|
385 | foreach ($deliveryTimes as $DeliveryTime) { |
||
386 | 1 | $times[$Delivery->getId()][$DeliveryTime->getId()] = $DeliveryTime->getDeliveryTime(); |
|
387 | 1 | } |
|
388 | } |
||
389 | |||
390 | 1 | return [ |
|
391 | 'form' => $form->createView(), |
||
392 | 1 | 'searchCustomerModalForm' => $searchCustomerModalForm->createView(), |
|
393 | 'searchProductModalForm' => $searchProductModalForm->createView(), |
||
394 | 'Order' => $TargetOrder, |
||
395 | 'id' => $id, |
||
396 | 1 | 'shippingDeliveryTimes' => $this->serializer->serialize($times, 'json'), |
|
397 | 1 | ]; |
|
398 | } |
||
399 | |||
400 | /** |
||
401 | * 顧客情報を検索する. |
||
402 | * |
||
403 | * @Route("/%eccube_admin_route%/order/search/customer/html", name="admin_order_search_customer_html") |
||
404 | * @Route("/%eccube_admin_route%/order/search/customer/html/page/{page_no}", requirements={"page_No" = "\d+"}, name="admin_order_search_customer_html_page") |
||
405 | * @Template("@admin/Order/search_customer.twig") |
||
406 | * |
||
407 | 1 | * @param Request $request |
|
408 | * @param integer $page_no |
||
409 | 1 | * |
|
410 | * @return \Symfony\Component\HttpFoundation\JsonResponse |
||
411 | 1 | */ |
|
412 | 1 | public function searchCustomerHtml(Request $request, $page_no = null, Paginator $paginator) |
|
413 | { |
||
414 | 1 | if ($request->isXmlHttpRequest() && $this->isTokenValid()) { |
|
415 | log_debug('search customer start.'); |
||
416 | 1 | $page_count = $this->eccubeConfig['eccube_default_page_count']; |
|
417 | $session = $this->session; |
||
418 | |||
419 | 1 | if ('POST' === $request->getMethod()) { |
|
420 | 1 | $page_no = 1; |
|
421 | 1 | ||
422 | 1 | $searchData = [ |
|
423 | 1 | 'multi' => $request->get('search_word'), |
|
424 | 'customer_status' => [ |
||
425 | CustomerStatus::REGULAR, |
||
426 | ], |
||
427 | 1 | ]; |
|
428 | |||
429 | 1 | $session->set('eccube.admin.order.customer.search', $searchData); |
|
430 | $session->set('eccube.admin.order.customer.search.page_no', $page_no); |
||
431 | } else { |
||
432 | $searchData = (array) $session->get('eccube.admin.order.customer.search'); |
||
433 | 1 | if (is_null($page_no)) { |
|
434 | 1 | $page_no = intval($session->get('eccube.admin.order.customer.search.page_no')); |
|
435 | 1 | } else { |
|
436 | 1 | $session->set('eccube.admin.order.customer.search.page_no', $page_no); |
|
437 | 1 | } |
|
438 | 1 | } |
|
439 | 1 | ||
440 | 1 | $qb = $this->customerRepository->getQueryBuilderBySearchData($searchData); |
|
441 | 1 | ||
442 | 1 | $event = new EventArgs( |
|
443 | [ |
||
444 | 'qb' => $qb, |
||
445 | 'data' => $searchData, |
||
446 | 1 | ], |
|
447 | $request |
||
448 | 1 | ); |
|
449 | 1 | $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_SEARCH_CUSTOMER_SEARCH, $event); |
|
450 | |||
451 | 1 | /** @var \Knp\Component\Pager\Pagination\SlidingPagination $pagination */ |
|
452 | $pagination = $paginator->paginate( |
||
453 | 1 | $qb, |
|
454 | 1 | $page_no, |
|
455 | $page_count, |
||
456 | ['wrap-queries' => true] |
||
457 | 1 | ); |
|
458 | 1 | ||
459 | /** @var $Customers \Eccube\Entity\Customer[] */ |
||
460 | $Customers = $pagination->getItems(); |
||
461 | |||
462 | if (empty($Customers)) { |
||
463 | log_debug('search customer not found.'); |
||
464 | } |
||
465 | |||
466 | $data = []; |
||
467 | $formatName = '%s%s(%s%s)'; |
||
468 | foreach ($Customers as $Customer) { |
||
469 | $data[] = [ |
||
470 | 'id' => $Customer->getId(), |
||
471 | 'name' => sprintf($formatName, $Customer->getName01(), $Customer->getName02(), |
||
472 | $Customer->getKana01(), |
||
473 | 1 | $Customer->getKana02()), |
|
474 | 'phone_number' => $Customer->getPhoneNumber(), |
||
475 | 1 | 'email' => $Customer->getEmail(), |
|
476 | 1 | ]; |
|
477 | } |
||
478 | |||
479 | 1 | $event = new EventArgs( |
|
480 | 1 | [ |
|
481 | 'data' => $data, |
||
482 | 1 | 'Customers' => $pagination, |
|
483 | ], |
||
484 | 1 | $request |
|
485 | ); |
||
486 | 1 | $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_SEARCH_CUSTOMER_COMPLETE, $event); |
|
487 | $data = $event->getArgument('data'); |
||
488 | 1 | ||
489 | return [ |
||
490 | 1 | 'data' => $data, |
|
491 | 'pagination' => $pagination, |
||
492 | ]; |
||
493 | } |
||
494 | } |
||
495 | |||
496 | 1 | /** |
|
497 | * 顧客情報を検索する. |
||
498 | * |
||
499 | 1 | * @Route("/%eccube_admin_route%/order/search/customer/id", name="admin_order_search_customer_by_id", methods={"POST"}) |
|
500 | 1 | * |
|
501 | 1 | * @param Request $request |
|
502 | 1 | * |
|
503 | 1 | * @return \Symfony\Component\HttpFoundation\JsonResponse |
|
504 | 1 | */ |
|
505 | 1 | public function searchCustomerById(Request $request) |
|
506 | 1 | { |
|
507 | 1 | if ($request->isXmlHttpRequest() && $this->isTokenValid()) { |
|
508 | 1 | log_debug('search customer by id start.'); |
|
509 | 1 | ||
510 | 1 | /** @var $Customer \Eccube\Entity\Customer */ |
|
511 | $Customer = $this->customerRepository |
||
512 | ->find($request->get('id')); |
||
513 | 1 | ||
514 | $event = new EventArgs( |
||
515 | 1 | [ |
|
516 | 1 | 'Customer' => $Customer, |
|
517 | ], |
||
518 | 1 | $request |
|
519 | ); |
||
520 | 1 | $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_SEARCH_CUSTOMER_BY_ID_INITIALIZE, $event); |
|
521 | 1 | ||
522 | if (is_null($Customer)) { |
||
523 | 1 | log_debug('search customer by id not found.'); |
|
524 | |||
525 | return $this->json([], 404); |
||
526 | } |
||
527 | |||
528 | log_debug('search customer by id found.'); |
||
529 | |||
530 | $data = [ |
||
531 | 'id' => $Customer->getId(), |
||
532 | 1 | 'name01' => $Customer->getName01(), |
|
533 | 'name02' => $Customer->getName02(), |
||
534 | 1 | 'kana01' => $Customer->getKana01(), |
|
535 | 1 | 'kana02' => $Customer->getKana02(), |
|
536 | 1 | 'postal_code' => $Customer->getPostalCode(), |
|
537 | 1 | 'pref' => is_null($Customer->getPref()) ? null : $Customer->getPref()->getId(), |
|
538 | 'addr01' => $Customer->getAddr01(), |
||
539 | 1 | 'addr02' => $Customer->getAddr02(), |
|
540 | 1 | 'email' => $Customer->getEmail(), |
|
541 | 'phone_number' => $Customer->getPhoneNumber(), |
||
542 | 'company_name' => $Customer->getCompanyName(), |
||
543 | 1 | ]; |
|
544 | |||
545 | $event = new EventArgs( |
||
546 | 1 | [ |
|
547 | 'data' => $data, |
||
548 | 'Customer' => $Customer, |
||
549 | ], |
||
550 | $request |
||
551 | 1 | ); |
|
552 | 1 | $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_SEARCH_CUSTOMER_BY_ID_COMPLETE, $event); |
|
553 | $data = $event->getArgument('data'); |
||
554 | |||
555 | return $this->json($data); |
||
556 | } |
||
557 | } |
||
558 | |||
559 | /** |
||
560 | * @Route("/%eccube_admin_route%/order/search/product", name="admin_order_search_product") |
||
561 | * @Route("/%eccube_admin_route%/order/search/product/page/{page_no}", requirements={"page_no" = "\d+"}, name="admin_order_search_product_page") |
||
562 | 1 | * @Template("@admin/Order/search_product.twig") |
|
563 | 1 | */ |
|
564 | public function searchProduct(Request $request, $page_no = null, Paginator $paginator) |
||
565 | 1 | { |
|
566 | if ($request->isXmlHttpRequest() && $this->isTokenValid()) { |
||
567 | 1 | log_debug('search product start.'); |
|
568 | 1 | $page_count = $this->eccubeConfig['eccube_default_page_count']; |
|
569 | $session = $this->session; |
||
570 | 1 | ||
571 | if ('POST' === $request->getMethod()) { |
||
572 | 1 | $page_no = 1; |
|
573 | |||
574 | $searchData = [ |
||
575 | 1 | 'id' => $request->get('id'), |
|
576 | 1 | ]; |
|
577 | 1 | ||
578 | 1 | if ($categoryId = $request->get('category_id')) { |
|
579 | 1 | $Category = $this->categoryRepository->find($categoryId); |
|
580 | $searchData['category_id'] = $Category; |
||
581 | } |
||
582 | |||
583 | 1 | $session->set('eccube.admin.order.product.search', $searchData); |
|
584 | $session->set('eccube.admin.order.product.search.page_no', $page_no); |
||
585 | 1 | } else { |
|
586 | $searchData = (array) $session->get('eccube.admin.order.product.search'); |
||
587 | if (is_null($page_no)) { |
||
588 | $page_no = intval($session->get('eccube.admin.order.product.search.page_no')); |
||
589 | 1 | } else { |
|
590 | 1 | $session->set('eccube.admin.order.product.search.page_no', $page_no); |
|
591 | } |
||
592 | 1 | } |
|
593 | 1 | ||
594 | $qb = $this->productRepository |
||
595 | 1 | ->getQueryBuilderBySearchDataForAdmin($searchData); |
|
596 | 1 | ||
597 | $event = new EventArgs( |
||
598 | [ |
||
599 | 1 | 'qb' => $qb, |
|
600 | 'searchData' => $searchData, |
||
601 | 1 | ], |
|
602 | 1 | $request |
|
603 | 1 | ); |
|
604 | $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_SEARCH_PRODUCT_SEARCH, $event); |
||
605 | 1 | ||
606 | /** @var \Knp\Component\Pager\Pagination\SlidingPagination $pagination */ |
||
607 | 1 | $pagination = $paginator->paginate( |
|
608 | $qb, |
||
609 | $page_no, |
||
610 | 1 | $page_count, |
|
611 | 1 | ['wrap-queries' => true] |
|
612 | 1 | ); |
|
613 | |||
614 | /** @var $Products \Eccube\Entity\Product[] */ |
||
615 | $Products = $pagination->getItems(); |
||
616 | |||
617 | if (empty($Products)) { |
||
618 | log_debug('search product not found.'); |
||
619 | } |
||
620 | |||
621 | $forms = []; |
||
622 | View Code Duplication | foreach ($Products as $Product) { |
|
623 | /* @var $builder \Symfony\Component\Form\FormBuilderInterface */ |
||
624 | $builder = $this->formFactory->createNamedBuilder('', AddCartType::class, null, [ |
||
625 | 'product' => $this->productRepository->findWithSortedClassCategories($Product->getId()), |
||
626 | ]); |
||
627 | $addCartForm = $builder->getForm(); |
||
628 | $forms[$Product->getId()] = $addCartForm->createView(); |
||
629 | } |
||
630 | |||
631 | $event = new EventArgs( |
||
632 | [ |
||
633 | 'forms' => $forms, |
||
634 | 'Products' => $Products, |
||
635 | 'pagination' => $pagination, |
||
636 | ], |
||
637 | $request |
||
638 | ); |
||
639 | $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_SEARCH_PRODUCT_COMPLETE, $event); |
||
640 | |||
641 | return [ |
||
642 | 'forms' => $forms, |
||
643 | 'Products' => $Products, |
||
644 | 'pagination' => $pagination, |
||
645 | ]; |
||
646 | } |
||
647 | } |
||
648 | |||
649 | /** |
||
650 | * その他明細情報を取得 |
||
651 | * |
||
652 | * @Route("/%eccube_admin_route%/order/search/order_item_type", name="admin_order_search_order_item_type") |
||
653 | * @Template("@admin/Order/order_item_type.twig") |
||
654 | * |
||
655 | * @param Request $request |
||
656 | * |
||
657 | * @return array |
||
658 | */ |
||
659 | public function searchOrderItemType(Request $request) |
||
660 | { |
||
661 | if ($request->isXmlHttpRequest() && $this->isTokenValid()) { |
||
662 | log_debug('search order item type start.'); |
||
663 | |||
664 | $criteria = Criteria::create(); |
||
665 | $criteria |
||
666 | ->where($criteria->expr()->andX( |
||
667 | $criteria->expr()->neq('id', OrderItemType::PRODUCT), |
||
668 | $criteria->expr()->neq('id', OrderItemType::TAX), |
||
669 | $criteria->expr()->neq('id', OrderItemType::POINT) |
||
670 | )) |
||
671 | ->orderBy(['sort_no' => 'ASC']); |
||
672 | |||
673 | $OrderItemTypes = $this->orderItemTypeRepository->matching($criteria); |
||
674 | |||
675 | $forms = []; |
||
676 | foreach ($OrderItemTypes as $OrderItemType) { |
||
677 | /* @var $builder \Symfony\Component\Form\FormBuilderInterface */ |
||
678 | $builder = $this->formFactory->createBuilder(); |
||
679 | $form = $builder->getForm(); |
||
680 | $forms[$OrderItemType->getId()] = $form->createView(); |
||
681 | } |
||
682 | |||
683 | return [ |
||
684 | 'forms' => $forms, |
||
685 | 'OrderItemTypes' => $OrderItemTypes, |
||
686 | ]; |
||
687 | } |
||
688 | } |
||
689 | } |
||
690 |
If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:
If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.