Failed Conditions
Push — experimental/sf ( 9203ff...c27721 )
by chihiro
191:44 queued 183:19
created

EditController   D

Complexity

Total Complexity 57

Size/Duplication

Total Lines 738
Duplicated Lines 4.61 %

Coupling/Cohesion

Components 1
Dependencies 30

Test Coverage

Coverage 66.67%

Importance

Changes 0
Metric Value
dl 34
loc 738
ccs 216
cts 324
cp 0.6667
rs 4.902
c 0
b 0
f 0
wmc 57
lcom 1
cbo 30

9 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 25 1
F index() 6 206 21
A searchCustomer() 10 53 4
B searchCustomerHtml() 10 83 6
A searchCustomerById() 0 53 4
B searchProduct() 8 84 7
A searchOrderItemType() 0 29 3
A newOrder() 0 13 1
B updateDate() 0 40 10

How to fix   Duplicated Code    Complexity   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

Complex Class

 Tip:   Before tackling complexity, make sure that you eliminate any duplication first. This often can reduce the size of classes significantly.

Complex classes like EditController often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use EditController, and based on these observations, apply Extract Interface, too.

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\Customer;
20
use Eccube\Entity\Master\CustomerStatus;
21
use Eccube\Entity\Master\DeviceType;
22
use Eccube\Entity\Master\OrderItemType;
23
use Eccube\Entity\Master\OrderStatus;
24
use Eccube\Entity\Order;
25
use Eccube\Entity\Shipping;
26
use Eccube\Event\EccubeEvents;
27
use Eccube\Event\EventArgs;
28
use Eccube\Form\Type\AddCartType;
29
use Eccube\Form\Type\Admin\OrderType;
30
use Eccube\Form\Type\Admin\SearchCustomerType;
31
use Eccube\Form\Type\Admin\SearchProductType;
32
use Eccube\Repository\CategoryRepository;
33
use Eccube\Repository\CustomerRepository;
34
use Eccube\Repository\DeliveryRepository;
35
use Eccube\Repository\Master\DeviceTypeRepository;
36
use Eccube\Repository\Master\OrderItemTypeRepository;
37
use Eccube\Repository\OrderRepository;
38
use Eccube\Repository\ProductRepository;
39
use Eccube\Service\PurchaseFlow\Processor\OrderNoProcessor;
40
use Eccube\Service\PurchaseFlow\PurchaseContext;
41
use Eccube\Service\PurchaseFlow\PurchaseException;
42
use Eccube\Service\PurchaseFlow\PurchaseFlow;
43
use Eccube\Service\TaxRuleService;
44
use Knp\Component\Pager\Paginator;
45
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
46
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
47
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
48
use Symfony\Component\HttpFoundation\Request;
49
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
50
use Symfony\Component\Serializer\Serializer;
51
use Symfony\Component\Serializer\SerializerInterface;
52
53
class EditController extends AbstractController
0 ignored issues
show
introduced by
Missing class doc comment
Loading history...
54
{
55
    /**
56
     * @var TaxRuleService
57
     */
58
    protected $taxRuleService;
59
60
    /**
61
     * @var DeviceTypeRepository
62
     */
63
    protected $deviceTypeRepository;
64
65
    /**
66
     * @var ProductRepository
67
     */
68
    protected $productRepository;
69
70
    /**
71
     * @var CategoryRepository
72
     */
73
    protected $categoryRepository;
74
75
    /**
76
     * @var CustomerRepository
77
     */
78
    protected $customerRepository;
79
80
    /**
81
     * @var Serializer
82
     */
83
    protected $serializer;
84
85
    /**
86
     * @var DeliveryRepository
87
     */
88
    protected $deliveryRepository;
89
90
    /**
91
     * @var PurchaseFlow
92
     */
93
    protected $purchaseFlow;
94
95
    /**
96
     * @var OrderRepository
97
     */
98
    protected $orderRepository;
99
100
    /**
101
     * @var OrderNoProcessor
102
     */
103
    protected $orderNoProcessor;
104
105
    /**
106
     * @var OrderItemTypeRepository
107
     */
108
    protected $orderItemTypeRepository;
109
110
    /**
0 ignored issues
show
introduced by
Doc comment for parameter "$orderItemTypeRepository" missing
Loading history...
111
     * EditController constructor.
112
     *
113
     * @param TaxRuleService $taxRuleService
0 ignored issues
show
introduced by
Expected 7 spaces after parameter type; 1 found
Loading history...
114
     * @param DeviceTypeRepository $deviceTypeRepository
115
     * @param ProductRepository $productRepository
0 ignored issues
show
introduced by
Expected 4 spaces after parameter type; 1 found
Loading history...
116
     * @param CategoryRepository $categoryRepository
0 ignored issues
show
introduced by
Expected 3 spaces after parameter type; 1 found
Loading history...
117
     * @param CustomerRepository $customerRepository
0 ignored issues
show
introduced by
Expected 3 spaces after parameter type; 1 found
Loading history...
118
     * @param SerializerInterface $serializer
0 ignored issues
show
introduced by
Expected 2 spaces after parameter type; 1 found
Loading history...
119
     * @param DeliveryRepository $deliveryRepository
0 ignored issues
show
introduced by
Expected 3 spaces after parameter type; 1 found
Loading history...
120
     * @param PurchaseFlow $orderPurchaseFlow
0 ignored issues
show
introduced by
Expected 9 spaces after parameter type; 1 found
Loading history...
121
     * @param OrderRepository $orderRepository
0 ignored issues
show
introduced by
Expected 6 spaces after parameter type; 1 found
Loading history...
122
     * @param OrderNoProcessor $orderNoProcessor
0 ignored issues
show
introduced by
Expected 5 spaces after parameter type; 1 found
Loading history...
123
     */
124 11
    public function __construct(
125
        TaxRuleService $taxRuleService,
126
        DeviceTypeRepository $deviceTypeRepository,
127
        ProductRepository $productRepository,
128
        CategoryRepository $categoryRepository,
129
        CustomerRepository $customerRepository,
130
        SerializerInterface $serializer,
131
        DeliveryRepository $deliveryRepository,
132
        PurchaseFlow $orderPurchaseFlow,
133
        OrderRepository $orderRepository,
134
        OrderNoProcessor $orderNoProcessor,
135
        OrderItemTypeRepository $orderItemTypeRepository
136
    ) {
137 11
        $this->taxRuleService = $taxRuleService;
138 11
        $this->deviceTypeRepository = $deviceTypeRepository;
139 11
        $this->productRepository = $productRepository;
140 11
        $this->categoryRepository = $categoryRepository;
141 11
        $this->customerRepository = $customerRepository;
142 11
        $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...
143 11
        $this->deliveryRepository = $deliveryRepository;
144 11
        $this->purchaseFlow = $orderPurchaseFlow;
145 11
        $this->orderRepository = $orderRepository;
146 11
        $this->orderNoProcessor = $orderNoProcessor;
147 11
        $this->orderItemTypeRepository = $orderItemTypeRepository;
148
    }
149
150
    /**
0 ignored issues
show
introduced by
Doc comment for parameter "$request" missing
Loading history...
introduced by
Doc comment for parameter "$id" missing
Loading history...
151
     * 受注登録/編集画面.
152
     *
153
     * @Route("/%eccube_admin_route%/order/new", name="admin_order_new")
154
     * @Route("/%eccube_admin_route%/order/{id}/edit", requirements={"id" = "\d+"}, name="admin_order_edit")
155
     * @Template("@admin/Order/edit.twig")
156
     */
0 ignored issues
show
introduced by
Missing @return tag in function comment
Loading history...
157 7
    public function index(Request $request, $id = null)
158
    {
159 7
        $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...
160 7
        $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...
161 7
        $isNewOrder = false;
162
163 7
        if (is_null($id)) {
164
            // 空のエンティティを作成.
165 3
            $TargetOrder = $this->newOrder();
166 3
            $isNewOrder = true;
167
        } else {
168 4
            $TargetOrder = $this->orderRepository->find($id);
169 4
            if (is_null($TargetOrder)) {
170
                throw new NotFoundHttpException();
171
            }
172
        }
173
174
        // 編集前の受注情報を保持
175 7
        $OriginOrder = clone $TargetOrder;
176 7
        $OriginItems = new ArrayCollection();
177 7
        foreach ($TargetOrder->getOrderItems() as $Item) {
178 4
            $OriginItems->add($Item);
179
        }
180
181 7
        $builder = $this->formFactory
182 7
            ->createBuilder(OrderType::class, $TargetOrder,
183
                [
184 7
                    'SortedItems' => $TargetOrder->getItems(),
185
                ]
186
            );
187
188
        // 複数配送の場合は配送先の編集ができない
189 7
        if ($TargetOrder->isMultiple()) {
190
            $builder->remove('Shipping');
191
        }
192
193 7
        $event = new EventArgs(
194
            [
195 7
                'builder' => $builder,
196 7
                'OriginOrder' => $OriginOrder,
197 7
                'TargetOrder' => $TargetOrder,
198
            ],
199 7
            $request
200
        );
201 7
        $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_INDEX_INITIALIZE, $event);
202
203 7
        $form = $builder->getForm();
204
205
        // 単数配送の場合は配送先の編集ができる
206 7
        if ($TargetOrder->isMultiple() == false) {
207 7
            $form['Shipping']->setData($TargetOrder->getShippings()[0]);
208
        }
209
210 7
        $form->handleRequest($request);
211 7
        $purchaseContext = new PurchaseContext($OriginOrder, $OriginOrder->getCustomer());
212
213 7
        if ($form->isSubmitted()) {
214 5
            $event = new EventArgs(
215
                [
216 5
                    'builder' => $builder,
217 5
                    'OriginOrder' => $OriginOrder,
218 5
                    'TargetOrder' => $TargetOrder,
219 5
                    'PurchaseContext' => $purchaseContext,
220
                ],
221 5
                $request
222
            );
223 5
            $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_INDEX_PROGRESS, $event);
224
225 5
            $flowResult = $this->purchaseFlow->validate($TargetOrder, $purchaseContext);
226 5
            if ($flowResult->hasWarning()) {
227 2
                foreach ($flowResult->getWarning() as $warning) {
228
                    // TODO Warning の場合の処理
229 2
                    $this->addWarning($warning->getMessage(), 'admin');
230
                }
231
            }
232
233 5
            if ($flowResult->hasError()) {
234
                foreach ($flowResult->getErrors() as $error) {
235
                    $this->addError($error->getMessage(), 'admin');
236
                }
237
            }
238
239
            // 登録ボタン押下
240 5
            switch ($request->get('mode')) {
241
                case 'register':
242 5
                    log_info('受注登録開始', [$TargetOrder->getId()]);
243
244 5
                    if ($flowResult->hasError() === false && $form->isValid()) {
245
                        try {
246 5
                            $this->purchaseFlow->prepare($TargetOrder, $purchaseContext);
247 5
                            $this->purchaseFlow->commit($TargetOrder, $purchaseContext);
248
                        } catch (PurchaseException $e) {
249
                            $this->addError($e->getMessage(), 'admin');
250
                            break;
251
                        }
252
253 5
                        $this->entityManager->persist($TargetOrder);
254 5
                        $this->entityManager->flush();
255
256 5
                        foreach ($OriginItems as $Item) {
257 3
                            if ($TargetOrder->getOrderItems()->contains($Item) === false) {
258 3
                                $this->entityManager->remove($Item);
259
                            }
260
                        }
261 5
                        $this->entityManager->flush();
262
263
                        // 新規登録時はMySQL対応のためflushしてから採番
264 5
                        $this->orderNoProcessor->process($TargetOrder, $purchaseContext);
265 5
                        $this->entityManager->flush();
266
267 5
                        $Customer = $TargetOrder->getCustomer();
268 5
                        if ($Customer) {
269
                            // 会員の場合、購入回数、購入金額などを更新
270 5
                            $this->customerRepository->updateBuyData($Customer, $isNewOrder);
271
                        }
272
273 5
                        $event = new EventArgs(
274
                            [
275 5
                                'form' => $form,
276 5
                                'OriginOrder' => $OriginOrder,
277 5
                                'TargetOrder' => $TargetOrder,
278 5
                                'Customer' => $Customer,
279
                            ],
280 5
                            $request
281
                        );
282 5
                        $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_INDEX_COMPLETE, $event);
283
284 5
                        $this->addSuccess('admin.order.save.complete', 'admin');
285
286 5
                        log_info('受注登録完了', [$TargetOrder->getId()]);
287
288 5
                        return $this->redirectToRoute('admin_order_edit', ['id' => $TargetOrder->getId()]);
289
                    }
290
291
                    break;
292
293
                case 'add_delivery':
294
                    // お届け先情報の新規追加
295
296
                    $form = $builder->getForm();
297
298
                    $Shipping = new Shipping();
299
                    $TargetOrder->addShipping($Shipping);
300
301
                    $Shipping->setOrder($TargetOrder);
302
303
                    $form->setData($TargetOrder);
304
305
                    break;
306
307
                default:
308
                    break;
309
            }
