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

TransactionFactory::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 1
dl 0
loc 3
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 1
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\Factory\Transaction\EventFactoryInterface;
10
use LauLamanApps\eCurring\Resource\Curser\Pagination;
11
use LauLamanApps\eCurring\Resource\Subscription;
12
use LauLamanApps\eCurring\Resource\SubscriptionTransactionCollection;
13
use LauLamanApps\eCurring\Resource\Transaction;
14
use LauLamanApps\eCurring\Resource\Transaction\PaymentMethod;
15
use LauLamanApps\eCurring\Resource\Transaction\Status;
16
use LauLamanApps\eCurring\Resource\TransactionCollection;
17
use Money\Money;
18
use Ramsey\Uuid\Uuid;
19
20
final class TransactionFactory extends AbstractFactory implements TransactionFactoryInterface
21
{
22
    /**
23
     * @var EventFactoryInterface
24
     */
25
    private $eventFactory;
26
27
    public function __construct(EventFactoryInterface $eventFactory)
28
    {
29
        $this->eventFactory = $eventFactory;
30
    }
31
32
    public function fromArray(eCurringClientInterface $client, array $data, Pagination $page): TransactionCollection
33
    {
34
        $transactions = [];
35
        foreach ($data['data'] as $data) {
36
            $transactions[] = $this->fromData($data);
37
        }
38
        $totalPages = $this->extractInteger('total', $data['meta']);
39
40
        return new TransactionCollection($client, $page->getNumber(), $totalPages, $transactions);
41
    }
42
43
    public function fromSubscriptionArray(eCurringClientInterface $client, array $data, Subscription $subscription, Pagination $page): SubscriptionTransactionCollection
44
    {
45
        $transactions = [];
46
        foreach ($data['data'] as $data) {
47
            $transactions[] = $this->fromData($data);
48
        }
49
        $totalPages = $this->extractInteger('total', $data['meta']);
50
51
        return new SubscriptionTransactionCollection($subscription, $client, $page->getNumber(), $totalPages, $transactions);
52
    }
53
54
    public function fromData(array $data): Transaction
55
    {
56
        return Transaction::fromData(
57
            Uuid::fromString($data['id']),
58
            Status::get($data['attributes']['status']),
59
            new DateTimeImmutable($data['attributes']['scheduled_on']),
60
            Money::EUR($this->extractFloat('amount', $data['attributes'])*100),
61
            PaymentMethod::get($data['attributes']['payment_method']),
62
            $this->extractDateTimeImmutableOrNull('due_date', $data['attributes']),
63
            $this->extractDateTimeImmutableOrNull('canceled_on', $data['attributes']),
64
            $this->extractStringOrNull('webhook_url', $data['attributes']),
65
            ...$this->eventFactory->fromArray($data['attributes']['history'])
66
        );
67
    }
68
}
69