Зарплатные ведомости

OpenAPI 1.0.0

### Справочник кодов ошибок API Полный список кодов ошибок с подробными описаниями: [payroll-statement-api-errors-detailed.pdf](https://cdn.rbo.raiffeisen.ru/fs/cashmanagement/payroll-statement-api-errors-detailed.pdf)

Скачать исходную спецификацию

Варианты

  • Паблик

Операции API

POST /v1/statements — Создание ведомости

Метод используется для создания как подписанных, так и неподписанных ведомостей. Для неподписанной ведомости: - Поля signatures и digest передавать не нужно - Ведомость потребует подписания в онлайн-банке Для подписанной ведомости: - Необходимо передать поля signatures и digest - При наличии подписи (всех подписей) согласно настроенной схеме подписи, ведомость будет автоматически отправлена на исполнение Один и тот же сертификат подписи НЕ МОЖЕТ использоваться: - разными людьми в одной компании - одним человеком в рамках одной компании, но с разными типами подписей (например, "ПЕРВАЯ", "ВТОРАЯ") Это связано с ограничениями полномочий, закреплённых за сертификатом. Пример формирования короткой подписи: [тут](https://github.com/Raiffeisen-DGTL/data-signing/blob/main/src/main/java/ru/raiffeisen/signing/ShortSignatureGenerationExample.java) (также подробности в Readme проекта) Защита от дублирования. Поле externalId используется как уникальный идентификатор ведомости в разрезе одной компании. При повторной отправке запроса с тем же externalId вторая ведомость не будет создана — метод вернёт ошибку 400 с сообщением "Ведомость с данным externalId уже существует." ### Ограничения Максимальное количество переводов в ведомости: 10 000 При превышении лимита вернется ошибка `400 Bad Request` с кодом `transfers` и сообщением `transfers must contain no more than 10000 elements`.

{
  "tags": [
    "payroll-statements-methods"
  ],
  "summary": "Создание ведомости",
  "description": "Метод используется для создания как подписанных, так и неподписанных ведомостей.\n\nДля неподписанной ведомости:\n- Поля signatures и digest передавать не нужно\n- Ведомость потребует подписания в онлайн-банке\n\nДля подписанной ведомости:\n- Необходимо передать поля signatures и digest\n- При наличии подписи (всех подписей) согласно настроенной схеме подписи, ведомость будет автоматически отправлена на исполнение\n\nОдин и тот же сертификат подписи НЕ МОЖЕТ использоваться:\n- разными людьми в одной компании\n- одним человеком в рамках одной компании, но с разными типами подписей (например, \"ПЕРВАЯ\", \"ВТОРАЯ\")\n\nЭто связано с ограничениями полномочий, закреплённых за сертификатом.\n\nПример формирования короткой подписи: [тут](https://github.com/Raiffeisen-DGTL/data-signing/blob/main/src/main/java/ru/raiffeisen/signing/ShortSignatureGenerationExample.java) (также подробности в Readme проекта)\n\nЗащита от дублирования. Поле externalId используется как уникальный идентификатор ведомости в разрезе одной компании. При повторной отправке запроса с тем же externalId вторая ведомость не будет создана — метод вернёт ошибку 400 с сообщением \"Ведомость с данным externalId уже существует.\"\n\n### Ограничения\n\nМаксимальное количество переводов в ведомости: 10 000\n\nПри превышении лимита вернется ошибка `400 Bad Request` с кодом `transfers` и сообщением `transfers must contain no more than 10000 elements`.\n",
  "operationId": "create-statement",
  "requestBody": {
    "required": true,
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/CreateStatementRequest"
        }
      }
    }
  },
  "responses": {
    "202": {
      "description": "Accepted",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/CreateStatementResponse"
          },
          "example": {
            "externalId": "45d16dd7-feda-4022-821c-7f4271a49294"
          }
        }
      }
    },
    "400": {
      "description": "Bad request",
      "content": {
        "application/json": {
          "example": {
            "traceId": "84b19a21e19410b62c30b4cd40c228a1",
            "errors": [
              {
                "code": "enrollmentCode",
                "message": "Исправьте вид зачисления, выбрав нужный из справочника"
              }
            ]
          },
          "schema": {
            "$ref": "#/components/schemas/ErrorResponse"
          }
        }
      }
    },
    "401": {
      "$ref": "#/components/responses/Unauthorized"
    },
    "403": {
      "description": "Forbidden"
    },
    "404": {
      "description": "Not Found",
      "content": {
        "application/json": {
          "example": {
            "traceId": "84b19a21e19410b62c30b4cd40c228a1",
            "errors": [
              {
                "code": "account",
                "message": "Указанный счет не найден у компании."
              }
            ]
          },
          "schema": {
            "$ref": "#/components/schemas/ErrorResponse"
          }
        }
      }
    },
    "500": {
      "$ref": "#/components/responses/InternalError"
    }
  },
  "parameters": [
    {
      "$ref": "#/components/parameters/AuthorizationHeader"
    },
    {
      "$ref": "#/components/parameters/IdTokenHeader"
    }
  ]
}

