Completed
Push — 4.0 ( 268f2c...88f012 )
by Hideki
05:48 queued 10s
created

Admin/Setting/Shop/DeliveryController.php (1 issue)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
/*
4
 * This file is part of EC-CUBE
5
 *
6
 * Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved.
7
 *
8
 * http://www.ec-cube.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\DeliveryFee;
21
use Eccube\Entity\DeliveryTime;
22
use Eccube\Entity\PaymentOption;
23
use Eccube\Event\EccubeEvents;
24
use Eccube\Event\EventArgs;
25
use Eccube\Form\Type\Admin\DeliveryType;
26
use Eccube\Repository\DeliveryFeeRepository;
27
use Eccube\Repository\DeliveryRepository;
28
use Eccube\Repository\DeliveryTimeRepository;
29
use Eccube\Repository\Master\PrefRepository;
30
use Eccube\Repository\Master\SaleTypeRepository;
31
use Eccube\Repository\PaymentOptionRepository;
32
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
33
use Symfony\Component\HttpFoundation\Request;
34
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
35
use Symfony\Component\Routing\Annotation\Route;
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
    /**
73
     * DeliveryController constructor.
74
     *
75
     * @param PaymentOptionRepository $paymentOptionRepository
76
     * @param DeliveryFeeRepository $deliveryFeeRepository
77
     * @param PrefRepository $prefRepository
78
     * @param DeliveryRepository $deliveryRepository
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;
88
    }
89
90
    /**
91
     * @Route("/%eccube_admin_route%/setting/shop/delivery", name="admin_setting_shop_delivery")
92
     * @Template("@admin/Setting/Shop/delivery.twig")
93
     */
94 1 View Code Duplication
    public function index(Request $request)
0 ignored issues
show
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...
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
    /**
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
     */
117 6
    public function edit(Request $request, $id = null)
118
    {
119 6
        if (is_null($id)) {
120 3
            $SaleType = $this->saleTypeRepository->findOneBy([], ['sort_no' => 'ASC']);
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
                ->findOneBy(
150
                    [
151 6
                        'Delivery' => $Delivery,
152 6
                        'Pref' => $Pref,
153
                    ]
154
                );
155 6
            if (!$DeliveryFee) {
156 6
                $DeliveryFee = new DeliveryFee();
157
                $DeliveryFee
158
                    ->setPref($Pref)
159
                    ->setDelivery($Delivery);
160 6
            }
161 6
            if (!$DeliveryFee->getFee()) {
162 6
                $Delivery->addDeliveryFee($DeliveryFee);
163 6
            }
164 6
        }
165
166 6
        $DeliveryFees = $Delivery->getDeliveryFees();
167 6
        $DeliveryFeesIndex = [];
168 6
        foreach ($DeliveryFees as $DeliveryFee) {
169
            $Delivery->removeDeliveryFee($DeliveryFee);
170
            $DeliveryFeesIndex[$DeliveryFee->getPref()->getId()] = $DeliveryFee;
171 6
        }
172 6
        ksort($DeliveryFeesIndex);
173
        foreach ($DeliveryFeesIndex as $timeId => $DeliveryFee) {
174 6
            $Delivery->addDeliveryFee($DeliveryFee);
175
        }
176 6
177 6
        $builder = $this->formFactory
178 6
            ->createBuilder(DeliveryType::class, $Delivery);
179 6
180
        $event = new EventArgs(
181 6
            [
182
                'builder' => $builder,
183 6
                'Delivery' => $Delivery,
184
                'Prefs' => $Prefs,
185 6
                'DeliveryFees' => $DeliveryFees,
186
            ],
187
            $request
188 6
        );
189 6
        $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_SETTING_SHOP_DELIVERY_EDIT_INITIALIZE, $event);
190 3
191
        $form = $builder->getForm();
192
193 6
        // 支払方法をセット
194 6
        $Payments = [];
195
        foreach ($Delivery->getPaymentOptions() as $PaymentOption) {
196
            $Payments[] = $PaymentOption->getPayment();
197 6
        }
198 4
199
        $form['delivery_times']->setData($Delivery->getDeliveryTimes());
200 4
        $form['payments']->setData($Payments);
201 2
202
        // 登録ボタン押下
