Test Failed
Push — master ( 286c96...e21ea4 )
by Laurens
01:29
created

SubscriptionPlanFactory   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 52
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 7
eloc 27
dl 0
loc 52
rs 10
c 0
b 0
f 0

3 Methods

Rating   Name   Duplication   Size   Complexity  
A getSubscriptionProxies() 0 17 4
A fromData() 0 15 1
A fromArray() 0 10 2
1
<?php
2
3
declare(strict_types=1);
4
5
namespace LauLamanApps\eCurring\Resource\Factory;
6
7
use DateTimeImmutable;
8
use LauLamanApps\eCurring\eCurringClientInterface;
9
use LauLamanApps\eCurring\Resource\Curser\Pagination;
10
use LauLamanApps\eCurring\Resource\Proxy\SubscriptionProxy;
11
use LauLamanApps\eCurring\Resource\SubscriptionPlan;
12
use LauLamanApps\eCurring\Resource\SubscriptionPlan\AuthenticationMethod;
13
use LauLamanApps\eCurring\Resource\SubscriptionPlan\Status;
14
use LauLamanApps\eCurring\Resource\SubscriptionPlanCollection;
15
16
final class SubscriptionPlanFactory extends AbstractFactory implements SubscriptionPlanFactoryInterface
17
{
18
    public function fromArray(eCurringClientInterface $client, array $data, Pagination $page): SubscriptionPlanCollection
19
    {
20
        $transactions = [];
21
        foreach ($data['data'] as $data) {
22
            $transactions[] = $this->fromData($client, $data);
23
        }
24
25
        $totalPages = $data['meta']['total'];
26
27
        return new SubscriptionPlanCollection($client, $page->getNumber(), $totalPages ?? 1, $transactions, $page->getSize());
28
    }
29
30
    public function fromData(eCurringClientInterface $client, array $data): SubscriptionPlan
31
    {
32
        return new SubscriptionPlan(
33
            $this->extractInteger('id', $data),
34
            $data['attributes']['name'],
35
            $data['attributes']['description'],
36
            new DateTimeImmutable($data['attributes']['start_date']),
37
            Status::get($data['attributes']['status']),
38
            AuthenticationMethod::get($data['attributes']['mandate_authentication_method']),
39
            $this->extractBoolean('send_invoice', $data['attributes']),
40
            $this->extractInteger('storno_retries', $data['attributes']),
41
            new DateTimeImmutable($data['attributes']['created_at']),
42
            new DateTimeImmutable($data['attributes']['updated_at']),
43
            $this->extractStringOrNull('terms', $data['attributes']),
44
            ...$this->getSubscriptionProxies($client, $data['relationships'])
45
        );
46
    }
47
48
    /**
49
     * @return SubscriptionProxy[]
50
     */
51
    private function getSubscriptionProxies(eCurringClientInterface $client, array $relationships): array
52
    {
53
        if (!isset($relationships['subscriptions'])) {
54
            return [];
55
        }
56
57
        $subscriptions = [];
58
59
        foreach ($relationships['subscriptions']['data'] as $subscription) {
60
            if ($subscription['type']  !== 'subscription') {
61
                continue;
62
            }
63
64
            $subscriptions[] = new SubscriptionProxy($client, $subscription['id']);
65
        }
66
67
        return $subscriptions;
68
    }
69
}
70