GET /v1/statements/{externalId} — Получение статуса обработки ведомости

Необходимо вызывать после метода создания ведомости, чтобы узнать статус обработки с деталями. Подписанные ведомости могут находиться в статусах: `CHECKING`, `ERROR`, `ERROR_SIGN`, `PROCESSING`, `DECLINED`, `EXECUTED`, `PARTLY_EXECUTED`, `SCHEDULED`, `DELETED` Неподписанные ведомости могут находиться в статусах: 1) До подписания в онлайн-банке: `DRAFT`, `CHECKING`, `AWAITING_SIGN`, `AWAITING_SIGN_WITH_WARNINGS`, `ERROR`, `DELETED` 2) После подписания в онлайн-банке: `SIGNING`, `PARTLY_SIGNED`, `AWAITING_SEND`, `SCHEDULED`, `ERROR_SIGN`, `PROCESSING`, `DECLINED`, `EXECUTED`, `PARTLY_EXECUTED` Неподписанную ведомость необходимо подписать в онлайн-банке, если она перешла в статус `AWAITING_SIGN` или `AWAITING_SIGN_WITH_WARNINGS`. Если ведомость находится в статусе `ERROR` или `DECLINED`, для получения детализации ошибок по переводам, необходимо вызвать метод `Получение списка переводов по ведомости`. Рекомендации по опросу (polling). - Начинать опрос можно сразу после получения ответа 202 на запрос создания ведомости, без задержки. - Опрашивать статус ведомости следует не чаще 1 раза в секунду. - Прекратить опрос при достижении одного из финальных статусов. Финальные статусы для подписанной ведомости: `EXECUTED`, `PARTLY_EXECUTED`, `DECLINED`, `DELETED`, `ERROR`, `ERROR_SIGN`. Финальные статусы для неподписанной ведомости: `EXECUTED`, `PARTLY_EXECUTED`, `DECLINED`, `DELETED`, `ERROR_SIGN` (статус `ERROR` не является финальным — при наличии прав на редактирование можно исправить ошибку и подписать ведомость). Пример polling-цикла. 1. Вызвать GET /v1/statements/{externalId} и получить статус ведомости. 2. Если статус изменился — вызвать GET /v1/statements/{externalId}/transfers для получения деталей переводов. 3. Если статус не финальный — подождать 1 секунду и вернуться к шагу 1. 4. Если статус финальный — завершить опрос.

