MonetaryAccountService::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 1
1
<?php declare(strict_types = 1);
2
3
namespace Link0\Bunq\Service;
4
5
use Link0\Bunq\Client;
6
use Link0\Bunq\Domain\Id;
7
use Link0\Bunq\Domain\MonetaryAccountBank;
8
use Link0\Bunq\Domain\NotificationFilter;
9
use Link0\Bunq\Domain\User;
10
use Link0\Bunq\Domain\UserPerson;
11
use Money\Money;
12
13
final class MonetaryAccountService
14
{
15
    /**
16
     * @var Client
17
     */
18
    private $client;
19
20
    /**
21
     * @param Client $client
22
     */
23
    public function __construct(Client $client)
24
    {
25
        $this->client = $client;
26
    }
27
28
    /**
29
     * @param Id $id
30
     * @return MonetaryAccountBank
31
     */
32
    public function byUserAndId(User $user, Id $id): MonetaryAccountBank
33
    {
34
        return $this->client->get('user/' . $user->id() . '/monetary-account/' . $id)[0];
35
    }
36
37
    /**
38
     * @param User $user
39
     * @return MonetaryAccountBank[]
40
     */
41
    public function listByUser(User $user)
42
    {
43
        return $this->client->get('user/' . $user->id() . '/monetary-account');
44
    }
45
46
    /**
47
     * @param MonetaryAccountBank $monetaryAccount
48
     * @return void
49
     */
50
    public function changeDescription(MonetaryAccountBank $monetaryAccount, string $description)
51
    {
52
        $this->updateMonetaryAccount($monetaryAccount, [
53
            'description' => $description,
54
        ]);
55
    }
56
57
    public function changeDailyLimit(MonetaryAccountBank $monetaryAccount, Money $dailyLimit)
58
    {
59
        $this->updateMonetaryAccount($monetaryAccount, [
60
            'daily_limit' => [
61
                'value' => $dailyLimit->getAmount(),
62
                'currency' => $dailyLimit->getCurrency()->getCode(),
63
            ],
64
        ]);
65
    }
66
67
    /**
68
     * @param MonetaryAccountBank $monetaryAccountBank
69
     * @return void
70
     */
71
    public function closeAccount(MonetaryAccountBank $monetaryAccountBank, string $reason = '')
72
    {
73
        $fields = [
74
            'status' => MonetaryAccountBank::STATUS_CANCELLED,
75
            'sub_status' => MonetaryAccountBank::SUBSTATUS_REDEMPTION_VOLUNTARY,
76
        ];
77
78
        if ($reason !== '') {
79
            $fields['reason'] = MonetaryAccountBank::REASON_OTHER;
80
            $fields['reason_description'] = $reason;
81
        }
82
83
        $this->updateMonetaryAccount($monetaryAccountBank, $fields);
84
    }
85
86
    public function reopenAccount(MonetaryAccountBank $monetaryAccountBank)
87
    {
88
        $this->updateMonetaryAccount($monetaryAccountBank, [
89
            'status' => MonetaryAccountBank::STATUS_PENDING_REOPEN,
90
            'sub_status' => MonetaryAccountBank::SUBSTATUS_NONE,
91
        ]);
92
    }
93
94
    /**
95
     * @param MonetaryAccountBank $monetaryAccountBank
96
     * @param NotificationFilter $notificationFilter
97
     * @return void
98
     */
99
    public function addNotificationFilter(MonetaryAccountBank $monetaryAccountBank, NotificationFilter $notificationFilter)
100
    {
101
        $notificationFilters = $monetaryAccountBank->notificationFilters();
102
        $notificationFilters[] = $notificationFilter;
103
104
        $this->updateNotificationFilters($monetaryAccountBank, $notificationFilters);
105
    }
106
107
    /**
108
     * @param MonetaryAccountBank $monetaryAccountBank
109
     * @param NotificationFilter $notificationFilter
110
     * @return void
111
     */
112
    public function removeNotificationFilter(MonetaryAccountBank $monetaryAccountBank, NotificationFilter $notificationFilter)
113
    {
114
        $notificationFilters = $monetaryAccountBank->notificationFilters();
115
        foreach ($notificationFilters as $key => $value) {
116
            // Remove by reference
117
            if ($value === $notificationFilter) {
118
                unset($notificationFilters[$key]);
119
            }
120
        }
121
122
        $this->updateNotificationFilters($monetaryAccountBank, $notificationFilters);
123
    }
124
125
    private function updateMonetaryAccount(MonetaryAccountBank $monetaryAccountBank, array $newFields)
126
    {
127
        $endpoint = 'user/' . $monetaryAccountBank->userId() . '/monetary-account-bank/' . $monetaryAccountBank->id();
128
        return $this->client->put($endpoint, $newFields);
129
    }
130
131
    /**
132
     * @param MonetaryAccountBank $monetaryAccountBank
133
     * @param $notificationFilters
134
     * @return void
135
     */
136
    private function updateNotificationFilters(MonetaryAccountBank $monetaryAccountBank, $notificationFilters)
137
    {
138
        $this->updateMonetaryAccount($monetaryAccountBank, [
139
            'notification_filters' => array_map(function (NotificationFilter $notificationFilter) {
140
                return $notificationFilter->toArray();
141
            }, $notificationFilters),
142
        ]);
143
    }
144
}
145