2013-07-22 4 views
2

На данный момент я работаю над сценарием импорта, который импортирует данные банковского счета в базу данных MySQL, используя php. Я нашел некоторый mt940 pharser, но они не делали то, что я хотел сделать, или не соответствовали текущему стандарту MT940. Поэтому я написал свой собственный простой класс, который анализирует данные, которые мне нужны.Как найти двойные транзакции в MT940

Проблема не есть, и это может даже не быть проблемой MT940, заключается в том, что я должен фильтровать двойную транзакцию. И в основном это очень просто, если точно такая же транзакция уже существует в базе данных, не импортируйте снова. Вот что я сделал.

Но теперь забавная часть: Некоторые транзакции могут происходить дважды в тот же день. Например, кто-то делает одну и ту же транзакцию дважды в тот же день [кому-то может понравиться и просто отправить мне деньги дважды;)]. При импорте этого в первый раз нет проблем. В одном файле каждая транзакция является транзакцией.

Но теперь проблема: Поскольку транзакция не являются уникальными (MT940 не посылает никаких уникальных для сделки), то трудно отфильтровать двойную сделку с уникальной транзакции. Поэтому, если я загрузил два файла MT940 со своего банковского счета. И одна из двух транзакций находится в первом файле, а вторая - во втором файле. При импорте второго файла он теперь мне скажет, что транзакция является двойной транзакцией.

Итак, я борюсь с этим, и, вероятно, я не единственный. Кроме того, большая программа бухгалтерского учета использует структуры MT940 и должна иметь дело с одной и той же проблемой.

Кто знает, как справиться с этим?

Дополнительная информация

В самой сделки (: 61 :), то доступна следующая информация:

  • Дата
  • Сумма
  • Номер банковского счета
  • Банковский счет наименование
  • банковский счет адрес
  • Описание сделки

Это может случиться так, что если кто-то делает транзакцию дважды, вся эта информация является то же самое.

Пример двух двойных транзакций (конечно, я изменил имя и банковский счет транзакции): (этот файл был двойным в одном файле MT940, но на самом деле это две транзакции).

:61:130311C000000000029,95N122NONREF   

:86:/ORDP//NAME/JANSEN W H/ADDR/SOMEROAD 1 9569 GS THECITY/REMI/N 
OKIA 3310/ISDT/2013-03-11 
+0

Если каждое отдельное поле совпадает, я думаю, что ни один алгоритм не может решить, является ли это двойной или просто новой идентичной транзакцией. –

+0

PS: Является ли дата транзакции меткой времени или просто DD/MM/YYYY? –

+0

Нет метки времени, просто YYMMDD. – Timo002

ответ

1

Допустим, что у вас есть 3 сделки: A, B и C.

А и В являются дубликатами, поэтому B должны быть отброшены

С другой транзакции, но это идентично A в каждом аспекте.

По данным, которые вы предоставили в вопросе, это правда, что A = B = C. Они абсолютно идентичны.Нет способов определить, прочитав их содержание, кто является подлинным и кто дублирует. Каждый из следующих сценариев может быть недействительна:

  1. C является дубликатом B, который является дубликатом А. Discard В и С и держать A.
  2. B является подлинной сделка идентична A. C является дубликатом B. Discard B.
  3. Это три настоящие идентичные транзакции. Имейте все.
  4. [т.д ...]

Как вы можете видеть, что нет алгоритма, который может решить, 100%, что случай является правильным. И поскольку мы говорим о деньгах, все, что не может быть подтверждено на 100%, нельзя принять.

Что делать тогда?

Если компьютер не может определить его, позвольте людям вздрагивать. Когда вы записываете конфликт, скомпилируйте список. Обработайте все, что не имеет конфликтов, и когда вы закончите партию, отправьте список конфликтов оператору-человеку и позвольте ему разобраться с дубликатами от подлинной транзакции (даже если мне все еще интересно, КАК их сортировать, если они одинаковы во всех аспектах)

Если вы обнаружите, что операторы знают, КАК их сортировать, попробуйте вывести их человеческий алгоритм, если это возможно.

+0

Это то, о чем я думал. Проблема только в том, что если импорт накладывается один день, и он должен быть там, чтобы не пропустить никаких транзакций между двумя последующими днями. Это означает, что они вручную должны проверять около 200 транзакций для каждого импорта. И, вероятно, 199 действительных двойников ... Но, работая над этим, я думаю, что так оно и есть! – Timo002

1

Сообщение оператора MT940 имеет открывающие и закрывающие весы, верно? Поэтому, если у вас есть заявление, содержащее две идентичные транзакции, баланс банковского счета будет отражать это.

Если вы очищаете данные, которые появляются дублирующими, это не означает, что транзакций не произошло. Если вы делаете эту очистку, чтобы соответствовать вашим данным из 940 в базу данных, которая имеет уникальное нарушение ограничений, которое запрещает публикацию идентичных транзакций, это может быть проблемой позже - или сразу, если кто-то сравнивает сумму транзакций в вашей базе данных по сравнению с итоговым балансом.

Лучшим подходом может быть создание дополнительной информации о ключе (возможно, увеличение порядкового номера для каждой строки-оператора), которую вы можете добавить, чтобы различать, по-видимому, идентичные транзакции и загружать их в свой db, не нарушая ограничений.

0

Один ответ указал, что сообщения mt940 содержат стартовый (и конечный) баланс. Используйте информацию о начальном балансе для создания текущего баланса для каждой транзакции при прохождении сообщения. Используйте текущий баланс в сочетании со датой валютирования транзакции и, возможно, код учетной записи для создания уникального идентификатора. Вы можете сделать это, например, конкатенируя их и используя любую функцию, которую предоставляет ваш язык программирования для создания хэша MD5.

+0

Это не дает ответа на вопрос. Когда у вас будет достаточно [репутации] (http://stackoverflow.com/help/whats-reputation), вы сможете [прокомментировать любое сообщение] (http://stackoverflow.com/help/privileges/comment); вместо этого [предоставить ответы, которые не требуют разъяснений у аськи) (http://meta.stackexchange.com/questions/214173/why-do-need-50-reputation-to-comment-what-can- я-делать-вместо этого). - [Из обзора] (/ review/low-quality-posts/12350649) – Bono

+0

Хорошо, позвольте мне быть немного яснее. Вариант использования - импортировать файлы MT940 в базу данных. Вы делаете это, когда хотите сделать данные банковской выписки доступными через импорт MT940 на ваш, например. приложение учета, для согласования. Вы можете сделать это для разных и, возможно, перекрывающихся периодов времени (ежемесячно, ежеквартально), потенциально прочитывая одни и те же данные более одного раза. Как писал ОП, в MT940 на уровне транзакции нет уникального идентификатора. В моем предложении показано, как создать такой идентификатор, который затем позволяет идентифицировать дубликаты, т. Е. Транзакции, которые у вас уже есть в вашей базе данных. – ectoplasm