imetal / mt940
PHP的MT940银行对账单解析器
Requires
- php: >=7.2.0||^8.0
Requires (Dev)
README
PHP的MT940银行对账单解析器
安装
您可以使用Composer安装imetal/mt940。您可以在Packagist主页上阅读有关Composer及其主要仓库的更多信息。首先根据Packagist主页上的说明为您的项目安装Composer,然后在您的composer.json
文件中定义对imetal/mt940的依赖。
composer require imetal/mt940
此库遵循PSR-0标准。您需要一个符合PSR-0的自动加载器来加载imetal/mt940类。Composer为您提供了vendor/.composer/autoload.php
中的自动加载器。
PSR-12标准用于代码语法。
使用方法
<?php use Jejik\MT940\Reader; $reader = new Reader(); $statements = $reader->getStatements(file_get_contents('mt940.txt')); foreach ($statements as $statement) { echo $statement->getOpeningBalance()->getAmount() . "\n"; foreach ($statement->getTransactions() as $transaction) { echo $transaction->getAmount() . "\n"; } echo $statement->getClosingBalance()->getAmount() . "\n"; }
对账单结构
返回的对账单具有以下属性。并非所有银行都提供所有属性(例如,只有少数银行单独提供交易账簿日期)。未提供的属性将是null
。
Jejik\MT940\StatementInterface
getNumber()
对账单序列号getAccount()
实现Jejik\MT940\AccountInterface
的对象getOpeningBalance()
实现Jejik\MT940\BalanceInterface
的对象getClosingBalance()
实现Jejik\MT940\BalanceInterface
的对象getTransactions()
实现Jejik\MT940\TransactionInterface
的对象数组
Jejik\MT940\AccountInterface
getNumber()
账号getName()
账户持有人名称
Jejik\MT940\BalanceInterface
getCurrency()
3位ISO 4217货币代码getAmount()
余额金额getDate()
余额日期(作为\DateTime
对象)
Jejik\MT940\TransactionInterface
getContraAccount()
实现Jejik\MT940\AccountInterface
的对象getAmount()
交易金额getDescription()
描述文本getValueDate()
交易日期(作为\DateTime
)getBookDate()
交易记账日期(作为\DateTime
)getCode()
获取此交易的代码getRef()
获取此交易的参考号getBankRef()
获取此交易的银行参考号getGVC()
获取此交易的GVCgetTxText()
获取此交易的txTextgetPrimanota()
获取此交易的primanotagetExtCode()
获取此交易的extCodegetEref()
获取此交易的ERefgetBIC()
获取此交易的BICgetIBAN()
获取此交易的IBANgetAccountHolder()
获取此交易的账户持有人getKref()
获取此交易的KrefgetMref()
获取此交易的MrefgetCred()
获取此交易的CredgetSvwz()
获取此交易的Svwz
支持的银行
目前有以下几个银行的账单解析器
- ABN-AMRO
- Commerzbank
- Deutsche Bank
- German Bank
- ING
- Knab
- Landesbank Berlin
- NuaPay Bank
- Oldenburgische Landesbank
- PostFinance
- Rabobank
- SNS
- Sparkasse
- StarMoney
- Triodos Bank
- UniCredit Bank
添加银行解析器
您可以轻松地将自己的解析器添加到对账单阅读器中。
<?php use Jejik\MT940\Reader; $reader = new Reader(); $reader->addParser('My bank', 'My\Bank');
当您添加自己的解析器时,默认的解析器列表将被清除。如果您想使阅读器也支持它们,则必须将它们添加回来。
<?php /** @var \Jejik\MT940\Reader $reader */ $reader->addParsers($reader->getDefaultParsers());
您还可以在解析器链中的特定位置添加您的解析器。例如,这是在ING解析器之前添加解析器的方法。
<?php /** @var \Jejik\MT940\Reader $reader */ $reader->addParsers($reader->getDefaultParsers()); $reader->addParser('My bank', 'My\Bank', 'ING');
自定义解析器应扩展Jejik\MT940\Parser\AbstractParser
类。查看已实现的解析器以了解如何支持您的银行。至少,您应该实现accept()
方法。
<?php namespace My; use Jejik\MT940\Parser\AbstractParser; class Bank extends AbstractParser { public function accept(string $text): bool { return strpos($text, 'MYBANK') !== false; } }
注入类
您可以轻松扩展内置对象并将它们注入到MT940读取器中。这允许您轻松地将MT940集成到您的应用程序中。例如,通过将报表存储在您的数据库中。您可以使用以下方法注入它们
setStatementClass($className)
默认为Jejik\MT940\Statement
setAccountClass($className)
默认为Jejik\MT940\Account
setContraAccountClass($className)
默认为Jejik\MT940\Account
setTransactionClass($className)
默认为Jejik\MT940\Transaction
setOpeningBalanceClass($className)
默认为Jejik\MT940\Balance
setClosingBalanceClass($className)
默认为Jejik\MT940\Balance
您可以将类名指定为字符串,或提供一个返回对象的PHP可调用对象。您的类不必扩展内置类,但必须实现适当的接口。
为Statement
类传递的可调用对象包含一个AccountInterface
和一个报表序列号作为参数。为Account
类和ContraAccount
类传递的参数是账户号。其他可调用对象不传递任何变量。
如果为Account
类或Statement
类的可调用对象返回null
,则解析器将跳过该报表。
一个示例,将MT940与您的ORM集成
<?php use Jejik\MT940\AccountInterface; use Jejik\MT940\Reader; $db = new ORM(); // Whatever your flavour is... $reader = new Reader(); $reader->setAccountClass(function ($accountNumber) use ($db) { $account = $db::factory('My\Account')->findBy(array( 'number' => $accountNumber, )); return $account ?: new My\Account(); }); $reader->setStatementClass(function (AccountInterface $account, $number) use ($db) { $statement = $db::factory('My\Statement')->findBy(array( 'account' => $account->getNumber(), 'number' => $number, )); return $statement ?: new My\Statement(); }); $reader->setTransactionClass('My\Transaction') ->setContraAccountClass('My\ContraAccount') ->setOpeningBalanceClass('My\OpeningBalance') ->setClosingBalanceClass('My\ClosingBalance'); foreach ($reader->getStatements(file_get_contents('mt940.txt'))) { $statement->save(); }
贡献
如果您为您的银行编写了一个解析器,我很乐意将其添加到默认解析器列表中。只需将包含您的解析器的Pull Request发送给我。请确保您还添加了一个单元测试,用于解析测试文档。您可以从测试文档中删除个人信息(例如,使用'123456789'作为账户号等)。
如果您更愿意让我为您实现解析器,我也很乐意这样做。只需打开一个问题,我将私下联系您。我需要您银行的未修改 MT940文件。它必须未修改,因为MT940定义不佳且可能不可预测。如果您删除了它,则我编写的解析器可能在您提供的文件上工作,但在实际文件上可能不会工作。当然,当我在单元测试中添加文件时,我会为您删除文件。
请不要在问题跟踪器中添加未修改的MT940文件。请私下发送给我。我的电子邮件地址列在源代码文件中。
许可
Jejik\MT940采用MIT许可。有关详细信息,请参阅LICENSE.txt文件。ABN-AMRO、ING、Rabobank和Triodos银行的测试文件来自dovadi/mt940 ruby解析器。其许可证可在LICENSE.fixtures.txt文件中找到。
Sparkasse的测试文件来自Dominic Richter / Powercloud GmbH。Commerzbank、Deutsche Bank、German Bank、Landesbank Berlin、NuaPay、Oldenburgische Landesbank、Sparkasse、StarMoney和Unicredit的解析器来自Powercloud GmbH。