Failed Conditions
Pull Request — experimental/sf (#3373)
by
unknown
134:13 queued 124:29
created

ShippingController   A

Complexity

Total Complexity 20

Size/Duplication

Total Lines 245
Duplicated Lines 2.45 %

Coupling/Cohesion

Components 1
Dependencies 10

Test Coverage

Coverage 83.12%

Importance

Changes 0
Metric Value
dl 6
loc 245
rs 10
c 0
b 0
f 0
ccs 64
cts 77
cp 0.8312
wmc 20
lcom 1
cbo 10

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 17 1
F index() 6 172 19

How to fix   Duplicated Code   

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:

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 Eccube\Controller\AbstractController;
18
use Eccube\Entity\Order;
19
use Eccube\Entity\OrderItem;
20
use Eccube\Entity\Shipping;
21
use Eccube\Form\Type\Admin\SearchProductType;
22
use Eccube\Form\Type\Admin\ShippingType;
23
use Eccube\Repository\CategoryRepository;
24
use Eccube\Repository\DeliveryRepository;
25
use Eccube\Repository\OrderItemRepository;
26
use Eccube\Repository\ShippingRepository;
27
use Eccube\Service\TaxRuleService;
28
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
29
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
30
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
31
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
32
use Symfony\Component\Form\FormEvent;
33
use Symfony\Component\Form\FormEvents;
34
use Symfony\Component\HttpFoundation\Request;
35
use Symfony\Component\Serializer\SerializerInterface;
36
use Eccube\Service\MailService;
37
38
class ShippingController extends AbstractController
0 ignored issues
show
introduced by
Missing class doc comment
Loading history...
39
{
40
    /**
41
     * @var OrderItemRepository
42
     */
43
    protected $orderItemRepository;
44
45
    /**
46
     * @var CategoryRepository
47
     */
48
    protected $categoryRepository;
49
50
    /**
51
     * @var DeliveryRepository
52
     */
53
    protected $deliveryRepository;
54
55
    /**
56
     * @var TaxRuleService
57
     */
58
    protected $taxRuleService;
59
60
    /**
61
     * @var ShippingRepository
62
     */
63
    protected $shippingRepository;
64
65
    /**
66
     * @var SerializerInterface
67
     */
68
    protected $serializer;
69
70
    /**
71
     * @var \Eccube\Service\MailService
72
     */
73
    protected $mailService;
74
75
    /**
76
     * EditController constructor.
77
     *
78
     * @param MailService $mailService
0 ignored issues
show
introduced by
Expected 9 spaces after parameter type; 1 found
Loading history...
79
     * @param OrderItemRepository $orderItemRepository
80
     * @param CategoryRepository $categoryRepository
0 ignored issues
show
introduced by
Expected 2 spaces after parameter type; 1 found
Loading history...
81
     * @param DeliveryRepository $deliveryRepository
0 ignored issues
show
introduced by
Expected 2 spaces after parameter type; 1 found
Loading history...
82
     * @param TaxRuleService $taxRuleService
0 ignored issues
show
introduced by
Expected 6 spaces after parameter type; 1 found
Loading history...
83
     * @param ShippingRepository $shippingRepository
0 ignored issues
show
introduced by
Expected 2 spaces after parameter type; 1 found
Loading history...
84
     * @param SerializerInterface $serializer
85
     */
86 3
    public function __construct(
87
        MailService $mailService,
88
        OrderItemRepository $orderItemRepository,
89
        CategoryRepository $categoryRepository,
90
        DeliveryRepository $deliveryRepository,
91
        TaxRuleService $taxRuleService,
92
        ShippingRepository $shippingRepository,
93
        SerializerInterface $serializer
94
    ) {
95 3
        $this->mailService = $mailService;
96 3
        $this->orderItemRepository = $orderItemRepository;
97 3
        $this->categoryRepository = $categoryRepository;
98 3
        $this->deliveryRepository = $deliveryRepository;
99 3
        $this->taxRuleService = $taxRuleService;
100 3
        $this->shippingRepository = $shippingRepository;
101 3
        $this->serializer = $serializer;
102
    }
103
104
    /**
0 ignored issues
show
introduced by
Doc comment for parameter "$request" missing
Loading history...
introduced by
Doc comment for parameter "$Order" missing
Loading history...
105
     * 出荷登録/編集画面.
106
     *
107
     * @Route("/%eccube_admin_route%/shipping/{id}/edit", requirements={"id" = "\d+"}, name="admin_shipping_edit")
108
     * @Template("@admin/Order/shipping.twig")
109
     */
0 ignored issues
show
introduced by
Missing @return tag in function comment
Loading history...
110 2
    public function index(Request $request, Order $Order)
111
    {
112 2
        $TargetShippings = $Order->getShippings();
113 2
        $OriginShippings = [];
114 2
        $OriginOrderItems = [];
115
116
        // 編集前の受注情報を保持
117 2
        foreach ($TargetShippings as $key => $TargetShipping) {
118 2
            $OriginShippings[$key] = clone $TargetShipping;
119
120
            // 編集前のお届け先のアイテム情報を保持
121 2
            $OriginOrderItems[$key] = new ArrayCollection();
122
123 2
            foreach ($TargetShipping->getOrderItems() as $OrderItem) {
124 2
                $OriginOrderItems[$key]->add($OrderItem);
125
            }
126
        }
127
128 2
        $builder = $this->formFactory->createBuilder();
129
        $builder
130 2
            ->add('shippings', CollectionType::class, [
131 2
                'entry_type' => ShippingType::class,
132 2
                'data' => $TargetShippings,
133
                'allow_add' => true,
134
                'allow_delete' => true,
135
                'prototype' => true,
136
            ]);
137
138
        // 配送先の追加フラグ
139
        $builder
140 2
            ->add('add_shipping', HiddenType::class, [
141 2
                'mapped' => false,
142
            ]);
143
144
        // 配送先の追加フラグが立っている場合は新しいお届け先を追加
145 2
        $builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
146 2
            $data = $event->getData();
147 2
            if ($data['add_shipping']) {
148
                $Shippings = $data['shippings'];
149
                $newShipping = ['Delivery' => ''];
150
                $Shippings[] = $newShipping;
151
                $data['shippings'] = $Shippings;
152
                $data['add_shipping'] = '';
153
                $event->setData($data);
154
            }
155 2
        });
156
157 2
        $form = $builder->getForm();
158
159 2
        $form->handleRequest($request);
160
161 2
        if ($form->isSubmitted() && $form->isValid() && $request->get('mode') == 'register') {
162
            // 削除された項目の削除
163
            /** @var Shipping $OriginShipping */
164 2
            foreach ($OriginShippings as $key => $OriginShipping) {
165
                // 削除された明細の削除
166
                /** @var OrderItem $OriginOrderItem */
167 2
                foreach ($OriginOrderItems[$key] as $OriginOrderItem) {
168 2
                    if (false === $TargetShippings[$key]->getOrderItems()->contains($OriginOrderItem)) {
169
                        $TargetShippings[$key]->removeOrderItem($OriginOrderItem); // 不要かも
170
                        $OriginOrderItem->setShipping(null);
171
                        $Order->removeOrderItem($OriginOrderItem);
172 2
                        $OriginOrderItem->setOrder(null);
173
                    }
174
                }
175
            }
176
177 2
            foreach ($TargetShippings as $key => $TargetShipping) {
178
                // TODO: Should move logic out of controller such as service, modal
179
180
                // FIXME 税額計算は CalculateService で処理する. ここはテストを通すための暫定処理
181
                // see EditControllerTest::testOrderProcessingWithTax
182
//                $OrderItems = $TargetShipping->getOrderItems();
183
//                $taxtotal = 0;
184
//                foreach ($OrderItems as $OrderItem) {
185
//                    $tax = $this->taxRuleService
186
//                        ->calcTax($OrderItem->getPrice(), $OrderItem->getTaxRate(), $OrderItem->getTaxRule());
187
//                    $OrderItem->setPriceIncTax($OrderItem->getPrice() + $tax);
188
//
189
//                    $taxtotal += $tax * $OrderItem->getQuantity();
190
//                }
191
192 2
                log_info('出荷登録開始', [$TargetShipping->getId()]);
193
                // TODO 在庫の有無や販売制限数のチェックなども行う必要があるため、完了処理もcaluclatorのように抽象化できないか検討する.
194
                // TODO 後続にある会員情報の更新のように、完了処理もcaluclatorのように抽象化できないか検討する.
195
                // 画面上で削除された明細をremove
196
//                if (array_key_exists($key, $OriginOrderItems)) {
197
//                    /** @var OrderItem $OrderItem */
198
//                    foreach ($OriginOrderItems[$key] as $OrderItem) {
199
//                        if (false === $TargetShipping->getOrderItems()->contains($OrderItem)) {
200
//                            $TargetShipping->removeOrderItem($OrderItem); // 不要かも
201
//                            $OrderItem->setShipping(null);
202
//                            $Order->removeOrderItem($OrderItem);
203
//                            $OrderItem->setOrder(null);
204
//                        }
205
//                    }
206
//                }
207
208 2
                foreach ($TargetShipping->getOrderItems() as $OrderItem) {
209 2
                    $TargetShipping->addOrderItem($OrderItem); // 不要かも
210 2
                    $OrderItem->setShipping($TargetShipping);
211 2
                    $Order->addOrderItem($OrderItem);
212 2
                    $OrderItem->setOrder($Order);
213
                }
214
215 2
                $TargetShipping->setOrder($Order);
216
217
                // 出荷ステータス変更時の処理
218
//                if ($TargetShipping->isShipped()) {
219
//                    // 「出荷済み」にステータスが変更された場合
220
//                    if ($OriginShippings[$key]->isShipped() == false) {
221
//                        // 出荷メールを送信
222
//                        if ($form->get('notify_email')->getData()) {
223
//                            try {
224
//                                $this->mailService->sendShippingNotifyMail(
225
//                                    $TargetShipping
226
//                                );
227
//                            } catch (\Exception $e) {
228
//                                log_error('メール通知エラー', [$TargetShipping->getId(), $e]);
229
//                                $this->addError(
230
//                                    'admin.shipping.edit.shipped_mail_failed',
231
//                                    'admin'
232
//                                );
233
//                            }
234
//                        }
235
//                    }
236
//                }
237
            }
238
239
            try {
240 2
                foreach ($TargetShippings as $TargetShipping) {
241 2
                    $this->entityManager->persist($TargetShipping);
242
                }
243 2
                $this->entityManager->flush();
244
245 2
                $this->addSuccess('admin.shipping.edit.save.complete', 'admin');
246 2
                $this->addInfo('admin.shipping.edit.save.info', 'admin');
247 2
                log_info('出荷登録完了', [$Order->getId()]);
248
249 2
                return $this->redirectToRoute('admin_shipping_edit', ['id' => $Order->getId()]);
250
            } catch (\Exception $e) {
251
                log_error('出荷登録エラー', [$Order->getId(), $e]);
252
                $this->addError('admin.flash.register_failed', 'admin');
253
            }
254 2
        } elseif ($form->isSubmitted() && $request->get('mode') == 'register' && $form->getErrors(true)) {
255
            $this->addError('admin.flash.register_failed', 'admin');
256
        }
257
258
        // 商品検索フォーム
259 2
        $builder = $this->formFactory
260 2
            ->createBuilder(SearchProductType::class);
261
262 2
        $searchProductModalForm = $builder->getForm();
263
264
        // 配送業者のお届け時間
265 2
        $times = [];
266 2
        $deliveries = $this->deliveryRepository->findAll();
267 2 View Code Duplication
        foreach ($deliveries as $Delivery) {
268 2
            $deliveryTiems = $Delivery->getDeliveryTimes();
269 2
            foreach ($deliveryTiems as $DeliveryTime) {
270 2
                $times[$Delivery->getId()][$DeliveryTime->getId()] = $DeliveryTime->getDeliveryTime();
271
            }
272
        }
273
274
        return [
275 2
            'form' => $form->createView(),
276 2
            'searchProductModalForm' => $searchProductModalForm->createView(),
277 2
            'Order' => $Order,
278 2
            'Shippings' => $TargetShippings,
279 2
            'shippingDeliveryTimes' => $this->serializer->serialize($times, 'json'),
280
        ];
281
    }
282
}
283