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

Атрибутивный состав сущностей «Аккаунт» и «Пользователь»

Аккаунт (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-...
email 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 : имеет статус согласия