Company Aggregate

1) Заголовок и описание

Заголовок: Company Aggregate root

Краткое описание в одном предложении: Агрегат компании управляет жизненным циклом компании, её реквизитами, базовыми ролями участников

2) Таблица свойств агрегата

Свойства/Действия Тип Комментарий
Id UUID Агрегатный ключ. Назначается один раз и неизменяем. Уникален в пределах контекста Companies.
OwnerId UUID Ссылка на Users.User. Инварианты: обязательно, кардинальность 1→1 владельца на компанию при создании. Может быть переназначен только пользователю‑участнику.
Name Company Name VO Обязательно. Уникально в пределах бизнес‑ограничений, с учётом нормализации (trim, collapse spaces, case‑insensitive сравнение). Минимум 2 символа.
Address Address VO (LocationId) Необязательно. Ссылка на систему локаций. Если задан, LocationId должен существовать и быть активным в «Locations».
Email Company Email VO Необязательно. Формат RFC 5321/5322. Хранится в нижнем регистре. Верифицируется через подтверждение (флаг в VO вне агрегата).
Phone Company Phone VO Необязательно. Валидный E.164. Хранится в каноническом виде. Одна запись на агрегат.
Members Collection<Member> Состав участников компании. Каждый Member: {UserId: UUID, Role: CompanyRole}. Инварианты: уникальность по UserId; минимум 1 участник (владелец) всегда.
Roles Enum CompanyRole Текущие значения: Creator, Member. Расширяемо в будущем через каталог ролей. Creator имеет все права; Member без специальных прав.
Status Status Состояния: Draft → Active → Suspended → Archived. Переходы: Draft→Active при валидации реквизитов; Active↔Suspended по действиям администрирования; Archived только из Suspended, необратимо.
createdAt / updatedAt / updatedBy datetime / datetime / UUID Заполняются системой. updatedBy — UserId инициатора.
Доменные события events Company.Created, Company.InfoUpdated, Company.MemberInvitationSent, Company.MemberAdded, Company.MemberRoleChanged, Company.MemberRemoved, Company.TariffAttached, Company.TariffUpdated, Company.StatusChanged, Company.Archived.

Use cases