Completed
Pull Request — master (#11)
by Laurens
01:46
created

PurchaseBuilder::build()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 24
Code Lines 20

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 20
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 24
ccs 20
cts 20
cp 1
rs 8.9713
c 0
b 0
f 0
cc 1
eloc 20
nc 1
nop 1
crap 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace LauLamanApps\IzettleApi\Client\Purchase;
6
7
use DateTime;
8
use LauLamanApps\IzettleApi\API\Purchase\Coordinates;
9
use LauLamanApps\IzettleApi\API\Purchase\Purchase;
10
use LauLamanApps\IzettleApi\API\Purchase\PurchaseHistory;
11
use LauLamanApps\IzettleApi\API\Purchase\User;
12
use Money\Currency;
13
use Money\Money;
14
use Ramsey\Uuid\Uuid;
15
16
final class PurchaseBuilder implements PurchaseBuilderInterface
17
{
18
    private $coordinatesBuilder;
19
    private $productBuilder;
20
    private $paymentBuilder;
21
    private $vatBuilder;
22
23 5
    public function __construct(
24
        CoordinatesBuilderInterface $coordinatesBuilder,
25
        ProductBuilderInterface $productBuilder,
26
        PaymentBuilderInterface $paymentBuilder,
27
        VatBuilderInterface $vatBuilder
28
    ) {
29 5
        $this->coordinatesBuilder = $coordinatesBuilder;
30 5
        $this->productBuilder = $productBuilder;
31 5
        $this->paymentBuilder = $paymentBuilder;
32 5
        $this->vatBuilder = $vatBuilder;
33 5
    }
34
35
    /**
36
     * @return Purchase[]
37
     */
38 2
    public function buildFromArray(array $purchases): array
39
    {
40 2
        $data = [];
41
42 2
        foreach ($purchases as $purchase) {
43 2
            $data[] = $this->build($purchase);
44
        }
45
46 2
        return $data;
47
    }
48
49 2
    public function buildFromJson(string $jsonData): Purchase
50
    {
51 2
        $data = json_decode($jsonData, true);
52
53 2
        return $this->build($data);
54
    }
55
56 4
    public function build(array $data): Purchase
57
    {
58 4
        $currency = new Currency($data['currency']);
59
60 4
        return new Purchase(
61 4
            $data['purchaseUUID'],
62 4
            Uuid::fromString($data['purchaseUUID1']),
63 4
            new DateTime($data['timestamp']),
64 4
            $this->getCoordinatesFromKey('gpsCoordinates', $data),
65 4
            $data['country'],
66 4
            new User($data['userId'], $data['userDisplayName']),
67 4
            $data['organizationId'],
68 4
            $data['purchaseNumber'],
69 4
            new Money($data['amount'], $currency),
70 4
            new Money($data['vatAmount'], $currency),
71 4
            $this->productBuilder->buildFromArray($data['products'], $currency),
72 4
            $this->paymentBuilder->buildFromArray($data['payments'], $currency),
73 4
            $this->vatBuilder->buildFromArray($data['groupedVatAmounts'], $currency),
74 4
            $data['receiptCopyAllowed'],
75 4
            $this->getBoolFromKey('published', $data),
76 4
            $data['refund'],
77 4
            $data['refunded']
78
        );
79
    }
80
81 4
    private function getBoolFromKey($key, array $data): ?bool
82
    {
83 4
        if (!array_key_exists($key, $data)) {
84 1
            return null;
85
        }
86
87 4
        return $data[$key];
88
    }
89
90 4
    private function getCoordinatesFromKey($key, array $data): ?Coordinates
91
    {
92 4
        if (!array_key_exists($key, $data)) {
93 1
            return null;
94
        }
95
96 4
        return $this->coordinatesBuilder->buildFromArray($data[$key]);
97
    }
98
}
99