Failed Conditions
Pull Request — experimental/sf (#29)
by Kentaro
51:40 queued 07:20
created

ShippingController::index()   F

Complexity

Conditions 19
Paths 126

Size

Total Lines 124

Duplication

Lines 6
Ratio 4.84 %

Code Coverage

Tests 56
CRAP Score 21.414

Importance

Changes 0
Metric Value
cc 19
nc 126
nop 2
dl 6
loc 124
ccs 56
cts 69
cp 0.8116
crap 21.414
rs 3.44
c 0
b 0
f 0

How to fix   Long Method    Complexity   

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 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\MailService;
28
use Eccube\Service\OrderStateMachine;
29
use Eccube\Service\TaxRuleService;
30
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
31
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
32
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
33
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
34
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
35
use Symfony\Component\Form\FormEvent;
36
use Symfony\Component\Form\FormEvents;
37
use Symfony\Component\HttpFoundation\JsonResponse;
38
use Symfony\Component\HttpFoundation\Request;
39
use Symfony\Component\HttpFoundation\Response;
40
use Symfony\Component\Serializer\SerializerInterface;
41
42
class ShippingController extends AbstractController
43
{
44
    /**
45
     * @var OrderItemRepository
46
     */
47
    protected $orderItemRepository;
48
49
    /**
50
     * @var CategoryRepository
51
     */
52
    protected $categoryRepository;
53
54
    /**
55
     * @var DeliveryRepository
56
     */
57
    protected $deliveryRepository;
58
59
    /**
60
     * @var TaxRuleService
61
     */
62
    protected $taxRuleService;
63
64
    /**
65
     * @var ShippingRepository
66
     */
67
    protected $shippingRepository;
68
69
    /**
70
     * @var SerializerInterface
71
     */
72
    protected $serializer;
73
74
    /**
75
     * @var \Eccube\Service\MailService
76
     */
77
    protected $mailService;
78
79
    /**
80
     * @var OrderStateMachine
81
     */
82
    private $orderStateMachine;
83
84
    /**
85
     * EditController constructor.
86
     *
87
     * @param MailService $mailService
88
     * @param OrderItemRepository $orderItemRepository
89
     * @param CategoryRepository $categoryRepository
90
     * @param DeliveryRepository $deliveryRepository
91
     * @param TaxRuleService $taxRuleService
92
     * @param ShippingRepository $shippingRepository
93
     * @param SerializerInterface $serializer
94
     * @param OrderStateMachine $orderStateMachine
95
     */
96 5
    public function __construct(
97
        MailService $mailService,
98
        OrderItemRepository $orderItemRepository,
99
        CategoryRepository $categoryRepository,
100
        DeliveryRepository $deliveryRepository,
101
        TaxRuleService $taxRuleService,
102
        ShippingRepository $shippingRepository,
103
        SerializerInterface $serializer,
104
        OrderStateMachine $orderStateMachine
105
    ) {
106 5
        $this->mailService = $mailService;
107 5
        $this->orderItemRepository = $orderItemRepository;
108 5
        $this->categoryRepository = $categoryRepository;
109 5
        $this->deliveryRepository = $deliveryRepository;
110 5
        $this->taxRuleService = $taxRuleService;
111 5
        $this->shippingRepository = $shippingRepository;
112 5
        $this->serializer = $serializer;
113 5
        $this->orderStateMachine = $orderStateMachine;
114
    }
115
116
    /**
117
     * 出荷登録/編集画面.
118
     *
119
     * @Route("/%eccube_admin_route%/shipping/{id}/edit", requirements={"id" = "\d+"}, name="admin_shipping_edit")
120
     * @Template("@admin/Order/shipping.twig")
121
     */
122 2
    public function index(Request $request, Order $Order)
123
    {
124 2
        $TargetShippings = $Order->getShippings();
125 2
        $OriginShippings = [];
126 2
        $OriginOrderItems = [];
127
128
        // 編集前の受注情報を保持
129 2
        foreach ($TargetShippings as $key => $TargetShipping) {
130 2
            $OriginShippings[$key] = clone $TargetShipping;
131
132
            // 編集前のお届け先のアイテム情報を保持
133 2
            $OriginOrderItems[$key] = new ArrayCollection();
134
135 2
            foreach ($TargetShipping->getOrderItems() as $OrderItem) {
136 2
                $OriginOrderItems[$key]->add($OrderItem);
137
            }
138
        }
139
140 2
        $builder = $this->formFactory->createBuilder();
141
        $builder
142 2
            ->add('shippings', CollectionType::class, [
143 2
                'entry_type' => ShippingType::class,
144 2
                'data' => $TargetShippings,
145
                'allow_add' => true,
146
                'allow_delete' => true,
147
                'prototype' => true,
148
            ]);
149
150
        // 配送先の追加フラグ
151
        $builder
152 2
            ->add('add_shipping', HiddenType::class, [
153 2
                'mapped' => false,
154
            ]);
155
156
        // 配送先の追加フラグが立っている場合は新しいお届け先を追加
157 2
        $builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
158 2
            $data = $event->getData();
159 2
            if ($data['add_shipping']) {
160
                $Shippings = $data['shippings'];
161
                $newShipping = ['Delivery' => ''];
162
                $Shippings[] = $newShipping;
163
                $data['shippings'] = $Shippings;
164
                $data['add_shipping'] = '';
165
                $event->setData($data);
166
            }
167 2
        });
168
169 2
        $form = $builder->getForm();
170
171 2
        $form->handleRequest($request);
172
173 2
        if ($form->isSubmitted() && $form->isValid() && $request->get('mode') == 'register') {
174 2
            log_info('出荷登録開始', [$TargetShipping->getId()]);
0 ignored issues
show
Bug introduced by
The variable $TargetShipping seems to be defined by a foreach iteration on line 129. Are you sure the iterator is never empty, otherwise this variable is not defined?

It seems like you are relying on a variable being defined by an iteration:

foreach ($a as $b) {
}

// $b is defined here only if $a has elements, for example if $a is array()
// then $b would not be defined here. To avoid that, we recommend to set a
// default value for $b.


// Better
$b = 0; // or whatever default makes sense in your context
foreach ($a as $b) {
}

// $b is now guaranteed to be defined here.
Loading history...
175
176
            // 削除された項目の削除
177
            /** @var Shipping $OriginShipping */
178 2
            foreach ($OriginShippings as $key => $OriginShipping) {
179
                // 削除された明細の削除
180
                /** @var OrderItem $OriginOrderItem */
181 2
                foreach ($OriginOrderItems[$key] as $OriginOrderItem) {
182 2
                    if (false === $TargetShippings[$key]->getOrderItems()->contains($OriginOrderItem)) {
183
                        $TargetShippings[$key]->removeOrderItem($OriginOrderItem); // 不要かも
184
                        $OriginOrderItem->setShipping(null);
185
                        $Order->removeOrderItem($OriginOrderItem);
186 2
                        $OriginOrderItem->setOrder(null);
187
                    }
188
                }
189
            }
190
191
            // 追加された項目の追加
192 2
            foreach ($TargetShippings as $key => $TargetShipping) {
193 2
                foreach ($TargetShipping->getOrderItems() as $OrderItem) {
194 2
                    $TargetShipping->addOrderItem($OrderItem); // 不要かも
195 2
                    $OrderItem->setShipping($TargetShipping);
196 2
                    $Order->addOrderItem($OrderItem);
197 2
                    $OrderItem->setOrder($Order);
198
                }
199
200 2
                $TargetShipping->setOrder($Order);
201
            }
202
203
            try {
204 2
                foreach ($TargetShippings as $TargetShipping) {
205 2
                    $this->entityManager->persist($TargetShipping);
206
                }
207 2
                $this->entityManager->flush();
208
209 2
                $this->addSuccess('admin.shipping.edit.save.complete', 'admin');
210 2
                $this->addInfo('admin.shipping.edit.save.info', 'admin');
211 2
                log_info('出荷登録完了', [$Order->getId()]);
212
213 2
                return $this->redirectToRoute('admin_shipping_edit', ['id' => $Order->getId()]);
214
            } catch (\Exception $e) {
215
                log_error('出荷登録エラー', [$Order->getId(), $e]);
216
                $this->addError('admin.flash.register_failed', 'admin');
217
            }
218 2
        } elseif ($form->isSubmitted() && $request->get('mode') == 'register' && $form->getErrors(true)) {
219
            $this->addError('admin.flash.register_failed', 'admin');
220
        }
221
222
        // 商品検索フォーム
223 2
        $builder = $this->formFactory
224 2
            ->createBuilder(SearchProductType::class);
225
226 2
        $searchProductModalForm = $builder->getForm();
227
228
        // 配送業者のお届け時間
229 2
        $times = [];
230 2
        $deliveries = $this->deliveryRepository->findAll();
231 2 View Code Duplication
        foreach ($deliveries as $Delivery) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
232 2
            $deliveryTiems = $Delivery->getDeliveryTimes();
233 2
            foreach ($deliveryTiems as $DeliveryTime) {
234 2
                $times[$Delivery->getId()][$DeliveryTime->getId()] = $DeliveryTime->getDeliveryTime();
235
            }
236
        }
