Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make the lib php 8 ready and improve entry date calculation #1

Open
wants to merge 6 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,11 @@
}
],
"require": {
"php": ">=7",
"php": ">=8",
"ext-json": "*"
},
"require-dev": {
"phpunit/phpunit": "4.4.*"
"phpunit/phpunit": "^9.5"
},
"autoload": {
"psr-4": {
Expand Down
68 changes: 68 additions & 0 deletions src/Banking/Statement.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,10 @@ class Statement implements \JsonSerializable
{
private $bank = '';
private $account = '';
private $bankCode = '';
private $accountNumber = '';
private $iban = '';
private $swiftCode = '';
private $transactions = [];
private $startPrice = 0.0;
private $endPrice = 0.0;
Expand Down Expand Up @@ -44,6 +48,22 @@ public function setAccount($var)
$this->account = (string)$var;
}

/**
* @param string $bankCode
*/
public function setBankCode(string $bankCode): void
{
$this->bankCode = $bankCode;
}

/**
* @param string $iban
*/
public function setIban(string $iban): void
{
$this->iban = $iban;
}

/**
* @param Transaction[] $transactions
*/
Expand Down Expand Up @@ -220,4 +240,52 @@ public function getDeltaPrice()
{
return $this->getStartPrice() - $this->getEndPrice();
}

/**
* @return string
*/
public function getBankCode(): string
{
return $this->bankCode;
}

/**
* @return string
*/
public function getIban(): string
{
return $this->iban;
}

/**
* @return string
*/
public function getSwiftCode(): string
{
return $this->swiftCode;
}

/**
* @param string $swiftCode
*/
public function setSwiftCode(string $swiftCode): void
{
$this->swiftCode = $swiftCode;
}

/**
* @return string
*/
public function getAccountNumber(): string
{
return $this->accountNumber;
}

/**
* @param string $accountNumber
*/
public function setAccountNumber(string $accountNumber): void
{
$this->accountNumber = $accountNumber;
}
}
17 changes: 17 additions & 0 deletions src/Banking/Transaction.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ class Transaction implements \JsonSerializable
private $valueTimestamp = 0;
private $entryTimestamp = 0;
private $transactionCode = '';
private $fingerprint = '';

/**
* @return array
Expand Down Expand Up @@ -203,4 +204,20 @@ public function isCancellation()
{
return $this->cancellation;
}

/**
* @return string
*/
public function getFingerprint(): string
{
return $this->fingerprint;
}

/**
* @param string $fingerprint
*/
public function setFingerprint(string $fingerprint): void
{
$this->fingerprint = $fingerprint;
}
}
69 changes: 64 additions & 5 deletions src/Parser/Banking/Mt940/Engine.php
Original file line number Diff line number Diff line change
Expand Up @@ -110,8 +110,6 @@ private static function detectBank($string)
}
}

trigger_error('Unknown mt940 parser loaded, thus reverted to default');

return new Engine\Unknown();
}

Expand Down Expand Up @@ -141,6 +139,8 @@ public function parse()
}
$statement->setBank($this->parseStatementBank());
$statement->setAccount($this->parseStatementAccount());
$statement->setBankCode($this->parseBankCode());
$statement->setAccountNumber($this->parseAccountNumber());
$statement->setStartPrice($this->parseStatementStartPrice());
$statement->setEndPrice($this->parseStatementEndPrice());
$statement->setStartTimestamp($this->parseStatementStartTimestamp());
Expand All @@ -162,6 +162,7 @@ public function parse()
$transaction->setValueTimestamp($this->parseTransactionValueTimestamp());
$transaction->setEntryTimestamp($this->parseTransactionEntryTimestamp());
$transaction->setTransactionCode($this->parseTransactionCode());
$transaction->setFingerprint($this->calculateTransactionFingerprint());
$statement->addTransaction($transaction);
}
$results[] = $statement;
Expand Down Expand Up @@ -266,6 +267,28 @@ protected function parseStatementAccount()
return '';
}

protected function parseBankCode()
{
$results = [];
if (preg_match('/:25:([A-Z0-9]{8})\/([\d\.]+)*/', $this->getCurrentStatementData(), $results)
&& !empty($results[1])
) {
return $results[1];
}
return '';
}

protected function parseAccountNumber()
{
$results = [];
if (preg_match('/:25:([A-Z0-9]*)\/([\d\.]+)*/', $this->getCurrentStatementData(), $results)
&& !empty($results[2])
) {
return ltrim($results[2], '0');
}
return '';
}

/**
* uses field 60F to gather starting amount.
*
Expand Down Expand Up @@ -490,7 +513,20 @@ protected function parseTransactionDescription()
*/
protected function parseTransactionEntryTimestamp()
{
return $this->parseTransactionTimestamp('61');
$results = [];
if (preg_match('/^:61:(\d{2})((\d{2})\d{2})((\d{2})\d{2})[C|D]/', $this->getCurrentTransactionData(), $results)
&& !empty($results[1])
) {

list(, $valueDateY, $valueDateMD, $valueDateM, $entryDateMD, $entryDateM) = $results;
$entryDate = $valueDateY . $entryDateMD;
if ($valueDateMD !== $entryDateMD && $valueDateM > $entryDateM) {
$entryDate = ($valueDateY + 1) . $entryDateMD;
}

return $this->sanitizeTimestamp($entryDate, 'ymd');
}
return $this->parseTransactionValuta('61');
}

/**
Expand All @@ -500,7 +536,7 @@ protected function parseTransactionEntryTimestamp()
*/
protected function parseTransactionValueTimestamp()
{
return $this->parseTransactionTimestamp('61');
return $this->parseTransactionValuta('61');
}

