Перейти к содержимому
СервисАпп API
На этой странице

Дефекты оборудования

Все операции. Авторизация. Запросы и повторы.

Все пути в этом файле дополняют /api/v1 на домене организации.

Описание и ограничения

Назначение

Регистрация и устранение конкретных дефектов единицы, создание корректирующего ТО или гарантийного ремонта.

Поля и назначение

Публичное поле Формат и смысл Доступ
id, equipment_id id и обязательная единица только чтение / чтение и запись
title, description, severity название, описание, важность чтение и запись
found_date календарная дата чтение и запись
status, resolved_date состояние и дата устранения только чтение
reported_by текущий сотрудник при создании только чтение
maintenance_schedule_id, act_id созданная заявка/акт только чтение

Обязательность и null указаны в схемах каждой операции ниже.

Доступ и выборка

equipment_defects:read требует «ТОиР — Оборудование → Просмотр» и «ТОиР — Обслуживание → Просмотр»; запись — equipment_defects:write, «ТОиР — Оборудование → Просмотр» и «ТОиР — Обслуживание → Изменение». Право изменения паспорта оборудования для записи дефекта не требуется. Проверяется доступ к текущему оборудованию и существующему клиенту; недоступный родитель даёт 404.

Создание ТО дополнительно требует maintenance_schedules:write, гарантийного акта — acts:write, «Акты приёма оборудования → Просмотр», «Акты приёма оборудования → Изменение» и доступ к клиенту по штатным правилам создания акта. Мастерская должна входить в разрешённые подключения и сотруднику. Владелец сохраняет полный доступ, ограничения подключения действуют и для него.

Фильтры: filter[equipment_id], filter[customer_id], filter[status], filter[severity], filter[found_from], filter[found_to]. Границы календарного периода включаются. Клиент фильтра определяется по текущему оборудованию, а не по историческому внутреннему полю дефекта. Пагинация идёт курсором по id; неизвестные параметры отклоняются. Карточка поддерживает ETag/304 после авторизации.

Тела команд

Для создания требуются equipment_id и непустой title до 255 символов. description — до 10000 символов или null, severity — low/medium/high/critical (по умолчанию medium), found_date — DATE Y-m-d или null (при отсутствии — текущий календарный день организации). reported_by берётся из владельца токена, customer_id выводится из оборудования; оба поля не принимаются от клиента.

Изменение принимает только переданные RW-поля. Update, resolve и обе конвертации требуют If-Resource-Version исходного дефекта. Версия — секундный updated_at; изменение в одной секунде может не изменить её. Запрос без изменений сохраняет версию и не публикует событие. Resolve принимает {}, устанавливает текущий день организации и сохраняет первоначальную дату при повторе. Устранение до даты обнаружения отклоняется с 409; изменение found_date на день после уже зафиксированного устранения — 422.

create-maintenance принимает { "workshop_id": 1, "planned_date": "2026-12-02" }. workshop_id обязателен, дата необязательна и по умолчанию равна дню организации. Создаётся корректирующая заявка с важностью и описанием дефекта через штатный сервис, включая снимок сценария и чек-лист. Заголовок с префиксом ограничен 255 символами.

create-warranty-act принимает { "workshop_id": 1, "status_id": 2, "stock_id": 3 }. Обязательна мастерская; статус и склад необязательны только при наличии допустимых штатных значения по умолчанию: создания акта. Проверяется открытый статус ремонта и активный склад этой мастерской. Создаётся ремонтный акт для текущего клиента оборудования, с его моделью/серийным номером и описанием рекламации. Оборудование связывается с актом; устанавливается гарантийный флаг. Предыдущий ремонт выбирается штатным поиском и расчётом срока гарантии только среди доступных подключению актов того же клиента, текущими чтениями строк работ/товаров и справочников. Совпадение серийный номера с чужим клиентом или недоступной мастерской не даёт связи. Обязательные дополнительные поля акта проверяются штатно; конвертация их не обходит.

