Passed
Pull Request — master (#141)
by
unknown
11:36
created

EndToEndTest::testProprietaryBankTransactionCode()   A

Complexity

Conditions 5
Paths 5

Size

Total Lines 30
Code Lines 19

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 5
eloc 19
nc 5
nop 0
dl 0
loc 30
rs 9.3222
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Genkgo\TestCamt\Unit\Camt052;
6
7
use DateTimeImmutable;
8
use DOMDocument;
9
use Genkgo\Camt\Camt052\DTO as Camt052DTO;
10
use Genkgo\Camt\Camt052\MessageFormat;
11
use Genkgo\Camt\DTO;
12
use Genkgo\Camt\DTO\Entry;
13
use Genkgo\Camt\DTO\Message;
14
use Genkgo\Camt\DTO\OrganisationIdentification;
15
use PHPUnit\Framework;
16
17
class EndToEndTest extends Framework\TestCase
18
{
19
    protected function getV1Message(): Message
20
    {
21
        $dom = new DOMDocument('1.0', 'UTF-8');
22
        $dom->load('test/data/camt052.v1.xml');
23
24
        return (new MessageFormat\V01())->getDecoder()->decode($dom);
25
    }
26
27
    protected function getV2Message(): Message
28
    {
29
        $dom = new DOMDocument('1.0', 'UTF-8');
30
        $dom->load('test/data/camt052.v2.xml');
31
32
        return (new MessageFormat\V02())->getDecoder()->decode($dom);
33
    }
34
35
    protected function getV2OtherAccountMessage(): Message
36
    {
37
        $dom = new DOMDocument('1.0', 'UTF-8');
38
        $dom->load('test/data/camt052.v2.other-account.xml');
39
40
        return (new MessageFormat\V02())->getDecoder()->decode($dom);
41
    }
42
43
    protected function getV4Message(): Message
44
    {
45
        $dom = new DOMDocument('1.0', 'UTF-8');
46
        $dom->load('test/data/camt052.v4.xml');
47
48
        return (new MessageFormat\V04())->getDecoder()->decode($dom);
49
    }
50
51
    protected function getV6Message(): Message
52
    {
53
        $dom = new DOMDocument('1.0', 'UTF-8');
54
        $dom->load('test/data/camt052.v6.xml');
55
56
        return (new MessageFormat\V06())->getDecoder()->decode($dom);
57
    }
58
59
    public function testGroupHeader(): void
60
    {
61
        $messages = [
62
            $this->getV1Message(),
63
            $this->getV2Message(),
64
            $this->getV4Message(),
65
            $this->getV6Message(),
66
        ];
67
68
        /** @var Message $message */
69
        foreach ($messages as $message) {
70
            $groupHeader = $message->getGroupHeader();
71
72
            self::assertInstanceOf(DTO\GroupHeader::class, $groupHeader);
73
            self::assertEquals('AAAASESS-FP-ACCR001', $groupHeader->getMessageId());
74
            self::assertEquals(new DateTimeImmutable('2007-10-18T12:30:00+01:00'), $groupHeader->getCreatedOn());
75
            self::assertEquals('Group header additional information', $groupHeader->getAdditionalInformation());
76
            $msgRecipient = $groupHeader->getMessageRecipient();
77
            self::assertInstanceOf(DTO\Recipient::class, $msgRecipient);
78
            self::assertEquals('COMPANY BVBA', $msgRecipient->getName());
79
            self::assertEquals('NL', $msgRecipient->getCountryOfResidence());
80
            self::assertInstanceOf(DTO\Address::class, $msgRecipient->getAddress());
81
            self::assertEquals('12 Oxford Street', $msgRecipient->getAddress()->getStreetName());
82
            self::assertEquals('UK', $msgRecipient->getAddress()->getCountry());
83
84
            /** @var OrganisationIdentification $identification */
85
            $identification = $msgRecipient->getIdentification();
86
            self::assertInstanceOf(DTO\Identification::class, $identification);
87
            self::assertEquals('DABAIE2D', $identification->getBic());
88
            self::assertEquals('Some other Id', $identification->getOtherId());
89
            self::assertEquals('Some other Issuer', $identification->getOtherIssuer());
90
        }
91
    }
92
93
    public function testReports(): void
94
    {
95
        $messages = [
96
            $this->getV1Message(),
97
            $this->getV2Message(),
98
            $this->getV4Message(),
99
        ];
100
101
        foreach ($messages as $message) {
102
            $reports = $message->getRecords();
103
104
            self::assertCount(1, $reports);
105
            foreach ($reports as $report) {
106
                self::assertInstanceOf(Camt052DTO\Report::class, $report);
107
                self::assertEquals('AAAASESS-FP-ACCR001', $report->getId());
108
                self::assertEquals('CH2801234000123456789', $report->getAccount()->getIdentification());
109
                self::assertEquals(new DateTimeImmutable('2007-10-18T12:30:00+01:00'), $report->getCreatedOn());
110
                self::assertEquals('12312', $report->getElectronicSequenceNumber());
111
                self::assertEquals('12312', $report->getLegalSequenceNumber());
112
                self::assertEquals('CODU', $report->getCopyDuplicateIndicator());
113
                self::assertEquals(new DateTimeImmutable('2007-10-18T08:00:00+01:00'), $report->getFromDate());
114
                self::assertEquals(new DateTimeImmutable('2007-10-18T12:30:00+01:00'), $report->getToDate());
115
                self::assertEquals('Additional Information', $report->getAdditionalInformation());
116
            }
117
        }
118
    }
119
120
    public function testEntries(): void
121
    {
122
        $messages = [
123
            $this->getV1Message(),
124
            $this->getV2Message(),
125
            $this->getV4Message(),
126
        ];
127
128
        foreach ($messages as $message) {
129
            $reports = $message->getRecords();
130
131
            self::assertCount(1, $reports);
132
            foreach ($reports as $report) {
133
                $entries = $report->getEntries();
134
                self::assertCount(1, $entries);
135
136
                foreach ($entries as $entry) {
137
                    self::assertEquals(-20000000, $entry->getAmount()->getAmount());
138
                    self::assertEquals('SEK', $entry->getAmount()->getCurrency()->getCode());
139
                    self::assertEquals('2007-10-18', $entry->getBookingDate()->format('Y-m-d'));
140
                    self::assertEquals('2007-10-18', $entry->getValueDate()->format('Y-m-d'));
141
                    self::assertEquals('Credit', $entry->getAdditionalInfo());
142
                }
143
            }
144
        }
145
146
        $reportV4 = $messages[2]->getRecords()[0];
147
        self::assertInstanceOf(DTO\Pagination::class, $reportV4->getPagination());
148
        self::assertEquals('2', $reportV4->getPagination()->getPageNumber());
149
        self::assertTrue($reportV4->getPagination()->isLastPage());
150
    }
151
152
    public function testStatuses(): void
153
    {
154
        $messages = [
155
            $this->getV1Message(),
156
            $this->getV4Message(),
157
        ];
158
159
        self::assertEquals('BOOK', $messages[0]->getRecords()[0]->getEntries()[0]->getStatus());
160
        self::assertEquals('PDNG', $messages[1]->getRecords()[0]->getEntries()[0]->getStatus());
161
    }
162
163
    public function testRelatedAgents(): void
164
    {
165
        $messages = [
166
            $this->getV2Message(),
167
        ];
168
169
        foreach ($messages as $message) {
170
            $reports = $message->getRecords();
171
172
            self::assertCount(1, $reports);
173
            foreach ($reports as $report) {
174
                $entries = $report->getEntries();
175
                self::assertCount(1, $entries);
176
177
                /** @var Entry $entry */
178
                foreach ($entries as $entry) {
179
                    self::assertCount(1, $entry->getTransactionDetails());
180
                    foreach ($entry->getTransactionDetails() as $detail) {
181
                        self::assertCount(2, $detail->getRelatedAgents());
182
183
                        foreach ($detail->getRelatedAgents() as $relatedAgent) {
184
                            self::assertEquals('BANKCHZHXXX', $relatedAgent->getRelatedAgentType()->getBIC());
185
                            self::assertEquals('Some bank', $relatedAgent->getRelatedAgentType()->getName());
186
                        }
187
                    }
188
                }
189
            }
190
        }
191
    }
192
193
    public function testOtherAccount(): void
194
    {
195
        $messages = [
196
            $this->getV2OtherAccountMessage(),
197
        ];
198
199
        foreach ($messages as $message) {
200
            $reports = $message->getRecords();
201
202
            self::assertCount(1, $reports);
203
            foreach ($reports as $report) {
204
                $entries = $report->getEntries();
205
                self::assertCount(1, $entries);
206
207
                /** @var Entry $entry */
208
                foreach ($entries as $entry) {
209
                    $parties = $entry->getTransactionDetail()->getRelatedParties();
210
211
                    foreach ($parties as $party) {
212
                        self::assertInstanceOf(DTO\OtherAccount::class, $party->getAccount());
213
                    }
214
                }
215
            }
216
        }
217
    }
218
219
    public function testRelatedParties(): void
220
    {
221
        $messages = [
222
            $this->getV2Message(),
223
        ];
224
225
        foreach ($messages as $message) {
226
            $reports = $message->getRecords();
227
228
            self::assertCount(1, $reports);
229
            foreach ($reports as $report) {
230
                $entries = $report->getEntries();
231
                self::assertCount(1, $entries);
232
233
                foreach ($entries as $entry) {
234
                    $details = $entry->getTransactionDetails();
235
                    self::assertCount(1, $details);
236
237
                    foreach ($details as $detail) {
238
                        $parties = $detail->getRelatedParties();
239
                        self::assertCount(2, $parties);
240
241
                        foreach ($parties as $party) {
242
                            if ($party->getRelatedPartyType() instanceof DTO\Creditor) {
243
                                self::assertEquals('Company Name', $party->getRelatedPartyType()->getName());
244
                                self::assertEquals('NL', $party->getRelatedPartyType()->getAddress()->getCountry());
245
                                self::assertEquals([], $party->getRelatedPartyType()->getAddress()->getAddressLines());
246
                                self::assertEquals('NL56AGDH9619008421', (string) $party->getAccount()->getIdentification());
247
                            } elseif ($party->getRelatedPartyType() instanceof DTO\Debtor) {
248
                                self::assertEquals('NAME NAME', $party->getRelatedPartyType()->getName());
249
                                self::assertEquals('NL', $party->getRelatedPartyType()->getAddress()->getCountry());
250
                                self::assertEquals(['ADDR ADDR 10', '2000 ANTWERPEN'], $party->getRelatedPartyType()->getAddress()->getAddressLines());
251
                                self::assertEquals('NL56AGDH9619008421', (string) $party->getAccount()->getIdentification());
252
                            }
253
                        }
254
                    }
255
                }
256
            }
257
        }
258
    }
259
260
    public function testProprietaryBankTransactionCode(): void
261
    {
262
        $messages = [
263
            $this->getV2Message(),
264
        ];
265
266
        foreach ($messages as $message) {
267
            $reports = $message->getRecords();
268
269
            self::assertCount(1, $reports);
270
            foreach ($reports as $report) {
271
                $entries = $report->getEntries();
272
                self::assertCount(1, $entries);
273
274
                /** @var Entry $entry */
275
                foreach ($entries as $entry) {
276
                    self::assertInstanceOf(DTO\BankTransactionCode::class, $entry->getBankTransactionCode());
277
                    self::assertInstanceOf(DTO\ProprietaryBankTransactionCode::class, $entry->getBankTransactionCode()->getProprietary());
278
279
                    self::assertEquals('XXXX+000+0000+000', $entry->getBankTransactionCode()->getProprietary()->getCode());
280
                    self::assertEquals('ZKA', $entry->getBankTransactionCode()->getProprietary()->getIssuer());
281
282
                    self::assertCount(1, $entry->getTransactionDetails());
283
284
                    foreach ($entry->getTransactionDetails() as $details) {
285
                        self::assertInstanceOf(DTO\BankTransactionCode::class, $details->getBankTransactionCode());
286
                        self::assertInstanceOf(DTO\ProprietaryBankTransactionCode::class, $details->getBankTransactionCode()->getProprietary());
287
288
                        self::assertEquals('XXXX+000+0000+000', $details->getBankTransactionCode()->getProprietary()->getCode());
289
                        self::assertEquals('ZKA', $details->getBankTransactionCode()->getProprietary()->getIssuer());
290
                    }
291
                }
292
            }
293
        }
294
    }
295
}
296