/**
Expand All @@ -509,7 +545,7 @@ protected function parseTransactionValueTimestamp()
* @param string $key
* @return int
*/
protected function parseTransactionTimestamp($key)
protected function parseTransactionValuta($key)
{
$results = [];
if (preg_match('/^:' . $key . ':(\d{6})/', $this->getCurrentTransactionData(), $results)
Expand Down Expand Up @@ -537,6 +573,29 @@ protected function parseTransactionCode()
return '';
}

protected function getField(string $code)
{
$results = [];
if (preg_match("/:$code:(.*?):\d\d.?:/s", $this->getCurrentTransactionData(), $results)
&& !empty($results[1])
) {
return trim($results[1]);
}
if (preg_match("/:$code:(.*)/s", $this->getCurrentTransactionData(), $results)
&& !empty($results[1])
) {
return trim($results[1]);
}
throw new \InvalidArgumentException("could not get MTA940 field with code $code");
}

protected function calculateTransactionFingerprint()
{
$field86 = $this->getField('86');
$field61 = $this->getField('61');
return hash('sha256', $field61 . $field86);
}

/**
* @param string $string
*
Expand Down
52 changes: 3 additions & 49 deletions test/Banking/StatementTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@

namespace Kingsquare\Banking;

use PHPUnit\Framework\TestCase;

/**
*
*/
class StatementTest extends \PHPUnit_Framework_TestCase
class StatementTest extends TestCase
{
public function testBankAssesor()
{
Expand Down Expand Up @@ -151,52 +153,4 @@ public function testJsonSerialization()
}
$this->assertSame($expected, json_encode($statement));
}

/**
* @depends testJsonSerialization
* @expectedException PHPUnit_Framework_Error_Deprecated
*/
public function testJsonSerializationWithTransactions()
{
$expected = '{"bank":"ABN","account":"62.90.64.393","transactions":[{"account":"123123","accountName":'.
'"Kingsquare BV","price":110,"debitcredit":"D","description":"test","valueTimestamp":1231,"entryTimestamp"'.
':1234,"transactionCode":"13G"},{"account":"123123","accountName":"Kingsquare BV","price":110,"debitcredit"'.
':"D","description":"test","valueTimestamp":1231,"entryTimestamp":1234,"transactionCode":"13G"}],'.
'"startPrice":16250,"endPrice":6250,"number":"2665487AAF"}';
$params = [
'bank' => 'ABN',
'account' => '62.90.64.393',
'transactions' => [
[
'account' => '123123',
'accountName' => 'Kingsquare BV',
'price' => 110.0,
'debitcredit' => Transaction::DEBIT,
'description' => 'test',
'valueTimestamp' => 1231,
'entryTimestamp' => 1234,
'transactionCode' => '13G',
],
[
'account' => '123123',
'accountName' => 'Kingsquare BV',
'price' => 110.0,
'debitcredit' => Transaction::DEBIT,
'description' => 'test',
'valueTimestamp' => 1231,
'entryTimestamp' => 1234,
'transactionCode' => '13G',
],
],
'startPrice' => 16250,
'endPrice' => 6250,
'timestamp' => 123,
'number' => '2665487AAF',
];
$statement = new Statement();
foreach ($params as $key => $value) {
$statement->{'set'.$key}($value);
}
$this->assertSame($expected, json_encode($statement));
}
}
4 changes: 3 additions & 1 deletion test/Banking/TransactionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@

namespace Kingsquare\Banking;

use PHPUnit\Framework\TestCase;

/**
* @author Kingsquare ([email protected])
* @copyright Copyright (c) Kingsquare BV (http://www.kingsquare.nl)
*/
class TransactionTest extends \PHPUnit_Framework_TestCase
class TransactionTest extends TestCase
{
public function testAccountAssesor()
{
Expand Down
3 changes: 2 additions & 1 deletion test/Parser/Banking/Mt940/CurrencyTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

use Kingsquare\Banking\Statement;
use Kingsquare\Parser\Banking\Mt940\Engine;
use PHPUnit\Framework\TestCase;

class SingleStatementEngine extends Engine
{
Expand All @@ -16,7 +17,7 @@ protected function parseStatementData()
/**
*
*/
class CurrencyTest extends \PHPUnit_Framework_TestCase
class CurrencyTest extends TestCase
{
/**
* @dataProvider singleStatementProvider
Expand Down
4 changes: 3 additions & 1 deletion test/Parser/Banking/Mt940/DebitCreditTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@

namespace Kingsquare\Parser\Banking\Mt940\Engine;

use PHPUnit\Framework\TestCase;

/**
*
*/
class DebitCreditTest extends \PHPUnit_Framework_TestCase
class DebitCreditTest extends TestCase
{
/**
* @dataProvider statementProvider
Expand Down
5 changes: 3 additions & 2 deletions test/Parser/Banking/Mt940/Engine/Abn/ParseTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,19 @@
namespace Kingsquare\Parser\Banking\Mt940\Engine\Abn;

use Kingsquare\Parser\Banking\Mt940\Engine\Abn;
use PHPUnit\Framework\TestCase;

/**
*
*/
class ParseTest extends \PHPUnit_Framework_TestCase
class ParseTest extends TestCase
{
/**
* @var Abn
*/
private $engine;

protected function setUp()
protected function setUp(): void
{
$this->engine = new Abn();
$this->engine->loadString(file_get_contents(__DIR__.'/sample'));
Expand Down
2 changes: 1 addition & 1 deletion test/Parser/Banking/Mt940/Engine/Abn/issue48
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,4 @@ IDED
2.2016/IBAN/NL37DEUT0123456789/BIC/DEUTNL2AXXX/EREF/0123456789123
61000
:62F:C161215EUR1171,6
-
-
Loading