Passed
Pull Request — master (#99)
by
unknown
02:46
created

BillingRegistryService::getBehaviors()   B

Complexity

Conditions 7
Paths 16

Size

Total Lines 14
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 7
eloc 8
c 0
b 0
f 0
nc 16
nop 1
dl 0
loc 14
rs 8.8333
1
<?php declare(strict_types=1);
2
3
namespace hiqdev\php\billing\product\Application;
4
5
use hiqdev\php\billing\product\AggregateInterface;
6
use hiqdev\php\billing\product\behavior\BehaviorInterface;
7
use hiqdev\php\billing\product\behavior\BehaviorNotFoundException;
8
use hiqdev\php\billing\product\behavior\InvalidBehaviorException;
9
use hiqdev\php\billing\product\BillingRegistryInterface;
10
use hiqdev\php\billing\product\Exception\AggregateNotFoundException;
11
use hiqdev\php\billing\product\Exception\TariffTypeDefinitionNotFoundException;
12
use hiqdev\php\billing\product\invoice\InvalidRepresentationException;
13
use hiqdev\php\billing\product\invoice\RepresentationInterface;
14
use hiqdev\php\billing\product\price\PriceTypeDefinitionInterface;
15
use hiqdev\php\billing\product\quantity\FractionQuantityData;
16
use hiqdev\php\billing\product\quantity\QuantityFormatterInterface;
17
use hiqdev\php\billing\product\quantity\QuantityFormatterNotFoundException;
18
use hiqdev\php\billing\product\TariffTypeDefinitionInterface;
19
use hiqdev\php\billing\type\Type;
20
use hiqdev\php\billing\type\TypeInterface;
0 ignored issues
show
Bug introduced by
The type hiqdev\php\billing\type\TypeInterface was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
21
22
final class BillingRegistryService implements BillingRegistryServiceInterface
23
{
24
    public function __construct(private readonly BillingRegistryInterface $registry)
25
    {
26
    }
27
28
    public function getRepresentationsByType(string $representationClass): array
29
    {
30
        if (!class_exists($representationClass)) {
31
            throw new InvalidRepresentationException("Class '$representationClass' does not exist");
32
        }
33
34
        if (!is_subclass_of($representationClass, RepresentationInterface::class)) {
35
            throw new InvalidBehaviorException(
36
                sprintf('Representation class "%s" does not implement RepresentationInterface', $representationClass)
37
            );
38
        }
39
40
        $representations = [];
41
        foreach ($this->registry->priceTypes() as $priceTypeDefinition) {
42
            foreach ($priceTypeDefinition->documentRepresentation() as $representation) {
43
                if ($representation instanceof $representationClass) {
44
                    $representations[] = $representation;
45
                }
46
            }
47
        }
48
49
        return $representations;
50
    }
51
52
    public function createQuantityFormatter(string $type, FractionQuantityData $data): QuantityFormatterInterface {
53
        $type = $this->convertStringTypeToType($type);
54
55
        foreach ($this->registry->priceTypes() as $priceTypeDefinition) {
56
            if ($priceTypeDefinition->hasType($type)) {
57
                return $priceTypeDefinition->createQuantityFormatter($data);
58
            }
59
        }
60
61
        throw new QuantityFormatterNotFoundException('Quantity formatter not found');
62
    }
63
64
    private function convertStringTypeToType(string $type): TypeInterface
65
    {
66
        return Type::anyId($type);
67
    }
68
69
    public function getBehavior(string $type, string $behaviorClassWrapper): BehaviorInterface
70
    {
71
        if (!class_exists($behaviorClassWrapper)) {
72
            throw new InvalidBehaviorException(
73
                sprintf('Behavior class "%s" does not exist', $behaviorClassWrapper)
74
            );
75
        }
76
77
        if (!is_subclass_of($behaviorClassWrapper, BehaviorInterface::class)) {
78
            throw new InvalidBehaviorException(
79
                sprintf('Behavior class "%s" does not implement BehaviorInterface', $behaviorClassWrapper)
80
            );
81
        }
82
83
        $billingType = $this->convertStringTypeToType($type);
84
85
        foreach ($this->registry->priceTypes() as $priceTypeDefinition) {
86
            if ($priceTypeDefinition->hasType($billingType)) {
87
                $behavior = $this->findBehaviorInPriceType($priceTypeDefinition, $behaviorClassWrapper);
0 ignored issues
show
Bug introduced by
Are you sure the assignment to $behavior is correct as $this->findBehaviorInPri... $behaviorClassWrapper) targeting hiqdev\php\billing\produ...ndBehaviorInPriceType() seems to always return null.

This check looks for function or method calls that always return null and whose return value is assigned to a variable.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
$object = $a->getObject();

The method getObject() can return nothing but null, so it makes no sense to assign that value to a variable.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
88
89
                if ($behavior) {
90
                    return $behavior;
0 ignored issues
show
Bug Best Practice introduced by
The expression return $behavior returns the type void which is incompatible with the type-hinted return hiqdev\php\billing\produ...avior\BehaviorInterface.
Loading history...
91
                }
92
            }
93
        }
94
95
        throw new BehaviorNotFoundException(
96
            sprintf('Behavior of class "%s" not found for type "%s"', $behaviorClassWrapper, $type),
97
        );
98
    }
99
100
    private function findBehaviorInPriceType(
101
        PriceTypeDefinitionInterface $priceTypeDefinition,
102
        string $behaviorClassWrapper
103
    ): ?BehaviorInterface {
104
        foreach ($priceTypeDefinition->withBehaviors() as $behavior) {
105
            if ($behavior instanceof $behaviorClassWrapper) {
106
                return $behavior;
107
            }
108
        }
109
110
        return null;
111
    }
112
113
    public function getBehaviors(string $behaviorClassWrapper): \Generator
114
    {
115
        foreach ($this->registry->getTariffTypeDefinitions() as $tariffTypeDefinition) {
116
            foreach ($tariffTypeDefinition->withBehaviors() as $behavior) {
117
                if ($behavior instanceof $behaviorClassWrapper) {
118
                    yield $behavior;
119
                }
120
            }
121
        }
122
123
        foreach ($this->registry->priceTypes() as $priceTypeDefinition) {
124
            foreach ($priceTypeDefinition->withBehaviors() as $behavior) {
125
                if ($behavior instanceof $behaviorClassWrapper) {
126
                    yield $behavior;
127
                }
128
            }
129
        }
130
    }
131
132
    public function getAggregate(string $type): AggregateInterface
133
    {
134
        $type = $this->convertStringTypeToType($type);
135
136
        foreach ($this->registry->priceTypes() as $priceTypeDefinition) {
137
            if ($priceTypeDefinition->hasType($type)) {
138
                return $priceTypeDefinition->getAggregate();
139
            }
140
        }
141
142
        throw new AggregateNotFoundException('Aggregate was not found');
143
    }
144
145
    public function findTariffTypeDefinitionByBehavior(BehaviorInterface $behavior): TariffTypeDefinitionInterface
146
    {
147
        $tariffType = $behavior->getTariffType();
148
149
        foreach ($this->registry->getTariffTypeDefinitions() as $tariffTypeDefinition) {
150
            if ($tariffTypeDefinition->belongToTariffType($tariffType)) {
151
                return $tariffTypeDefinition;
152
            }
153
        }
154
155
        throw new TariffTypeDefinitionNotFoundException('Tariff type definition was not found');
156
    }
157
158
    public function findPriceTypeDefinitionsByBehavior(string $behaviorClassWrapper): \Generator
159
    {
160
        foreach ($this->registry->priceTypes() as $priceTypeDefinition) {
161
            if ($priceTypeDefinition->hasBehavior($behaviorClassWrapper)) {
162
                yield $priceTypeDefinition;
163
            }
164
        }
165
    }
166
}
167