Финансы и транзакции (billing)🔗
Назначение🔗
Приложение billing отвечает за:
- учёт всех транзакций, связанных с пользователем и его профилями;
- хранение справочников: типов транзакций, сервисов, GPT-моделей;
- расчёт стоимости списаний;
- поддержку данных для последующей сверки баланса.
Все данные из billing используются через data_service, который имеет доступ к базе.
Основные модели и сущности🔗
TransactionType🔗
class TransactionType(models.Model):
code = models.CharField(...)
name_ru = models.CharField(...)
description = models.TextField(...)
| Поле | Тип | Назначение |
|---|---|---|
code | CharField | Уникальный код типа (GPT_USAGE, ...) |
name_ru | CharField | Название на русском |
description | TextField | Доп. описание |
Тип определяет, за что проведена транзакция (GPT, подписка, пополнение и т.д.).
Transaction🔗
class Transaction(models.Model):
user = models.ForeignKey(CustomUser, ...)
type = models.ForeignKey(TransactionType, ...)
amount = models.DecimalField(...)
date = models.DateTimeField(...)
description = models.TextField(...)
| Поле | Тип | Назначение |
|---|---|---|
user | ForeignKey | Пользователь, к которому относится транзакция |
type | ForeignKey | Тип транзакции |
amount | DecimalField | Сумма (всегда положительная) |
date | DateTimeField | Время создания |
description | TextField | Доп. комментарий (необязательный) |
Списание или пополнение определяется типом, а не знаком суммы.
TransactionDetail🔗
class TransactionDetail(models.Model):
transaction = models.ForeignKey(Transaction, ...)
profile = models.ForeignKey(BaseProfile, ...)
gpt_model = models.ForeignKey(OpenAIModel, ...)
tokens_input_used = models.PositiveIntegerField(...)
tokens_output_used = models.PositiveIntegerField(...)
| Поле | Назначение |
|---|---|
profile | Ссылка на профиль (см. base_profiles) |
gpt_model | Модель GPT, участвовавшая в расходе |
tokens_input_used | Входящие токены, участвовавшие в расчёте стоимости |
tokens_output_used | Исходящие токены, участвовавшие в расчёте стоимости |
Создаётся одна TransactionDetail на одну Transaction.
OpenAIModel🔗
class OpenAIModel(models.Model):
code = models.CharField(...)
price_output = models.DecimalField(...)
price_input = models.DecimalField(...)
is_active = models.BooleanField(...)
| Поле | Назначение |
|---|---|
code | Название модели, например gpt-4 |
price_output | Стоимость миллиона исходящих токенов (₽) |
price_input | Стоимость миллиона входящих токенов (₽) |
is_active | Используется ли модель в расчётах |
ServiceRegistry🔗
class ServiceRegistry(models.Model):
code = models.CharField(...)
name = models.CharField(...)
subscribe_amount = models.PositiveSmallIntegerField(...)
| Поле | Назначение |
|---|---|
code | Код сервиса (VK, WHATSAPP, WIDGET и др.) |
name | Название |
subscribe_amount | Абонентская плата в день (в рублях) |
Используется при создании профилей и для расчёта ежедневных списаний
Не понятно?
Смотри base_profiles чтобы узнать подробнее про профили
Связи и использование🔗
- Все транзакции создаёт только
data_service, используя ORM с доступом к базе данных или администратор через админку; - Другие микросервисы напрямую к этим моделям не обращаются;
- Детали GPT (модель, токены) сохраняются через
TransactionDetail; amountвсегда положительное, направление определяется типом транзакции.
Особенности🔗
balance_cachedобновляется черезdata_serviceпри создании транзакций;-
В будущем планируется внедрить автоматическую сверку:
- периодическая агрегация всех транзакций;
- создание “чекпоинтов”;
- исправление кэш-баланса при расхождениях.
-
Справочники (
TransactionType,ServiceRegistry) инициализируются автоматически при миграциях.
Админка🔗
-
Для
Transactionиспользуется кастомныйadmin.ModelAdminс :- inlines для
TransactionDetail; - автоматическим обновлением
balance_cachedу пользователя при типахFREE_REFILLиMANUAL_WITHDRAWAL.
- inlines для
-
OpenAIModel,ServiceRegistry,TransactionType— доступны для редактирования и просмотра; - В админке отображаются фильтры, поиск, форматированные названия типов и моделей.
API🔗
Общая информация🔗
Приложение billing не предоставляет API.
Все операции выполняются через микросервис data_service, который имеет прямой доступ к базе billing и работает через SQLAlchemy.
Использование🔗
- data_service управляет всеми транзакциями и извлекает данные о GPT, сервисах и ценах;
Возможность
В будущем возможно появление агрегирующего API (например, отчёты, сводки).