Перейти к содержанию

Финансы и транзакции (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.
  • OpenAIModel, ServiceRegistry, TransactionType — доступны для редактирования и просмотра;

  • В админке отображаются фильтры, поиск, форматированные названия типов и моделей.

API🔗

Общая информация🔗

Приложение billing не предоставляет API.

Все операции выполняются через микросервис data_service, который имеет прямой доступ к базе billing и работает через SQLAlchemy.


Использование🔗

  • data_service управляет всеми транзакциями и извлекает данные о GPT, сервисах и ценах;

Возможность

В будущем возможно появление агрегирующего API (например, отчёты, сводки).