Completed
Push — experimental/sf ( cc45c1...372a2d )
by chihiro
930:05 queued 919:43
created

DeliveryController::index()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 17

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 1
dl 0
loc 17
ccs 8
cts 8
cp 1
crap 1
rs 9.7
c 0
b 0
f 0
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\Setting\Shop;
15
16
use Doctrine\Common\Collections\ArrayCollection;
17
use Doctrine\DBAL\Exception\ForeignKeyConstraintViolationException;
18
use Eccube\Controller\AbstractController;
19
use Eccube\Entity\Delivery;
20
use Eccube\Entity\DeliveryTime;
21
use Eccube\Entity\PaymentOption;
22
use Eccube\Event\EccubeEvents;
23
use Eccube\Event\EventArgs;
24
use Eccube\Form\Type\Admin\DeliveryType;
25
use Eccube\Repository\DeliveryFeeRepository;
26
use Eccube\Repository\DeliveryRepository;
27
use Eccube\Repository\DeliveryTimeRepository;
28
use Eccube\Repository\Master\PrefRepository;
29
use Eccube\Repository\Master\SaleTypeRepository;
30
use Eccube\Repository\PaymentOptionRepository;
31
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
32
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
33
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
34
use Symfony\Component\HttpFoundation\Request;
35
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
36
37
/**
38
 * Class DeliveryController
39
 */
40
class DeliveryController extends AbstractController
41
{
42
    /**
43
     * @var PaymentOptionRepository
44
     */
45
    protected $paymentOptionRepository;
46
47
    /**
48
     * @var DeliveryFeeRepository
49
     */
50
    protected $deliveryFeeRepository;
51
52
    /**
53
     * @var PrefRepository
54
     */
55
    protected $prefRepository;
56
57
    /**
58
     * @var DeliveryRepository
59
     */
60
    protected $deliveryRepository;
61
62
    /**
63
     * @var DeliveryTimeRepository
64
     */
65
    protected $deliveryTimeRepository;
66
67
    /**
68
     * @var DeliveryTimeRepository
69
     */
70
    protected $saleTypeRepository;
71
72
    /**
0 ignored issues
show
introduced by
Doc comment for parameter "$deliveryTimeRepository" missing
Loading history...
introduced by
Doc comment for parameter "$saleTypeRepository" missing
Loading history...
73
     * DeliveryController constructor.
74
     *
75
     * @param PaymentOptionRepository $paymentOptionRepository
76
     * @param DeliveryFeeRepository $deliveryFeeRepository
0 ignored issues
show
introduced by
Expected 3 spaces after parameter type; 1 found
Loading history...
77
     * @param PrefRepository $prefRepository
0 ignored issues
show
introduced by
Expected 10 spaces after parameter type; 1 found
Loading history...
78
     * @param DeliveryRepository $deliveryRepository
0 ignored issues
show
introduced by
Expected 6 spaces after parameter type; 1 found
Loading history...
79
     */
80 10
    public function __construct(PaymentOptionRepository $paymentOptionRepository, DeliveryFeeRepository $deliveryFeeRepository, PrefRepository $prefRepository, DeliveryRepository $deliveryRepository, DeliveryTimeRepository $deliveryTimeRepository, SaleTypeRepository $saleTypeRepository)
81
    {
82 10
        $this->paymentOptionRepository = $paymentOptionRepository;
83 10
        $this->deliveryFeeRepository = $deliveryFeeRepository;
84 10
        $this->prefRepository = $prefRepository;
85 10
        $this->deliveryRepository = $deliveryRepository;
86 10
        $this->deliveryTimeRepository = $deliveryTimeRepository;
87 10
        $this->saleTypeRepository = $saleTypeRepository;
0 ignored issues
show
Documentation Bug introduced by
It seems like $saleTypeRepository of type object<Eccube\Repository...ter\SaleTypeRepository> is incompatible with the declared type object<Eccube\Repository\DeliveryTimeRepository> of property $saleTypeRepository.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
88
    }
89
90
    /**
0 ignored issues
show
introduced by
Doc comment for parameter "$request" missing
Loading history...
91
     * @Route("/%eccube_admin_route%/setting/shop/delivery", name="admin_setting_shop_delivery")
92
     * @Template("@admin/Setting/Shop/delivery.twig")
93
     */
0 ignored issues
show
introduced by
Missing @return tag in function comment
Loading history...
94 1
    public function index(Request $request)
95
    {
96 1
        $Deliveries = $this->deliveryRepository
97 1
            ->findBy([], ['sort_no' => 'DESC']);
98
99 1
        $event = new EventArgs(
100
            [
101 1
                'Deliveries' => $Deliveries,
102
            ],
103 1
            $request
104
        );
105 1
        $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_SETTING_SHOP_DELIVERY_INDEX_COMPLETE, $event);
106
107
        return [
108 1
            'Deliveries' => $Deliveries,
109
        ];
110
    }
