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

В 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](https://docs.pro.rent/d/api/main).
* `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>

Возможные статусы подписания договора вы можете посмотреть в разделе [Перечисления](https://docs.pro.rent/d/enums#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]: [Посмотреть схему](https://docs.pro.rent/d/models#apicontract)

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