310
        }
311
312
        // 会員検索フォーム
313 2
        $builder = $this->formFactory
314 2
            ->createBuilder(SearchCustomerType::class);
315
316 2
        $event = new EventArgs(
317
            [
318 2
                'builder' => $builder,
319 2
                'OriginOrder' => $OriginOrder,
320 2
                'TargetOrder' => $TargetOrder,
321
            ],
322 2
            $request
323
        );
324 2
        $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_SEARCH_CUSTOMER_INITIALIZE, $event);
325
326 2
        $searchCustomerModalForm = $builder->getForm();
327
328
        // 商品検索フォーム
329 2
        $builder = $this->formFactory
330 2
            ->createBuilder(SearchProductType::class);
331
332 2
        $event = new EventArgs(
333
            [
334 2
                'builder' => $builder,
335 2
                'OriginOrder' => $OriginOrder,
336 2
                'TargetOrder' => $TargetOrder,
337
            ],
338 2
            $request
339
        );
340 2
        $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_SEARCH_PRODUCT_INITIALIZE, $event);
341
342 2
        $searchProductModalForm = $builder->getForm();
343
344
        // 配送業者のお届け時間
345 2
        $times = [];
346 2
        $deliveries = $this->deliveryRepository->findAll();
347 2 View Code Duplication
        foreach ($deliveries as $Delivery) {
348 2
            $deliveryTiems = $Delivery->getDeliveryTimes();
349 2
            foreach ($deliveryTiems as $DeliveryTime) {
350 2
                $times[$Delivery->getId()][$DeliveryTime->getId()] = $DeliveryTime->getDeliveryTime();
351
            }
352
        }
