Completed
Push — master ( d26128...b08c4e )
by Andrii
03:02
created

Calculator::findPlans()   C

Complexity

Conditions 8
Paths 12

Size

Total Lines 35
Code Lines 22

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 13
CRAP Score 11.5396

Importance

Changes 0
Metric Value
cc 8
eloc 22
nc 12
nop 1
dl 0
loc 35
ccs 13
cts 21
cp 0.619
crap 11.5396
rs 5.3846
c 0
b 0
f 0
1
<?php
2
/**
3
 * PHP Billing Library
4
 *
5
 * @link      https://github.com/hiqdev/php-billing
6
 * @package   php-billing
7
 * @license   BSD-3-Clause
8
 * @copyright Copyright (c) 2017-2018, HiQDev (http://hiqdev.com/)
9
 */
10
11
namespace hiqdev\php\billing\order;
12
13
use hiqdev\php\billing\plan\PlanRepositoryInterface;
14
use hiqdev\php\billing\sale\SaleRepositoryInterface;
15
16
/**
17
 * @author Andrii Vasyliev <[email protected]>
18
 */
19
class Calculator implements CalculatorInterface
20
{
21
    /**
22
     * @var SaleRepositoryInterface
23
     */
24
    private $saleRepository;
25
26
    /**
27
     * @var PlanRepositoryInterface
28
     */
29
    private $planRepository;
30
31
    /**
32
     * @param PlanRepositoryInterface $planRepository
33
     */
34 2
    public function __construct(
35
        ?SaleRepositoryInterface $saleRepository,
36
        ?PlanRepositoryInterface $planRepository
37
    ) {
38 2
        $this->saleRepository = $saleRepository;
39 2
        $this->planRepository = $planRepository;
40 2
    }
41
42
    /**
43
     * {@inheritdoc}
44
     */
45 2
    public function calculateCharges(OrderInterface $order)
46
    {
47 2
        $plans = $this->findPlans($order);
48 2
        $charges = [];
49 2
        foreach ($order->getActions() as $actionKey => $action) {
50 2
            if (empty($plans[$actionKey])) {
51
                /* XXX not sure... think more
52
                throw new FailedFindPlan();
53
                 */
54
                continue;
55
            }
56 2
            $charges[$actionKey] = $plans[$actionKey]->calculateCharges($action);
57
        }
58
59 2
        return $charges;
60
    }
61
62 2
    public function findPlans(OrderInterface $order)
63
    {
64 2
        $sales = $this->findSales($order);
65 2
        $plans = [];
66 2
        $lookPlanIds = [];
67 2
        foreach ($order->getActions() as $actionKey => $action) {
68 2
            if (empty($sales[$actionKey])) {
69
                /// it is ok when no sale found for upper resellers
70
                /// throw new \Exception('not found sale');
0 ignored issues
show
Unused Code Comprehensibility introduced by
55% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
71
                $plans[$actionKey] = null;
72
            } else {
73 2
                $sale = $sales[$actionKey];
74 2
                $plan = $sale->getPlan();
75 2
                if ($plan->hasPrices()) {
76 2
                    $plans[$actionKey] = $plan;
77
                } else {
78 2
                    $lookPlanIds[$actionKey] = $plan->getId();
79
                }
80
            }
81
        }
82
83 2
        if ($lookPlanIds) {
84
            $foundPlans = $this->planRepository->findByIds($lookPlanIds);
85
            foreach ($foundPlans as $actionKey => $plan) {
86
                $foundPlans[$plan->getId()] = $plan;
0 ignored issues
show
Bug introduced by
The method getId() does not exist on hiqdev\php\billing\plan\PlanInterface. Since it exists in all sub-types, consider adding an abstract or default implementation to hiqdev\php\billing\plan\PlanInterface. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

86
                $foundPlans[$plan->/** @scrutinizer ignore-call */ getId()] = $plan;
Loading history...
87
            }
88
            foreach ($lookPlanIds as $actionKey => $planId) {
89
                if (empty($foundPlans[$planId])) {
90
                    throw new \Exception('not found plan');
91
                }
92
                $plans[$actionKey] = $foundPlans[$planId];
93
            }
94
        }
95
96 2
        return $plans;
97
    }
98
99 2
    public function findSales(OrderInterface $order)
100
    {
101 2
        $sales = [];
102 2
        $lookActions = [];
103 2
        foreach ($order->getActions() as $actionKey => $action) {
104 2
            $sale = $action->getSale();
105 2
            if ($sale) {
106
                $sales[$actionKey] = $sale;
107
            } else {
108 2
                $lookActions[$actionKey] = $action;
109
            }
110
        }
111
112 2
        if ($lookActions) {
113 2
            $lookOrder = new Order(null, $order->getCustomer(), $lookActions);
114 2
            $foundSales = $this->saleRepository->findByOrder($lookOrder);
0 ignored issues
show
Bug introduced by
The method findByOrder() does not exist on hiqdev\php\billing\sale\SaleRepositoryInterface. Since it exists in all sub-types, consider adding an abstract or default implementation to hiqdev\php\billing\sale\SaleRepositoryInterface. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

114
            /** @scrutinizer ignore-call */ 
115
            $foundSales = $this->saleRepository->findByOrder($lookOrder);
Loading history...
115 2
            foreach ($foundSales as $actionKey => $plan) {
116 2
                $sales[$actionKey] = $plan;
117
            }
118
        }
119
120 2
        return $sales;
121
    }
122
}
123