jejik/mt940

PHP 的 MT940 银行对账单解析器

0.6.2 2023-12-20 10:14 UTC

README

PHP 的 MT940 银行对账单解析器

Build Status

安装

您可以使用 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() 获取此交易的 GVC
    • getTxText() 获取此交易的 txText
    • getPrimanota() 获取此交易的 primanota
    • getExtCode() 获取此交易的 extCode
    • getEref() 获取此交易的 ERef
    • getBIC() 获取此交易的 BIC
    • getIBAN() 获取此交易的 IBAN
    • getAccountHolder() 获取此交易的账户持有人
    • getKref() 获取此交易的 Kref
    • getMref() 获取此交易的 Mref
    • getCred() 获取此交易的 Cred
    • getSvwz() 获取此交易的 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