353
354
        return [
355 2
            'form' => $form->createView(),
356 2
            'searchCustomerModalForm' => $searchCustomerModalForm->createView(),
357 2
            'searchProductModalForm' => $searchProductModalForm->createView(),
358 2
            'Order' => $TargetOrder,
359 2
            'id' => $id,
360 2
            'shippingDeliveryTimes' => $this->serializer->serialize($times, 'json'),
361
        ];
362
    }
363
364
    /**
365
     * 顧客情報を検索する.
366
     *
367
     * @Route("/%eccube_admin_route%/order/search/customer", name="admin_order_search_customer")
368
     *
369
     * @param Request $request
370
     *
371
     * @return \Symfony\Component\HttpFoundation\JsonResponse
372
     */
373 2
    public function searchCustomer(Request $request)
374
    {
375 2
        if ($request->isXmlHttpRequest()) {
376 2
            log_debug('search customer start.');
377
378
            $searchData = [
379 2
                'multi' => $request->get('search_word'),
380
            ];
381
382 2
            $qb = $this->customerRepository->getQueryBuilderBySearchData($searchData);
383
384 2
            $event = new EventArgs(
385
                [
386 2
                    'qb' => $qb,
387 2
                    'data' => $searchData,
388
                ],
389 2
                $request
390
            );
391 2
            $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_SEARCH_CUSTOMER_SEARCH, $event);
392
393
            /** @var Customer[] $Customers */
394 2
            $Customers = $qb->getQuery()->getResult();
395
396 2
            if (empty($Customers)) {
397
                log_debug('search customer not found.');
398
            }
399
400 2
            $data = [];
401 2
            $formatName = '%s%s(%s%s)';
402 2 View Code Duplication
            foreach ($Customers as $Customer) {
403 2
                $data[] = [
404 2
                    'id' => $Customer->getId(),
405 2
                    'name' => sprintf($formatName, $Customer->getName01(), $Customer->getName02(),
406 2
                        $Customer->getKana01(),
407 2
                        $Customer->getKana02()),
408 2
                    'phone_number' => $Customer->getPhoneNumber(),
409 2
                    'email' => $Customer->getEmail(),
410
                ];
411
            }
412
413 2
            $event = new EventArgs(
414
                [
415 2
                    'data' => $data,
416 2
                    'Customers' => $Customers,
417
                ],
418 2
                $request
419
            );
420 2
            $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_SEARCH_CUSTOMER_COMPLETE, $event);
