Биллинговая дилемма, которую не смог решить ChatGPT
Пишу первый в своей жизнь биллинг.
Контекст
У меня есть Telegram-бот для мониторинга сайтов. Я ввожу в нём платный тариф: 1 сайт бесплатно, каждый дополнительный — 2 рубля в день. Пользователь может в любой момент добавлять/удалять сайты, а также пополнять баланс.
Структура данных
Подписки
Пользователь
Дата создания
Дата удаления
Причина удаления
Например, отключение пользователем или приостановка за неуплату.
Пополнения
Пользователь
Сумма
Списания
За какую подписку
За какой день
Сумма
Задачи
Ежедневно списывать деньги с баланса в соответствии с тем, сколько за истекшие сутки сайтов было на мониторинге.
Отключать мониторинг дополнительных сайтов при исчерпании баланса.
Сразу же уведомлять об этом пользователя.
При этом
Очень хочу делать расчёты по календарным суткам, с полуночи до полуночи. Проще код, лаконичнее детализация расчётов (если понадобится в дальнейшем).
В уведомлении должен быть актуальный баланс на текущий момент.
Не хочу слать уведомления об исчерпании баланса ночью.
Не хочу слать уведомления с задержкой после списания:
Если мониторинг был отключен в полночь, а уведомление пришло только днём, то некрасиво.
Если расчёт в полночь, а отключать днём, в момент уведомления, то с полуночи прошло какое-то время, за которое при дальнейших расчётах будут списаны деньги, а это некрасиво.
...либо нужно усложнять код и делать этот период бесплатным.
Как бы вы предложили разрешить эту дилемму? Может, есть какие-то общепринятые практики?