Как найти двойные транзакции в MT940
В данный момент я работаю над сценарием импорта, который импортирует данные банковского счета в базу данных MySQL с помощью php. Я нашел какой-то фарсер mt940, но они не делали то, что я хотел, или не соответствовали текущему стандарту MT940. Поэтому я написал свой собственный простой класс, который анализирует мне данные, которые мне нужны.
Проблема не в том, и это может даже не быть проблемой MT940, это то, что я должен фильтровать двойную транзакцию. И в общем, это очень просто, если точно такая же транзакция уже существует в базе данных, не импортируйте снова. Вот что я сделал.
Но теперь самое интересное: некоторые транзакции могут происходить дважды в один и тот же день. Например, кто-то совершает одну и ту же транзакцию дважды в один и тот же день [кто-то может мне понравиться и просто отправить мне деньги дважды;)]. При первом импорте это не проблема. В одном файле каждая транзакция является транзакцией.
Но теперь проблема: поскольку транзакция не уникальна (MT940 не отправляет уникальных для транзакции), трудно отфильтровать двойную транзакцию из уникальной транзакции. Так что, если я скачал два файла MT940 с моего банковского счета. И одна из двух транзакций находится в первом файле, а другая - во втором файле. При импорте второго файла теперь мне сообщают, что транзакция является двойной транзакцией.
Итак... Я борюсь с этим, и, вероятно, я не единственный. Также большая бухгалтерская программа использует структуры MT940 и должна иметь дело с той же проблемой.
Кто знает способ справиться с этим?
Дополнительная информация
В самой транзакции (:61:) доступна следующая информация:
- Дата
- Количество
- номер банковского счета
- Название банковского счета
- Адрес банковского счета
- Описание транзакции
Может случиться так, что если кто-то совершит транзакцию дважды, вся эта информация будет одинаковой.
Пример двух двойных транзакций (конечно, я изменил имя и банковский счет транзакции): (эта была двойная в одном файле 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 ответа
Сообщение с заявлением MT940 имеет начальные и конечные сальдо, верно? Таким образом, если у вас есть выписка, содержащая две идентичные транзакции, баланс банковского счета будет отражать это.
Если вы "очищаете" данные, которые выглядят дублированными, это не означает, что транзакции не состоялись. Если вы выполняете эту очистку для того, чтобы поместить ваши данные из 940 в базу данных, которая имеет уникальное нарушение ограничения, запрещающее публикацию идентичных транзакций, это может стать проблемой позже - или сразу же, если кто-нибудь сравнит сумму транзакции в вашей базе данных по отношению к конечному балансу из выписки
Лучшим подходом может быть генерирование некоторой дополнительной ключевой информации (возможно, увеличение порядкового номера для каждой строки оператора), которую вы можете добавить, чтобы дифференцировать явно идентичные транзакции и загружать их в вашу базу данных, не нарушая ограничений.
Допустим, у вас есть 3 транзакции: A, B и C.
A и B являются дубликатами, поэтому B необходимо отбросить
C - это другая транзакция, но она идентична A во всех аспектах.
Судя по данным, которые вы указали в вопросе, A = B = C. Они абсолютно идентичны. Нет никаких способов определить, читая их содержание, кто является подлинным, а кто - дубликатом. Каждый из следующих сценариев может быть действительным:
- C является дубликатом B, который является дубликатом A. Откажитесь от B и C и сохраните A.
- B является подлинной транзакцией, идентичной A. C является дубликатом B. Отменить B.
- Это три настоящие идентичные транзакции. Держи их всех.
- [так далее...]
Как видите, не существует алгоритма, который мог бы на 100% определить, какой из вариантов является правильным. И так как мы говорим о деньгах, все, что менее чем на 100%, не может быть принято.
Что делать то?
Если компьютер не может определить это, позвольте людям вмешаться. Когда вы записываете конфликт, составьте список. Обработайте все, что не имеет конфликтов, и когда вы закончите пакет, отправьте список конфликтов оператору-человеку и позвольте ему / ей разобрать дубликаты из подлинных транзакций (даже если мне все еще интересно, КАК они могут их отсортировать, если они идентичны во всех аспектах)
Если вы обнаружите, что операторы знают, КАК сортировать их, попробуйте вывести их человеческий алгоритм, если это возможно.
В одном ответе указывалось, что сообщения mt940 содержат начальный (и конечный) баланс. Используйте информацию о начальном балансе для создания текущего баланса для каждой транзакции при прохождении сообщения. Используйте текущий баланс в сочетании с датой валютирования транзакции и, возможно, кодом счета, чтобы создать уникальный идентификатор. Вы можете сделать это, например, объединяя их и используя любую функцию, которую ваш язык программирования делает доступной, для создания хеша MD5.