237
238
        return [
239 2
            'form' => $form->createView(),
240 2
            'searchProductModalForm' => $searchProductModalForm->createView(),
241 2
            'Order' => $Order,
242 2
            'Shippings' => $TargetShippings,
243 2
            'shippingDeliveryTimes' => $this->serializer->serialize($times, 'json'),
244
        ];
245
    }
246
247
    /**
248
     * @Route("/%eccube_admin_route%/shipping/preview_notify_mail/{id}", requirements={"id" = "\d+"}, name="admin_shipping_preview_notify_mail")
249
     *
250
     * @param Shipping $Shipping
251
     *
252
     * @return Response
253
     *
254
     * @throws \Twig_Error
255
     */
256
    public function previewShippingNotifyMail(Shipping $Shipping)
257
    {
258
        return new Response($this->mailService->getShippingNotifyMailBody($Shipping, $Shipping->getOrder()));
259
    }
260
261
    /**
262
     * @Method("PUT")
263
     * @Route("/%eccube_admin_route%/shipping/notify_mail/{id}", requirements={"id" = "\d+"}, name="admin_shipping_notify_mail")
264
     *
265
     * @param Shipping $Shipping
266
     *
267
     * @return JsonResponse
268
     *
269
     * @throws \Twig_Error
270
     */
271 2
    public function notifyMail(Shipping $Shipping)
272
    {
273 2
        $this->isTokenValid();
274
275 2
        $this->mailService->sendShippingNotifyMail($Shipping);
276
277 2
        $Shipping->setMailSendDate(new \DateTime());
278 2
        $this->shippingRepository->save($Shipping);
279 2
        $this->entityManager->flush();
280
281 2
        return $this->json([
282 2
            'mail' => true,
283
            'shipped' => false,
284
        ]);
285
    }
286
}
287