111
112
    /**
0 ignored issues
show
introduced by
Doc comment for parameter "$request" missing
Loading history...
introduced by
Doc comment for parameter "$id" missing
Loading history...
113
     * @Route("/%eccube_admin_route%/setting/shop/delivery/new", name="admin_setting_shop_delivery_new")
114
     * @Route("/%eccube_admin_route%/setting/shop/delivery/{id}/edit", requirements={"id" = "\d+"}, name="admin_setting_shop_delivery_edit")
115
     * @Template("@admin/Setting/Shop/delivery_edit.twig")
116
     */
0 ignored issues
show
introduced by
Missing @return tag in function comment
Loading history...
117 6
    public function edit(Request $request, $id = null)
118
    {
119 6
        if (is_null($id)) {
120 3
            $SaleType = $this->saleTypeRepository->findOneBy([], ['sort_no' => 'DESC']);
121 3
            $Delivery = $this->deliveryRepository->findOneBy([], ['sort_no' => 'DESC']);
122
123 3
            $sortNo = 1;
124 3
            if ($Delivery) {
125 3
                $sortNo = $Delivery->getSortNo() + 1;
126
            }
127
128 3
            $Delivery = new Delivery();
129
            $Delivery
130 3
                ->setSortNo($sortNo)
131 3
                ->setVisible(true)
132 3
                ->setSaleType($SaleType);
133
        } else {
134 3
            $Delivery = $this->deliveryRepository->find($id);
135
        }
136
137 6
        $originalDeliveryTimes = new ArrayCollection();
138
139 6
        foreach ($Delivery->getDeliveryTimes() as $deliveryTime) {
140
            $originalDeliveryTimes->add($deliveryTime);
141
        }
142
143
        // FormType: DeliveryFeeの生成
144 6
        $Prefs = $this->prefRepository
145 6
            ->findAll();
146
147 6
        foreach ($Prefs as $Pref) {
148 6
            $DeliveryFee = $this->deliveryFeeRepository
149 6
                ->findOrCreate(
150
                    [
151 6
                        'Delivery' => $Delivery,
152 6
                        'Pref' => $Pref,
153
                    ]
154
                );
155 6
            if (!$DeliveryFee->getFee()) {
156 6
                $Delivery->addDeliveryFee($DeliveryFee);
157
            }
158
        }
159
160 6
        $DeliveryFees = $Delivery->getDeliveryFees();
161 6
        $DeliveryFeesIndex = [];
162 6
        foreach ($DeliveryFees as $DeliveryFee) {
163 6
            $Delivery->removeDeliveryFee($DeliveryFee);
164 6
            $DeliveryFeesIndex[$DeliveryFee->getPref()->getId()] = $DeliveryFee;
165
        }
166 6
        ksort($DeliveryFeesIndex);
167 6
        foreach ($DeliveryFeesIndex as $timeId => $DeliveryFee) {
168 6
            $Delivery->addDeliveryFee($DeliveryFee);
169
        }
170
171 6
        $builder = $this->formFactory
172 6
            ->createBuilder(DeliveryType::class, $Delivery);
173
174 6
        $event = new EventArgs(
175
            [
176 6
                'builder' => $builder,
177 6
                'Delivery' => $Delivery,
178 6
                'Prefs' => $Prefs,
179 6
                'DeliveryFees' => $DeliveryFees,
180
            ],
181 6
            $request
182
        );
183 6
        $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_SETTING_SHOP_DELIVERY_EDIT_INITIALIZE, $event);
