jejik / mt940
PHP 的 MT940 银行对账单解析器
Requires
- php: >=7.4.0||^8.0
Requires (Dev)
This package is auto-updated.
Last update: 2024-09-03 18:25:56 UTC
README
PHP 的 MT940 银行对账单解析器
安装
您可以使用 Composer 安装 Jejik/MT940。有关 Composer 及其主要仓库的更多信息,请参阅 https://packagist.org.cn。首先,按照 Packagist 主页上的说明为您的项目安装 Composer,然后在您的 composer.json
文件中定义对 Jejik/MT940 的依赖。
composer require jejik/mt940
此库遵循 PSR-0 标准。您需要一个符合 PSR-0 的自动加载器来加载 Jejik/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
- 德国银行
- 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(); }
贡献
如果你为你的银行编写了一个解析器,我很乐意将其添加到默认解析器列表中。只需向我发送一个包含你的解析器的拉取请求。确保你也添加了一个单元测试来解析测试文档。你可以从测试文档中删除个人信息(例如,使用'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。