Обе конвертации возвращают карточку дефекта со связанным ID, 201 при создании документа и 200, если документ уже существовал. Повтор с тем же ключом возвращает исходный статус и тело. Новый ключ не создаёт второй документ; версия и affected_resources при таком запрос без изменений сохраняются. Для нового документа устранённого дефекта возвращается 409 DEFECT_ALREADY_RESOLVED; существующая связь остаётся доступна по обычным правилам. Другая запрошенная мастерская при существующей доступной связи даёт 409 DEFECT_DOCUMENT_CONFLICT.

Правила и связи

  • Справочник Defect и конкретный EquipmentDefect — разные ресурсы.
  • Конвертация блокирует текущее оборудование и дефект в общей с панелью транзакции. Создание документа, связи, записи об операции и события атомарны. Сбой откатывает весь результат и не расходует ключ.
  • Выбор мастерской и открытого статуса гарантийного акта проверяется в контексте API; нельзя брать первый попавшийся статус или мастерскую.
  • Клиент дефекта выводится из оборудования, а не принимается для переноса дефекта.
  • Перенос на другую единицу допустим только без созданных документов и без устранения; иначе 409 DEFECT_HISTORY_PROTECTED. Повтор запроса проверяет исходное и текущее оборудование, исходную мастерскую и текущий связанный документ; отзыв доступа не раскрывает сохранённое тело.
  • События: equipment_defect.created, equipment_defect.updated, equipment_defect.resolved; у конвертации также есть событие создания соответствующего документа. В JSON не попадают внутренние имена полей и классов моделей.

Операции

Метод Путь Назначение
GET /equipment-defects Список с фильтрами и пагинацией
POST /equipment-defects Создание
GET /equipment-defects/{id} Карточка
POST /equipment-defects/{id}/update Изменение разрешённых полей
POST /equipment-defects/{id}/resolve Фиксация устранения
POST /equipment-defects/{id}/create-maintenance Создание корректирующей заявки ТО
POST /equipment-defects/{id}/create-warranty-act Создание гарантийного акта

GET /equipment-defects

Список с фильтрами и пагинацией.

Доступ. Разрешения подключения: equipment_defects:read. Права сотрудника: «ТОиР — Оборудование → Просмотр», «ТОиР — Обслуживание → Просмотр». Дополнительно действуют доступ к записям, мастерским, модулям и условия полей из описания ресурса выше.

Параметры

Имя Где Тип Обязательно null Ограничения
Authorization заголовок строка да нет Bearer <SERVICEAPP_TOKEN>
sort параметр запроса строка нет нет Допустимо: "id", "-id"
page[size] параметр запроса целое число нет нет ≥ 1; ≤ 100
page[cursor] параметр запроса строка нет нет не более 8192 символов
filter[equipment_id] параметр запроса целое число нет нет ≥ 1
filter[customer_id] параметр запроса целое число нет нет ≥ 1
filter[status] параметр запроса строка нет нет Допустимо: "open", "in_progress", "resolved", "dismissed"; Жизненный цикл дефекта оборудования: обнаружен → в работе → устранён (или отклонён).
filter[severity] параметр запроса строка нет нет Допустимо: "low", "medium", "high", "critical"; Приоритет планового обслуживания.
filter[found_from] параметр запроса строка (дата) нет нет —
filter[found_to] параметр запроса строка (дата) нет нет —

Ответы

HTTP Назначение и схема
200 Успех. Полная схема и пример
401 Требуется действующий Bearer. Коды и формат ошибки
403 Недостаточно допуска. Коды и формат ошибки
422 Ошибка входных данных. Коды и формат ошибки
429 Лимит запросов, Retry-After. Коды и формат ошибки
503 Временно недоступно. Коды и формат ошибки

Каждый ответ содержит новый X-Request-Id в заголовке. Общие транспортные отказы и правила повтора действуют также при отказе до контроллера; см. ошибки.

Пример запроса

Запускается из каталога комплекта после настройки переменных в быстром старте. Замените демонстрационные идентификаторы 101 и UUID идентификаторами доступных записей. $RESOURCE_VERSION берётся из GET владельца версии, описанного выше. Для нового действия сохраните новый ключ; для повтора используйте прежний.

curl --silent --show-error --globoff \
  "$API/equipment-defects" \
  --header "Authorization: Bearer $SERVICEAPP_TOKEN" \
  --header "Accept: application/json"