184
185 6
        $form = $builder->getForm();
186
187
        // 支払方法をセット
188 6
        $Payments = [];
189 6
        foreach ($Delivery->getPaymentOptions() as $PaymentOption) {
190 3
            $Payments[] = $PaymentOption->getPayment();
191
        }
192
193 6
        $form['delivery_times']->setData($Delivery->getDeliveryTimes());
194 6
        $form['payments']->setData($Payments);
195
196
        // 登録ボタン押下
197 6
        if ($request->getMethod() === 'POST') {
198 4
            $form->handleRequest($request);
199
200 4
            if ($form->isValid()) {
201 2
                $DeliveryData = $form->getData();
202
203
                // 配送時間の登録
204
                /** @var DeliveryTime $DeliveryTime */
205 2
                foreach ($originalDeliveryTimes as $DeliveryTime) {
206
                    if (false === $Delivery->getDeliveryTimes()->contains($DeliveryTime)) {
207
                        $this->entityManager->remove($DeliveryTime);
208
                    }
209
                }
210 2
                foreach ($DeliveryData['DeliveryTimes'] as $DeliveryTime) {
211 2
                    $DeliveryTime->setDelivery($Delivery);
212
                }
213
214
                // お支払いの登録
215 2
                $PaymentOptions = $this->paymentOptionRepository
216 2
                    ->findBy(['delivery_id' => $Delivery->getId()]);
217
                // 消す
218 2
                foreach ($PaymentOptions as $PaymentOption) {
219 1
                    $DeliveryData->removePaymentOption($PaymentOption);
220 1
                    $this->entityManager->remove($PaymentOption);
221
                }
222 2
                $this->entityManager->persist($DeliveryData);
223 2
                $this->entityManager->flush();
224
225
                // いれる
226 2
                $PaymentsData = $form->get('payments')->getData();
227 2
                foreach ($PaymentsData as $PaymentData) {
228 2
                    $PaymentOption = new PaymentOption();
229
                    $PaymentOption
230 2
                        ->setPaymentId($PaymentData->getId())
231 2
                        ->setPayment($PaymentData)
232 2
                        ->setDeliveryId($DeliveryData->getId())
233 2
                        ->setDelivery($DeliveryData);
234 2
                    $DeliveryData->addPaymentOption($PaymentOption);
235 2
                    $this->entityManager->persist($DeliveryData);
236
                }
237
238 2
                $this->entityManager->persist($DeliveryData);
239
240 2
                $this->entityManager->flush();
241
242 2
                $event = new EventArgs(
243
                    [
244 2
                        'form' => $form,
245 2
                        'Delivery' => $Delivery,
246 2
                        'Prefs' => $Prefs,
247 2
                        'DeliveryFees' => $DeliveryFees,
248
                    ],
249 2
                    $request
250
                );
251 2
                $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_SETTING_SHOP_DELIVERY_EDIT_COMPLETE, $event);
252
253 2
                $this->addSuccess('admin.register.complete', 'admin');
254
255 2
                return $this->redirectToRoute('admin_setting_shop_delivery');
256
            }
257
        }
258
259
        return [
260 4
            'form' => $form->createView(),
261 4
            'delivery_id' => $Delivery->getId(),
262
        ];
263
    }
264
265
    /**
0 ignored issues
show
introduced by
Doc comment for parameter "$request" missing
Loading history...
introduced by
Doc comment for parameter "$Delivery" missing
Loading history...
266
     * @Method("DELETE")
267
     * @Route("/%eccube_admin_route%/setting/shop/delivery/{id}/delete", requirements={"id" = "\d+"}, name="admin_setting_shop_delivery_delete")
268
     */
0 ignored issues
show
introduced by
Missing @return tag in function comment
Loading history...
269 1
    public function delete(Request $request, Delivery $Delivery)