203
        if ($request->getMethod() === 'POST') {
204
            $form->handleRequest($request);
205 2
206
            if ($form->isValid()) {
207
                $DeliveryData = $form->getData();
208
209
                // 配送時間の登録
210 2
                /** @var DeliveryTime $DeliveryTime */
211 2
                foreach ($originalDeliveryTimes as $DeliveryTime) {
212
                    if (false === $Delivery->getDeliveryTimes()->contains($DeliveryTime)) {
213
                        $this->entityManager->remove($DeliveryTime);
214
                    }
215 2
                }
216 2
                foreach ($DeliveryData['DeliveryTimes'] as $DeliveryTime) {
217
                    $DeliveryTime->setDelivery($Delivery);
218 2
                }
219 1
220 1
                // お支払いの登録
221
                $PaymentOptions = $this->paymentOptionRepository
222 2
                    ->findBy(['delivery_id' => $Delivery->getId()]);
223 2
                // 消す
224
                foreach ($PaymentOptions as $PaymentOption) {
225
                    $DeliveryData->removePaymentOption($PaymentOption);
226 2
                    $this->entityManager->remove($PaymentOption);
227 2
                }
228 2
                $this->entityManager->persist($DeliveryData);
229
                $this->entityManager->flush();
230 2
231 2
                // いれる
232 2
                $PaymentsData = $form->get('payments')->getData();
233 2
                foreach ($PaymentsData as $PaymentData) {
234 2
                    $PaymentOption = new PaymentOption();
235 2
                    $PaymentOption
236
                        ->setPaymentId($PaymentData->getId())
237
                        ->setPayment($PaymentData)
238 2
                        ->setDeliveryId($DeliveryData->getId())
239
                        ->setDelivery($DeliveryData);
240 2
                    $DeliveryData->addPaymentOption($PaymentOption);
241
                    $this->entityManager->persist($DeliveryData);
242 2
                }
243
244 2
                $this->entityManager->persist($DeliveryData);
245 2
246 2
                $this->entityManager->flush();
247 2
248
                $event = new EventArgs(
249 2
                    [
250
                        'form' => $form,
251 2
                        'Delivery' => $Delivery,
252
                        'Prefs' => $Prefs,
253 2
                        'DeliveryFees' => $DeliveryFees,
254
                    ],
255 2
                    $request
256
                );
257
                $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_SETTING_SHOP_DELIVERY_EDIT_COMPLETE, $event);
258
259
                $this->addSuccess('admin.common.save_complete', 'admin');
260 4
261 4
                return $this->redirectToRoute('admin_setting_shop_delivery_edit', ['id' => $Delivery->getId()]);
262
            }
263
        }
264
265
        return [
266
            'form' => $form->createView(),
267
            'delivery_id' => $Delivery->getId(),
268
        ];
269 1
    }
270
271 1
    /**
272
     * @Route("/%eccube_admin_route%/setting/shop/delivery/{id}/delete", requirements={"id" = "\d+"}, name="admin_setting_shop_delivery_delete", methods={"DELETE"})
273
     */
274 1
    public function delete(Request $request, Delivery $Delivery)
275 1
    {
276
        $this->isTokenValid();
277
278
        try {
279
            $this->entityManager->remove($Delivery);
280
            $this->entityManager->flush();
281
        } catch (ForeignKeyConstraintViolationException $e) {
282 1
            $this->addError(trans('admin.common.delete_error_foreign_key', ['%name%' => $Delivery->getName()]), 'admin');
283 1
284 1
            return $this->redirectToRoute('admin_setting_shop_delivery');
285
        }
286 1
287 1
        $sortNo = 1;
288 1
        $Delivs = $this->deliveryRepository
289 1
            ->findBy([], ['sort_no' => 'ASC']);
290
291
        foreach ($Delivs as $Deliv) {
292
            if ($Deliv->getId() != $Delivery->getId()) {
293 1
                $Deliv->setSortNo($sortNo);
294
                $sortNo++;
295 1
            }
296
        }
297 1
298 1
        $this->entityManager->flush();
299
300 1
        $event = new EventArgs(
301
            [
302 1
                'Delivs' => $Delivs,
303
                'Delivery' => $Delivery,
304 1
            ],
305
            $request
306 1
        );
307
        $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_SETTING_SHOP_DELIVERY_DELETE_COMPLETE, $event);
308
309
        $this->addSuccess('admin.common.delete_complete', 'admin');
310
311
        return $this->redirectToRoute('admin_setting_shop_delivery');
312
    }
313
314
    /**
315
     * @Route("/%eccube_admin_route%/setting/shop/delivery/{id}/visibility", requirements={"id" = "\d+"}, name="admin_setting_shop_delivery_visibility", methods={"PUT"})
316
     */
317
    public function visibility(Request $request, Delivery $Delivery)
318
    {
319
        $this->isTokenValid();
320
321
        // 表示・非表示を切り替える
322
        if ($Delivery->isVisible()) {
323
            $message = trans('admin.common.to_hide_complete', ['%name%' => $Delivery->getName()]);
324
            $Delivery->setVisible(false);
325
        } else {
326
            $message = trans('admin.common.to_show_complete', ['%name%' => $Delivery->getName()]);
327
            $Delivery->setVisible(true);
328
        }
329
        $this->entityManager->persist($Delivery);
330
331
        $this->entityManager->flush();
332
333
        $event = new EventArgs(
334
            [
335
                'Delivery' => $Delivery,
336
            ],
337
            $request
338
        );
339
        $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_SETTING_SHOP_DELIVERY_VISIBILITY_COMPLETE, $event);
340
341
        $this->addSuccess($message, 'admin');
342
343
        return $this->redirectToRoute('admin_setting_shop_delivery');
344
    }
345
346 1
    /**
347
     * @Route("/%eccube_admin_route%/setting/shop/delivery/sort_no/move", name="admin_setting_shop_delivery_sort_no_move", methods={"POST"})
348 1
     */
349
    public function moveSortNo(Request $request)
350
    {
351
        if (!$request->isXmlHttpRequest()) {
352 1
            throw new BadRequestHttpException();
353 1
        }
354 1
355 1
        if ($this->isTokenValid()) {
356 1
            $sortNos = $request->request->all();
357 1
            foreach ($sortNos as $deliveryId => $sortNo) {
358
                $Delivery = $this->deliveryRepository->find($deliveryId);
359 1
                $Delivery->setSortNo($sortNo);
360
                $this->entityManager->persist($Delivery);
361
            }
362 1
            $this->entityManager->flush();
363
        }
364
365
        return $this->json('OK', 200);
366
    }
367
}
368