Доставка обедов: одна выполненная продажа на заказ
Повторы оплаты и выполнения не увеличивают продажу; отмена до выполнения остается финансовым вопросом.
Задача и принятое решение
Три заказа проходят разные пути: O18 выполнен, O19 оплачен и отменен, O20 выполнен и частично возвращен. Дубли событий добавлены отдельно, чтобы проверить устойчивость отчета.
Я храню состояние заказа и ID каждого события. Выручка примера появляется при первом выполнении; оплата отражается только в денежном потоке. Возврат после выполнения уменьшает обе величины, а возврат отмененного — только деньги.
Для этого отчета продажа определяется выполнением заказа. Правило не переносится автоматически на другую модель учета.
Проверить решение
Измените исходные строки или параметры и пересчитайте результат. Данные остаются в этой странице.
| Событие | Заказ | Тип | Деньги, ₽ | Продажа, ₽ | Статус |
|---|---|---|---|---|---|
| E1 | O18 | оплата | 900 | 0 | Учтено |
| E2 | O18 | выполнен | 0 | 900 | Учтено |
| E2 | O18 | выполнен | 0 | 0 | Повтор события |
| E3 | O19 | оплата | 600 | 0 | Учтено |
| E4 | O19 | отменен | 0 | 0 | Учтено |
| E5 | O19 | возврат | -600 | 0 | Учтено |
| E6 | O20 | оплата | 1200 | 0 | Учтено |
| E7 | O20 | выполнен | 0 | 1200 | Учтено |
| E8 | O20 | возврат | -300 | -300 | Учтено |
| E1 | O18 | оплата | 0 | 0 | Повтор события |
Исходный набор
Авторский контрольный набор; не клиентские документы и не результаты внешней модели.
Изменить входные строки
Посмотреть исходные строки
| Событие | Заказ | Тип | Сумма |
|---|---|---|---|
| E1 | O18 | оплата | 900 |
| E2 | O18 | выполнен | 900 |
| E2 | O18 | выполнен | 900 |
| E3 | O19 | оплата | 600 |
| E4 | O19 | отменен | 0 |
| E5 | O19 | возврат | 600 |
| E6 | O20 | оплата | 1200 |
| E7 | O20 | выполнен | 1200 |
| E8 | O20 | возврат | 300 |
| E1 | O18 | оплата | 900 |
Что получилось
Два выполненных заказа дали 2100 ₽ до возврата и 1800 ₽ после него. Отмененный O19 не создал продажу, его 600 ₽ вернулись отдельным событием. Повторы E1/E2 и новое выполнение O18 не увеличили итог.
Выполненная проверка
| Проверка | Результат |
|---|---|
| Два выполненных заказа дают 1800 после частичного возврата | Пройдена |
| Два повторных события исключены | Пройдена |
| Новое событие выполнения того же заказа не создает вторую продажу | Пройдена |
| Отрицательная сумма не становится учтенным движением | Пройдена |
| Нечисловая сумма останавливает расчет | Пройдена |
| Возврат сверх учтенного остатка не делает продажу отрицательной | Пройдена |
Не моделируются платежный провайдер, частичное выполнение и спорный возврат. Источник событий здесь авторский.
Скачать материалы и повторить проверку
source.json · source.csv · result.json · result.csv · engine.js · verify.cjs · checks.json · style.css
Локальная проверка: node verify.cjs. Нужен Node.js; сетевые обращения не выполняются.