Header::configureOptions()   A
last analyzed

Complexity

Conditions 3
Paths 2

Size

Total Lines 55
Code Lines 49

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 50
CRAP Score 3

Importance

Changes 0
Metric Value
eloc 49
dl 0
loc 55
ccs 50
cts 50
cp 1
rs 9.1127
c 0
b 0
f 0
cc 3
nc 2
nop 1
crap 3

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
/**
4
 * This file is part of riesenia/pohoda package.
5
 *
6
 * Licensed under the MIT License
7
 * (c) RIESENIA.com
8
 */
9
10
declare(strict_types=1);
11
12
namespace Riesenia\Pohoda\Stock;
13
14
use Riesenia\Pohoda\AbstractAgenda;
15
use Riesenia\Pohoda\Common;
16
use Riesenia\Pohoda\DI\DependenciesFactory;
17
use Riesenia\Pohoda\Type;
18
19
/**
20
 * @property array{
21
 *     parameters?: iterable<Type\Parameter>,
22
 *     intrastat?: Intrastat,
23
 *     recyclingContrib?: RecyclingContrib,
24
 *     pictures?: iterable<Picture>,
25
 *     categories?: iterable<Category>,
26
 *     intParameters?: iterable<IntParameter>,
27
 * } $data
28
 */
29
class Header extends AbstractAgenda
30
{
31
    use Common\AddParameterTrait;
32
33
    /** @var string[] */
34
    protected array $refElements = [
35
        'storage',
36
        'typePrice',
37
        'typeRP',
38
        'supplier',
39
        'typeServiceMOSS',
40
    ];
41
42
    /** @var string[] */
43
    protected array $elements = [
44
        'stockType',
45
        'code',
46
        'EAN',
47
        'PLU',
48
        'isSales',
49
        'isSerialNumber',
50
        'isInternet',
51
        'isBatch',
52
        'purchasingRateVAT',
53
        'purchasingRatePayVAT',
54
        'sellingRateVAT',
55
        'sellingRatePayVAT',
56
        'name',
57
        'nameComplement',
58
        'unit',
59
        'unit2',
60
        'unit3',
61
        'coefficient2',
62
        'coefficient3',
63
        'storage',
64
        'typePrice',
65
        'purchasingPrice',
66
        'purchasingPricePayVAT',
67
        'sellingPrice',
68
        'sellingPricePayVAT',
69
        'limitMin',
70
        'limitMax',
71
        'mass',
72
        'volume',
73
        'supplier',
74
        'orderName',
75
        'orderQuantity',
76
        'shortName',
77
        'typeRP',
78
        'guaranteeType',
79
        'guarantee',
80
        'producer',
81
        'typeServiceMOSS',
82
        'description',
83
        'description2',
84
        'note',
85
        'intrastat',
86
        'recyclingContrib',
87
    ];
88
89
    /** @var string[] */
90
    protected array $additionalElements = [
91
        'id',
92
        'weightedPurchasePrice',
93
        'count',
94
        'countIssue',
95
        'countReceivedOrders',
96
        'reservation',
97
        'countIssuedOrders',
98
        'clearanceSale',
99
        'controlLimitTaxLiability',
100
        'discount',
101
        'fixation',
102
        'markRecord',
103
        'news',
104
        'prepare',
105
        'recommended',
106
        'sale',
107
        'reclamation',
108
        'service',
109
    ];
110
111
    protected int $imagesCounter = 0;
112
113
    /**
114
     * {@inheritdoc}
115
     */
116 21
    public function __construct(
117
        DependenciesFactory $dependenciesFactory,
118
    ) {
119
        // init attributes
120 21
        $this->elementsAttributesMapper = [
121 21
            'purchasingPricePayVAT' => new Common\ElementAttributes('purchasingPrice', 'payVAT'),
122 21
            'sellingPricePayVAT' => new Common\ElementAttributes('sellingPrice', 'payVAT'),
123 21
            'purchasingRatePayVAT' => new Common\ElementAttributes('purchasingRateVAT', 'value'),
124 21
            'sellingRatePayVAT' => new Common\ElementAttributes('sellingRateVAT', 'value'),
125 21
        ];
126
127 21
        parent::__construct($dependenciesFactory);
128
    }
129
130
    /**
131
     * {@inheritdoc}
132
     */
133 21
    public function setData(array $data): parent
134
    {
135
        // process intrastat
136 21
        if (isset($data['intrastat'])) {
137 10
            $intrastat = new Intrastat($this->dependenciesFactory);
138 10
            $intrastat
139 10
                ->setDirectionalVariable($this->useOneDirectionalVariables)
140 10
                ->setResolveOptions($this->resolveOptions)
141 10
                ->setData($data['intrastat']);
142 10
            $data['intrastat'] = $intrastat;
143
        }
144
145
        // process recyclingContrib
146 21
        if (isset($data['recyclingContrib'])) {
147 10
            $recyclingContrib = new RecyclingContrib($this->dependenciesFactory);
148 10
            $recyclingContrib
149 10
                ->setDirectionalVariable($this->useOneDirectionalVariables)
150 10
                ->setResolveOptions($this->resolveOptions)
151 10
                ->setData($data['recyclingContrib']);
152 10
            $data['recyclingContrib'] = $recyclingContrib;
153
        }
154
155 21
        return parent::setData($data);
0 ignored issues
show
Bug Best Practice introduced by
The expression return parent::setData($data) returns the type Riesenia\Pohoda\AbstractAgenda which is incompatible with the type-hinted return parent.
Loading history...
156
    }
157
158
    /**
159
     * Add image.
160
     *
161
     * @param string   $filepath
162
     * @param string   $description
163
     * @param int|null $order
164
     * @param bool     $default
165
     *
166
     * @return void
167
     */
168 1
    public function addImage(string $filepath, string $description = '', int $order = null, bool $default = false): void
169
    {
170 1
        if (!isset($this->data['pictures'])
171 1
            || !(
172 1
                is_array($this->data['pictures'])
173 1
                || (is_a($this->data['pictures'], \ArrayAccess::class))
174 1
            )
175
        ) {
176 1
            $this->data['pictures'] = [];
177
        }
178
179 1
        $picture = new Picture($this->dependenciesFactory);
180 1
        $picture
181 1
            ->setDirectionalVariable($this->useOneDirectionalVariables)
182 1
            ->setResolveOptions($this->resolveOptions)
183 1
            ->setData([
184 1
                'filepath' => $filepath,
185 1
                'description' => $description,
186 1
                'order' => null === $order ? ++$this->imagesCounter : $order,
187 1
                'default' => $default,
188 1
            ]);
189 1
        $this->data['pictures'][] = $picture;
190
    }
191
192
    /**
193
     * Add category.
194
     *
195
     * @param int $categoryId
196
     *
197
     * @return void
198
     */
199 1
    public function addCategory(int $categoryId): void
200
    {
201 1
        if (!isset($this->data['categories'])
202 1
            || !(
203 1
                is_array($this->data['categories'])
204 1
                || (is_a($this->data['categories'], \ArrayAccess::class))
205 1
            )
206
        ) {
207 1
            $this->data['categories'] = [];
208
        }
209
210 1
        $category = new Category($this->dependenciesFactory);
211 1
        $category
212 1
            ->setDirectionalVariable($this->useOneDirectionalVariables)
213 1
            ->setResolveOptions($this->resolveOptions)
214 1
            ->setData([
215 1
                'idCategory' => $categoryId,
216 1
            ]);
217 1
        $this->data['categories'][] = $category;
218
    }
219
220
    /**
221
     * Add int parameter.
222
     *
223
     * @param array<string,mixed> $data
224
     *
225
     * @return void
226
     */
227 1
    public function addIntParameter(array $data): void
228
    {
229 1
        if (!isset($this->data['intParameters'])
230 1
            || !(
231 1
                is_array($this->data['intParameters'])
232 1
                || (is_a($this->data['intParameters'], \ArrayAccess::class))
233 1
            )
234
        ) {
235 1
            $this->data['intParameters'] = [];
236
        }
237
238 1
        $intParameters = new IntParameter($this->dependenciesFactory);
239 1
        $intParameters
240 1
            ->setDirectionalVariable($this->useOneDirectionalVariables)
241 1
            ->setResolveOptions($this->resolveOptions)
242 1
            ->setData($data);
243 1
        $this->data['intParameters'][] = $intParameters;
244
    }
245
246
    /**
247
     * {@inheritdoc}
248
     */
249 18
    public function getXML(): \SimpleXMLElement
250
    {
251 18
        $xml = $this->createXML()->addChild('stk:stockHeader', '', $this->namespace('stk'));
252
253 18
        $this->addElements($xml, \array_merge($this->elements, ($this->useOneDirectionalVariables ? $this->additionalElements : []), ['categories', 'pictures', 'parameters', 'intParameters']), 'stk');
254
255 18
        return $xml;
256
    }
257
258
    /**
259
     * {@inheritdoc}
260
     */
261 2
    protected function configureOptions(Common\OptionsResolver $resolver): void
262
    {
263
        // available options
264 2
        $resolver->setDefined(array_merge($this->elements, ($this->useOneDirectionalVariables ? $this->additionalElements : [])));
265
266
        // validate / format options
267 2
        $resolver->setDefault('stockType', 'card');
268 2
        $resolver->setAllowedValues('stockType', ['card', 'text', 'service', 'package', 'set', 'product']);
269 2
        $resolver->setNormalizer('isSales', $this->dependenciesFactory->getNormalizerFactory()->getClosure('bool'));
270 2
        $resolver->setNormalizer('isSerialNumber', $this->dependenciesFactory->getNormalizerFactory()->getClosure('bool'));
271 2
        $resolver->setNormalizer('isInternet', $this->dependenciesFactory->getNormalizerFactory()->getClosure('bool'));
272 2
        $resolver->setNormalizer('isBatch', $this->dependenciesFactory->getNormalizerFactory()->getClosure('bool'));
273 2
        $resolver->setAllowedValues('purchasingRateVAT', ['none', 'third', 'low', 'high']);
274 2
        $resolver->setAllowedValues('sellingRateVAT', ['none', 'third', 'low', 'high']);
275 2
        $resolver->setNormalizer('name', $this->dependenciesFactory->getNormalizerFactory()->getClosure('string90'));
276 2
        $resolver->setNormalizer('nameComplement', $this->dependenciesFactory->getNormalizerFactory()->getClosure('string90'));
277 2
        $resolver->setNormalizer('unit', $this->dependenciesFactory->getNormalizerFactory()->getClosure('string10'));
278 2
        $resolver->setNormalizer('unit2', $this->dependenciesFactory->getNormalizerFactory()->getClosure('string10'));
279 2
        $resolver->setNormalizer('unit3', $this->dependenciesFactory->getNormalizerFactory()->getClosure('string10'));
280 2
        $resolver->setNormalizer('coefficient2', $this->dependenciesFactory->getNormalizerFactory()->getClosure('float'));
281 2
        $resolver->setNormalizer('coefficient3', $this->dependenciesFactory->getNormalizerFactory()->getClosure('float'));
282 2
        $resolver->setNormalizer('purchasingPrice', $this->dependenciesFactory->getNormalizerFactory()->getClosure('float'));
283 2
        $resolver->setNormalizer('purchasingPricePayVAT', $this->dependenciesFactory->getNormalizerFactory()->getClosure('bool'));
284 2
        $resolver->setNormalizer('sellingPrice', $this->dependenciesFactory->getNormalizerFactory()->getClosure('float'));
285 2
        $resolver->setNormalizer('sellingPricePayVAT', $this->dependenciesFactory->getNormalizerFactory()->getClosure('bool'));
286 2
        $resolver->setNormalizer('limitMin', $this->dependenciesFactory->getNormalizerFactory()->getClosure('float'));
287 2
        $resolver->setNormalizer('limitMax', $this->dependenciesFactory->getNormalizerFactory()->getClosure('float'));
288 2
        $resolver->setNormalizer('mass', $this->dependenciesFactory->getNormalizerFactory()->getClosure('float'));
289 2
        $resolver->setNormalizer('volume', $this->dependenciesFactory->getNormalizerFactory()->getClosure('float'));
290 2
        $resolver->setNormalizer('orderName', $this->dependenciesFactory->getNormalizerFactory()->getClosure('string90'));
291 2
        $resolver->setNormalizer('orderQuantity', $this->dependenciesFactory->getNormalizerFactory()->getClosure('float'));
292 2
        $resolver->setNormalizer('shortName', $this->dependenciesFactory->getNormalizerFactory()->getClosure('string24'));
293 2
        $resolver->setAllowedValues('guaranteeType', ['none', 'hour', 'day', 'month', 'year', 'life']);
294 2
        $resolver->setNormalizer('guarantee', $this->dependenciesFactory->getNormalizerFactory()->getClosure('int'));
295 2
        $resolver->setNormalizer('producer', $this->dependenciesFactory->getNormalizerFactory()->getClosure('string90'));
296 2
        $resolver->setNormalizer('description', $this->dependenciesFactory->getNormalizerFactory()->getClosure('string240'));
297
298 2
        if ($this->useOneDirectionalVariables) {
299 1
            $resolver->setNormalizer('weightedPurchasePrice', $this->dependenciesFactory->getNormalizerFactory()->getClosure('float'));
300 1
            $resolver->setNormalizer('count', $this->dependenciesFactory->getNormalizerFactory()->getClosure('float'));
301 1
            $resolver->setNormalizer('countIssue', $this->dependenciesFactory->getNormalizerFactory()->getClosure('float'));
302 1
            $resolver->setNormalizer('countReceivedOrders', $this->dependenciesFactory->getNormalizerFactory()->getClosure('float'));
303 1
            $resolver->setNormalizer('reservation', $this->dependenciesFactory->getNormalizerFactory()->getClosure('float'));
304 1
            $resolver->setNormalizer('countIssuedOrders', $this->dependenciesFactory->getNormalizerFactory()->getClosure('float'));
305 1
            $resolver->setNormalizer('reclamation', $this->dependenciesFactory->getNormalizerFactory()->getClosure('float'));
306 1
            $resolver->setNormalizer('service', $this->dependenciesFactory->getNormalizerFactory()->getClosure('float'));
307 1
            $resolver->setNormalizer('clearanceSale', $this->dependenciesFactory->getNormalizerFactory()->getClosure('bool'));
308 1
            $resolver->setNormalizer('controlLimitTaxLiability', $this->dependenciesFactory->getNormalizerFactory()->getClosure('bool'));
309 1
            $resolver->setNormalizer('discount', $this->dependenciesFactory->getNormalizerFactory()->getClosure('bool'));
310 1
            $resolver->setNormalizer('fixation', $this->dependenciesFactory->getNormalizerFactory()->getClosure('string90'));
311 1
            $resolver->setNormalizer('markRecord', $this->dependenciesFactory->getNormalizerFactory()->getClosure('bool'));
312 1
            $resolver->setNormalizer('news', $this->dependenciesFactory->getNormalizerFactory()->getClosure('bool'));
313 1
            $resolver->setNormalizer('prepare', $this->dependenciesFactory->getNormalizerFactory()->getClosure('bool'));
314 1
            $resolver->setNormalizer('recommended', $this->dependenciesFactory->getNormalizerFactory()->getClosure('bool'));
315 1
            $resolver->setNormalizer('sale', $this->dependenciesFactory->getNormalizerFactory()->getClosure('bool'));
316
        }
317
    }
318
}
319