POST /equipment-defects

Создание.

Доступ. Разрешения подключения: equipment_defects:write. Права сотрудника: «ТОиР — Оборудование → Просмотр», «ТОиР — Обслуживание → Изменение». Дополнительно действуют доступ к записям, мастерским, модулям и условия полей из описания ресурса выше.

Параметры

Имя Где Тип Обязательно null Ограничения
Authorization заголовок строка да нет Bearer <SERVICEAPP_TOKEN>
Idempotency-Key заголовок строка да нет не менее 1 символов; не более 128 символов; Шаблон: ^[A-Za-z0-9._:-]+$

Тело запроса

Content-Type: application/json. Тело обязательно.

Поле Тип Обязательно null Ограничения и смысл
equipment_id целое число да нет ≥ 1
title строка да нет не более 255 символов
description строка / null нет да не более 10000 символов
severity строка нет нет Допустимо: "low", "medium", "high", "critical"; Приоритет планового обслуживания.
found_date строка / null (дата) нет да —

Ответы

HTTP Назначение и схема
201 Создано. Полная схема и пример
401 Требуется действующий Bearer. Коды и формат ошибки
403 Недостаточно допуска. Коды и формат ошибки
404 Не найдено или недоступно. Коды и формат ошибки
422 Ошибка входных данных. Коды и формат ошибки
429 Лимит запросов, Retry-After. Коды и формат ошибки
503 Временно недоступно. Коды и формат ошибки
HTTP Заголовок ответа Тип Описание
201 Location строка

Каждый ответ содержит новый X-Request-Id в заголовке. Общие транспортные отказы и правила повтора действуют также при отказе до контроллера; см. ошибки.

У принятого POST Location и meta.operation_id указывают на журнал операции; ETag отсутствует. При повторе запроса сохраняются исходные data/meta, добавляется Idempotency-Replayed: true. Версии передавайте по назначению, указанному в описании ресурса.

Пример запроса

Запускается из каталога комплекта после настройки переменных в быстром старте. Замените демонстрационные идентификаторы 101 и UUID идентификаторами доступных записей. $RESOURCE_VERSION берётся из GET владельца версии, описанного выше. Для нового действия сохраните новый ключ; для повтора используйте прежний.

curl --silent --show-error --globoff --request POST \
  "$API/equipment-defects" \
  --header "Authorization: Bearer $SERVICEAPP_TOKEN" \
  --header "Accept: application/json" \
  --header "Idempotency-Key: example:v1-equipment-defects-create:001" \
  --header "Content-Type: application/json" \
  --data-binary '@examples/requests/v1.equipment-defects.create.json'

GET /equipment-defects/{id}

Карточка.

Доступ. Разрешения подключения: equipment_defects:read. Права сотрудника: «ТОиР — Оборудование → Просмотр», «ТОиР — Обслуживание → Просмотр». Дополнительно действуют доступ к записям, мастерским, модулям и условия полей из описания ресурса выше.

Параметры

Имя Где Тип Обязательно null Ограничения
Authorization заголовок строка да нет Bearer <SERVICEAPP_TOKEN>
id путь строка да нет Шаблон: ^(?:[0-9]+)$
If-None-Match заголовок строка нет нет —

Ответы

HTTP Назначение и схема
200 Успех. Полная схема и пример
304 Представление не изменилось, без тела. Условный GET
401 Требуется действующий Bearer. Коды и формат ошибки
403 Недостаточно допуска. Коды и формат ошибки
404 Не найдено или недоступно. Коды и формат ошибки
422 Ошибка входных данных. Коды и формат ошибки
429 Лимит запросов, Retry-After. Коды и формат ошибки
503 Временно недоступно. Коды и формат ошибки
HTTP Заголовок ответа Тип Описание
200 ETag строка
304 ETag строка

Каждый ответ содержит новый X-Request-Id в заголовке. Общие транспортные отказы и правила повтора действуют также при отказе до контроллера; см. ошибки.

Пример запроса

Запускается из каталога комплекта после настройки переменных в быстром старте. Замените демонстрационные идентификаторы 101 и UUID идентификаторами доступных записей. $RESOURCE_VERSION берётся из GET владельца версии, описанного выше. Для нового действия сохраните новый ключ; для повтора используйте прежний.

curl --silent --show-error --globoff \
  "$API/equipment-defects/101" \
  --header "Authorization: Bearer $SERVICEAPP_TOKEN" \
  --header "Accept: application/json"

POST /equipment-defects/{id}/update

Изменение разрешённых полей.

Доступ. Разрешения подключения: equipment_defects:write. Права сотрудника: «ТОиР — Оборудование → Просмотр», «ТОиР — Обслуживание → Изменение». Дополнительно действуют доступ к записям, мастерским, модулям и условия полей из описания ресурса выше.

Параметры

Имя Где Тип Обязательно null Ограничения
Authorization заголовок строка да нет Bearer <SERVICEAPP_TOKEN>
id путь строка да нет Шаблон: ^(?:[0-9]+)$
Idempotency-Key заголовок строка да нет не менее 1 символов; не более 128 символов; Шаблон: ^[A-Za-z0-9._:-]+$
If-Resource-Version заголовок строка да нет не менее 1 символов; не более 128 символов; Шаблон: ^[A-Za-z0-9._~-]+$

Тело запроса

Content-Type: application/json. Тело обязательно.

Поле Тип Обязательно null Ограничения и смысл
equipment_id целое число нет нет ≥ 1
title строка нет нет не более 255 символов
description строка / null нет да не более 10000 символов
severity строка нет нет Допустимо: "low", "medium", "high", "critical"; Приоритет планового обслуживания.
found_date строка / null (дата) нет да —

Ответы

HTTP Назначение и схема
200 Успех. Полная схема и пример
401 Требуется действующий Bearer. Коды и формат ошибки
403 Недостаточно допуска. Коды и формат ошибки
404 Не найдено или недоступно. Коды и формат ошибки
409 Конфликт состояния или повтора. Коды и формат ошибки
412 Версия устарела. Коды и формат ошибки
422 Ошибка входных данных. Коды и формат ошибки
428 Нужно предусловие версии. Коды и формат ошибки
429 Лимит запросов, Retry-After. Коды и формат ошибки
503 Временно недоступно. Коды и формат ошибки
HTTP Заголовок ответа Тип Описание
200 Location строка

Каждый ответ содержит новый X-Request-Id в заголовке. Общие транспортные отказы и правила повтора действуют также при отказе до контроллера; см. ошибки.

У принятого POST Location и meta.operation_id указывают на журнал операции; ETag отсутствует. При повторе запроса сохраняются исходные data/meta, добавляется Idempotency-Replayed: true. Версии передавайте по назначению, указанному в описании ресурса.

Пример запроса

Запускается из каталога комплекта после настройки переменных в быстром старте. Замените демонстрационные идентификаторы 101 и UUID идентификаторами доступных записей. $RESOURCE_VERSION берётся из GET владельца версии, описанного выше. Для нового действия сохраните новый ключ; для повтора используйте прежний.

curl --silent --show-error --globoff --request POST \
  "$API/equipment-defects/101/update" \
  --header "Authorization: Bearer $SERVICEAPP_TOKEN" \
  --header "Accept: application/json" \
  --header "Idempotency-Key: example:v1-equipment-defects-update:001" \
  --header "If-Resource-Version: $RESOURCE_VERSION" \
  --header "Content-Type: application/json" \
  --data-binary '@examples/requests/v1.equipment-defects.update.json'

POST /equipment-defects/{id}/resolve

Фиксация устранения.

Доступ. Разрешения подключения: equipment_defects:write. Права сотрудника: «ТОиР — Оборудование → Просмотр», «ТОиР — Обслуживание → Изменение». Дополнительно действуют доступ к записям, мастерским, модулям и условия полей из описания ресурса выше.

Параметры

Имя Где Тип Обязательно null Ограничения
Authorization заголовок строка да нет Bearer <SERVICEAPP_TOKEN>
id путь строка да нет Шаблон: ^(?:[0-9]+)$
Idempotency-Key заголовок строка да нет не менее 1 символов; не более 128 символов; Шаблон: ^[A-Za-z0-9._:-]+$
If-Resource-Version заголовок строка да нет не менее 1 символов; не более 128 символов; Шаблон: ^[A-Za-z0-9._~-]+$

Тело запроса

Content-Type: application/json. Тело обязательно.

Тело — пустой JSON-объект {}. Другие ключи не принимаются.

Ответы

HTTP Назначение и схема
200 Успех. Полная схема и пример
401 Требуется действующий Bearer. Коды и формат ошибки
403 Недостаточно допуска. Коды и формат ошибки
404 Не найдено или недоступно. Коды и формат ошибки
409 Конфликт состояния или повтора. Коды и формат ошибки
412 Версия устарела. Коды и формат ошибки
422 Ошибка входных данных. Коды и формат ошибки
428 Нужно предусловие версии. Коды и формат ошибки
429 Лимит запросов, Retry-After. Коды и формат ошибки
503 Временно недоступно. Коды и формат ошибки
HTTP Заголовок ответа Тип Описание
200 Location строка

Каждый ответ содержит новый X-Request-Id в заголовке. Общие транспортные отказы и правила повтора действуют также при отказе до контроллера; см. ошибки.

У принятого POST Location и meta.operation_id указывают на журнал операции; ETag отсутствует. При повторе запроса сохраняются исходные data/meta, добавляется Idempotency-Replayed: true. Версии передавайте по назначению, указанному в описании ресурса.

Пример запроса

Запускается из каталога комплекта после настройки переменных в быстром старте. Замените демонстрационные идентификаторы 101 и UUID идентификаторами доступных записей. $RESOURCE_VERSION берётся из GET владельца версии, описанного выше. Для нового действия сохраните новый ключ; для повтора используйте прежний.

curl --silent --show-error --globoff --request POST \
  "$API/equipment-defects/101/resolve" \
  --header "Authorization: Bearer $SERVICEAPP_TOKEN" \
  --header "Accept: application/json" \
  --header "Idempotency-Key: example:v1-equipment-defects-resolve:001" \
  --header "If-Resource-Version: $RESOURCE_VERSION" \
  --header "Content-Type: application/json" \
  --data-binary '@examples/requests/v1.equipment-defects.resolve.json'

POST /equipment-defects/{id}/create-maintenance

Создание корректирующей заявки ТО.

Доступ. Разрешения подключения: equipment_defects:write. Права сотрудника: «ТОиР — Оборудование → Просмотр», «ТОиР — Обслуживание → Изменение». Дополнительно действуют доступ к записям, мастерским, модулям и условия полей из описания ресурса выше.

Параметры

Имя Где Тип Обязательно null Ограничения
Authorization заголовок строка да нет Bearer <SERVICEAPP_TOKEN>
id путь строка да нет Шаблон: ^(?:[0-9]+)$
Idempotency-Key заголовок строка да нет не менее 1 символов; не более 128 символов; Шаблон: ^[A-Za-z0-9._:-]+$
If-Resource-Version заголовок строка да нет не менее 1 символов; не более 128 символов; Шаблон: ^[A-Za-z0-9._~-]+$

Тело запроса

Content-Type: application/json. Тело обязательно.

Поле Тип Обязательно null Ограничения и смысл
workshop_id целое число да нет ≥ 1
planned_date строка (дата) нет нет —

Ответы

HTTP Назначение и схема
200 Успех. Полная схема и пример
201 Создано. Полная схема и пример
401 Требуется действующий Bearer. Коды и формат ошибки
403 Недостаточно допуска. Коды и формат ошибки
404 Не найдено или недоступно. Коды и формат ошибки
409 Конфликт состояния или повтора. Коды и формат ошибки
412 Версия устарела. Коды и формат ошибки
422 Ошибка входных данных. Коды и формат ошибки
428 Нужно предусловие версии. Коды и формат ошибки
429 Лимит запросов, Retry-After. Коды и формат ошибки
503 Временно недоступно. Коды и формат ошибки
HTTP Заголовок ответа Тип Описание
200 Location строка
201 Location строка

Каждый ответ содержит новый X-Request-Id в заголовке. Общие транспортные отказы и правила повтора действуют также при отказе до контроллера; см. ошибки.