270
    {
271 1
        $this->isTokenValid();
272
273
        try {
274 1
            $this->entityManager->remove($Delivery);
275 1
            $this->entityManager->flush();
276
        } catch (ForeignKeyConstraintViolationException $e) {
277
            $this->addError(trans('admin.delete.failed.foreign_key', ['%name%' => $Delivery->getName()]), 'admin');
278
279
            return $this->redirectToRoute('admin_setting_shop_delivery');
280
        }
281
282 1
        $sortNo = 1;
283 1
        $Delivs = $this->deliveryRepository
284 1
            ->findBy([], ['sort_no' => 'ASC']);
285
286 1
        foreach ($Delivs as $Deliv) {
287 1
            if ($Deliv->getId() != $Delivery->getId()) {
288 1
                $Deliv->setSortNo($sortNo);
289 1
                $sortNo++;
290
            }
291
        }
292
293 1
        $this->entityManager->flush();
294
295 1
        $event = new EventArgs(
296
            [
297 1
                'Delivs' => $Delivs,
298 1
                'Delivery' => $Delivery,
299
            ],
300 1
            $request
301
        );
302 1
        $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_SETTING_SHOP_DELIVERY_DELETE_COMPLETE, $event);
303
304 1
        $this->addSuccess('admin.delete.complete', 'admin');
305
306 1
        return $this->redirectToRoute('admin_setting_shop_delivery');
307
    }
308
309
    /**
0 ignored issues
show
introduced by
Doc comment for parameter "$request" missing
Loading history...
introduced by
Doc comment for parameter "$Delivery" missing
Loading history...
310
     * @Method("PUT")
311
     * @Route("/%eccube_admin_route%/setting/shop/delivery/{id}/visibility", requirements={"id" = "\d+"}, name="admin_setting_shop_delivery_visibility")
312
     */
0 ignored issues
show
introduced by
Missing @return tag in function comment
Loading history...
313
    public function visibility(Request $request, Delivery $Delivery)
314
    {
315
        $this->isTokenValid();
316
317
        // 表示・非表示を切り替える
318
        if ($Delivery->isVisible()) {
319
            $message = 'admin.delivery.hidden.complete';
320
            $Delivery->setVisible(false);
321
        } else {
322
            $message = 'admin.delivery.visible.complete';
323
            $Delivery->setVisible(true);
324
        }
325
        $this->entityManager->persist($Delivery);
326
327
        $this->entityManager->flush();
328
329
        $event = new EventArgs(
330
            [
331
                'Delivery' => $Delivery,
332
            ],
333
            $request
334
        );
335
        $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_SETTING_SHOP_DELIVERY_VISIBILITY_COMPLETE, $event);
336
337
        $this->addSuccess($message, 'admin');
338
339
        return $this->redirectToRoute('admin_setting_shop_delivery');
340
    }
341
342
    /**
0 ignored issues
show
introduced by
Doc comment for parameter "$request" missing
Loading history...
343
     * @Method("POST")
344
     * @Route("/%eccube_admin_route%/setting/shop/delivery/sort_no/move", name="admin_setting_shop_delivery_sort_no_move")
345
     */
0 ignored issues
show
introduced by
Missing @return tag in function comment
Loading history...
346 1 View Code Duplication
    public function moveSortNo(Request $request)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in 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...
347
    {
348 1
        if (!$request->isXmlHttpRequest()) {
349
            throw new BadRequestHttpException();
350
        }
351
352 1
        if ($this->isTokenValid()) {
353 1
            $sortNos = $request->request->all();
354 1
            foreach ($sortNos as $deliveryId => $sortNo) {
355 1
                $Delivery = $this->deliveryRepository->find($deliveryId);
356 1
                $Delivery->setSortNo($sortNo);
357 1
                $this->entityManager->persist($Delivery);
0 ignored issues
show
Bug introduced by
It seems like $Delivery defined by $this->deliveryRepository->find($deliveryId) on line 355 can also be of type null; however, Doctrine\Common\Persiste...bjectManager::persist() does only seem to accept object, 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...
358
            }
359 1
            $this->entityManager->flush();
360
        }
361
362 1
        return $this->json('OK', 200);
363
    }
364
}
365