{
  "tags": [
    "payroll-statements-methods"
  ],
  "summary": "Получение статуса обработки ведомости",
  "description": "Необходимо вызывать после метода создания ведомости, чтобы узнать статус обработки с деталями.\n\nПодписанные ведомости могут находиться в статусах:\n`CHECKING`,\n`ERROR`,\n`ERROR_SIGN`,\n`PROCESSING`,\n`DECLINED`,\n`EXECUTED`,\n`PARTLY_EXECUTED`,\n`SCHEDULED`,\n`DELETED`\n\nНеподписанные ведомости могут находиться в статусах:\n1) До подписания в онлайн-банке:\n`DRAFT`,\n`CHECKING`,\n`AWAITING_SIGN`,\n`AWAITING_SIGN_WITH_WARNINGS`,\n`ERROR`,\n`DELETED`\n\n2) После подписания в онлайн-банке:\n`SIGNING`,\n`PARTLY_SIGNED`,\n`AWAITING_SEND`,\n`SCHEDULED`,\n`ERROR_SIGN`,\n`PROCESSING`,\n`DECLINED`,\n`EXECUTED`,\n`PARTLY_EXECUTED`\n\nНеподписанную ведомость необходимо подписать в онлайн-банке, если она перешла в статус `AWAITING_SIGN` или `AWAITING_SIGN_WITH_WARNINGS`.\n\nЕсли ведомость находится в статусе `ERROR` или `DECLINED`, для получения детализации ошибок по переводам, необходимо вызвать метод `Получение списка переводов по ведомости`.\n\nРекомендации по опросу (polling).\n- Начинать опрос можно сразу после получения ответа 202 на запрос создания ведомости, без задержки.\n- Опрашивать статус ведомости следует не чаще 1 раза в секунду.\n - Прекратить опрос при достижении одного из финальных статусов.\n   Финальные статусы для подписанной ведомости: `EXECUTED`, `PARTLY_EXECUTED`, `DECLINED`, `DELETED`, `ERROR`, `ERROR_SIGN`.\n   Финальные статусы для неподписанной ведомости: `EXECUTED`, `PARTLY_EXECUTED`, `DECLINED`, `DELETED`, `ERROR_SIGN` (статус `ERROR` не является финальным — при наличии прав на редактирование можно исправить ошибку и подписать ведомость).\n\nПример polling-цикла.\n1. Вызвать GET /v1/statements/{externalId} и получить статус ведомости.\n2. Если статус изменился — вызвать GET /v1/statements/{externalId}/transfers для получения деталей переводов.\n3. Если статус не финальный — подождать 1 секунду и вернуться к шагу 1.\n4. Если статус финальный — завершить опрос.\n",
  "operationId": "get-statement-status",
  "parameters": [
    {
      "$ref": "#/components/parameters/ExternalId"
    },
    {
      "$ref": "#/components/parameters/IdTokenHeader"
    },
    {
      "$ref": "#/components/parameters/AuthorizationHeader"
    }
  ],
  "responses": {
    "200": {
      "description": "OK",
      "content": {
        "application/json": {
          "example": {
            "externalId": "8c0bcca2-6571-4880-a1c2-10690200be9f",
            "status": "ERROR",
            "message": null,
            "errors": [
              {
                "code": "P20",
                "message": "Проверьте БИК и укажите правильный. Длина должна быть 9 цифр."
              }
            ],
            "warnings": [
              {
                "code": "P11",
                "message": "Заполните поле «Вид дохода», выбрав нужное значение."
              }
            ]
          },
          "schema": {
            "$ref": "#/components/schemas/StatementStatusResponse"
          }
        }
      }
    },
    "400": {
      "description": "Bad request",
      "content": {
        "application/json": {
          "example": {
            "traceId": "84b19a21e19410b62c30b4cd40c228a1",
            "errors": [
              {
                "code": "externalId",
                "message": "must match \\\"^[a-z0-9\\\\-]+$\\\""
              }
            ]
          },
          "schema": {
            "$ref": "#/components/schemas/ErrorResponse"
          }
        }
      }
    },
    "401": {
      "$ref": "#/components/responses/Unauthorized"
    },
    "404": {
      "description": "Not Found",
      "content": {
        "application/json": {
          "example": {
            "traceId": "84b19a21e19410b62c30b4cd40c228a1",
            "errors": [
              {
                "code": "externalId",
                "message": "Ведомости с таким идентификатором не существует."
              }
            ]
          },
          "schema": {
            "$ref": "#/components/schemas/ErrorResponse"
          }
        }
      }
    },
    "500": {
      "$ref": "#/components/responses/InternalError"
    }
  }
}

GET /v1/statements/{externalId}/transfers — Получение списка переводов по ведомости

