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;
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
    /**
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)
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