421 2
            $data = $event->getArgument('data');
422
423 2
            return $this->json($data);
424
        }
425
    }
426
427
    /**
0 ignored issues
show
introduced by
Doc comment for parameter "$paginator" missing
Loading history...
428
     * 顧客情報を検索する.
429
     *
430
     * @Route("/%eccube_admin_route%/order/search/customer/html", name="admin_order_search_customer_html")
431
     * @Route("/%eccube_admin_route%/order/search/customer/html/page/{page_no}", requirements={"page_No" = "\d+"}, name="admin_order_search_customer_html_page")
432
     * @Template("@admin/Order/search_customer.twig")
433
     *
434
     * @param Request $request
435
     * @param integer $page_no
436
     *
437
     * @return \Symfony\Component\HttpFoundation\JsonResponse
438
     */
439
    public function searchCustomerHtml(Request $request, $page_no = null, Paginator $paginator)
0 ignored issues
show
Coding Style introduced by
Parameters which have default values should be placed at the end.

If you place a parameter with a default value before a parameter with a default value, the default value of the first parameter will never be used as it will always need to be passed anyway:

// $a must always be passed; it's default value is never used.
function someFunction($a = 5, $b) { }
Loading history...
440
    {
441
        if ($request->isXmlHttpRequest()) {
442
            log_debug('search customer start.');
443
            $page_count = $this->eccubeConfig['eccube_default_page_count'];
444
            $session = $this->session;
445
446
            if ('POST' === $request->getMethod()) {
447
                $page_no = 1;
448
449
                $searchData = [
450
                    'multi' => $request->get('search_word'),
451
                    'customer_status' => [
452
                        CustomerStatus::REGULAR,
453
                    ],
454
                ];
455
456
                $session->set('eccube.admin.order.customer.search', $searchData);
457
                $session->set('eccube.admin.order.customer.search.page_no', $page_no);
458
            } else {
459
                $searchData = (array) $session->get('eccube.admin.order.customer.search');
460
                if (is_null($page_no)) {
461
                    $page_no = intval($session->get('eccube.admin.order.customer.search.page_no'));
462
                } else {
463
                    $session->set('eccube.admin.order.customer.search.page_no', $page_no);
464
                }
465
            }
466
467
            $qb = $this->customerRepository->getQueryBuilderBySearchData($searchData);
468
469
            $event = new EventArgs(
470
                [
471
                    'qb' => $qb,
472
                    'data' => $searchData,
473
                ],
474
                $request
475
            );
476
            $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_SEARCH_CUSTOMER_SEARCH, $event);
477
478
            /** @var \Knp\Component\Pager\Pagination\SlidingPagination $pagination */
479
            $pagination = $paginator->paginate(
480
                $qb,
481
                $page_no,
482
                $page_count,
483
                ['wrap-queries' => true]
484
            );
485
486
            /** @var $Customers \Eccube\Entity\Customer[] */
487
            $Customers = $pagination->getItems();
488
489
            if (empty($Customers)) {
490
                log_debug('search customer not found.');
491
            }
492
493
            $data = [];
494
            $formatName = '%s%s(%s%s)';
495 View Code Duplication
            foreach ($Customers as $Customer) {
496
                $data[] = [
497
                    'id' => $Customer->getId(),
498
                    'name' => sprintf($formatName, $Customer->getName01(), $Customer->getName02(),
499
                        $Customer->getKana01(),
500
                        $Customer->getKana02()),
501
                    'phone_number' => $Customer->getPhoneNumber(),
502
                    'email' => $Customer->getEmail(),
503
                ];
504
            }
505
506
            $event = new EventArgs(
507
                [
508
                    'data' => $data,
509
                    'Customers' => $pagination,
510
                ],
511
                $request
512
            );
513
            $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_SEARCH_CUSTOMER_COMPLETE, $event);
