Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
95.00% covered (success)
95.00%
38 / 40
50.00% covered (danger)
50.00%
1 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
SkCsobMailParser
95.00% covered (success)
95.00%
38 / 40
50.00% covered (danger)
50.00%
1 / 2
11
0.00% covered (danger)
0.00%
0 / 1
 parseMulti
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
1 / 1
3
 parse
93.94% covered (success)
93.94%
31 / 33
0.00% covered (danger)
0.00%
0 / 1
8.01
1<?php
2declare(strict_types=1);
3
4namespace Tomaj\BankMailsParser\Parser\Csob;
5
6use Tomaj\BankMailsParser\MailContent;
7use Tomaj\BankMailsParser\Parser\ParserInterface;
8
9class SkCsobMailParser implements ParserInterface
10{
11    /**
12     * @return MailContent[]
13     */
14    public function parseMulti(string $content): array
15    {
16        $transactions = array_slice(explode("dňa ", $content), 1);
17
18        $mailContents = [];
19        foreach ($transactions as $transaction) {
20            $mailContent = $this->parse($transaction);
21            if ($mailContent !== null) {
22                $mailContents[] = $mailContent;
23            }
24        }
25
26        return $mailContents;
27    }
28
29    public function parse(string $content): ?MailContent
30    {
31        $mailContent = new MailContent();
32
33        $pattern1 = '/(.*) bola na účte (.*) zaúčtovaná suma SEPA platobného príkazu/m';
34        $res = preg_match($pattern1, $content, $result);
35        if (!$res) {
36            return null;
37        }
38
39        $mailContent->setTransactionDate(strtotime($result[1]));
40
41        $pattern2 = '/suma:.*?([+-])(.*?) ([A-Z]+)/m';
42        $res = preg_match($pattern2, $content, $result);
43        if ($res) {
44            // there's unicode non-breaking space (u00A0) in mime encoded version of email, unicode regex switched is necessary
45            $amount = floatval(str_replace(',', '.', preg_replace('/\s+/u', '', $result[2])));
46            $currency = $result[3];
47            if ($result[1] === '-') {
48                $amount = -$amount;
49            }
50            $mailContent->setAmount($amount);
51            $mailContent->setCurrency($currency);
52        }
53
54        $pattern3 = '/informácia pre príjemcu: (.*)/m';
55        $res = preg_match($pattern3, $content, $result);
56        if ($res) {
57            $mailContent->setReceiverMessage(trim($result[1]));
58        }
59
60        $pattern4 = '/VS([0-9]+)/m';
61        $res = preg_match($pattern4, $content, $result);
62        if ($res) {
63            $mailContent->setVs($result[1]);
64        }
65
66        $pattern5 = '/KS([0-9]+)/m';
67        $res = preg_match($pattern5, $content, $result);
68        if ($res) {
69            $mailContent->setKs($result[1]);
70        }
71
72        $pattern6 = '/z účtu:.*?([A-Z0-9 ]+)/m';
73        $res = preg_match($pattern6, $content, $result);
74        if ($res) {
75            $iban = trim($result[1]);
76            $mailContent->setAccountNumber($iban);
77        }
78
79        return $mailContent;
80    }
81}