Задача
Кто сколько должен — вопрос, который дистрибьютор задаёт каждый день, и ответ должен выдержать спор: клиент говорит, что заплатил, менеджер — что нет. Одно поле «баланс» тут не поможет. Оно говорит сколько, но никогда не говорит почему.
Только добавление
Поэтому поля «баланс» нет. Есть журнал: каждая продажа, оплата и возврат — запись со знаком, а баланс — сумма записей. Ничего в нём не обновляется и не удаляется. Такой запрос отвергает триггер в базе, поэтому даже наш собственный код не сделает этого по ошибке.
Исправление — тоже запись
Ошибки случаются. Неверную запись не правят, а отменяют новой записью с обратным знаком, связанной со старой, с указанием, кто и когда её сделал. История остаётся целой, а акт сверки для клиента может показать каждый шаг.
Что это даёт
- Ответ на вопрос «почему такой баланс?» на любую дату.
- Акт сверки, который клиент может проверить построчно.
- Оплаты, разнесённые по конкретным документам.
- Никаких тихих правок: журнал показывает, кто что сделал.
Чего это стоит
Прочитать баланс — значит посчитать сумму, а не взять поле, и исправление занимает в интерфейсе на шаг больше. Мы считаем это честной ценой за цифры, которые могут постоять за себя. То же правило действует для движений по кассам.