Как лучше реализовать логику биллинга?

Здравствуй, Хабр.

Есть две коллекции прихода и расхода средств:

приход средств
    дата
    сумма
    статус (не поддтвержден, подтвержден, отменен)

расход средств
    дата
    сумма

Мне нужно получать остаток на счету и отчеты по использованию.

Без дополнительных коллекций


1. Чтобы получить остаток на счету нужно просумировать подтверженные пришедшие средства и отнять от них сумму расходов.
2. Чтобы получить отчет нужно вывести данные приходящие и расходуемые средства за период.

Здесь мне не нарвится что нужно постоянно вычислять остаток.

Добавить коллекцию счета


счет
    остаток

1. Чтобы получить остаток на счету нужно вернуть значение остатка.
2. Получение отчета анологично предыдущему методу.

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

Добавить коллекцию периода


период
    закрыт (да, нет)
    дата начала
    дата окончания
    остаток в начале
    остаток при окончании

1. Чтобы получить остаток мне нужно вернуть значение остатка при окончании за последний открытый период.
2. Получение отчета анологично как и предыдущем методе, возможно проще получать даты для отчетов по периодам.

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


Собственно возможно кто-нибудь может описать другие модели или же дополнить/поправить мои рассуждения.

Спасибо.
  • Вопрос задан
  • 3805 просмотров
Пригласить эксперта
Ответы на вопрос 2
@rPman
Вы сами, с каждым новым примером расширяли саму задачу: +увеличить скорость, +увеличить надежность, +найти место и причину проблемы и возможность получить состояние на любой момент времени,…
Что значит другие модели? какие еще задачи нужно решить?

p.s. последний приведенный вариант вполне хорош, но накладывает ограничение — данные должны быть последовательны (для получения следующей записи нужна самая последняя запись), что может некрасиво ложиться на горизонтальное масштабирование, когда коллекция размазывается по нескольким физическим нодам (но эта проблема вполне решается, либо глобальными локами на объект — в данном случае 'счет', либо введением дополнительными коллекциями типа — данные о последнем изменении, если честно это та же реализация глобального лока, но уже через эту коллекцию...)
Т.е. ваша задача будет расширяться и дополняться, боюсь как бы не до бесконечности по мере появления новых проблем, порождаемых очередным решением предыдущей… рекомендую где то остановиться сразу.
Ответ написан
была у меня такая задача, с уточнением: кол-во строк: сотни тысяч, группировка по счетам
в результате выглядело так:
операция это:
id транзакции (до 20 операцийна транзакциювыходило в реальной жизни)
счет
дата
сумма (плюс или минус)
описание
логический тип (основная операция, комиссия, себестоимость и тд)
кешируемый_баланс_после_операции
кешируемая_себестоимость_рубля
кешируемый_средневзвешенный_курс

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

надеюсь, будет полезно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы