openapi: 3.1.0
paths:
  /v1/metrics:
    get:
      operationId: MetricsController_scrape
      summary: Prometheus scrape endpoint
      description: >-
        Возвращает текстовый snapshot всех зарегистрированных prom-client метрик
        в exposition-формате Prometheus. Эндпоинт публичный, потребляется
        prometheus-сервером.
      parameters: []
      responses:
        '200':
          description: Prometheus exposition format (text/plain; version=0.0.4)
          content:
            application/json:
              schema:
                type: string
      tags:
        - Observability
      security:
        - bearer: []
  /api/v1/refs/registry:
    get:
      operationId: RefsRegistryController_list
      summary: Реестр зарегистрированных справочников
      description: >-
        Discovery-список всех справочников, зарегистрированных через RefRegistry
        (ADR-0014). Возвращает module, entity, displayName, ownerModule и
        readPath для UI и интеграций.
      parameters: []
      responses:
        '200':
          description: Список записей реестра справочников
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/RefRegistryEntryDto_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Refs / registry
      security:
        - bearer: []
  /v1/health:
    get:
      operationId: HealthController_liveness
      summary: Liveness probe (процесс жив)
      description: Kubernetes livenessProbe — возвращает 200 если процесс API отвечает.
      parameters: []
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LivenessResponseDto_Output'
      tags:
        - Health
      security:
        - bearer: []
  /v1/health/liveness:
    get:
      operationId: HealthController_livenessAlias
      summary: Liveness probe (alias)
      description: Алиас корневого liveness endpoint для k8s.
      parameters: []
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LivenessAliasResponseDto_Output'
      tags:
        - Health
      security:
        - bearer: []
  /v1/health/readiness:
    get:
      operationId: HealthController_readiness
      summary: Readiness probe (Postgres + Redis + Keycloak + MinIO)
      description: Kubernetes readinessProbe — проверяет доступность всех зависимостей.
      parameters: []
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ReadinessResponseDto_Output'
        '503':
          description: The Health Check is not successful
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    example: error
                  info:
                    type: object
                    example:
                      database:
                        status: up
                    additionalProperties:
                      type: object
                      required:
                        - status
                      properties:
                        status:
                          type: string
                      additionalProperties: true
                    nullable: true
                  error:
                    type: object
                    example:
                      redis:
                        status: down
                        message: Could not connect
                    additionalProperties:
                      type: object
                      required:
                        - status
                      properties:
                        status:
                          type: string
                      additionalProperties: true
                    nullable: true
                  details:
                    type: object
                    example:
                      database:
                        status: up
                      redis:
                        status: down
                        message: Could not connect
                    additionalProperties:
                      type: object
                      required:
                        - status
                      properties:
                        status:
                          type: string
                      additionalProperties: true
      tags:
        - Health
      security:
        - bearer: []
  /v1/health/dependencies:
    get:
      operationId: HealthController_dependencies
      summary: Deep dependencies check (alias readiness)
      description: Расширенная проверка зависимостей (alias readiness).
      parameters: []
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ReadinessResponseDto_Output'
        '503':
          description: The Health Check is not successful
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    example: error
                  info:
                    type: object
                    example:
                      database:
                        status: up
                    additionalProperties:
                      type: object
                      required:
                        - status
                      properties:
                        status:
                          type: string
                      additionalProperties: true
                    nullable: true
                  error:
                    type: object
                    example:
                      redis:
                        status: down
                        message: Could not connect
                    additionalProperties:
                      type: object
                      required:
                        - status
                      properties:
                        status:
                          type: string
                      additionalProperties: true
                    nullable: true
                  details:
                    type: object
                    example:
                      database:
                        status: up
                      redis:
                        status: down
                        message: Could not connect
                    additionalProperties:
                      type: object
                      required:
                        - status
                      properties:
                        status:
                          type: string
                      additionalProperties: true
      tags:
        - Health
      security:
        - bearer: []
  /api/v1/core/refs/production-objects:
    get:
      operationId: core_production-objects_RefCrudController_list
      summary: Список справочника production-objects
      description: >-
        Возвращает записи справочника production objects. Параметр
        `activeOnly=true` исключает неактивные записи. Роли: CEO, Engineer,
        Foreman, Mechanic, OtibSpecialist, Supply, Admin.
      parameters:
        - name: activeOnly
          required: false
          in: query
          description: >-
            Передай true чтобы получить только активные записи (без
            soft-deleted/expired)
          schema:
            type: boolean
      responses:
        '200':
          description: Список записей справочника production-objects
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/ProductionObjectResponseDto_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Core / refs / production-objects
      security:
        - bearer: []
  /api/v1/core/refs/production-objects/{id}:
    get:
      operationId: core_production-objects_RefCrudController_findById
      summary: Карточка записи production-objects по id
      description: >-
        Возвращает одну запись справочника production objects по UUID. Роли:
        CEO, Engineer, Foreman, Mechanic, OtibSpecialist, Supply, Admin.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID записи справочника production-objects
          schema:
            format: uuid
            type: string
      responses:
        '200':
          description: Запись справочника production-objects найдена
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProductionObjectResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Core / refs / production-objects
      security:
        - bearer: []
    patch:
      operationId: core_production-objects_RefCrudController_update
      summary: Обновить запись production-objects
      description: >-
        Частичное обновление записи справочника production objects. Роли: Admin,
        CEO. Допустимые поля задаёт updateSchema модуля-владельца.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID записи справочника production-objects
          schema:
            format: uuid
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RefUpdateDto'
      responses:
        '200':
          description: Запись справочника production-objects обновлена
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProductionObjectResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Core / refs / production-objects
      security:
        - bearer: []
  /api/v1/core/refs/production-objects/import/preview:
    post:
      operationId: core_production-objects_RefImportController_preview
      summary: 'Preview bulk-import: core/production-objects'
      description: >-
        Валидирует строки импорта и возвращает diff
        (создание/обновление/деактивация) без записи в БД. Роли: Admin, CEO.
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BulkImportPreviewDto'
      responses:
        '200':
          description: Preview batch с diff и сроком истечения
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RefImportPreviewResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Core / refs / production-objects
      security:
        - bearer: []
  /api/v1/core/refs/production-objects/import/commit:
    post:
      operationId: core_production-objects_RefImportController_commit
      summary: 'Commit bulk-import: core/production-objects'
      description: >-
        Применяет ранее провалидированный batch из preview. Требует
        Idempotency-Key. Роли: Admin, CEO.
      parameters:
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BulkImportCommitDto'
      responses:
        '200':
          description: Batch применён, возвращены счётчики изменений
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RefImportCommitResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Core / refs / production-objects
      security:
        - bearer: []
  /api/v1/core/refs/production-objects/import/commit/{batchId}:
    post:
      operationId: core_production-objects_RefImportController_commitByParam
      summary: 'Commit bulk-import по batchId в URL: core/production-objects'
      description: >-
        Альтернатива commit с batchId в path вместо body. Требует
        Idempotency-Key. Роли: Admin, CEO.
      parameters:
        - name: batchId
          required: true
          in: path
          description: UUID batch'а, полученный из preview
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      responses:
        '200':
          description: Batch применён, возвращены счётчики изменений
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RefImportCommitResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Core / refs / production-objects
      security:
        - bearer: []
  /api/v1/core/refs/tmc-categories:
    get:
      operationId: core_tmc-categories_RefCrudController_list
      summary: Список справочника tmc-categories
      description: >-
        Возвращает записи справочника tmc categories. Параметр `activeOnly=true`
        исключает неактивные записи. Роли: CEO, Engineer, Foreman, Mechanic,
        OtibSpecialist, Supply, Admin.
      parameters:
        - name: activeOnly
          required: false
          in: query
          description: >-
            Передай true чтобы получить только активные записи (без
            soft-deleted/expired)
          schema:
            type: boolean
      responses:
        '200':
          description: Список записей справочника tmc-categories
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/TmcCategoryResponseDto_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Core / refs / tmc-categories
      security:
        - bearer: []
  /api/v1/core/refs/tmc-categories/{id}:
    get:
      operationId: core_tmc-categories_RefCrudController_findById
      summary: Карточка записи tmc-categories по id
      description: >-
        Возвращает одну запись справочника tmc categories по UUID. Роли: CEO,
        Engineer, Foreman, Mechanic, OtibSpecialist, Supply, Admin.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID записи справочника tmc-categories
          schema:
            format: uuid
            type: string
      responses:
        '200':
          description: Запись справочника tmc-categories найдена
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TmcCategoryResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Core / refs / tmc-categories
      security:
        - bearer: []
    patch:
      operationId: core_tmc-categories_RefCrudController_update
      summary: Обновить запись tmc-categories
      description: >-
        Частичное обновление записи справочника tmc categories. Роли: Admin,
        CEO, Supply. Допустимые поля задаёт updateSchema модуля-владельца.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID записи справочника tmc-categories
          schema:
            format: uuid
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RefUpdateDto'
      responses:
        '200':
          description: Запись справочника tmc-categories обновлена
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TmcCategoryResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Core / refs / tmc-categories
      security:
        - bearer: []
  /api/v1/core/refs/tmc-categories/import/preview:
    post:
      operationId: core_tmc-categories_RefImportController_preview
      summary: 'Preview bulk-import: core/tmc-categories'
      description: >-
        Валидирует строки импорта и возвращает diff
        (создание/обновление/деактивация) без записи в БД. Роли: Admin, CEO,
        Supply.
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BulkImportPreviewDto'
      responses:
        '200':
          description: Preview batch с diff и сроком истечения
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RefImportPreviewResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Core / refs / tmc-categories
      security:
        - bearer: []
  /api/v1/core/refs/tmc-categories/import/commit:
    post:
      operationId: core_tmc-categories_RefImportController_commit
      summary: 'Commit bulk-import: core/tmc-categories'
      description: >-
        Применяет ранее провалидированный batch из preview. Требует
        Idempotency-Key. Роли: Admin, CEO, Supply.
      parameters:
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BulkImportCommitDto'
      responses:
        '200':
          description: Batch применён, возвращены счётчики изменений
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RefImportCommitResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Core / refs / tmc-categories
      security:
        - bearer: []
  /api/v1/core/refs/tmc-categories/import/commit/{batchId}:
    post:
      operationId: core_tmc-categories_RefImportController_commitByParam
      summary: 'Commit bulk-import по batchId в URL: core/tmc-categories'
      description: >-
        Альтернатива commit с batchId в path вместо body. Требует
        Idempotency-Key. Роли: Admin, CEO, Supply.
      parameters:
        - name: batchId
          required: true
          in: path
          description: UUID batch'а, полученный из preview
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      responses:
        '200':
          description: Batch применён, возвращены счётчики изменений
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RefImportCommitResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Core / refs / tmc-categories
      security:
        - bearer: []
  /api/v1/core/refs/downtime-categories:
    get:
      operationId: core_downtime-categories_RefCrudController_list
      summary: Список справочника downtime-categories
      description: >-
        Возвращает записи справочника downtime categories. Параметр
        `activeOnly=true` исключает неактивные записи. Роли: CEO, Engineer,
        Foreman, Mechanic, OtibSpecialist, Supply, Admin.
      parameters:
        - name: activeOnly
          required: false
          in: query
          description: >-
            Передай true чтобы получить только активные записи (без
            soft-deleted/expired)
          schema:
            type: boolean
      responses:
        '200':
          description: Список записей справочника downtime-categories
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/DowntimeCategoryResponseDto_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Core / refs / downtime-categories
      security:
        - bearer: []
  /api/v1/core/refs/downtime-categories/{id}:
    get:
      operationId: core_downtime-categories_RefCrudController_findById
      summary: Карточка записи downtime-categories по id
      description: >-
        Возвращает одну запись справочника downtime categories по UUID. Роли:
        CEO, Engineer, Foreman, Mechanic, OtibSpecialist, Supply, Admin.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID записи справочника downtime-categories
          schema:
            format: uuid
            type: string
      responses:
        '200':
          description: Запись справочника downtime-categories найдена
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DowntimeCategoryResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Core / refs / downtime-categories
      security:
        - bearer: []
    patch:
      operationId: core_downtime-categories_RefCrudController_update
      summary: Обновить запись downtime-categories
      description: >-
        Частичное обновление записи справочника downtime categories. Роли:
        Admin, CEO. Допустимые поля задаёт updateSchema модуля-владельца.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID записи справочника downtime-categories
          schema:
            format: uuid
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RefUpdateDto'
      responses:
        '200':
          description: Запись справочника downtime-categories обновлена
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DowntimeCategoryResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Core / refs / downtime-categories
      security:
        - bearer: []
  /api/v1/core/refs/downtime-categories/import/preview:
    post:
      operationId: core_downtime-categories_RefImportController_preview
      summary: 'Preview bulk-import: core/downtime-categories'
      description: >-
        Валидирует строки импорта и возвращает diff
        (создание/обновление/деактивация) без записи в БД. Роли: Admin, CEO.
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BulkImportPreviewDto'
      responses:
        '200':
          description: Preview batch с diff и сроком истечения
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RefImportPreviewResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Core / refs / downtime-categories
      security:
        - bearer: []
  /api/v1/core/refs/downtime-categories/import/commit:
    post:
      operationId: core_downtime-categories_RefImportController_commit
      summary: 'Commit bulk-import: core/downtime-categories'
      description: >-
        Применяет ранее провалидированный batch из preview. Требует
        Idempotency-Key. Роли: Admin, CEO.
      parameters:
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BulkImportCommitDto'
      responses:
        '200':
          description: Batch применён, возвращены счётчики изменений
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RefImportCommitResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Core / refs / downtime-categories
      security:
        - bearer: []
  /api/v1/core/refs/downtime-categories/import/commit/{batchId}:
    post:
      operationId: core_downtime-categories_RefImportController_commitByParam
      summary: 'Commit bulk-import по batchId в URL: core/downtime-categories'
      description: >-
        Альтернатива commit с batchId в path вместо body. Требует
        Idempotency-Key. Роли: Admin, CEO.
      parameters:
        - name: batchId
          required: true
          in: path
          description: UUID batch'а, полученный из preview
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      responses:
        '200':
          description: Batch применён, возвращены счётчики изменений
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RefImportCommitResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Core / refs / downtime-categories
      security:
        - bearer: []
  /api/v1/core/refs/hse-incident-classifiers:
    get:
      operationId: core_hse-incident-classifiers_RefCrudController_list
      summary: Список справочника hse-incident-classifiers
      description: >-
        Возвращает записи справочника hse incident classifiers. Параметр
        `activeOnly=true` исключает неактивные записи. Роли: CEO, Engineer,
        Foreman, Mechanic, OtibSpecialist, Supply, Admin.
      parameters:
        - name: activeOnly
          required: false
          in: query
          description: >-
            Передай true чтобы получить только активные записи (без
            soft-deleted/expired)
          schema:
            type: boolean
      responses:
        '200':
          description: Список записей справочника hse-incident-classifiers
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/HseIncidentClassifierResponseDto_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Core / refs / hse-incident-classifiers
      security:
        - bearer: []
  /api/v1/core/refs/hse-incident-classifiers/{id}:
    get:
      operationId: core_hse-incident-classifiers_RefCrudController_findById
      summary: Карточка записи hse-incident-classifiers по id
      description: >-
        Возвращает одну запись справочника hse incident classifiers по UUID.
        Роли: CEO, Engineer, Foreman, Mechanic, OtibSpecialist, Supply, Admin.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID записи справочника hse-incident-classifiers
          schema:
            format: uuid
            type: string
      responses:
        '200':
          description: Запись справочника hse-incident-classifiers найдена
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HseIncidentClassifierResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Core / refs / hse-incident-classifiers
      security:
        - bearer: []
    patch:
      operationId: core_hse-incident-classifiers_RefCrudController_update
      summary: Обновить запись hse-incident-classifiers
      description: >-
        Частичное обновление записи справочника hse incident classifiers. Роли:
        Admin, CEO, OtibSpecialist. Допустимые поля задаёт updateSchema
        модуля-владельца.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID записи справочника hse-incident-classifiers
          schema:
            format: uuid
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RefUpdateDto'
      responses:
        '200':
          description: Запись справочника hse-incident-classifiers обновлена
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HseIncidentClassifierResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Core / refs / hse-incident-classifiers
      security:
        - bearer: []
  /api/v1/core/refs/hse-incident-classifiers/import/preview:
    post:
      operationId: core_hse-incident-classifiers_RefImportController_preview
      summary: 'Preview bulk-import: core/hse-incident-classifiers'
      description: >-
        Валидирует строки импорта и возвращает diff
        (создание/обновление/деактивация) без записи в БД. Роли: Admin, CEO,
        OtibSpecialist.
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BulkImportPreviewDto'
      responses:
        '200':
          description: Preview batch с diff и сроком истечения
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RefImportPreviewResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Core / refs / hse-incident-classifiers
      security:
        - bearer: []
  /api/v1/core/refs/hse-incident-classifiers/import/commit:
    post:
      operationId: core_hse-incident-classifiers_RefImportController_commit
      summary: 'Commit bulk-import: core/hse-incident-classifiers'
      description: >-
        Применяет ранее провалидированный batch из preview. Требует
        Idempotency-Key. Роли: Admin, CEO, OtibSpecialist.
      parameters:
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BulkImportCommitDto'
      responses:
        '200':
          description: Batch применён, возвращены счётчики изменений
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RefImportCommitResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Core / refs / hse-incident-classifiers
      security:
        - bearer: []
  /api/v1/core/refs/hse-incident-classifiers/import/commit/{batchId}:
    post:
      operationId: core_hse-incident-classifiers_RefImportController_commitByParam
      summary: 'Commit bulk-import по batchId в URL: core/hse-incident-classifiers'
      description: >-
        Альтернатива commit с batchId в path вместо body. Требует
        Idempotency-Key. Роли: Admin, CEO, OtibSpecialist.
      parameters:
        - name: batchId
          required: true
          in: path
          description: UUID batch'а, полученный из preview
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      responses:
        '200':
          description: Batch применён, возвращены счётчики изменений
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RefImportCommitResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Core / refs / hse-incident-classifiers
      security:
        - bearer: []
  /api/v1/eam/refs/asset-classes:
    get:
      operationId: eam_asset-classes_RefCrudController_list
      summary: Список справочника asset-classes
      description: >-
        Возвращает записи справочника asset classes. Параметр `activeOnly=true`
        исключает неактивные записи. Роли: CEO, Engineer, Foreman, Mechanic,
        OtibSpecialist, Supply, Admin.
      parameters:
        - name: activeOnly
          required: false
          in: query
          description: >-
            Передай true чтобы получить только активные записи (без
            soft-deleted/expired)
          schema:
            type: boolean
      responses:
        '200':
          description: Список записей справочника asset-classes
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/AssetClassResponseDto_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - EAM / refs / asset-classes
      security:
        - bearer: []
  /api/v1/eam/refs/asset-classes/{id}:
    get:
      operationId: eam_asset-classes_RefCrudController_findById
      summary: Карточка записи asset-classes по id
      description: >-
        Возвращает одну запись справочника asset classes по UUID. Роли: CEO,
        Engineer, Foreman, Mechanic, OtibSpecialist, Supply, Admin.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID записи справочника asset-classes
          schema:
            format: uuid
            type: string
      responses:
        '200':
          description: Запись справочника asset-classes найдена
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AssetClassResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - EAM / refs / asset-classes
      security:
        - bearer: []
    patch:
      operationId: eam_asset-classes_RefCrudController_update
      summary: Обновить запись asset-classes
      description: >-
        Частичное обновление записи справочника asset classes. Роли: Admin, CEO.
        Допустимые поля задаёт updateSchema модуля-владельца.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID записи справочника asset-classes
          schema:
            format: uuid
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RefUpdateDto'
      responses:
        '200':
          description: Запись справочника asset-classes обновлена
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AssetClassResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - EAM / refs / asset-classes
      security:
        - bearer: []
  /api/v1/eam/refs/asset-classes/import/preview:
    post:
      operationId: eam_asset-classes_RefImportController_preview
      summary: 'Preview bulk-import: eam/asset-classes'
      description: >-
        Валидирует строки импорта и возвращает diff
        (создание/обновление/деактивация) без записи в БД. Роли: Admin, CEO.
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BulkImportPreviewDto'
      responses:
        '200':
          description: Preview batch с diff и сроком истечения
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RefImportPreviewResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - EAM / refs / asset-classes
      security:
        - bearer: []
  /api/v1/eam/refs/asset-classes/import/commit:
    post:
      operationId: eam_asset-classes_RefImportController_commit
      summary: 'Commit bulk-import: eam/asset-classes'
      description: >-
        Применяет ранее провалидированный batch из preview. Требует
        Idempotency-Key. Роли: Admin, CEO.
      parameters:
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BulkImportCommitDto'
      responses:
        '200':
          description: Batch применён, возвращены счётчики изменений
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RefImportCommitResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - EAM / refs / asset-classes
      security:
        - bearer: []
  /api/v1/eam/refs/asset-classes/import/commit/{batchId}:
    post:
      operationId: eam_asset-classes_RefImportController_commitByParam
      summary: 'Commit bulk-import по batchId в URL: eam/asset-classes'
      description: >-
        Альтернатива commit с batchId в path вместо body. Требует
        Idempotency-Key. Роли: Admin, CEO.
      parameters:
        - name: batchId
          required: true
          in: path
          description: UUID batch'а, полученный из preview
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      responses:
        '200':
          description: Batch применён, возвращены счётчики изменений
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RefImportCommitResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - EAM / refs / asset-classes
      security:
        - bearer: []
  /api/v1/eam/refs/maintenance-norms/import/preview:
    post:
      operationId: eam_maintenance-norms_RefImportController_preview
      summary: 'Preview bulk-import: eam/maintenance-norms'
      description: >-
        Валидирует строки импорта и возвращает diff
        (создание/обновление/деактивация) без записи в БД. Роли: Admin, CEO,
        Mechanic.
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BulkImportPreviewDto'
      responses:
        '200':
          description: Preview batch с diff и сроком истечения
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RefImportPreviewResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - EAM / refs / maintenance-norms
      security:
        - bearer: []
  /api/v1/eam/refs/maintenance-norms/import/commit:
    post:
      operationId: eam_maintenance-norms_RefImportController_commit
      summary: 'Commit bulk-import: eam/maintenance-norms'
      description: >-
        Применяет ранее провалидированный batch из preview. Требует
        Idempotency-Key. Роли: Admin, CEO, Mechanic.
      parameters:
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BulkImportCommitDto'
      responses:
        '200':
          description: Batch применён, возвращены счётчики изменений
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RefImportCommitResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - EAM / refs / maintenance-norms
      security:
        - bearer: []
  /api/v1/eam/refs/maintenance-norms/import/commit/{batchId}:
    post:
      operationId: eam_maintenance-norms_RefImportController_commitByParam
      summary: 'Commit bulk-import по batchId в URL: eam/maintenance-norms'
      description: >-
        Альтернатива commit с batchId в path вместо body. Требует
        Idempotency-Key. Роли: Admin, CEO, Mechanic.
      parameters:
        - name: batchId
          required: true
          in: path
          description: UUID batch'а, полученный из preview
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      responses:
        '200':
          description: Batch применён, возвращены счётчики изменений
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RefImportCommitResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - EAM / refs / maintenance-norms
      security:
        - bearer: []
  /api/v1/eam/refs/fuel-consumption-norms/import/preview:
    post:
      operationId: eam_fuel-consumption-norms_RefImportController_preview
      summary: 'Preview bulk-import: eam/fuel-consumption-norms'
      description: >-
        Валидирует строки импорта и возвращает diff
        (создание/обновление/деактивация) без записи в БД. Роли: Admin, CEO,
        Mechanic.
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BulkImportPreviewDto'
      responses:
        '200':
          description: Preview batch с diff и сроком истечения
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RefImportPreviewResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - EAM / refs / fuel-consumption-norms
      security:
        - bearer: []
  /api/v1/eam/refs/fuel-consumption-norms/import/commit:
    post:
      operationId: eam_fuel-consumption-norms_RefImportController_commit
      summary: 'Commit bulk-import: eam/fuel-consumption-norms'
      description: >-
        Применяет ранее провалидированный batch из preview. Требует
        Idempotency-Key. Роли: Admin, CEO, Mechanic.
      parameters:
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BulkImportCommitDto'
      responses:
        '200':
          description: Batch применён, возвращены счётчики изменений
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RefImportCommitResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - EAM / refs / fuel-consumption-norms
      security:
        - bearer: []
  /api/v1/eam/refs/fuel-consumption-norms/import/commit/{batchId}:
    post:
      operationId: eam_fuel-consumption-norms_RefImportController_commitByParam
      summary: 'Commit bulk-import по batchId в URL: eam/fuel-consumption-norms'
      description: >-
        Альтернатива commit с batchId в path вместо body. Требует
        Idempotency-Key. Роли: Admin, CEO, Mechanic.
      parameters:
        - name: batchId
          required: true
          in: path
          description: UUID batch'а, полученный из preview
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      responses:
        '200':
          description: Batch применён, возвращены счётчики изменений
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RefImportCommitResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - EAM / refs / fuel-consumption-norms
      security:
        - bearer: []
  /api/v1/eam/refs/maintenance-norms:
    get:
      operationId: MaintenanceNormsController_list
      summary: Список нормативов ТО
      description: >-
        По умолчанию — активные «сейчас». Передай `asOf` (ISO datetime) для
        point-in-time, `includeHistory=true` для всех версий.
      parameters:
        - name: assetClassCode
          required: false
          in: query
          description: Фильтр по коду класса актива
          schema:
            minLength: 1
            example: DRILL
            type: string
        - name: norm
          required: false
          in: query
          description: Фильтр по коду норматива
          schema:
            minLength: 1
            example: engine-oil-500h
            type: string
        - name: asOf
          required: false
          in: query
          description: Точка во времени для temporal-выборки
          schema:
            format: date-time
            pattern: >-
              ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
            example: '2026-05-18T08:00:00.000Z'
            type: string
        - name: includeHistory
          required: false
          in: query
          description: Включить исторические (неактивные) записи
          schema:
            example: false
            type: boolean
      responses:
        '200':
          description: Список нормативов ТО (активные на asOf или вся история)
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/NormResponseDto_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - EAM / refs / maintenance-norms
      security:
        - bearer: []
  /api/v1/eam/refs/maintenance-norms/{id}:
    get:
      operationId: MaintenanceNormsController_findById
      summary: Карточка норматива ТО по id
      description: Возвращает одну запись норматива ТО по UUID.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID норматива ТО
          schema:
            format: uuid
            type: string
      responses:
        '200':
          description: Норматив ТО найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NormResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - EAM / refs / maintenance-norms
      security:
        - bearer: []
  /api/v1/eam/refs/fuel-consumption-norms:
    get:
      operationId: FuelConsumptionNormsController_list
      summary: Список нормативов расхода ГСМ
      description: >-
        По умолчанию — активные «сейчас». Передай `asOf` (ISO datetime) для
        point-in-time, `includeHistory=true` для всех версий.
      parameters:
        - name: assetClassCode
          required: false
          in: query
          description: Фильтр по коду класса актива
          schema:
            minLength: 1
            example: DRILL
            type: string
        - name: norm
          required: false
          in: query
          description: Фильтр по коду норматива
          schema:
            minLength: 1
            example: engine-oil-500h
            type: string
        - name: asOf
          required: false
          in: query
          description: Точка во времени для temporal-выборки
          schema:
            format: date-time
            pattern: >-
              ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
            example: '2026-05-18T08:00:00.000Z'
            type: string
        - name: includeHistory
          required: false
          in: query
          description: Включить исторические (неактивные) записи
          schema:
            example: false
            type: boolean
      responses:
        '200':
          description: Список нормативов расхода ГСМ (активные на asOf или вся история)
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/NormResponseDto_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - EAM / refs / fuel-consumption-norms
      security:
        - bearer: []
  /api/v1/eam/refs/fuel-consumption-norms/{id}:
    get:
      operationId: FuelConsumptionNormsController_findById
      summary: Карточка норматива расхода ГСМ по id
      description: Возвращает одну запись норматива расхода ГСМ по UUID.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID норматива расхода ГСМ
          schema:
            format: uuid
            type: string
      responses:
        '200':
          description: Норматив расхода ГСМ найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NormResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - EAM / refs / fuel-consumption-norms
      security:
        - bearer: []
  /api/v1/hr/refs/system-roles:
    get:
      operationId: hr_system-roles_RefCrudController_list
      summary: Список справочника system-roles
      description: >-
        Возвращает записи справочника system roles. Параметр `activeOnly=true`
        исключает неактивные записи. Роли: CEO, Engineer, Foreman, Mechanic,
        OtibSpecialist, Supply, Admin.
      parameters:
        - name: activeOnly
          required: false
          in: query
          description: >-
            Передай true чтобы получить только активные записи (без
            soft-deleted/expired)
          schema:
            type: boolean
      responses:
        '200':
          description: Список записей справочника system-roles
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/SystemRoleResponseDto_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / refs / system-roles
      security:
        - bearer: []
  /api/v1/hr/refs/system-roles/{id}:
    get:
      operationId: hr_system-roles_RefCrudController_findById
      summary: Карточка записи system-roles по id
      description: >-
        Возвращает одну запись справочника system roles по UUID. Роли: CEO,
        Engineer, Foreman, Mechanic, OtibSpecialist, Supply, Admin.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID записи справочника system-roles
          schema:
            format: uuid
            type: string
      responses:
        '200':
          description: Запись справочника system-roles найдена
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SystemRoleResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / refs / system-roles
      security:
        - bearer: []
    patch:
      operationId: hr_system-roles_RefCrudController_update
      summary: Обновить запись system-roles
      description: >-
        Частичное обновление записи справочника system roles. Роли: Admin.
        Допустимые поля задаёт updateSchema модуля-владельца.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID записи справочника system-roles
          schema:
            format: uuid
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RefUpdateDto'
      responses:
        '200':
          description: Запись справочника system-roles обновлена
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SystemRoleResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / refs / system-roles
      security:
        - bearer: []
  /api/v1/hr/refs/positions:
    get:
      operationId: hr_positions_RefCrudController_list
      summary: Список справочника positions
      description: >-
        Возвращает записи справочника positions. Параметр `activeOnly=true`
        исключает неактивные записи. Роли: CEO, Engineer, Foreman, Mechanic,
        OtibSpecialist, Supply, Admin.
      parameters:
        - name: activeOnly
          required: false
          in: query
          description: >-
            Передай true чтобы получить только активные записи (без
            soft-deleted/expired)
          schema:
            type: boolean
      responses:
        '200':
          description: Список записей справочника positions
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/SimpleRefResponseDto_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / refs / positions
      security:
        - bearer: []
  /api/v1/hr/refs/positions/{id}:
    get:
      operationId: hr_positions_RefCrudController_findById
      summary: Карточка записи positions по id
      description: >-
        Возвращает одну запись справочника positions по UUID. Роли: CEO,
        Engineer, Foreman, Mechanic, OtibSpecialist, Supply, Admin.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID записи справочника positions
          schema:
            format: uuid
            type: string
      responses:
        '200':
          description: Запись справочника positions найдена
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SimpleRefResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / refs / positions
      security:
        - bearer: []
    patch:
      operationId: hr_positions_RefCrudController_update
      summary: Обновить запись positions
      description: >-
        Частичное обновление записи справочника positions. Роли: Admin, CEO.
        Допустимые поля задаёт updateSchema модуля-владельца.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID записи справочника positions
          schema:
            format: uuid
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RefUpdateDto'
      responses:
        '200':
          description: Запись справочника positions обновлена
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SimpleRefResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / refs / positions
      security:
        - bearer: []
  /api/v1/hr/refs/positions/import/preview:
    post:
      operationId: hr_positions_RefImportController_preview
      summary: 'Preview bulk-import: hr/positions'
      description: >-
        Валидирует строки импорта и возвращает diff
        (создание/обновление/деактивация) без записи в БД. Роли: Admin, CEO.
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BulkImportPreviewDto'
      responses:
        '200':
          description: Preview batch с diff и сроком истечения
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RefImportPreviewResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / refs / positions
      security:
        - bearer: []
  /api/v1/hr/refs/positions/import/commit:
    post:
      operationId: hr_positions_RefImportController_commit
      summary: 'Commit bulk-import: hr/positions'
      description: >-
        Применяет ранее провалидированный batch из preview. Требует
        Idempotency-Key. Роли: Admin, CEO.
      parameters:
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BulkImportCommitDto'
      responses:
        '200':
          description: Batch применён, возвращены счётчики изменений
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RefImportCommitResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / refs / positions
      security:
        - bearer: []
  /api/v1/hr/refs/positions/import/commit/{batchId}:
    post:
      operationId: hr_positions_RefImportController_commitByParam
      summary: 'Commit bulk-import по batchId в URL: hr/positions'
      description: >-
        Альтернатива commit с batchId в path вместо body. Требует
        Idempotency-Key. Роли: Admin, CEO.
      parameters:
        - name: batchId
          required: true
          in: path
          description: UUID batch'а, полученный из preview
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      responses:
        '200':
          description: Batch применён, возвращены счётчики изменений
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RefImportCommitResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / refs / positions
      security:
        - bearer: []
  /api/v1/eam/assets:
    get:
      operationId: AssetsController_list
      summary: Список активов с фильтрами и пагинацией
      description: >-
        Курсорная пагинация. Фильтрация по objectId и status. Роли: Engineer,
        Mechanic, Foreman, CEO.
      parameters:
        - name: objectId
          required: false
          in: query
          description: Фильтр по производственному объекту
          schema:
            format: uuid
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            example: 11111111-1111-4111-8111-111111111111
            type: string
        - name: status
          required: false
          in: query
          description: Фильтр по статусу FSM
          schema:
            example: operational
            enum:
              - operational
              - maintenance
              - conserved
              - decommissioned
            type: string
        - name: cursor
          required: false
          in: query
          description: UUID последнего элемента предыдущей страницы
          schema:
            format: uuid
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            example: 11111111-1111-4111-8111-111111111111
            type: string
        - name: limit
          required: false
          in: query
          description: Максимум элементов на странице (1–200)
          schema:
            maximum: 200
            exclusiveMinimum: 0
            default: 50
            example: 50
            type: integer
      responses:
        '200':
          description: Страница активов
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListAssetsResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - EAM / Assets
      security:
        - bearer: []
    post:
      operationId: AssetsController_create
      summary: Создать актив
      description: 'Создание актива с паспортом. Idempotent. Роли: Mechanic, Engineer.'
      parameters:
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateAssetDto'
      responses:
        '201':
          description: Актив создан
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AssetResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - EAM / Assets
      security:
        - bearer: []
  /api/v1/eam/assets/{id}:
    get:
      operationId: AssetsController_findOne
      summary: Получить актив по id
      description: Возвращает актив с паспортом. Object scope по id.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID актива
          schema:
            format: uuid
            type: string
      responses:
        '200':
          description: Актив найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AssetResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - EAM / Assets
      security:
        - bearer: []
  /api/v1/eam/assets/{id}/transfer:
    patch:
      operationId: AssetsController_transfer
      summary: Переместить актив на другой объект
      description: >-
        FSM: operational → operational на другом объекте. Idempotent. Роли:
        Mechanic, Engineer, Admin.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID актива
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TransferAssetDto'
      responses:
        '200':
          description: Актив перемещён
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AssetResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - EAM / Assets
      security:
        - bearer: []
  /api/v1/eam/assets/{id}/send-to-maintenance:
    patch:
      operationId: AssetsController_sendToMaintenance
      summary: Отправить актив в ТО
      description: >-
        FSM: operational → maintenance. Idempotent. Роли: Mechanic, Engineer,
        Admin.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID актива
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SendToMaintenanceDto'
      responses:
        '200':
          description: Актив переведён в maintenance
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AssetResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - EAM / Assets
      security:
        - bearer: []
  /api/v1/eam/assets/{id}/decommission:
    post:
      operationId: AssetsController_decommission
      summary: Списать актив (требует двойного согласования)
      description: FSM → decommissioned. Требует coApprovedBy (CEO/Engineer). Idempotent.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID актива
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DecommissionAssetDto'
      responses:
        '200':
          description: Актив списан
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AssetResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - EAM / Assets
      security:
        - bearer: []
  /api/v1/eam/maintenance:
    get:
      operationId: MaintenanceController_list
      summary: Список ТО с фильтрами и пагинацией
      description: >-
        Курсорная пагинация. Фильтрация по assetId и status. Роли: Engineer,
        Mechanic, Foreman, CEO.
      parameters:
        - name: assetId
          required: false
          in: query
          description: Фильтр по UUID актива
          schema:
            format: uuid
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            example: 11111111-1111-4111-8111-111111111111
            type: string
        - name: status
          required: false
          in: query
          description: Фильтр по статусу FSM ТО
          schema:
            example: scheduled
            enum:
              - scheduled
              - inProgress
              - completed
              - cancelled
            type: string
        - name: cursor
          required: false
          in: query
          description: UUID последнего элемента предыдущей страницы
          schema:
            format: uuid
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            example: 11111111-1111-4111-8111-111111111111
            type: string
        - name: limit
          required: false
          in: query
          description: Максимум элементов на странице (1–200)
          schema:
            maximum: 200
            exclusiveMinimum: 0
            default: 50
            example: 50
            type: integer
      responses:
        '200':
          description: Страница записей ТО
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListMaintenanceResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - EAM / Maintenance
      security:
        - bearer: []
    post:
      operationId: MaintenanceController_schedule
      summary: Запланировать ТО
      description: >-
        Создание записи ТО в статусе scheduled. Idempotent. Роли: Mechanic,
        Engineer, CEO.
      parameters:
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ScheduleMaintenanceDto'
      responses:
        '201':
          description: ТО запланировано
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MaintenanceRecordResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - EAM / Maintenance
      security:
        - bearer: []
  /api/v1/eam/maintenance/{id}:
    get:
      operationId: MaintenanceController_findOne
      summary: Получить ТО по id
      description: Возвращает запись ТО. Object scope по id.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID записи ТО
          schema:
            format: uuid
            type: string
      responses:
        '200':
          description: Запись ТО найдена
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MaintenanceRecordResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - EAM / Maintenance
      security:
        - bearer: []
  /api/v1/eam/maintenance/{id}/start:
    patch:
      operationId: MaintenanceController_start
      summary: Начать ТО
      description: 'FSM: scheduled → inProgress. Idempotent.'
      parameters:
        - name: id
          required: true
          in: path
          description: UUID записи ТО
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/StartMaintenanceDto'
      responses:
        '200':
          description: ТО начато
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MaintenanceRecordResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - EAM / Maintenance
      security:
        - bearer: []
  /api/v1/eam/maintenance/{id}/complete:
    patch:
      operationId: MaintenanceController_complete
      summary: Завершить ТО
      description: 'FSM: inProgress → completed. Idempotent.'
      parameters:
        - name: id
          required: true
          in: path
          description: UUID записи ТО
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CompleteMaintenanceDto'
      responses:
        '200':
          description: ТО завершено
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MaintenanceRecordResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - EAM / Maintenance
      security:
        - bearer: []
  /api/v1/eam/maintenance/{id}/cancel:
    post:
      operationId: MaintenanceController_cancel
      summary: Отменить ТО
      description: 'Отмена из scheduled или inProgress. Idempotent. Роли: Engineer, CEO.'
      parameters:
        - name: id
          required: true
          in: path
          description: UUID записи ТО
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CancelMaintenanceDto'
      responses:
        '200':
          description: ТО отменено
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MaintenanceRecordResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - EAM / Maintenance
      security:
        - bearer: []
  /api/v1/eam/movements:
    get:
      operationId: MovementsController_list
      summary: Журнал перемещений с фильтрами
      description: >-
        Курсорная пагинация. Фильтры: assetId, objectId, op, status,
        dateFrom/dateTo. Роли: CEO, Engineer, Foreman (object), Mechanic
        (object/all), Admin.
      parameters:
        - name: assetId
          required: false
          in: query
          description: Фильтр по UUID актива
          schema:
            format: uuid
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            example: 11111111-1111-4111-8111-111111111111
            type: string
        - name: objectId
          required: false
          in: query
          description: Фильтр по from/to productionObjectId
          schema:
            format: uuid
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            example: 11111111-1111-4111-8111-111111111111
            type: string
        - name: op
          required: false
          in: query
          description: Фильтр по типу операции
          schema:
            example: conservation
            enum:
              - conservation
              - from_conservation
              - to_repair
              - from_repair
              - transfer_audit
            type: string
        - name: status
          required: false
          in: query
          description: Фильтр по статусу FSM
          schema:
            example: applied
            enum:
              - draft
              - applied
              - failed
              - cancelled
            type: string
        - name: dateFrom
          required: false
          in: query
          description: Нижняя граница opDate (ISO 8601)
          schema:
            format: date-time
            pattern: >-
              ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
            type: string
        - name: dateTo
          required: false
          in: query
          description: Верхняя граница opDate (ISO 8601)
          schema:
            format: date-time
            pattern: >-
              ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
            type: string
        - name: cursor
          required: false
          in: query
          description: UUID последнего элемента предыдущей страницы
          schema:
            format: uuid
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            example: 11111111-1111-4111-8111-111111111111
            type: string
        - name: limit
          required: false
          in: query
          description: Максимум элементов на странице (1–200)
          schema:
            maximum: 200
            exclusiveMinimum: 0
            default: 50
            example: 50
            type: integer
      responses:
        '200':
          description: Страница movements
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListMovementsResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - EAM / Movements
      security:
        - bearer: []
    post:
      operationId: MovementsController_create
      summary: Зарегистрировать операцию (conservation / reactivation / repair)
      description: >-
        Создаёт AssetMovement в draft и атомарно применяет side-effect на Asset.
        При отказе Asset FSM guard → status=failed (HTTP 409). Idempotent.
      parameters:
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateAssetMovementDto'
      responses:
        '201':
          description: Movement применён или зафиксирован как failed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AssetMovementResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - EAM / Movements
      security:
        - bearer: []
  /api/v1/eam/movements/{id}:
    get:
      operationId: MovementsController_findOne
      summary: Получить запись movement по id
      description: Object scope через asset.currentObjectId.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID записи movement
          schema:
            format: uuid
            type: string
      responses:
        '200':
          description: Movement найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AssetMovementResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - EAM / Movements
      security:
        - bearer: []
  /api/v1/eam/movements/{id}/cancel:
    post:
      operationId: MovementsController_cancel
      summary: Отменить draft/failed movement (до apply)
      description: Отмена применённой записи невозможна (append-only audit).
      parameters:
        - name: id
          required: true
          in: path
          description: UUID записи movement
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CancelAssetMovementDto'
      responses:
        '200':
          description: Movement отменён
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AssetMovementResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - EAM / Movements
      security:
        - bearer: []
  /api/v1/eam/sagas/asset-decommission:
    post:
      operationId: EamSagasController_startDecommissionAsset
      summary: Запустить сагу декомиссии актива
      description: >-
        Reference-сага из 2 шагов с компенсацией. Возвращает sagaId — для опроса
        используйте GET /sagas/:sagaId/status. Idempotent. Роли: Engineer, CEO.
      parameters:
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DecommissionAssetSagaBodyDto'
      responses:
        '202':
          description: Сага принята в обработку
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SagaEnqueued_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - EAM / Sagas
      security:
        - bearer: []
  /api/v1/hr/personnel:
    get:
      operationId: PersonnelController_list
      summary: Список сотрудников с фильтрами
      description: >-
        Курсорная пагинация. Фильтрация по objectId, status и positionId. Роли:
        CEO, Engineer, Foreman, Mechanic, OtibSpecialist, Supply, Admin.
      parameters:
        - name: objectId
          required: false
          in: query
          description: Фильтр по производственному объекту
          schema:
            format: uuid
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            example: 11111111-1111-4111-8111-111111111111
            type: string
        - name: status
          required: false
          in: query
          description: Фильтр по статусу FSM
          schema:
            example: active
            enum:
              - active
              - onWatch
              - onVacation
              - terminated
            type: string
        - name: positionId
          required: false
          in: query
          description: Фильтр по должности
          schema:
            format: uuid
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            example: 11111111-1111-4111-8111-111111111111
            type: string
        - name: cursor
          required: false
          in: query
          description: UUID последнего элемента предыдущей страницы
          schema:
            format: uuid
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            example: 11111111-1111-4111-8111-111111111111
            type: string
        - name: limit
          required: false
          in: query
          description: Максимум элементов на странице (1–200)
          schema:
            maximum: 200
            exclusiveMinimum: 0
            default: 50
            example: 50
            type: integer
      responses:
        '200':
          description: Страница сотрудников
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListPersonnelResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / Personnel
      security:
        - bearer: []
    post:
      operationId: PersonnelController_create
      summary: Создать (hire) нового сотрудника
      description: 'Приём сотрудника на работу (HR 1.1). Idempotent. Роли: Admin.'
      parameters:
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreatePersonnelDto'
      responses:
        '201':
          description: Сотрудник создан
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PersonnelResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / Personnel
      security:
        - bearer: []
  /api/v1/hr/personnel/{id}:
    get:
      operationId: PersonnelController_findOne
      summary: Карточка сотрудника
      description: Возвращает карточку сотрудника. Object scope по id.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID сотрудника
          schema:
            format: uuid
            type: string
      responses:
        '200':
          description: Сотрудник найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PersonnelResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / Personnel
      security:
        - bearer: []
  /api/v1/hr/personnel/{id}/transfer:
    patch:
      operationId: PersonnelController_transfer
      summary: Перевести сотрудника на другой объект
      description: Перевод между производственными объектами (HR 1.4). Idempotent.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID сотрудника
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TransferPersonnelDto'
      responses:
        '200':
          description: Сотрудник переведён
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PersonnelResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / Personnel
      security:
        - bearer: []
  /api/v1/hr/personnel/{id}/start-watch:
    patch:
      operationId: PersonnelController_startWatch
      summary: Заезд на вахту
      description: 'FSM: active → onWatch. Idempotent. Роли: Engineer, Foreman, Admin.'
      parameters:
        - name: id
          required: true
          in: path
          description: UUID сотрудника
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/StartWatchDto'
      responses:
        '200':
          description: Сотрудник на вахте
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PersonnelResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / Personnel
      security:
        - bearer: []
  /api/v1/hr/personnel/{id}/end-watch:
    patch:
      operationId: PersonnelController_endWatch
      summary: Отъезд с вахты
      description: 'FSM: onWatch → active. Idempotent. Роли: Engineer, Foreman, Admin.'
      parameters:
        - name: id
          required: true
          in: path
          description: UUID сотрудника
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      responses:
        '200':
          description: Сотрудник снят с вахты
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PersonnelResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / Personnel
      security:
        - bearer: []
  /api/v1/hr/personnel/{id}/start-vacation:
    patch:
      operationId: PersonnelController_startVacation
      summary: Уход в отпуск
      description: 'FSM: active → onVacation. Idempotent. Роли: Admin.'
      parameters:
        - name: id
          required: true
          in: path
          description: UUID сотрудника
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/StartVacationDto'
      responses:
        '200':
          description: Сотрудник в отпуске
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PersonnelResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / Personnel
      security:
        - bearer: []
  /api/v1/hr/personnel/{id}/end-vacation:
    patch:
      operationId: PersonnelController_endVacation
      summary: Возврат из отпуска
      description: 'FSM: onVacation → active. Idempotent. Роли: Admin.'
      parameters:
        - name: id
          required: true
          in: path
          description: UUID сотрудника
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      responses:
        '200':
          description: Сотрудник вернулся из отпуска
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PersonnelResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / Personnel
      security:
        - bearer: []
  /api/v1/hr/personnel/{id}/terminate:
    post:
      operationId: PersonnelController_terminate
      summary: Уволить сотрудника (HR 1.6)
      description: 'FSM → terminated. Idempotent. Роли: Admin.'
      parameters:
        - name: id
          required: true
          in: path
          description: UUID сотрудника
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TerminatePersonnelDto'
      responses:
        '200':
          description: Сотрудник уволен
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PersonnelResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / Personnel
      security:
        - bearer: []
  /api/v1/hr/user-accounts:
    get:
      operationId: UserAccountsController_list
      summary: Список учётных записей (admin only)
      description: Курсорная пагинация. Фильтры status / systemRoleCode / search.
      parameters:
        - name: status
          required: false
          in: query
          description: Фильтр по статусу FSM
          schema:
            example: active
            enum:
              - active
              - locked
              - deactivated
            type: string
        - name: systemRoleCode
          required: false
          in: query
          description: >-
            Фильтр по коду роли (например, "foreman"). Возвращает учётки, чей
            systemRoleIds содержит роль с этим code.
          schema:
            example: foreman
            type: string
        - name: objectId
          required: false
          in: query
          description: Фильтр по производственному объекту (через Personnel.object_id)
          schema:
            format: uuid
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            example: 11111111-1111-4111-8111-111111111111
            type: string
        - name: search
          required: false
          in: query
          description: Поиск по login, ФИО, табельному номеру
          schema:
            maxLength: 200
            example: ivan
            type: string
        - name: cursor
          required: false
          in: query
          description: UUID последнего элемента предыдущей страницы
          schema:
            format: uuid
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            example: 11111111-1111-4111-8111-111111111111
            type: string
        - name: limit
          required: false
          in: query
          description: Максимум элементов на странице (1–200)
          schema:
            maximum: 200
            exclusiveMinimum: 0
            default: 50
            example: 50
            type: integer
      responses:
        '200':
          description: Страница учётных записей
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListUserAccountsResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / User Accounts
      security:
        - bearer: []
    post:
      operationId: UserAccountsController_create
      summary: Создать учётную запись (HR 1.6)
      description: >-
        Создаёт UserAccount для существующего Personnel. Проверки: HR-UA-INV-01
        (login unique), HR-UA-INV-03 (one active per personnel), HR-UA-INV-15
        (валидная комбинация ролей). Публикует hr.user-account.created.
      parameters:
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateUserAccountDto'
      responses:
        '201':
          description: Учётка создана
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserAccountResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / User Accounts
      security:
        - bearer: []
  /api/v1/hr/user-accounts/me:
    get:
      operationId: UserAccountsController_me
      summary: Моя учётка (self-service)
      description: >-
        Возвращает UserAccount, связанный с keycloak_subject текущего JWT.
        Доступно любой аутентифицированной роли. Если Keycloak provision ещё не
        завершился, делает fallback по personnelId.
      parameters: []
      responses:
        '200':
          description: Карточка моей учётки
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserAccountResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / User Accounts
      security:
        - bearer: []
  /api/v1/hr/user-accounts/{id}:
    get:
      operationId: UserAccountsController_findOne
      summary: Карточка учётки (admin only; self-service через /me)
      description: >-
        Возвращает полную карточку UserAccount по id. Доступно только Admin. Для
        self-service использовать GET /hr/user-accounts/me.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID учётки
          schema:
            format: uuid
            type: string
      responses:
        '200':
          description: Учётка найдена
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserAccountResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / User Accounts
      security:
        - bearer: []
  /api/v1/hr/user-accounts/{id}/roles:
    patch:
      operationId: UserAccountsController_updateRoles
      summary: Изменить роли пользователя (атомарно, без двойного согласования; Q2 PO)
      description: >-
        Полная замена массива systemRoleIds одним PATCH. Защита: HR-UA-INV-04
        (нельзя убрать admin у последнего admin), HR-UA-INV-08 (admin не меняет
        свои роли), HR-UA-INV-15 (валидная комбинация). Публикует
        hr.user-account.roles-changed.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID учётки
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateUserAccountRolesDto'
      responses:
        '200':
          description: Роли обновлены
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserAccountResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / User Accounts
      security:
        - bearer: []
  /api/v1/hr/user-accounts/{id}/deactivate:
    post:
      operationId: UserAccountsController_deactivate
      summary: Деактивировать учётку (terminal)
      description: >-
        active|locked → deactivated. Защита HR-UA-INV-04: нельзя деактивировать
        последнего активного admin в организации.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID учётки
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DeactivateUserAccountDto'
      responses:
        '200':
          description: Учётка деактивирована
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserAccountResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / User Accounts
      security:
        - bearer: []
  /api/v1/hr/user-accounts/{id}/lock:
    post:
      operationId: UserAccountsController_lock
      summary: Принудительная блокировка (admin manual)
      description: active → locked. Публикует hr.user-account.locked.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID учётки
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LockUserAccountDto'
      responses:
        '200':
          description: Учётка заблокирована
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserAccountResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / User Accounts
      security:
        - bearer: []
  /api/v1/hr/user-accounts/{id}/unlock:
    post:
      operationId: UserAccountsController_unlock
      summary: Разблокировать учётку
      description: locked → active, failed_login_count = 0.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID учётки
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      responses:
        '200':
          description: Учётка разблокирована
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserAccountResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / User Accounts
      security:
        - bearer: []
  /api/v1/hr/user-accounts/{id}/password-reset:
    post:
      operationId: UserAccountsController_requestPasswordReset
      summary: Сбросить пароль (HR 1.6)
      description: >-
        Выпускает one-time password через Keycloak Admin API. Публикует
        hr.user-account.password-reset-issued. Реальный Keycloak adapter
        подключается через KEYCLOAK_PASSWORD_RESET_ADAPTER provider override в
        apps/api/src/modules/iam — по умолчанию используется stub-адаптер.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID учётки
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      responses:
        '200':
          description: Временный пароль выпущен
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PasswordResetResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / User Accounts
      security:
        - bearer: []
  /api/v1/hr/brigades:
    get:
      operationId: BrigadesController_list
      summary: Список бригад с фильтрами
      description: >-
        Курсорная пагинация. Фильтры: objectId, workType, isActive. Cross-object
        — CEO/Engineer/Admin/OtibSpecialist; иначе scope по productionObjectIds.
      parameters:
        - name: objectId
          required: false
          in: query
          description: Фильтр по производственному объекту
          schema:
            format: uuid
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            example: 33333333-3333-4333-8333-333333333333
            type: string
        - name: workType
          required: false
          in: query
          description: Фильтр по типу работ
          schema:
            example: drilling
            enum:
              - drilling
              - blasting
              - auxiliary
            type: string
        - name: isActive
          required: false
          in: query
          description: Фильтр по активности (по умолчанию true)
          schema:
            example: true
            type: boolean
        - name: cursor
          required: false
          in: query
          description: UUID последнего элемента предыдущей страницы
          schema:
            format: uuid
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            example: 11111111-1111-4111-8111-111111111111
            type: string
        - name: limit
          required: false
          in: query
          description: Максимум элементов на странице (1–200)
          schema:
            maximum: 200
            exclusiveMinimum: 0
            default: 50
            example: 50
            type: integer
      responses:
        '200':
          description: Страница бригад
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListBrigadesResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / Brigades
      security:
        - bearer: []
    post:
      operationId: BrigadesController_create
      summary: Создать бригаду
      description: >-
        Создание производственной бригады (HR 1.2). Idempotent. Роли: Engineer,
        Foreman, Admin.
      parameters:
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateBrigadeDto'
      responses:
        '201':
          description: Бригада создана
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BrigadeResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / Brigades
      security:
        - bearer: []
  /api/v1/hr/brigades/{id}:
    get:
      operationId: BrigadesController_findOne
      summary: Карточка бригады
      description: Возвращает карточку бригады. Object scope по id.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID бригады
          schema:
            format: uuid
            type: string
      responses:
        '200':
          description: Бригада найдена
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BrigadeResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / Brigades
      security:
        - bearer: []
    patch:
      operationId: BrigadesController_update
      summary: Обновить бригаду
      description: >-
        Изменение имени, типа работ или бригадира (HR 1.2). Роли: Engineer,
        Foreman, Admin.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID бригады
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateBrigadeDto'
      responses:
        '200':
          description: Бригада обновлена
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BrigadeResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / Brigades
      security:
        - bearer: []
  /api/v1/hr/brigades/{id}/members:
    get:
      operationId: BrigadesController_listMembers
      summary: Активный состав бригады
      description: Список текущих memberships (toDate IS NULL).
      parameters:
        - name: id
          required: true
          in: path
          description: UUID бригады
          schema:
            format: uuid
            type: string
      responses:
        '200':
          description: Активный состав бригады
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/BrigadeMembershipResponseDto'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / Brigades
      security:
        - bearer: []
    post:
      operationId: BrigadesController_addMember
      summary: Добавить сотрудника в бригаду
      description: >-
        Добавление в состав бригады (HR 1.2). Если у сотрудника есть активная
        membership в другой бригаде — она закрывается в той же транзакции
        (HR-BRG-INV-01). Idempotent.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID бригады
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AddMemberDto'
      responses:
        '201':
          description: Сотрудник добавлен в бригаду
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BrigadeMembershipResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / Brigades
      security:
        - bearer: []
  /api/v1/hr/brigades/{id}/deactivate:
    post:
      operationId: BrigadesController_deactivate
      summary: Расформировать бригаду
      description: >-
        Деактивация бригады с закрытием всех активных membership
        (HR-BRG-INV-05). Idempotent.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID бригады
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DeactivateBrigadeDto'
      responses:
        '200':
          description: Бригада расформирована
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BrigadeResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / Brigades
      security:
        - bearer: []
  /api/v1/hr/brigades/{id}/reactivate:
    post:
      operationId: BrigadesController_reactivate
      summary: Восстановить бригаду
      description: Восстановление расформированной бригады. Состав не восстанавливается.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID бригады
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ReactivateBrigadeDto'
      responses:
        '200':
          description: Бригада восстановлена
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BrigadeResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / Brigades
      security:
        - bearer: []
  /api/v1/hr/brigades/{id}/members/{personnelId}:
    delete:
      operationId: BrigadesController_removeMember
      summary: Исключить сотрудника из бригады
      description: >-
        Закрывает активную membership через toDate. Запись остаётся в БД (audit
        trail).
      parameters:
        - name: id
          required: true
          in: path
          description: UUID бригады
          schema:
            format: uuid
            type: string
        - name: personnelId
          required: true
          in: path
          description: UUID сотрудника
          schema:
            format: uuid
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RemoveMemberDto'
      responses:
        '200':
          description: Сотрудник исключён
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BrigadeMembershipResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / Brigades
      security:
        - bearer: []
  /api/v1/asset-assignments:
    get:
      operationId: AssetAssignmentsController_list
      summary: Текущие закрепления (по умолчанию active=true)
      description: >-
        Курсорная пагинация. Фильтрация по objectId / assetId / personnelId /
        role / active. Роли: CEO, Engineer, Foreman, Mechanic, OtibSpecialist,
        Admin.
      parameters:
        - name: objectId
          required: false
          in: query
          description: Фильтр по производственному объекту
          schema:
            format: uuid
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            example: 11111111-1111-4111-8111-111111111111
            type: string
        - name: assetId
          required: false
          in: query
          description: Фильтр по UUID актива
          schema:
            format: uuid
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            example: 11111111-1111-4111-8111-111111111111
            type: string
        - name: personnelId
          required: false
          in: query
          description: Фильтр по UUID сотрудника
          schema:
            format: uuid
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            example: 11111111-1111-4111-8111-111111111111
            type: string
        - name: role
          required: false
          in: query
          description: Фильтр по роли закрепления
          schema:
            example: primary_operator
            enum:
              - primary_operator
              - shift_operator
              - mechanic
            type: string
        - name: active
          required: false
          in: query
          description: true — только active (toDate IS NULL), false — все, включая закрытые
          anyOf:
            - type: boolean
            - type: string
              enum:
                - 'true'
                - 'false'
          schema:
            example: true
        - name: cursor
          required: false
          in: query
          description: UUID последнего элемента предыдущей страницы
          schema:
            format: uuid
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            example: 11111111-1111-4111-8111-111111111111
            type: string
        - name: limit
          required: false
          in: query
          description: Максимум элементов на странице (1–200)
          schema:
            maximum: 200
            exclusiveMinimum: 0
            default: 50
            example: 50
            type: integer
      responses:
        '200':
          description: Страница закреплений
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListAssetAssignmentsResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / Asset Assignments
      security:
        - bearer: []
    post:
      operationId: AssetAssignmentsController_assign
      summary: Закрепить сотрудника на технику (HR 1.4)
      description: >-
        Для primary_operator/mechanic предыдущее активное закрепление на той же
        паре (asset, role) закрывается автоматически. Idempotent. Роли:
        Engineer, Foreman, Mechanic, Admin.
      parameters:
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateAssetAssignmentDto'
      responses:
        '201':
          description: Закрепление создано
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AssetAssignmentResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / Asset Assignments
      security:
        - bearer: []
  /api/v1/asset-assignments/{id}:
    get:
      operationId: AssetAssignmentsController_findOne
      summary: Карточка закрепления
      description: Возвращает закрепление по id. Object scope по связанному активу.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID закрепления
          schema:
            format: uuid
            type: string
      responses:
        '200':
          description: Закрепление найдено
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AssetAssignmentResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / Asset Assignments
      security:
        - bearer: []
    delete:
      operationId: AssetAssignmentsController_close
      summary: Закрыть закрепление (to_date=now, cause=manual)
      description: >-
        Idempotent. Роли: Engineer, Foreman, Mechanic, Admin. Object scope по
        связанному активу.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID закрепления
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CloseAssetAssignmentDto'
      responses:
        '204':
          description: Закрепление закрыто
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / Asset Assignments
      security:
        - bearer: []
  /api/v1/hr/watches:
    get:
      operationId: WatchesController_listWatches
      summary: Список вахт с фильтрами
      description: >-
        Курсорная пагинация. Фильтрация по objectId, dateFrom, dateTo.
        Foreman/Mechanic — только свои объекты.
      parameters:
        - name: objectId
          required: false
          in: query
          description: Фильтр по производственному объекту
          schema:
            format: uuid
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            example: 33333333-3333-4333-8333-333333333333
            type: string
        - name: dateFrom
          required: false
          in: query
          description: Левая граница диапазона (по startDate), ISO 8601 YYYY-MM-DD
          schema:
            format: date
            pattern: >-
              ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
            example: '2026-06-01'
            type: string
        - name: dateTo
          required: false
          in: query
          description: Правая граница диапазона (по startDate), ISO 8601 YYYY-MM-DD
          schema:
            format: date
            pattern: >-
              ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
            example: '2026-06-30'
            type: string
        - name: cursor
          required: false
          in: query
          description: UUID последнего элемента предыдущей страницы
          schema:
            format: uuid
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            example: 11111111-1111-4111-8111-111111111111
            type: string
        - name: limit
          required: false
          in: query
          description: Максимум элементов на странице (1–200)
          schema:
            maximum: 200
            exclusiveMinimum: 0
            default: 50
            example: 50
            type: integer
      responses:
        '200':
          description: Страница вахт
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListWatchesResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / Watches
      security:
        - bearer: []
    post:
      operationId: WatchesController_createWatch
      summary: Создать вахту (HR 1.3, HR 6.1.1)
      description: >-
        Создание 15-дневной вахты. HR-WCH-INV-02 (HR-INV-08): startDate ≥
        now+3d, иначе 409.
      parameters:
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateWatchDto'
      responses:
        '201':
          description: Вахта создана
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WatchResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / Watches
      security:
        - bearer: []
  /api/v1/hr/watches/{id}:
    get:
      operationId: WatchesController_findWatch
      summary: Карточка вахты
      description: Возвращает карточку вахтового цикла.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID вахты
          schema:
            format: uuid
            type: string
      responses:
        '200':
          description: Вахта найдена
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WatchResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / Watches
      security:
        - bearer: []
  /api/v1/hr/watches/{id}/assignments:
    post:
      operationId: WatchesController_scheduleAssignment
      summary: Включить сотрудника в вахту (FSM → scheduled)
      description: 'HR-WCH-INV-01: departureDate ≥ arrivalDate, иначе 422.'
      parameters:
        - name: id
          required: true
          in: path
          description: UUID вахты
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ScheduleWatchAssignmentDto'
      responses:
        '201':
          description: Назначение создано
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WatchAssignmentResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / Watches
      security:
        - bearer: []
  /api/v1/hr/watch-assignments/{id}/arrive:
    post:
      operationId: WatchesController_arriveAssignment
      summary: 'Заезд: FSM scheduled → active'
      description: Side-effect — Personnel → on_watch (через hr/personnel handler).
      parameters:
        - name: id
          required: true
          in: path
          description: UUID назначения
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      responses:
        '200':
          description: Назначение активировано
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WatchAssignmentResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / Watches
      security:
        - bearer: []
  /api/v1/hr/watch-assignments/{id}/depart:
    post:
      operationId: WatchesController_departAssignment
      summary: 'Отъезд: FSM active → completed'
      description: Side-effect — Personnel → active (через hr/personnel handler).
      parameters:
        - name: id
          required: true
          in: path
          description: UUID назначения
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DepartWatchAssignmentDto'
      responses:
        '200':
          description: Назначение завершено
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WatchAssignmentResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / Watches
      security:
        - bearer: []
  /api/v1/hr/watch-assignments/{id}/cancel:
    post:
      operationId: WatchesController_cancelAssignment
      summary: 'Отмена назначения: FSM scheduled → cancelled'
      description: 'HR-WCH-INV-07: после active отменить нельзя — использовать /depart.'
      parameters:
        - name: id
          required: true
          in: path
          description: UUID назначения
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CancelWatchAssignmentDto'
      responses:
        '200':
          description: Назначение отменено
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WatchAssignmentResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / Watches
      security:
        - bearer: []
  /api/v1/hr/shifts:
    get:
      operationId: WatchesController_listShifts
      summary: Список смен с фильтрами
      description: >-
        Курсорная пагинация. Фильтрация по objectId, shiftDate, shiftType,
        watchId.
      parameters:
        - name: objectId
          required: false
          in: query
          description: Фильтр по производственному объекту
          schema:
            format: uuid
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            example: 33333333-3333-4333-8333-333333333333
            type: string
        - name: shiftDate
          required: false
          in: query
          description: Фильтр по дате смены (ISO 8601, YYYY-MM-DD)
          schema:
            format: date
            pattern: >-
              ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
            example: '2026-06-01'
            type: string
        - name: shiftType
          required: false
          in: query
          description: Фильтр по типу смены
          schema:
            example: day
            enum:
              - day
              - night
            type: string
        - name: watchId
          required: false
          in: query
          description: Фильтр по родительской вахте
          schema:
            format: uuid
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            example: 11111111-1111-4111-8111-111111111111
            type: string
        - name: cursor
          required: false
          in: query
          description: UUID последнего элемента предыдущей страницы
          schema:
            format: uuid
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            example: 11111111-1111-4111-8111-111111111111
            type: string
        - name: limit
          required: false
          in: query
          description: Максимум элементов на странице (1–200)
          schema:
            maximum: 200
            exclusiveMinimum: 0
            default: 50
            example: 50
            type: integer
      responses:
        '200':
          description: Страница смен
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListShiftsResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / Watches
      security:
        - bearer: []
    post:
      operationId: WatchesController_createShift
      summary: Создать 11-часовую смену
      description: >-
        HR-WCH-INV-04: UNIQUE(objectId, shiftDate, shiftType). HR-WCH-INV-06:
        durationHours=11.
      parameters:
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateShiftDto'
      responses:
        '201':
          description: Смена создана
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ShiftResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / Watches
      security:
        - bearer: []
  /api/v1/hr/shifts/{id}:
    get:
      operationId: WatchesController_findShift
      summary: Карточка смены
      description: Возвращает карточку 11-часовой смены.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID смены
          schema:
            format: uuid
            type: string
      responses:
        '200':
          description: Смена найдена
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ShiftResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / Watches
      security:
        - bearer: []
  /api/v1/hr/shifts/{id}/foreman:
    put:
      operationId: WatchesController_assignForeman
      summary: Назначить мастера смены
      description: >-
        HR-WCH-INV-05 (HR-INV-06): foreman должен быть active/onWatch. Событие
        hr.shift.foreman-assigned слушает PRD 1.0.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID смены
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AssignShiftForemanDto'
      responses:
        '200':
          description: Мастер назначен
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ShiftResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / Watches
      security:
        - bearer: []
  /api/v1/hr/shifts/{id}/substitution:
    post:
      operationId: WatchesController_registerSubstitution
      summary: Регистрация замены/подмены в смене (HR 1.3)
      description: Foreman регистрирует подмену; не меняет foremanId.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID смены
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RegisterShiftSubstitutionDto'
      responses:
        '200':
          description: Замена зарегистрирована
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ShiftResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / Watches
      security:
        - bearer: []
  /api/v1/hr/timesheet:
    get:
      operationId: TimesheetController_list
      summary: Табель за период
      description: >-
        Курсорная пагинация. Foreman видит только свои objects
        (productionObjectIds). dateFrom/dateTo — inclusive.
      parameters:
        - name: objectId
          required: false
          in: query
          description: Фильтр по производственному объекту
          schema:
            format: uuid
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            example: 33333333-3333-4333-8333-333333333333
            type: string
        - name: personnelId
          required: false
          in: query
          description: Фильтр по сотруднику
          schema:
            format: uuid
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            example: 22222222-2222-4222-8222-222222222222
            type: string
        - name: shiftId
          required: false
          in: query
          description: Фильтр по смене
          schema:
            format: uuid
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            example: 11111111-1111-4111-8111-111111111111
            type: string
        - name: shiftReportId
          required: false
          in: query
          description: Фильтр по сменному отчёту
          schema:
            format: uuid
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            example: 11111111-1111-4111-8111-111111111111
            type: string
        - name: status
          required: false
          in: query
          description: Фильтр по статусу записи
          schema:
            example: confirmed
            enum:
              - draft
              - confirmed
              - adjusted
              - reverted
            type: string
        - name: dateFrom
          required: true
          in: query
          description: Нижняя граница периода (ISO 8601, YYYY-MM-DD) — включительно
          schema:
            format: date
            pattern: >-
              ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
            example: '2026-05-18'
            type: string
        - name: dateTo
          required: true
          in: query
          description: Верхняя граница периода (ISO 8601, YYYY-MM-DD) — включительно
          schema:
            format: date
            pattern: >-
              ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
            example: '2026-05-18'
            type: string
        - name: cursor
          required: false
          in: query
          description: UUID последнего элемента предыдущей страницы
          schema:
            format: uuid
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            example: 11111111-1111-4111-8111-111111111111
            type: string
        - name: limit
          required: false
          in: query
          description: Максимум элементов на странице (1–200)
          schema:
            maximum: 200
            exclusiveMinimum: 0
            default: 50
            example: 50
            type: integer
      responses:
        '200':
          description: Страница записей табеля
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListTimesheetResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / Timesheet
      security:
        - bearer: []
  /api/v1/hr/timesheet/export:
    get:
      operationId: TimesheetController_export
      summary: Экспорт табеля за период (HR 5.1)
      description: >-
        XLSX-выгрузка табеля. Foreman видит только свои objects. Пока возвращает
        JSON-массив; формат XLSX — TODO до prod (см. open Q-TS-1).
      parameters:
        - name: objectId
          required: false
          in: query
          description: Фильтр по производственному объекту
          schema:
            format: uuid
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            example: 33333333-3333-4333-8333-333333333333
            type: string
        - name: dateFrom
          required: true
          in: query
          description: Нижняя граница периода (ISO 8601, YYYY-MM-DD) — включительно
          schema:
            format: date
            pattern: >-
              ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
            example: '2026-05-18'
            type: string
        - name: dateTo
          required: true
          in: query
          description: Верхняя граница периода (ISO 8601, YYYY-MM-DD) — включительно
          schema:
            format: date
            pattern: >-
              ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
            example: '2026-05-18'
            type: string
      responses:
        '200':
          description: >-
            Массив записей табеля за период. TODO: после готовности конвертера
            сменить content-type на
            application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / Timesheet
      security:
        - bearer: []
  /api/v1/hr/timesheet/{id}:
    get:
      operationId: TimesheetController_findOne
      summary: Карточка записи табеля
      description: Возвращает одну запись табеля. Object scope по shift.objectId записи.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID записи табеля
          schema:
            format: uuid
            type: string
      responses:
        '200':
          description: Запись табеля
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TimesheetEntryResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / Timesheet
      security:
        - bearer: []
  /api/v1/hr/timesheet/{id}/adjust:
    post:
      operationId: TimesheetController_adjust
      summary: Ручная корректировка часов записи табеля (HR 6.2.5)
      description: >-
        Idempotent. Поле reason обязательно (HR-TS-INV-02). Сумма hoursWorked +
        downtimeHours ≤ 11 (HR-TS-INV-01) — иначе 422
        hours_exceed_shift_duration. Роли: Engineer, Admin.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID записи табеля
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AdjustTimesheetEntryDto'
      responses:
        '200':
          description: Запись скорректирована
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TimesheetEntryResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - HR / Timesheet
      security:
        - bearer: []
  /api/v1/documents:
    post:
      operationId: DocumentsController_initiateUpload
      summary: Инициировать загрузку документа (presigned PUT URL)
      description: >-
        Создаёт запись документа в статусе pending и возвращает presigned PUT
        URL. Роли: Engineer, Mechanic, Foreman, CEO.
      parameters:
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateDocumentDto'
      responses:
        '201':
          description: Загрузка инициирована
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InitiateUploadResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Documents
      security:
        - bearer: []
  /api/v1/documents/{id}/confirm:
    post:
      operationId: DocumentsController_confirmUpload
      summary: Подтвердить загрузку после PUT в MinIO
      description: >-
        Проверяет наличие объекта, virus scan, переводит документ в ready. Роли:
        Engineer, Mechanic, Foreman, CEO.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID документа
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ConfirmDocumentDto'
      responses:
        '200':
          description: Документ подтверждён
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ConfirmDocumentResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Documents
      security:
        - bearer: []
  /api/v1/documents/{id}:
    get:
      operationId: DocumentsController_getDownload
      summary: Получить presigned GET URL для скачивания
      description: Возвращает временный URL для скачивания готового документа.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID документа
          schema:
            format: uuid
            type: string
      responses:
        '200':
          description: Presigned URL для скачивания
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DownloadUrlResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Documents
      security:
        - bearer: []
  /api/v1/admin/sagas/dlq:
    get:
      operationId: SagasDlqController_list
      summary: Список failed jobs в DLQ саг
      description: BullMQ failed jobs из очередей steps и compensate.
      parameters:
        - name: limit
          required: false
          in: query
          description: Максимум записей на каждую очередь (default 50)
          schema:
            type: number
      responses:
        '200':
          description: Список DLQ-записей
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SagaDlqList_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Admin / Sagas DLQ
      security:
        - bearer: []
  /api/v1/admin/sagas/dlq/stats:
    get:
      operationId: SagasDlqController_stats
      summary: Счётчики job-ов по статусам
      description: 'Метрики для алертов: failed / waiting / active / delayed / completed.'
      parameters: []
      responses:
        '200':
          description: Статистика очередей саг
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SagaDlqStats_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Admin / Sagas DLQ
      security:
        - bearer: []
  /api/v1/admin/sagas/dlq/{queue}/{jobId}/retry:
    post:
      operationId: SagasDlqController_retry
      summary: Перезапустить failed job из DLQ
      description: >-
        BullMQ переводит job из failed в waiting; attempts счётчик сбрасывается.
        Используется когда downstream сервис восстановлен.
      parameters:
        - name: queue
          required: true
          in: path
          schema:
            enum:
              - mineflow-saga-steps
              - mineflow-saga-compensate
            type: string
        - name: jobId
          required: true
          in: path
          description: >-
            BullMQ jobId (формат `${sagaId}__${stepName}` — двойной underscore,
            не двоеточие; BullMQ 5.x запрещает `:` в jobId)
          schema:
            type: string
      responses:
        '202':
          description: Job requeued; BullMQ переведёт его в waiting.
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Admin / Sagas DLQ
      security:
        - bearer: []
  /api/v1/admin/sagas/dlq/{queue}/{jobId}:
    delete:
      operationId: SagasDlqController_drop
      summary: Удалить failed job из DLQ
      description: Job удаляется навсегда. Используется когда retry бессмыслен.
      parameters:
        - name: queue
          required: true
          in: path
          schema:
            enum:
              - mineflow-saga-steps
              - mineflow-saga-compensate
            type: string
        - name: jobId
          required: true
          in: path
          description: BullMQ jobId
          schema:
            type: string
      responses:
        '204':
          description: Job удалён навсегда.
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Admin / Sagas DLQ
      security:
        - bearer: []
  /api/v1/admin/organizations:
    post:
      operationId: OrganizationsController_create
      summary: Создать новую организацию (super-admin)
      description: >-
        Onboarding нового арендатора платформы. Slug должен быть уникальным; при
        коллизии возвращается 409. Создаёт пустую организацию — seed
        справочников выполняется отдельным шагом per-tenant.
      parameters:
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateOrganizationDto'
      responses:
        '201':
          description: Новая организация
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OrganizationResponseDto_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Admin / Organizations
      security:
        - bearer: []
    get:
      operationId: OrganizationsController_list
      summary: Список всех организаций (super-admin)
      description: Возвращает все организации платформы. Доступно только super-admin.
      parameters: []
      responses:
        '200':
          description: Список организаций
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListOrganizationsResponseDto_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Admin / Organizations
      security:
        - bearer: []
  /api/v1/admin/organizations/{id}:
    get:
      operationId: OrganizationsController_findOne
      summary: Карточка организации
      description: >-
        Super-admin видит любую; обычный Admin видит только свою собственную
        (`user.organizationId === id`).
      parameters:
        - name: id
          required: true
          in: path
          description: UUID организации
          schema:
            example: 00000000-0000-4000-8000-000000000001
            type: string
      responses:
        '200':
          description: Карточка организации
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OrganizationResponseDto_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Admin / Organizations
      security:
        - bearer: []
    patch:
      operationId: OrganizationsController_update
      summary: Обновить организацию (super-admin)
      description: >-
        Меняет только name. Slug — иммутабельный URL-key, для смены slug нужно
        создать новую организацию и мигрировать данные.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID организации
          schema:
            example: 00000000-0000-4000-8000-000000000001
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateOrganizationDto'
      responses:
        '200':
          description: Организация обновлена
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OrganizationResponseDto_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Admin / Organizations
      security:
        - bearer: []
  /api/v1/admin/organizations/{id}/deactivate:
    post:
      operationId: OrganizationsController_deactivate
      summary: Деактивировать организацию (super-admin)
      description: >-
        Помечает статус как `deactivated`. ВНИМАНИЕ: сегодня deactivated НЕ
        блокирует API-вход пользователей этой организации (требует cached
        org-status lookup в OrgScopeInterceptor — отдельный ADR). Сейчас это
        operator-visible маркер.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID организации
          schema:
            type: string
      responses:
        '200':
          description: Организация деактивирована
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OrganizationResponseDto_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Admin / Organizations
      security:
        - bearer: []
  /api/v1/admin/organizations/{id}/reactivate:
    post:
      operationId: OrganizationsController_reactivate
      summary: Реактивировать организацию (super-admin)
      description: Возвращает status в `active`. Парная операция к deactivate.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID организации
          schema:
            type: string
      responses:
        '200':
          description: Организация активирована
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OrganizationResponseDto_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Admin / Organizations
      security:
        - bearer: []
  /api/v1/admin/trash:
    get:
      operationId: TrashController_listEntities
      summary: Список supported entity types для soft-delete trash
      description: >-
        Возвращает Prisma model names (PascalCase) которые поддерживают
        soft-delete (имеют колонку deletedAt). Используется UI для построения
        dropdown.
      parameters: []
      responses:
        '200':
          description: Список поддерживаемых entity-типов
          content:
            application/json:
              schema:
                type: object
                required:
                  - entities
                properties:
                  entities:
                    type: array
                    items:
                      type: string
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Admin / Trash
      security:
        - bearer: []
  /api/v1/admin/trash/{entity}:
    get:
      operationId: TrashController_list
      summary: Soft-deleted rows entity-типа
      description: >-
        Per-tenant выборка rows с deletedAt != null. Сортировка по deletedAt
        DESC. Limit 1..200 (default 50). `entity` — URL slug в kebab-case
        (`production-objects`, `asset-classes`, `brigades`, etc.).
      parameters:
        - name: entity
          required: true
          in: path
          description: Entity slug (kebab-case)
          schema:
            type: string
        - name: limit
          required: false
          in: query
          description: 1..200, default 50
          schema:
            type: number
      responses:
        '200':
          description: Список soft-deleted записей
          content:
            application/json:
              schema:
                type: object
                required:
                  - entity
                  - rows
                  - count
                properties:
                  entity:
                    type: string
                  rows:
                    type: array
                    items:
                      type: object
                      required:
                        - id
                        - deletedAt
                      properties:
                        id:
                          type: string
                          format: uuid
                        deletedAt:
                          type: string
                          format: date-time
                      additionalProperties: true
                  count:
                    type: integer
                    minimum: 0
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Admin / Trash
      security:
        - bearer: []
  /api/v1/admin/trash/{entity}/{id}/restore:
    post:
      operationId: TrashController_restore
      summary: Восстановить soft-deleted row
      description: >-
        Снимает deletedAt; re-checks unique constraints (см.
        KNOWN_UNIQUE_CHECKS). Если bizkey уже занят активной записью — 409
        TRASH_RESTORE_UNIQUE_CONFLICT.
      parameters:
        - name: entity
          required: true
          in: path
          description: Entity slug (kebab-case)
          schema:
            type: string
        - name: id
          required: true
          in: path
          description: UUID restored row
          schema:
            format: uuid
            type: string
      responses:
        '200':
          description: Запись восстановлена
          content:
            application/json:
              schema:
                type: object
                required:
                  - id
                properties:
                  id:
                    type: string
                    format: uuid
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Admin / Trash
      security:
        - bearer: []
  /api/v1/admin/outbox:
    get:
      operationId: OutboxController_list
      summary: Список outbox-событий + сводная статистика
      description: >-
        По умолчанию возвращает pending+dead (нездоровое состояние). Используйте
        `status=published` для аудита успешно отправленных.
      parameters:
        - name: status
          required: false
          in: query
          description: >-
            Фильтр по статусу. По умолчанию — pending+dead (нездоровое
            состояние).
          schema:
            example: pending
            enum:
              - pending
              - published
              - dead
              - skipped
            type: string
        - name: olderThanSeconds
          required: false
          in: query
          description: >-
            Возвращает только события, у которых createdAt старше N секунд.
            Удобно для поиска stuck-events (типичные пороги: 300, 900, 3600).
          schema:
            maximum: 2592000
            exclusiveMinimum: 0
            example: 300
            type: integer
        - name: limit
          required: false
          in: query
          description: Максимум записей (1..500, default 50).
          schema:
            minimum: 1
            maximum: 500
            default: 50
            example: 50
            type: integer
      responses:
        '200':
          description: Список событий + glob stats
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListOutboxResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Admin / Outbox
      security:
        - bearer: []
  /api/v1/admin/outbox/{id}/republish:
    post:
      operationId: OutboxController_republish
      summary: Сбросить событие на повторную публикацию
      description: >-
        Статус → pending, attempts → 0, lastError → null, nextAttemptAt → now().
        Используется когда downstream восстановлен и dead-event нужно
        "дотолкать".
      parameters:
        - name: id
          required: true
          in: path
          description: UUID записи event_outbox
          schema:
            format: uuid
            type: string
      responses:
        '200':
          description: Событие переведено в pending
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OutboxRepublishResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Admin / Outbox
      security:
        - bearer: []
  /api/v1/admin/outbox/{id}/skip:
    post:
      operationId: OutboxController_skip
      summary: Явно пометить событие как пропущенное
      description: >-
        Статус → skipped. Используется когда оператор подтвердил, что событие
        неактуально (данные починены вручную, downstream уже консистентен).
        Событие НЕ будет опубликовано.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID записи event_outbox
          schema:
            format: uuid
            type: string
      responses:
        '200':
          description: Событие помечено как skipped
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OutboxSkipResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Admin / Outbox
      security:
        - bearer: []
  /api/v1/admin/queues:
    get:
      operationId: QueuesController_list
      summary: Список всех очередей со счётчиками waiting/active/delayed/failed
      description: >-
        Возвращает stats по mineflow-saga-steps, mineflow-saga-compensate,
        mineflow-audit-log. Поле backlogWarning=true означает waiting+delayed
        превысил порог (default 1000, override через env
        BULLMQ_BACKLOG_WARN_THRESHOLD).
      parameters: []
      responses:
        '200':
          description: Список очередей
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/QueuesListResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Admin / Queues
      security:
        - bearer: []
  /api/v1/admin/queues/{name}:
    get:
      operationId: QueuesController_detail
      summary: Детальная статистика одной очереди + sample failed jobs
      description: Возвращает stats + до 10 последних failed jobs (id, reason, attempts).
      parameters:
        - name: name
          required: true
          in: path
          description: Имя очереди
          schema:
            enum:
              - mineflow-saga-steps
              - mineflow-saga-compensate
              - mineflow-audit-log
            type: string
      responses:
        '200':
          description: Детали очереди
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/QueueDetailResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Admin / Queues
      security:
        - bearer: []
  /api/v1/prd/shift-reports:
    get:
      operationId: ShiftReportsController_list
      summary: Список сменных отчётов с фильтрами и пагинацией
      description: >-
        Cursor pagination (по createdAt desc). Фильтры: status,
        productionObjectId, shiftDateFrom, shiftDateTo. Роли: Engineer, Foreman,
        CEO.
      parameters:
        - name: status
          required: false
          in: query
          schema:
            enum:
              - draft
              - submitted
              - approved
              - rejected
            type: string
        - name: productionObjectId
          required: false
          in: query
          description: UUID
          schema:
            format: uuid
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            type: string
        - name: shiftDateFrom
          required: false
          in: query
          description: YYYY-MM-DD
          schema:
            format: date
            pattern: >-
              ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
            type: string
        - name: shiftDateTo
          required: false
          in: query
          description: YYYY-MM-DD
          schema:
            format: date
            pattern: >-
              ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
            type: string
        - name: cursor
          required: false
          in: query
          description: UUID
          schema:
            format: uuid
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            type: string
        - name: limit
          required: false
          in: query
          description: 1..100, default 20
          schema:
            minimum: 1
            maximum: 100
            default: 20
            type: number
      responses:
        '200':
          description: Страница отчётов
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListShiftReportsResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - PRD / Shift Reports
      security:
        - bearer: []
    post:
      operationId: ShiftReportsController_create
      summary: Создать черновик сменного отчёта
      description: >-
        Один черновик на (organization, productionObject, shiftDate, shiftType).
        Дубль → 409. Idempotent через заголовок Idempotency-Key.
      parameters:
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateShiftReportBodyDto'
      responses:
        '201':
          description: Черновик создан
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ShiftReportResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - PRD / Shift Reports
      security:
        - bearer: []
  /api/v1/prd/shift-reports/{id}:
    get:
      operationId: ShiftReportsController_findById
      summary: Получить сменный отчёт по ID
      description: Возвращает 404 если отчёт не найден или принадлежит другой организации.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID сменного отчёта
          schema:
            format: uuid
            type: string
      responses:
        '200':
          description: Сменный отчёт
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ShiftReportResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - PRD / Shift Reports
      security:
        - bearer: []
  /api/v1/prd/shift-reports/{id}/submit:
    patch:
      operationId: ShiftReportsController_submit
      summary: Подать черновик на утверждение
      description: FSM draft → submitted. Подавать может Foreman (заполнял) или Engineer.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID сменного отчёта
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      responses:
        '200':
          description: Отчёт подан
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ShiftReportResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - PRD / Shift Reports
      security:
        - bearer: []
  /api/v1/prd/shift-reports/{id}/approve:
    post:
      operationId: ShiftReportsController_approve
      summary: Утвердить сменный отчёт (запускает 6-шаговую approve-сагу)
      description: >-
        FSM submitted → approved. Возвращает sagaId; следите за прогрессом через
        GET /sagas/:sagaId/status. Idempotent.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID сменного отчёта
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      responses:
        '202':
          description: Сага утверждения принята в обработку
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApproveShiftReportResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - PRD / Shift Reports
      security:
        - bearer: []
  /api/v1/prd/shift-reports/{id}/reject:
    post:
      operationId: ShiftReportsController_reject
      summary: Отклонить сменный отчёт ИЗ submitted (без сторно-саги)
      description: >-
        FSM submitted → rejected. Применяется когда инженер увидел проблему до
        approve. Approve-сага ещё не запускалась, компенсация не требуется — это
        простой статус-переход с reason. Доступно Engineer и CEO. Idempotent.
        После rejected мастер может создать новый отчёт на ту же смену (partial
        unique).
      parameters:
        - name: id
          required: true
          in: path
          description: UUID сменного отчёта
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RejectShiftReportBodyDto'
      responses:
        '200':
          description: Отчёт отклонён
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ShiftReportResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - PRD / Shift Reports
      security:
        - bearer: []
  /api/v1/prd/shift-reports/{id}/reject-after-approve:
    post:
      operationId: ShiftReportsController_rejectAfterApprove
      summary: Сторно утверждённого сменного отчёта (запускает обратную сагу)
      description: >-
        FSM approved → rejected. Запускает 6-шаговую сторно-сагу
        `prd.shift-report.reject-after-approve`. Применяется когда после approve
        обнаружена ошибка и нужно откатить все эффекты (топливо, ТМЦ, моточасы,
        КТГ/КИО, статистика, табель). Возвращает rejectSagaId +
        originalApproveSagaId для трассировки. Idempotent. Доступно только CEO
        (двойное согласование).
      parameters:
        - name: id
          required: true
          in: path
          description: UUID сменного отчёта
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RejectAfterApproveBodyDto'
      responses:
        '202':
          description: Сторно-сага принята в обработку
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RejectAfterApproveResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - PRD / Shift Reports
      security:
        - bearer: []
  /api/v1/prd/shift-reports/{id}/entries:
    get:
      operationId: ShiftReportsController_getEntries
      summary: Снимок всех child entries отчёта
      description: >-
        Возвращает personnel, asset-usages, drilling, blasting, fuel, downtime,
        tmcUsage одним запросом. Используется сагой и админ-просмотром.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID отчёта
          schema:
            format: uuid
            type: string
      responses:
        '200':
          description: Снимок entries
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ShiftReportEntriesResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - PRD / Shift Reports
      security:
        - bearer: []
  /api/v1/prd/shift-reports/{id}/personnel:
    post:
      operationId: ShiftReportsController_addShiftPersonnel
      summary: Добавить запись о сотруднике в смене (Q2)
      description: >-
        Добавляет shift-personnel в отчёт в статусе draft. После approve запись
        становится иммутабельной.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID отчёта
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AddShiftPersonnelBodyDto'
      responses:
        '201':
          description: Запись добавлена
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ShiftPersonnelResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - PRD / Shift Reports
      security:
        - bearer: []
  /api/v1/prd/shift-reports/{id}/asset-usages:
    post:
      operationId: ShiftReportsController_addShiftAssetUsage
      summary: Добавить использование актива в смене (Q2)
      description: >-
        Регистрирует факт работы единицы оборудования в смене. Допускается
        только в статусе draft.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID отчёта
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AddShiftAssetUsageBodyDto'
      responses:
        '201':
          description: Запись добавлена
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ShiftAssetUsageResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - PRD / Shift Reports
      security:
        - bearer: []
  /api/v1/prd/shift-reports/{id}/drilling-entries:
    post:
      operationId: ShiftReportsController_addDrillingEntry
      summary: Добавить запись о бурении (Q2)
      description: >-
        Фиксирует объёмы бурения и износ долота. Допускается только в статусе
        draft.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID отчёта
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AddDrillingEntryBodyDto'
      responses:
        '201':
          description: Запись добавлена
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DrillingEntryResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - PRD / Shift Reports
      security:
        - bearer: []
  /api/v1/prd/shift-reports/{id}/blasting-entries:
    post:
      operationId: ShiftReportsController_addBlastingEntry
      summary: Добавить запись о взрывных работах (Q2)
      description: >-
        Фиксирует взрывные работы и расход ВВ. Может ссылаться на разрешение
        (permit). Допускается только в статусе draft.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID отчёта
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AddBlastingEntryBodyDto'
      responses:
        '201':
          description: Запись добавлена
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BlastingEntryResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - PRD / Shift Reports
      security:
        - bearer: []
  /api/v1/prd/shift-reports/{id}/fuel-entries:
    post:
      operationId: ShiftReportsController_addFuelEntry
      summary: Добавить запись о расходе топлива (Q2)
      description: >-
        Регистрирует расход топлива/смазочных материалов в смене. Допускается
        только в статусе draft.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID отчёта
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AddFuelEntryBodyDto'
      responses:
        '201':
          description: Запись добавлена
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FuelEntryResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - PRD / Shift Reports
      security:
        - bearer: []
  /api/v1/prd/shift-reports/{id}/downtime-events:
    post:
      operationId: ShiftReportsController_addDowntimeEvent
      summary: Добавить событие простоя (Q2)
      description: >-
        Фиксирует интервал простоя оборудования с причиной. Допускается только в
        статусе draft.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID отчёта
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AddDowntimeEventBodyDto'
      responses:
        '201':
          description: Запись добавлена
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DowntimeEventResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - PRD / Shift Reports
      security:
        - bearer: []
  /api/v1/prd/shift-reports/{id}/tmc-usages:
    post:
      operationId: ShiftReportsController_addTmcUsage
      summary: Добавить расход материала (Q2)
      description: >-
        Регистрирует расход ТМЦ (запчастей/расходников) в смене. Допускается
        только в статусе draft.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID отчёта
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AddTmcUsageBodyDto'
      responses:
        '201':
          description: Запись добавлена
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TmcUsageResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - PRD / Shift Reports
      security:
        - bearer: []
  /api/v1/prd/production-plans:
    get:
      operationId: ProductionPlansController_list
      summary: Список планов с фильтрами и пагинацией
      description: >-
        Курсорная пагинация. Foreman/Mechanic — scoped по своим объектам.
        Engineer/CEO/Admin — all.
      parameters:
        - name: horizon
          required: false
          in: query
          schema:
            enum:
              - year
              - month
            type: string
        - name: year
          required: false
          in: query
          schema:
            minimum: 2020
            maximum: 2100
            type: integer
        - name: month
          required: false
          in: query
          schema:
            minimum: 1
            maximum: 12
            type: integer
        - name: status
          required: false
          in: query
          schema:
            enum:
              - draft
              - approved
              - superseded
            type: string
        - name: cursor
          required: false
          in: query
          schema:
            format: uuid
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            type: string
        - name: limit
          required: false
          in: query
          schema:
            minimum: 1
            maximum: 200
            default: 50
            type: integer
      responses:
        '200':
          description: Страница планов
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListProductionPlansResponseDto_Output'
      tags:
        - PRD / Production Plans
      security:
        - bearer: []
    post:
      operationId: ProductionPlansController_create
      summary: Создать draft план (на год или месяц)
      description: 'PRD-PLAN-INV-01: один активный план на (org, horizon, year, month).'
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateProductionPlanDto'
      responses:
        '201':
          description: Draft создан
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProductionPlanResponseDto_Output'
      tags:
        - PRD / Production Plans
      security:
        - bearer: []
  /api/v1/prd/production-plans/{id}:
    get:
      operationId: ProductionPlansController_findOne
      summary: Получить план по id (с историей версий)
      description: >-
        Возвращает план производства по UUID вместе с историей версий (snapshot
        активной + предыдущие ревизии).
      parameters:
        - name: id
          required: true
          in: path
          description: UUID плана
          schema:
            format: uuid
            type: string
      responses:
        '200':
          description: План найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProductionPlanResponseDto_Output'
      tags:
        - PRD / Production Plans
      security:
        - bearer: []
  /api/v1/prd/production-plans/{id}/approve:
    post:
      operationId: ProductionPlansController_approve
      summary: Утвердить draft план (создаёт ProductionPlanVersion v1)
      description: >-
        FSM: draft → approved. Активирует расчёт PlanEntry.factValue через
        подписку на prd.shift-report.approved.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID плана
          schema:
            format: uuid
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ApproveProductionPlanDto'
      responses:
        '200':
          description: План утверждён
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProductionPlanResponseDto_Output'
      tags:
        - PRD / Production Plans
      security:
        - bearer: []
  /api/v1/prd/production-plans/{id}/amend:
    post:
      operationId: ProductionPlansController_amend
      summary: Корректировка утверждённого плана (создаёт v{n+1})
      description: >-
        Если delta > 20% и инициатор — не CEO: версия в pending_ceo, требуется
        approveVersion от CEO. Reason обязателен (PRD-PLAN-INV-06).
      parameters:
        - name: id
          required: true
          in: path
          description: UUID плана
          schema:
            format: uuid
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AmendProductionPlanDto'
      responses:
        '200':
          description: ''
      tags:
        - PRD / Production Plans
      security:
        - bearer: []
  /api/v1/prd/production-plans/{id}/versions/{versionId}/approve:
    post:
      operationId: ProductionPlansController_approveSignificantVersion
      summary: CEO утверждает значительную (>20%) корректировку
      description: pending_ceo → approved_version; current_version_id плана обновляется.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID плана
          schema:
            format: uuid
            type: string
        - name: versionId
          required: true
          in: path
          description: UUID версии (pending_ceo)
          schema:
            format: uuid
            type: string
      responses:
        '200':
          description: ''
      tags:
        - PRD / Production Plans
      security:
        - bearer: []
  /api/v1/prd/production-plans/{id}/versions/{versionId}/reject:
    post:
      operationId: ProductionPlansController_rejectSignificantVersion
      summary: CEO отклоняет значительную (>20%) корректировку
      description: pending_ceo → rejected_version; current_version_id плана не меняется.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID плана
          schema:
            format: uuid
            type: string
        - name: versionId
          required: true
          in: path
          description: UUID версии (pending_ceo)
          schema:
            format: uuid
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RejectProductionPlanVersionDto'
      responses:
        '200':
          description: ''
      tags:
        - PRD / Production Plans
      security:
        - bearer: []
  /api/v1/prd/production-plans/{id}/supersede:
    post:
      operationId: ProductionPlansController_supersede
      summary: Заместить план новым (старый → superseded)
      description: 'FSM: approved → superseded. Новый план должен уже существовать.'
      parameters:
        - name: id
          required: true
          in: path
          description: UUID плана
          schema:
            format: uuid
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SupersedeProductionPlanDto'
      responses:
        '200':
          description: ''
      tags:
        - PRD / Production Plans
      security:
        - bearer: []
  /api/v1/prd/production-plans/{id}/daily-norms:
    post:
      operationId: ProductionPlansController_createDailyNorm
      summary: Создать/скорректировать суточный норматив (DailyNorm)
      description: >-
        Foreman ±15% — гард в use-case (PRD-PLAN-INV-13). Engineer/CEO/Admin —
        без ограничения; >15% за рамки лимита Foreman, требуется amend плана.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID плана
          schema:
            format: uuid
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AdjustDailyNormDto'
      responses:
        '201':
          description: ''
      tags:
        - PRD / Production Plans
      security:
        - bearer: []
  /api/v1/scm/fuel/tanks:
    get:
      operationId: FuelController_listTanks
      summary: Резервуары ДТ — список
      description: >-
        Курсорная пагинация. Для Foreman / Mechanic — только свой production
        object (или укажите objectId)
      parameters:
        - name: objectId
          required: false
          in: query
          schema:
            $ref: '#/components/schemas/Uuid'
        - name: status
          required: false
          in: query
          schema:
            enum:
              - normal
              - attention
              - critical
            type: string
        - name: cursor
          required: false
          in: query
          schema:
            type: string
        - name: limit
          required: false
          in: query
          schema:
            maximum: 200
            exclusiveMinimum: 0
            type: integer
        - name: active
          required: false
          in: query
          schema:
            enum:
              - 'true'
              - 'false'
            type: string
      responses:
        '200':
          description: Страница резервуаров
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListFuelTanksResponseDto_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / Fuel
      security:
        - bearer: []
    post:
      operationId: FuelController_createTank
      summary: Создать резервуар
      description: По умолчанию — роль Admin (корпоративный справочник объекта)
      parameters:
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateFuelTankDto'
      responses:
        '201':
          description: Создан
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FuelTankResponseDto_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / Fuel
      security:
        - bearer: []
  /api/v1/scm/fuel/tanks/{id}:
    get:
      operationId: FuelController_getTank
      summary: Резервуар по id
      description: >-
        Возвращает карточку резервуара. Доступ ограничен ролью и object scope по
        production object.
      parameters:
        - name: id
          required: true
          in: path
          schema:
            format: uuid
            type: string
      responses:
        '200':
          description: Найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FuelTankResponseDto_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / Fuel
      security:
        - bearer: []
    patch:
      operationId: FuelController_patchTank
      summary: Обновить minLevel резервуара
      description: >-
        Меняет пороговое значение minLevel, на котором поднимается алерт «low
        stock». Аудит + idempotency обязательны.
      parameters:
        - name: id
          required: true
          in: path
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateFuelTankDto'
      responses:
        '200':
          description: Обновлено
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FuelTankResponseDto_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / Fuel
      security:
        - bearer: []
  /api/v1/scm/fuel/supply-requests:
    get:
      operationId: FuelController_listSupplyRequests
      summary: Заявки на пополнение — список
      description: >-
        Курсорная пагинация заявок на пополнение ДТ. Фильтрация по статусу и
        production object.
      parameters:
        - name: tankId
          required: false
          in: query
          schema:
            $ref: '#/components/schemas/Uuid'
        - name: status
          required: false
          in: query
          anyOf:
            - type: string
              enum:
                - draft
                - sent
                - approved
                - fulfilled
                - rejected
            - type: array
              items:
                type: string
                enum:
                  - draft
                  - sent
                  - approved
                  - fulfilled
                  - rejected
          schema: {}
        - name: cursor
          required: false
          in: query
          schema:
            type: string
        - name: limit
          required: false
          in: query
          schema:
            maximum: 200
            exclusiveMinimum: 0
            type: integer
      responses:
        '200':
          description: Страница заявок
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListFuelSupplyRequestsResponseDto_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / Fuel
      security:
        - bearer: []
    post:
      operationId: FuelController_createSupplyRequest
      summary: Создать заявку на пополнение
      description: >-
        Создаёт заявку в статусе draft. Передача в согласование — отдельный
        submit.
      parameters:
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateFuelSupplyRequestDto'
      responses:
        '201':
          description: Создана
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FuelSupplyRequestResponseDto_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / Fuel
      security:
        - bearer: []
  /api/v1/scm/fuel/supply-requests/{id}:
    get:
      operationId: FuelController_getSupplyRequest
      summary: Заявка по id
      description: >-
        Карточка заявки на пополнение со связанными поставками. Доступ ограничен
        object scope.
      parameters:
        - name: id
          required: true
          in: path
          schema:
            format: uuid
            type: string
      responses:
        '200':
          description: Найдена
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FuelSupplyRequestResponseDto_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / Fuel
      security:
        - bearer: []
    patch:
      operationId: FuelController_patchSupplyRequest
      summary: Обновить заявку на пополнение
      description: >-
        Правка полей заявки в статусе draft. После submit редактирование
        запрещено.
      parameters:
        - name: id
          required: true
          in: path
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateFuelSupplyRequestDto'
      responses:
        '200':
          description: Обновлено
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FuelSupplyRequestResponseDto_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / Fuel
      security:
        - bearer: []
  /api/v1/scm/fuel/supply-requests/{id}/submit:
    post:
      operationId: FuelController_submitSupplyRequest
      summary: Отправить заявку на согласование
      description: Переводит заявку draft → submitted. Триггерит уведомление утверждающим.
      parameters:
        - name: id
          required: true
          in: path
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      responses:
        '200':
          description: Отправлено
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FuelSupplyRequestResponseDto_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / Fuel
      security:
        - bearer: []
  /api/v1/scm/fuel/supply-requests/{id}/approve:
    post:
      operationId: FuelController_approveSupplyRequest
      summary: Согласовать заявку
      description: submitted → approved. Поставщик получает разрешение на отгрузку.
      parameters:
        - name: id
          required: true
          in: path
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ApproveFuelSupplyRequestDto'
      responses:
        '200':
          description: Согласовано
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FuelSupplyRequestResponseDto_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / Fuel
      security:
        - bearer: []
  /api/v1/scm/fuel/supply-requests/{id}/reject:
    post:
      operationId: FuelController_rejectSupplyRequest
      summary: Отклонить заявку
      description: submitted → rejected с причиной отказа. Терминальный статус.
      parameters:
        - name: id
          required: true
          in: path
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RejectFuelSupplyRequestDto'
      responses:
        '200':
          description: Отклонено
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FuelSupplyRequestResponseDto_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / Fuel
      security:
        - bearer: []
  /api/v1/scm/fuel/supply-requests/{id}/return-for-revision:
    post:
      operationId: FuelController_returnForRevision
      summary: Вернуть заявку на доработку
      description: >-
        submitted → draft с комментарием. Автор правит и повторно отправляет на
        submit.
      parameters:
        - name: id
          required: true
          in: path
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ReturnForRevisionFuelSupplyRequestDto'
      responses:
        '200':
          description: Возвращено в draft
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FuelSupplyRequestResponseDto_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / Fuel
      security:
        - bearer: []
  /api/v1/scm/fuel/supply-requests/{id}/link-supply:
    post:
      operationId: FuelController_linkSupply
      summary: Привязать поставку к заявке
      description: >-
        Связывает фактически зарегистрированную поставку с approved-заявкой для
        закрытия плана.
      parameters:
        - name: id
          required: true
          in: path
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LinkSupplyFuelSupplyRequestDto'
      responses:
        '200':
          description: Привязка выполнена
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FuelSupplyRequestResponseDto_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / Fuel
      security:
        - bearer: []
  /api/v1/scm/fuel/supplies:
    get:
      operationId: FuelController_listSupplies
      summary: История поставок ДТ
      description: >-
        Курсорная пагинация фактически зарегистрированных поставок ДТ по
        объекту.
      parameters:
        - name: tankId
          required: false
          in: query
          schema:
            $ref: '#/components/schemas/Uuid'
        - name: supplierId
          required: false
          in: query
          schema:
            $ref: '#/components/schemas/Uuid'
        - name: cursor
          required: false
          in: query
          schema:
            type: string
        - name: limit
          required: false
          in: query
          schema:
            maximum: 200
            exclusiveMinimum: 0
            type: integer
      responses:
        '200':
          description: Страница поставок
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListFuelSuppliesResponseDto_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / Fuel
      security:
        - bearer: []
    post:
      operationId: FuelController_recordSupply
      summary: Регистрация поставки (приёмка)
      description: Создаёт запись приёмки топлива в резервуар; обновляет баланс и аудит.
      parameters:
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RecordFuelSupplyDto'
      responses:
        '201':
          description: Создана
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FuelSupplyResponseDto_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / Fuel
      security:
        - bearer: []
  /api/v1/scm/fuel/supplies/{id}/reversal:
    post:
      operationId: FuelController_reverseSupply
      summary: Сторно поставки (counter-entry)
      description: >-
        Создаёт обратную транзакцию по поставке: оригинал не удаляется, баланс
        компенсируется.
      parameters:
        - name: id
          required: true
          in: path
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/FuelReversalBodyDto'
      responses:
        '201':
          description: Сторно создано
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FuelTransactionResponseDto_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / Fuel
      security:
        - bearer: []
  /api/v1/scm/fuel/consumptions:
    get:
      operationId: FuelController_listConsumptions
      summary: История списаний ДТ
      description: >-
        Курсорная пагинация списаний топлива (как PRD-автоматических, так и
        ручных).
      parameters:
        - name: tankId
          required: false
          in: query
          schema:
            $ref: '#/components/schemas/Uuid'
        - name: kinds
          required: false
          in: query
          description: 'CSV: consumption_auto,consumption_manual'
          schema:
            type: string
        - name: shiftReportId
          required: false
          in: query
          schema:
            $ref: '#/components/schemas/Uuid'
        - name: cursor
          required: false
          in: query
          schema:
            type: string
        - name: limit
          required: false
          in: query
          schema:
            maximum: 200
            exclusiveMinimum: 0
            type: integer
      responses:
        '200':
          description: Страница списаний
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListFuelConsumptionsResponseDto_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / Fuel
      security:
        - bearer: []
    post:
      operationId: FuelController_recordManualConsumption
      summary: Ручное списание ДТ
      description: >-
        Регистрирует списание топлива вручную (вне PRD shift-report). Снижает
        баланс резервуара.
      parameters:
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RecordManualConsumptionDto'
      responses:
        '201':
          description: Создано
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FuelConsumptionResponseDto_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / Fuel
      security:
        - bearer: []
  /api/v1/scm/fuel/consumptions/{id}/reversal:
    post:
      operationId: FuelController_reverseConsumption
      summary: Сторно списания (counter-entry)
      description: >-
        Создаёт обратную транзакцию по списанию: оригинал сохраняется, баланс
        восстанавливается.
      parameters:
        - name: id
          required: true
          in: path
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/FuelReversalBodyDto'
      responses:
        '201':
          description: Сторно создано
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FuelTransactionResponseDto_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / Fuel
      security:
        - bearer: []
  /api/v1/scm/suppliers:
    get:
      operationId: SuppliersController_list
      summary: Список поставщиков с фильтрами и пагинацией
      description: >-
        По умолчанию — только active. Фильтры: status[], category, q
        (legalName/shortName/bin/iin). Поставщики — компанийный справочник, без
        object-scope.
      parameters:
        - name: status
          required: false
          in: query
          description: >-
            Фильтр по статусу FSM (можно несколько). По умолчанию — только
            active
          schema:
            example:
              - active
            type: array
        - name: category
          required: false
          in: query
          description: Фильтр по категории поставщика
          schema:
            example: tmc
            enum:
              - tmc
              - fuel
              - service
              - equipment
            type: string
        - name: q
          required: false
          in: query
          description: Поиск по legalName / shortName / bin / iin
          schema:
            maxLength: 100
            example: БурТех
            type: string
        - name: cursor
          required: false
          in: query
          description: UUID последнего элемента предыдущей страницы
          schema:
            format: uuid
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            example: 11111111-1111-4111-8111-111111111111
            type: string
        - name: limit
          required: false
          in: query
          description: Максимум элементов на странице (1–200)
          schema:
            maximum: 200
            exclusiveMinimum: 0
            default: 50
            example: 50
            type: integer
      responses:
        '200':
          description: Страница поставщиков
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListSuppliersResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / Suppliers
      security:
        - bearer: []
    post:
      operationId: SuppliersController_create
      summary: Создать поставщика (статус draft)
      description: >-
        Доступно ролям: Supply, Admin. Затем — POST /:id/submit для отправки на
        проверку.
      parameters:
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateSupplierDto'
      responses:
        '201':
          description: Поставщик создан
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SupplierResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / Suppliers
      security:
        - bearer: []
  /api/v1/scm/suppliers/{id}:
    get:
      operationId: SuppliersController_findOne
      summary: Получить поставщика по id
      description: >-
        Возвращает карточку. Контакты/счета — отдельный endpoint (TODO
        scm/suppliers).
      parameters:
        - name: id
          required: true
          in: path
          description: UUID поставщика
          schema:
            format: uuid
            type: string
      responses:
        '200':
          description: Поставщик найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SupplierResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / Suppliers
      security:
        - bearer: []
  /api/v1/scm/suppliers/{id}/submit:
    post:
      operationId: SuppliersController_submit
      summary: Отправить поставщика на проверку (draft → under_review)
      description: >-
        Требует ≥1 primary contact + ≥1 primary bank с валидным IBAN
        (SCM-SUP-INV-05). Idempotent.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID поставщика
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SubmitSupplierDto'
      responses:
        '200':
          description: Отправлен на проверку
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SupplierResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / Suppliers
      security:
        - bearer: []
  /api/v1/scm/suppliers/{id}/approve:
    post:
      operationId: SuppliersController_approve
      summary: Утвердить поставщика (under_review → active)
      description: >-
        Split of duty: approvedBy ≠ submittedBy (SCM-SUP-INV-13). Доступно
        ceo/admin. Idempotent.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID поставщика
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ApproveSupplierDto'
      responses:
        '200':
          description: Активирован
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SupplierResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / Suppliers
      security:
        - bearer: []
  /api/v1/scm/suppliers/{id}/send-back:
    post:
      operationId: SuppliersController_sendBack
      summary: Вернуть в draft с комментарием (under_review → draft)
      description: Доступно ceo/admin. comment обязателен (≥10 символов).
      parameters:
        - name: id
          required: true
          in: path
          description: UUID поставщика
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SendBackSupplierDto'
      responses:
        '200':
          description: Возвращён в draft
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SupplierResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / Suppliers
      security:
        - bearer: []
  /api/v1/scm/suppliers/{id}/suspend:
    post:
      operationId: SuppliersController_suspend
      summary: Заблокировать поставщика (active → suspended)
      description: >-
        Reason обязателен. После события scm.supplier.suspended соседние модули
        отменяют draft закупки (SCM-SUP-INV-03c).
      parameters:
        - name: id
          required: true
          in: path
          description: UUID поставщика
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SuspendSupplierDto'
      responses:
        '200':
          description: Заблокирован
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SupplierResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / Suppliers
      security:
        - bearer: []
  /api/v1/scm/suppliers/{id}/reactivate:
    post:
      operationId: SuppliersController_reactivate
      summary: Разблокировать поставщика (suspended → active)
      description: Reason обязателен (минимум 10 символов).
      parameters:
        - name: id
          required: true
          in: path
          description: UUID поставщика
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ReactivateSupplierDto'
      responses:
        '200':
          description: Активирован
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SupplierResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / Suppliers
      security:
        - bearer: []
  /api/v1/scm/suppliers/{id}/archive:
    post:
      operationId: SuppliersController_archive
      summary: Архивировать поставщика (* → archived, terminal)
      description: >-
        Двойное согласование для active/suspended (Q5): coApprovedBy обязателен,
        ≠ actorId. Cross-aggregate sync guards (SCM-SUP-INV-11/-11c) — TODO до
        wiring scm/tmc + eam.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID поставщика
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ArchiveSupplierDto'
      responses:
        '200':
          description: Архивирован
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SupplierResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / Suppliers
      security:
        - bearer: []
  /api/v1/scm/suppliers/{id}/contacts/{contactId}/set-primary:
    post:
      operationId: SuppliersController_setPrimaryContact
      summary: Назначить primary-контакт у поставщика
      description: >-
        SCM-SUP-INV-07: два UPDATE в транзакции (сброс текущего primary +
        установка нового). Partial UNIQUE страхует от гонок (ADR-0028).
        Idempotent.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID поставщика
          schema:
            format: uuid
            type: string
        - name: contactId
          required: true
          in: path
          description: UUID контакта
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      responses:
        '204':
          description: Primary-контакт назначен (204 No Content)
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / Suppliers
      security:
        - bearer: []
  /api/v1/scm/suppliers/{id}/bank-accounts/{bankId}/set-primary:
    post:
      operationId: SuppliersController_setPrimaryBankAccount
      summary: Назначить primary-счёт у поставщика
      description: >-
        SCM-SUP-INV-07 для bank accounts. Аналогично контактам — два UPDATE в
        транзакции. Idempotent.
      parameters:
        - name: id
          required: true
          in: path
          description: UUID поставщика
          schema:
            format: uuid
            type: string
        - name: bankId
          required: true
          in: path
          description: UUID банковского счёта
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      responses:
        '204':
          description: Primary-счёт назначен (204 No Content)
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / Suppliers
      security:
        - bearer: []
  /api/v1/scm/suppliers/{id}/bank-accounts/{bankId}:
    patch:
      operationId: SuppliersController_updateBankAccount
      summary: Изменить реквизиты банковского счёта поставщика
      description: >-
        SCM-SUP-INV-10: смена IBAN валидируется через mod-97 + reason ≥ 10
        символов. Каждое изменённое поле пишется в supplier_audit_log;
        публикуется событие scm.supplier.updated (ADR-0028).
      parameters:
        - name: id
          required: true
          in: path
          description: UUID поставщика
          schema:
            format: uuid
            type: string
        - name: bankId
          required: true
          in: path
          description: UUID банковского счёта
          schema:
            format: uuid
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateSupplierBankAccountDto'
      responses:
        '200':
          description: Счёт обновлён
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SupplierBankAccountResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / Suppliers
      security:
        - bearer: []
  /api/v1/scm/tmc/items:
    get:
      operationId: TmcController_listItems
      summary: Список позиций номенклатуры ТМЦ
      description: Список позиций номенклатуры ТМЦ
      parameters:
        - name: category
          required: false
          in: query
          schema:
            enum:
              - drill_tool
              - spare
              - consumable
              - other
            type: string
        - name: active
          required: false
          in: query
          schema:
            type: boolean
        - name: q
          required: false
          in: query
          schema:
            maxLength: 200
            type: string
        - name: cursor
          required: false
          in: query
          schema:
            format: uuid
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            type: string
        - name: limit
          required: false
          in: query
          schema:
            minimum: 1
            maximum: 200
            default: 50
            type: integer
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListTmcItemsResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / TMC
      security:
        - bearer: []
    post:
      operationId: TmcController_createItem
      summary: Создать позицию ТМЦ
      description: Создать позицию ТМЦ
      parameters:
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateTmcItemDto'
      responses:
        '201':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TmcItemResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / TMC
      security:
        - bearer: []
  /api/v1/scm/tmc/items/{id}:
    get:
      operationId: TmcController_findItem
      summary: Получить позицию по id
      description: Получить позицию по id
      parameters:
        - name: id
          required: true
          in: path
          schema:
            format: uuid
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TmcItemResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / TMC
      security:
        - bearer: []
    patch:
      operationId: TmcController_updateItem
      summary: Обновить карточку позиции
      description: Обновить карточку позиции
      parameters:
        - name: id
          required: true
          in: path
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateTmcItemDto'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TmcItemResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / TMC
      security:
        - bearer: []
  /api/v1/scm/tmc/items/{id}/deactivate:
    post:
      operationId: TmcController_deactivateItem
      summary: Снять позицию с учёта (TMC-INV-14)
      description: Снять позицию с учёта (TMC-INV-14)
      parameters:
        - name: id
          required: true
          in: path
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TmcItemResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / TMC
      security:
        - bearer: []
  /api/v1/scm/tmc/inbounds:
    post:
      operationId: TmcController_recordInbound
      summary: Зарегистрировать поступление ТМЦ
      description: Зарегистрировать поступление ТМЦ
      parameters:
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RecordTmcInboundDto'
      responses:
        '201':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RecordTmcInboundResult_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / TMC
      security:
        - bearer: []
  /api/v1/scm/tmc/consumptions:
    post:
      operationId: TmcController_recordManualConsumption
      summary: Ручной акт списания
      description: Ручной акт списания
      parameters:
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RecordTmcManualConsumptionDto'
      responses:
        '201':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RecordTmcManualConsumptionResult_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / TMC
      security:
        - bearer: []
  /api/v1/scm/tmc/transfers:
    get:
      operationId: TmcController_listTransfers
      summary: Список перемещений
      description: Список перемещений
      parameters:
        - name: status
          required: true
          in: query
          schema:
            type: string
        - name: warehouseId
          required: true
          in: query
          schema:
            type: string
        - name: cursor
          required: true
          in: query
          schema:
            type: string
        - name: limit
          required: true
          in: query
          schema:
            type: number
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListTmcTransfersResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / TMC
      security:
        - bearer: []
    post:
      operationId: TmcController_issueTransfer
      summary: 'Issue: создать перемещение (issued)'
      description: 'Issue: создать перемещение (issued)'
      parameters:
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/IssueTmcTransferDto'
      responses:
        '201':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TmcTransferResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / TMC
      security:
        - bearer: []
  /api/v1/scm/tmc/transfers/{id}:
    get:
      operationId: TmcController_findTransfer
      summary: Получить перемещение по id
      description: Получить перемещение по id
      parameters:
        - name: id
          required: true
          in: path
          schema:
            format: uuid
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TmcTransferResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / TMC
      security:
        - bearer: []
  /api/v1/scm/tmc/transfers/{id}/confirm:
    post:
      operationId: TmcController_confirmTransfer
      summary: 'Confirm: подтвердить прибытие (issued → confirmed)'
      description: 'Confirm: подтвердить прибытие (issued → confirmed)'
      parameters:
        - name: id
          required: true
          in: path
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ConfirmTmcTransferDto'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TmcTransferResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / TMC
      security:
        - bearer: []
  /api/v1/scm/tmc/requests:
    get:
      operationId: TmcController_listRequests
      summary: Список заявок на пополнение
      description: Список заявок на пополнение
      parameters:
        - name: status
          required: true
          in: query
          schema:
            type: string
        - name: warehouseId
          required: true
          in: query
          schema:
            type: string
        - name: cursor
          required: true
          in: query
          schema:
            type: string
        - name: limit
          required: true
          in: query
          schema:
            type: number
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListTmcRequestsResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / TMC
      security:
        - bearer: []
    post:
      operationId: TmcController_createRequest
      summary: Создать заявку (draft)
      description: Создать заявку (draft)
      parameters:
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateTmcRequestDto'
      responses:
        '201':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TmcRequestResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / TMC
      security:
        - bearer: []
  /api/v1/scm/tmc/requests/{id}:
    get:
      operationId: TmcController_findRequest
      summary: Получить заявку по id
      description: Получить заявку по id
      parameters:
        - name: id
          required: true
          in: path
          schema:
            format: uuid
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TmcRequestResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / TMC
      security:
        - bearer: []
  /api/v1/scm/tmc/requests/{id}/submit:
    post:
      operationId: TmcController_submitRequest
      summary: Отправить заявку (draft → sent)
      description: Отправить заявку (draft → sent)
      parameters:
        - name: id
          required: true
          in: path
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SubmitTmcRequestDto'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TmcRequestResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / TMC
      security:
        - bearer: []
  /api/v1/scm/tmc/requests/{id}/approve:
    post:
      operationId: TmcController_approveRequest
      summary: Согласовать заявку (sent → approved). Только Engineer/Admin.
      description: Согласовать заявку (sent → approved). Только Engineer/Admin.
      parameters:
        - name: id
          required: true
          in: path
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ApproveTmcRequestDto'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TmcRequestResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / TMC
      security:
        - bearer: []
  /api/v1/scm/tmc/requests/{id}/reject:
    post:
      operationId: TmcController_rejectRequest
      summary: Отклонить заявку (sent → rejected)
      description: Отклонить заявку (sent → rejected)
      parameters:
        - name: id
          required: true
          in: path
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RejectTmcRequestDto'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TmcRequestResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / TMC
      security:
        - bearer: []
  /api/v1/scm/tmc/requests/{id}/return-to-draft:
    post:
      operationId: TmcController_returnRequestToDraft
      summary: Вернуть на доработку (sent → draft)
      description: Вернуть на доработку (sent → draft)
      parameters:
        - name: id
          required: true
          in: path
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ReturnTmcRequestToDraftDto'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TmcRequestResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / TMC
      security:
        - bearer: []
  /api/v1/scm/tmc/requests/{id}/start:
    post:
      operationId: TmcController_startRequest
      summary: Взять в работу (approved → in_progress)
      description: Взять в работу (approved → in_progress)
      parameters:
        - name: id
          required: true
          in: path
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/StartTmcRequestDto'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TmcRequestResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / TMC
      security:
        - bearer: []
  /api/v1/scm/tmc/requests/{id}/fulfill:
    post:
      operationId: TmcController_fulfillRequest
      summary: Закрыть (in_progress → fulfilled)
      description: Закрыть (in_progress → fulfilled)
      parameters:
        - name: id
          required: true
          in: path
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/FulfillTmcRequestDto'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TmcRequestResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / TMC
      security:
        - bearer: []
  /api/v1/scm/tmc/inventories:
    get:
      operationId: TmcController_listInventories
      summary: Список инвентаризаций
      description: Список инвентаризаций
      parameters:
        - name: status
          required: true
          in: query
          schema:
            type: string
        - name: warehouseId
          required: true
          in: query
          schema:
            type: string
        - name: cursor
          required: true
          in: query
          schema:
            type: string
        - name: limit
          required: true
          in: query
          schema:
            type: number
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListTmcInventoriesResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / TMC
      security:
        - bearer: []
    post:
      operationId: TmcController_startInventory
      summary: Стартовать инвентаризацию (snapshot TmcBalance)
      description: Стартовать инвентаризацию (snapshot TmcBalance)
      parameters:
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/StartTmcInventoryDto'
      responses:
        '201':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TmcInventoryResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / TMC
      security:
        - bearer: []
  /api/v1/scm/tmc/inventories/{id}:
    get:
      operationId: TmcController_findInventory
      summary: Получить инвентаризацию по id
      description: Получить инвентаризацию по id
      parameters:
        - name: id
          required: true
          in: path
          schema:
            format: uuid
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TmcInventoryResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / TMC
      security:
        - bearer: []
  /api/v1/scm/tmc/inventories/{id}/complete:
    post:
      operationId: TmcController_completeInventory
      summary: >-
        Завершить инвентаризацию (in_progress → completed). Создаёт
        TmcMovement(inventory_adjustment) для variance != 0.
      description: >-
        Завершить инвентаризацию (in_progress → completed). Создаёт
        TmcMovement(inventory_adjustment) для variance != 0.
      parameters:
        - name: id
          required: true
          in: path
          schema:
            format: uuid
            type: string
        - name: Idempotency-Key
          in: header
          description: >-
            UUID v4 — повтор с тем же ключом возвращает сохранённый ответ (TTL
            24ч)
          required: true
          schema:
            type: string
            format: uuid
            example: 55555555-5555-4555-8555-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CompleteTmcInventoryDto'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TmcInventoryResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '409':
          description: Конфликт доменного состояния или идемпотентности
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '413':
          description: Тело запроса превышает максимально допустимый размер
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '415':
          description: Неподдерживаемый Content-Type (требуется application/json)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / TMC
      security:
        - bearer: []
  /api/v1/scm/tmc/balances:
    get:
      operationId: TmcBalancesController_list
      summary: Остатки ТМЦ
      description: >-
        Фильтры: warehouseId, itemId, onlyLowStock. Object-scope для
        foreman/mechanic — фильтрация по warehouseId (TODO интеграция с
        @RequiresObjectScope после регистрации Warehouse в Refs-Kit).
      parameters:
        - name: warehouseId
          required: false
          in: query
          description: UUID склада
          schema:
            format: uuid
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            example: 11111111-1111-4111-8111-111111111111
            type: string
        - name: itemId
          required: false
          in: query
          description: UUID позиции
          schema:
            format: uuid
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            example: 11111111-1111-4111-8111-111111111111
            type: string
        - name: onlyLowStock
          required: false
          in: query
          schema:
            type: boolean
        - name: cursor
          required: false
          in: query
          schema:
            format: uuid
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            type: string
        - name: limit
          required: false
          in: query
          schema:
            minimum: 1
            maximum: 500
            default: 100
            type: integer
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListTmcBalancesResponse_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '422':
          description: Ошибка валидации DTO или бизнес-правила
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - SCM / TMC
      security:
        - bearer: []
  /api/v1/sagas/{sagaId}/status:
    get:
      operationId: SagasController_getStatus
      summary: Прогресс любой саги по sagaId
      description: >-
        Универсальный endpoint для опроса async-саг. После запуска саги
        (например, POST /eam/sagas/asset-decommission или approve shift-report)
        FE получает sagaId и опрашивает этот endpoint до тех пор, пока последний
        шаг не примет терминальный статус (completed/failed/compensated).
        Cross-org изоляция: возвращаются только шаги саг своей организации.
      parameters:
        - name: sagaId
          required: true
          in: path
          description: UUID саги, возвращённый при запуске
          schema:
            format: uuid
            type: string
      responses:
        '200':
          description: Хронология шагов саги
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GlobalSagaStatus_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Sagas
      security:
        - bearer: []
  /api/v1/audit:
    get:
      operationId: AuditController_listEntityHistory
      summary: История изменений сущности
      description: >-
        Cursor-пагинированный список audit-записей по конкретной сущности
        (entityType + entityId). Сортировка по at DESC (новые сверху).
        Используется на detail-страницах для отображения «кто и когда менял».
      parameters:
        - name: entityType
          required: true
          in: query
          description: Тип сущности
          schema:
            minLength: 1
            maxLength: 64
            example: asset
            type: string
        - name: entityId
          required: true
          in: query
          description: UUID сущности (v4)
          schema:
            format: uuid
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            example: 11111111-1111-4111-8111-111111111111
            type: string
        - name: limit
          required: false
          in: query
          description: 1–200, default 50
          schema:
            minimum: 1
            maximum: 200
            default: 50
            example: 50
            type: number
        - name: cursor
          required: false
          in: query
          description: ISO-timestamp из nextCursor предыдущей страницы
          schema:
            format: date-time
            pattern: >-
              ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
            example: '2026-05-25T08:30:15.123Z'
            type: string
      responses:
        '200':
          description: Страница записей audit log
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuditLogPage_Output'
        '400':
          description: >-
            Невалидный path/query/header — ParseUUIDPipe или missing
            Idempotency-Key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '401':
          description: Не авторизован — отсутствует или невалиден Bearer JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '403':
          description: Недостаточно прав (RBAC или object scope)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '404':
          description: Ресурс не найден
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '429':
          description: Превышен rate-limit (throttler)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '500':
          description: Внутренняя ошибка сервера — необработанное исключение
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
        '503':
          description: Сервис временно недоступен (внешняя зависимость)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailsDto'
      tags:
        - Audit
      security:
        - bearer: []
  /api/v1/sim/runs:
    get:
      operationId: SimController_list
      summary: Список sim-прогонов
      description: >-
        Возвращает доступные прогоны симулятора (read-only, читаются с диска
        var/sim).
      parameters: []
      responses:
        '200':
          description: ''
      tags:
        - sim
      security:
        - bearer: []
  /api/v1/sim/runs/{runId}/replay:
    get:
      operationId: SimController_replay
      summary: Реплей событий прогона
      description: Лента событий прогона с пагинацией по тику (afterTick, limit).
      parameters:
        - name: runId
          required: true
          in: path
          schema:
            type: string
        - name: afterTick
          required: true
          in: query
          schema:
            type: string
        - name: limit
          required: true
          in: query
          schema:
            type: string
      responses:
        '200':
          description: ''
      tags:
        - sim
      security:
        - bearer: []
  /api/v1/sim/runs/{runId}/coordination:
    get:
      operationId: SimController_coordination
      summary: Координационные сообщения прогона
      description: >-
        Лента coordination-сообщений персон с пагинацией по seq (afterSeq,
        limit).
      parameters:
        - name: runId
          required: true
          in: path
          schema:
            type: string
        - name: afterSeq
          required: true
          in: query
          schema:
            type: string
        - name: limit
          required: true
          in: query
          schema:
            type: string
      responses:
        '200':
          description: ''
      tags:
        - sim
      security:
        - bearer: []
  /api/v1/sim/runs/{runId}/world:
    get:
      operationId: SimController_world
      summary: Снимок мира на тике
      description: >-
        Состояние мира прогона на конкретном тике (query-параметр tick
        обязателен).
      parameters:
        - name: runId
          required: true
          in: path
          schema:
            type: string
        - name: tick
          required: true
          in: query
          schema:
            type: string
      responses:
        '200':
          description: ''
      tags:
        - sim
      security:
        - bearer: []
  /api/v1/sim/runs/{runId}/world-ticks:
    get:
      operationId: SimController_worldTicks
      summary: Тики со снимками мира
      description: Список тиков прогона, для которых доступен снимок состояния мира.
      parameters:
        - name: runId
          required: true
          in: path
          schema:
            type: string
      responses:
        '200':
          description: ''
      tags:
        - sim
      security:
        - bearer: []
  /api/v1/sim/runs/{runId}/summary:
    get:
      operationId: SimController_summary
      summary: Сводка прогона
      description: >-
        Итоговая сводка прогона симулятора (персоны, тики, нарушения
        инвариантов).
      parameters:
        - name: runId
          required: true
          in: path
          schema:
            type: string
      responses:
        '200':
          description: ''
      tags:
        - sim
      security:
        - bearer: []
info:
  title: MineFlow Core API
  description: HTTP API ядра MineFlow (PRD, EAM, SCM, HR, IAM, Notifications)
  version: 0.1.0
  contact: {}
tags:
  - name: Health
    description: Liveness/readiness probes для Kubernetes
  - name: Observability
    description: Метрики Prometheus и системные эндпоинты
  - name: Refs / registry
    description: Общий справочник реестров системы
  - name: Admin / Organizations
    description: Управление организациями (multi-tenancy)
  - name: Admin / Sagas DLQ
    description: Просмотр и переотправка задач из DLQ саг
  - name: Admin / Trash
    description: Soft-deleted записи и восстановление
  - name: Audit
    description: Доступ к журналу аудита действий
  - name: Documents
    description: Прикреплённые документы (MinIO)
  - name: Sagas
    description: Статусы и метаданные исполнения саг
  - name: PRD / Shift Reports
    description: Сменные отчёты буровзрывных работ
  - name: EAM / Assets
    description: Активы (техника, оборудование)
  - name: EAM / Maintenance
    description: Техобслуживание и ремонты активов
  - name: EAM / Movements
    description: Перемещения активов между объектами
  - name: EAM / Sagas
    description: Саги домена EAM (декомиссия, миграция)
  - name: EAM / refs / asset-classes
    description: Справочник классов активов
  - name: EAM / refs / fuel-consumption-norms
    description: Нормы расхода ДТ по активам
  - name: EAM / refs / maintenance-norms
    description: Нормы ТО по типам активов
  - name: Core / refs / production-objects
    description: Справочник production objects
  - name: Core / refs / tmc-categories
    description: Категории ТМЦ
  - name: Core / refs / downtime-categories
    description: Категории простоев
  - name: Core / refs / hse-incident-classifiers
    description: Классификаторы HSE-инцидентов
  - name: HR / refs / positions
    description: Справочник должностей
  - name: HR / refs / system-roles
    description: Системные роли (canonical PascalCase)
  - name: SCM / Fuel
    description: Резервуары ДТ, поставки, списания
  - name: SCM / Suppliers
    description: Справочник поставщиков
  - name: SCM / TMC
    description: Товарно-материальные ценности (склад, инвентаризация)
  - name: HR / Personnel
    description: Кадровый учёт персонала
  - name: HR / Brigades
    description: Бригады и состав
  - name: HR / Watches
    description: Вахты и смены
  - name: HR / Timesheet
    description: Табельный учёт рабочего времени
  - name: HR / Asset Assignments
    description: Закрепление активов за персоналом
  - name: HR / User Accounts
    description: Учётные записи (Keycloak ↔ Personnel)
servers:
  - url: http://localhost:3000
    description: Local dev
  - url: https://api.mineflow.local
    description: Production
components:
  securitySchemes:
    bearer:
      scheme: bearer
      bearerFormat: JWT
      type: http
  schemas:
    RefRegistryEntry_Output:
      type: object
      properties:
        module:
          type: string
          description: Код модуля-владельца
          example: core
        entity:
          type: string
          description: Имя сущности справочника
          example: production-objects
        displayName:
          type: string
          description: Человекочитаемое название
          example: Производственные объекты
        ownerModule:
          type: string
          description: Модуль, ответственный за данные
          example: core
        readPath:
          type: string
          description: Базовый путь API для чтения справочника
          example: /api/v1/core/refs/production-objects
      required:
        - module
        - entity
        - displayName
        - ownerModule
        - readPath
      title: Reference registry entry
      description: Запись discovery-реестра справочников (ADR-0014)
      example:
        module: core
        entity: production-objects
        displayName: Производственные объекты
        ownerModule: core
        readPath: /api/v1/core/refs/production-objects
      additionalProperties: false
      x-schema-id: RefRegistryEntry_Output
    ProblemDetailsDto:
      type: object
      properties:
        type:
          type: string
          format: uri
          description: URI типа ошибки (RFC 7807)
          example: https://mineflow.dev/errors/409
        title:
          type: string
          description: Краткое описание ошибки
          example: Asset already decommissioned
        status:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: HTTP status code
          example: 409
        instance:
          type: string
          description: URI запроса, вызвавшего ошибку
          example: /api/v1/eam/assets/11111111-1111-4111-8111-111111111111
        code:
          description: Доменный код ошибки MineFlow
          example: ASSET_ALREADY_DECOMMISSIONED
          type: string
        detail:
          description: Дополнительные детали (например violations)
      required:
        - type
        - title
        - status
        - instance
      title: Problem Details (RFC 7807)
      description: Стандартный формат ошибок HTTP API MineFlow (application/problem+json)
      example:
        type: https://mineflow.dev/errors/409
        title: Asset already decommissioned
        status: 409
        code: ASSET_ALREADY_DECOMMISSIONED
        instance: /api/v1/eam/assets/11111111-1111-4111-8111-111111111111
    LivenessResponseDto_Output:
      type: object
      properties:
        status:
          type: string
          const: ok
        service:
          type: string
        version:
          type: string
        at:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
      required:
        - status
        - service
        - version
        - at
      additionalProperties: false
    LivenessAliasResponseDto_Output:
      type: object
      properties:
        status:
          type: string
          const: ok
      required:
        - status
      additionalProperties: false
    ReadinessResponseDto_Output:
      type: object
      properties:
        status:
          type: string
          enum:
            - ok
            - error
            - shutting_down
        info:
          type: object
          propertyNames:
            type: string
          additionalProperties:
            type: object
            properties:
              status:
                type: string
                enum:
                  - up
                  - down
            required:
              - status
            additionalProperties: {}
        error:
          type: object
          propertyNames:
            type: string
          additionalProperties:
            type: object
            properties:
              status:
                type: string
                enum:
                  - up
                  - down
            required:
              - status
            additionalProperties: {}
        details:
          type: object
          propertyNames:
            type: string
          additionalProperties:
            type: object
            properties:
              status:
                type: string
                enum:
                  - up
                  - down
            required:
              - status
            additionalProperties: {}
      required:
        - status
        - details
      additionalProperties: false
    ProductionObjectResponse_Output:
      type: object
      properties:
        id:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID производственного объекта
          example: 11111111-1111-4111-8111-111111111111
        code:
          type: string
          description: Код объекта (бизнес-ключ)
          example: BORLY
        name:
          type: string
          description: Наименование объекта
          example: Участок Борлы
        region:
          anyOf:
            - type: string
            - type: 'null'
          description: Регион / местоположение
          example: Караганда
        active:
          type: boolean
          description: Признак активности
          example: true
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Дата создания (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
        updatedAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Дата последнего обновления (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
      required:
        - id
        - code
        - name
        - region
        - active
        - createdAt
        - updatedAt
      title: Production object response
      description: Производственный объект (core/refs/production-objects)
      example:
        id: 11111111-1111-4111-8111-111111111111
        code: BORLY
        name: Участок Борлы
        region: Караганда
        active: true
        createdAt: '2026-05-18T08:00:00.000Z'
        updatedAt: '2026-05-18T08:00:00.000Z'
      additionalProperties: false
      x-schema-id: ProductionObjectResponse_Output
    RefUpdateDto:
      type: object
      propertyNames:
        type: string
      additionalProperties: {}
      title: Reference update body
      description: >-
        Частичное обновление записи справочника; допустимые поля задаются
        updateSchema модуля-владельца (обязана быть .strict()). См. R11-DTO-F2.
      example:
        name: Новое наименование
        active: true
    BulkImportPreviewDto:
      type: object
      properties:
        rows:
          maxItems: 10000
          type: array
          items:
            type: object
            propertyNames:
              type: string
            additionalProperties: {}
          description: Строки импорта (поля зависят от справочника)
          example:
            - code: MECH
              name: Механик
              active: true
        mode:
          description: >-
            Режим импорта: merge — upsert по бизнес-ключу; full_replace —
            деактивация отсутствующих строк
          example: merge
          type: string
          enum:
            - merge
            - full_replace
      required:
        - rows
      title: Bulk import preview request
      description: Тело запроса preview bulk-импорта справочника (ADR-0015)
      example:
        rows:
          - code: MECH
            name: Механик
            active: true
        mode: merge
      additionalProperties: false
    RefImportDiff_Output:
      type: object
      properties:
        willCreate:
          type: array
          items: {}
          description: Строки, которые будут созданы
          example:
            - code: MECH
              name: Механик
              active: true
        willUpdate:
          type: array
          items:
            type: object
            properties:
              current:
                description: Текущее состояние записи в БД
              next:
                description: Состояние после применения импорта
            required:
              - current
              - next
            additionalProperties: false
          description: Строки, которые будут обновлены (current vs next)
          example:
            - current:
                code: MECH
                name: Механик (старое)
                active: true
              next:
                code: MECH
                name: Механик
                active: true
        willDeactivate:
          type: array
          items: {}
          description: Записи, которые будут деактивированы (режим full_replace)
          example:
            - code: LEGACY
              name: Устаревшая должность
              active: false
        errors:
          type: array
          items:
            type: object
            properties:
              rowNumber:
                type: integer
                minimum: -9007199254740991
                maximum: 9007199254740991
                description: Номер строки в исходном файле (1-based)
                example: 3
              field:
                description: Поле с ошибкой, если применимо
                example: code
                type: string
              message:
                type: string
                description: Текст ошибки валидации
                example: Дубликат кода MECH
            required:
              - rowNumber
              - message
            additionalProperties: false
          description: Ошибки валидации по строкам
          example:
            - rowNumber: 3
              field: code
              message: Дубликат кода MECH
      required:
        - willCreate
        - willUpdate
        - willDeactivate
        - errors
      additionalProperties: false
      title: Reference import diff
      description: Сводка изменений preview bulk-импорта
      example:
        willCreate:
          - code: MECH
            name: Механик
            active: true
        willUpdate:
          - current:
              code: MECH
              name: Механик (старое)
              active: true
            next:
              code: MECH
              name: Механик
              active: true
        willDeactivate:
          - code: LEGACY
            name: Устаревшая должность
            active: false
        errors:
          - rowNumber: 3
            field: code
            message: Дубликат кода MECH
      x-schema-id: RefImportDiff_Output
    RefImportPreviewResponse_Output:
      type: object
      properties:
        batchId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID batch'а для commit
          example: 11111111-1111-4111-8111-111111111111
        module:
          type: string
          description: Код модуля-владельца (core, eam, hr, scm, …)
          example: hr
        entity:
          type: string
          description: Имя сущности справочника (kebab-case)
          example: positions
        mode:
          type: string
          enum:
            - merge
            - full_replace
          description: Режим импорта, применённый при preview
          example: merge
        totalRows:
          type: integer
          minimum: 0
          maximum: 9007199254740991
          description: Количество строк в запросе
          example: 1
        diff:
          $ref: '#/components/schemas/RefImportDiff_Output'
        expiresAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Время истечения preview batch (ISO 8601)
          example: '2026-05-19T12:00:00.000Z'
      required:
        - batchId
        - module
        - entity
        - mode
        - totalRows
        - diff
        - expiresAt
      title: Reference import preview response
      description: Результат preview bulk-импорта справочника
      example:
        batchId: 22222222-2222-4222-8222-222222222222
        module: hr
        entity: positions
        mode: merge
        totalRows: 1
        diff:
          willCreate:
            - code: MECH
              name: Механик
              active: true
          willUpdate:
            - current:
                code: MECH
                name: Механик (старое)
                active: true
              next:
                code: MECH
                name: Механик
                active: true
          willDeactivate:
            - code: LEGACY
              name: Устаревшая должность
              active: false
          errors:
            - rowNumber: 3
              field: code
              message: Дубликат кода MECH
        expiresAt: '2026-05-18T08:00:00.000Z'
      additionalProperties: false
      x-schema-id: RefImportPreviewResponse_Output
    BulkImportCommitDto:
      type: object
      properties:
        batchId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID batch'а, полученный из ответа preview
          example: 11111111-1111-4111-8111-111111111111
      required:
        - batchId
      title: Bulk import commit request
      description: Подтверждение ранее провалидированного batch'а импорта
      example:
        batchId: 22222222-2222-4222-8222-222222222222
      additionalProperties: false
    RefImportCommitResponse_Output:
      type: object
      properties:
        batchId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID применённого batch'а
          example: 11111111-1111-4111-8111-111111111111
        status:
          type: string
          const: committed
          description: Статус применения
          example: committed
        applied:
          type: object
          properties:
            created:
              type: integer
              minimum: 0
              maximum: 9007199254740991
              description: Количество созданных записей
              example: 1
            updated:
              type: integer
              minimum: 0
              maximum: 9007199254740991
              description: Количество обновлённых записей
              example: 0
            deactivated:
              type: integer
              minimum: 0
              maximum: 9007199254740991
              description: Количество деактивированных записей
              example: 0
          additionalProperties: false
          description: Счётчики применённых изменений
          example:
            created: 1
            updated: 0
            deactivated: 0
        eventId:
          type: string
          description: Идентификатор доменного события импорта
          example: evt-import-001
      required:
        - batchId
        - status
        - applied
        - eventId
      title: Reference import commit response
      description: Результат commit bulk-импорта справочника
      example:
        batchId: 22222222-2222-4222-8222-222222222222
        status: committed
        applied:
          created: 1
          updated: 0
          deactivated: 0
        eventId: evt-import-001
      additionalProperties: false
      x-schema-id: RefImportCommitResponse_Output
    TmcCategoryResponse_Output:
      type: object
      properties:
        id:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID категории ТМЦ
          example: 11111111-1111-4111-8111-111111111111
        code:
          type: string
          description: Код категории
          example: FUEL
        name:
          type: string
          description: Наименование категории
          example: ГСМ
        parentId:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
          description: UUID родительской категории или null для корня
          example: null
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Дата создания (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
      required:
        - id
        - code
        - name
        - parentId
        - createdAt
      title: TMC category response
      description: Категория ТМЦ (иерархический справочник)
      example:
        id: 11111111-1111-4111-8111-111111111111
        code: FUEL
        name: ГСМ
        parentId: null
        createdAt: '2026-05-18T08:00:00.000Z'
      additionalProperties: false
      x-schema-id: TmcCategoryResponse_Output
    DowntimeCategoryResponse_Output:
      type: object
      properties:
        id:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID категории простоя
          example: 11111111-1111-4111-8111-111111111111
        code:
          type: string
          description: Код категории
          example: PLAN-TO
        name:
          type: string
          description: Наименование
          example: Плановое ТО
        group:
          type: string
          description: 'Группа: planned или unplanned'
          example: planned
        parentId:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
          description: UUID родительской категории или null
          example: null
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Дата создания (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
      required:
        - id
        - code
        - name
        - group
        - parentId
        - createdAt
      title: Downtime category response
      description: Категория простоя оборудования
      example:
        id: 11111111-1111-4111-8111-111111111111
        code: PLAN-TO
        name: Плановое ТО
        group: planned
        parentId: null
        createdAt: '2026-05-18T08:00:00.000Z'
      additionalProperties: false
      x-schema-id: DowntimeCategoryResponse_Output
    HseIncidentClassifierResponse_Output:
      type: object
      properties:
        id:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID классификатора
          example: 11111111-1111-4111-8111-111111111111
        code:
          type: string
          description: Код классификатора
          example: NEAR-MISS
        group:
          type: string
          description: Группа инцидента
          example: safety
        severity:
          type: string
          description: Уровень серьёзности
          example: low
        name:
          type: string
          description: Наименование
          example: Почти инцидент
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Дата создания (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
      required:
        - id
        - code
        - group
        - severity
        - name
        - createdAt
      title: HSE incident classifier response
      description: Классификатор инцидентов HSE
      example:
        id: 11111111-1111-4111-8111-111111111111
        code: NEAR-MISS
        group: safety
        severity: low
        name: Почти инцидент
        createdAt: '2026-05-18T08:00:00.000Z'
      additionalProperties: false
      x-schema-id: HseIncidentClassifierResponse_Output
    AssetClassResponse_Output:
      type: object
      properties:
        id:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID класса актива
          example: 11111111-1111-4111-8111-111111111111
        code:
          type: string
          description: Код класса (бизнес-ключ)
          example: DRILL
        name:
          type: string
          description: Наименование класса
          example: Буровая установка
        active:
          type: boolean
          description: Признак активности
          example: true
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Дата создания (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
      required:
        - id
        - code
        - name
        - active
        - createdAt
      title: Asset class response
      description: Класс актива EAM (eam/refs/asset-classes)
      example:
        id: 11111111-1111-4111-8111-111111111111
        code: DRILL
        name: Буровая установка
        active: true
        createdAt: '2026-05-18T08:00:00.000Z'
      additionalProperties: false
      x-schema-id: AssetClassResponse_Output
    NormResponse_Output:
      type: object
      properties:
        id:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID норматива
          example: 11111111-1111-4111-8111-111111111111
        assetClassCode:
          type: string
          description: Код класса актива
          example: DRILL
        norm:
          type: string
          description: Код норматива
          example: engine-oil-500h
        value:
          type: number
          description: Значение норматива
          example: 500
        unit:
          type: string
          description: Единица измерения
          example: hours
        validFrom:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Начало действия норматива
          example: '2026-01-01T00:00:00.000Z'
        validTo:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
            - type: 'null'
          description: Окончание действия или null
          example: null
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Дата создания записи
          example: '2026-01-01T00:00:00.000Z'
      required:
        - id
        - assetClassCode
        - norm
        - value
        - unit
        - validFrom
        - validTo
        - createdAt
      title: Norm response
      description: Temporal-норматив EAM
      example:
        id: 11111111-1111-4111-8111-111111111111
        assetClassCode: DRILL
        norm: engine-oil-500h
        value: 500
        unit: hours
        validFrom: '2026-01-01T00:00:00.000Z'
        validTo: null
        createdAt: '2026-01-01T00:00:00.000Z'
      additionalProperties: false
      x-schema-id: NormResponse_Output
    SystemRoleResponse_Output:
      type: object
      properties:
        id:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID системной роли
          example: 11111111-1111-4111-8111-111111111111
        code:
          type: string
          description: Код роли (бизнес-ключ, совпадает с SystemRole)
          example: Mechanic
        name:
          type: string
          description: Отображаемое имя роли
          example: Механик
        description:
          anyOf:
            - type: string
            - type: 'null'
          description: Описание назначения роли
          example: Обслуживание и ремонт техники на объекте
        permissions:
          type: array
          items:
            type: object
            propertyNames:
              type: string
            additionalProperties: {}
            description: Правило CASL (action, subject, conditions, …)
            example:
              action: read
              subject: Asset
          description: Массив правил CASL для RBAC
          example:
            - action: read
              subject: Asset
        scopeByObject:
          type: boolean
          description: Ограничивать доступ по производственному объекту
          example: true
        version:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: Версия конфигурации роли (инкремент при смене permissions)
          example: 1
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Дата создания (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
        updatedAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Дата последнего обновления (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
      required:
        - id
        - code
        - name
        - description
        - permissions
        - scopeByObject
        - version
        - createdAt
        - updatedAt
      title: System role response
      description: Системная роль с правами CASL (hr/refs/system-roles)
      example:
        id: 11111111-1111-4111-8111-111111111111
        code: Mechanic
        name: Механик
        description: Обслуживание и ремонт техники на объекте
        permissions:
          - action: read
            subject: Asset
        scopeByObject: true
        version: 1
        createdAt: '2026-05-18T08:00:00.000Z'
        updatedAt: '2026-05-18T08:00:00.000Z'
      additionalProperties: false
      x-schema-id: SystemRoleResponse_Output
    SimpleRefResponse_Output:
      type: object
      properties:
        id:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID записи справочника
          example: 11111111-1111-4111-8111-111111111111
        code:
          type: string
          description: Бизнес-код (уникальный ключ)
          example: MECH
        name:
          type: string
          description: Наименование
          example: Механик
        active:
          type: boolean
          description: Признак активности записи
          example: true
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Дата создания (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
      required:
        - id
        - code
        - name
        - active
        - createdAt
      title: Simple reference response
      description: Запись простого справочника (code + name + active)
      example:
        id: 11111111-1111-4111-8111-111111111111
        code: MECH
        name: Механик
        active: true
        createdAt: '2026-05-18T08:00:00.000Z'
      additionalProperties: false
      x-schema-id: SimpleRefResponse_Output
    AssetResponse_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID актива
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        inventoryNumber:
          type: string
          minLength: 1
          maxLength: 50
          description: >-
            Инвентарный номер актива (может отличаться от формата БС-001 для
            legacy-записей)
          example: БС-001
        name:
          type: string
          description: Наименование актива
          example: Atlas Copco DM45 №1
        assetClassId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID класса актива (asset_classes)
          example: 22222222-2222-4222-8222-222222222222
          format: uuid
        currentObjectId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID производственного объекта размещения
          example: 33333333-3333-4333-8333-333333333333
          format: uuid
        responsibleMechanicId:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: UUID ответственного механика (nullable)
              example: 44444444-4444-4444-8444-444444444444
              format: uuid
            - type: 'null'
        status:
          type: string
          enum:
            - operational
            - maintenance
            - conserved
            - decommissioned
          description: Статус FSM актива
          example: operational
        commissionedAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Дата ввода в эксплуатацию (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
        passport:
          $ref: '#/components/schemas/AssetPassport_Output'
      required:
        - id
        - inventoryNumber
        - name
        - assetClassId
        - currentObjectId
        - responsibleMechanicId
        - status
        - commissionedAt
        - passport
      title: Asset response
      description: Производственный актив
      example:
        id: 11111111-1111-4111-8111-111111111111
        inventoryNumber: БС-001
        name: Atlas Copco DM45 №1
        assetClassId: 22222222-2222-4222-8222-222222222222
        currentObjectId: 33333333-3333-4333-8333-333333333333
        responsibleMechanicId: 44444444-4444-4444-8444-444444444444
        status: operational
        commissionedAt: '2026-05-18T08:00:00.000Z'
        passport:
          manufacturer: Atlas Copco
          model: DM45
          productionYear: 2020
          specifications:
            engineHours: 12500
      additionalProperties: false
      x-schema-id: AssetResponse_Output
    AssetPassport_Output:
      type: object
      properties:
        manufacturer:
          type: string
          description: Производитель оборудования
          example: Atlas Copco
        model:
          type: string
          description: Модель оборудования
          example: DM45
        productionYear:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: Год выпуска (1980 — текущий год)
          example: 2020
        specifications:
          type: object
          propertyNames:
            type: string
          additionalProperties: {}
          description: Технические характеристики (json, зависит от класса актива)
          example:
            engineHours: 12500
      required:
        - manufacturer
        - model
        - productionYear
        - specifications
      additionalProperties: false
      title: Asset passport
      description: Паспортные данные производственного актива
      x-schema-id: AssetPassport_Output
    ListAssetsResponse_Output:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/AssetResponse_Output'
          description: Страница активов
        nextCursor:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
          description: Курсор следующей страницы или null
          example: null
      required:
        - items
        - nextCursor
      title: List assets response
      description: Курсорная страница списка активов
      example:
        items:
          - id: 11111111-1111-4111-8111-111111111111
            inventoryNumber: БС-001
            name: Atlas Copco DM45 №1
            assetClassId: 22222222-2222-4222-8222-222222222222
            currentObjectId: 33333333-3333-4333-8333-333333333333
            responsibleMechanicId: 44444444-4444-4444-8444-444444444444
            status: operational
            commissionedAt: '2026-05-18T08:00:00.000Z'
            passport:
              manufacturer: Atlas Copco
              model: DM45
              productionYear: 2020
              specifications:
                engineHours: 12500
        nextCursor: null
      additionalProperties: false
      x-schema-id: ListAssetsResponse_Output
    CreateAssetDtoAssetPassportInput:
      type: object
      properties:
        manufacturer:
          type: string
          minLength: 1
          maxLength: 100
          description: Производитель
          example: Atlas Copco
        model:
          type: string
          minLength: 1
          maxLength: 100
          description: Модель
          example: DM45
        productionYear:
          type: integer
          minimum: 1980
          maximum: 2026
          description: Год выпуска
          example: 2020
        specifications:
          type: object
          propertyNames:
            type: string
          additionalProperties: {}
          description: Технические характеристики (json)
          example:
            engineHours: 12500
      required:
        - manufacturer
        - model
        - productionYear
        - specifications
      title: Asset passport input
      description: Паспортные данные при создании актива
    CreateAssetDto:
      type: object
      properties:
        inventoryNumber:
          type: string
          minLength: 5
          maxLength: 20
          pattern: ^[А-ЯA-Z]{2,3}-\d{3,5}$
          description: Инвентарный номер актива (БС-001, КОМ-12345)
          example: БС-001
        name:
          type: string
          minLength: 2
          maxLength: 200
          description: Наименование актива
          example: Atlas Copco DM45 №1
        assetClassId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID класса актива
          example: 22222222-2222-4222-8222-222222222222
          format: uuid
        currentObjectId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID объекта размещения
          example: 33333333-3333-4333-8333-333333333333
          format: uuid
        responsibleMechanicId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID ответственного механика
          example: 44444444-4444-4444-8444-444444444444
          format: uuid
        commissionedAt:
          type: string
          format: date
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
          description: Дата ввода в эксплуатацию (не в будущем, EAM-INV-07)
          example: '2026-05-18'
        passport:
          $ref: '#/components/schemas/CreateAssetDtoAssetPassportInput'
      required:
        - inventoryNumber
        - name
        - assetClassId
        - currentObjectId
        - commissionedAt
        - passport
      title: Create asset request
      description: Создание нового производственного актива
      example:
        inventoryNumber: БС-001
        name: Atlas Copco DM45 №1
        assetClassId: 22222222-2222-4222-8222-222222222222
        currentObjectId: 33333333-3333-4333-8333-333333333333
        responsibleMechanicId: 44444444-4444-4444-8444-444444444444
        commissionedAt: '2026-05-18'
        passport:
          manufacturer: Atlas Copco
          model: DM45
          productionYear: 2020
          specifications:
            engineHours: 12500
      additionalProperties: false
    TransferAssetDto:
      type: object
      properties:
        toObjectId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID целевого производственного объекта
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        reason:
          description: Комментарий к операции (до 1000 символов)
          example: Плановое ТО по нормативу
          type: string
          maxLength: 1000
      required:
        - toObjectId
      title: Transfer asset request
      description: Перемещение актива на другой производственный объект
      example:
        toObjectId: 33333333-3333-4333-8333-333333333333
        reason: Перемещение на участок Борлы
      additionalProperties: false
    SendToMaintenanceDto:
      type: object
      properties:
        reason:
          type: string
          minLength: 2
          maxLength: 500
          description: Причина отправки в ТО
          example: Плановое ТО по моточасам
      required:
        - reason
      title: Send to maintenance request
      description: Перевод актива в статус maintenance
      example:
        reason: Плановое ТО по моточасам
      additionalProperties: false
    DecommissionAssetDto:
      type: object
      properties:
        coApprovedBy:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: string
              const: ''
          description: UUID второго согласующего (CEO/Engineer); пустая строка → 422
          example: 44444444-4444-4444-8444-444444444444
        reason:
          type: string
          minLength: 5
          maxLength: 1000
          description: Обоснование списания
          example: Списание по износу
      required:
        - coApprovedBy
        - reason
      title: Decommission asset request
      description: Списание актива (двойное согласование, EAM-INV-06)
      example:
        reason: Списание по износу
        coApprovedBy: 44444444-4444-4444-8444-444444444444
      additionalProperties: false
    MaintenanceRecordResponse_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID записи ТО
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        assetId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID актива
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        status:
          type: string
          enum:
            - scheduled
            - inProgress
            - completed
            - cancelled
          description: Статус FSM записи ТО
          example: scheduled
        scheduledAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Плановая дата и время ТО (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
        startedAt:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Фактическое начало ТО
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
        completedAt:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Фактическое завершение ТО
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
        cancelledAt:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Дата и время отмены
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
        cancelledBy:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: UUID пользователя, отменившего ТО
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        cancellationReason:
          anyOf:
            - type: string
            - type: 'null'
          description: Причина отмены или null
          example: null
        reason:
          type: string
          description: Причина / описание ТО
          example: Плановое ТО по моточасам
        performedBy:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID исполнителя (механик / инженер)
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
      required:
        - id
        - assetId
        - status
        - scheduledAt
        - startedAt
        - completedAt
        - cancelledAt
        - cancelledBy
        - cancellationReason
        - reason
        - performedBy
      title: Maintenance record response
      description: Запись технического обслуживания актива
      example:
        id: 11111111-1111-4111-8111-111111111111
        assetId: 22222222-2222-4222-8222-222222222222
        status: scheduled
        scheduledAt: '2026-05-18T08:00:00.000Z'
        startedAt: null
        completedAt: null
        cancelledAt: null
        cancelledBy: null
        cancellationReason: null
        reason: Плановое ТО по моточасам
        performedBy: 44444444-4444-4444-8444-444444444444
      additionalProperties: false
      x-schema-id: MaintenanceRecordResponse_Output
    ListMaintenanceResponse_Output:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/MaintenanceRecordResponse_Output'
          description: Страница записей ТО
        nextCursor:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
          description: Курсор следующей страницы или null
          example: null
      required:
        - items
        - nextCursor
      title: List maintenance response
      description: Курсорная страница списка записей ТО
      example:
        items:
          - id: 11111111-1111-4111-8111-111111111111
            assetId: 22222222-2222-4222-8222-222222222222
            status: scheduled
            scheduledAt: '2026-05-18T08:00:00.000Z'
            startedAt: null
            completedAt: null
            cancelledAt: null
            cancelledBy: null
            cancellationReason: null
            reason: Плановое ТО по моточасам
            performedBy: 44444444-4444-4444-8444-444444444444
        nextCursor: null
      additionalProperties: false
      x-schema-id: ListMaintenanceResponse_Output
    ScheduleMaintenanceDto:
      type: object
      properties:
        assetId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID актива для планового ТО
          example: 22222222-2222-4222-8222-222222222222
          format: uuid
        scheduledAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Плановая дата и время ТО (ISO 8601, не в прошлом)
          example: '2026-05-18T08:00:00.000Z'
        reason:
          type: string
          minLength: 2
          maxLength: 500
          description: Причина / описание планового ТО
          example: Плановое ТО по моточасам
      required:
        - assetId
        - scheduledAt
        - reason
      title: Schedule maintenance request
      description: Планирование технического обслуживания актива
      example:
        assetId: 22222222-2222-4222-8222-222222222222
        scheduledAt: '2026-05-18T08:00:00.000Z'
        reason: Плановое ТО по моточасам
      additionalProperties: false
    StartMaintenanceDto:
      type: object
      properties: {}
      additionalProperties: false
      title: Start maintenance request
      description: Начало ТО (пустое тело; идемпотентность по Idempotency-Key)
      example: {}
    CompleteMaintenanceDto:
      type: object
      properties:
        notes:
          description: Заметки по завершённому ТО (до 2000 символов)
          example: Замена масла и фильтров выполнена
          type: string
          maxLength: 2000
      title: Complete maintenance request
      description: Завершение ТО в статусе inProgress
      example:
        notes: Замена масла и фильтров выполнена
      additionalProperties: false
    CancelMaintenanceDto:
      type: object
      properties:
        reason:
          type: string
          minLength: 2
          maxLength: 500
          description: Причина отмены ТО
          example: Актив списан — ТО не требуется
      required:
        - reason
      title: Cancel maintenance request
      description: Отмена ТО (доступно из scheduled или inProgress)
      example:
        reason: Актив списан — ТО не требуется
      additionalProperties: false
    AssetMovementResponse_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID записи movement
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        assetId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID актива
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        op:
          type: string
          enum:
            - conservation
            - from_conservation
            - to_repair
            - from_repair
            - transfer_audit
          description: Тип операции
          example: conservation
        status:
          type: string
          enum:
            - draft
            - applied
            - failed
            - cancelled
          description: FSM-статус
          example: applied
        fromObjectId:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: UUID объекта-источника
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        toObjectId:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: UUID объекта-приёмника
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        opDate:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Дата операции (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
        responsibleId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID ответственного (механик/инженер)
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        reason:
          anyOf:
            - type: string
            - type: 'null'
          description: Причина / описание
          example: null
        relatedMaintenanceId:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: UUID связанной MaintenanceRecord
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        sourceEventId:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: UUID envelope исходного события (для transfer_audit)
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        appliedAt:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Когда операция применена
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
        failureReason:
          anyOf:
            - type: string
            - type: 'null'
          description: Причина отказа Asset FSM guard
          example: null
        cancelledAt:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Когда movement отменён
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
        cancelledBy:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: UUID пользователя, отменившего movement
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Когда запись создана
          example: '2026-05-18T08:00:00.000Z'
      required:
        - id
        - assetId
        - op
        - status
        - fromObjectId
        - toObjectId
        - opDate
        - responsibleId
        - reason
        - relatedMaintenanceId
        - sourceEventId
        - appliedAt
        - failureReason
        - cancelledAt
        - cancelledBy
        - createdAt
      title: Asset movement response
      description: Запись журнала перемещений / консервации / repair
      example:
        id: 11111111-1111-4111-8111-111111111111
        assetId: 22222222-2222-4222-8222-222222222222
        op: conservation
        status: applied
        fromObjectId: null
        toObjectId: null
        opDate: '2026-05-18T08:00:00.000Z'
        responsibleId: 44444444-4444-4444-8444-444444444444
        reason: Сезонная консервация — нерабочий период
        relatedMaintenanceId: null
        sourceEventId: null
        appliedAt: '2026-05-18T08:00:00.000Z'
        failureReason: null
        cancelledAt: null
        cancelledBy: null
        createdAt: '2026-05-18T08:00:00.000Z'
      additionalProperties: false
      x-schema-id: AssetMovementResponse_Output
    ListMovementsResponse_Output:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/AssetMovementResponse_Output'
          description: Страница записей movements
        nextCursor:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
          description: Курсор следующей страницы или null
          example: null
      required:
        - items
        - nextCursor
      title: List asset movements response
      description: Курсорная страница списка movements
      example:
        items:
          - id: 11111111-1111-4111-8111-111111111111
            assetId: 22222222-2222-4222-8222-222222222222
            op: conservation
            status: applied
            fromObjectId: null
            toObjectId: null
            opDate: '2026-05-18T08:00:00.000Z'
            responsibleId: 44444444-4444-4444-8444-444444444444
            reason: Сезонная консервация — нерабочий период
            relatedMaintenanceId: null
            sourceEventId: null
            appliedAt: '2026-05-18T08:00:00.000Z'
            failureReason: null
            cancelledAt: null
            cancelledBy: null
            createdAt: '2026-05-18T08:00:00.000Z'
        nextCursor: null
      additionalProperties: false
      x-schema-id: ListMovementsResponse_Output
    CreateAssetMovementDto:
      type: object
      properties:
        assetId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID актива
          example: 22222222-2222-4222-8222-222222222222
          format: uuid
        op:
          type: string
          enum:
            - conservation
            - from_conservation
            - to_repair
            - from_repair
          description: >-
            Операция: conservation | from_conservation | to_repair |
            from_repair. transfer_audit фиксируется автоматически.
          example: conservation
        reason:
          description: Причина — обязательна для conservation и to_repair
          example: Сезонная консервация
          type: string
          minLength: 2
          maxLength: 500
        opDate:
          description: Дата операции (ISO 8601). По умолчанию — now()
          example: '2026-05-18T08:00:00.000Z'
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
        relatedMaintenanceId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID связанной записи ТО (опционально)
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
      required:
        - assetId
        - op
      title: Create asset movement request
      description: Регистрация операции движения актива (консервация, ремонт, реактивация)
      example:
        assetId: 22222222-2222-4222-8222-222222222222
        op: conservation
        reason: Сезонная консервация — нерабочий период
        opDate: '2026-05-18T08:00:00.000Z'
      additionalProperties: false
    CancelAssetMovementDto:
      type: object
      properties:
        reason:
          description: Причина отмены (опционально, для аудита)
          example: Ошибочная регистрация — отменяем до применения
          type: string
          minLength: 2
          maxLength: 500
      title: Cancel asset movement request
      description: Отмена movement до применения (draft или failed)
      example:
        reason: Ошибочная регистрация — отменяем до применения
      additionalProperties: false
    DecommissionAssetSagaBodyDto:
      type: object
      properties:
        assetId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID актива для декомиссии
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        coApprovedBy:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID второго согласующего (CEO/Engineer)
          example: 44444444-4444-4444-8444-444444444444
          format: uuid
        reason:
          type: string
          minLength: 3
          maxLength: 500
          description: Обоснование списания актива
          example: Списание по износу
      required:
        - assetId
        - coApprovedBy
        - reason
      title: Decommission asset saga request
      description: Запуск reference-саги декомиссии актива (2 шага с компенсацией)
      example:
        assetId: 11111111-1111-4111-8111-111111111111
        coApprovedBy: 44444444-4444-4444-8444-444444444444
        reason: Списание по износу
      additionalProperties: false
    SagaEnqueued_Output:
      type: object
      properties:
        sagaId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID запущенной саги
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        status:
          type: string
          description: Итоговый статус саги (completed, failed, …)
          example: completed
        failedStep:
          type: string
          description: Имя шага при status=failed
        error:
          type: string
          description: Текст ошибки при status=failed
      required:
        - sagaId
        - status
      title: Saga enqueued response
      description: Результат запуска саги (HTTP 202)
      example:
        sagaId: 22222222-2222-4222-8222-222222222222
        status: enqueued
      additionalProperties: false
      x-schema-id: SagaEnqueued_Output
    PersonnelResponse_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID сотрудника
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        fullName:
          type: string
          description: ФИО сотрудника
          example: Иванов Иван Иванович
        tabNumber:
          type: string
          description: Табельный номер (уникальный бизнес-ключ)
          example: TAB-001
        birthDate:
          anyOf:
            - type: string
              format: date
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
              description: Дата рождения (ISO 8601, YYYY-MM-DD)
              example: '2026-05-28'
            - type: 'null'
        positionId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID должности из справочника
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        status:
          type: string
          enum:
            - active
            - onWatch
            - onVacation
            - terminated
          description: Статус FSM сотрудника
          example: active
        objectId:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: UUID производственного объекта
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        phone:
          anyOf:
            - type: string
            - type: 'null'
          description: Контактный телефон или null
          example: +7-700-000-0001
        email:
          anyOf:
            - type: string
            - type: 'null'
          description: Рабочий email или null
          example: ivanov@example.com
        hiredAt:
          type: string
          format: date
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
          description: Дата приёма на работу (ISO 8601, YYYY-MM-DD)
          example: '2026-05-28'
        terminatedAt:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Дата/время увольнения (ISO 8601) или null
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
      required:
        - id
        - fullName
        - tabNumber
        - birthDate
        - positionId
        - status
        - objectId
        - phone
        - email
        - hiredAt
        - terminatedAt
      title: Personnel response
      description: Карточка производственного сотрудника
      example:
        id: 11111111-1111-4111-8111-111111111111
        fullName: Иванов Иван Иванович
        tabNumber: TAB-001
        birthDate: '2026-05-18'
        positionId: 22222222-2222-4222-8222-222222222222
        status: active
        objectId: 33333333-3333-4333-8333-333333333333
        phone: +7-700-000-0001
        email: ivanov@example.com
        hiredAt: '2026-05-18'
        terminatedAt: null
      additionalProperties: false
      x-schema-id: PersonnelResponse_Output
    ListPersonnelResponse_Output:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/PersonnelResponse_Output'
          description: Страница сотрудников
        nextCursor:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
          description: Курсор следующей страницы или null
          example: null
      required:
        - items
        - nextCursor
      title: List personnel response
      description: Курсорная страница списка сотрудников
      example:
        items:
          - id: 11111111-1111-4111-8111-111111111111
            fullName: Иванов Иван Иванович
            tabNumber: TAB-001
            birthDate: '2026-05-18'
            positionId: 22222222-2222-4222-8222-222222222222
            status: active
            objectId: 33333333-3333-4333-8333-333333333333
            phone: +7-700-000-0001
            email: ivanov@example.com
            hiredAt: '2026-05-18'
            terminatedAt: null
        nextCursor: null
      additionalProperties: false
      x-schema-id: ListPersonnelResponse_Output
    CreatePersonnelDto:
      type: object
      properties:
        fullName:
          type: string
          minLength: 1
          maxLength: 200
          description: ФИО сотрудника
          example: Иванов Иван Иванович
        tabNumber:
          type: string
          minLength: 1
          maxLength: 50
          description: Табельный номер (уникальный бизнес-ключ)
          example: TAB-001
        birthDate:
          description: Дата рождения (ISO 8601, YYYY-MM-DD; диапазон 1900-01-01 … today)
          example: '2026-05-18'
          type: string
          format: date
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
        positionId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID должности из справочника
          example: 22222222-2222-4222-8222-222222222222
          format: uuid
        objectId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID производственного объекта
          example: 33333333-3333-4333-8333-333333333333
          format: uuid
        phone:
          description: Контактный телефон
          example: +7-700-000-0001
          type: string
          maxLength: 50
        email:
          description: Рабочий email
          example: ivanov@example.com
          type: string
          format: email
          pattern: >-
            ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$
        hiredAt:
          type: string
          format: date
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
          description: >-
            Дата приёма на работу (ISO 8601, YYYY-MM-DD; диапазон 1990-01-01 …
            today)
          example: '2026-05-18'
      required:
        - fullName
        - tabNumber
        - positionId
        - hiredAt
      title: Create personnel request
      description: Приём сотрудника на работу (HR 1.1)
      example:
        fullName: Иванов Иван Иванович
        tabNumber: TAB-001
        birthDate: '2026-05-18'
        positionId: 22222222-2222-4222-8222-222222222222
        objectId: 33333333-3333-4333-8333-333333333333
        phone: +7-700-000-0001
        email: ivanov@example.com
        hiredAt: '2026-05-18'
      additionalProperties: false
    TransferPersonnelDto:
      type: object
      properties:
        toObjectId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID целевого производственного объекта
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        effectiveFrom:
          description: >-
            Дата начала действия перевода (ISO 8601, YYYY-MM-DD); по умолчанию —
            сегодня
          example: '2026-05-18'
          type: string
          format: date
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
        reason:
          type: string
          minLength: 1
          maxLength: 1000
          description: Обоснование перевода (1–1000 символов)
          example: Перевод на участок Борлы по приказу № 42
      required:
        - toObjectId
        - reason
      title: Transfer personnel request
      description: Перевод сотрудника на другой производственный объект
      example:
        toObjectId: 33333333-3333-4333-8333-333333333333
        effectiveFrom: '2026-05-18'
        reason: Перевод на участок Борлы
      additionalProperties: false
    StartWatchDto:
      type: object
      properties:
        arrivalDate:
          description: Дата заезда на вахту (ISO 8601, YYYY-MM-DD); по умолчанию — сегодня
          example: '2026-05-18'
          type: string
          format: date
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
      title: Start watch request
      description: Перевод сотрудника в статус «на вахте»
      example:
        arrivalDate: '2026-05-18'
      additionalProperties: false
    StartVacationDto:
      type: object
      properties:
        expectedReturnDate:
          description: Ожидаемая дата возвращения с отпуска (ISO 8601, YYYY-MM-DD)
          example: '2026-06-15'
          type: string
          format: date
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
      title: Start vacation request
      description: Перевод сотрудника в статус «в отпуске»
      example:
        expectedReturnDate: '2026-06-15'
      additionalProperties: false
    TerminatePersonnelDto:
      type: object
      properties:
        reason:
          type: string
          minLength: 1
          maxLength: 500
          description: Причина увольнения
          example: Увольнение по собственному желанию
        terminatedAt:
          description: Дата увольнения (ISO 8601, YYYY-MM-DD); по умолчанию — сегодня
          example: '2026-05-18'
          type: string
          format: date
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
        force:
          description: Пропустить проверку открытых assignments (HR-INV-05)
          example: false
          type: boolean
      required:
        - reason
      title: Terminate personnel request
      description: Увольнение / деактивация сотрудника (HR 1.6)
      example:
        reason: Увольнение по собственному желанию
        terminatedAt: '2026-05-18'
        force: false
      additionalProperties: false
    UserAccountResponse_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID учётной записи
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        personnelId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID Personnel из hr/personnel
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        systemRoleIds:
          type: array
          minItems: 1
          items:
            type: string
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            description: UUID system_role
            example: 11111111-1111-4111-8111-111111111111
            format: uuid
          description: Массив текущих ролей пользователя (HR 6.1.2 — совмещение)
        login:
          type: string
          description: Логин (= keycloak username)
          example: ivanov
        keycloakSubject:
          anyOf:
            - type: string
            - type: 'null'
          description: UUID из Keycloak (JWT sub) или null до провизии
          example: null
        status:
          type: string
          enum:
            - active
            - locked
            - deactivated
          description: Статус FSM учётки
          example: active
        lastLoginAt:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Время последнего входа
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
        failedLoginCount:
          type: integer
          minimum: 0
          maximum: 9007199254740991
          description: Счётчик неудачных попыток входа
          example: 0
        lockedUntil:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Авто-разблокировка после или null
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
        deactivatedAt:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Время деактивации или null
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
        deactivationReason:
          anyOf:
            - type: string
            - type: 'null'
          description: Причина деактивации или null
          example: null
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Создана
          example: '2026-05-18T08:00:00.000Z'
        createdBy:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID admin, создавшего учётку
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
      required:
        - id
        - personnelId
        - systemRoleIds
        - login
        - keycloakSubject
        - status
        - lastLoginAt
        - failedLoginCount
        - lockedUntil
        - deactivatedAt
        - deactivationReason
        - createdAt
        - createdBy
      title: User account response
      description: Карточка учётной записи
      additionalProperties: false
      x-schema-id: UserAccountResponse_Output
    ListUserAccountsResponse_Output:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/UserAccountResponse_Output'
          description: Страница учётных записей
        nextCursor:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
          description: UUID последнего элемента или null если страница последняя
          example: null
      required:
        - items
        - nextCursor
      title: List user accounts response
      description: Курсорная страница учётных записей
      additionalProperties: false
      x-schema-id: ListUserAccountsResponse_Output
    CreateUserAccountDto:
      type: object
      properties:
        personnelId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID Personnel из hr/personnel
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        login:
          type: string
          minLength: 3
          maxLength: 50
          pattern: ^[a-z][a-z0-9._-]*$
          description: Уникальный login (= keycloak username)
          example: ivanov
        systemRoleIds:
          minItems: 1
          type: array
          items:
            type: string
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            description: UUID system_role
            example: 11111111-1111-4111-8111-111111111111
            format: uuid
          description: >-
            Начальный набор ролей. Обычно одна (Position.system_role_id); для
            совмещения — несколько (HR 6.1.2; HR-UA-INV-15).
        initialPassword:
          description: >-
            Если не задан/null — генерируется Keycloak и отправляется через
            password-reset flow. Минимум 12 символов, lower + upper + digit
            (когда задан). Сейчас не wired в use-case (R11-DTO-F1) — оставлено
            для будущей Keycloak Admin API интеграции.
          example: null
          anyOf:
            - type: string
              minLength: 12
              maxLength: 128
              pattern: ^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).*$
            - type: 'null'
      required:
        - personnelId
        - login
        - systemRoleIds
      title: Create user account request
      description: Создание учётной записи (HR 1.6)
      additionalProperties: false
    UpdateUserAccountRolesDto:
      type: object
      properties:
        systemRoleIds:
          minItems: 1
          type: array
          items:
            type: string
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            description: UUID system_role
            example: 11111111-1111-4111-8111-111111111111
            format: uuid
          description: >-
            Новый полный набор ролей (replace, не patch). Должен быть валидной
            комбинацией (HR-UA-INV-15).
        reason:
          type: string
          minLength: 1
          maxLength: 500
          description: Обязательная причина — попадает в security_audit_log (HR 1.6)
          example: Повышение после аттестации
      required:
        - systemRoleIds
        - reason
      title: Update user account roles
      description: Изменение набора ролей одним PATCH-действием (без двойного согласования)
      additionalProperties: false
    DeactivateUserAccountDto:
      type: object
      properties:
        reason:
          type: string
          minLength: 1
          maxLength: 500
          description: Обязательно — попадает в security_audit_log (HR 1.6, HR-UA-INV-05)
          example: Увольнение
      required:
        - reason
      title: Deactivate user account
      description: Перевод учётки в terminal состояние deactivated
      additionalProperties: false
    LockUserAccountDto:
      type: object
      properties:
        reason:
          type: string
          minLength: 1
          maxLength: 500
          description: Причина блокировки — попадает в security_audit_log
          example: Расследование инцидента безопасности
        lockedUntil:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Авто-разблокировка после; null = ручная (admin)
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
      required:
        - reason
      title: Lock user account
      description: Принудительная блокировка active → locked
      additionalProperties: false
    PasswordResetResponse_Output:
      type: object
      properties:
        resetToken:
          type: string
          description: One-time token из Keycloak; передаётся пользователю для смены пароля
          example: kc-reset-xyz
        expiresAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Срок действия токена
          example: '2026-05-18T08:00:00.000Z'
        deliveryChannel:
          type: string
          enum:
            - email
            - sms
            - admin_display
          description: Канал доставки временного пароля
          example: admin_display
      required:
        - resetToken
        - expiresAt
        - deliveryChannel
      title: Password reset response
      description: Результат сброса пароля admin'ом (HR 1.6)
      additionalProperties: false
      x-schema-id: PasswordResetResponse_Output
    BrigadeResponse_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID бригады
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        name:
          type: string
          description: Название бригады
          example: Бригада-Борлы-1
        objectId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID производственного объекта
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        workType:
          type: string
          enum:
            - drilling
            - blasting
            - auxiliary
          description: Тип работ бригады
          example: drilling
        brigadierId:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: UUID бригадира (Personnel) или null
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        isActive:
          type: boolean
          description: Активна ли бригада (true) или расформирована (false)
          example: true
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Дата создания (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
      required:
        - id
        - name
        - objectId
        - workType
        - brigadierId
        - isActive
        - createdAt
      title: Brigade response
      description: Карточка производственной бригады
      example:
        id: 11111111-1111-4111-8111-111111111111
        name: Бригада-Борлы-1
        objectId: 33333333-3333-4333-8333-333333333333
        workType: drilling
        brigadierId: 22222222-2222-4222-8222-222222222222
        isActive: true
        createdAt: '2026-05-18T08:00:00.000Z'
      additionalProperties: false
      x-schema-id: BrigadeResponse_Output
    ListBrigadesResponse_Output:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/BrigadeResponse_Output'
          description: Страница бригад
        nextCursor:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
          description: Курсор следующей страницы или null
          example: null
      required:
        - items
        - nextCursor
      title: List brigades response
      description: Курсорная страница списка бригад
      additionalProperties: false
      x-schema-id: ListBrigadesResponse_Output
    BrigadeMembershipResponseDto:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID membership
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        brigadeId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID бригады
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        personnelId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID сотрудника
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        fromDate:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Дата начала членства (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
        toDate:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Дата окончания членства (ISO 8601) или null (активное)
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
      required:
        - id
        - brigadeId
        - personnelId
        - fromDate
        - toDate
      title: Brigade membership response
      description: Запись о членстве сотрудника в бригаде с историей
      example:
        id: 11111111-1111-4111-8111-111111111111
        brigadeId: 11111111-1111-4111-8111-111111111111
        personnelId: 22222222-2222-4222-8222-222222222222
        fromDate: '2026-05-18T08:00:00.000Z'
        toDate: null
      additionalProperties: false
    CreateBrigadeDto:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 200
          description: Название бригады
          example: Бригада-Борлы-1
        objectId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID производственного объекта
          example: 33333333-3333-4333-8333-333333333333
          format: uuid
        workType:
          type: string
          enum:
            - drilling
            - blasting
            - auxiliary
          description: Тип работ бригады
          example: drilling
        brigadierId:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: UUID бригадира (Personnel)
              example: 22222222-2222-4222-8222-222222222222
              format: uuid
            - type: 'null'
      required:
        - name
        - objectId
        - workType
      title: Create brigade request
      description: Создание новой производственной бригады (HR 1.2)
      example:
        name: Бригада-Борлы-1
        objectId: 33333333-3333-4333-8333-333333333333
        workType: drilling
        brigadierId: 22222222-2222-4222-8222-222222222222
      additionalProperties: false
    UpdateBrigadeDto:
      type: object
      properties:
        name:
          description: Новое название бригады
          example: Бригада-Борлы-1 (переименована)
          type: string
          minLength: 1
          maxLength: 200
        workType:
          description: Новый тип работ
          example: drilling
          type: string
          enum:
            - drilling
            - blasting
            - auxiliary
        brigadierId:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: UUID нового бригадира или null для снятия
              example: 22222222-2222-4222-8222-222222222222
              format: uuid
            - type: 'null'
      title: Update brigade request
      description: Частичное обновление бригады (HR 1.2)
      example:
        name: Бригада-Борлы-1
        workType: drilling
        brigadierId: 22222222-2222-4222-8222-222222222222
      additionalProperties: false
    DeactivateBrigadeDto:
      type: object
      properties:
        reason:
          description: Комментарий к операции (до 1000 символов)
          example: Плановое ТО по нормативу
          type: string
          maxLength: 1000
      title: Deactivate brigade request
      description: Расформирование бригады с закрытием состава (HR 1.2)
      example:
        reason: Окончание буровых работ на участке
      additionalProperties: false
    ReactivateBrigadeDto:
      type: object
      properties:
        reason:
          description: Комментарий к операции (до 1000 символов)
          example: Плановое ТО по нормативу
          type: string
          maxLength: 1000
      title: Reactivate brigade request
      description: Восстановление расформированной бригады (HR 1.2)
      example:
        reason: Возобновление работ на участке
      additionalProperties: false
    AddMemberDto:
      type: object
      properties:
        personnelId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID сотрудника
          example: 22222222-2222-4222-8222-222222222222
          format: uuid
        fromDate:
          description: Дата начала членства (ISO 8601, YYYY-MM-DD); по умолчанию — сегодня
          example: '2026-05-18'
          type: string
          format: date
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
      required:
        - personnelId
      title: Add brigade member request
      description: Добавление сотрудника в бригаду (HR 1.2)
      example:
        personnelId: 22222222-2222-4222-8222-222222222222
        fromDate: '2026-05-18'
      additionalProperties: false
    BrigadeMembershipResponse_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID membership
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        brigadeId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID бригады
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        personnelId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID сотрудника
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        fromDate:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Дата начала членства (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
        toDate:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Дата окончания членства (ISO 8601) или null (активное)
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
      required:
        - id
        - brigadeId
        - personnelId
        - fromDate
        - toDate
      title: Brigade membership response
      description: Запись о членстве сотрудника в бригаде с историей
      example:
        id: 11111111-1111-4111-8111-111111111111
        brigadeId: 11111111-1111-4111-8111-111111111111
        personnelId: 22222222-2222-4222-8222-222222222222
        fromDate: '2026-05-18T08:00:00.000Z'
        toDate: null
      additionalProperties: false
      x-schema-id: BrigadeMembershipResponse_Output
    RemoveMemberDto:
      type: object
      properties:
        toDate:
          description: >-
            Дата окончания членства (ISO 8601, YYYY-MM-DD); по умолчанию —
            сегодня
          example: '2026-05-18'
          type: string
          format: date
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
      title: Remove brigade member request
      description: Исключение сотрудника из бригады (HR 1.2)
      example:
        toDate: '2026-05-18'
      additionalProperties: false
    AssetAssignmentResponse_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID закрепления
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        assetId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID актива
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        personnelId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID сотрудника
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        role:
          type: string
          enum:
            - primary_operator
            - shift_operator
            - mechanic
          description: Роль закрепления
          example: primary_operator
        fromDate:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Дата начала закрепления (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
        toDate:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Дата закрытия (ISO 8601) или null если active
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
        assignedBy:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID пользователя, выполнившего закрепление
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        reason:
          anyOf:
            - type: string
            - type: 'null'
          description: Основание закрепления или null
          example: Плановая ротация смены
        closedBy:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: UUID пользователя, закрывшего закрепление
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        closeReason:
          anyOf:
            - type: string
            - type: 'null'
          description: Основание закрытия или null
          example: null
        closeCause:
          anyOf:
            - type: string
              enum:
                - manual
                - asset-decommissioned
                - personnel-deactivated
                - replaced
            - type: 'null'
          description: Причина закрытия закрепления или null
          example: null
        isActive:
          type: boolean
          description: true — закрепление активно (toDate IS NULL)
          example: true
      required:
        - id
        - assetId
        - personnelId
        - role
        - fromDate
        - toDate
        - assignedBy
        - reason
        - closedBy
        - closeReason
        - closeCause
        - isActive
      title: Asset assignment response
      description: Карточка закрепления сотрудника на технику
      additionalProperties: false
      x-schema-id: AssetAssignmentResponse_Output
    ListAssetAssignmentsResponse_Output:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/AssetAssignmentResponse_Output'
          description: Страница закреплений
        nextCursor:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
          description: Курсор следующей страницы или null
          example: null
      required:
        - items
        - nextCursor
      title: List asset assignments response
      description: Курсорная страница списка закреплений
      additionalProperties: false
      x-schema-id: ListAssetAssignmentsResponse_Output
    CreateAssetAssignmentDto:
      type: object
      properties:
        assetId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID актива (техники)
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        personnelId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID сотрудника
          example: 22222222-2222-4222-8222-222222222222
          format: uuid
        role:
          type: string
          enum:
            - primary_operator
            - shift_operator
            - mechanic
          description: Роль закрепления
          example: primary_operator
        fromDate:
          type: string
          format: date
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
          description: Дата начала закрепления (ISO 8601, YYYY-MM-DD)
          example: '2026-05-18'
        reason:
          description: Основание закрепления (опционально)
          example: Плановая ротация смены
          type: string
          minLength: 1
          maxLength: 500
      required:
        - assetId
        - personnelId
        - role
        - fromDate
      title: Create asset assignment request
      description: Закрепить сотрудника на технику (HR 1.4)
      additionalProperties: false
    CloseAssetAssignmentDto:
      type: object
      properties:
        toDate:
          description: Дата закрытия закрепления (ISO 8601); по умолчанию — сегодня
          example: '2026-05-18'
          type: string
          format: date
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
        reason:
          description: Основание закрытия (опционально)
          example: Перевод на другой объект
          type: string
          minLength: 1
          maxLength: 500
      title: Close asset assignment request
      description: Закрыть активное закрепление (HR 1.4)
      additionalProperties: false
    WatchResponse_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID вахты
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        objectId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID производственного объекта
          example: 33333333-3333-4333-8333-333333333333
          format: uuid
        startDate:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Дата начала вахты (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
        endDate:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Дата окончания вахты (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Дата создания записи (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
        createdBy:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID автора (actorId)
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
      required:
        - id
        - objectId
        - startDate
        - endDate
        - createdAt
        - createdBy
      title: Watch response
      description: Карточка вахтового цикла
      example:
        id: 11111111-1111-4111-8111-111111111111
        objectId: 33333333-3333-4333-8333-333333333333
        startDate: '2026-05-18T08:00:00.000Z'
        endDate: '2026-05-18T08:00:00.000Z'
        createdAt: '2026-05-18T08:00:00.000Z'
        createdBy: 11111111-1111-4111-8111-111111111111
      additionalProperties: false
      x-schema-id: WatchResponse_Output
    ListWatchesResponse_Output:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/WatchResponse_Output'
          description: Страница вахт
        nextCursor:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
          description: Курсор следующей страницы или null
          example: null
      required:
        - items
        - nextCursor
      title: List watches response
      description: Курсорная страница списка вахт
      example:
        items:
          - id: 11111111-1111-4111-8111-111111111111
            objectId: 33333333-3333-4333-8333-333333333333
            startDate: '2026-05-18T08:00:00.000Z'
            endDate: '2026-05-18T08:00:00.000Z'
            createdAt: '2026-05-18T08:00:00.000Z'
            createdBy: 11111111-1111-4111-8111-111111111111
        nextCursor: null
      additionalProperties: false
      x-schema-id: ListWatchesResponse_Output
    CreateWatchDto:
      type: object
      properties:
        objectId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID производственного объекта
          example: 33333333-3333-4333-8333-333333333333
          format: uuid
        startDate:
          type: string
          format: date
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
          description: Дата начала вахты (ISO 8601, YYYY-MM-DD)
          example: '2026-06-01'
        endDate:
          type: string
          format: date
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
          description: Дата окончания вахты (ISO 8601, YYYY-MM-DD)
          example: '2026-06-15'
        force:
          description: admin override 3-дневного планирования (Q-WCH-1)
          example: false
          type: boolean
      required:
        - objectId
        - startDate
        - endDate
      title: Create watch request
      description: Создание вахты на производственном объекте (HR 1.3)
      example:
        objectId: 33333333-3333-4333-8333-333333333333
        startDate: '2026-06-01'
        endDate: '2026-06-15'
        force: false
      additionalProperties: false
    ScheduleWatchAssignmentDto:
      type: object
      properties:
        personnelId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID сотрудника
          example: 22222222-2222-4222-8222-222222222222
          format: uuid
        arrivalDate:
          type: string
          format: date
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
          description: Плановая дата заезда (ISO 8601, YYYY-MM-DD)
          example: '2026-06-01'
        departureDate:
          type: string
          format: date
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
          description: Плановая дата отъезда (ISO 8601, YYYY-MM-DD)
          example: '2026-06-15'
      required:
        - personnelId
        - arrivalDate
        - departureDate
      title: Schedule watch assignment request
      description: Включение сотрудника в вахту (HR 1.3)
      example:
        personnelId: 22222222-2222-4222-8222-222222222222
        arrivalDate: '2026-06-01'
        departureDate: '2026-06-15'
      additionalProperties: false
    WatchAssignmentResponse_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID назначения на вахту
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        watchId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID родительской вахты
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        personnelId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID сотрудника
          example: 22222222-2222-4222-8222-222222222222
          format: uuid
        arrivalDate:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Плановая дата заезда (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
        departureDate:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Плановая дата отъезда (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
        status:
          type: string
          enum:
            - scheduled
            - active
            - completed
            - cancelled
          description: Статус FSM назначения
          example: scheduled
        cancelledAt:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Дата отмены (ISO 8601) или null
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
        cancelReason:
          anyOf:
            - type: string
            - type: 'null'
          description: Причина отмены или null
          example: null
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Дата создания (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
        createdBy:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID автора (actorId)
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
      required:
        - id
        - watchId
        - personnelId
        - arrivalDate
        - departureDate
        - status
        - cancelledAt
        - cancelReason
        - createdAt
        - createdBy
      title: Watch assignment response
      description: Карточка назначения сотрудника на вахту
      example:
        id: 11111111-1111-4111-8111-111111111111
        watchId: 11111111-1111-4111-8111-111111111111
        personnelId: 22222222-2222-4222-8222-222222222222
        arrivalDate: '2026-05-18T08:00:00.000Z'
        departureDate: '2026-05-18T08:00:00.000Z'
        status: scheduled
        cancelledAt: null
        cancelReason: null
        createdAt: '2026-05-18T08:00:00.000Z'
        createdBy: 11111111-1111-4111-8111-111111111111
      additionalProperties: false
      x-schema-id: WatchAssignmentResponse_Output
    DepartWatchAssignmentDto:
      type: object
      properties:
        departureDate:
          description: >-
            Фактическая дата отъезда (ISO 8601, YYYY-MM-DD); по умолчанию —
            плановая departureDate
          example: '2026-06-15'
          type: string
          format: date
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
      title: Depart watch assignment request
      description: Отъезд с вахты (FSM active → completed)
      example:
        departureDate: '2026-06-15'
      additionalProperties: false
    CancelWatchAssignmentDto:
      type: object
      properties:
        reason:
          description: Комментарий к операции (до 1000 символов)
          example: Плановое ТО по нормативу
          type: string
          maxLength: 1000
      title: Cancel watch assignment request
      description: Отмена включения сотрудника в вахту (FSM scheduled → cancelled)
      example:
        reason: Сотрудник заболел до заезда
      additionalProperties: false
    ShiftResponse_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID смены
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        watchId:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: UUID родительской вахты
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        objectId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID производственного объекта
          example: 33333333-3333-4333-8333-333333333333
          format: uuid
        shiftDate:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Дата смены (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
        shiftType:
          type: string
          enum:
            - day
            - night
          description: Тип смены (day / night)
          example: day
        durationHours:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: Длительность смены в часах (всегда 11, HR-WCH-INV-06)
          example: 11
        foremanId:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: UUID мастера смены (если назначен)
              example: 22222222-2222-4222-8222-222222222222
              format: uuid
            - type: 'null'
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Дата создания (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
        createdBy:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID автора (actorId)
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        substitutions:
          type: array
          items:
            $ref: '#/components/schemas/ShiftSubstitutionEntry_Output'
          description: >-
            Зарегистрированные замены/подмены в смене (отсортированы по
            registeredAt)
          example: []
      required:
        - id
        - watchId
        - objectId
        - shiftDate
        - shiftType
        - durationHours
        - foremanId
        - createdAt
        - createdBy
        - substitutions
      title: Shift response
      description: Карточка 11-часовой смены
      example:
        id: 11111111-1111-4111-8111-111111111111
        watchId: 11111111-1111-4111-8111-111111111111
        objectId: 33333333-3333-4333-8333-333333333333
        shiftDate: '2026-05-18T08:00:00.000Z'
        shiftType: day
        durationHours: 11
        foremanId: 22222222-2222-4222-8222-222222222222
        createdAt: '2026-05-18T08:00:00.000Z'
        createdBy: 11111111-1111-4111-8111-111111111111
        substitutions: []
      additionalProperties: false
      x-schema-id: ShiftResponse_Output
    ShiftSubstitutionEntry_Output:
      type: object
      properties:
        replacedPersonnelId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID заменяемого сотрудника
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        substitutePersonnelId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID подменяющего сотрудника
          example: 22222222-2222-4222-8222-222222222222
          format: uuid
        reason:
          anyOf:
            - type: string
              maxLength: 1000
            - type: 'null'
          description: Обоснование замены (до 1000 символов)
          example: null
      required:
        - replacedPersonnelId
        - substitutePersonnelId
        - reason
      additionalProperties: false
      title: Shift substitution entry
      description: Запись о замене/подмене внутри смены
      x-schema-id: ShiftSubstitutionEntry_Output
    ListShiftsResponse_Output:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/ShiftResponse_Output'
          description: Страница смен
        nextCursor:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
          description: Курсор следующей страницы или null
          example: null
      required:
        - items
        - nextCursor
      title: List shifts response
      description: Курсорная страница списка смен
      example:
        items:
          - id: 11111111-1111-4111-8111-111111111111
            watchId: 11111111-1111-4111-8111-111111111111
            objectId: 33333333-3333-4333-8333-333333333333
            shiftDate: '2026-05-18T08:00:00.000Z'
            shiftType: day
            durationHours: 11
            foremanId: 22222222-2222-4222-8222-222222222222
            createdAt: '2026-05-18T08:00:00.000Z'
            createdBy: 11111111-1111-4111-8111-111111111111
            substitutions: []
        nextCursor: null
      additionalProperties: false
      x-schema-id: ListShiftsResponse_Output
    CreateShiftDto:
      type: object
      properties:
        watchId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID родительской вахты (опционально)
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        objectId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID производственного объекта
          example: 33333333-3333-4333-8333-333333333333
          format: uuid
        shiftDate:
          type: string
          format: date
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
          description: Дата смены (ISO 8601, YYYY-MM-DD)
          example: '2026-06-01'
        shiftType:
          type: string
          enum:
            - day
            - night
          description: Тип смены (day / night)
          example: day
        foremanId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID мастера смены (опционально)
          example: 22222222-2222-4222-8222-222222222222
          format: uuid
      required:
        - objectId
        - shiftDate
        - shiftType
      title: Create shift request
      description: Создание 11-часовой смены (HR 1.3)
      example:
        watchId: 11111111-1111-4111-8111-111111111111
        objectId: 33333333-3333-4333-8333-333333333333
        shiftDate: '2026-06-01'
        shiftType: day
        foremanId: 22222222-2222-4222-8222-222222222222
      additionalProperties: false
    AssignShiftForemanDto:
      type: object
      properties:
        foremanId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID нового мастера смены
          example: 22222222-2222-4222-8222-222222222222
          format: uuid
      required:
        - foremanId
      title: Assign shift foreman request
      description: Назначение мастера смены (HR 1.3)
      example:
        foremanId: 22222222-2222-4222-8222-222222222222
      additionalProperties: false
    RegisterShiftSubstitutionDto:
      type: object
      properties:
        replacedPersonnelId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID заменяемого сотрудника
          example: 22222222-2222-4222-8222-222222222222
          format: uuid
        substitutePersonnelId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID подменяющего сотрудника
          example: 22222222-2222-4222-8222-222222222222
          format: uuid
        reason:
          description: Комментарий к операции (до 1000 символов)
          example: Плановое ТО по нормативу
          type: string
          maxLength: 1000
      required:
        - replacedPersonnelId
        - substitutePersonnelId
      title: Register shift substitution request
      description: Регистрация замены/подмены в смене (HR 1.3)
      example:
        replacedPersonnelId: 22222222-2222-4222-8222-222222222222
        substitutePersonnelId: 22222222-2222-4222-8222-222222222222
        reason: Заболел в день смены
      additionalProperties: false
    TimesheetEntryResponse_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID записи табеля
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        shiftId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID смены
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        personnelId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID сотрудника
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        hoursWorked:
          type: number
          minimum: 0
          maximum: 11
          description: Отработанные часы (0–11)
          example: 10
        downtimeHours:
          type: number
          minimum: 0
          maximum: 11
          description: Часы простоя (0–11)
          example: 1
        status:
          type: string
          enum:
            - draft
            - confirmed
            - adjusted
            - reverted
          description: Статус FSM записи табеля
          example: confirmed
        confirmedFromShiftReport:
          type: boolean
          description: true — запись подтверждена автоматически из shift-report.approved
          example: true
        shiftReportId:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: UUID сменного отчёта или null
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        adjustmentReason:
          anyOf:
            - type: string
            - type: 'null'
          description: Причина ручной корректировки или null
          example: уточнение данных по согласованию инженера
        adjustedBy:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: UUID автора корректировки или null
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        adjustedAt:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Время последней корректировки (ISO 8601)
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
      required:
        - id
        - shiftId
        - personnelId
        - hoursWorked
        - downtimeHours
        - status
        - confirmedFromShiftReport
        - shiftReportId
        - adjustmentReason
        - adjustedBy
        - adjustedAt
      title: TimesheetEntry response
      description: Запись табеля рабочего времени
      example:
        id: 11111111-1111-4111-8111-111111111111
        shiftId: 22222222-2222-4222-8222-222222222222
        personnelId: 33333333-3333-4333-8333-333333333333
        hoursWorked: 10
        downtimeHours: 1
        status: confirmed
        confirmedFromShiftReport: true
        shiftReportId: 11111111-1111-4111-8111-111111111111
        adjustmentReason: null
        adjustedBy: null
        adjustedAt: null
      additionalProperties: false
      x-schema-id: TimesheetEntryResponse_Output
    ListTimesheetResponse_Output:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/TimesheetEntryResponse_Output'
          description: Страница записей табеля
        nextCursor:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
          description: UUID следующей страницы или null, если страница последняя
          example: null
      required:
        - items
        - nextCursor
      title: List timesheet response
      description: Курсорная страница табеля за период
      example:
        items:
          - id: 11111111-1111-4111-8111-111111111111
            shiftId: 22222222-2222-4222-8222-222222222222
            personnelId: 33333333-3333-4333-8333-333333333333
            hoursWorked: 10
            downtimeHours: 1
            status: confirmed
            confirmedFromShiftReport: true
            shiftReportId: 11111111-1111-4111-8111-111111111111
            adjustmentReason: null
            adjustedBy: null
            adjustedAt: null
        nextCursor: null
      additionalProperties: false
      x-schema-id: ListTimesheetResponse_Output
    AdjustTimesheetEntryDto:
      type: object
      properties:
        hoursWorked:
          type: number
          minimum: 0
          maximum: 11
          description: Отработанные часы после корректировки (0–11)
          example: 9
        downtimeHours:
          type: number
          minimum: 0
          maximum: 11
          description: Часы простоя после корректировки (0–11)
          example: 1
        reason:
          type: string
          minLength: 1
          maxLength: 500
          description: Причина корректировки — обязательное поле (HR-TS-INV-02)
          example: Сотрудник ушёл раньше по согласованию инженера
      required:
        - hoursWorked
        - downtimeHours
        - reason
      title: Adjust timesheet entry request
      description: Ручная корректировка часов записи табеля (HR 6.2.5)
      example:
        hoursWorked: 9
        downtimeHours: 1
        reason: Сотрудник ушёл раньше по согласованию инженера
      additionalProperties: false
    CreateDocumentDto:
      type: object
      properties:
        entityType:
          type: string
          minLength: 1
          maxLength: 100
          description: Тип сущности-владельца (например eam.asset)
          example: eam.asset
        entityId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID сущности-владельца
          example: 22222222-2222-4222-8222-222222222222
          format: uuid
        filename:
          type: string
          minLength: 1
          maxLength: 255
          description: Имя файла с расширением
          example: passport-scan.pdf
        mimeType:
          description: MIME-тип (опционально, для Content-Type при PUT)
          example: application/pdf
          type: string
          minLength: 1
          maxLength: 200
        bucket:
          type: string
          enum:
            - documents
            - hse-photos
            - reports
            - asset-passports
          description: MinIO bucket для хранения файла
          example: documents
      required:
        - entityType
        - entityId
        - filename
      title: Create document request
      description: Инициирование загрузки документа (presigned PUT URL)
      example:
        entityType: eam.asset
        entityId: 22222222-2222-4222-8222-222222222222
        filename: passport-scan.pdf
        mimeType: application/pdf
        bucket: documents
      additionalProperties: false
    InitiateUploadResponse_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID созданной записи документа
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        uploadUrl:
          type: string
          format: uri
          description: Presigned PUT URL для загрузки файла в MinIO
          example: https://minio.example/presigned-put
        expiresIn:
          type: integer
          exclusiveMinimum: 0
          maximum: 9007199254740991
          description: Время жизни presigned URL в секундах
          example: 300
      required:
        - id
        - uploadUrl
        - expiresIn
      title: Initiate upload response
      description: Результат инициирования загрузки документа
      example:
        id: 11111111-1111-4111-8111-111111111111
        uploadUrl: https://minio.example/presigned-put
        expiresIn: 300
      additionalProperties: false
      x-schema-id: InitiateUploadResponse_Output
    ConfirmDocumentDto:
      type: object
      properties:
        sha256:
          description: SHA-256 хеш загруженного файла (hex, 64 символа)
          example: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
          type: string
          minLength: 64
          maxLength: 64
      title: Confirm document upload request
      description: Подтверждение загрузки после PUT в MinIO
      example:
        sha256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
      additionalProperties: false
    ConfirmDocumentResponse_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID документа
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        status:
          type: string
          const: ready
          description: Статус после успешного подтверждения
          example: ready
        size:
          type: integer
          minimum: 0
          maximum: 9007199254740991
          description: Размер файла в байтах
          example: 1024
      required:
        - id
        - status
        - size
      title: Confirm document response
      description: Документ подтверждён и готов к скачиванию
      example:
        id: 11111111-1111-4111-8111-111111111111
        status: ready
        size: 1024
      additionalProperties: false
      x-schema-id: ConfirmDocumentResponse_Output
    DownloadUrlResponse_Output:
      type: object
      properties:
        downloadUrl:
          type: string
          format: uri
          description: Presigned GET URL для скачивания файла
          example: https://minio.example/presigned-get
        expiresIn:
          type: integer
          exclusiveMinimum: 0
          maximum: 9007199254740991
          description: Время жизни presigned URL в секундах
          example: 300
      required:
        - downloadUrl
        - expiresIn
      title: Download URL response
      description: Presigned URL для скачивания документа
      example:
        downloadUrl: https://minio.example/presigned-get
        expiresIn: 300
      additionalProperties: false
      x-schema-id: DownloadUrlResponse_Output
    SagaDlqEntry_Output:
      type: object
      properties:
        queue:
          type: string
          enum:
            - mineflow-saga-steps
            - mineflow-saga-compensate
          description: Имя BullMQ-очереди (forward или compensate)
          example: mineflow-saga-steps
        jobId:
          type: string
          description: >-
            BullMQ jobId (формат `${sagaId}__${stepName}` — двойной underscore;
            BullMQ 5.x запрещает `:` в jobId, см. CLAUDE.md pitfall)
          example: 8b1f5e2a-44a7-4e6e-9d61-7c0c9c45f4c7:mark-asset-decommissioned
        sagaName:
          type: string
          description: Имя саги из SagaRegistry
          example: eam.asset.decommission
        sagaId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID запуска саги
          example: 8b1f5e2a-44a7-4e6e-9d61-7c0c9c45f4c7
        stepName:
          type: string
          description: Имя упавшего шага
          example: mark-asset-decommissioned
        failedReason:
          description: Текст последней ошибки
          example: Asset is already decommissioned
          type: string
        attemptsMade:
          type: integer
          minimum: 0
          maximum: 9007199254740991
          description: Сколько раз шаг был ретраен
          example: 5
        attemptsLimit:
          type: integer
          exclusiveMinimum: 0
          maximum: 9007199254740991
          description: Потолок ретраев из BullMQ
          example: 5
        finishedOn:
          anyOf:
            - type: string
            - type: 'null'
          description: ISO timestamp последнего падения, null если ещё не финализирован
          example: '2026-05-20T08:14:33.122Z'
      required:
        - queue
        - jobId
        - sagaName
        - sagaId
        - stepName
        - attemptsMade
        - attemptsLimit
        - finishedOn
      additionalProperties: false
      title: Saga DLQ entry
      description: Один failed-job из BullMQ DLQ для саг
      x-schema-id: SagaDlqEntry_Output
    SagaDlqList_Output:
      type: object
      properties:
        entries:
          type: array
          items:
            $ref: '#/components/schemas/SagaDlqEntry_Output'
        truncated:
          type: boolean
      required:
        - entries
        - truncated
      title: Saga DLQ list response
      additionalProperties: false
      x-schema-id: SagaDlqList_Output
    SagaDlqStats_Output:
      type: object
      properties:
        queues:
          type: array
          items:
            type: object
            properties:
              queue:
                type: string
                enum:
                  - mineflow-saga-steps
                  - mineflow-saga-compensate
              failed:
                type: integer
                minimum: 0
                maximum: 9007199254740991
              waiting:
                type: integer
                minimum: 0
                maximum: 9007199254740991
              active:
                type: integer
                minimum: 0
                maximum: 9007199254740991
              delayed:
                type: integer
                minimum: 0
                maximum: 9007199254740991
              completed:
                type: integer
                minimum: 0
                maximum: 9007199254740991
            required:
              - queue
              - failed
              - waiting
              - active
              - delayed
              - completed
            additionalProperties: false
      required:
        - queues
      title: Saga DLQ stats
      description: Счётчики job-ов по статусам для каждой очереди саг
      additionalProperties: false
      x-schema-id: SagaDlqStats_Output
    CreateOrganizationDto:
      type: object
      properties:
        slug:
          type: string
          minLength: 3
          maxLength: 50
          pattern: ^[a-z0-9](?:[a-z0-9-]{1,48}[a-z0-9])?$
          description: Стабильный URL-safe идентификатор арендатора
          example: explosion-solutions
        name:
          type: string
          minLength: 1
          maxLength: 200
          description: Человекочитаемое название организации
          example: ТОО Explosion Solutions
      required:
        - slug
        - name
      additionalProperties: false
    OrganizationResponseDto_Output:
      type: object
      properties:
        id:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID организации (используется как `org_id` claim в JWT)
          example: 00000000-0000-4000-8000-000000000001
        slug:
          type: string
          example: explosion-solutions
        name:
          type: string
          example: ТОО Explosion Solutions
        status:
          type: string
          enum:
            - active
            - deactivated
          description: >-
            Lifecycle статус арендатора. active — нормальная работа; deactivated
            — арендатор архивирован (см. POST /:id/deactivate).
          example: active
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          example: '2026-05-21T08:00:00.000Z'
      required:
        - id
        - slug
        - name
        - status
        - createdAt
      additionalProperties: false
    ListOrganizationsResponseDto_Output:
      type: object
      properties:
        items:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
                format: uuid
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                description: UUID организации (используется как `org_id` claim в JWT)
                example: 00000000-0000-4000-8000-000000000001
              slug:
                type: string
                example: explosion-solutions
              name:
                type: string
                example: ТОО Explosion Solutions
              status:
                type: string
                enum:
                  - active
                  - deactivated
                description: >-
                  Lifecycle статус арендатора. active — нормальная работа;
                  deactivated — арендатор архивирован (см. POST
                  /:id/deactivate).
                example: active
              createdAt:
                type: string
                format: date-time
                pattern: >-
                  ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
                example: '2026-05-21T08:00:00.000Z'
            required:
              - id
              - slug
              - name
              - status
              - createdAt
            additionalProperties: false
      required:
        - items
      additionalProperties: false
    UpdateOrganizationDto:
      type: object
      properties:
        name:
          description: Новое человекочитаемое название. Slug менять нельзя — он URL-key.
          example: ТОО Explosion Solutions International
          type: string
          minLength: 1
          maxLength: 200
      additionalProperties: false
    OutboxEntry_Output:
      type: object
      properties:
        id:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        organizationId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        eventId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        eventType:
          type: string
        eventVersion:
          type: string
        status:
          type: string
          enum:
            - pending
            - published
            - dead
            - skipped
        attempts:
          type: integer
          minimum: 0
          maximum: 9007199254740991
        lastError:
          anyOf:
            - type: string
            - type: 'null'
        nextAttemptAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
        publishedAt:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
            - type: 'null'
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
        partitionKey:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
      required:
        - id
        - organizationId
        - eventId
        - eventType
        - eventVersion
        - status
        - attempts
        - lastError
        - nextAttemptAt
        - publishedAt
        - createdAt
        - partitionKey
      additionalProperties: false
      title: Outbox entry
      description: Одна запись из event_outbox (ADR-0026).
      x-schema-id: OutboxEntry_Output
    ListOutboxResponse_Output:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/OutboxEntry_Output'
        hasMore:
          type: boolean
        stats:
          type: object
          properties:
            pendingCount:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            deadCount:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            duePendingCount:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            oldestDuePendingAt:
              anyOf:
                - type: string
                  format: date-time
                  pattern: >-
                    ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
                - type: 'null'
          additionalProperties: false
      required:
        - items
        - hasMore
        - stats
      title: Outbox listing + stats
      additionalProperties: false
      x-schema-id: ListOutboxResponse_Output
    OutboxRepublishResponse_Output:
      type: object
      properties:
        id:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        status:
          type: string
          const: pending
        attempts:
          type: integer
          minimum: 0
          maximum: 9007199254740991
      required:
        - id
        - status
        - attempts
      additionalProperties: false
      x-schema-id: OutboxRepublishResponse_Output
    OutboxSkipResponse_Output:
      type: object
      properties:
        id:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        status:
          type: string
          const: skipped
      required:
        - id
        - status
      additionalProperties: false
      x-schema-id: OutboxSkipResponse_Output
    QueueStatsEntry_Output:
      type: object
      properties:
        name:
          type: string
          enum:
            - mineflow-saga-steps
            - mineflow-saga-compensate
            - mineflow-audit-log
          description: Имя BullMQ-очереди
          example: mineflow-saga-steps
        waiting:
          type: integer
          minimum: 0
          maximum: 9007199254740991
          description: Job-ы ожидающие worker
        active:
          type: integer
          minimum: 0
          maximum: 9007199254740991
          description: Job-ы в обработке
        delayed:
          type: integer
          minimum: 0
          maximum: 9007199254740991
          description: Job-ы запланированные на будущее (backoff/retry)
        failed:
          type: integer
          minimum: 0
          maximum: 9007199254740991
          description: Job-ы исчерпавшие retries (DLQ)
        completed:
          type: integer
          minimum: 0
          maximum: 9007199254740991
          description: Успешно завершённые (BullMQ хранит N последних)
        paused:
          type: integer
          minimum: 0
          maximum: 9007199254740991
          description: Job-ы в paused очереди
        backlogWarning:
          type: boolean
          description: true если waiting+delayed превышает предупредительный порог
      required:
        - name
        - waiting
        - active
        - delayed
        - failed
        - completed
        - paused
        - backlogWarning
      additionalProperties: false
      title: Queue stats entry
      x-schema-id: QueueStatsEntry_Output
    QueuesListResponse_Output:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/QueueStatsEntry_Output'
        backlogThreshold:
          type: integer
          exclusiveMinimum: 0
          maximum: 9007199254740991
          description: Текущий порог backlogWarning (waiting+delayed > threshold)
      required:
        - items
        - backlogThreshold
      title: Queues list response
      additionalProperties: false
      x-schema-id: QueuesListResponse_Output
    QueueDetailResponse_Output:
      type: object
      properties:
        name:
          type: string
          enum:
            - mineflow-saga-steps
            - mineflow-saga-compensate
            - mineflow-audit-log
          description: Имя BullMQ-очереди
          example: mineflow-saga-steps
        waiting:
          type: integer
          minimum: 0
          maximum: 9007199254740991
          description: Job-ы ожидающие worker
        active:
          type: integer
          minimum: 0
          maximum: 9007199254740991
          description: Job-ы в обработке
        delayed:
          type: integer
          minimum: 0
          maximum: 9007199254740991
          description: Job-ы запланированные на будущее (backoff/retry)
        failed:
          type: integer
          minimum: 0
          maximum: 9007199254740991
          description: Job-ы исчерпавшие retries (DLQ)
        completed:
          type: integer
          minimum: 0
          maximum: 9007199254740991
          description: Успешно завершённые (BullMQ хранит N последних)
        paused:
          type: integer
          minimum: 0
          maximum: 9007199254740991
          description: Job-ы в paused очереди
        backlogWarning:
          type: boolean
          description: true если waiting+delayed превышает предупредительный порог
        recentFailed:
          type: array
          items:
            type: object
            properties:
              jobId:
                type: string
              failedReason:
                anyOf:
                  - type: string
                  - type: 'null'
              attemptsMade:
                type: integer
                minimum: 0
                maximum: 9007199254740991
              finishedOn:
                anyOf:
                  - type: string
                    format: date-time
                    pattern: >-
                      ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
                  - type: 'null'
            required:
              - jobId
              - failedReason
              - attemptsMade
              - finishedOn
            additionalProperties: false
      required:
        - name
        - waiting
        - active
        - delayed
        - failed
        - completed
        - paused
        - backlogWarning
        - recentFailed
      title: Queue detail response
      additionalProperties: false
      x-schema-id: QueueDetailResponse_Output
    ShiftReportResponse_Output:
      type: object
      properties:
        id:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        organizationId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        productionObjectId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        shiftDate:
          type: string
          description: YYYY-MM-DD
          example: '2026-05-20'
        shiftType:
          type: string
          enum:
            - day
            - night
        status:
          type: string
          enum:
            - draft
            - submitted
            - approved
            - rejected
        submittedBy:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
        submittedAt:
          anyOf:
            - type: string
            - type: 'null'
        approvedBy:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
        approvedAt:
          anyOf:
            - type: string
            - type: 'null'
        approveSagaId:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
        rejectedBy:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
        rejectedAt:
          anyOf:
            - type: string
            - type: 'null'
        rejectReason:
          anyOf:
            - type: string
            - type: 'null'
        createdAt:
          type: string
        updatedAt:
          type: string
      required:
        - id
        - organizationId
        - productionObjectId
        - shiftDate
        - shiftType
        - status
        - submittedBy
        - submittedAt
        - approvedBy
        - approvedAt
        - approveSagaId
        - rejectedBy
        - rejectedAt
        - rejectReason
        - createdAt
        - updatedAt
      title: Shift-report DTO
      description: Полное состояние отчёта со всеми timestamp-полями FSM
      additionalProperties: false
      x-schema-id: ShiftReportResponse_Output
    ListShiftReportsResponse_Output:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/ShiftReportResponse_Output'
        nextCursor:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
      required:
        - items
        - nextCursor
      title: List shift-reports response
      description: Страница отчётов + nextCursor для следующего запроса
      additionalProperties: false
      x-schema-id: ListShiftReportsResponse_Output
    CreateShiftReportBodyDto:
      type: object
      properties:
        productionObjectId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID производственного объекта (карьера/участка)
        shiftDate:
          type: string
          format: date
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
          description: Календарный день смены (YYYY-MM-DD)
          example: '2026-05-20'
        shiftType:
          type: string
          enum:
            - day
            - night
          description: 'Тип смены: day | night'
          example: day
      required:
        - productionObjectId
        - shiftDate
        - shiftType
      title: Create shift-report draft request
      description: POST /v1/prd/shift-reports — создаёт черновик
      additionalProperties: false
    ApproveShiftReportResponse_Output:
      type: object
      properties:
        shiftReportId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID утверждённого сменного отчёта
        sagaId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID запущенной саги — используйте для опроса статуса
        status:
          type: string
          const: enqueued
          description: >-
            Сага принята в обработку; следите за прогрессом через GET
            /sagas/:id/status
      required:
        - shiftReportId
        - sagaId
        - status
      title: Approve shift-report response
      description: Результат POST /v1/prd/shift-reports/:id/approve
      additionalProperties: false
      x-schema-id: ApproveShiftReportResponse_Output
    RejectShiftReportBodyDto:
      type: object
      properties:
        reason:
          type: string
          minLength: 5
          maxLength: 500
          description: >-
            Причина отклонения — не менее 5 символов, попадает в audit_log +
            событие
          example: Отсутствуют замеры топлива на 3 машины
      required:
        - reason
      title: Reject (from submitted) request body
      description: Тело POST /v1/prd/shift-reports/:id/reject — отклонение без сторно-саги
      additionalProperties: false
    RejectAfterApproveBodyDto:
      type: object
      properties:
        reason:
          type: string
          minLength: 10
          maxLength: 500
          description: >-
            Причина сторно — не менее 10 символов, попадает в audit_log и
            reject-сагу
          example: Ошибочно учтены моточасы из-за сбоя датчика
      required:
        - reason
      title: Reject-after-approve request body
      description: Тело POST /v1/prd/shift-reports/:id/reject-after-approve
      additionalProperties: false
    RejectAfterApproveResponse_Output:
      type: object
      properties:
        shiftReportId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID сторнированного сменного отчёта
        rejectSagaId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID сторно-саги для опроса прогресса
        originalApproveSagaId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID исходной approve-саги — для трассировки и audit
        status:
          type: string
          const: enqueued
          description: Сторно-сага принята в обработку
      required:
        - shiftReportId
        - rejectSagaId
        - originalApproveSagaId
        - status
      title: Reject-after-approve response
      description: Результат POST /v1/prd/shift-reports/:id/reject-after-approve
      additionalProperties: false
      x-schema-id: RejectAfterApproveResponse_Output
    ShiftPersonnelResponse_Output:
      type: object
      properties:
        id:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        organizationId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        shiftReportId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        personnelId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        positionId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        hoursWorked:
          type: number
        downtimeHours:
          type: number
        createdAt:
          type: string
        updatedAt:
          type: string
      required:
        - id
        - organizationId
        - shiftReportId
        - personnelId
        - positionId
        - hoursWorked
        - downtimeHours
        - createdAt
        - updatedAt
      title: Shift personnel DTO
      additionalProperties: false
      x-schema-id: ShiftPersonnelResponse_Output
    ShiftAssetUsageResponse_Output:
      type: object
      properties:
        id:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        organizationId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        shiftReportId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        assetId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        operatorPersonnelId:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
        hoursWorked:
          type: number
        meterReadingStart:
          type: number
        meterReadingEnd:
          type: number
        createdAt:
          type: string
        updatedAt:
          type: string
      required:
        - id
        - organizationId
        - shiftReportId
        - assetId
        - operatorPersonnelId
        - hoursWorked
        - meterReadingStart
        - meterReadingEnd
        - createdAt
        - updatedAt
      title: Shift asset usage DTO
      additionalProperties: false
      x-schema-id: ShiftAssetUsageResponse_Output
    DrillingEntryResponse_Output:
      type: object
      properties:
        id:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        organizationId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        shiftReportId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        assetUsageId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        holesDrilled:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
        depthMeters:
          type: number
        drillBitWearPercent:
          anyOf:
            - type: number
            - type: 'null'
        createdAt:
          type: string
      required:
        - id
        - organizationId
        - shiftReportId
        - assetUsageId
        - holesDrilled
        - depthMeters
        - drillBitWearPercent
        - createdAt
      title: Drilling entry DTO
      additionalProperties: false
      x-schema-id: DrillingEntryResponse_Output
    BlastingEntryResponse_Output:
      type: object
      properties:
        id:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        organizationId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        shiftReportId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        blocksBlasted:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
        explosiveType:
          type: string
        explosiveKg:
          type: number
        permitId:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
        createdAt:
          type: string
      required:
        - id
        - organizationId
        - shiftReportId
        - blocksBlasted
        - explosiveType
        - explosiveKg
        - permitId
        - createdAt
      title: Blasting entry DTO
      additionalProperties: false
      x-schema-id: BlastingEntryResponse_Output
    FuelEntryResponse_Output:
      type: object
      properties:
        id:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        organizationId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        shiftReportId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        assetUsageId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        tankId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        fuelType:
          type: string
          enum:
            - diesel
            - gasoline
            - lubricant
        litersIssued:
          type: number
        litersConsumed:
          type: number
        createdAt:
          type: string
      required:
        - id
        - organizationId
        - shiftReportId
        - assetUsageId
        - tankId
        - fuelType
        - litersIssued
        - litersConsumed
        - createdAt
      title: Fuel entry DTO
      additionalProperties: false
      x-schema-id: FuelEntryResponse_Output
    DowntimeEventResponse_Output:
      type: object
      properties:
        id:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        organizationId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        shiftReportId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        assetUsageId:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
        reasonCode:
          type: string
          enum:
            - breakdown
            - maintenance
            - no_fuel
            - weather
            - other
        startedAt:
          type: string
        endedAt:
          type: string
        description:
          anyOf:
            - type: string
            - type: 'null'
        createdAt:
          type: string
      required:
        - id
        - organizationId
        - shiftReportId
        - assetUsageId
        - reasonCode
        - startedAt
        - endedAt
        - description
        - createdAt
      title: Downtime event DTO
      additionalProperties: false
      x-schema-id: DowntimeEventResponse_Output
    TmcUsageResponse_Output:
      type: object
      properties:
        id:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        organizationId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        shiftReportId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        assetUsageId:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
        tmcItemId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        quantity:
          type: number
        unit:
          type: string
        createdAt:
          type: string
      required:
        - id
        - organizationId
        - shiftReportId
        - assetUsageId
        - tmcItemId
        - quantity
        - unit
        - createdAt
      title: TMC usage DTO
      additionalProperties: false
      x-schema-id: TmcUsageResponse_Output
    ShiftReportEntriesResponse_Output:
      type: object
      properties:
        personnel:
          type: array
          items:
            $ref: '#/components/schemas/ShiftPersonnelResponse_Output'
        assetUsages:
          type: array
          items:
            $ref: '#/components/schemas/ShiftAssetUsageResponse_Output'
        drilling:
          type: array
          items:
            $ref: '#/components/schemas/DrillingEntryResponse_Output'
        blasting:
          type: array
          items:
            $ref: '#/components/schemas/BlastingEntryResponse_Output'
        fuel:
          type: array
          items:
            $ref: '#/components/schemas/FuelEntryResponse_Output'
        downtime:
          type: array
          items:
            $ref: '#/components/schemas/DowntimeEventResponse_Output'
        tmcUsage:
          type: array
          items:
            $ref: '#/components/schemas/TmcUsageResponse_Output'
      required:
        - personnel
        - assetUsages
        - drilling
        - blasting
        - fuel
        - downtime
        - tmcUsage
      title: Shift report entries snapshot
      description: Все child entries отчёта одним вызовом (GET /:reportId/entries)
      additionalProperties: false
      x-schema-id: ShiftReportEntriesResponse_Output
    AddShiftPersonnelBodyDto:
      type: object
      properties:
        personnelId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID работника (hr.personnel)
        positionId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID должности (soft-ref)
        hoursWorked:
          type: number
          minimum: 0
          maximum: 24
          description: Отработанные часы в смене (0..24)
        downtimeHours:
          type: number
          minimum: 0
          maximum: 24
          description: Часы простоя сотрудника (0..24)
      required:
        - personnelId
        - positionId
        - hoursWorked
        - downtimeHours
      title: Add shift personnel entry
      description: POST /v1/prd/shift-reports/:reportId/personnel
      additionalProperties: false
    AddShiftAssetUsageBodyDto:
      type: object
      properties:
        assetId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID актива (eam.assets)
        operatorPersonnelId:
          description: UUID оператора (опционально)
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
        hoursWorked:
          type: number
          minimum: 0
          maximum: 24
        meterReadingStart:
          type: number
          minimum: 0
        meterReadingEnd:
          type: number
          minimum: 0
      required:
        - assetId
        - hoursWorked
        - meterReadingStart
        - meterReadingEnd
      title: Add shift asset usage entry
      description: POST /v1/prd/shift-reports/:reportId/asset-usages
      additionalProperties: false
    AddDrillingEntryBodyDto:
      type: object
      properties:
        assetUsageId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID соответствующего ShiftAssetUsage
        holesDrilled:
          type: integer
          exclusiveMinimum: 0
          maximum: 2147483647
          description: Количество пробуренных скважин (1..2^31-1)
          example: 15
        depthMeters:
          type: number
          exclusiveMinimum: 0
          description: Глубина бурения, м
        drillBitWearPercent:
          description: Износ долота, % (0..100); null если не замерили
          anyOf:
            - type: number
              minimum: 0
              maximum: 100
            - type: 'null'
      required:
        - assetUsageId
        - holesDrilled
        - depthMeters
      title: Add drilling entry
      description: POST /v1/prd/shift-reports/:reportId/drilling-entries
      additionalProperties: false
    AddBlastingEntryBodyDto:
      type: object
      properties:
        blocksBlasted:
          type: integer
          minimum: 0
          maximum: 2147483647
          description: Количество взорванных блоков (0..2^31-1)
          example: 12
        explosiveType:
          type: string
          minLength: 1
          maxLength: 80
          description: Тип ВВ (например, ANFO, Emulsion)
        explosiveKg:
          type: number
          minimum: 0
          description: Масса ВВ, кг
        permitId:
          description: UUID разрешения hse.permits (опц.)
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
      required:
        - blocksBlasted
        - explosiveType
        - explosiveKg
      title: Add blasting entry
      description: POST /v1/prd/shift-reports/:reportId/blasting-entries
      additionalProperties: false
    AddFuelEntryBodyDto:
      type: object
      properties:
        assetUsageId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID соответствующего ShiftAssetUsage
        tankId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID резервуара ДТ (scm/fuel.FuelTank) — обязательно
        fuelType:
          type: string
          enum:
            - diesel
            - gasoline
            - lubricant
          description: Тип топлива/смазки
        litersIssued:
          type: number
          minimum: 0
          description: Выдано, литры
        litersConsumed:
          type: number
          minimum: 0
          description: Израсходовано, литры (<= litersIssued)
      required:
        - assetUsageId
        - tankId
        - fuelType
        - litersIssued
        - litersConsumed
      title: Add fuel entry
      description: POST /v1/prd/shift-reports/:reportId/fuel-entries
      additionalProperties: false
    AddDowntimeEventBodyDto:
      type: object
      properties:
        assetUsageId:
          description: UUID ShiftAssetUsage (опц.); null если простой не привязан к технике
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
        reasonCode:
          type: string
          enum:
            - breakdown
            - maintenance
            - no_fuel
            - weather
            - other
        startedAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: ISO 8601 момент начала
        endedAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: ISO 8601 момент конца, должен быть > startedAt
        description:
          anyOf:
            - type: string
              minLength: 1
              maxLength: 500
            - type: 'null'
      required:
        - reasonCode
        - startedAt
        - endedAt
      title: Add downtime event
      description: POST /v1/prd/shift-reports/:reportId/downtime-events
      additionalProperties: false
    AddTmcUsageBodyDto:
      type: object
      properties:
        assetUsageId:
          description: UUID ShiftAssetUsage (опц.)
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
        tmcItemId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID позиции ТМЦ (scm soft-ref)
        quantity:
          type: number
          exclusiveMinimum: 0
          description: Количество (> 0)
        unit:
          type: string
          minLength: 1
          maxLength: 20
          description: Единица измерения (л, шт, кг, ...)
      required:
        - tmcItemId
        - quantity
        - unit
      title: Add TMC usage entry
      description: POST /v1/prd/shift-reports/:reportId/tmc-usages
      additionalProperties: false
    ListProductionPlansResponseDto_Output:
      type: object
      properties:
        items:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
                format: uuid
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              organizationId:
                type: string
                format: uuid
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              horizon:
                type: string
                enum:
                  - year
                  - month
              year:
                type: integer
                minimum: -9007199254740991
                maximum: 9007199254740991
              month:
                anyOf:
                  - type: integer
                    minimum: 1
                    maximum: 12
                  - type: 'null'
              status:
                type: string
                enum:
                  - draft
                  - approved
                  - superseded
              currentVersionId:
                anyOf:
                  - type: string
                    format: uuid
                    pattern: >-
                      ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                  - type: 'null'
              createdBy:
                type: string
                format: uuid
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              createdAt:
                type: string
                format: date-time
                pattern: >-
                  ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              updatedAt:
                type: string
                format: date-time
                pattern: >-
                  ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              versions:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: string
                      format: uuid
                      pattern: >-
                        ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                    versionNumber:
                      type: integer
                      minimum: 1
                      maximum: 9007199254740991
                    previousVersionId:
                      anyOf:
                        - type: string
                          format: uuid
                          pattern: >-
                            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                        - type: 'null'
                    reason:
                      anyOf:
                        - type: string
                        - type: 'null'
                    requiresCeoApproval:
                      type: boolean
                    status:
                      type: string
                      enum:
                        - pending-ceo
                        - auto-approved
                        - approved-version
                        - rejected-version
                    approvedBy:
                      anyOf:
                        - type: string
                          format: uuid
                          pattern: >-
                            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                        - type: 'null'
                    approvedAt:
                      anyOf:
                        - type: string
                          format: date-time
                          pattern: >-
                            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
                        - type: 'null'
                    rejectedBy:
                      anyOf:
                        - type: string
                          format: uuid
                          pattern: >-
                            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                        - type: 'null'
                    rejectedAt:
                      anyOf:
                        - type: string
                          format: date-time
                          pattern: >-
                            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
                        - type: 'null'
                    rejectionReason:
                      anyOf:
                        - type: string
                        - type: 'null'
                    createdBy:
                      type: string
                      format: uuid
                      pattern: >-
                        ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                    createdAt:
                      type: string
                      format: date-time
                      pattern: >-
                        ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
                  required:
                    - id
                    - versionNumber
                    - previousVersionId
                    - reason
                    - requiresCeoApproval
                    - status
                    - approvedBy
                    - approvedAt
                    - rejectedBy
                    - rejectedAt
                    - rejectionReason
                    - createdBy
                    - createdAt
                  additionalProperties: false
            required:
              - id
              - organizationId
              - horizon
              - year
              - month
              - status
              - currentVersionId
              - createdBy
              - createdAt
              - updatedAt
              - versions
            additionalProperties: false
        nextCursor:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
      required:
        - items
        - nextCursor
      additionalProperties: false
    ProductionPlanResponseDto_Output:
      type: object
      properties:
        id:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        organizationId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        horizon:
          type: string
          enum:
            - year
            - month
        year:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
        month:
          anyOf:
            - type: integer
              minimum: 1
              maximum: 12
            - type: 'null'
        status:
          type: string
          enum:
            - draft
            - approved
            - superseded
        currentVersionId:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
        createdBy:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
        updatedAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
        versions:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
                format: uuid
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              versionNumber:
                type: integer
                minimum: 1
                maximum: 9007199254740991
              previousVersionId:
                anyOf:
                  - type: string
                    format: uuid
                    pattern: >-
                      ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                  - type: 'null'
              reason:
                anyOf:
                  - type: string
                  - type: 'null'
              requiresCeoApproval:
                type: boolean
              status:
                type: string
                enum:
                  - pending-ceo
                  - auto-approved
                  - approved-version
                  - rejected-version
              approvedBy:
                anyOf:
                  - type: string
                    format: uuid
                    pattern: >-
                      ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                  - type: 'null'
              approvedAt:
                anyOf:
                  - type: string
                    format: date-time
                    pattern: >-
                      ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
                  - type: 'null'
              rejectedBy:
                anyOf:
                  - type: string
                    format: uuid
                    pattern: >-
                      ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                  - type: 'null'
              rejectedAt:
                anyOf:
                  - type: string
                    format: date-time
                    pattern: >-
                      ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
                  - type: 'null'
              rejectionReason:
                anyOf:
                  - type: string
                  - type: 'null'
              createdBy:
                type: string
                format: uuid
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              createdAt:
                type: string
                format: date-time
                pattern: >-
                  ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
            required:
              - id
              - versionNumber
              - previousVersionId
              - reason
              - requiresCeoApproval
              - status
              - approvedBy
              - approvedAt
              - rejectedBy
              - rejectedAt
              - rejectionReason
              - createdBy
              - createdAt
            additionalProperties: false
      required:
        - id
        - organizationId
        - horizon
        - year
        - month
        - status
        - currentVersionId
        - createdBy
        - createdAt
        - updatedAt
        - versions
      additionalProperties: false
    CreateProductionPlanDto:
      type: object
      properties:
        horizon:
          type: string
          enum:
            - year
            - month
        year:
          type: integer
          minimum: 2020
          maximum: 2100
        month:
          default: null
          anyOf:
            - type: integer
              minimum: 1
              maximum: 12
            - type: 'null'
      required:
        - horizon
        - year
      additionalProperties: false
    ApproveProductionPlanDto:
      type: object
      properties:
        objectPlans:
          minItems: 1
          type: array
          items:
            type: object
            properties:
              objectId:
                type: string
                format: uuid
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              drillingTargetM:
                type: number
                minimum: 0
              blastingTargetM3:
                type: number
                minimum: 0
              monthlyBreakdown:
                anyOf:
                  - type: object
                    propertyNames:
                      type: string
                      pattern: ^([1-9]|1[0-2])$
                    additionalProperties:
                      type: object
                      properties:
                        drilling:
                          type: number
                          minimum: 0
                        blasting:
                          type: number
                          minimum: 0
                      required:
                        - drilling
                        - blasting
                      additionalProperties: false
                  - type: 'null'
            required:
              - objectId
              - drillingTargetM
              - blastingTargetM3
              - monthlyBreakdown
            additionalProperties: false
      required:
        - objectPlans
      additionalProperties: false
    AmendProductionPlanDto:
      type: object
      properties:
        reason:
          type: string
          minLength: 5
          maxLength: 1000
        objectPlans:
          minItems: 1
          type: array
          items:
            type: object
            properties:
              objectId:
                type: string
                format: uuid
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              drillingTargetM:
                type: number
                minimum: 0
              blastingTargetM3:
                type: number
                minimum: 0
              monthlyBreakdown:
                anyOf:
                  - type: object
                    propertyNames:
                      type: string
                      pattern: ^([1-9]|1[0-2])$
                    additionalProperties:
                      type: object
                      properties:
                        drilling:
                          type: number
                          minimum: 0
                        blasting:
                          type: number
                          minimum: 0
                      required:
                        - drilling
                        - blasting
                      additionalProperties: false
                  - type: 'null'
            required:
              - objectId
              - drillingTargetM
              - blastingTargetM3
              - monthlyBreakdown
            additionalProperties: false
      required:
        - reason
        - objectPlans
      additionalProperties: false
    RejectProductionPlanVersionDto:
      type: object
      properties:
        reason:
          type: string
          minLength: 5
          maxLength: 1000
      required:
        - reason
      additionalProperties: false
    SupersedeProductionPlanDto:
      type: object
      properties:
        replacedByPlanId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
      required:
        - replacedByPlanId
      additionalProperties: false
    AdjustDailyNormDto:
      type: object
      properties:
        objectPlanId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        assetId:
          default: null
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
        targetMPerShift:
          type: number
          exclusiveMinimum: 0
        baseTargetM:
          type: number
          exclusiveMinimum: 0
        effectiveFrom:
          type: string
          format: date
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
        effectiveTo:
          default: null
          anyOf:
            - type: string
              format: date
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
            - type: 'null'
      required:
        - objectPlanId
        - targetMPerShift
        - baseTargetM
        - effectiveFrom
      additionalProperties: false
    ListFuelTanksResponseDto_Output:
      type: object
      properties:
        items:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                description: UUID резервуара
                example: 11111111-1111-4111-8111-111111111111
                format: uuid
              objectId:
                type: string
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                description: Production object FK
                example: 11111111-1111-4111-8111-111111111111
                format: uuid
              code:
                type: string
                description: Код резервуара
              capacityLiters:
                type: number
                exclusiveMinimum: 0
              minLevelLiters:
                type: number
                minimum: 0
              currentBalanceLiters:
                type: number
                minimum: 0
              active:
                type: boolean
              statusDerived:
                type: string
                enum:
                  - normal
                  - attention
                  - critical
                description: Производный статус (остаток / min / ёмкость)
              createdAt:
                type: string
                format: date-time
                pattern: >-
                  ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
                description: Создано
                example: '2026-05-18T08:00:00.000Z'
              updatedAt:
                type: string
                format: date-time
                pattern: >-
                  ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
                description: Обновлено
                example: '2026-05-18T08:00:00.000Z'
            required:
              - id
              - objectId
              - code
              - capacityLiters
              - minLevelLiters
              - currentBalanceLiters
              - active
              - statusDerived
              - createdAt
              - updatedAt
            additionalProperties: false
        nextCursor:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
          description: Курсор следующей страницы
      required:
        - items
        - nextCursor
      additionalProperties: false
    FuelTankResponseDto_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID резервуара
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        objectId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: Production object FK
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        code:
          type: string
          description: Код резервуара
        capacityLiters:
          type: number
          exclusiveMinimum: 0
        minLevelLiters:
          type: number
          minimum: 0
        currentBalanceLiters:
          type: number
          minimum: 0
        active:
          type: boolean
        statusDerived:
          type: string
          enum:
            - normal
            - attention
            - critical
          description: Производный статус (остаток / min / ёмкость)
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Создано
          example: '2026-05-18T08:00:00.000Z'
        updatedAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Обновлено
          example: '2026-05-18T08:00:00.000Z'
      required:
        - id
        - objectId
        - code
        - capacityLiters
        - minLevelLiters
        - currentBalanceLiters
        - active
        - statusDerived
        - createdAt
        - updatedAt
      additionalProperties: false
    CreateFuelTankDtoUuid:
      type: string
      format: uuid
      pattern: >-
        ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
      description: UUID v4
      example: 11111111-1111-4111-8111-111111111111
    CreateFuelTankDto:
      type: object
      properties:
        objectId:
          $ref: '#/components/schemas/CreateFuelTankDtoUuid'
        code:
          type: string
          minLength: 1
          maxLength: 64
          description: Уникальный код резервуара в рамках организации
        capacityLiters:
          type: integer
          exclusiveMinimum: 0
          maximum: 9007199254740991
        minLevelLiters:
          type: integer
          minimum: 0
          maximum: 9007199254740991
        initialBalanceLiters:
          type: number
          minimum: 0
      required:
        - objectId
        - code
        - capacityLiters
        - minLevelLiters
      additionalProperties: false
    UpdateFuelTankDto:
      type: object
      properties:
        minLevelLiters:
          description: Новый нижний порог контроля, л — не может превышать ёмкость
          type: number
          minimum: 0
      additionalProperties: false
    ListFuelSupplyRequestsResponseDto_Output:
      type: object
      properties:
        items:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                description: Заявка на поставку ДТ
                example: 11111111-1111-4111-8111-111111111111
                format: uuid
              organizationId:
                type: string
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                description: Tenant (organization)
                example: 11111111-1111-4111-8111-111111111111
                format: uuid
              tankId:
                type: string
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                description: Резервуар
                example: 11111111-1111-4111-8111-111111111111
                format: uuid
              requestedVolumeLiters:
                type: number
                exclusiveMinimum: 0
              desiredDeliveryDate:
                anyOf:
                  - type: string
                    format: date
                    pattern: >-
                      ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
                  - type: 'null'
              justification:
                anyOf:
                  - type: string
                  - type: 'null'
              status:
                type: string
                enum:
                  - draft
                  - sent
                  - approved
                  - fulfilled
                  - rejected
              initiatorId:
                type: string
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                description: Инициатор черновика
                example: 11111111-1111-4111-8111-111111111111
                format: uuid
              submittedAt:
                anyOf:
                  - type: string
                    format: date-time
                    pattern: >-
                      ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
                    description: Отправлено на согласование
                    example: '2026-05-18T08:00:00.000Z'
                  - type: 'null'
              approvedById:
                anyOf:
                  - type: string
                    format: uuid
                    pattern: >-
                      ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                  - type: 'null'
                description: Согласовавший
              approvedAt:
                anyOf:
                  - type: string
                    format: date-time
                    pattern: >-
                      ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
                    description: Дата утверждения
                    example: '2026-05-18T08:00:00.000Z'
                  - type: 'null'
              rejectedById:
                anyOf:
                  - type: string
                    format: uuid
                    pattern: >-
                      ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                  - type: 'null'
                description: Отклонивший
              rejectedAt:
                anyOf:
                  - type: string
                    format: date-time
                    pattern: >-
                      ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
                    description: Дата отклонения
                    example: '2026-05-18T08:00:00.000Z'
                  - type: 'null'
              rejectReason:
                anyOf:
                  - type: string
                  - type: 'null'
              fulfilledSupplyId:
                anyOf:
                  - type: string
                    format: uuid
                    pattern: >-
                      ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                  - type: 'null'
                description: Связанная поставка ДТ
              fulfilledAt:
                anyOf:
                  - type: string
                    format: date-time
                    pattern: >-
                      ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
                    description: Дата выполнения
                    example: '2026-05-18T08:00:00.000Z'
                  - type: 'null'
              lastReturnComment:
                anyOf:
                  - type: string
                  - type: 'null'
              createdAt:
                type: string
                format: date-time
                pattern: >-
                  ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
                description: Создано
                example: '2026-05-18T08:00:00.000Z'
              updatedAt:
                type: string
                format: date-time
                pattern: >-
                  ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
                description: Обновлено
                example: '2026-05-18T08:00:00.000Z'
            required:
              - id
              - organizationId
              - tankId
              - requestedVolumeLiters
              - desiredDeliveryDate
              - justification
              - status
              - initiatorId
              - submittedAt
              - approvedById
              - approvedAt
              - rejectedById
              - rejectedAt
              - rejectReason
              - fulfilledSupplyId
              - fulfilledAt
              - lastReturnComment
              - createdAt
              - updatedAt
            additionalProperties: false
        nextCursor:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
          description: Курсор следующей страницы
      required:
        - items
        - nextCursor
      additionalProperties: false
    FuelSupplyRequestResponseDto_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: Заявка на поставку ДТ
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        organizationId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: Tenant (organization)
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        tankId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: Резервуар
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        requestedVolumeLiters:
          type: number
          exclusiveMinimum: 0
        desiredDeliveryDate:
          anyOf:
            - type: string
              format: date
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
            - type: 'null'
        justification:
          anyOf:
            - type: string
            - type: 'null'
        status:
          type: string
          enum:
            - draft
            - sent
            - approved
            - fulfilled
            - rejected
        initiatorId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: Инициатор черновика
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        submittedAt:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Отправлено на согласование
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
        approvedById:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
          description: Согласовавший
        approvedAt:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Дата утверждения
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
        rejectedById:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
          description: Отклонивший
        rejectedAt:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Дата отклонения
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
        rejectReason:
          anyOf:
            - type: string
            - type: 'null'
        fulfilledSupplyId:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
          description: Связанная поставка ДТ
        fulfilledAt:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Дата выполнения
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
        lastReturnComment:
          anyOf:
            - type: string
            - type: 'null'
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Создано
          example: '2026-05-18T08:00:00.000Z'
        updatedAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Обновлено
          example: '2026-05-18T08:00:00.000Z'
      required:
        - id
        - organizationId
        - tankId
        - requestedVolumeLiters
        - desiredDeliveryDate
        - justification
        - status
        - initiatorId
        - submittedAt
        - approvedById
        - approvedAt
        - rejectedById
        - rejectedAt
        - rejectReason
        - fulfilledSupplyId
        - fulfilledAt
        - lastReturnComment
        - createdAt
        - updatedAt
      additionalProperties: false
    CreateFuelSupplyRequestDtoUuid:
      type: string
      format: uuid
      pattern: >-
        ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
      description: UUID v4
      example: 11111111-1111-4111-8111-111111111111
    CreateFuelSupplyRequestDto:
      type: object
      properties:
        tankId:
          $ref: '#/components/schemas/CreateFuelSupplyRequestDtoUuid'
        requestedVolumeLiters:
          type: number
          exclusiveMinimum: 0
        desiredDeliveryDate:
          type: string
          pattern: ^\d{4}-\d{2}-\d{2}$
        justification:
          type: string
          minLength: 1
          maxLength: 2000
      required:
        - tankId
        - requestedVolumeLiters
        - desiredDeliveryDate
        - justification
      additionalProperties: false
    UpdateFuelSupplyRequestDto:
      type: object
      properties:
        requestedVolumeLiters:
          type: number
          exclusiveMinimum: 0
        desiredDeliveryDate:
          type: string
          format: date
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
        justification:
          type: string
          minLength: 1
          maxLength: 2000
      additionalProperties: false
    ApproveFuelSupplyRequestDto:
      type: object
      properties:
        comment:
          type: string
          maxLength: 1000
      additionalProperties: false
    RejectFuelSupplyRequestDto:
      type: object
      properties:
        reason:
          type: string
          minLength: 10
          maxLength: 1000
      required:
        - reason
      additionalProperties: false
    ReturnForRevisionFuelSupplyRequestDto:
      type: object
      properties:
        comment:
          type: string
          minLength: 10
          description: Комментарий руководителю до доработки заявки (минимум 10 символов)
      required:
        - comment
      additionalProperties: false
    LinkSupplyFuelSupplyRequestDto:
      type: object
      properties:
        supplyId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID зарегистрированной поставки ДТ
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        fulfilledQuantityLiters:
          description: Фактически принятый объём, л (по умолчанию = requestedVolume заявки)
          type: number
          exclusiveMinimum: 0
      required:
        - supplyId
      additionalProperties: false
    ListFuelSuppliesResponseDto_Output:
      type: object
      properties:
        items:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                description: Идентификатор строки журнала поставки
                example: 11111111-1111-4111-8111-111111111111
                format: uuid
              tankId:
                type: string
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                description: Резервуар
                example: 11111111-1111-4111-8111-111111111111
                format: uuid
              organizationId:
                type: string
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                description: Tenant
                example: 11111111-1111-4111-8111-111111111111
                format: uuid
              supplierId:
                anyOf:
                  - type: string
                    pattern: >-
                      ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                    description: Поставщик
                    example: 11111111-1111-4111-8111-111111111111
                    format: uuid
                  - type: 'null'
              quantityLiters:
                type: number
                exclusiveMinimum: 0
              occurredAt:
                type: string
                format: date-time
                pattern: >-
                  ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
                description: Факт времени операции
                example: '2026-05-18T08:00:00.000Z'
              supplyRequestId:
                anyOf:
                  - type: string
                    pattern: >-
                      ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                    description: Заявка на поставку
                    example: 11111111-1111-4111-8111-111111111111
                    format: uuid
                  - type: 'null'
              sagaId:
                anyOf:
                  - type: string
                    pattern: >-
                      ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                    description: Идемпотентность сага
                    example: 11111111-1111-4111-8111-111111111111
                    format: uuid
                  - type: 'null'
              actorId:
                type: string
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                description: Кто записал операцию
                example: 11111111-1111-4111-8111-111111111111
                format: uuid
            required:
              - id
              - tankId
              - organizationId
              - supplierId
              - quantityLiters
              - occurredAt
              - supplyRequestId
              - sagaId
              - actorId
            additionalProperties: false
        nextCursor:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
          description: Курсор следующей страницы
      required:
        - items
        - nextCursor
      additionalProperties: false
    RecordFuelSupplyDtoUuid:
      type: string
      format: uuid
      pattern: >-
        ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
      description: UUID v4
      example: 11111111-1111-4111-8111-111111111111
    RecordFuelSupplyDto:
      type: object
      properties:
        tankId:
          $ref: '#/components/schemas/RecordFuelSupplyDtoUuid'
        supplierId:
          $ref: '#/components/schemas/RecordFuelSupplyDtoUuid'
        quantityLiters:
          type: number
          exclusiveMinimum: 0
        supplyRequestId:
          anyOf:
            - $ref: '#/components/schemas/RecordFuelSupplyDtoUuid'
            - type: 'null'
        sagaId:
          anyOf:
            - $ref: '#/components/schemas/RecordFuelSupplyDtoUuid'
            - type: 'null'
        occurredAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
      required:
        - tankId
        - supplierId
        - quantityLiters
      additionalProperties: false
    FuelSupplyResponseDto_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: Идентификатор строки журнала поставки
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        tankId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: Резервуар
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        organizationId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: Tenant
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        supplierId:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: Поставщик
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        quantityLiters:
          type: number
          exclusiveMinimum: 0
        occurredAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Факт времени операции
          example: '2026-05-18T08:00:00.000Z'
        supplyRequestId:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: Заявка на поставку
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        sagaId:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: Идемпотентность сага
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        actorId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: Кто записал операцию
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
      required:
        - id
        - tankId
        - organizationId
        - supplierId
        - quantityLiters
        - occurredAt
        - supplyRequestId
        - sagaId
        - actorId
      additionalProperties: false
    FuelReversalBodyDto:
      type: object
      properties:
        reason:
          type: string
          minLength: 3
          maxLength: 500
        comment:
          type: string
          minLength: 10
          maxLength: 2000
      required:
        - reason
        - comment
      additionalProperties: false
    FuelTransactionResponseDto_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: Строка журнала
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        tankId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: Резервуар
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        organizationId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: Tenant
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        kind:
          type: string
          enum:
            - supply
            - consumption_auto
            - consumption_manual
            - reversal
        signedQuantityLiters:
          type: number
        occurredAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Время операции
          example: '2026-05-18T08:00:00.000Z'
        actorId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: Исполнитель
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        sagaId:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: Сага
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        supplierId:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: Поставщик
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        shiftReportId:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: Отчёт
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        supplyRequestId:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: Заявка
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        fuelEntryId:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: Строка FuelEntry
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        manualPurpose:
          anyOf:
            - type: string
            - type: 'null'
        reversesEntryId:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: Сторнируемая строка
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        reason:
          anyOf:
            - type: string
            - type: 'null'
        comment:
          anyOf:
            - type: string
            - type: 'null'
      required:
        - id
        - tankId
        - organizationId
        - kind
        - signedQuantityLiters
        - occurredAt
        - actorId
        - sagaId
        - supplierId
        - shiftReportId
        - supplyRequestId
        - fuelEntryId
        - manualPurpose
        - reversesEntryId
        - reason
        - comment
      additionalProperties: false
    ListFuelConsumptionsResponseDto_Output:
      type: object
      properties:
        items:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                description: Идентификатор строки журнала расхода
                example: 11111111-1111-4111-8111-111111111111
                format: uuid
              tankId:
                type: string
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                description: Резервуар
                example: 11111111-1111-4111-8111-111111111111
                format: uuid
              organizationId:
                type: string
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                description: Tenant
                example: 11111111-1111-4111-8111-111111111111
                format: uuid
              kind:
                type: string
                enum:
                  - consumption_auto
                  - consumption_manual
              quantityLiters:
                type: number
                exclusiveMinimum: 0
              occurredAt:
                type: string
                format: date-time
                pattern: >-
                  ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
                description: Факт времени операции
                example: '2026-05-18T08:00:00.000Z'
              shiftReportId:
                anyOf:
                  - type: string
                    pattern: >-
                      ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                    description: Сменный отчёт
                    example: 11111111-1111-4111-8111-111111111111
                    format: uuid
                  - type: 'null'
              fuelEntryId:
                anyOf:
                  - type: string
                    pattern: >-
                      ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                    description: Строка FuelEntry
                    example: 11111111-1111-4111-8111-111111111111
                    format: uuid
                  - type: 'null'
              manualPurpose:
                anyOf:
                  - type: string
                  - type: 'null'
              sagaId:
                anyOf:
                  - type: string
                    pattern: >-
                      ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                    description: Сага / идемпотентность
                    example: 11111111-1111-4111-8111-111111111111
                    format: uuid
                  - type: 'null'
              actorId:
                type: string
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                description: Исполнитель
                example: 11111111-1111-4111-8111-111111111111
                format: uuid
            required:
              - id
              - tankId
              - organizationId
              - kind
              - quantityLiters
              - occurredAt
              - shiftReportId
              - fuelEntryId
              - manualPurpose
              - sagaId
              - actorId
            additionalProperties: false
        nextCursor:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
          description: Курсор следующей страницы
      required:
        - items
        - nextCursor
      additionalProperties: false
    RecordManualConsumptionDtoUuid:
      type: string
      format: uuid
      pattern: >-
        ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
      description: UUID v4
      example: 11111111-1111-4111-8111-111111111111
    RecordManualConsumptionDto:
      type: object
      properties:
        tankId:
          $ref: '#/components/schemas/RecordManualConsumptionDtoUuid'
        quantityLiters:
          type: number
          exclusiveMinimum: 0
        manualPurpose:
          type: string
          minLength: 3
          maxLength: 500
        sagaId:
          anyOf:
            - $ref: '#/components/schemas/RecordManualConsumptionDtoUuid'
            - type: 'null'
        occurredAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
      required:
        - tankId
        - quantityLiters
        - manualPurpose
      additionalProperties: false
    FuelConsumptionResponseDto_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: Идентификатор строки журнала расхода
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        tankId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: Резервуар
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        organizationId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: Tenant
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        kind:
          type: string
          enum:
            - consumption_auto
            - consumption_manual
        quantityLiters:
          type: number
          exclusiveMinimum: 0
        occurredAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Факт времени операции
          example: '2026-05-18T08:00:00.000Z'
        shiftReportId:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: Сменный отчёт
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        fuelEntryId:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: Строка FuelEntry
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        manualPurpose:
          anyOf:
            - type: string
            - type: 'null'
        sagaId:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: Сага / идемпотентность
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        actorId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: Исполнитель
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
      required:
        - id
        - tankId
        - organizationId
        - kind
        - quantityLiters
        - occurredAt
        - shiftReportId
        - fuelEntryId
        - manualPurpose
        - sagaId
        - actorId
      additionalProperties: false
    SupplierResponse_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID поставщика
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        bin:
          anyOf:
            - type: string
              pattern: ^\d{12}$
            - type: 'null'
          description: БИН юр. лица (12 цифр) или null если ИП
          example: '190140012345'
        iin:
          anyOf:
            - type: string
              pattern: ^\d{12}$
            - type: 'null'
          description: ИИН ИП (12 цифр) или null если юр. лицо
          example: null
        legalName:
          type: string
          description: Полное юридическое наименование
          example: Товарищество с ограниченной ответственностью "БурТехСервис"
        shortName:
          type: string
          description: Краткое наименование для UI
        legalAddress:
          type: string
          description: Юридический адрес
        legalFormCode:
          anyOf:
            - type: string
            - type: 'null'
          description: КПФ (41/42/17/…) или null
        countryCode:
          type: string
          description: ISO 3166-1 alpha-2
        status:
          type: string
          enum:
            - draft
            - underReview
            - active
            - suspended
            - archived
          description: Статус FSM
          example: draft
        categories:
          type: array
          items:
            type: string
            enum:
              - tmc
              - fuel
              - service
              - equipment
          description: Назначенные категории
        suspendedReason:
          anyOf:
            - type: string
            - type: 'null'
          description: Причина блокировки или null
        archivedReason:
          anyOf:
            - type: string
            - type: 'null'
          description: Причина архивации или null
        submittedAt:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Когда отправлено на проверку
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
        submittedBy:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: Кто отправил на проверку
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        activatedAt:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Когда активирован (последний раз)
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
        activatedBy:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: Кто активировал
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        suspendedAt:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Когда заблокирован
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
        archivedAt:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Когда архивирован
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
        archivedCoApprovedBy:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: Второй подписант архивации (Q5)
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
      required:
        - id
        - bin
        - iin
        - legalName
        - shortName
        - legalAddress
        - legalFormCode
        - countryCode
        - status
        - categories
        - suspendedReason
        - archivedReason
        - submittedAt
        - submittedBy
        - activatedAt
        - activatedBy
        - suspendedAt
        - archivedAt
        - archivedCoApprovedBy
      title: Supplier response
      description: >-
        Карточка поставщика (контакты/счета — отдельные under
        /suppliers/{id}/contacts)
      example:
        id: 11111111-1111-4111-8111-111111111111
        bin: '190140012345'
        iin: null
        legalName: Товарищество с ограниченной ответственностью "БурТехСервис"
        shortName: ТОО БурТехСервис
        legalAddress: г. Алматы, ул. Тестовая 1
        legalFormCode: '41'
        countryCode: KZ
        status: draft
        categories:
          - tmc
        suspendedReason: null
        archivedReason: null
        submittedAt: null
        submittedBy: null
        activatedAt: null
        activatedBy: null
        suspendedAt: null
        archivedAt: null
        archivedCoApprovedBy: null
      additionalProperties: false
      x-schema-id: SupplierResponse_Output
    ListSuppliersResponse_Output:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/SupplierResponse_Output'
          description: Страница поставщиков
        nextCursor:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
          description: Курсор следующей страницы или null
          example: null
      required:
        - items
        - nextCursor
      title: List suppliers response
      description: Курсорная страница списка поставщиков
      example:
        items:
          - id: 11111111-1111-4111-8111-111111111111
            bin: '190140012345'
            iin: null
            legalName: Товарищество с ограниченной ответственностью "БурТехСервис"
            shortName: ТОО БурТехСервис
            legalAddress: г. Алматы, ул. Тестовая 1
            legalFormCode: '41'
            countryCode: KZ
            status: draft
            categories:
              - tmc
            suspendedReason: null
            archivedReason: null
            submittedAt: null
            submittedBy: null
            activatedAt: null
            activatedBy: null
            suspendedAt: null
            archivedAt: null
            archivedCoApprovedBy: null
        nextCursor: null
      additionalProperties: false
      x-schema-id: ListSuppliersResponse_Output
    CreateSupplierDto:
      type: object
      properties:
        bin:
          description: >-
            БИН юр. лица (12 цифр). Заполняется ЛИБО bin, ЛИБО iin (XOR,
            SCM-SUP-INV-02)
          example: '190140012345'
          anyOf:
            - type: string
              pattern: ^\d{12}$
            - type: 'null'
        iin:
          description: ИИН индивидуального предпринимателя (12 цифр)
          example: null
          anyOf:
            - type: string
              pattern: ^\d{12}$
            - type: 'null'
        legalName:
          type: string
          minLength: 2
          maxLength: 500
          description: Полное юридическое наименование
          example: Товарищество с ограниченной ответственностью "БурТехСервис"
        shortName:
          type: string
          minLength: 2
          maxLength: 100
          description: Краткое наименование для UI
          example: ТОО БурТехСервис
        legalAddress:
          type: string
          minLength: 5
          maxLength: 500
          description: Юридический адрес
          example: г. Алматы, ул. Тестовая 1
        countryCode:
          default: KZ
          description: ISO 3166-1 alpha-2 (по умолчанию KZ)
          example: KZ
          type: string
          minLength: 2
          maxLength: 2
        legalFormCode:
          description: КПФ (41 ТОО, 42 АО, 17 ИП). Опционально — выводится из bin/iin
          example: '41'
          anyOf:
            - type: string
              maxLength: 10
            - type: 'null'
        categories:
          minItems: 1
          type: array
          items:
            type: string
            enum:
              - tmc
              - fuel
              - service
              - equipment
          description: >-
            Категории поставщика (одна или несколько). Q2 — финальный список с
            PO
          example:
            - tmc
      required:
        - legalName
        - shortName
        - legalAddress
        - categories
      title: Create supplier request
      description: >-
        Создание поставщика в статусе draft. Активация через POST
        /suppliers/{id}/submit + /approve
      example:
        bin: '190140012345'
        iin: null
        legalName: Товарищество с ограниченной ответственностью "БурТехСервис"
        shortName: ТОО БурТехСервис
        legalAddress: г. Алматы, ул. Тестовая 1
        countryCode: KZ
        categories:
          - tmc
      additionalProperties: false
    SubmitSupplierDto:
      type: object
      properties:
        comment:
          description: Опциональный комментарий финдиректору при отправке на проверку
          example: Реквизиты заполнены, прошу проверить
          type: string
          maxLength: 500
      title: Submit supplier for review
      description: >-
        draft → under_review. Требует ≥1 primary contact + ≥1 primary bank с
        валидным IBAN (SCM-SUP-INV-05)
      example:
        comment: Реквизиты заполнены, прошу проверить
      additionalProperties: false
    ApproveSupplierDto:
      type: object
      properties:
        comment:
          description: Опциональный комментарий при approve (финдиректор/CEO)
          example: Реквизиты проверены, согласовано
          type: string
          maxLength: 500
      title: Approve supplier
      description: >-
        under_review → active. Split of duty (SCM-SUP-INV-13): approvedBy ≠
        submittedBy. Доступно ceo/admin.
      example:
        comment: Реквизиты проверены, согласовано
      additionalProperties: false
    SendBackSupplierDto:
      type: object
      properties:
        comment:
          type: string
          minLength: 10
          maxLength: 1000
          description: Что исправить (минимум 10 символов) — будет видно snabжению
          example: Уточнить юридический адрес — указан фактический
      required:
        - comment
      title: Send supplier back to draft
      description: under_review → draft. Доступно ceo/admin.
      example:
        comment: Уточнить юридический адрес — указан фактический
      additionalProperties: false
    SuspendSupplierDto:
      type: object
      properties:
        suspendedReason:
          type: string
          enum:
            - payment_delay
            - tax_issue
            - quality_complaint
            - sanction
            - other
          description: Категория причины блокировки
          example: payment_delay
        suspendedReasonText:
          type: string
          minLength: 10
          maxLength: 1000
          description: Свободный текст причины (минимум 10 символов)
          example: Просрочка оплаты по счёту № 12345 от 2026-04-01
      required:
        - suspendedReason
        - suspendedReasonText
      title: Suspend supplier
      description: >-
        active → suspended. Блокирует новые TmcInbound/FuelSupply (sync guard
        SCM-SUP-INV-03 + event business reaction SCM-SUP-INV-03c).
      example:
        suspendedReason: payment_delay
        suspendedReasonText: Просрочка оплаты по счёту № 12345 от 2026-04-01
      additionalProperties: false
    ReactivateSupplierDto:
      type: object
      properties:
        reason:
          type: string
          minLength: 10
          maxLength: 1000
          description: Обоснование снятия блокировки (минимум 10 символов)
          example: Задолженность погашена согласно платёжному поручению № 67890
      required:
        - reason
      title: Reactivate suspended supplier
      description: suspended → active. Требует, чтобы primary contact/bank были актуальны.
      example:
        reason: Задолженность погашена согласно платёжному поручению № 67890
      additionalProperties: false
    ArchiveSupplierDto:
      type: object
      properties:
        archivedReason:
          type: string
          minLength: 10
          maxLength: 1000
          description: Причина архивации (минимум 10 символов)
          example: Контракт расторгнут по соглашению сторон
        coApprovedBy:
          example: 22222222-2222-4222-8222-222222222222
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: >-
                UUID второго подписанта (Q5 — обязателен для active/suspended →
                archived; должен ≠ initiator)
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
      required:
        - archivedReason
      title: Archive supplier
      description: >-
        Terminal-переход. Двойное согласование для active/suspended
        (SCM-SUP-INV-11/-11c sync guards в use-case проверяют отсутствие open
        TmcInbound/FuelSupply/Warranty/Maintenance).
      example:
        archivedReason: Контракт расторгнут по соглашению сторон
        coApprovedBy: 22222222-2222-4222-8222-222222222222
      additionalProperties: false
    UpdateSupplierBankAccountDto:
      type: object
      properties:
        iban:
          type: string
          pattern: ^KZ[A-Z0-9]{18}$
          description: KZ IBAN (20 символов, mod-97)
        bankName:
          description: Название банка
          type: string
          minLength: 1
          maxLength: 200
        bik:
          description: БИК (8 символов) или null
          anyOf:
            - type: string
              minLength: 8
              maxLength: 8
            - type: 'null'
        bk:
          description: КБе или null
          anyOf:
            - type: string
              minLength: 1
              maxLength: 2
            - type: 'null'
        currency:
          description: ISO 4217 валюта счёта
          type: string
          minLength: 3
          maxLength: 3
        reason:
          type: string
          minLength: 10
          maxLength: 1000
          description: >-
            Причина изменения реквизитов (≥10 символов) — попадает в
            supplier_audit_log
      required:
        - reason
      title: Update supplier bank account
      description: >-
        Изменить реквизиты банковского счёта поставщика. Смена IBAN валидируется
        через mod-97 + reason. Каждое поле — запись в supplier_audit_log.
        Событие scm.supplier.updated (ADR-0028 / SCM-SUP-INV-10).
      additionalProperties: false
    SupplierBankAccountResponse_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID счёта
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        supplierId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID поставщика
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        bankName:
          type: string
          description: Название банка
        bik:
          anyOf:
            - type: string
            - type: 'null'
          description: БИК (8 символов) или null
        iban:
          type: string
          description: KZ IBAN (20 символов, mod-97)
        bk:
          anyOf:
            - type: string
            - type: 'null'
          description: КБе или null
        currency:
          type: string
          description: ISO 4217 валюта счёта (по умолчанию KZT)
        isPrimary:
          type: boolean
          description: Primary-счёт (SCM-SUP-INV-07)
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Когда создан
          example: '2026-05-18T08:00:00.000Z'
        updatedAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Когда обновлён
          example: '2026-05-18T08:00:00.000Z'
      required:
        - id
        - supplierId
        - bankName
        - bik
        - iban
        - bk
        - currency
        - isPrimary
        - createdAt
        - updatedAt
      title: Supplier bank account response
      description: Банковский счёт поставщика (ADR-0028 secondary entity)
      additionalProperties: false
      x-schema-id: SupplierBankAccountResponse_Output
    TmcItemResponse_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID позиции
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        nomenclatureCode:
          type: string
        name:
          type: string
        category:
          type: string
          enum:
            - drill_tool
            - spare
            - consumable
            - other
        unit:
          type: string
        assetClassId:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: UUID AssetClass
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        lastPurchasePrice:
          type: number
          minimum: 0
        weightedAvgPrice:
          type: number
          minimum: 0
        active:
          type: boolean
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Когда создано
          example: '2026-05-18T08:00:00.000Z'
        updatedAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Когда обновлено
          example: '2026-05-18T08:00:00.000Z'
      required:
        - id
        - nomenclatureCode
        - name
        - category
        - unit
        - assetClassId
        - lastPurchasePrice
        - weightedAvgPrice
        - active
        - createdAt
        - updatedAt
      title: TMC item response
      description: Карточка позиции номенклатуры ТМЦ
      additionalProperties: false
      x-schema-id: TmcItemResponse_Output
    ListTmcItemsResponse_Output:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/TmcItemResponse_Output'
        nextCursor:
          anyOf:
            - type: string
            - type: 'null'
      required:
        - items
        - nextCursor
      title: List TMC items response
      additionalProperties: false
      x-schema-id: ListTmcItemsResponse_Output
    CreateTmcItemDto:
      type: object
      properties:
        nomenclatureCode:
          type: string
          minLength: 1
          maxLength: 64
          description: Уникальный код номенклатуры в рамках организации
          example: DRL-BIT-152
        name:
          type: string
          minLength: 2
          maxLength: 500
          description: Полное наименование позиции
          example: Долото буровое 152мм
        category:
          type: string
          enum:
            - drill_tool
            - spare
            - consumable
            - other
          description: Классификатор позиции (TmcCategory)
          example: drill_tool
        unit:
          type: string
          enum:
            - шт
            - кг
            - л
            - м
            - компл
          description: Единица измерения
          example: шт
        assetClassId:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: UUID AssetClass из eam/assets — для запчастей
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        initialPrice:
          description: Начальная цена (если есть остаток на старте)
          example: 0
          type: number
          minimum: 0
      required:
        - nomenclatureCode
        - name
        - category
        - unit
      title: Create TMC item
      description: Создание позиции номенклатуры ТМЦ в справочнике
      additionalProperties: false
    UpdateTmcItemDto:
      type: object
      properties:
        name:
          type: string
          minLength: 2
          maxLength: 500
        assetClassId:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: UUID AssetClass
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
      title: Update TMC item
      description: Изменяемые поля карточки номенклатуры
      additionalProperties: false
    RecordTmcInboundDto:
      type: object
      properties:
        warehouseId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: Склад-получатель
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        source:
          type: string
          enum:
            - supplier
            - transfer
            - return
        supplierId:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: UUID поставщика (для source=supplier)
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        inboundDate:
          type: string
          format: date
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
          description: Дата поступления (ISO date)
        documentNumber:
          type: string
          minLength: 1
          maxLength: 100
          description: Номер документа-основания (TMC-INV-07 — обязательно)
        documentReference:
          anyOf:
            - type: string
              format: uri
            - type: 'null'
        requestId:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: UUID связанной заявки
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        receivedById:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID получателя из hr/personnel
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        lines:
          minItems: 1
          type: array
          items:
            type: object
            properties:
              itemId:
                type: string
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                description: UUID позиции номенклатуры
                example: 11111111-1111-4111-8111-111111111111
                format: uuid
              quantity:
                type: number
                exclusiveMinimum: 0
              pricePerUnit:
                type: number
                minimum: 0
            required:
              - itemId
              - quantity
              - pricePerUnit
      required:
        - warehouseId
        - source
        - inboundDate
        - documentNumber
        - receivedById
        - lines
      title: Record TMC inbound document
      description: >-
        Регистрация документа поступления ТМЦ. Создаёт TmcInbound +
        TmcInboundLine + TmcMovement(inbound) + UPDATE TmcBalance + recalc
        weightedAvgPrice (TMC-INV-12).
      additionalProperties: false
    RecordTmcInboundResult_Output:
      type: object
      properties:
        inboundId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID документа поступления
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        warehouseId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID склада
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        totalAmount:
          type: number
          minimum: 0
        lineCount:
          type: integer
          minimum: 0
          maximum: 9007199254740991
      required:
        - inboundId
        - warehouseId
        - totalAmount
        - lineCount
      additionalProperties: false
      x-schema-id: RecordTmcInboundResult_Output
    RecordTmcManualConsumptionDto:
      type: object
      properties:
        warehouseId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: Склад-источник
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        assetId:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: UUID Asset (для запчастей; через eam/assets)
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        targetObjectId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID ProductionObject — куда списано
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        reason:
          type: string
          enum:
            - planned_to
            - repair
            - production
            - loss
          description: Основание списания (для manual_act обязательно)
        documentReference:
          anyOf:
            - type: string
              format: uri
            - type: 'null'
        occurredAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Когда произошло списание (ISO datetime)
        lines:
          minItems: 1
          type: array
          items:
            type: object
            properties:
              itemId:
                type: string
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                description: UUID позиции
                example: 11111111-1111-4111-8111-111111111111
                format: uuid
              quantity:
                type: number
                exclusiveMinimum: 0
            required:
              - itemId
              - quantity
      required:
        - warehouseId
        - targetObjectId
        - reason
        - occurredAt
        - lines
      title: Record manual consumption (manual_act)
      description: >-
        Регистрация ручного акта списания. Создаёт
        TmcConsumption(mode=manual_act) + lines +
        TmcMovement(consumption_manual) + UPDATE TmcBalance. pricePerUnit =
        текущая weightedAvgPrice TmcItem.
      additionalProperties: false
    RecordTmcManualConsumptionResult_Output:
      type: object
      properties:
        consumptionId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID документа списания
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        warehouseId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID склада
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        lineCount:
          type: integer
          minimum: 0
          maximum: 9007199254740991
      required:
        - consumptionId
        - warehouseId
        - lineCount
      additionalProperties: false
      x-schema-id: RecordTmcManualConsumptionResult_Output
    TmcTransferResponse_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID перемещения
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        fromWarehouseId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID склада-источника
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        toWarehouseId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID склада-получателя
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        status:
          type: string
          enum:
            - issued
            - confirmed
        transferDate:
          type: string
        documentNumber:
          type: string
        issuedById:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID отправителя
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        confirmedById:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: UUID подтвердившего (null до confirm)
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        issuedAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Когда отправлено
          example: '2026-05-18T08:00:00.000Z'
        confirmedAt:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Когда подтверждено
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
        lines:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                description: UUID строки
                example: 11111111-1111-4111-8111-111111111111
                format: uuid
              itemId:
                type: string
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                description: UUID позиции
                example: 11111111-1111-4111-8111-111111111111
                format: uuid
              quantity:
                type: number
                exclusiveMinimum: 0
            required:
              - id
              - itemId
              - quantity
            additionalProperties: false
      required:
        - id
        - fromWarehouseId
        - toWarehouseId
        - status
        - transferDate
        - documentNumber
        - issuedById
        - confirmedById
        - issuedAt
        - confirmedAt
        - lines
      title: TMC transfer response
      additionalProperties: false
      x-schema-id: TmcTransferResponse_Output
    ListTmcTransfersResponse_Output:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/TmcTransferResponse_Output'
        nextCursor:
          anyOf:
            - type: string
            - type: 'null'
      required:
        - items
        - nextCursor
      additionalProperties: false
      x-schema-id: ListTmcTransfersResponse_Output
    IssueTmcTransferDto:
      type: object
      properties:
        fromWarehouseId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: Склад-источник
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        toWarehouseId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: Склад-получатель
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        transferDate:
          type: string
          format: date
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
        documentNumber:
          type: string
          minLength: 1
          maxLength: 100
        lines:
          minItems: 1
          type: array
          items:
            type: object
            properties:
              itemId:
                type: string
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                description: UUID позиции
                example: 11111111-1111-4111-8111-111111111111
                format: uuid
              quantity:
                type: number
                exclusiveMinimum: 0
            required:
              - itemId
              - quantity
      required:
        - fromWarehouseId
        - toWarehouseId
        - transferDate
        - documentNumber
        - lines
      title: Issue TMC transfer
      description: >-
        Регистрация перемещения ТМЦ между складами. Создаёт
        TmcTransfer(status=issued) + TmcMovement(transfer_out) + decrement
        TmcBalance(from).
      additionalProperties: false
    ConfirmTmcTransferDto:
      type: object
      properties:
        note:
          type: string
          maxLength: 500
      title: Confirm TMC transfer arrival
      description: >-
        Подтверждение прибытия (issued → confirmed). Создаёт
        TmcMovement(transfer_in) + increment TmcBalance(to).
      additionalProperties: false
    TmcRequestResponse_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID заявки
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        warehouseId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: Склад
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        createdById:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: Создатель
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        justification:
          type: string
        status:
          type: string
          enum:
            - draft
            - sent
            - approved
            - in_progress
            - fulfilled
            - rejected
        approvedById:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: Согласовавший
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        approvedAt:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Когда согласовано
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
        rejectReason:
          anyOf:
            - type: string
            - type: 'null'
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Создано
          example: '2026-05-18T08:00:00.000Z'
        updatedAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Обновлено
          example: '2026-05-18T08:00:00.000Z'
        lines:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                description: UUID строки
                example: 11111111-1111-4111-8111-111111111111
                format: uuid
              itemId:
                type: string
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                description: UUID позиции
                example: 11111111-1111-4111-8111-111111111111
                format: uuid
              quantity:
                type: number
                exclusiveMinimum: 0
              fulfilledQuantity:
                type: number
                minimum: 0
            required:
              - id
              - itemId
              - quantity
              - fulfilledQuantity
            additionalProperties: false
      required:
        - id
        - warehouseId
        - createdById
        - justification
        - status
        - approvedById
        - approvedAt
        - rejectReason
        - createdAt
        - updatedAt
        - lines
      additionalProperties: false
      x-schema-id: TmcRequestResponse_Output
    ListTmcRequestsResponse_Output:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/TmcRequestResponse_Output'
        nextCursor:
          anyOf:
            - type: string
            - type: 'null'
      required:
        - items
        - nextCursor
      additionalProperties: false
      x-schema-id: ListTmcRequestsResponse_Output
    CreateTmcRequestDto:
      type: object
      properties:
        warehouseId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: Целевой склад
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        justification:
          type: string
          minLength: 3
          maxLength: 2000
        lines:
          minItems: 1
          type: array
          items:
            type: object
            properties:
              itemId:
                type: string
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                description: UUID позиции
                example: 11111111-1111-4111-8111-111111111111
                format: uuid
              quantity:
                type: number
                exclusiveMinimum: 0
            required:
              - itemId
              - quantity
      required:
        - warehouseId
        - justification
        - lines
      title: Create TMC request (draft)
      additionalProperties: false
    SubmitTmcRequestDto:
      type: object
      properties: {}
      additionalProperties: false
    ApproveTmcRequestDto:
      type: object
      properties: {}
      additionalProperties: false
    RejectTmcRequestDto:
      type: object
      properties:
        reason:
          type: string
          minLength: 3
          maxLength: 500
      required:
        - reason
      additionalProperties: false
    ReturnTmcRequestToDraftDto:
      type: object
      properties:
        comment:
          type: string
          minLength: 3
          maxLength: 500
      required:
        - comment
      additionalProperties: false
    StartTmcRequestDto:
      type: object
      properties: {}
      additionalProperties: false
    FulfillTmcRequestDto:
      type: object
      properties:
        linkedInboundIds:
          type: array
          items:
            type: string
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            description: UUID связанного TmcInbound
            example: 11111111-1111-4111-8111-111111111111
            format: uuid
      required:
        - linkedInboundIds
      additionalProperties: false
    TmcInventoryResponse_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID инвентаризации
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        warehouseId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: Склад
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        inventoryDate:
          type: string
        responsibleId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: Ответственный
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        status:
          type: string
          enum:
            - in_progress
            - completed
        completedAt:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Когда завершено
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
        documentReference:
          anyOf:
            - type: string
            - type: 'null'
        lines:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                description: UUID строки
                example: 11111111-1111-4111-8111-111111111111
                format: uuid
              itemId:
                type: string
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                description: UUID позиции
                example: 11111111-1111-4111-8111-111111111111
                format: uuid
              bookQuantity:
                type: number
                minimum: 0
              actualQuantity:
                type: number
                minimum: 0
              variance:
                type: number
              adjustmentReason:
                anyOf:
                  - type: string
                  - type: 'null'
            required:
              - id
              - itemId
              - bookQuantity
              - actualQuantity
              - variance
              - adjustmentReason
            additionalProperties: false
      required:
        - id
        - warehouseId
        - inventoryDate
        - responsibleId
        - status
        - completedAt
        - documentReference
        - lines
      additionalProperties: false
      x-schema-id: TmcInventoryResponse_Output
    ListTmcInventoriesResponse_Output:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/TmcInventoryResponse_Output'
        nextCursor:
          anyOf:
            - type: string
            - type: 'null'
      required:
        - items
        - nextCursor
      additionalProperties: false
      x-schema-id: ListTmcInventoriesResponse_Output
    StartTmcInventoryDto:
      type: object
      properties:
        warehouseId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: Склад
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        inventoryDate:
          type: string
          format: date
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
        documentReference:
          anyOf:
            - type: string
              format: uri
            - type: 'null'
      required:
        - warehouseId
        - inventoryDate
      title: Start TMC inventory
      description: >-
        Создаёт TmcInventory(in_progress) + lines snapshot из TmcBalance для
        всех позиций склада с quantity > 0.
      additionalProperties: false
    CompleteTmcInventoryDto:
      type: object
      properties:
        lines:
          minItems: 1
          type: array
          items:
            type: object
            properties:
              lineId:
                type: string
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                description: UUID строки
                example: 11111111-1111-4111-8111-111111111111
                format: uuid
              actualQuantity:
                type: number
                minimum: 0
              adjustmentReason:
                anyOf:
                  - type: string
                    minLength: 3
                    maxLength: 500
                  - type: 'null'
            required:
              - lineId
              - actualQuantity
      required:
        - lines
      additionalProperties: false
    TmcBalanceResponse_Output:
      type: object
      properties:
        itemId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID позиции
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        warehouseId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID склада
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        quantity:
          type: number
          minimum: 0
        minStock:
          type: number
          minimum: 0
        isLowStock:
          type: boolean
        updatedAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Когда обновлено
          example: '2026-05-18T08:00:00.000Z'
      required:
        - itemId
        - warehouseId
        - quantity
        - minStock
        - isLowStock
        - updatedAt
      additionalProperties: false
      title: TMC balance response
      x-schema-id: TmcBalanceResponse_Output
    ListTmcBalancesResponse_Output:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/TmcBalanceResponse_Output'
        nextCursor:
          anyOf:
            - type: string
            - type: 'null'
      required:
        - items
        - nextCursor
      additionalProperties: false
      x-schema-id: ListTmcBalancesResponse_Output
    GlobalSagaStepStatus_Output:
      type: object
      properties:
        stepName:
          type: string
          description: Имя шага саги
          example: reserveAsset
        status:
          type: string
          description: Статус шага (pending, completed, failed, compensated)
          example: completed
        at:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Время записи статуса шага
          example: '2026-05-18T08:00:00.000Z'
        error:
          anyOf:
            - type: string
            - type: 'null'
          description: Текст ошибки шага или null
          example: null
      required:
        - stepName
        - status
        - at
        - error
      additionalProperties: false
      title: Saga step status
      description: Статус одного шага саги (глобальный endpoint)
      example:
        stepName: reserveAsset
        status: completed
        at: '2026-05-25T08:30:15.123Z'
        error: null
      x-schema-id: GlobalSagaStepStatus_Output
    GlobalSagaStatus_Output:
      type: object
      properties:
        sagaId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID саги
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        steps:
          type: array
          items:
            $ref: '#/components/schemas/GlobalSagaStepStatus_Output'
          description: Хронология шагов саги в порядке возрастания времени
      required:
        - sagaId
        - steps
      title: Saga status response
      description: >-
        Прогресс любой запущенной саги — список шагов из saga_log. Универсальный
        endpoint для опроса async-саг (EAM/PRD/HR/...).
      example:
        sagaId: 11111111-1111-4111-8111-111111111111
        steps:
          - stepName: reserveAsset
            status: completed
            at: '2026-05-25T08:30:15.123Z'
            error: null
          - stepName: markDecommissioned
            status: completed
            at: '2026-05-25T08:30:16.456Z'
            error: null
      additionalProperties: false
      x-schema-id: GlobalSagaStatus_Output
    AuditLogEntry_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID записи audit log
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        entity:
          type: string
          description: Тип сущности (PascalCase в коде, snake/kebab в логе)
          example: asset
        entityId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID сущности, для которой записан audit
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        action:
          type: string
          description: Действие
          example: decommission-saga
        actorId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID пользователя-актора (UserAccount.id)
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        at:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Время записи
          example: '2026-05-18T08:00:00.000Z'
        before:
          anyOf:
            - {}
            - type: 'null'
          description: Состояние до изменения (JSON)
          example:
            status: operational
        after:
          anyOf:
            - {}
            - type: 'null'
          description: Состояние после изменения (JSON)
          example:
            status: decommissioned
        metadata:
          anyOf:
            - {}
            - type: 'null'
          description: Дополнительные метаданные (JSON)
          example:
            correlationId: 44444444-4444-4444-8444-444444444444
      required:
        - id
        - entity
        - entityId
        - action
        - actorId
        - at
        - before
        - after
        - metadata
      additionalProperties: false
      title: Audit log entry
      description: Одна запись audit log — кто/что/когда изменил
      example:
        id: 11111111-1111-4111-8111-111111111111
        entity: asset
        entityId: 22222222-2222-4222-8222-222222222222
        action: decommission-saga
        actorId: 33333333-3333-4333-8333-333333333333
        at: '2026-05-25T08:30:15.123Z'
        before:
          status: operational
        after:
          status: decommissioned
        metadata:
          correlationId: 44444444-4444-4444-8444-444444444444
      x-schema-id: AuditLogEntry_Output
    AuditLogPage_Output:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/AuditLogEntry_Output'
          description: Записи в порядке убывания времени (новые сверху)
        nextCursor:
          anyOf:
            - type: string
            - type: 'null'
          description: >-
            ISO-timestamp последней записи в этой странице. Подставить в
            `cursor` параметр для следующей страницы. null — больше нет страниц.
          example: '2026-05-25T08:30:15.123Z'
      required:
        - items
        - nextCursor
      title: Audit log page
      description: Cursor-пагинированный список записей audit log
      example:
        items:
          - id: 11111111-1111-4111-8111-111111111111
            entity: asset
            entityId: 22222222-2222-4222-8222-222222222222
            action: decommission-saga
            actorId: 33333333-3333-4333-8333-333333333333
            at: '2026-05-25T08:30:15.123Z'
            before:
              status: operational
            after:
              status: decommissioned
            metadata:
              correlationId: 44444444-4444-4444-8444-444444444444
        nextCursor: '2026-05-25T08:30:15.123Z'
      additionalProperties: false
      x-schema-id: AuditLogPage_Output
    Uuid:
      type: string
      format: uuid
      pattern: >-
        ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
      description: UUID v4
      example: 11111111-1111-4111-8111-111111111111
    RefRegistryEntryDto_Output:
      type: object
      properties:
        module:
          type: string
          description: Код модуля-владельца
          example: core
        entity:
          type: string
          description: Имя сущности справочника
          example: production-objects
        displayName:
          type: string
          description: Человекочитаемое название
          example: Производственные объекты
        ownerModule:
          type: string
          description: Модуль, ответственный за данные
          example: core
        readPath:
          type: string
          description: Базовый путь API для чтения справочника
          example: /api/v1/core/refs/production-objects
      required:
        - module
        - entity
        - displayName
        - ownerModule
        - readPath
      title: Reference registry entry
      description: Запись discovery-реестра справочников (ADR-0014)
      example:
        module: core
        entity: production-objects
        displayName: Производственные объекты
        ownerModule: core
        readPath: /api/v1/core/refs/production-objects
      additionalProperties: false
      x-schema-id: RefRegistryEntry_Output
    ProductionObjectResponseDto_Output:
      type: object
      properties:
        id:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID производственного объекта
          example: 11111111-1111-4111-8111-111111111111
        code:
          type: string
          description: Код объекта (бизнес-ключ)
          example: BORLY
        name:
          type: string
          description: Наименование объекта
          example: Участок Борлы
        region:
          anyOf:
            - type: string
            - type: 'null'
          description: Регион / местоположение
          example: Караганда
        active:
          type: boolean
          description: Признак активности
          example: true
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Дата создания (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
        updatedAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Дата последнего обновления (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
      required:
        - id
        - code
        - name
        - region
        - active
        - createdAt
        - updatedAt
      title: Production object response
      description: Производственный объект (core/refs/production-objects)
      example:
        id: 11111111-1111-4111-8111-111111111111
        code: BORLY
        name: Участок Борлы
        region: Караганда
        active: true
        createdAt: '2026-05-18T08:00:00.000Z'
        updatedAt: '2026-05-18T08:00:00.000Z'
      additionalProperties: false
      x-schema-id: ProductionObjectResponse_Output
    RefImportDiffDto_Output:
      type: object
      properties:
        willCreate:
          type: array
          items: {}
          description: Строки, которые будут созданы
          example:
            - code: MECH
              name: Механик
              active: true
        willUpdate:
          type: array
          items:
            type: object
            properties:
              current:
                description: Текущее состояние записи в БД
              next:
                description: Состояние после применения импорта
            required:
              - current
              - next
            additionalProperties: false
          description: Строки, которые будут обновлены (current vs next)
          example:
            - current:
                code: MECH
                name: Механик (старое)
                active: true
              next:
                code: MECH
                name: Механик
                active: true
        willDeactivate:
          type: array
          items: {}
          description: Записи, которые будут деактивированы (режим full_replace)
          example:
            - code: LEGACY
              name: Устаревшая должность
              active: false
        errors:
          type: array
          items:
            type: object
            properties:
              rowNumber:
                type: integer
                minimum: -9007199254740991
                maximum: 9007199254740991
                description: Номер строки в исходном файле (1-based)
                example: 3
              field:
                description: Поле с ошибкой, если применимо
                example: code
                type: string
              message:
                type: string
                description: Текст ошибки валидации
                example: Дубликат кода MECH
            required:
              - rowNumber
              - message
            additionalProperties: false
          description: Ошибки валидации по строкам
          example:
            - rowNumber: 3
              field: code
              message: Дубликат кода MECH
      required:
        - willCreate
        - willUpdate
        - willDeactivate
        - errors
      additionalProperties: false
      title: Reference import diff
      description: Сводка изменений preview bulk-импорта
      example:
        willCreate:
          - code: MECH
            name: Механик
            active: true
        willUpdate:
          - current:
              code: MECH
              name: Механик (старое)
              active: true
            next:
              code: MECH
              name: Механик
              active: true
        willDeactivate:
          - code: LEGACY
            name: Устаревшая должность
            active: false
        errors:
          - rowNumber: 3
            field: code
            message: Дубликат кода MECH
      x-schema-id: RefImportDiff_Output
    RefImportPreviewResponseDto_Output:
      type: object
      properties:
        batchId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID batch'а для commit
          example: 11111111-1111-4111-8111-111111111111
        module:
          type: string
          description: Код модуля-владельца (core, eam, hr, scm, …)
          example: hr
        entity:
          type: string
          description: Имя сущности справочника (kebab-case)
          example: positions
        mode:
          type: string
          enum:
            - merge
            - full_replace
          description: Режим импорта, применённый при preview
          example: merge
        totalRows:
          type: integer
          minimum: 0
          maximum: 9007199254740991
          description: Количество строк в запросе
          example: 1
        diff:
          $ref: '#/components/schemas/RefImportDiff_Output'
        expiresAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Время истечения preview batch (ISO 8601)
          example: '2026-05-19T12:00:00.000Z'
      required:
        - batchId
        - module
        - entity
        - mode
        - totalRows
        - diff
        - expiresAt
      title: Reference import preview response
      description: Результат preview bulk-импорта справочника
      example:
        batchId: 22222222-2222-4222-8222-222222222222
        module: hr
        entity: positions
        mode: merge
        totalRows: 1
        diff:
          willCreate:
            - code: MECH
              name: Механик
              active: true
          willUpdate:
            - current:
                code: MECH
                name: Механик (старое)
                active: true
              next:
                code: MECH
                name: Механик
                active: true
          willDeactivate:
            - code: LEGACY
              name: Устаревшая должность
              active: false
          errors:
            - rowNumber: 3
              field: code
              message: Дубликат кода MECH
        expiresAt: '2026-05-18T08:00:00.000Z'
      additionalProperties: false
      x-schema-id: RefImportPreviewResponse_Output
    RefImportCommitResponseDto_Output:
      type: object
      properties:
        batchId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID применённого batch'а
          example: 11111111-1111-4111-8111-111111111111
        status:
          type: string
          const: committed
          description: Статус применения
          example: committed
        applied:
          type: object
          properties:
            created:
              type: integer
              minimum: 0
              maximum: 9007199254740991
              description: Количество созданных записей
              example: 1
            updated:
              type: integer
              minimum: 0
              maximum: 9007199254740991
              description: Количество обновлённых записей
              example: 0
            deactivated:
              type: integer
              minimum: 0
              maximum: 9007199254740991
              description: Количество деактивированных записей
              example: 0
          additionalProperties: false
          description: Счётчики применённых изменений
          example:
            created: 1
            updated: 0
            deactivated: 0
        eventId:
          type: string
          description: Идентификатор доменного события импорта
          example: evt-import-001
      required:
        - batchId
        - status
        - applied
        - eventId
      title: Reference import commit response
      description: Результат commit bulk-импорта справочника
      example:
        batchId: 22222222-2222-4222-8222-222222222222
        status: committed
        applied:
          created: 1
          updated: 0
          deactivated: 0
        eventId: evt-import-001
      additionalProperties: false
      x-schema-id: RefImportCommitResponse_Output
    TmcCategoryResponseDto_Output:
      type: object
      properties:
        id:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID категории ТМЦ
          example: 11111111-1111-4111-8111-111111111111
        code:
          type: string
          description: Код категории
          example: FUEL
        name:
          type: string
          description: Наименование категории
          example: ГСМ
        parentId:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
          description: UUID родительской категории или null для корня
          example: null
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Дата создания (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
      required:
        - id
        - code
        - name
        - parentId
        - createdAt
      title: TMC category response
      description: Категория ТМЦ (иерархический справочник)
      example:
        id: 11111111-1111-4111-8111-111111111111
        code: FUEL
        name: ГСМ
        parentId: null
        createdAt: '2026-05-18T08:00:00.000Z'
      additionalProperties: false
      x-schema-id: TmcCategoryResponse_Output
    DowntimeCategoryResponseDto_Output:
      type: object
      properties:
        id:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID категории простоя
          example: 11111111-1111-4111-8111-111111111111
        code:
          type: string
          description: Код категории
          example: PLAN-TO
        name:
          type: string
          description: Наименование
          example: Плановое ТО
        group:
          type: string
          description: 'Группа: planned или unplanned'
          example: planned
        parentId:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
          description: UUID родительской категории или null
          example: null
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Дата создания (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
      required:
        - id
        - code
        - name
        - group
        - parentId
        - createdAt
      title: Downtime category response
      description: Категория простоя оборудования
      example:
        id: 11111111-1111-4111-8111-111111111111
        code: PLAN-TO
        name: Плановое ТО
        group: planned
        parentId: null
        createdAt: '2026-05-18T08:00:00.000Z'
      additionalProperties: false
      x-schema-id: DowntimeCategoryResponse_Output
    HseIncidentClassifierResponseDto_Output:
      type: object
      properties:
        id:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID классификатора
          example: 11111111-1111-4111-8111-111111111111
        code:
          type: string
          description: Код классификатора
          example: NEAR-MISS
        group:
          type: string
          description: Группа инцидента
          example: safety
        severity:
          type: string
          description: Уровень серьёзности
          example: low
        name:
          type: string
          description: Наименование
          example: Почти инцидент
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Дата создания (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
      required:
        - id
        - code
        - group
        - severity
        - name
        - createdAt
      title: HSE incident classifier response
      description: Классификатор инцидентов HSE
      example:
        id: 11111111-1111-4111-8111-111111111111
        code: NEAR-MISS
        group: safety
        severity: low
        name: Почти инцидент
        createdAt: '2026-05-18T08:00:00.000Z'
      additionalProperties: false
      x-schema-id: HseIncidentClassifierResponse_Output
    AssetClassResponseDto_Output:
      type: object
      properties:
        id:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID класса актива
          example: 11111111-1111-4111-8111-111111111111
        code:
          type: string
          description: Код класса (бизнес-ключ)
          example: DRILL
        name:
          type: string
          description: Наименование класса
          example: Буровая установка
        active:
          type: boolean
          description: Признак активности
          example: true
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Дата создания (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
      required:
        - id
        - code
        - name
        - active
        - createdAt
      title: Asset class response
      description: Класс актива EAM (eam/refs/asset-classes)
      example:
        id: 11111111-1111-4111-8111-111111111111
        code: DRILL
        name: Буровая установка
        active: true
        createdAt: '2026-05-18T08:00:00.000Z'
      additionalProperties: false
      x-schema-id: AssetClassResponse_Output
    NormResponseDto_Output:
      type: object
      properties:
        id:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID норматива
          example: 11111111-1111-4111-8111-111111111111
        assetClassCode:
          type: string
          description: Код класса актива
          example: DRILL
        norm:
          type: string
          description: Код норматива
          example: engine-oil-500h
        value:
          type: number
          description: Значение норматива
          example: 500
        unit:
          type: string
          description: Единица измерения
          example: hours
        validFrom:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Начало действия норматива
          example: '2026-01-01T00:00:00.000Z'
        validTo:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
            - type: 'null'
          description: Окончание действия или null
          example: null
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Дата создания записи
          example: '2026-01-01T00:00:00.000Z'
      required:
        - id
        - assetClassCode
        - norm
        - value
        - unit
        - validFrom
        - validTo
        - createdAt
      title: Norm response
      description: Temporal-норматив EAM
      example:
        id: 11111111-1111-4111-8111-111111111111
        assetClassCode: DRILL
        norm: engine-oil-500h
        value: 500
        unit: hours
        validFrom: '2026-01-01T00:00:00.000Z'
        validTo: null
        createdAt: '2026-01-01T00:00:00.000Z'
      additionalProperties: false
      x-schema-id: NormResponse_Output
    SystemRoleResponseDto_Output:
      type: object
      properties:
        id:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID системной роли
          example: 11111111-1111-4111-8111-111111111111
        code:
          type: string
          description: Код роли (бизнес-ключ, совпадает с SystemRole)
          example: Mechanic
        name:
          type: string
          description: Отображаемое имя роли
          example: Механик
        description:
          anyOf:
            - type: string
            - type: 'null'
          description: Описание назначения роли
          example: Обслуживание и ремонт техники на объекте
        permissions:
          type: array
          items:
            type: object
            propertyNames:
              type: string
            additionalProperties: {}
            description: Правило CASL (action, subject, conditions, …)
            example:
              action: read
              subject: Asset
          description: Массив правил CASL для RBAC
          example:
            - action: read
              subject: Asset
        scopeByObject:
          type: boolean
          description: Ограничивать доступ по производственному объекту
          example: true
        version:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: Версия конфигурации роли (инкремент при смене permissions)
          example: 1
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Дата создания (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
        updatedAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Дата последнего обновления (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
      required:
        - id
        - code
        - name
        - description
        - permissions
        - scopeByObject
        - version
        - createdAt
        - updatedAt
      title: System role response
      description: Системная роль с правами CASL (hr/refs/system-roles)
      example:
        id: 11111111-1111-4111-8111-111111111111
        code: Mechanic
        name: Механик
        description: Обслуживание и ремонт техники на объекте
        permissions:
          - action: read
            subject: Asset
        scopeByObject: true
        version: 1
        createdAt: '2026-05-18T08:00:00.000Z'
        updatedAt: '2026-05-18T08:00:00.000Z'
      additionalProperties: false
      x-schema-id: SystemRoleResponse_Output
    SimpleRefResponseDto_Output:
      type: object
      properties:
        id:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID записи справочника
          example: 11111111-1111-4111-8111-111111111111
        code:
          type: string
          description: Бизнес-код (уникальный ключ)
          example: MECH
        name:
          type: string
          description: Наименование
          example: Механик
        active:
          type: boolean
          description: Признак активности записи
          example: true
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Дата создания (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
      required:
        - id
        - code
        - name
        - active
        - createdAt
      title: Simple reference response
      description: Запись простого справочника (code + name + active)
      example:
        id: 11111111-1111-4111-8111-111111111111
        code: MECH
        name: Механик
        active: true
        createdAt: '2026-05-18T08:00:00.000Z'
      additionalProperties: false
      x-schema-id: SimpleRefResponse_Output
    AssetResponseDto_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID актива
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        inventoryNumber:
          type: string
          minLength: 1
          maxLength: 50
          description: >-
            Инвентарный номер актива (может отличаться от формата БС-001 для
            legacy-записей)
          example: БС-001
        name:
          type: string
          description: Наименование актива
          example: Atlas Copco DM45 №1
        assetClassId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID класса актива (asset_classes)
          example: 22222222-2222-4222-8222-222222222222
          format: uuid
        currentObjectId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID производственного объекта размещения
          example: 33333333-3333-4333-8333-333333333333
          format: uuid
        responsibleMechanicId:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: UUID ответственного механика (nullable)
              example: 44444444-4444-4444-8444-444444444444
              format: uuid
            - type: 'null'
        status:
          type: string
          enum:
            - operational
            - maintenance
            - conserved
            - decommissioned
          description: Статус FSM актива
          example: operational
        commissionedAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Дата ввода в эксплуатацию (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
        passport:
          $ref: '#/components/schemas/AssetPassport_Output'
      required:
        - id
        - inventoryNumber
        - name
        - assetClassId
        - currentObjectId
        - responsibleMechanicId
        - status
        - commissionedAt
        - passport
      title: Asset response
      description: Производственный актив
      example:
        id: 11111111-1111-4111-8111-111111111111
        inventoryNumber: БС-001
        name: Atlas Copco DM45 №1
        assetClassId: 22222222-2222-4222-8222-222222222222
        currentObjectId: 33333333-3333-4333-8333-333333333333
        responsibleMechanicId: 44444444-4444-4444-8444-444444444444
        status: operational
        commissionedAt: '2026-05-18T08:00:00.000Z'
        passport:
          manufacturer: Atlas Copco
          model: DM45
          productionYear: 2020
          specifications:
            engineHours: 12500
      additionalProperties: false
      x-schema-id: AssetResponse_Output
    AssetPassportDto_Output:
      type: object
      properties:
        manufacturer:
          type: string
          description: Производитель оборудования
          example: Atlas Copco
        model:
          type: string
          description: Модель оборудования
          example: DM45
        productionYear:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: Год выпуска (1980 — текущий год)
          example: 2020
        specifications:
          type: object
          propertyNames:
            type: string
          additionalProperties: {}
          description: Технические характеристики (json, зависит от класса актива)
          example:
            engineHours: 12500
      required:
        - manufacturer
        - model
        - productionYear
        - specifications
      additionalProperties: false
      title: Asset passport
      description: Паспортные данные производственного актива
      x-schema-id: AssetPassport_Output
    ListAssetsResponseDto_Output:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/AssetResponse_Output'
          description: Страница активов
        nextCursor:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
          description: Курсор следующей страницы или null
          example: null
      required:
        - items
        - nextCursor
      title: List assets response
      description: Курсорная страница списка активов
      example:
        items:
          - id: 11111111-1111-4111-8111-111111111111
            inventoryNumber: БС-001
            name: Atlas Copco DM45 №1
            assetClassId: 22222222-2222-4222-8222-222222222222
            currentObjectId: 33333333-3333-4333-8333-333333333333
            responsibleMechanicId: 44444444-4444-4444-8444-444444444444
            status: operational
            commissionedAt: '2026-05-18T08:00:00.000Z'
            passport:
              manufacturer: Atlas Copco
              model: DM45
              productionYear: 2020
              specifications:
                engineHours: 12500
        nextCursor: null
      additionalProperties: false
      x-schema-id: ListAssetsResponse_Output
    MaintenanceRecordResponseDto_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID записи ТО
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        assetId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID актива
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        status:
          type: string
          enum:
            - scheduled
            - inProgress
            - completed
            - cancelled
          description: Статус FSM записи ТО
          example: scheduled
        scheduledAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Плановая дата и время ТО (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
        startedAt:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Фактическое начало ТО
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
        completedAt:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Фактическое завершение ТО
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
        cancelledAt:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Дата и время отмены
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
        cancelledBy:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: UUID пользователя, отменившего ТО
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        cancellationReason:
          anyOf:
            - type: string
            - type: 'null'
          description: Причина отмены или null
          example: null
        reason:
          type: string
          description: Причина / описание ТО
          example: Плановое ТО по моточасам
        performedBy:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID исполнителя (механик / инженер)
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
      required:
        - id
        - assetId
        - status
        - scheduledAt
        - startedAt
        - completedAt
        - cancelledAt
        - cancelledBy
        - cancellationReason
        - reason
        - performedBy
      title: Maintenance record response
      description: Запись технического обслуживания актива
      example:
        id: 11111111-1111-4111-8111-111111111111
        assetId: 22222222-2222-4222-8222-222222222222
        status: scheduled
        scheduledAt: '2026-05-18T08:00:00.000Z'
        startedAt: null
        completedAt: null
        cancelledAt: null
        cancelledBy: null
        cancellationReason: null
        reason: Плановое ТО по моточасам
        performedBy: 44444444-4444-4444-8444-444444444444
      additionalProperties: false
      x-schema-id: MaintenanceRecordResponse_Output
    ListMaintenanceResponseDto_Output:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/MaintenanceRecordResponse_Output'
          description: Страница записей ТО
        nextCursor:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
          description: Курсор следующей страницы или null
          example: null
      required:
        - items
        - nextCursor
      title: List maintenance response
      description: Курсорная страница списка записей ТО
      example:
        items:
          - id: 11111111-1111-4111-8111-111111111111
            assetId: 22222222-2222-4222-8222-222222222222
            status: scheduled
            scheduledAt: '2026-05-18T08:00:00.000Z'
            startedAt: null
            completedAt: null
            cancelledAt: null
            cancelledBy: null
            cancellationReason: null
            reason: Плановое ТО по моточасам
            performedBy: 44444444-4444-4444-8444-444444444444
        nextCursor: null
      additionalProperties: false
      x-schema-id: ListMaintenanceResponse_Output
    AssetMovementResponseDto_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID записи movement
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        assetId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID актива
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        op:
          type: string
          enum:
            - conservation
            - from_conservation
            - to_repair
            - from_repair
            - transfer_audit
          description: Тип операции
          example: conservation
        status:
          type: string
          enum:
            - draft
            - applied
            - failed
            - cancelled
          description: FSM-статус
          example: applied
        fromObjectId:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: UUID объекта-источника
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        toObjectId:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: UUID объекта-приёмника
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        opDate:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Дата операции (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
        responsibleId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID ответственного (механик/инженер)
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        reason:
          anyOf:
            - type: string
            - type: 'null'
          description: Причина / описание
          example: null
        relatedMaintenanceId:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: UUID связанной MaintenanceRecord
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        sourceEventId:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: UUID envelope исходного события (для transfer_audit)
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        appliedAt:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Когда операция применена
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
        failureReason:
          anyOf:
            - type: string
            - type: 'null'
          description: Причина отказа Asset FSM guard
          example: null
        cancelledAt:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Когда movement отменён
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
        cancelledBy:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: UUID пользователя, отменившего movement
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Когда запись создана
          example: '2026-05-18T08:00:00.000Z'
      required:
        - id
        - assetId
        - op
        - status
        - fromObjectId
        - toObjectId
        - opDate
        - responsibleId
        - reason
        - relatedMaintenanceId
        - sourceEventId
        - appliedAt
        - failureReason
        - cancelledAt
        - cancelledBy
        - createdAt
      title: Asset movement response
      description: Запись журнала перемещений / консервации / repair
      example:
        id: 11111111-1111-4111-8111-111111111111
        assetId: 22222222-2222-4222-8222-222222222222
        op: conservation
        status: applied
        fromObjectId: null
        toObjectId: null
        opDate: '2026-05-18T08:00:00.000Z'
        responsibleId: 44444444-4444-4444-8444-444444444444
        reason: Сезонная консервация — нерабочий период
        relatedMaintenanceId: null
        sourceEventId: null
        appliedAt: '2026-05-18T08:00:00.000Z'
        failureReason: null
        cancelledAt: null
        cancelledBy: null
        createdAt: '2026-05-18T08:00:00.000Z'
      additionalProperties: false
      x-schema-id: AssetMovementResponse_Output
    ListMovementsResponseDto_Output:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/AssetMovementResponse_Output'
          description: Страница записей movements
        nextCursor:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
          description: Курсор следующей страницы или null
          example: null
      required:
        - items
        - nextCursor
      title: List asset movements response
      description: Курсорная страница списка movements
      example:
        items:
          - id: 11111111-1111-4111-8111-111111111111
            assetId: 22222222-2222-4222-8222-222222222222
            op: conservation
            status: applied
            fromObjectId: null
            toObjectId: null
            opDate: '2026-05-18T08:00:00.000Z'
            responsibleId: 44444444-4444-4444-8444-444444444444
            reason: Сезонная консервация — нерабочий период
            relatedMaintenanceId: null
            sourceEventId: null
            appliedAt: '2026-05-18T08:00:00.000Z'
            failureReason: null
            cancelledAt: null
            cancelledBy: null
            createdAt: '2026-05-18T08:00:00.000Z'
        nextCursor: null
      additionalProperties: false
      x-schema-id: ListMovementsResponse_Output
    SagaEnqueuedDto_Output:
      type: object
      properties:
        sagaId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID запущенной саги
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        status:
          type: string
          description: Итоговый статус саги (completed, failed, …)
          example: completed
        failedStep:
          type: string
          description: Имя шага при status=failed
        error:
          type: string
          description: Текст ошибки при status=failed
      required:
        - sagaId
        - status
      title: Saga enqueued response
      description: Результат запуска саги (HTTP 202)
      example:
        sagaId: 22222222-2222-4222-8222-222222222222
        status: enqueued
      additionalProperties: false
      x-schema-id: SagaEnqueued_Output
    PersonnelResponseDto_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID сотрудника
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        fullName:
          type: string
          description: ФИО сотрудника
          example: Иванов Иван Иванович
        tabNumber:
          type: string
          description: Табельный номер (уникальный бизнес-ключ)
          example: TAB-001
        birthDate:
          anyOf:
            - type: string
              format: date
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
              description: Дата рождения (ISO 8601, YYYY-MM-DD)
              example: '2026-05-28'
            - type: 'null'
        positionId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID должности из справочника
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        status:
          type: string
          enum:
            - active
            - onWatch
            - onVacation
            - terminated
          description: Статус FSM сотрудника
          example: active
        objectId:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: UUID производственного объекта
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        phone:
          anyOf:
            - type: string
            - type: 'null'
          description: Контактный телефон или null
          example: +7-700-000-0001
        email:
          anyOf:
            - type: string
            - type: 'null'
          description: Рабочий email или null
          example: ivanov@example.com
        hiredAt:
          type: string
          format: date
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
          description: Дата приёма на работу (ISO 8601, YYYY-MM-DD)
          example: '2026-05-28'
        terminatedAt:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Дата/время увольнения (ISO 8601) или null
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
      required:
        - id
        - fullName
        - tabNumber
        - birthDate
        - positionId
        - status
        - objectId
        - phone
        - email
        - hiredAt
        - terminatedAt
      title: Personnel response
      description: Карточка производственного сотрудника
      example:
        id: 11111111-1111-4111-8111-111111111111
        fullName: Иванов Иван Иванович
        tabNumber: TAB-001
        birthDate: '2026-05-18'
        positionId: 22222222-2222-4222-8222-222222222222
        status: active
        objectId: 33333333-3333-4333-8333-333333333333
        phone: +7-700-000-0001
        email: ivanov@example.com
        hiredAt: '2026-05-18'
        terminatedAt: null
      additionalProperties: false
      x-schema-id: PersonnelResponse_Output
    ListPersonnelResponseDto_Output:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/PersonnelResponse_Output'
          description: Страница сотрудников
        nextCursor:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
          description: Курсор следующей страницы или null
          example: null
      required:
        - items
        - nextCursor
      title: List personnel response
      description: Курсорная страница списка сотрудников
      example:
        items:
          - id: 11111111-1111-4111-8111-111111111111
            fullName: Иванов Иван Иванович
            tabNumber: TAB-001
            birthDate: '2026-05-18'
            positionId: 22222222-2222-4222-8222-222222222222
            status: active
            objectId: 33333333-3333-4333-8333-333333333333
            phone: +7-700-000-0001
            email: ivanov@example.com
            hiredAt: '2026-05-18'
            terminatedAt: null
        nextCursor: null
      additionalProperties: false
      x-schema-id: ListPersonnelResponse_Output
    UserAccountResponseDto_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID учётной записи
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        personnelId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID Personnel из hr/personnel
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        systemRoleIds:
          type: array
          minItems: 1
          items:
            type: string
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            description: UUID system_role
            example: 11111111-1111-4111-8111-111111111111
            format: uuid
          description: Массив текущих ролей пользователя (HR 6.1.2 — совмещение)
        login:
          type: string
          description: Логин (= keycloak username)
          example: ivanov
        keycloakSubject:
          anyOf:
            - type: string
            - type: 'null'
          description: UUID из Keycloak (JWT sub) или null до провизии
          example: null
        status:
          type: string
          enum:
            - active
            - locked
            - deactivated
          description: Статус FSM учётки
          example: active
        lastLoginAt:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Время последнего входа
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
        failedLoginCount:
          type: integer
          minimum: 0
          maximum: 9007199254740991
          description: Счётчик неудачных попыток входа
          example: 0
        lockedUntil:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Авто-разблокировка после или null
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
        deactivatedAt:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Время деактивации или null
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
        deactivationReason:
          anyOf:
            - type: string
            - type: 'null'
          description: Причина деактивации или null
          example: null
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Создана
          example: '2026-05-18T08:00:00.000Z'
        createdBy:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID admin, создавшего учётку
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
      required:
        - id
        - personnelId
        - systemRoleIds
        - login
        - keycloakSubject
        - status
        - lastLoginAt
        - failedLoginCount
        - lockedUntil
        - deactivatedAt
        - deactivationReason
        - createdAt
        - createdBy
      title: User account response
      description: Карточка учётной записи
      additionalProperties: false
      x-schema-id: UserAccountResponse_Output
    ListUserAccountsResponseDto_Output:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/UserAccountResponse_Output'
          description: Страница учётных записей
        nextCursor:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
          description: UUID последнего элемента или null если страница последняя
          example: null
      required:
        - items
        - nextCursor
      title: List user accounts response
      description: Курсорная страница учётных записей
      additionalProperties: false
      x-schema-id: ListUserAccountsResponse_Output
    PasswordResetResponseDto_Output:
      type: object
      properties:
        resetToken:
          type: string
          description: One-time token из Keycloak; передаётся пользователю для смены пароля
          example: kc-reset-xyz
        expiresAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Срок действия токена
          example: '2026-05-18T08:00:00.000Z'
        deliveryChannel:
          type: string
          enum:
            - email
            - sms
            - admin_display
          description: Канал доставки временного пароля
          example: admin_display
      required:
        - resetToken
        - expiresAt
        - deliveryChannel
      title: Password reset response
      description: Результат сброса пароля admin'ом (HR 1.6)
      additionalProperties: false
      x-schema-id: PasswordResetResponse_Output
    BrigadeResponseDto_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID бригады
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        name:
          type: string
          description: Название бригады
          example: Бригада-Борлы-1
        objectId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID производственного объекта
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        workType:
          type: string
          enum:
            - drilling
            - blasting
            - auxiliary
          description: Тип работ бригады
          example: drilling
        brigadierId:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: UUID бригадира (Personnel) или null
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        isActive:
          type: boolean
          description: Активна ли бригада (true) или расформирована (false)
          example: true
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Дата создания (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
      required:
        - id
        - name
        - objectId
        - workType
        - brigadierId
        - isActive
        - createdAt
      title: Brigade response
      description: Карточка производственной бригады
      example:
        id: 11111111-1111-4111-8111-111111111111
        name: Бригада-Борлы-1
        objectId: 33333333-3333-4333-8333-333333333333
        workType: drilling
        brigadierId: 22222222-2222-4222-8222-222222222222
        isActive: true
        createdAt: '2026-05-18T08:00:00.000Z'
      additionalProperties: false
      x-schema-id: BrigadeResponse_Output
    ListBrigadesResponseDto_Output:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/BrigadeResponse_Output'
          description: Страница бригад
        nextCursor:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
          description: Курсор следующей страницы или null
          example: null
      required:
        - items
        - nextCursor
      title: List brigades response
      description: Курсорная страница списка бригад
      additionalProperties: false
      x-schema-id: ListBrigadesResponse_Output
    BrigadeMembershipResponseDto_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID membership
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        brigadeId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID бригады
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        personnelId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID сотрудника
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        fromDate:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Дата начала членства (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
        toDate:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Дата окончания членства (ISO 8601) или null (активное)
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
      required:
        - id
        - brigadeId
        - personnelId
        - fromDate
        - toDate
      title: Brigade membership response
      description: Запись о членстве сотрудника в бригаде с историей
      example:
        id: 11111111-1111-4111-8111-111111111111
        brigadeId: 11111111-1111-4111-8111-111111111111
        personnelId: 22222222-2222-4222-8222-222222222222
        fromDate: '2026-05-18T08:00:00.000Z'
        toDate: null
      additionalProperties: false
      x-schema-id: BrigadeMembershipResponse_Output
    AssetAssignmentResponseDto_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID закрепления
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        assetId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID актива
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        personnelId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID сотрудника
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        role:
          type: string
          enum:
            - primary_operator
            - shift_operator
            - mechanic
          description: Роль закрепления
          example: primary_operator
        fromDate:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Дата начала закрепления (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
        toDate:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Дата закрытия (ISO 8601) или null если active
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
        assignedBy:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID пользователя, выполнившего закрепление
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        reason:
          anyOf:
            - type: string
            - type: 'null'
          description: Основание закрепления или null
          example: Плановая ротация смены
        closedBy:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: UUID пользователя, закрывшего закрепление
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        closeReason:
          anyOf:
            - type: string
            - type: 'null'
          description: Основание закрытия или null
          example: null
        closeCause:
          anyOf:
            - type: string
              enum:
                - manual
                - asset-decommissioned
                - personnel-deactivated
                - replaced
            - type: 'null'
          description: Причина закрытия закрепления или null
          example: null
        isActive:
          type: boolean
          description: true — закрепление активно (toDate IS NULL)
          example: true
      required:
        - id
        - assetId
        - personnelId
        - role
        - fromDate
        - toDate
        - assignedBy
        - reason
        - closedBy
        - closeReason
        - closeCause
        - isActive
      title: Asset assignment response
      description: Карточка закрепления сотрудника на технику
      additionalProperties: false
      x-schema-id: AssetAssignmentResponse_Output
    ListAssetAssignmentsResponseDto_Output:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/AssetAssignmentResponse_Output'
          description: Страница закреплений
        nextCursor:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
          description: Курсор следующей страницы или null
          example: null
      required:
        - items
        - nextCursor
      title: List asset assignments response
      description: Курсорная страница списка закреплений
      additionalProperties: false
      x-schema-id: ListAssetAssignmentsResponse_Output
    WatchResponseDto_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID вахты
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        objectId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID производственного объекта
          example: 33333333-3333-4333-8333-333333333333
          format: uuid
        startDate:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Дата начала вахты (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
        endDate:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Дата окончания вахты (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Дата создания записи (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
        createdBy:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID автора (actorId)
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
      required:
        - id
        - objectId
        - startDate
        - endDate
        - createdAt
        - createdBy
      title: Watch response
      description: Карточка вахтового цикла
      example:
        id: 11111111-1111-4111-8111-111111111111
        objectId: 33333333-3333-4333-8333-333333333333
        startDate: '2026-05-18T08:00:00.000Z'
        endDate: '2026-05-18T08:00:00.000Z'
        createdAt: '2026-05-18T08:00:00.000Z'
        createdBy: 11111111-1111-4111-8111-111111111111
      additionalProperties: false
      x-schema-id: WatchResponse_Output
    ListWatchesResponseDto_Output:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/WatchResponse_Output'
          description: Страница вахт
        nextCursor:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
          description: Курсор следующей страницы или null
          example: null
      required:
        - items
        - nextCursor
      title: List watches response
      description: Курсорная страница списка вахт
      example:
        items:
          - id: 11111111-1111-4111-8111-111111111111
            objectId: 33333333-3333-4333-8333-333333333333
            startDate: '2026-05-18T08:00:00.000Z'
            endDate: '2026-05-18T08:00:00.000Z'
            createdAt: '2026-05-18T08:00:00.000Z'
            createdBy: 11111111-1111-4111-8111-111111111111
        nextCursor: null
      additionalProperties: false
      x-schema-id: ListWatchesResponse_Output
    WatchAssignmentResponseDto_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID назначения на вахту
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        watchId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID родительской вахты
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        personnelId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID сотрудника
          example: 22222222-2222-4222-8222-222222222222
          format: uuid
        arrivalDate:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Плановая дата заезда (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
        departureDate:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Плановая дата отъезда (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
        status:
          type: string
          enum:
            - scheduled
            - active
            - completed
            - cancelled
          description: Статус FSM назначения
          example: scheduled
        cancelledAt:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Дата отмены (ISO 8601) или null
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
        cancelReason:
          anyOf:
            - type: string
            - type: 'null'
          description: Причина отмены или null
          example: null
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Дата создания (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
        createdBy:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID автора (actorId)
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
      required:
        - id
        - watchId
        - personnelId
        - arrivalDate
        - departureDate
        - status
        - cancelledAt
        - cancelReason
        - createdAt
        - createdBy
      title: Watch assignment response
      description: Карточка назначения сотрудника на вахту
      example:
        id: 11111111-1111-4111-8111-111111111111
        watchId: 11111111-1111-4111-8111-111111111111
        personnelId: 22222222-2222-4222-8222-222222222222
        arrivalDate: '2026-05-18T08:00:00.000Z'
        departureDate: '2026-05-18T08:00:00.000Z'
        status: scheduled
        cancelledAt: null
        cancelReason: null
        createdAt: '2026-05-18T08:00:00.000Z'
        createdBy: 11111111-1111-4111-8111-111111111111
      additionalProperties: false
      x-schema-id: WatchAssignmentResponse_Output
    ShiftResponseDto_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID смены
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        watchId:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: UUID родительской вахты
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        objectId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID производственного объекта
          example: 33333333-3333-4333-8333-333333333333
          format: uuid
        shiftDate:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Дата смены (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
        shiftType:
          type: string
          enum:
            - day
            - night
          description: Тип смены (day / night)
          example: day
        durationHours:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: Длительность смены в часах (всегда 11, HR-WCH-INV-06)
          example: 11
        foremanId:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: UUID мастера смены (если назначен)
              example: 22222222-2222-4222-8222-222222222222
              format: uuid
            - type: 'null'
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Дата создания (ISO 8601)
          example: '2026-05-18T08:00:00.000Z'
        createdBy:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID автора (actorId)
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        substitutions:
          type: array
          items:
            $ref: '#/components/schemas/ShiftSubstitutionEntry_Output'
          description: >-
            Зарегистрированные замены/подмены в смене (отсортированы по
            registeredAt)
          example: []
      required:
        - id
        - watchId
        - objectId
        - shiftDate
        - shiftType
        - durationHours
        - foremanId
        - createdAt
        - createdBy
        - substitutions
      title: Shift response
      description: Карточка 11-часовой смены
      example:
        id: 11111111-1111-4111-8111-111111111111
        watchId: 11111111-1111-4111-8111-111111111111
        objectId: 33333333-3333-4333-8333-333333333333
        shiftDate: '2026-05-18T08:00:00.000Z'
        shiftType: day
        durationHours: 11
        foremanId: 22222222-2222-4222-8222-222222222222
        createdAt: '2026-05-18T08:00:00.000Z'
        createdBy: 11111111-1111-4111-8111-111111111111
        substitutions: []
      additionalProperties: false
      x-schema-id: ShiftResponse_Output
    ShiftSubstitutionEntryDto_Output:
      type: object
      properties:
        replacedPersonnelId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID заменяемого сотрудника
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        substitutePersonnelId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID подменяющего сотрудника
          example: 22222222-2222-4222-8222-222222222222
          format: uuid
        reason:
          anyOf:
            - type: string
              maxLength: 1000
            - type: 'null'
          description: Обоснование замены (до 1000 символов)
          example: null
      required:
        - replacedPersonnelId
        - substitutePersonnelId
        - reason
      additionalProperties: false
      title: Shift substitution entry
      description: Запись о замене/подмене внутри смены
      x-schema-id: ShiftSubstitutionEntry_Output
    ListShiftsResponseDto_Output:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/ShiftResponse_Output'
          description: Страница смен
        nextCursor:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
          description: Курсор следующей страницы или null
          example: null
      required:
        - items
        - nextCursor
      title: List shifts response
      description: Курсорная страница списка смен
      example:
        items:
          - id: 11111111-1111-4111-8111-111111111111
            watchId: 11111111-1111-4111-8111-111111111111
            objectId: 33333333-3333-4333-8333-333333333333
            shiftDate: '2026-05-18T08:00:00.000Z'
            shiftType: day
            durationHours: 11
            foremanId: 22222222-2222-4222-8222-222222222222
            createdAt: '2026-05-18T08:00:00.000Z'
            createdBy: 11111111-1111-4111-8111-111111111111
            substitutions: []
        nextCursor: null
      additionalProperties: false
      x-schema-id: ListShiftsResponse_Output
    TimesheetEntryResponseDto_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID записи табеля
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        shiftId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID смены
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        personnelId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID сотрудника
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        hoursWorked:
          type: number
          minimum: 0
          maximum: 11
          description: Отработанные часы (0–11)
          example: 10
        downtimeHours:
          type: number
          minimum: 0
          maximum: 11
          description: Часы простоя (0–11)
          example: 1
        status:
          type: string
          enum:
            - draft
            - confirmed
            - adjusted
            - reverted
          description: Статус FSM записи табеля
          example: confirmed
        confirmedFromShiftReport:
          type: boolean
          description: true — запись подтверждена автоматически из shift-report.approved
          example: true
        shiftReportId:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: UUID сменного отчёта или null
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        adjustmentReason:
          anyOf:
            - type: string
            - type: 'null'
          description: Причина ручной корректировки или null
          example: уточнение данных по согласованию инженера
        adjustedBy:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: UUID автора корректировки или null
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        adjustedAt:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Время последней корректировки (ISO 8601)
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
      required:
        - id
        - shiftId
        - personnelId
        - hoursWorked
        - downtimeHours
        - status
        - confirmedFromShiftReport
        - shiftReportId
        - adjustmentReason
        - adjustedBy
        - adjustedAt
      title: TimesheetEntry response
      description: Запись табеля рабочего времени
      example:
        id: 11111111-1111-4111-8111-111111111111
        shiftId: 22222222-2222-4222-8222-222222222222
        personnelId: 33333333-3333-4333-8333-333333333333
        hoursWorked: 10
        downtimeHours: 1
        status: confirmed
        confirmedFromShiftReport: true
        shiftReportId: 11111111-1111-4111-8111-111111111111
        adjustmentReason: null
        adjustedBy: null
        adjustedAt: null
      additionalProperties: false
      x-schema-id: TimesheetEntryResponse_Output
    ListTimesheetResponseDto_Output:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/TimesheetEntryResponse_Output'
          description: Страница записей табеля
        nextCursor:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
          description: UUID следующей страницы или null, если страница последняя
          example: null
      required:
        - items
        - nextCursor
      title: List timesheet response
      description: Курсорная страница табеля за период
      example:
        items:
          - id: 11111111-1111-4111-8111-111111111111
            shiftId: 22222222-2222-4222-8222-222222222222
            personnelId: 33333333-3333-4333-8333-333333333333
            hoursWorked: 10
            downtimeHours: 1
            status: confirmed
            confirmedFromShiftReport: true
            shiftReportId: 11111111-1111-4111-8111-111111111111
            adjustmentReason: null
            adjustedBy: null
            adjustedAt: null
        nextCursor: null
      additionalProperties: false
      x-schema-id: ListTimesheetResponse_Output
    InitiateUploadResponseDto_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID созданной записи документа
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        uploadUrl:
          type: string
          format: uri
          description: Presigned PUT URL для загрузки файла в MinIO
          example: https://minio.example/presigned-put
        expiresIn:
          type: integer
          exclusiveMinimum: 0
          maximum: 9007199254740991
          description: Время жизни presigned URL в секундах
          example: 300
      required:
        - id
        - uploadUrl
        - expiresIn
      title: Initiate upload response
      description: Результат инициирования загрузки документа
      example:
        id: 11111111-1111-4111-8111-111111111111
        uploadUrl: https://minio.example/presigned-put
        expiresIn: 300
      additionalProperties: false
      x-schema-id: InitiateUploadResponse_Output
    ConfirmDocumentResponseDto_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID документа
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        status:
          type: string
          const: ready
          description: Статус после успешного подтверждения
          example: ready
        size:
          type: integer
          minimum: 0
          maximum: 9007199254740991
          description: Размер файла в байтах
          example: 1024
      required:
        - id
        - status
        - size
      title: Confirm document response
      description: Документ подтверждён и готов к скачиванию
      example:
        id: 11111111-1111-4111-8111-111111111111
        status: ready
        size: 1024
      additionalProperties: false
      x-schema-id: ConfirmDocumentResponse_Output
    DownloadUrlResponseDto_Output:
      type: object
      properties:
        downloadUrl:
          type: string
          format: uri
          description: Presigned GET URL для скачивания файла
          example: https://minio.example/presigned-get
        expiresIn:
          type: integer
          exclusiveMinimum: 0
          maximum: 9007199254740991
          description: Время жизни presigned URL в секундах
          example: 300
      required:
        - downloadUrl
        - expiresIn
      title: Download URL response
      description: Presigned URL для скачивания документа
      example:
        downloadUrl: https://minio.example/presigned-get
        expiresIn: 300
      additionalProperties: false
      x-schema-id: DownloadUrlResponse_Output
    SagaDlqEntryDto_Output:
      type: object
      properties:
        queue:
          type: string
          enum:
            - mineflow-saga-steps
            - mineflow-saga-compensate
          description: Имя BullMQ-очереди (forward или compensate)
          example: mineflow-saga-steps
        jobId:
          type: string
          description: >-
            BullMQ jobId (формат `${sagaId}__${stepName}` — двойной underscore;
            BullMQ 5.x запрещает `:` в jobId, см. CLAUDE.md pitfall)
          example: 8b1f5e2a-44a7-4e6e-9d61-7c0c9c45f4c7:mark-asset-decommissioned
        sagaName:
          type: string
          description: Имя саги из SagaRegistry
          example: eam.asset.decommission
        sagaId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID запуска саги
          example: 8b1f5e2a-44a7-4e6e-9d61-7c0c9c45f4c7
        stepName:
          type: string
          description: Имя упавшего шага
          example: mark-asset-decommissioned
        failedReason:
          description: Текст последней ошибки
          example: Asset is already decommissioned
          type: string
        attemptsMade:
          type: integer
          minimum: 0
          maximum: 9007199254740991
          description: Сколько раз шаг был ретраен
          example: 5
        attemptsLimit:
          type: integer
          exclusiveMinimum: 0
          maximum: 9007199254740991
          description: Потолок ретраев из BullMQ
          example: 5
        finishedOn:
          anyOf:
            - type: string
            - type: 'null'
          description: ISO timestamp последнего падения, null если ещё не финализирован
          example: '2026-05-20T08:14:33.122Z'
      required:
        - queue
        - jobId
        - sagaName
        - sagaId
        - stepName
        - attemptsMade
        - attemptsLimit
        - finishedOn
      additionalProperties: false
      title: Saga DLQ entry
      description: Один failed-job из BullMQ DLQ для саг
      x-schema-id: SagaDlqEntry_Output
    SagaDlqListDto_Output:
      type: object
      properties:
        entries:
          type: array
          items:
            $ref: '#/components/schemas/SagaDlqEntry_Output'
        truncated:
          type: boolean
      required:
        - entries
        - truncated
      title: Saga DLQ list response
      additionalProperties: false
      x-schema-id: SagaDlqList_Output
    SagaDlqStatsDto_Output:
      type: object
      properties:
        queues:
          type: array
          items:
            type: object
            properties:
              queue:
                type: string
                enum:
                  - mineflow-saga-steps
                  - mineflow-saga-compensate
              failed:
                type: integer
                minimum: 0
                maximum: 9007199254740991
              waiting:
                type: integer
                minimum: 0
                maximum: 9007199254740991
              active:
                type: integer
                minimum: 0
                maximum: 9007199254740991
              delayed:
                type: integer
                minimum: 0
                maximum: 9007199254740991
              completed:
                type: integer
                minimum: 0
                maximum: 9007199254740991
            required:
              - queue
              - failed
              - waiting
              - active
              - delayed
              - completed
            additionalProperties: false
      required:
        - queues
      title: Saga DLQ stats
      description: Счётчики job-ов по статусам для каждой очереди саг
      additionalProperties: false
      x-schema-id: SagaDlqStats_Output
    OutboxEntryDto_Output:
      type: object
      properties:
        id:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        organizationId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        eventId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        eventType:
          type: string
        eventVersion:
          type: string
        status:
          type: string
          enum:
            - pending
            - published
            - dead
            - skipped
        attempts:
          type: integer
          minimum: 0
          maximum: 9007199254740991
        lastError:
          anyOf:
            - type: string
            - type: 'null'
        nextAttemptAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
        publishedAt:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
            - type: 'null'
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
        partitionKey:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
      required:
        - id
        - organizationId
        - eventId
        - eventType
        - eventVersion
        - status
        - attempts
        - lastError
        - nextAttemptAt
        - publishedAt
        - createdAt
        - partitionKey
      additionalProperties: false
      title: Outbox entry
      description: Одна запись из event_outbox (ADR-0026).
      x-schema-id: OutboxEntry_Output
    ListOutboxResponseDto_Output:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/OutboxEntry_Output'
        hasMore:
          type: boolean
        stats:
          type: object
          properties:
            pendingCount:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            deadCount:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            duePendingCount:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            oldestDuePendingAt:
              anyOf:
                - type: string
                  format: date-time
                  pattern: >-
                    ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
                - type: 'null'
          additionalProperties: false
      required:
        - items
        - hasMore
        - stats
      title: Outbox listing + stats
      additionalProperties: false
      x-schema-id: ListOutboxResponse_Output
    OutboxRepublishResponseDto_Output:
      type: object
      properties:
        id:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        status:
          type: string
          const: pending
        attempts:
          type: integer
          minimum: 0
          maximum: 9007199254740991
      required:
        - id
        - status
        - attempts
      additionalProperties: false
      x-schema-id: OutboxRepublishResponse_Output
    OutboxSkipResponseDto_Output:
      type: object
      properties:
        id:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        status:
          type: string
          const: skipped
      required:
        - id
        - status
      additionalProperties: false
      x-schema-id: OutboxSkipResponse_Output
    QueueStatsEntryDto_Output:
      type: object
      properties:
        name:
          type: string
          enum:
            - mineflow-saga-steps
            - mineflow-saga-compensate
            - mineflow-audit-log
          description: Имя BullMQ-очереди
          example: mineflow-saga-steps
        waiting:
          type: integer
          minimum: 0
          maximum: 9007199254740991
          description: Job-ы ожидающие worker
        active:
          type: integer
          minimum: 0
          maximum: 9007199254740991
          description: Job-ы в обработке
        delayed:
          type: integer
          minimum: 0
          maximum: 9007199254740991
          description: Job-ы запланированные на будущее (backoff/retry)
        failed:
          type: integer
          minimum: 0
          maximum: 9007199254740991
          description: Job-ы исчерпавшие retries (DLQ)
        completed:
          type: integer
          minimum: 0
          maximum: 9007199254740991
          description: Успешно завершённые (BullMQ хранит N последних)
        paused:
          type: integer
          minimum: 0
          maximum: 9007199254740991
          description: Job-ы в paused очереди
        backlogWarning:
          type: boolean
          description: true если waiting+delayed превышает предупредительный порог
      required:
        - name
        - waiting
        - active
        - delayed
        - failed
        - completed
        - paused
        - backlogWarning
      additionalProperties: false
      title: Queue stats entry
      x-schema-id: QueueStatsEntry_Output
    QueuesListResponseDto_Output:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/QueueStatsEntry_Output'
        backlogThreshold:
          type: integer
          exclusiveMinimum: 0
          maximum: 9007199254740991
          description: Текущий порог backlogWarning (waiting+delayed > threshold)
      required:
        - items
        - backlogThreshold
      title: Queues list response
      additionalProperties: false
      x-schema-id: QueuesListResponse_Output
    QueueDetailResponseDto_Output:
      type: object
      properties:
        name:
          type: string
          enum:
            - mineflow-saga-steps
            - mineflow-saga-compensate
            - mineflow-audit-log
          description: Имя BullMQ-очереди
          example: mineflow-saga-steps
        waiting:
          type: integer
          minimum: 0
          maximum: 9007199254740991
          description: Job-ы ожидающие worker
        active:
          type: integer
          minimum: 0
          maximum: 9007199254740991
          description: Job-ы в обработке
        delayed:
          type: integer
          minimum: 0
          maximum: 9007199254740991
          description: Job-ы запланированные на будущее (backoff/retry)
        failed:
          type: integer
          minimum: 0
          maximum: 9007199254740991
          description: Job-ы исчерпавшие retries (DLQ)
        completed:
          type: integer
          minimum: 0
          maximum: 9007199254740991
          description: Успешно завершённые (BullMQ хранит N последних)
        paused:
          type: integer
          minimum: 0
          maximum: 9007199254740991
          description: Job-ы в paused очереди
        backlogWarning:
          type: boolean
          description: true если waiting+delayed превышает предупредительный порог
        recentFailed:
          type: array
          items:
            type: object
            properties:
              jobId:
                type: string
              failedReason:
                anyOf:
                  - type: string
                  - type: 'null'
              attemptsMade:
                type: integer
                minimum: 0
                maximum: 9007199254740991
              finishedOn:
                anyOf:
                  - type: string
                    format: date-time
                    pattern: >-
                      ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
                  - type: 'null'
            required:
              - jobId
              - failedReason
              - attemptsMade
              - finishedOn
            additionalProperties: false
      required:
        - name
        - waiting
        - active
        - delayed
        - failed
        - completed
        - paused
        - backlogWarning
        - recentFailed
      title: Queue detail response
      additionalProperties: false
      x-schema-id: QueueDetailResponse_Output
    ShiftReportResponseDto_Output:
      type: object
      properties:
        id:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        organizationId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        productionObjectId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        shiftDate:
          type: string
          description: YYYY-MM-DD
          example: '2026-05-20'
        shiftType:
          type: string
          enum:
            - day
            - night
        status:
          type: string
          enum:
            - draft
            - submitted
            - approved
            - rejected
        submittedBy:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
        submittedAt:
          anyOf:
            - type: string
            - type: 'null'
        approvedBy:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
        approvedAt:
          anyOf:
            - type: string
            - type: 'null'
        approveSagaId:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
        rejectedBy:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
        rejectedAt:
          anyOf:
            - type: string
            - type: 'null'
        rejectReason:
          anyOf:
            - type: string
            - type: 'null'
        createdAt:
          type: string
        updatedAt:
          type: string
      required:
        - id
        - organizationId
        - productionObjectId
        - shiftDate
        - shiftType
        - status
        - submittedBy
        - submittedAt
        - approvedBy
        - approvedAt
        - approveSagaId
        - rejectedBy
        - rejectedAt
        - rejectReason
        - createdAt
        - updatedAt
      title: Shift-report DTO
      description: Полное состояние отчёта со всеми timestamp-полями FSM
      additionalProperties: false
      x-schema-id: ShiftReportResponse_Output
    ListShiftReportsResponseDto_Output:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/ShiftReportResponse_Output'
        nextCursor:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
      required:
        - items
        - nextCursor
      title: List shift-reports response
      description: Страница отчётов + nextCursor для следующего запроса
      additionalProperties: false
      x-schema-id: ListShiftReportsResponse_Output
    ApproveShiftReportResponseDto_Output:
      type: object
      properties:
        shiftReportId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID утверждённого сменного отчёта
        sagaId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID запущенной саги — используйте для опроса статуса
        status:
          type: string
          const: enqueued
          description: >-
            Сага принята в обработку; следите за прогрессом через GET
            /sagas/:id/status
      required:
        - shiftReportId
        - sagaId
        - status
      title: Approve shift-report response
      description: Результат POST /v1/prd/shift-reports/:id/approve
      additionalProperties: false
      x-schema-id: ApproveShiftReportResponse_Output
    RejectAfterApproveResponseDto_Output:
      type: object
      properties:
        shiftReportId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID сторнированного сменного отчёта
        rejectSagaId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID сторно-саги для опроса прогресса
        originalApproveSagaId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID исходной approve-саги — для трассировки и audit
        status:
          type: string
          const: enqueued
          description: Сторно-сага принята в обработку
      required:
        - shiftReportId
        - rejectSagaId
        - originalApproveSagaId
        - status
      title: Reject-after-approve response
      description: Результат POST /v1/prd/shift-reports/:id/reject-after-approve
      additionalProperties: false
      x-schema-id: RejectAfterApproveResponse_Output
    ShiftPersonnelResponseDto_Output:
      type: object
      properties:
        id:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        organizationId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        shiftReportId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        personnelId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        positionId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        hoursWorked:
          type: number
        downtimeHours:
          type: number
        createdAt:
          type: string
        updatedAt:
          type: string
      required:
        - id
        - organizationId
        - shiftReportId
        - personnelId
        - positionId
        - hoursWorked
        - downtimeHours
        - createdAt
        - updatedAt
      title: Shift personnel DTO
      additionalProperties: false
      x-schema-id: ShiftPersonnelResponse_Output
    ShiftAssetUsageResponseDto_Output:
      type: object
      properties:
        id:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        organizationId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        shiftReportId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        assetId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        operatorPersonnelId:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
        hoursWorked:
          type: number
        meterReadingStart:
          type: number
        meterReadingEnd:
          type: number
        createdAt:
          type: string
        updatedAt:
          type: string
      required:
        - id
        - organizationId
        - shiftReportId
        - assetId
        - operatorPersonnelId
        - hoursWorked
        - meterReadingStart
        - meterReadingEnd
        - createdAt
        - updatedAt
      title: Shift asset usage DTO
      additionalProperties: false
      x-schema-id: ShiftAssetUsageResponse_Output
    DrillingEntryResponseDto_Output:
      type: object
      properties:
        id:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        organizationId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        shiftReportId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        assetUsageId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        holesDrilled:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
        depthMeters:
          type: number
        drillBitWearPercent:
          anyOf:
            - type: number
            - type: 'null'
        createdAt:
          type: string
      required:
        - id
        - organizationId
        - shiftReportId
        - assetUsageId
        - holesDrilled
        - depthMeters
        - drillBitWearPercent
        - createdAt
      title: Drilling entry DTO
      additionalProperties: false
      x-schema-id: DrillingEntryResponse_Output
    BlastingEntryResponseDto_Output:
      type: object
      properties:
        id:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        organizationId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        shiftReportId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        blocksBlasted:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
        explosiveType:
          type: string
        explosiveKg:
          type: number
        permitId:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
        createdAt:
          type: string
      required:
        - id
        - organizationId
        - shiftReportId
        - blocksBlasted
        - explosiveType
        - explosiveKg
        - permitId
        - createdAt
      title: Blasting entry DTO
      additionalProperties: false
      x-schema-id: BlastingEntryResponse_Output
    FuelEntryResponseDto_Output:
      type: object
      properties:
        id:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        organizationId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        shiftReportId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        assetUsageId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        tankId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        fuelType:
          type: string
          enum:
            - diesel
            - gasoline
            - lubricant
        litersIssued:
          type: number
        litersConsumed:
          type: number
        createdAt:
          type: string
      required:
        - id
        - organizationId
        - shiftReportId
        - assetUsageId
        - tankId
        - fuelType
        - litersIssued
        - litersConsumed
        - createdAt
      title: Fuel entry DTO
      additionalProperties: false
      x-schema-id: FuelEntryResponse_Output
    DowntimeEventResponseDto_Output:
      type: object
      properties:
        id:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        organizationId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        shiftReportId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        assetUsageId:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
        reasonCode:
          type: string
          enum:
            - breakdown
            - maintenance
            - no_fuel
            - weather
            - other
        startedAt:
          type: string
        endedAt:
          type: string
        description:
          anyOf:
            - type: string
            - type: 'null'
        createdAt:
          type: string
      required:
        - id
        - organizationId
        - shiftReportId
        - assetUsageId
        - reasonCode
        - startedAt
        - endedAt
        - description
        - createdAt
      title: Downtime event DTO
      additionalProperties: false
      x-schema-id: DowntimeEventResponse_Output
    TmcUsageResponseDto_Output:
      type: object
      properties:
        id:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        organizationId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        shiftReportId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        assetUsageId:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
        tmcItemId:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        quantity:
          type: number
        unit:
          type: string
        createdAt:
          type: string
      required:
        - id
        - organizationId
        - shiftReportId
        - assetUsageId
        - tmcItemId
        - quantity
        - unit
        - createdAt
      title: TMC usage DTO
      additionalProperties: false
      x-schema-id: TmcUsageResponse_Output
    ShiftReportEntriesResponseDto_Output:
      type: object
      properties:
        personnel:
          type: array
          items:
            $ref: '#/components/schemas/ShiftPersonnelResponse_Output'
        assetUsages:
          type: array
          items:
            $ref: '#/components/schemas/ShiftAssetUsageResponse_Output'
        drilling:
          type: array
          items:
            $ref: '#/components/schemas/DrillingEntryResponse_Output'
        blasting:
          type: array
          items:
            $ref: '#/components/schemas/BlastingEntryResponse_Output'
        fuel:
          type: array
          items:
            $ref: '#/components/schemas/FuelEntryResponse_Output'
        downtime:
          type: array
          items:
            $ref: '#/components/schemas/DowntimeEventResponse_Output'
        tmcUsage:
          type: array
          items:
            $ref: '#/components/schemas/TmcUsageResponse_Output'
      required:
        - personnel
        - assetUsages
        - drilling
        - blasting
        - fuel
        - downtime
        - tmcUsage
      title: Shift report entries snapshot
      description: Все child entries отчёта одним вызовом (GET /:reportId/entries)
      additionalProperties: false
      x-schema-id: ShiftReportEntriesResponse_Output
    SupplierResponseDto_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID поставщика
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        bin:
          anyOf:
            - type: string
              pattern: ^\d{12}$
            - type: 'null'
          description: БИН юр. лица (12 цифр) или null если ИП
          example: '190140012345'
        iin:
          anyOf:
            - type: string
              pattern: ^\d{12}$
            - type: 'null'
          description: ИИН ИП (12 цифр) или null если юр. лицо
          example: null
        legalName:
          type: string
          description: Полное юридическое наименование
          example: Товарищество с ограниченной ответственностью "БурТехСервис"
        shortName:
          type: string
          description: Краткое наименование для UI
        legalAddress:
          type: string
          description: Юридический адрес
        legalFormCode:
          anyOf:
            - type: string
            - type: 'null'
          description: КПФ (41/42/17/…) или null
        countryCode:
          type: string
          description: ISO 3166-1 alpha-2
        status:
          type: string
          enum:
            - draft
            - underReview
            - active
            - suspended
            - archived
          description: Статус FSM
          example: draft
        categories:
          type: array
          items:
            type: string
            enum:
              - tmc
              - fuel
              - service
              - equipment
          description: Назначенные категории
        suspendedReason:
          anyOf:
            - type: string
            - type: 'null'
          description: Причина блокировки или null
        archivedReason:
          anyOf:
            - type: string
            - type: 'null'
          description: Причина архивации или null
        submittedAt:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Когда отправлено на проверку
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
        submittedBy:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: Кто отправил на проверку
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        activatedAt:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Когда активирован (последний раз)
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
        activatedBy:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: Кто активировал
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        suspendedAt:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Когда заблокирован
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
        archivedAt:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Когда архивирован
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
        archivedCoApprovedBy:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: Второй подписант архивации (Q5)
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
      required:
        - id
        - bin
        - iin
        - legalName
        - shortName
        - legalAddress
        - legalFormCode
        - countryCode
        - status
        - categories
        - suspendedReason
        - archivedReason
        - submittedAt
        - submittedBy
        - activatedAt
        - activatedBy
        - suspendedAt
        - archivedAt
        - archivedCoApprovedBy
      title: Supplier response
      description: >-
        Карточка поставщика (контакты/счета — отдельные under
        /suppliers/{id}/contacts)
      example:
        id: 11111111-1111-4111-8111-111111111111
        bin: '190140012345'
        iin: null
        legalName: Товарищество с ограниченной ответственностью "БурТехСервис"
        shortName: ТОО БурТехСервис
        legalAddress: г. Алматы, ул. Тестовая 1
        legalFormCode: '41'
        countryCode: KZ
        status: draft
        categories:
          - tmc
        suspendedReason: null
        archivedReason: null
        submittedAt: null
        submittedBy: null
        activatedAt: null
        activatedBy: null
        suspendedAt: null
        archivedAt: null
        archivedCoApprovedBy: null
      additionalProperties: false
      x-schema-id: SupplierResponse_Output
    ListSuppliersResponseDto_Output:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/SupplierResponse_Output'
          description: Страница поставщиков
        nextCursor:
          anyOf:
            - type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            - type: 'null'
          description: Курсор следующей страницы или null
          example: null
      required:
        - items
        - nextCursor
      title: List suppliers response
      description: Курсорная страница списка поставщиков
      example:
        items:
          - id: 11111111-1111-4111-8111-111111111111
            bin: '190140012345'
            iin: null
            legalName: Товарищество с ограниченной ответственностью "БурТехСервис"
            shortName: ТОО БурТехСервис
            legalAddress: г. Алматы, ул. Тестовая 1
            legalFormCode: '41'
            countryCode: KZ
            status: draft
            categories:
              - tmc
            suspendedReason: null
            archivedReason: null
            submittedAt: null
            submittedBy: null
            activatedAt: null
            activatedBy: null
            suspendedAt: null
            archivedAt: null
            archivedCoApprovedBy: null
        nextCursor: null
      additionalProperties: false
      x-schema-id: ListSuppliersResponse_Output
    SupplierBankAccountResponseDto_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID счёта
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        supplierId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID поставщика
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        bankName:
          type: string
          description: Название банка
        bik:
          anyOf:
            - type: string
            - type: 'null'
          description: БИК (8 символов) или null
        iban:
          type: string
          description: KZ IBAN (20 символов, mod-97)
        bk:
          anyOf:
            - type: string
            - type: 'null'
          description: КБе или null
        currency:
          type: string
          description: ISO 4217 валюта счёта (по умолчанию KZT)
        isPrimary:
          type: boolean
          description: Primary-счёт (SCM-SUP-INV-07)
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Когда создан
          example: '2026-05-18T08:00:00.000Z'
        updatedAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Когда обновлён
          example: '2026-05-18T08:00:00.000Z'
      required:
        - id
        - supplierId
        - bankName
        - bik
        - iban
        - bk
        - currency
        - isPrimary
        - createdAt
        - updatedAt
      title: Supplier bank account response
      description: Банковский счёт поставщика (ADR-0028 secondary entity)
      additionalProperties: false
      x-schema-id: SupplierBankAccountResponse_Output
    TmcItemResponseDto_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID позиции
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        nomenclatureCode:
          type: string
        name:
          type: string
        category:
          type: string
          enum:
            - drill_tool
            - spare
            - consumable
            - other
        unit:
          type: string
        assetClassId:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: UUID AssetClass
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        lastPurchasePrice:
          type: number
          minimum: 0
        weightedAvgPrice:
          type: number
          minimum: 0
        active:
          type: boolean
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Когда создано
          example: '2026-05-18T08:00:00.000Z'
        updatedAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Когда обновлено
          example: '2026-05-18T08:00:00.000Z'
      required:
        - id
        - nomenclatureCode
        - name
        - category
        - unit
        - assetClassId
        - lastPurchasePrice
        - weightedAvgPrice
        - active
        - createdAt
        - updatedAt
      title: TMC item response
      description: Карточка позиции номенклатуры ТМЦ
      additionalProperties: false
      x-schema-id: TmcItemResponse_Output
    ListTmcItemsResponseDto_Output:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/TmcItemResponse_Output'
        nextCursor:
          anyOf:
            - type: string
            - type: 'null'
      required:
        - items
        - nextCursor
      title: List TMC items response
      additionalProperties: false
      x-schema-id: ListTmcItemsResponse_Output
    RecordTmcInboundResultDto_Output:
      type: object
      properties:
        inboundId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID документа поступления
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        warehouseId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID склада
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        totalAmount:
          type: number
          minimum: 0
        lineCount:
          type: integer
          minimum: 0
          maximum: 9007199254740991
      required:
        - inboundId
        - warehouseId
        - totalAmount
        - lineCount
      additionalProperties: false
      x-schema-id: RecordTmcInboundResult_Output
    RecordTmcManualConsumptionResultDto_Output:
      type: object
      properties:
        consumptionId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID документа списания
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        warehouseId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID склада
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        lineCount:
          type: integer
          minimum: 0
          maximum: 9007199254740991
      required:
        - consumptionId
        - warehouseId
        - lineCount
      additionalProperties: false
      x-schema-id: RecordTmcManualConsumptionResult_Output
    TmcTransferResponseDto_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID перемещения
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        fromWarehouseId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID склада-источника
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        toWarehouseId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID склада-получателя
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        status:
          type: string
          enum:
            - issued
            - confirmed
        transferDate:
          type: string
        documentNumber:
          type: string
        issuedById:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID отправителя
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        confirmedById:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: UUID подтвердившего (null до confirm)
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        issuedAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Когда отправлено
          example: '2026-05-18T08:00:00.000Z'
        confirmedAt:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Когда подтверждено
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
        lines:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                description: UUID строки
                example: 11111111-1111-4111-8111-111111111111
                format: uuid
              itemId:
                type: string
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                description: UUID позиции
                example: 11111111-1111-4111-8111-111111111111
                format: uuid
              quantity:
                type: number
                exclusiveMinimum: 0
            required:
              - id
              - itemId
              - quantity
            additionalProperties: false
      required:
        - id
        - fromWarehouseId
        - toWarehouseId
        - status
        - transferDate
        - documentNumber
        - issuedById
        - confirmedById
        - issuedAt
        - confirmedAt
        - lines
      title: TMC transfer response
      additionalProperties: false
      x-schema-id: TmcTransferResponse_Output
    ListTmcTransfersResponseDto_Output:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/TmcTransferResponse_Output'
        nextCursor:
          anyOf:
            - type: string
            - type: 'null'
      required:
        - items
        - nextCursor
      additionalProperties: false
      x-schema-id: ListTmcTransfersResponse_Output
    TmcRequestResponseDto_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID заявки
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        warehouseId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: Склад
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        createdById:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: Создатель
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        justification:
          type: string
        status:
          type: string
          enum:
            - draft
            - sent
            - approved
            - in_progress
            - fulfilled
            - rejected
        approvedById:
          anyOf:
            - type: string
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              description: Согласовавший
              example: 11111111-1111-4111-8111-111111111111
              format: uuid
            - type: 'null'
        approvedAt:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Когда согласовано
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
        rejectReason:
          anyOf:
            - type: string
            - type: 'null'
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Создано
          example: '2026-05-18T08:00:00.000Z'
        updatedAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Обновлено
          example: '2026-05-18T08:00:00.000Z'
        lines:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                description: UUID строки
                example: 11111111-1111-4111-8111-111111111111
                format: uuid
              itemId:
                type: string
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                description: UUID позиции
                example: 11111111-1111-4111-8111-111111111111
                format: uuid
              quantity:
                type: number
                exclusiveMinimum: 0
              fulfilledQuantity:
                type: number
                minimum: 0
            required:
              - id
              - itemId
              - quantity
              - fulfilledQuantity
            additionalProperties: false
      required:
        - id
        - warehouseId
        - createdById
        - justification
        - status
        - approvedById
        - approvedAt
        - rejectReason
        - createdAt
        - updatedAt
        - lines
      additionalProperties: false
      x-schema-id: TmcRequestResponse_Output
    ListTmcRequestsResponseDto_Output:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/TmcRequestResponse_Output'
        nextCursor:
          anyOf:
            - type: string
            - type: 'null'
      required:
        - items
        - nextCursor
      additionalProperties: false
      x-schema-id: ListTmcRequestsResponse_Output
    TmcInventoryResponseDto_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID инвентаризации
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        warehouseId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: Склад
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        inventoryDate:
          type: string
        responsibleId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: Ответственный
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        status:
          type: string
          enum:
            - in_progress
            - completed
        completedAt:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              description: Когда завершено
              example: '2026-05-18T08:00:00.000Z'
            - type: 'null'
        documentReference:
          anyOf:
            - type: string
            - type: 'null'
        lines:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                description: UUID строки
                example: 11111111-1111-4111-8111-111111111111
                format: uuid
              itemId:
                type: string
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                description: UUID позиции
                example: 11111111-1111-4111-8111-111111111111
                format: uuid
              bookQuantity:
                type: number
                minimum: 0
              actualQuantity:
                type: number
                minimum: 0
              variance:
                type: number
              adjustmentReason:
                anyOf:
                  - type: string
                  - type: 'null'
            required:
              - id
              - itemId
              - bookQuantity
              - actualQuantity
              - variance
              - adjustmentReason
            additionalProperties: false
      required:
        - id
        - warehouseId
        - inventoryDate
        - responsibleId
        - status
        - completedAt
        - documentReference
        - lines
      additionalProperties: false
      x-schema-id: TmcInventoryResponse_Output
    ListTmcInventoriesResponseDto_Output:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/TmcInventoryResponse_Output'
        nextCursor:
          anyOf:
            - type: string
            - type: 'null'
      required:
        - items
        - nextCursor
      additionalProperties: false
      x-schema-id: ListTmcInventoriesResponse_Output
    TmcBalanceResponseDto_Output:
      type: object
      properties:
        itemId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID позиции
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        warehouseId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID склада
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        quantity:
          type: number
          minimum: 0
        minStock:
          type: number
          minimum: 0
        isLowStock:
          type: boolean
        updatedAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Когда обновлено
          example: '2026-05-18T08:00:00.000Z'
      required:
        - itemId
        - warehouseId
        - quantity
        - minStock
        - isLowStock
        - updatedAt
      additionalProperties: false
      title: TMC balance response
      x-schema-id: TmcBalanceResponse_Output
    ListTmcBalancesResponseDto_Output:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/TmcBalanceResponse_Output'
        nextCursor:
          anyOf:
            - type: string
            - type: 'null'
      required:
        - items
        - nextCursor
      additionalProperties: false
      x-schema-id: ListTmcBalancesResponse_Output
    GlobalSagaStepStatusDto_Output:
      type: object
      properties:
        stepName:
          type: string
          description: Имя шага саги
          example: reserveAsset
        status:
          type: string
          description: Статус шага (pending, completed, failed, compensated)
          example: completed
        at:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Время записи статуса шага
          example: '2026-05-18T08:00:00.000Z'
        error:
          anyOf:
            - type: string
            - type: 'null'
          description: Текст ошибки шага или null
          example: null
      required:
        - stepName
        - status
        - at
        - error
      additionalProperties: false
      title: Saga step status
      description: Статус одного шага саги (глобальный endpoint)
      example:
        stepName: reserveAsset
        status: completed
        at: '2026-05-25T08:30:15.123Z'
        error: null
      x-schema-id: GlobalSagaStepStatus_Output
    GlobalSagaStatusDto_Output:
      type: object
      properties:
        sagaId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID саги
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        steps:
          type: array
          items:
            $ref: '#/components/schemas/GlobalSagaStepStatus_Output'
          description: Хронология шагов саги в порядке возрастания времени
      required:
        - sagaId
        - steps
      title: Saga status response
      description: >-
        Прогресс любой запущенной саги — список шагов из saga_log. Универсальный
        endpoint для опроса async-саг (EAM/PRD/HR/...).
      example:
        sagaId: 11111111-1111-4111-8111-111111111111
        steps:
          - stepName: reserveAsset
            status: completed
            at: '2026-05-25T08:30:15.123Z'
            error: null
          - stepName: markDecommissioned
            status: completed
            at: '2026-05-25T08:30:16.456Z'
            error: null
      additionalProperties: false
      x-schema-id: GlobalSagaStatus_Output
    AuditLogEntryDto_Output:
      type: object
      properties:
        id:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID записи audit log
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        entity:
          type: string
          description: Тип сущности (PascalCase в коде, snake/kebab в логе)
          example: asset
        entityId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID сущности, для которой записан audit
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        action:
          type: string
          description: Действие
          example: decommission-saga
        actorId:
          type: string
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: UUID пользователя-актора (UserAccount.id)
          example: 11111111-1111-4111-8111-111111111111
          format: uuid
        at:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: Время записи
          example: '2026-05-18T08:00:00.000Z'
        before:
          anyOf:
            - {}
            - type: 'null'
          description: Состояние до изменения (JSON)
          example:
            status: operational
        after:
          anyOf:
            - {}
            - type: 'null'
          description: Состояние после изменения (JSON)
          example:
            status: decommissioned
        metadata:
          anyOf:
            - {}
            - type: 'null'
          description: Дополнительные метаданные (JSON)
          example:
            correlationId: 44444444-4444-4444-8444-444444444444
      required:
        - id
        - entity
        - entityId
        - action
        - actorId
        - at
        - before
        - after
        - metadata
      additionalProperties: false
      title: Audit log entry
      description: Одна запись audit log — кто/что/когда изменил
      example:
        id: 11111111-1111-4111-8111-111111111111
        entity: asset
        entityId: 22222222-2222-4222-8222-222222222222
        action: decommission-saga
        actorId: 33333333-3333-4333-8333-333333333333
        at: '2026-05-25T08:30:15.123Z'
        before:
          status: operational
        after:
          status: decommissioned
        metadata:
          correlationId: 44444444-4444-4444-8444-444444444444
      x-schema-id: AuditLogEntry_Output
    AuditLogPageDto_Output:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/AuditLogEntry_Output'
          description: Записи в порядке убывания времени (новые сверху)
        nextCursor:
          anyOf:
            - type: string
            - type: 'null'
          description: >-
            ISO-timestamp последней записи в этой странице. Подставить в
            `cursor` параметр для следующей страницы. null — больше нет страниц.
          example: '2026-05-25T08:30:15.123Z'
      required:
        - items
        - nextCursor
      title: Audit log page
      description: Cursor-пагинированный список записей audit log
      example:
        items:
          - id: 11111111-1111-4111-8111-111111111111
            entity: asset
            entityId: 22222222-2222-4222-8222-222222222222
            action: decommission-saga
            actorId: 33333333-3333-4333-8333-333333333333
            at: '2026-05-25T08:30:15.123Z'
            before:
              status: operational
            after:
              status: decommissioned
            metadata:
              correlationId: 44444444-4444-4444-8444-444444444444
        nextCursor: '2026-05-25T08:30:15.123Z'
      additionalProperties: false
      x-schema-id: AuditLogPage_Output
