Как работает сверка остатков и чего она не видит
Каждый конвертер в этой категории говорит, что он точен. Ни один не говорит, каким образом и что должно быть верно, чтобы он ошибся. Эта страница делает и то и другое: утверждение, которое нельзя проверить, ничего не стоит, когда числа уходят в чью-то бухгалтерию.
Идея
Выписка несёт собственное доказательство. В ней напечатан входящий остаток, исходящий остаток, а часто и текущий остаток рядом с каждой строкой. Эти числа получены главной книгой банка, а не нашим парсером, — значит, они независимая проверка всего, что парсер прочитал. Если наши операции и остатки банка расходятся, ошибается парсер, и узнать это можно, ни разу не увидев оригинал.
Две проверки, выбираются сами
По текущему остатку, строка за строкой
Когда остаток напечатан хотя бы у 60 % строк, каждая строка обязана удовлетворять прошлый остаток + сумма = остаток этой строки. Строки без напечатанного остатка переносят текущую сумму дальше, поэтому пропуск не сбивает идущие следом. Каждая строка проверяется отдельно, а расхождение пересинхронизируется на напечатанный остаток — одна плохая строка не превращается в страницу ложных тревог.
От входящего к исходящему
Если колонки остатка нет — выписки в стиле Chase разбиты на разделы и её не печатают — проверка такая: входящий остаток + Σ(все суммы) = исходящий остаток. Слабее, потому что это одно уравнение вместо многих, но она по-прежнему ловит потерянную, задвоенную или неверно прочитанную строку: любая из них сдвигает итог.
Источник: src/parse/reconcile.ts.
Знаки вычисляются, а не угадываются
Многие выписки печатают суммы без знака, оставляя направление заголовку колонки или названию раздела. Гадание — это способ, которым конвертеры молча превращают приход в расход. Вместо этого: если строка не проходит проверку, но прошла бы с обратным знаком, знак переворачивается, потому что колонка остатка доказывает направление, — и о каждом перевороте сообщается в результате. Исправление, о котором вам не сказали, неотличимо от ошибки.
Чего проверка поймать не может
Это та часть, которую другие страницы опускают. Проверка проверяет итоги, поэтому её переживает любая ошибка, сохраняющая итог:
- Две суммы, поменянные местами между строками. Сумма не изменилась, цепочка по-прежнему сходится — а две операции несут значения друг друга.
- Назначение платежа, приписанное не той строке. Назначения в арифметике не участвуют вовсе.
- Две ошибки, которые взаимно гасятся. Строка, прочитанная на 10,00 больше, и другая на 10,00 меньше сходятся идеально.
- Целый пропущенный раздел между последним остатком и исходящим, если выписка не печатает исходящий остаток, который закрепил бы конец.
- Даты. Сверяются только суммы. Неверно прочитанный формат даты уводит каждую операцию не в тот месяц, а деньги по-прежнему сходятся, — поэтому парсер отдельно предупреждает, когда большинство дат выпадает за период, напечатанный самой выпиской. Этой страховке нужна опора: если выписка не печатает период вовсе, а все дни в ней — двенадцатое число или раньше, формату не с чем сверяться. Тогда единственное, что решает, март в записи 05/03 или май, — знание банка, который её выдал.
- Валюта. Сверяются числа, но никогда — единица измерения. Все латиноамериканские песо печатаются знаком
$, поэтому чилийская или мексиканская выписка, прочитанная как доллары США, ошибается примерно в тысячу раз в каждой строке — и цепочка всё равно сходится точно, потому что ни одно число не изменили. И здесь решает банк-эмитент, если только в выписке прямо не написаноUS$илиUSD.
Ни один из этих случаев не выдуман; из-за них страница говорит арифметика сходится, а не этот файл верен. Проверка поднимает нижнюю границу. Она не заменяет человека, который знает, что было в выписке.
Когда не сходится
Ничего не угадывается и ничего не прячется. Показывается строка, на которой рвётся цепочка, с прочитанной нами суммой и с той, что следует из колонки остатка, — и решаете вы: взять число из колонки остатка или оставить напечатанное в выписке и перенести расхождение в выгрузку. Пока цепочка не сходится от начала до конца, файл проверенным не называется.
Сканы отклоняются
PDF, где на странице меньше 100 извлекаемых символов, не имеет текстового слоя — это фотография выписки. Такие файлы больше не отклоняются сразу: предлагается распознавание, и запускается оно только по вашей просьбе, потому что стоит около секунды на страницу и читает цифры с картинки, а не из текстового слоя. Сверка выше применяется к результату без единой поблажки, и именно поэтому предлагать распознавание честно: распознанная выписка, у которой цепочка сходится, — это доказательство, а та, у которой не сходится, обнаружится здесь, а не в ваших книгах. Какой у вас файл, вы поймёте за десять секунд: откройте PDF и попробуйте выделить строку текста.
Проверьте сами
Всё написанное выше — арифметика, которую можно повторить в таблице: просуммируйте колонку сумм, прибавьте входящий остаток, сравните с исходящим, напечатанным банком. Сошлось — конвертация сохранила деньги. В этом всё утверждение, и оно намеренно достаточно маленькое, чтобы его проверить.