imetal/mt940

PHP的MT940银行对账单解析器

0.5.21 2022-05-24 07:42 UTC

README

PHP的MT940银行对账单解析器

Build Status

安装

您可以使用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() 获取此交易的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
  • 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