Заголовок: Company Aggregate root
Краткое описание в одном предложении: Агрегат компании управляет жизненным циклом компании, её реквизитами, базовыми ролями участников
| Свойства/Действия | Тип | Комментарий |
|---|---|---|
| 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». |
| 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