---
title: "Проведение операции"
method: POST
path: "/operations"
tags: ["Operations"]
---

# Проведение операции

`POST /operations`

Проведение операции в UDS. После успешного завершения операция отобразится в списке операций в UDS, а администратор и клиент получат push-уведомление о покупке. 

### Способ предоставления скидки 

Зависит от выбранной компанией политики (поле `baseDiscountPolicy`) в настройках компании. Допустимо два значения: 

* `APPLY_DISCOUNT` - Понижать сумму счета: позволяет пользователю получать скидку в денежных единицах при проведении операции в размере, указанном в поле `participant.discountRate` в информации о пользователе; 

* `CHARGE_SCORES` - Начислять бонусные баллы. При проведении операции пользователь получит бонусные баллы в размере, указанном в поле `participant.cashbackRate` в информации о пользователе; 

### Основные моменты 

* Поля `total` и `points` должны быть введены со стороны интегрируемого приложения, но поле `cash` - вычислено при помощи запроса [Рассчитать информацию по операции](https://docs.uds.app/#tag/Operations/paths/~1operations~1calc/post). 

* Пользователь может быть идентифицирован с помощью кода на оплату, с помощью uuid-идентификатора (`participant -> uid`), либо с помощью номера телефона (поле `participant -> phone`). В случае, если пользователь идентифицирован с помощью `uid`, то списание бонусных баллов не будет разрешено. В таком случае требуется указать значение `0.0` в поле `points`, иначе будет получен ответ `400` с кодом ошибки `withdrawNotPermitted`; 

* Необходимо передавать только один из параметров: или код клиента, или номер телефона, или UID; 

* Все числа должны быть округлены по правилу математического округления (`round half up`). Баллы `points` можно округлять только в меньшую сторону; 

* Поля `cash`, `points` и `total` в обязательном порядке должны соответствовать настройке "Способ предоставления скидки" в настройках UDS 

* Поле `nonce` - произвольная строка вида uuid, которая может быть использована только однажды. Рекомендуется указывать для исключения повторных операций в случае дублирования запроса.  

* Поле `externalId` - идентификатор кассира, производивший оплату. Он может состоять только из латинских букв, цифр и символов `_`, `-`.  

* Eсли касса передает информацию о кассире, проводившем оплату, то для просмотра подробной информации о кассире подключите модуль [Сотрудники](https://store.uds.app/modules/staff)  

|Статус|Код ошибки|Описание| 
|--- |--- |--- | 
|`400`|badRequest|Возникли ошибки при проведении валидации. Для получения подробной информации об ошибке обратитесь к полю `errors`.| 
|`400`|invalidChecksum|Указанные значения в полях `cash`, `points` или `total` не соответствуют настройке "Способ предоставления скидки" в настройках UDS.| 
|`400`|withdrawNotPermitted|В запросе было указано значение в поле `participant -> uid`, при этом значение в поле `points` не равно `0.0`.| 
|`400`|insufficientFunds|Значение в поле `points`превышает доступное количество бонусных баллов на счете клиента.| 
|`400`|discountLimitExceed|Соотношение `points / total` больше, чем указано в настройках UDS.| 
|`400`|purchaseByPhoneDisabled|Проведение операции по номеру телефона не разрешено настройками UDS.| 
|`401`|unauthorized|Неверно указан ID компании или API Key| 
|`404`|notFound|Пользователь с данным кодом на оплату или идентификатором не найден.|

## Request body

- CreateOperation — Тело запроса для создания операции. Идентификация клиента возможна по промокоду, UID или номеру телефона. Значение `receipt.cash` должно быть получено из POST /operations/calc — не рассчитывайте его вручную.
  - `code` string, nullable — Код на оплату.
  - `participant` object, nullable — Информация о клиенте.
    - `uid` string, nullable — Идентификатор клиента в UDS (UID).
    - `phone` string, nullable — Номер телефона.
  - `nonce` string, nullable — Уникальный идентификатор операции (UUID).
  - `cashier` object, nullable — Информация о сотруднике.
    - `externalId` string — Внешний идентификатор сотрудника.
    - `name` string, nullable — Имя сотрудника.
  - `receipt` object, required — Информация о чеке.
    - `total` number, required — Сумма счета в денежных единицах.
    - `cash` number, required — Оплачиваемая сумма в денежных единицах.
    - `points` number, required — Оплачиваемая сумма в бонусных баллах.
    - `number` string, nullable — Номер чека.
    - `skipLoyaltyTotal` number, nullable — Часть суммы счета, на которую не начисляется кешбэк и на которую не распространяется скидка (в денежных единицах).
    - `unredeemableTotal` number, nullable — Часть суммы счета, которую нельзя погасить баллами.
  - `tags` TagId[], nullable — Список id тегов компании, назначаемых клиенту при проведении операции. Передача `null` означает, что существующее значение не будет изменено
  - `items` OperationItem[], nullable — Список позиций чека (товары/услуги).
    - `itemId` string, nullable — Идентификатор позиции.
    - `itemCode` string, nullable — Код позиции.
    - `type` string, nullable — Тип позиции (например, «product», «service»).
    - `name` string, nullable — Наименование позиции.
    - `measure` string, nullable — Единица измерения (например, «pcs», «kg», «litre»).
    - `vatCode` string, nullable — Код НДС (например, «vat20», «vat10», «vat0»).
    - `price` number, required — Цена за единицу (в денежных единицах).
    - `discountPrice` number, nullable — Цена со скидкой за единицу (в денежных единицах). Если указана, используется вместо `price`.
    - `qty` number, required — Количество.
    - `sku` string, nullable — Артикул (SKU).
    - `isAlcohol` boolean, nullable — Является ли позиция алкогольной продукцией.
    - `isTobacco` boolean, nullable — Является ли позиция табачной продукцией.
    - `excise` number, nullable — Сумма акциза.
    - `classificationCode` string, nullable — Классификационный код позиции.
    - `modifiers` object[], nullable — Модификаторы позиции в виде списка пар ключ-значение.
      - `key` string
      - `value` string
    - `attributes` object, nullable — Произвольные атрибуты позиции в формате ключ-значение.

## Response `200`

Операция.

- Operation — Завершённая транзакция в программе лояльности (покупка, возврат или вознаграждение). Содержит детали транзакции, информацию о клиенте, сотруднике и движении баллов.
  - `id` integer — ID операции в базе UDS .
  - `dateCreated` string, date-time — Дата операции.
  - `action` 'PURCHASE', required — Тип операции.
  - `state` 'NORMAL' | 'CANCELED' | 'REVERSAL' — Статус операции.
  - `customer` object — Информация о клиенте.
    - `id` integer — ID клиента в компании
    - `displayName` string — Имя и фамилия клиента.
    - `uid` string, nullable — Идентификатор клиента в UDS (UID).
    - `membershipTier` MembershipTier — Конфигурация уровня (статуса) в программе лояльности. Определяет ставку скидки/кешбэка и условия автоматического повышения по сумме покупок или количеству рекомендаций.
      - `uid` string — Идентификатор статуса.
      - `name` string, required — Название статуса.
      - `rate` number, required — Коэффициент статуса.
      - `maxScoresDiscount` number, nullable — Процент счета, который можно оплатить бонусными баллами.
      - `conditions` object — Условия для автоматического назначения статуса.
        - `totalCashSpent` object, nullable — Повысить статус, когда сумма покупок достигнет данного значения.
          - `target` number — Сумма покупок.
        - `effectiveInvitedCount` object, nullable — Повысить уровень, когда клиент достигнет значения `effectiveInvitedCount`.
          - `target` integer — Количество эффективных рекомендаций.
  - `cashier` object, nullable — Информация о сотруднике.
    - `id` integer — ID сотрудника в UDS.
    - `displayName` string — Имя сотрудника.
  - `branch` object, nullable — Информация о филиале.
    - `id` integer — ID филиала в UDS.
    - `displayName` string — Название филиала.
  - `points` number — Количество бонусных баллов, которое будет списано с клиента после завершения операции. Отрицательное значение говорит о списании, а положительное - о начислении бонусных баллов.
  - `certificatePoints` number, nullable — Количество списываемых баллов сертификата.
  - `receiptNumber` string, nullable — Номер чека.
  - `origin` object, nullable — Для сторнирующей операции - ссылка на оригинальную операцию.
    - `id` integer — Идентификатор исходной (оригинальной) операции.

---

[API](https://skmtc.dev/uds/apis/uds-api-2.md) · [All operations](https://skmtc.dev/uds/apis/uds-api-2/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/uds/uds-api-2/revisions/f4f284d76ad0/schema)
