Атрибутивный состав сущностей «Аккаунт» и «Пользователь»¶
Аккаунт (Account)¶
Юридическое лицо – владелец лицензии и контейнер для пользователей.
| Поле | Тип | Обязательное | Описание | Пример / Примечание |
|---|---|---|---|---|
| id | UUID | Да | Уникальный идентификатор аккаунта | a1b2c3d4-... |
| name | String(255) | Да | Полное наименование организации | ООО «ТрансПроект» |
| tax_id | String(20) | Нет | ИНН / регистрационный номер | 7701123456 |
| contact_email | String(255) | Да | Email для связи (юридический) | info@transproekt.ru |
| contact_phone | String(20) | Нет | Контактный телефон | +7 (495) 123-45-67 |
| status | Справочник | Да | Текущее состояние аккаунта | ACTIVE, INACTIVE (деактивирован) |
| is_system | Boolean | Да | Флаг системного аккаунта (для администраторов) | false – по умолчанию; true – только один системный аккаунт |
| created_at | DateTime | Да | Дата и время создания | 2025-01-15T10:30:00Z |
| updated_at | DateTime | Да | Дата последнего изменения | 2025-02-20T14:22:00Z |
| deactivated_at | DateTime | Нет | Дата деактивации аккаунта | заполняется при переходе в INACTIVE |
Лицензии (License)¶
Конкретные эземпляры лицензий на аккаунт, в том числе история лицензий
| Поле | Тип | Обязательное | Описание | Пример / Примечание |
|---|---|---|---|---|
| id | UUID | Да | Уникальный ИД записи экземпляра лицензии | |
| account_id | UUID | Да | ИД аккаунта с которым связана данная лицензия | |
| subscription_type | UUID | Да | Тип лицензии | |
| users_count | Справочник | Да | Предельное число пользователей | от 1 до 5 |
| subscription_starts_at | DateTime | Да | Дата начала лицензии | 2025-01-15T00:00:01Z |
| subscription_expires_at | DateTime | Нет | Дата окончания лицензии | 2026-01-15T23:59:59Z |
Типы лицензий (SubscriptionType)¶
Типы лицензий. Именно тип определяет структуру прав, базовый ценник
| Поле | Тип | Обязательное | Описание | Пример / Примечание |
|---|---|---|---|---|
| id | UUID | Да | Уникальный ИД записи типа лицензии | |
| name | String | Да | ИД аккаунта с которым связана данная лицензия | |
| base_price | Decimal | Да | Тип лицензии | |
| billing_period | СПравочник | Да | Дата начала лицензии | месяц |
| features | JSON | Да | Доступные права на лицензии | |
| is_active | Boolean | Да | Активна ли | TRUE |
Пользователь (User)¶
Физическое лицо – учётная запись человека, работающего в системе. Пользователь всегда принадлежит ровно одному аккаунту (включая системный).
| Поле | Тип | Обязательное | Описание | Пример / Примечание |
|---|---|---|---|---|
| id | UUID | Да | Уникальный идентификатор пользователя | u123e456-... |
| String(255) | Да | Адрес электронной почты (логин) | ivanov@transproekt.ru | |
| password_hash | String(255) | Да* | Хэш пароля (null для приглашённых) | $2a$10$... |
| first_name | String(100) | Да | Имя | Иван |
| last_name | String(100) | Да | Фамилия | Иванов |
| avatar_url | String(500) | Нет | Ссылка на аватар (загруженный файл) | /avatars/u123.jpg |
| account_id | UUID | Да | Идентификатор аккаунта, к которому привязан пользователь | FK → Account.id |
| role | Справочник | Да | Роль в рамках аккаунта | system_admin, account_manager, user |
| custom_permissions | JSON | Нет | Массив дополнительных прав доступа к модулям (выдаётся менеджером аккаунта) | |
| status | Справочник | Да | Статус учётной записи | INVITED, ACTIVE, DEACTIVATED, DELETED |
| invitation_sent_at | DateTime | Нет | Дата отправки приглашения | 2025-02-01T09:15:00Z |
| deactivation_date | DateTime | Нет | Плановая дата окончательного удаления (30 дней после деактивации) | 2025-03-03T00:00:00Z |
| created_at | DateTime | Да | Дата создания учётной записи | 2025-02-01T09:15:00Z |
| updated_at | DateTime | Да | Дата последнего изменения профиля | 2025-02-20T11:00:00Z |
| consent_granted_at | DateTime | Нет | Дата и время подписания согласия на обработку ПД | 2025-02-01T09:20:00Z |
| consent_expires_at | DateTime | Нет | Дата истечения срока действия согласия | 2026-02-01T23:59:59Z |
| consent_status | Справочник | Да** | Статус согласия на обработку ПД | GRANTED, EXPIRED, REVOKED, NOT_GIVEN |
Возможно 3 последних поля вынести отдельно в управление согласиями
Диаграмма классов¶
classDiagram
class Account {
-id: UUID
-name: String
-tax_id: String
-contact_email: String
-contact_phone: String
-status: AccountStatus
-is_system: Boolean
-created_at: DateTime
-updated_at: DateTime
-deactivated_at: DateTime
}
class License {
-id: UUID
-account_id: UUID
-subscription_type_id: UUID
-users_count: UsersCount
-subscription_starts_at: DateTime
-subscription_expires_at: DateTime
}
class SubscriptionType {
-id: UUID
-name: String
-description: String
-base_price: Decimal
-billing_period: TimePeriods
-features: JSON
-is_active: Boolean
}
class User {
-id: UUID
-email: String
-password_hash: String
-first_name: String
-last_name: String
-avatar_url: String
-account_id: UUID
-role: UserRole
-custom_permissions: JSON
-status: UserStatus
-invitation_sent_at: DateTime
-deactivation_date: DateTime
-created_at: DateTime
-updated_at: DateTime
-consent_granted_at: DateTime
-consent_expires_at: DateTime
-consent_status: ConsentStatus
}
class AccountStatus {
<<Справочник>>
ACTIVE
INACTIVE
}
class UserRole {
<<Справочник>>
SYSTEM_ADMIN
ACCOUNT_MANAGER
USER
}
class UserStatus {
<<Справочник>>
INVITED
ACTIVE
DEACTIVATED
DELETED
}
class ConsentStatus {
<<Справочник>>
GRANTED
EXPIRED
REVOKED
NOT_GIVEN
}
class UsersCount {
<<Справочник>>
5
15
50
more
}
class TimePeriods {
<<Справочник>>
Неделя
Месяц
Год
Бессрочно
}
Account "1" --> "0..*" User : содержит
Account "1" --> "0..*" License : имеет активные и архивные лицензии
License "*" --> "1" SubscriptionType : ссылается на
User --> "1" Account : принадлежит
User --> ConsentStatus : имеет статус согласия