514
            $data = $event->getArgument('data');
515
516
            return [
517
                'data' => $data,
518
                'pagination' => $pagination,
519
            ];
520
        }
521
    }
522
523
    /**
524
     * 顧客情報を検索する.
525
     *
526
     * @Method("POST")
527
     * @Route("/%eccube_admin_route%/order/search/customer/id", name="admin_order_search_customer_by_id")
528
     *
529
     * @param Request $request
530
     *
531
     * @return \Symfony\Component\HttpFoundation\JsonResponse
532
     */
533 1
    public function searchCustomerById(Request $request)
534
    {
535 1
        if ($request->isXmlHttpRequest()) {
536 1
            log_debug('search customer by id start.');
537
538
            /** @var $Customer \Eccube\Entity\Customer */
539 1
            $Customer = $this->customerRepository
540 1
                ->find($request->get('id'));
541
542 1
            $event = new EventArgs(
543
                [
544 1
                    'Customer' => $Customer,
545
                ],
546 1
                $request
547
            );
548 1
            $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_SEARCH_CUSTOMER_BY_ID_INITIALIZE, $event);
549
550 1
            if (is_null($Customer)) {
551
                log_debug('search customer by id not found.');
552
553
                return $this->json([], 404);
554
            }
555
556 1
            log_debug('search customer by id found.');
557
558
            $data = [
559 1
                'id' => $Customer->getId(),
560 1
                'name01' => $Customer->getName01(),
561 1
                'name02' => $Customer->getName02(),
562 1
                'kana01' => $Customer->getKana01(),
563 1
                'kana02' => $Customer->getKana02(),
564 1
                'postal_code' => $Customer->getPostalCode(),
565 1
                'pref' => is_null($Customer->getPref()) ? null : $Customer->getPref()->getId(),
566 1
                'addr01' => $Customer->getAddr01(),
567 1
                'addr02' => $Customer->getAddr02(),
568 1
                'email' => $Customer->getEmail(),
569 1
                'phone_number' => $Customer->getPhoneNumber(),
570 1
                'company_name' => $Customer->getCompanyName(),
571
            ];
572
573 1
            $event = new EventArgs(
574
                [
575 1
                    'data' => $data,
576 1
                    'Customer' => $Customer,
577
                ],
578 1
                $request
579
            );
580 1
            $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_SEARCH_CUSTOMER_BY_ID_COMPLETE, $event);
