# Создать согласование

export default function Layout(props) {
  const { OpenAPIPage } = props.components ?? {};
  return (
    <>
      {props.children}
      ## Создать согласование

`POST /api/v1/approvals`

**Авторизация:** dpop или oauth2: `approval:write`

**Тело запроса** (`application/json`, обязательное): object
- `context`: string — Пояснение для участников
- `documentId`: string (uuid) — Основной согласуемый документ; обязателен для subject block/variable
- `documentIds`: массив string (uuid) — Все согласуемые документы; первый считается основным. Без него используется documentId
- `documentTitle`: string, обязательное — Название согласования (обычно название документа)
- `dueAt`: string (date-time) — Общий срок согласования, ISO 8601
- `initiatorId`: string — Инициатор; подставляется из токена
- `initiatorName`: string — Имя инициатора; подставляется из токена
- `nextStep`: "signing" — Что сделать после согласования: signing — отправить на подпись
- `reminderMode`: "none" | "before_due" | "daily" — Автонапоминания: none, before_due (за рабочий день до срока), daily (каждый рабочий день до решения)
- `signing`: object — Подписание, которое запустится автоматически после согласования
  - `message`: string — Сообщение подписантам
  - `order`: "parallel" | "sequential" — parallel: все подписывают одновременно, sequential: по очереди в порядке списка
  - `signers`: массив object, обязательное — Кто подписывает, в порядке подписания
    - `email`: string (email), обязательное — Email, на который придёт приглашение подписать
    - `name`: string, обязательное — Имя подписанта
    - `userId`: string (uuid) — Пользователь команды; у внешнего подписанта не указывается
- `stages`: массив object, обязательное — Этапы согласования, выполняются по порядку
  - `approvalMode`: "sequential" | "parallel" | "race", обязательное — Порядок этапа: sequential — по очереди, parallel — одновременно, race — до первого решения
  - `autoApproval`: boolean — Включить автозавершение этапа по сроку
  - `autoApprovalAction`: "approve" | "reject" — Действие при автозавершении: согласовать или отклонить
  - `autoApprovalDeadline`: string (date-time) — Дедлайн автозавершения, ISO 8601
  - `autoApprovalHours`: number — Часов до автозавершения
  - `completionCondition`: "unanimous" | "majority" | "priority" — Условие завершения: unanimous — все, majority — большинство, priority — решает приоритетный участник
  - `condition`: object — Этап выполняется, только если значение переменной удовлетворяет условию
    - `blockId`: string — Блок с переменной; без него переменная ищется во всём документе
    - `documentId`: string (uuid), обязательное — Документ, из которого берётся значение
    - `key`: string, обязательное — Ключ переменной документа
    - `label`: string, обязательное — Подпись переменной
    - `operator`: "gt" | "gte" | "lt" | "lte" | "eq" | "neq", обязательное — Сравнение значения переменной с порогом
    - `value`: string, обязательное — Порог сравнения
    - `valueLabel`: string — Порог в читаемом виде
  - `description`: string — Описание этапа
  - `minVotes`: number — Минимум голосов для режима race
  - `name`: string, обязательное — Название этапа
  - `participants`: массив object, обязательное — Участники этапа; минимум один с действием approve
    - `action`: "approve" | "review", обязательное — Роль: approve — согласует, review — только знакомится
    - `userId`: string, обязательное — Идентификатор участника
    - `userName`: string, обязательное — Отображаемое имя участника
  - `priorityVoterId`: string — Участник, чьё решение завершает этап; обязателен при completionCondition = priority
  - `requireAllViewed`: boolean — Требовать просмотра документа всеми участниками
  - `requireRejectionReason`: boolean — Требовать причину при отклонении
  - `timerHours`: number — Таймер этапа в часах (для напоминаний)
- `subject`: object или object или object или object или object — Предмет согласования: документ, выбранные пункты, блок, вопрос или переменные
- `type`: string, обязательное — Тип согласования (классификация команды)

**Ответы**

- `201` — Согласование создано и запущено (`application/json`, Approval)
  - `comments`: массив ApprovalComment — Комментарии (в детальном ответе)
    - `createdAt`: string, обязательное — Когда создан, ISO 8601
    - `id`: string (uuid), обязательное — Идентификатор комментария
    - `text`: string, обязательное — Текст комментария
    - `userId`: string, обязательное — Автор
    - `userName`: string, обязательное — Имя автора
  - `completedAt`: string, nullable — Когда завершено, ISO 8601
  - `context`: string, nullable — Пояснение для участников
  - `createdAt`: string, обязательное — Когда создано, ISO 8601
  - `currentStage`: number, обязательное — Текущий этап
  - `documentId`: string, nullable, обязательное — Основной согласуемый документ; null — согласование без документа
  - `documentIds`: массив string — Все согласуемые документы, по порядку
  - `documentTitle`: string, обязательное — Название согласования
  - `history`: массив object — Журнал событий (в детальном ответе)
  - `historyChainValid`: boolean — Цела ли hash-цепочка журнала
  - `id`: string (uuid), обязательное — Идентификатор согласования
  - `initiatorId`: string, обязательное — Инициатор
  - `initiatorName`: string, обязательное — Имя инициатора
  - `participants`: массив ApprovalParticipant — Все участники (в детальном ответе)
    - `action`: string, обязательное — Роль: approve или review
    - `comment`: string, nullable — Комментарий к решению
    - `decidedById`: string, nullable — Кто принял решение за участника (заместитель)
    - `decidedByName`: string, nullable — Имя того, кто принял решение за участника
    - `deputyUntil`: string, nullable — Последний день отсутствия участника, YYYY-MM-DD
    - `deputyUserId`: string, nullable — Заместитель из оргструктуры, который может решить за отсутствующего участника
    - `deputyUserName`: string, nullable — Имя заместителя
    - `id`: string (uuid), обязательное — Идентификатор участника
    - `rejectedItemIds`: массив string — Пункты, которые участник отклонил; пусто при отклонении целиком
    - `stageNumber`: number, обязательное — Номер этапа
    - `status`: string, обязательное — Состояние решения участника
    - `userId`: string, обязательное — Пользователь
    - `userName`: string, обязательное — Отображаемое имя
  - `revisions`: массив object — Доработки: кто и что отклонил, что исправлено, когда отправлено повторно
  - `round`: integer — Раунд согласования: 1, затем +1 после каждой доработки
  - `stages`: массив ApprovalStage — Этапы с участниками (в детальном ответе)
    - `approvalMode`: string, обязательное — Порядок: sequential, parallel или race
    - `id`: string (uuid), обязательное — Идентификатор этапа
    - `name`: string, обязательное — Название этапа
    - `participants`: массив ApprovalParticipant — Участники этапа
      - `action`: string, обязательное — Роль: approve или review
      - `comment`: string, nullable — Комментарий к решению
      - `decidedById`: string, nullable — Кто принял решение за участника (заместитель)
      - `decidedByName`: string, nullable — Имя того, кто принял решение за участника
      - `deputyUntil`: string, nullable — Последний день отсутствия участника, YYYY-MM-DD
      - `deputyUserId`: string, nullable — Заместитель из оргструктуры, который может решить за отсутствующего участника
      - `deputyUserName`: string, nullable — Имя заместителя
      - `id`: string (uuid), обязательное — Идентификатор участника
      - `rejectedItemIds`: массив string — Пункты, которые участник отклонил; пусто при отклонении целиком
      - `stageNumber`: number, обязательное — Номер этапа
      - `status`: string, обязательное — Состояние решения участника
      - `userId`: string, обязательное — Пользователь
      - `userName`: string, обязательное — Отображаемое имя
    - `stageNumber`: number, обязательное — Порядковый номер этапа
    - `status`: string, обязательное — Состояние этапа
  - `status`: string, обязательное — Статус: in_progress, approved, rejected, revoked
  - `subjectKind`: string, обязательное — Предмет: document, block, question или variable
  - `teamId`: string, обязательное — Команда-владелец
  - `totalStages`: number, обязательное — Всего этапов
  - `type`: string, обязательное — Тип согласования
  - `updatedAt`: string, обязательное — Когда обновлено, ISO 8601
- `400` — Некорректный запрос: не прошла валидация параметров или тела (`application/problem+json`, ProblemDetails)
- `401` — Токен отсутствует, недействителен или истёк (`application/problem+json`, ProblemDetails)
- `403` — Недостаточно прав или scope (`application/problem+json`, ProblemDetails)

    </>
  );
}