Получение пагинированного списка переводов по ведомости с их статусами. Рекомендация — запрашивайте статусы переводов только после изменения статуса ведомости. Получить текущий статус ведомости можно через метод "Получение статуса обработки ведомости".

{
  "tags": [
    "payroll-statements-methods"
  ],
  "summary": "Получение списка переводов по ведомости",
  "description": "Получение пагинированного списка переводов по ведомости с их статусами.\n\nРекомендация — запрашивайте статусы переводов только после изменения статуса ведомости.\nПолучить текущий статус ведомости можно через метод \"Получение статуса обработки ведомости\".\n",
  "operationId": "get-statement-transfers",
  "parameters": [
    {
      "$ref": "#/components/parameters/ExternalId"
    },
    {
      "$ref": "#/components/parameters/Offset"
    },
    {
      "$ref": "#/components/parameters/Limit"
    },
    {
      "$ref": "#/components/parameters/IdTokenHeader"
    },
    {
      "$ref": "#/components/parameters/AuthorizationHeader"
    }
  ],
  "responses": {
    "200": {
      "description": "OK",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/StatementTransfersResponse"
          },
          "example": {
            "externalId": "45d16dd7-feda-4022-821c-7f4271a49294",
            "transfers": [
              {
                "orderNumber": 1,
                "status": "DECLINED",
                "message": "Счет сотрудника не найден в банке"
              },
              {
                "orderNumber": 2,
                "status": "DECLINED",
                "message": "Некорректно указан БИК"
              },
              {
                "orderNumber": 3,
                "status": "EXECUTED"
              }
            ],
            "offset": 0,
            "limit": 10,
            "totalCount": 3
          }
        }
      }
    },
    "400": {
      "description": "Bad request",
      "content": {
        "application/json": {
          "example": {
            "traceId": "84b19a21e19410b62c30b4cd40c228a1",
            "errors": [
              {
                "code": "externalId",
                "message": "must match \\\"^[a-z0-9\\\\-]+$\\\""
              }
            ]
          },
          "schema": {
            "$ref": "#/components/schemas/ErrorResponse"
          }
        }
      }
    },
    "401": {
      "$ref": "#/components/responses/Unauthorized"
    },
    "404": {
      "description": "Not Found",
      "content": {
        "application/json": {
          "example": {
            "traceId": "84b19a21e19410b62c30b4cd40c228a1",
            "errors": [
              {
                "code": "externalId",
                "message": "Ведомости с таким идентификатором не существует."
              }
            ]
          },
          "schema": {
            "$ref": "#/components/schemas/ErrorResponse"
          }
        }
      }
    },
    "500": {
      "$ref": "#/components/responses/InternalError"
    }
  }
}

Схемы и примеры