581 1
            $data = $event->getArgument('data');
582
583 1
            return $this->json($data);
584
        }
585
    }
586
587
    /**
0 ignored issues
show
introduced by
Doc comment for parameter "$request" missing
Loading history...
introduced by
Doc comment for parameter "$page_no" missing
Loading history...
introduced by
Doc comment for parameter "$paginator" missing
Loading history...
588
     * @Route("/%eccube_admin_route%/order/search/product", name="admin_order_search_product")
589
     * @Route("/%eccube_admin_route%/order/search/product/page/{page_no}", requirements={"page_no" = "\d+"}, name="admin_order_search_product_page")
590
     * @Template("@admin/Order/search_product.twig")
591
     */
0 ignored issues
show
introduced by
Missing @return tag in function comment
Loading history...
592 1
    public function searchProduct(Request $request, $page_no = null, Paginator $paginator)
0 ignored issues
show
Coding Style introduced by
Parameters which have default values should be placed at the end.

If you place a parameter with a default value before a parameter with a default value, the default value of the first parameter will never be used as it will always need to be passed anyway:

// $a must always be passed; it's default value is never used.
function someFunction($a = 5, $b) { }
Loading history...
593
    {
594 1
        if ($request->isXmlHttpRequest()) {
595 1
            log_debug('search product start.');
596 1
            $page_count = $this->eccubeConfig['eccube_default_page_count'];
597 1
            $session = $this->session;
598
599 1
            if ('POST' === $request->getMethod()) {
600 1
                $page_no = 1;
601
602
                $searchData = [
603 1
                    'id' => $request->get('id'),
604
                ];
605
606 1
                if ($categoryId = $request->get('category_id')) {
607
                    $Category = $this->categoryRepository->find($categoryId);
608
                    $searchData['category_id'] = $Category;
609
                }
610
611 1
                $session->set('eccube.admin.order.product.search', $searchData);
612 1
                $session->set('eccube.admin.order.product.search.page_no', $page_no);
613
            } else {
614
                $searchData = (array) $session->get('eccube.admin.order.product.search');
615
                if (is_null($page_no)) {
616
                    $page_no = intval($session->get('eccube.admin.order.product.search.page_no'));
617
                } else {
618
                    $session->set('eccube.admin.order.product.search.page_no', $page_no);
619
                }
620
            }
621
622 1
            $qb = $this->productRepository
623 1
                ->getQueryBuilderBySearchDataForAdmin($searchData);
624
625 1
            $event = new EventArgs(
626
                [
627 1
                    'qb' => $qb,
628 1
                    'searchData' => $searchData,
629
                ],
630 1
                $request
631
            );
632 1
            $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_SEARCH_PRODUCT_SEARCH, $event);
633
634
            /** @var \Knp\Component\Pager\Pagination\SlidingPagination $pagination */
635 1
            $pagination = $paginator->paginate(
636 1
                $qb,
637 1
                $page_no,
638 1
                $page_count,
639 1
                ['wrap-queries' => true]
640
            );
641
642
            /** @var $Products \Eccube\Entity\Product[] */
643 1
            $Products = $pagination->getItems();
644
645 1
            if (empty($Products)) {
646
                log_debug('search product not found.');
647
            }
648
649 1
            $forms = [];
650 1 View Code Duplication
            foreach ($Products as $Product) {
651
                /* @var $builder \Symfony\Component\Form\FormBuilderInterface */
652 1
                $builder = $this->formFactory->createNamedBuilder('', AddCartType::class, null, [
653 1
                    'product' => $Product,
654
                ]);
655 1
                $addCartForm = $builder->getForm();
656 1
                $forms[$Product->getId()] = $addCartForm->createView();
657
            }
658
659 1
            $event = new EventArgs(
660
                [
661 1
                    'forms' => $forms,
662 1
                    'Products' => $Products,
663 1
                    'pagination' => $pagination,
664
                ],
665 1
                $request
666
            );
667 1
            $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_SEARCH_PRODUCT_COMPLETE, $event);
