Failed Conditions
Pull Request — experimental/sf (#3247)
by Kiyotaka
114:07 queued 103:28
created

DeliveryFeePreprocessor::process()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 2

Importance

Changes 0
Metric Value
cc 2
nc 2
nop 2
dl 0
loc 6
rs 10
c 0
b 0
f 0
ccs 3
cts 3
cp 1
crap 2
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\Service\PurchaseFlow\Processor;
15
16
use Doctrine\ORM\EntityManagerInterface;
17
use Eccube\Entity\ItemHolderInterface;
18
use Eccube\Entity\Master\OrderItemType;
19
use Eccube\Entity\Master\TaxDisplayType;
20
use Eccube\Entity\Master\TaxType;
21
use Eccube\Entity\Order;
22
use Eccube\Entity\OrderItem;
23
use Eccube\Entity\Shipping;
24
use Eccube\Repository\DeliveryFeeRepository;
25
use Eccube\Repository\TaxRuleRepository;
26
use Eccube\Service\PurchaseFlow\ItemHolderPreprocessor;
27
use Eccube\Service\PurchaseFlow\PurchaseContext;
28
29
/**
30
 * 送料明細追加.
31
 */
32
class DeliveryFeePreprocessor implements ItemHolderPreprocessor
33
{
34
    /**
35
     * @var EntityManagerInterface
36
     */
37
    protected $entityManager;
38
39
    /**
40
     * @var TaxRuleRepository
41
     */
42
    protected $taxRuleRepository;
43
44
    /**
45
     * @var DeliveryFeeRepository
46
     */
47
    protected $deliveryFeeRepository;
48
49
    /**
50
     * DeliveryFeeProcessor constructor.
51
     *
52
     * @param EntityManagerInterface $entityManager
53
     * @param TaxRuleRepository $taxRuleRepository
0 ignored issues
show
introduced by
Expected 6 spaces after parameter type; 1 found
Loading history...
54
     * @param DeliveryFeeRepository $deliveryFeeRepository
0 ignored issues
show
introduced by
Expected 2 spaces after parameter type; 1 found
Loading history...
55
     */
56 61
    public function __construct(
57
        EntityManagerInterface $entityManager,
58
        TaxRuleRepository $taxRuleRepository,
59
        DeliveryFeeRepository $deliveryFeeRepository
60
    ) {
61 61
        $this->entityManager = $entityManager;
62 61
        $this->taxRuleRepository = $taxRuleRepository;
63 61
        $this->deliveryFeeRepository = $deliveryFeeRepository;
64
    }
65
66
    /**
67
     * @param ItemHolderInterface $itemHolder
68
     * @param PurchaseContext $context
0 ignored issues
show
introduced by
Expected 5 spaces after parameter type; 1 found
Loading history...
69
     *
70
     * @throws \Doctrine\ORM\NoResultException
71
     */
72 53
    public function process(ItemHolderInterface $itemHolder, PurchaseContext $context)
73
    {
74 53
        if ($this->containsDeliveryFeeItem($itemHolder) == false) {
0 ignored issues
show
Coding Style Best Practice introduced by
It seems like you are loosely comparing two booleans. Considering using the strict comparison === instead.

When comparing two booleans, it is generally considered safer to use the strict comparison operator.

Loading history...
75 52
            $this->addDeliveryFeeItem($itemHolder);
76
        }
77
    }
78
79
    /**
80
     * @param ItemHolderInterface $itemHolder
81
     *
82
     * @return bool
83
     */
84 53
    private function containsDeliveryFeeItem(ItemHolderInterface $itemHolder)
85
    {
86 53
        foreach ($itemHolder->getItems() as $item) {
87 53
            if ($item->isDeliveryFee()) {
88 53
                return true;
89
            }
90
        }
91
92 52
        return false;
93
    }
94
95
    /**
96
     * @param ItemHolderInterface $itemHolder
97
     *
98
     * @throws \Doctrine\ORM\NoResultException
99
     */
100 52
    private function addDeliveryFeeItem(ItemHolderInterface $itemHolder)
101
    {
102 52
        $DeliveryFeeType = $this->entityManager
103 52
            ->find(OrderItemType::class, OrderItemType::DELIVERY_FEE);
104 52
        $TaxInclude = $this->entityManager
105 52
            ->find(TaxDisplayType::class, TaxDisplayType::INCLUDED);
106 52
        $Taxion = $this->entityManager
107 52
            ->find(TaxType::class, TaxType::TAXATION);
108 52
        $TaxRule = $this->taxRuleRepository->getByRule();
109
110
        /** @var Order $Order */
111 52
        $Order = $itemHolder;
112
        /* @var Shipping $Shipping */
113 52
        foreach ($Order->getShippings() as $Shipping) {
114
            // 送料の計算
115 52
            $DeliveryFee = $this->deliveryFeeRepository->findOneBy([
116 52
                'Delivery' => $Shipping->getDelivery(),
117 52
                'Pref' => $Shipping->getPref(),
118
            ]);
119 52
            $Shipping->setShippingDeliveryFee($DeliveryFee->getFee());
120 52
            $Shipping->setFeeId($DeliveryFee->getId());
121
122 52
            $OrderItem = new OrderItem();
123 52
            $OrderItem->setProductName(trans('deliveryfeeprocessor.label.shippint_charge'))
124 52
                ->setPrice($Shipping->getShippingDeliveryFee())
125 52
                ->setPriceIncTax($Shipping->getShippingDeliveryFee())
126 52
                ->setTaxRule($TaxRule->getId())
127 52
                ->setTaxRate($TaxRule->getTaxRate())
128 52
                ->setQuantity(1)
129 52
                ->setOrderItemType($DeliveryFeeType)
130 52
                ->setShipping($Shipping)
131 52
                ->setOrder($itemHolder)
132 52
                ->setTaxDisplayType($TaxInclude)
133 52
                ->setTaxType($Taxion);
134
135 52
            $itemHolder->addItem($OrderItem);
136 52
            $Shipping->addOrderItem($OrderItem);
137
        }
138
    }
139
}
140