# Согласование договоров и соглашений

В Pro.rent есть возможность подключить вашу систему согласования договоров и соглашений. Для этого перейдите в раздел [Настройки портала](https://portal.pro.rent/subscription/portal-settings) и включите согласование договоров.

Pro.rent поддерживает две метода передачи согласуемых договоров и соглашений в вашу систему:

1. Путем HTTP-запроса на внешний сервис согласования. Стоит использовать этот метод, если есть endpoint, на который Pro.rent может сделать HTTP-запрос.
2. Если нет возможности указать endpoint, на который Pro.rent может сделать HTTP-запрос, то вы должны с определенной периодичностью запрашивать список согласуемых документов.

Согласование выполняется в несколько этапов для обоих случаев.

## Этап 1 (если указана ссылка на внешний сервис) <a href="#step1-push" id="step1-push"></a>

При установке статуса договора или соглашения в `На согласовании`, Pro.rent передаст информацию в ваш сервис согласования путем выполнения запроса:

```url
POST {URL вашего сервиса}
```

{% code title="HTTP-заголовки" %}

```http
User-Agent: Pro.rent/{версия}
```

{% endcode %}

<pre class="language-typescript" data-title="Body"><code class="lang-typescript">{
    contract: <a data-footnote-ref href="#user-content-fn-1">ApiContract</a>, // Сущность договора
    versionId: number, // ID согласуемого соглашения
    resultUrl: string // URL для возврата результата согласования
}
</code></pre>

В ответ система ожидает успешный HTTP код `200` и следующие данные:

{% code title="Body ответа" %}

```typescript
{
    id: string, // ID согласования во внешнем сервисе
    name: string, // Название сервиса согласования
    url?: string, // Ссылка на договор или соглашение в сервисе согласования
    oneCId?: Guid // ID договора в 1С для записи в Pro.rent
}
```

{% endcode %}

{% hint style="warning" %}
На обработку запроса система дает 10 секунд, за которые необходимо вернуть HTTP код 200.
{% endhint %}

Чтобы сообщить об ошибке нужно указать HTTP код ответа  `400`.

После успешного ответа Pro.rent установит договору или соглашению статус `На согласовании` и отобразит в интерфейсе ссылку на него во внешнем сервисе.

## Этап 1 (если не указана ссылка на внешний сервис) <a href="#step1-request" id="step1-request"></a>

При установке статуса договора или соглашения в `На согласовании`, Pro.rent заблокирует дальнешнее изменение статуса договора, и вы должны запросить список документов на согласование путем выполнения запроса:

```uri
GET https://portal.pro.rent/api/approval?token={token}&onlynew={false|true}
```

* `token` – это токен приложения. Как его получить описано в разделе [Доступ по API](/d/api/main.md).
* `onlynew` отвечает за возврат всех согласуемых на текущий момент документов, или только тех, которые до этого не были приняты вашим сервисом согласования.

В ответ система вернет успешный HTTP код `200` и массив документов для согласования:

<pre class="language-typescript" data-title="Body ответа"><code class="lang-typescript">[
    {
        contract: <a data-footnote-ref href="#user-content-fn-1">ApiContract</a>, // Сущность договора
        versionId: number, // ID согласуемого соглашения
        acceptUrl: string, // URL для уведомления об успешном приеме докумета на согласование
        resultUrl: string // URL для возврата результата согласования
    },
    ...
]
</code></pre>

После успешного приема документов, необходимо для каждого из них выполнить запрос и уведомить Pro.rent о том, что документы были успешно приняты сервисом согласования:

```uri
POST {acceptUrl}
```

{% code title="Body" %}

```typescript
{
    id: string, // ID согласования во внешнем сервисе
    name: string, // Название сервиса согласования
    url?: string // Ссылка на договор или соглашение в сервисе согласования
}
```

{% endcode %}

В ответ система вернет успешный HTTP код `204`.

## Этап 2 <a href="#step2" id="step2"></a>

После согласования договора или соглашения внешний сервис должен вернуть результат в Pro.rent путем выполнения запроса:

```url
POST {resultUrl}
```

<pre class="language-typescript" data-title="Body"><code class="lang-typescript">{
    signStatus: <a data-footnote-ref href="#user-content-fn-2">ContractSignStatus</a>, // Обязательный статус договора, если согласование еще идет, то можно передать статус "На согласовании".
    reason?: string, // Необязательная причина отказа в согласовании или комментарии при согласовании. Максимальная длинна 1000 символов.
    number?: string, // Новый номер согласуемого договора или соглашения для записи в Pro.rent, если нужно изменить. Максимальная длинна 50 символов.
    date?: "yyyy-mm-dd", // Новая дата согласуемого договора или соглашения для записи в Pro.rent, если нужно изменить.
    oneCId?: Guid // ID договора в 1С для записи в Pro.rent
}
</code></pre>

Возможные статусы подписания договора вы можете посмотреть в разделе [Перечисления](/d/api/enums.md#contractsignstatus). Если согласование еще идет и вы лишь передаете новый номер договора, то можно указать статус «На согласовании».

{% hint style="info" %}
Запрос на возврат результата согласования можно выполнять несколько раз, если в процессе согласования статус подписания или номер меняются несколько раз.
{% endhint %}

## Отмена согласования <a href="#cancel" id="cancel"></a>

Пользователь Pro.rent может выбрать отмену согласования договора или соглашения. В этом случае будет выполнен следующий запрос:

```
POST {URL вашего сервиса}
```

<pre class="language-typescript" data-title="Body"><code class="lang-typescript">{
    contract: <a data-footnote-ref href="#user-content-fn-1">ApiContract</a>, // Сущность договора
    versionId: number, // ID согласуемого соглашения
    cancel: true
}
</code></pre>

Согласование в Pro.rent будет отменено независимо от результата выполнения этого запроса.

[^1]: [Посмотреть схему](/d/api/models.md#apicontract)

[^2]: [Посмотреть значения](/d/api/enums.md#contractsignstatus)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.pro.rent/d/api/external-approval.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
