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\StatementInterfacegetNumber()对账单序列号getAccount()实现Jejik\MT940\AccountInterface的对象getOpeningBalance()实现Jejik\MT940\BalanceInterface的对象getClosingBalance()实现Jejik\MT940\BalanceInterface的对象getTransactions()实现Jejik\MT940\TransactionInterface的对象数组
Jejik\MT940\AccountInterfacegetNumber()账号getName()账户持有人名称
Jejik\MT940\BalanceInterfacegetCurrency()3字母 ISO 4217 货币代码getAmount()余额getDate()日期作为\DateTime对象
Jejik\MT940\TransactionInterfacegetContraAccount()实现Jejik\MT940\AccountInterface的对象getAmount()交易金额getDescription()描述文本getValueDate()交易日期作为\DateTimegetBookDate()交易入账日期作为\DateTimegetCode()获取此交易的代码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\StatementsetAccountClass($className)默认为Jejik\MT940\AccountsetContraAccountClass($className)默认为Jejik\MT940\AccountsetTransactionClass($className)默认为Jejik\MT940\TransactionsetOpeningBalanceClass($className)默认为Jejik\MT940\BalancesetClosingBalanceClass($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。