如何在MT940中找到双重交易

时间:2013-07-22 08:46:05

标签: php mt940

目前我正在开发一个导入脚本,使用php将银行帐户数据导入MySQL数据库。我找到了一些mt940 pharser,但那些没有做我想做的或不符合当前的MT940标准。所以我编写了自己的简单类来解析我需要的数据。

问题是,这甚至可能不是MT940问题,是我必须过滤双重交易。在基本的,这很简单,如果数据库中已经存在完全相同的事务,则不要再次导入。这就是我所做的。

但现在有趣的部分: 某些交易可能会在同一天发生两次。例如,有人在同一天做了两次相同的交易[有人可能会喜欢我并且只给我两次钱;)]。 在第一次导入时,没有问题。在一个文件中,每个事务都是一个事务。

但现在问题是: 由于事务不是唯一的(MT940不会为事务发送任何唯一的事务),因此很难从唯一事务中过滤掉双事务。如果我从我的银行帐户下载了两个MT940文件。并且两个事务中的一个在第一个文件中,另一个在第二个文件中。导入第二个文件时,它现在将告诉我该事务是双重事务。

所以..我正在努力解决这个问题,可能我不是唯一一个。大型会计程序也使用MT940结构,必须处理同样的问题。

谁知道处理这个问题的方法?

其他信息

在交易本身(:61 :)中,可以获得以下信息:

  • 日期
  • 金额
  • 银行帐号
  • 银行帐户名称
  • 银行帐户地址
  • 交易说明

如果有人做了两次交易,可能会发生这些信息。

两个双事务的示例(当然我修改了事务的名称和bankaccount):(这个在一个MT940文件中是双重的,但实际上是两个事务)。

:61:130311C000000000029,95N122NONREF          
0123456789
:86:/ORDP//NAME/JANSEN W H/ADDR/SOMEROAD 1 9569 GS THECITY/REMI/N
OKIA 3310/ISDT/2013-03-11

3 个答案:

答案 0 :(得分:1)

假设您有3笔交易:A,B和C.

A和B是重复的,因此必须丢弃B

C是一个不同的交易,但它在每个方面都与A相同。

根据您在问题中提供的数据,确实A = B = C.它们完全相同。通过阅读他们的内容,没有办法确定谁是真实的,谁是重复的。以下所有方案均可能有效:

  1. C是B的副本,它是A的副本。丢弃B和C并保留A.
  2. B是与A相同的真实交易.C是B. Discard B的副本。
  3. 他们是三个真正相同的交易。保留所有这些。
  4. [等等...]
  5. 正如你所看到的,没有算法可以决定100%哪种情况是正确的。由于我们谈论的是金钱,所以不能接受100%以上的确定性。

    该怎么做?

    如果计算机无法确定,请让人类进入。 录制冲突时,编译列表。处理没有冲突的所有内容,当您完成批处理后,将冲突列表发送给人工操作员,让他/她从真实交易中挑选出重复项(即使我仍然想知道他们如何排序它们在各个方面都是相同的)

    如果您发现操作员知道如何对它们进行排序,请尽可能推断其人工算法。

答案 1 :(得分:1)

MT940声明信息有开头和期末余额,对吗?因此,如果您的声明包含两个相同的交易,那么银行账户余额将反映出来。

如果您“清理”看似重复的数据,并不意味着交易没有发生。如果您正在进行此清理,以便将您的数据从940调整到具有唯一约束违规的数据库,该数据库不允许发布相同的事务,那么以后可能会出现问题 - 或者如果有人比较了数据库中的事务与语句中的期末余额相对应。

更好的方法可能是生成一些额外的密钥信息(可能会增加每个语句行的序列号),您可以添加这些信息以区分显然相同的事务并将其加载到数据库中而不违反约束。

答案 2 :(得分:0)

一个答案指出mt940消息包含起始(和结束)余额。在您浏览消息时,使用起始余额信息为每个事务创建当前余额。将当前余额与事务的值日期结合使用,也可以使用帐户代码创建唯一标识符。您可以通过连接它们并使用您的编程语言可用于创建MD5哈希的任何函数来实现此目的。