Completed
Push — 4.0 ( b48f64...137622 )
by chihiro
20:21 queued 10s
created

EditController::searchCustomerHtml()   B

Complexity

Conditions 7
Paths 13

Size

Total Lines 83

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 38
CRAP Score 7.0192

Importance

Changes 0
Metric Value
cc 7
nc 13
nop 3
dl 0
loc 83
ccs 38
cts 41
cp 0.9268
crap 7.0192
rs 7.4375
c 0
b 0
f 0

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

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;
0 ignored issues
show
Documentation Bug introduced by
$serializer is of type object<Symfony\Component...er\SerializerInterface>, but the property $serializer was declared to be of type object<Symfony\Component\Serializer\Serializer>. Are you sure that you always receive this specific sub-class here, or does it make sense to add an instanceof check?

Our type inference engine has found a suspicous assignment of a value to a property. This check raises an issue when a value that can be of a given class or a super-class is assigned to a property that is type hinted more strictly.

Either this assignment is in error or an instanceof check should be added for that assignment.

class Alien {}

class Dalek extends Alien {}

class Plot
{
    /** @var  Dalek */
    public $villain;
}

$alien = new Alien();
$plot = new Plot();
if ($alien instanceof Dalek) {
    $plot->villain = $alien;
}
Loading history...
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;
0 ignored issues
show
Unused Code introduced by
$TargetOrder is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
186
        $OriginOrder = null;
0 ignored issues
show
Unused Code introduced by
$OriginOrder is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
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);
0 ignored issues
show
Unused Code introduced by
The call to EntityManagerInterface::flush() has too many arguments starting with $Customer.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
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
Bug introduced by
It seems like $returnLink defined by preg_replace($pattern, '', $returnLink) on line 324 can also be of type array<integer,string>; however, Symfony\Component\Routin...tcherInterface::match() does only seem to accept string, maybe add an additional type check?

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:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
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