Files
billing/billing_app/models.py
2026-01-07 09:17:45 +07:00

79 lines
2.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import uuid
from django.db import models
class AccountType(models.TextChoices):
"""Типы аккаунтов в системе биллинга."""
USER = 'USER', 'User Account'
SERVICE = 'SERVICE', 'Service Account'
class Account(models.Model):
"""
Аккаунт в системе биллинга.
Хранит метаданные об аккаунтах, созданных в TigerBeetle.
UUID используется как ID аккаунта в TigerBeetle (uuid.int).
"""
uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
name = models.CharField(max_length=255, help_text="Название аккаунта")
account_type = models.CharField(
max_length=50,
choices=AccountType.choices,
default=AccountType.USER,
)
description = models.TextField(blank=True, null=True)
created_at = models.DateTimeField(auto_now_add=True)
@property
def tigerbeetle_id(self):
"""ID аккаунта в TigerBeetle (128-bit int из UUID)."""
return self.uuid.int
def __str__(self):
return f"{self.name} ({self.account_type})"
class Meta:
verbose_name = "Account"
verbose_name_plural = "Accounts"
ordering = ['-created_at']
class OperationCode(models.Model):
"""
Код операции (справочник типов транзакций).
Используется как 'code' поле в TigerBeetle transfer.
"""
code = models.PositiveIntegerField(unique=True, help_text="Числовой код для TigerBeetle")
name = models.CharField(max_length=255, unique=True, help_text="Название операции")
description = models.TextField(blank=True, null=True)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f"{self.code}: {self.name}"
class Meta:
verbose_name = "Operation Code"
verbose_name_plural = "Operation Codes"
ordering = ['code']
class ServiceAccount(models.Model):
"""
Сервисный аккаунт (банк, revenue, etc).
Это Account с особым назначением в системе.
"""
account = models.OneToOneField(
Account,
on_delete=models.CASCADE,
primary_key=True,
related_name='service_info'
)
slug = models.SlugField(unique=True, help_text="Уникальный идентификатор (bank, revenue, etc)")
def __str__(self):
return f"{self.slug}: {self.account.name}"
class Meta:
verbose_name = "Service Account"
verbose_name_plural = "Service Accounts"