{
  "parameters": {
    "ExternalId": {
      "name": "externalId",
      "description": "Уникальный идентификатор ведомости во внешней системе",
      "in": "path",
      "required": true,
      "schema": {
        "type": "string",
        "minLength": 1,
        "maxLength": 40,
        "pattern": "^[a-z0-9\\-]+$"
      },
      "example": "8c0bcca2-6571-4880-a1c2-10690200be9f"
    },
    "Offset": {
      "name": "offset",
      "in": "query",
      "description": "Смещение для пагинации",
      "required": false,
      "schema": {
        "type": "integer",
        "default": 0
      },
      "example": 0
    },
    "Limit": {
      "name": "limit",
      "in": "query",
      "description": "Ограничение количества элементов на странице",
      "required": false,
      "schema": {
        "type": "integer",
        "default": 10
      },
      "example": 30
    },
    "IdTokenHeader": {
      "name": "Id-Token",
      "in": "header",
      "description": "Идентификационный токен пользователя",
      "required": true,
      "schema": {
        "type": "string",
        "format": "byte",
        "example": "SUQgVE9LRU4gRk9SIFRFU1RJTkc="
      }
    },
    "AuthorizationHeader": {
      "name": "Authorization",
      "in": "header",
      "description": "Токен доступа",
      "required": true,
      "schema": {
        "type": "string",
        "format": "byte",
        "example": "Bearer QXV0aG9yaXphdGlvbiBIZWFkZXIgRm9yIFRlc3Rpbmc="
      }
    }
  },
  "schemas": {
    "CreateStatementRequest": {
      "required": [
        "payload"
      ],
      "type": "object",
      "properties": {
        "payload": {
          "$ref": "#/components/schemas/StatementPayload"
        },
        "signatures": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Массив всех подписей, необходимых для подписания ведомости.\n\nКогда заполнять:\n- Если создаёте подписанную ведомость — укажите все подписи согласно схеме подписи\n- Если создаёте неподписанную ведомость — поле не нужно передавать в запросе\n"
        },
        "digest": {
          "example": "U7yPt0F4lS8xaN0ZXdLpREtXm+p0697FRRHrJbVSvlY=",
          "type": "string",
          "description": "Дайджест (хеш-сумма) содержимого payload.\n\nКогда заполнять:\n- Если создаёте подписанную ведомость — укажите дайджест\n- Если создаёте неподписанную ведомость — поле не нужно передавать в запросе\n"
        }
      }
    },
    "StatementPayload": {
      "required": [
        "externalId",
        "account",
        "transfersCount",
        "totalAmount",
        "enrollmentCode",
        "transfers"
      ],
      "type": "object",
      "description": "Запрос на создание ведомости",
      "properties": {
        "externalId": {
          "$ref": "#/components/schemas/ExternalId"
        },
        "account": {
          "type": "string",
          "minLength": 20,
          "maxLength": 20,
          "pattern": "^[0-9]+$",
          "description": "Банковский счёт ЮЛ для списания средств",
          "example": "40817810601002630020"
        },
        "transfersCount": {
          "type": "integer",
          "minimum": 1,
          "description": "Количество переводов в ведомости",
          "example": 1
        },
        "totalAmount": {
          "type": "number",
          "format": "double",
          "description": "Общая сумма выплат по ведомости",
          "minimum": 0,
          "exclusiveMinimum": true,
          "example": 500000.22
        },
        "date": {
          "type": "string",
          "format": "date",
          "description": "Дата формирования ведомости в формате YYYY-MM-DD. Можно не передавать — по умолчанию подставится текущая дата.",
          "example": "2025-01-19"
        },
        "number": {
          "type": "integer",
          "description": "Номер ведомости. Можно не передавать — система автоматически сгенерирует следующий порядковый номер для компании в текущем году.\n",
          "minimum": 1,
          "maximum": 999999,
          "example": 1
        },
        "conversionRates": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/ConversionRate"
          },
          "description": "Массив курсов конвертации для переводов с конвертацией валюты.\n\nКогда заполнять:\n- Если в ведомости есть переводы с конвертацией валюты — укажите курсы для всех валют, участвующих в конвертации\n- Если все переводы в рублях (RUR) без конвертации — поле не нужно передавать в запросе\n\nОграничения:\n- Максимум 2 валюты конвертации в ведомости (например, EUR и USD при основной валюте RUR)\n"
        },
        "enrollmentCode": {
          "type": "string",
          "description": "Код вида зачисления по ведомости (справочник).\nДопустимые значения:\n- \"01\" - Заработная плата\n- \"02\" - Аванс\n- \"03\" - Больничные\n- \"04\" - Премия\n- \"05\" - Отпускные\n- ...\n\nСправочник видов зачислений доступен [по ссылке](https://www.raiffeisen.ru/retail/payroll/payment_purpose)\n",
          "example": "01"
        },
        "incomeCode": {
          "$ref": "#/components/schemas/IncomeCode"
        },
        "purpose": {
          "type": "string",
          "maxLength": 118,
          "description": "Назначение платежной ведомости. Можно не передавать — система автоматически сгенерирует по правилу: \"Оплата {название вида зачисления в соответствии с enrollmentCode}\".\n\nПример: enrollmentCode \"01\" (Заработная плата) → purpose: \"Оплата Заработная плата\"\n",
          "example": "Выплата зарплаты за январь 2025 г"
        },
        "responsiblePerson": {
          "$ref": "#/components/schemas/ResponsiblePerson"
        },
        "reportingPeriod": {
          "$ref": "#/components/schemas/ReportingPeriod"
        },
        "transfers": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/Transfer"
          },
          "minItems": 1,
          "maxItems": 10000,
          "description": "Массив переводов"
        }
      }
    },
    "Transfer": {
      "type": "object",
      "required": [
        "firstName",
        "lastName",
        "orderNumber",
        "account",
        "amount",
        "currency"
      ],
      "properties": {
        "lastName": {
          "type": "string",
          "maxLength": 50,
          "description": "Фамилия сотрудника",
          "example": "Петров"
        },
        "firstName": {
          "type": "string",
          "maxLength": 50,
          "description": "Имя сотрудника",
          "example": "Петр"
        },
        "middleName": {
          "type": "string",
          "maxLength": 50,
          "description": "Отчество сотрудника",
          "example": "Петрович"
        },
        "amount": {
          "type": "number",
          "format": "double",
          "description": "Сумма перевода",
          "minimum": 0,
          "exclusiveMinimum": true,
          "example": 500000.22
        },
        "orderNumber": {
          "$ref": "#/components/schemas/OrderNumber"
        },
        "personnelNumber": {
          "type": "string",
          "maxLength": 60,
          "description": "Табельный номер сотрудника",
          "example": "AA011"
        },
        "birthDate": {
          "type": "string",
          "format": "date",
          "description": "Дата рождения сотрудника в формате YYYY-MM-DD",
          "example": "1990-01-30"
        },
        "account": {
          "type": "string",
          "minLength": 20,
          "maxLength": 20,
          "pattern": "^\\d{5}810\\d{12}$",
          "description": "Банковский счет сотрудника",
          "example": "40817810601002630020"
        },
        "bic": {
          "type": "string",
          "minLength": 9,
          "maxLength": 9,
          "pattern": "^[0-9]+$",
          "description": "БИК банка-получателя счета сотрудника, указывается обязательно для внешних переводов (не в АО Райффайзенбанк)",
          "example": "044525700"
        },
        "cardNumber": {
          "type": "string",
          "minLength": 14,
          "maxLength": 20,
          "pattern": "^[0-9]{14,20}$",
          "description": "Номер карты сотрудника",
          "example": "4000000000000000"
        },
        "currency": {
          "$ref": "#/components/schemas/Currency"
        },
        "conversion": {
          "type": "array",
          "description": "Массив процентов конвертации валюты для данного перевода.\n\nКогда заполнять:\n- Если перевод требует конвертации валюты — укажите проценты распределения по валютам\n- Если перевод в рублях (RUR) без конвертации — поле не нужно передавать в запросе\n\nОграничения:\n- Максимум 2 валюты конвертации в одном переводе\n",
          "items": {
            "$ref": "#/components/schemas/ConversionPercent"
          }
        },
        "deductionAmount": {
          "type": "number",
          "format": "double",
          "description": "Сумма удержания",
          "minimum": 0,
          "exclusiveMinimum": true,
          "example": 500.09
        }
      }
    },
    "ConversionPercent": {
      "required": [
        "percent",
        "currency"
      ],
      "type": "object",
      "description": "Массив процентов конвертации в валюту (в ведомости может быть максимум 2 валюты)",
      "properties": {
        "percent": {
          "type": "integer",
          "minimum": 1,
          "maximum": 100,
          "description": "Процент конвертации в валюте",
          "example": 20
        },
        "currency": {
          "$ref": "#/components/schemas/ConversionCurrency"
        }
      }
    },
    "ConversionRate": {
      "required": [
        "rate",
        "currency"
      ],
      "type": "object",
      "properties": {
        "rate": {
          "type": "number",
          "format": "double",
          "description": "Курс конвертации в валюте",
          "minimum": 0,
          "exclusiveMinimum": true,
          "example": 12.03
        },
        "currency": {
          "$ref": "#/components/schemas/ConversionCurrency"
        }
      }
    },
    "ResponsiblePerson": {
      "type": "object",
      "description": "Ответственное лицо. Можно не передавать в запросе — ведомость будет обработана корректно.",
      "required": [
        "fullName",
        "phone"
      ],
      "properties": {
        "fullName": {
          "type": "string",
          "maxLength": 250,
          "description": "ФИО ответственного лица",
          "example": "Иванов Иван Иванович"
        },
        "phone": {
          "type": "string",
          "maxLength": 16,
          "description": "Номер телефона ответственного лица",
          "example": "+79120000000"
        }
      }
    },
    "ReportingPeriod": {
      "description": "Дата отчётного периода. Можно не передавать в запросе — ведомость будет обработана корректно.",
      "type": "object",
      "required": [
        "year",
        "month"
      ],
      "properties": {
        "year": {
          "type": "integer",
          "description": "Год отчетного периода",
          "example": 2025
        },
        "month": {
          "type": "integer",
          "description": "Месяц отчетного периода",
          "example": 1
        }
      }
    },
    "CreateStatementResponse": {
      "type": "object",
      "required": [
        "externalId"
      ],
      "properties": {
        "externalId": {
          "$ref": "#/components/schemas/ExternalId"
        }
      }
    },
    "StatementStatusResponse": {
      "type": "object",
      "required": [
        "externalId",
        "status"
      ],
      "properties": {
        "externalId": {
          "$ref": "#/components/schemas/ExternalId"
        },
        "status": {
          "$ref": "#/components/schemas/StatementExternalStatus"
        },
        "message": {
          "type": "string",
          "minLength": 1,
          "description": "Причина отказа в случае статуса ведомости DECLINED",
          "example": "Обработка отложена, есть ограничения по счету компании"
        },
        "errors": {
          "type": "array",
          "description": "Список ошибок в ведомости в случае статуса ведомости ERROR",
          "items": {
            "$ref": "#/components/schemas/Error"
          }
        },
        "warnings": {
          "type": "array",
          "description": "Список предупреждений в ведомости",
          "items": {
            "$ref": "#/components/schemas/Warning"
          }
        }
      }
    },
    "StatementTransfersResponse": {
      "type": "object",
      "required": [
        "externalId",
        "transfers",
        "offset",
        "limit",
        "totalCount"
      ],
      "properties": {
        "externalId": {
          "$ref": "#/components/schemas/ExternalId"
        },
        "transfers": {
          "type": "array",
          "description": "Список переводов в ведомости cо статусами",
          "items": {
            "$ref": "#/components/schemas/TransferStatusDetails"
          }
        },
        "offset": {
          "$ref": "#/components/schemas/Offset"
        },
        "limit": {
          "$ref": "#/components/schemas/Limit"
        },
        "totalCount": {
          "$ref": "#/components/schemas/TotalCount"
        }
      }
    },
    "TransferStatusDetails": {
      "type": "object",
      "required": [
        "orderNumber",
        "status"
      ],
      "properties": {
        "orderNumber": {
          "$ref": "#/components/schemas/OrderNumber"
        },
        "status": {
          "$ref": "#/components/schemas/TransferExternalStatus"
        },
        "message": {
          "type": "string",
          "minLength": 1,
          "description": "Причина отказа в случае статуса перевода DECLINED",
          "example": null
        },
        "errors": {
          "type": "array",
          "description": "Список ошибок в переводе, заполняется в случае статуса перевода ERROR",
          "example": [
            {
              "code": "T06",
              "message": "Заполните лицевой счет сотрудника."
            }
          ],
          "items": {
            "$ref": "#/components/schemas/Error"
          }
        },
        "warnings": {
          "type": "array",
          "description": "Список предупреждений в переводе",
          "example": [
            {
              "code": "T16",
              "message": "Проверьте, что счет указан корректно и сотрудник прикреплен к зарплатному проекту."
            }
          ],
          "items": {
            "$ref": "#/components/schemas/Warning"
          }
        }
      }
    },
    "OrderNumber": {
      "type": "integer",
      "minimum": 1,
      "description": "Порядковый номер перевода в ведомости",
      "example": 1
    },
    "TransferExternalStatus": {
      "type": "string",
      "description": "Статус перевода",
      "example": "PROCESSING",
      "enum": [
        "CHECKING",
        "DRAFT",
        "CREATED",
        "CREATED_WITH_WARNINGS",
        "PROCESSING",
        "EXECUTED",
        "ERROR",
        "DECLINED"
      ]
    },
    "ExternalId": {
      "type": "string",
      "minLength": 1,
      "maxLength": 40,
      "pattern": "^[a-z0-9\\-]+$",
      "description": "Уникальный идентификатор ведомости во внешней системе",
      "example": "8c0bcca2-6571-4880-a1c2-10690200be9f"
    },
    "StatementExternalStatus": {
      "type": "string",
      "description": "Статус ведомости",
      "example": "CHECKING",
      "enum": [
        "DRAFT",
        "CHECKING",
        "AWAITING_SIGN",
        "AWAITING_SIGN_WITH_WARNINGS",
        "ERROR",
        "PARTLY_SIGNED",
        "SIGNING",
        "AWAITING_SEND",
        "PROCESSING",
        "DECLINED",
        "EXECUTED",
        "PARTLY_EXECUTED",
        "DELETED",
        "SCHEDULED",
        "ERROR_SIGN"
      ]
    },
    "IncomeCode": {
      "type": "integer",
      "description": "Код вида дохода по ведомости (справочник).\nДопустимые значения:\n- 1 - При переводе денежных средств, являющихся заработной платой и/или иными доходами, в отношении которых установлены ограничения размеров удержания\n- ...\n\nМожно не передавать — ведомость будет обработана. Система вернёт предупреждение об отсутствии кода вида дохода для неподписанной ведомости.\n",
      "example": 1,
      "enum": [
        1,
        2,
        3,
        4,
        5
      ]
    },
    "ConversionCurrency": {
      "type": "string",
      "minLength": 3,
      "maxLength": 3,
      "description": "Буквенный код валюты",
      "example": "CNY",
      "enum": [
        "USD",
        "EUR",
        "CNY"
      ]
    },
    "Currency": {
      "type": "string",
      "minLength": 3,
      "maxLength": 3,
      "description": "Буквенный код валюты счета-получателя сотрудника",
      "example": "RUR",
      "enum": [
        "RUR"
      ]
    },
    "Error": {
      "type": "object",
      "required": [
        "code",
        "message"
      ],
      "properties": {
        "code": {
          "type": "string",
          "description": "Код ошибки",
          "example": "P20"
        },
        "message": {
          "type": "string",
          "description": "Текст ошибки",
          "example": "Проверьте БИК и укажите правильный. Длина должна быть 9 цифр."
        }
      }
    },
    "Warning": {
      "type": "object",
      "required": [
        "code",
        "message"
      ],
      "properties": {
        "code": {
          "type": "string",
          "description": "Код предупреждения",
          "example": "P12"
        },
        "message": {
          "type": "string",
          "description": "Текст предупреждения",
          "example": "Измените код вида дохода на код, соответствующий виду зачисления, выбрав нужный из списка."
        }
      }
    },
    "ErrorResponse": {
      "type": "object",
      "required": [
        "traceId",
        "errors"
      ],
      "properties": {
        "traceId": {
          "type": "string",
          "description": "Идентификатор операции",
          "example": "84b19a21e19410b62c30b4cd40c228a1"
        },
        "errors": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    },
    "Offset": {
      "type": "integer",
      "description": "Смещение от начала списка",
      "example": 0,
      "minimum": 0
    },
    "Limit": {
      "type": "integer",
      "description": "Максимальное количество элементов на странице",
      "example": 10,
      "minimum": 1,
      "maximum": 100
    },
    "TotalCount": {
      "type": "integer",
      "description": "Общее количество элементов",
      "example": 1
    }
  },
  "responses": {
    "Unauthorized": {
      "description": "Аутентификация не пройдена"
    },
    "InternalError": {
      "description": "Внутренняя ошибка"
    }
  }
}