У принятого POST Location и meta.operation_id указывают на журнал операции; ETag отсутствует. При повторе запроса сохраняются исходные data/meta, добавляется Idempotency-Replayed: true. Версии передавайте по назначению, указанному в описании ресурса.

Пример запроса

Запускается из каталога комплекта после настройки переменных в быстром старте. Замените демонстрационные идентификаторы 101 и UUID идентификаторами доступных записей. $RESOURCE_VERSION берётся из GET владельца версии, описанного выше. Для нового действия сохраните новый ключ; для повтора используйте прежний.

curl --silent --show-error --globoff --request POST \
  "$API/equipment-defects/101/create-maintenance" \
  --header "Authorization: Bearer $SERVICEAPP_TOKEN" \
  --header "Accept: application/json" \
  --header "Idempotency-Key: example:v1-equipment-defects-create-maintenance:001" \
  --header "If-Resource-Version: $RESOURCE_VERSION" \
  --header "Content-Type: application/json" \
  --data-binary '@examples/requests/v1.equipment-defects.create-maintenance.json'

POST /equipment-defects/{id}/create-warranty-act

Создание гарантийного акта.

Доступ. Разрешения подключения: equipment_defects:write. Права сотрудника: «ТОиР — Оборудование → Просмотр», «ТОиР — Обслуживание → Изменение». Дополнительно действуют доступ к записям, мастерским, модулям и условия полей из описания ресурса выше.

Параметры

Имя Где Тип Обязательно null Ограничения
Authorization заголовок строка да нет Bearer <SERVICEAPP_TOKEN>
id путь строка да нет Шаблон: ^(?:[0-9]+)$
Idempotency-Key заголовок строка да нет не менее 1 символов; не более 128 символов; Шаблон: ^[A-Za-z0-9._:-]+$
If-Resource-Version заголовок строка да нет не менее 1 символов; не более 128 символов; Шаблон: ^[A-Za-z0-9._~-]+$

Тело запроса

Content-Type: application/json. Тело обязательно.

Поле Тип Обязательно null Ограничения и смысл
workshop_id целое число да нет ≥ 1
status_id целое число нет нет ≥ 1
stock_id целое число нет нет ≥ 1

Ответы

HTTP Назначение и схема
200 Успех. Полная схема и пример
201 Создано. Полная схема и пример
401 Требуется действующий Bearer. Коды и формат ошибки
403 Недостаточно допуска. Коды и формат ошибки
404 Не найдено или недоступно. Коды и формат ошибки
409 Конфликт состояния или повтора. Коды и формат ошибки
412 Версия устарела. Коды и формат ошибки
422 Ошибка входных данных. Коды и формат ошибки
428 Нужно предусловие версии. Коды и формат ошибки
429 Лимит запросов, Retry-After. Коды и формат ошибки
503 Временно недоступно. Коды и формат ошибки
HTTP Заголовок ответа Тип Описание
200 Location строка
201 Location строка

Каждый ответ содержит новый X-Request-Id в заголовке. Общие транспортные отказы и правила повтора действуют также при отказе до контроллера; см. ошибки.

У принятого POST Location и meta.operation_id указывают на журнал операции; ETag отсутствует. При повторе запроса сохраняются исходные data/meta, добавляется Idempotency-Replayed: true. Версии передавайте по назначению, указанному в описании ресурса.

Пример запроса

Запускается из каталога комплекта после настройки переменных в быстром старте. Замените демонстрационные идентификаторы 101 и UUID идентификаторами доступных записей. $RESOURCE_VERSION берётся из GET владельца версии, описанного выше. Для нового действия сохраните новый ключ; для повтора используйте прежний.

curl --silent --show-error --globoff --request POST \
  "$API/equipment-defects/101/create-warranty-act" \
  --header "Authorization: Bearer $SERVICEAPP_TOKEN" \
  --header "Accept: application/json" \
  --header "Idempotency-Key: example:v1-equipment-defects-create-warranty-act:001" \
  --header "If-Resource-Version: $RESOURCE_VERSION" \
  --header "Content-Type: application/json" \
  --data-binary '@examples/requests/v1.equipment-defects.create-warranty-act.json'