668
669
            return [
670 1
                'forms' => $forms,
671 1
                'Products' => $Products,
672 1
                'pagination' => $pagination,
673
            ];
674
        }
675
    }
676
677
    /**
678
     * その他明細情報を取得
679
     *
680
     * @Route("/%eccube_admin_route%/order/search/order_item_type", name="admin_order_search_order_item_type")
681
     * @Template("@admin/Order/order_item_type.twig")
682
     *
683
     * @param Request $request
684
     *
685
     * @return array
686
     */
687
    public function searchOrderItemType(Request $request)
688
    {
689
        if ($request->isXmlHttpRequest()) {
690
            log_debug('search order item type start.');
691
692
            $criteria = Criteria::create();
693
            $criteria
694
                ->where($criteria->expr()->andX(
695
                    $criteria->expr()->neq('id', OrderItemType::PRODUCT),
696
                    $criteria->expr()->neq('id', OrderItemType::TAX)
697
                ))
698
                ->orderBy(['sort_no' => 'ASC']);
699
700
            $OrderItemTypes = $this->orderItemTypeRepository->matching($criteria);
701
702
            $forms = [];
703
            foreach ($OrderItemTypes as $OrderItemType) {
704
                /* @var $builder \Symfony\Component\Form\FormBuilderInterface */
705
                $builder = $this->formFactory->createBuilder();
706
                $form = $builder->getForm();
707
                $forms[$OrderItemType->getId()] = $form->createView();
708
            }
709
710
            return [
711
                'forms' => $forms,
712
                'OrderItemTypes' => $OrderItemTypes,
713
            ];
714
        }
715
    }
