Прямой ответ
Сверка сопоставляет операции приложения с записями платёжного провайдера, поэтому расхождение по сумме, статусу либо составу обнаруживается по парам операций.
| Тип расхождения | Что означает |
|---|---|
| По сумме | Значения операции различаются |
| По статусу | Состояние операции не совпадает |
| Только в приложении | Операция не дошла до провайдера |
| Только в выписке | Операция не отражена в приложении |
SELECT
a.payment_id,
a.amount AS app_amount,
b.amount AS bank_amount
FROM app_payments a
FULL JOIN bank_statement b ON b.payment_id = a.payment_id
WHERE a.payment_id IS NULL
OR b.payment_id IS NULL
OR a.amount <> b.amount;
Полное соединение показывает операции, отсутствующие в одном из источников, поэтому расхождение по составу видно явно. Об аудите — в статье про аудит денежных операций.
Сопоставление операций и ключ сверки
Сопоставление выполняется по ключу операции, поэтому корректность сверки зависит от однозначности ключа.
Ключ сверки. Идентификатор операции, присутствующий в обоих источниках, поэтому пара операций определяется однозначно.
Полное соединение. Операции, отсутствующие в одном из источников, попадают в результат, поэтому расхождение по составу обнаруживается.
Один ко многим. Несколько записей выписки могут соответствовать одной операции, поэтому правило сопоставления фиксируется явно.
Практическое следствие: ключ сверки, не являющийся уникальным в одном из источников, даёт несколько пар на операцию, поэтому результат сверки содержит дубли.
Отдельный аспект — период сверки. Операции на границе периода могут попасть в разные периоды сверки, поэтому правило отнесения операции к периоду фиксируется.
Расхождения по сумме и статусу
Расхождение по сумме означает различие значений, поэтому причина определяется сравнением записей обоих источников.
Расхождение по сумме. Значения операции в приложении и в выписке различаются, поэтому расхождение требует выяснения причины.
Расхождение по статусу. Состояние операции не совпадает, поэтому операция в приложении может быть закрыта, а у провайдера — нет.
Частичное расхождение. Часть операций совпадает, часть расходится, поэтому результат сверки разделяется по типу расхождения.
Практическое следствие: расхождение по статусу, не обработанное своевременно, приводит к тому, что операция в приложении остаётся в неверном состоянии.
Незакрытые платежи и регулярность сверки
Незакрытый платёж остаётся без подтверждения провайдера, поэтому состояние операции требует проверки по истечении срока.
Ожидание подтверждения. Операция создана в приложении, но подтверждение провайдера не получено, поэтому статус остаётся промежуточным.
Срок ожидания. Период, по истечении которого операция проверяется повторно, поэтому незакрытый платёж не остаётся в промежуточном состоянии бессрочно.
Регулярность сверки. Сверка выполняется по расписанию, поэтому расхождение обнаруживается до накопления.
Практическое следствие: сверка, выполняемая вручную нерегулярно, обнаруживает расхождение с задержкой, поэтому число незакрытых операций растёт.
О списании баланса — в статье про денежные операции в БД; о курсах при сверке сумм в разных валютах — в статье про валюты и курсы.
Практика: настройка сверки платежей
1. Определяйте однозначный ключ сверки. Пара операций определяется однозначно, поэтому дубли в результате исключаются.
2. Используйте полное соединение для выявления расхождений по составу. Операции, отсутствующие в одном из источников, попадают в результат.
3. Разделяйте расхождения по типу. Расхождение по сумме, статусу и составу требует разных действий.
4. Фиксируйте правило отнесения операции к периоду. Операции на границе периода не теряются при сверке.
5. Настраивайте срок ожидания подтверждения. Незакрытый платёж проверяется повторно и не остаётся в промежуточном состоянии.
6. Выполняйте сверку по расписанию. Расхождение обнаруживается до накопления, поэтому число незакрытых операций не растёт.
7. Фиксируйте результат сверки. История сверок позволяет отслеживать динамику расхождений.
Рекомендации:
- Не сверяйте по неуникальному ключу. Несколько пар на операцию дают дубли в результате, поэтому расхождение читается неверно.
- Учитывайте операции на границе периода. Правило отнесения к периоду фиксируется, поэтому операция не теряется.
- Сопоставляйте регулярность сверки с объёмом операций. Большой объём требует автоматической сверки по расписанию.
- Фиксируйте тип расхождения в результате. Разные типы требуют разных действий по устранению.
- Пересматриваем ключ сверки при изменении интеграции. Новый идентификатор операции требует изменения ключа сопоставления.
Практический сценарий: часть платежей оставалась в промежуточном статусе
Контекст: несколько операций в приложении оставались в статусе ожидания, при этом средства у клиентов списывались.
- Диагностика. Проверка показала, что подтверждение провайдера по части операций не обрабатывалось. Сверка выполнялась вручную нерегулярно, поэтому расхождение по статусу обнаруживалось с задержкой в несколько дней.
- Причина. Отсутствие регулярной сверки и срока ожидания подтверждения приводило к тому, что операции без подтверждения оставались в промежуточном состоянии бессрочно.
- Действия. (а) Настроили автоматическую сверку по расписанию с полным соединением операций приложения и выписки провайдера; (б) разделили результат по типу расхождения — по сумме, статусу и составу; (в) установили срок ожидания подтверждения, по истечении которого операция проверялась повторно; (г) добавили обработку операций, присутствующих только в выписке, чтобы операция отражалась в приложении; (д) настроили фиксацию результата каждой сверки, чтобы динамика расхождений отслеживалась.
- Результат. Операции закрываются в день совершения, поскольку расхождение по статусу обнаруживается автоматически по расписанию.
Вывод: сверка, выполняемая вручную нерегулярно, обнаруживает расхождение по статусу с задержкой, поэтому операции остаются в промежуточном состоянии. Автоматическая сверка по расписанию с разделением расхождений по типу и сроком ожидания подтверждения закрывает операции своевременно.
FAQ
Что такое reconciliation платежей? Сопоставление операций приложения с записями платёжного провайдера. Расхождение по сумме, статусу и составу обнаруживается по парам операций.
Почему важно полное соединение при сверке? Операции, отсутствующие в одном из источников, попадают в результат, поэтому расхождение по составу обнаруживается явно.
Что делать с незакрытым платежом? Проверять повторно по истечении срока ожидания. Операция без подтверждения не должна оставаться в промежуточном состоянии бессрочно.
Как часто выполнять сверку? По расписанию. Сверка, выполняемая нерегулярно, обнаруживает расхождение с задержкой, поэтому число незакрытых операций растёт.
Источники: PostgreSQL table expressions, PostgreSQL aggregate functions, PostgreSQL numeric types — ссылки в шапке.