Оборудование в акте
Все операции. Авторизация. Запросы и повторы.
Все пути в этом файле дополняют /api/v1 на домене организации.
Описание и ограничения
Назначение
Состав оборудования акта и создание монтируемых единиц без смешения связей act_equipment, заявок ТО и продаж со склада.
Поля и назначение
| Публичное поле | Формат и смысл | Доступ |
|---|---|---|
equipment_ids |
массив of id, существующие единицы |
запись |
mode |
existing / client_unit / sold_unit |
запись |
unit |
объект, только для режима новой единицы | запись |
product_id, quantity |
товар и количество отдельных единиц, целое 1–100 | запись |
serial_numbers |
массив уникальных строк при quantity>1, длина равна quantity |
запись |
maintenance_schedule_ids |
массив of id |
запись |
expected_versions |
ссылки на ресурсы по правилам версий | ожидаемая версия |
Обязательность и null указаны в схемах каждой операции ниже.
Доступ и выборка
acts:read/write + equipment:read/write; для ТО также maintenance_schedules:write; для продажи со склада — права товара и склада.
Режимы добавления
GET использует общую курсорную пагинацию и сортировки оборудования. Каждая строка data содержит equipment (публичную карточку из контракта equipment), act_product_id и maintenance_schedules. Ссылка на строку продажи возвращается только для текущего акта; исходная продажа из другого акта не раскрывается. Заявки ограничены текущим актом и собственными правами чтения: каждая содержит id, status, checklist: {completed, total} и version. Без maintenance_schedules:read или права «ТОиР — Обслуживание → Просмотр» массив пуст; скрытые заявки не участвуют в прогрессе. Чтение не создаёт чек-листы, записи об операции или события и не изменяет даты.
Все режимы требуют mode и If-Resource-Version акта. Общий максимум атомарного состава — 100 единиц, без скрытого разбиения на частично успешные запросы.
existing: ровноequipment_idsилиmaintenance_schedule_ids, непустой массив уникальных ID, плюсexpected_versionsкаждого выбранного объекта. Заявки разрешены только для акта ТО; оборудование проходит соответствующий доменный путь данного типа акта. Нельзя незаметно заменить выбранную открытую заявку новой.- client_unit: обязательный
unitсname; разрешеныequipment_model_id,manufacturer_id,device_type_id,model_name,serial_number,inventory_number,customer_site_id,manufacture_date,installation_date,warranty_expires_at,location,noteиcustom_fieldsпо equipment.customer_idвыводится из акта. Product_id/quantity/equipment_ids запрещены. Для монтажа создаётся одна pending_install единица, для ТО — одна единица и её заявка. sold_unit: только монтаж;product_idобязателен,quantity=1по умолчанию. Объектunitсодержит паспортные сведения, кроме клиента, названия, товара каталога и статуса. Приquantity>1нельзя передавать серийный номер вunit: для серийного товара нужен массивserial_numbersизquantityуникальных номеров. На каждую единицу создаются отдельные строки продажи и карточки оборудования. Для несерийного товараserial_numbersне передаётся. Цена берётся из каталога; ручная замена цены в этой команде не поддерживается.
В ответе 201 для новых единиц или 200 для присоединения существующих: data.equipment_ids, data.maintenance_schedule_ids и data.act_product_ids; meta.affected_resources содержит версии. Удаление принимает {} с If-Resource-Version акта, возвращает 200 с фактически оставшимся составом; защищённая история — 409. Удаляется связь/допустимая pending единица согласно домену, а не безусловно карточка существующего оборудования.
Правила и связи
- Каждая единица принадлежит клиенту акта; нельзя просто синхронизировать произвольные equipment_ids.
- Удаление из состава не означает безусловное удаление карточки оборудования.
Операции
| Метод | Путь | Назначение |
|---|---|---|
| GET | /acts/{act_id}/equipment |
Оборудование акта и состояние выполнения ТО |
| POST | /acts/{act_id}/equipment |
Добавление существующих или новых единиц по явному режиму |
| POST | /acts/{act_id}/equipment/{equipment_id}/remove |
Удаление единицы из состава с проверкой последствий |
GET /acts/{act_id}/equipment
Оборудование акта и состояние выполнения ТО.
Доступ. Разрешения подключения: acts:read, equipment:read. Права сотрудника: «Акты приёма оборудования → Просмотр», «ТОиР — Оборудование → Просмотр». Дополнительно действуют доступ к записям, мастерским, модулям и условия полей из описания ресурса выше.
Параметры
| Имя | Где | Тип | Обязательно | null | Ограничения |
|---|---|---|---|---|---|
Authorization |
заголовок | строка | да | нет | Bearer <SERVICEAPP_TOKEN> |
act_id |
путь | строка | да | нет | Шаблон: ^(?:[0-9]+)$ |
sort |
параметр запроса | строка | нет | нет | Допустимо: "id", "-id", "updated_at,id", "-updated_at,-id" |
page[size] |
параметр запроса | целое число | нет | нет | ≥ 1; ≤ 100 |
page[cursor] |
параметр запроса | строка | нет | нет | не более 8192 символов |
Ответы
| HTTP | Назначение и схема |
|---|---|
| 200 | Успех. Полная схема и пример |
| 401 | Требуется действующий Bearer. Коды и формат ошибки |
| 403 | Недостаточно допуска. Коды и формат ошибки |
| 404 | Не найдено или недоступно. Коды и формат ошибки |
| 422 | Ошибка входных данных. Коды и формат ошибки |
| 429 | Лимит запросов, Retry-After. Коды и формат ошибки |
| 503 | Временно недоступно. Коды и формат ошибки |
Каждый ответ содержит новый X-Request-Id в заголовке. Общие транспортные отказы и правила повтора действуют также при отказе до контроллера; см. ошибки.
Пример запроса
Запускается из каталога комплекта после настройки переменных в быстром старте. Замените демонстрационные идентификаторы 101 и UUID идентификаторами доступных записей. $RESOURCE_VERSION берётся из GET владельца версии, описанного выше. Для нового действия сохраните новый ключ; для повтора используйте прежний.
curl --silent --show-error --globoff \
"$API/acts/101/equipment" \
--header "Authorization: Bearer $SERVICEAPP_TOKEN" \
--header "Accept: application/json"
POST /acts/{act_id}/equipment
Добавление существующих или новых единиц по явному режиму.
Доступ. Разрешения подключения: acts:write, equipment:read, equipment:write. Права сотрудника: «Акты приёма оборудования → Изменение», «ТОиР — Оборудование → Просмотр», «ТОиР — Оборудование → Изменение». Дополнительно действуют доступ к записям, мастерским, модулям и условия полей из описания ресурса выше.
Параметры
| Имя | Где | Тип | Обязательно | null | Ограничения |
|---|---|---|---|---|---|
Authorization |
заголовок | строка | да | нет | Bearer <SERVICEAPP_TOKEN> |
act_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 | Ограничения и смысл |
|---|---|---|---|---|
mode |
строка | да | нет | Допустимо: "existing", "client_unit", "sold_unit" |
equipment_ids |
массив | нет | нет | не менее 1 элементов; не более 100 элементов; Без повторов |
equipment_ids[] |
целое число | да | нет | ≥ 1 |
maintenance_schedule_ids |
массив | нет | нет | не менее 1 элементов; не более 100 элементов; Без повторов |
maintenance_schedule_ids[] |
целое число | да | нет | ≥ 1 |
expected_versions |
массив | нет | нет | не менее 1 элементов; не более 100 элементов |
expected_versions[] |
объект | да | нет | — |
expected_versions[].type |
строка | да | нет | Допустимо: "equipment", "maintenance-schedules" |
expected_versions[].id |
целое число | да | нет | ≥ 1 |
expected_versions[].version |
строка | да | нет | не более 128 символов; Шаблон: ^[0-9]+$ |
product_id |
целое число | нет | нет | ≥ 1 |
quantity |
целое число | нет | нет | ≥ 1; ≤ 100 |
serial_numbers |
массив | нет | нет | не менее 1 элементов; не более 100 элементов; Без повторов |
serial_numbers[] |
строка | да | нет | не менее 1 символов; не более 255 символов |
unit |
объект | нет | нет | Только перечисленные ключи |
unit.equipment_model_id |
строка / null (uuid) | нет | да | — |
unit.manufacturer_id |
целое число / null | нет | да | ≥ 1 |
unit.device_type_id |
целое число / null | нет | да | ≥ 1 |
unit.model_name |
строка / null | нет | да | не более 255 символов |
unit.serial_number |
строка / null | нет | да | не более 255 символов |
unit.inventory_number |
строка / null | нет | да | не более 255 символов |
unit.customer_site_id |
целое число / null | нет | да | ≥ 1 |
unit.manufacture_date |
строка / null (дата) | нет | да | — |
unit.installation_date |
строка / null (дата) | нет | да | — |
unit.warranty_expires_at |
строка / null (дата) | нет | да | — |
unit.location |
строка / null | нет | да | не более 2000 символов |
unit.note |
строка / null | нет | да | не более 10000 символов |
unit.custom_fields |
массив | нет | нет | не более 100 элементов; Без повторов |
unit.custom_fields[] |
объект | да | нет | — |
unit.custom_fields[].field_id |
целое число | да | нет | ≥ 1 |
unit.custom_fields[].value |
строка / логическое значение / массив / объект / null | да | да | — |
unit.custom_fields[].value (вариант 3) |
массив | нет | нет | — |
unit.custom_fields[].value (вариант 3)[] |
строка | да | нет | — |
unit.custom_fields[].value (вариант 4) |
объект | нет | нет | — |
unit.custom_fields[].value (вариант 4).amount |
строка | да | нет | — |
unit.custom_fields[].value (вариант 4).currency |
строка | да | нет | — |
unit.name |
строка | нет | нет | не менее 1 символов; не более 255 символов |
Условные требования: existing: equipment_ids XOR maintenance_schedule_ids + expected_versions; client_unit: unit.name; sold_unit: product_id. См. описание ресурса.
Ответы
| HTTP | Назначение и схема |
|---|---|
| 200 | Успех. Полная схема и пример |
| 201 | Создано. Полная схема и пример |
| 400 | Некорректный запрос. Коды и формат ошибки |
| 401 | Требуется действующий Bearer. Коды и формат ошибки |
| 403 | Недостаточно допуска. Коды и формат ошибки |
| 404 | Не найдено или недоступно. Коды и формат ошибки |
| 409 | Конфликт состояния или повтора. Коды и формат ошибки |
| 412 | Версия устарела. Коды и формат ошибки |
| 413 | Превышен размер. Коды и формат ошибки |
| 415 | Неподдерживаемый Content-Type. Коды и формат ошибки |
| 422 | Ошибка входных данных. Коды и формат ошибки |
| 428 | Нужно предусловие версии. Коды и формат ошибки |
| 429 | Лимит запросов, Retry-After. Коды и формат ошибки |
| 500 | Внутренняя ошибка, исход нужно уточнить. Коды и формат ошибки |
| 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/acts/101/equipment" \
--header "Authorization: Bearer $SERVICEAPP_TOKEN" \
--header "Accept: application/json" \
--header "Idempotency-Key: example:v1-act-equipment-store:001" \
--header "If-Resource-Version: $RESOURCE_VERSION" \
--header "Content-Type: application/json" \
--data-binary '@examples/requests/v1.act-equipment.store.json'
POST /acts/{act_id}/equipment/{equipment_id}/remove
Удаление единицы из состава с проверкой последствий.
Доступ. Разрешения подключения: acts:write, equipment:read, equipment:write. Права сотрудника: «Акты приёма оборудования → Изменение», «ТОиР — Оборудование → Просмотр», «ТОиР — Оборудование → Изменение». Дополнительно действуют доступ к записям, мастерским, модулям и условия полей из описания ресурса выше.
Параметры
| Имя | Где | Тип | Обязательно | null | Ограничения |
|---|---|---|---|---|---|
Authorization |
заголовок | строка | да | нет | Bearer <SERVICEAPP_TOKEN> |
act_id |
путь | строка | да | нет | Шаблон: ^(?:[0-9]+)$ |
equipment_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 | Успех. Полная схема и пример |
| 400 | Некорректный запрос. Коды и формат ошибки |
| 401 | Требуется действующий Bearer. Коды и формат ошибки |
| 403 | Недостаточно допуска. Коды и формат ошибки |
| 404 | Не найдено или недоступно. Коды и формат ошибки |
| 409 | Конфликт состояния или повтора. Коды и формат ошибки |
| 412 | Версия устарела. Коды и формат ошибки |
| 413 | Превышен размер. Коды и формат ошибки |
| 415 | Неподдерживаемый Content-Type. Коды и формат ошибки |
| 422 | Ошибка входных данных. Коды и формат ошибки |
| 428 | Нужно предусловие версии. Коды и формат ошибки |
| 429 | Лимит запросов, Retry-After. Коды и формат ошибки |
| 500 | Внутренняя ошибка, исход нужно уточнить. Коды и формат ошибки |
| 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/acts/101/equipment/101/remove" \
--header "Authorization: Bearer $SERVICEAPP_TOKEN" \
--header "Accept: application/json" \
--header "Idempotency-Key: example:v1-act-equipment-remove:001" \
--header "If-Resource-Version: $RESOURCE_VERSION" \
--header "Content-Type: application/json" \
--data-binary '@examples/requests/v1.act-equipment.remove.json'