716
717 3
    protected function newOrder()
718
    {
719 3
        $Order = new Order();
720
        // device type
721 3
        $DeviceType = $this->deviceTypeRepository->find(DeviceType::DEVICE_TYPE_ADMIN);
722 3
        $Order->setDeviceType($DeviceType);
723
724 3
        $Shipping = new Shipping();
725 3
        $Order->addShipping($Shipping);
726 3
        $Shipping->setOrder($Order);
727
728 3
        return $Order;
729
    }
730
731
    /**
732
     * 受注ステータスに応じて, 受注日/入金日/発送日を更新する,
733
     * 発送済ステータスが設定された場合は, お届け先情報の発送日も更新を行う.
734
     *
735
     * 編集の場合
736
     * - 受注ステータスが他のステータスから発送済へ変更された場合に発送日を更新
737
     * - 受注ステータスが他のステータスから入金済へ変更された場合に入金日を更新
738
     *
739
     * 新規登録の場合
740
     * - 受注日を更新
741
     * - 受注ステータスが発送済に設定された場合に発送日を更新
742
     * - 受注ステータスが入金済に設定された場合に入金日を更新
743
     *
744
     * @param $app
745
     * @param $TargetOrder
746
     * @param $OriginOrder
747
     *
748
     * TODO Service へ移動する
749
     */
750
    protected function updateDate($app, $TargetOrder, $OriginOrder)
0 ignored issues
show
Unused Code introduced by
The parameter $app is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
751
    {
752
        $dateTime = new \DateTime();
753
754
        // 編集
755
        if ($TargetOrder->getId()) {
756
            // 発送済
757
            if ($TargetOrder->getOrderStatus()->getId() == OrderStatus::DELIVERED) {
758
                // 編集前と異なる場合のみ更新
759
                if ($TargetOrder->getOrderStatus()->getId() != $OriginOrder->getOrderStatus()->getId()) {
760
                    // お届け先情報の発送日も更新する.
761
                    $Shippings = $TargetOrder->getShippings();
762
                    foreach ($Shippings as $Shipping) {
763
                        $Shipping->setShippingDate($dateTime);
764
                    }
765
                }
766
                // 入金済
767
            } elseif ($TargetOrder->getOrderStatus()->getId() == OrderStatus::PAID) {
768
                // 編集前と異なる場合のみ更新
769
                if ($TargetOrder->getOrderStatus()->getId() != $OriginOrder->getOrderStatus()->getId()) {
770
                    $TargetOrder->setPaymentDate($dateTime);
771
                }
772
            }
773
            // 新規
774
        } else {
775
            // 発送済
776
            if ($TargetOrder->getOrderStatus()->getId() == OrderStatus::DELIVERED) {
777
                // お届け先情報の発送日も更新する.
778
                $Shippings = $TargetOrder->getShippings();
779
                foreach ($Shippings as $Shipping) {
780
                    $Shipping->setShippingDate($dateTime);
781
                }
782
                // 入金済
783
            } elseif ($TargetOrder->getOrderStatus()->getId() == OrderStatus::PAID) {
784
                $TargetOrder->setPaymentDate($dateTime);
785
            }
786
            // 受注日時
787
            $TargetOrder->setOrderDate($dateTime);
788
        }
789
    }
790
}
791