FR (Функциональные требования)
Функциональные требования на создание заявки на досрочное расторжение договора
Область действия
Документ описывает функциональные требования к созданию заявки на досрочное расторжение договора через личный кабинет клиента.
Участники процесса
| Участник | Роль |
|---|---|
| Клиент | Инициирует создание заявки |
| Frontend | Отображает форму и отправляет REST-запрос |
| API Gateway | Принимает REST-запрос, валидирует и маппит данные в gRPC |
| Contract Termination Service | Выполняет бизнес-проверки и создает заявку |
| Contract Service | Предоставляет информацию о договоре |
| Notification Service | Отправляет уведомление клиенту |
Основной сценарий
- Клиент авторизуется в личном кабинете.
- Клиент открывает карточку активного договора.
- Клиент нажимает “Расторгнуть договор”.
- Система открывает форму создания заявки.
- Клиент заполняет обязательные поля.
- Клиент нажимает “Отправить заявку”.
- Frontend отправляет REST-запрос в API Gateway.
- API Gateway выполняет техническую валидацию.
- API Gateway маппит REST-запрос в gRPC-запрос.
- API Gateway вызывает
ContractTerminationService.CreateTerminationRequest. - Backend-сервис выполняет бизнес-проверки.
- Backend-сервис создает заявку.
- API Gateway возвращает фронту номер и статус заявки.
- Frontend показывает клиенту сообщение об успешной отправке.
Функциональные требования
FR.01. Отображение действия “Расторгнуть договор”
В карточке договора должна отображаться кнопка “Расторгнуть договор”, если выполняются условия:
| Условие | Значение |
|---|---|
| Договор принадлежит авторизованному клиенту | Да |
| Статус договора | ACTIVE |
| По договору нет активной заявки на расторжение | Да |
Если условие не выполняется, кнопка не отображается или отображается в заблокированном состоянии с поясняющим текстом.
FR.02. Открытие формы заявки
Форма должна содержать поля:
| Поле | Обязательность | Описание |
|---|---|---|
| Причина расторжения | Да | Выбор из справочника причин |
| Желаемая дата расторжения | Да | Дата, с которой клиент хочет расторгнуть договор |
| БИК банка | Да | Банковский идентификационный код |
| Номер счета | Да | Счет для возврата денежных средств |
| Получатель | Да | ФИО получателя |
| Комментарий | Нет | Дополнительная информация от клиента |
| Документы | Нет | Список приложенных документов |
FR.03. Валидация формы на Frontend
Frontend должен проверять:
| Проверка | Условие |
|---|---|
| Обязательные поля | Все обязательные поля заполнены |
| Желаемая дата расторжения | Не раньше текущей даты |
| БИК банка | 9 цифр |
| Номер счета | 20 цифр |
| Получатель | Не пустое значение, не более 255 символов |
| Комментарий | Не более 1000 символов |
| Количество документов | Не более 10 файлов |
| Размер одного файла | Не более 10 МБ |
Фронтовая валидация не заменяет backend-валидацию.
FR.04. Отправка REST-запроса
После нажатия “Отправить заявку” Frontend должен отправить REST-запрос:
POST /api/v1/contracts/{contractId}/termination-requestsFR.05. Проверка авторизации
API Gateway должен принимать запрос только от авторизованного пользователя.
Если пользователь не авторизован, API Gateway должен вернуть HTTP 401 Unauthorized.
FR.06. Техническая валидация на API Gateway
API Gateway должен проверить:
| Проверка | Ошибка |
|---|---|
contractId передан и соответствует UUID | VALIDATION_ERROR |
| Тело запроса соответствует JSON-схеме | VALIDATION_ERROR |
| Обязательные поля заполнены | VALIDATION_ERROR |
| Типы данных корректны | VALIDATION_ERROR |
Передан Idempotency-Key | VALIDATION_ERROR |
FR.07. Маппинг REST в gRPC
API Gateway должен преобразовать REST-запрос в gRPC-запрос к методу:
ContractTerminationService.CreateTerminationRequestПодробный маппинг описан в отдельном артефакте Mapping REST to gRPC.
FR.08. Бизнес-проверки backend-сервиса
ContractTerminationService должен выполнить проверки:
| ID | Проверка | Ошибка |
|---|---|---|
| FR.08.01 | Договор существует | CONTRACT_NOT_FOUND |
| FR.08.02 | Договор принадлежит клиенту | ACCESS_DENIED |
| FR.08.03 | Договор находится в статусе ACTIVE | CONTRACT_NOT_ACTIVE |
| FR.08.04 | По договору нет активной заявки | ACTIVE_REQUEST_ALREADY_EXISTS |
| FR.08.05 | Желаемая дата расторжения не раньше текущей даты | INVALID_TERMINATION_DATE |
| FR.08.06 | Банковские реквизиты проходят форматную проверку | INVALID_BANK_DETAILS |
| FR.08.07 | Документы существуют в файловом хранилище, если переданы | DOCUMENT_NOT_FOUND |
FR.09. Создание заявки
При успешном прохождении проверок ContractTerminationService должен создать заявку:
| Атрибут | Значение |
|---|---|
requestId | Уникальный UUID заявки |
requestNumber | Человекочитаемый номер заявки |
contractId | Идентификатор договора |
customerId | Идентификатор клиента |
reasonCode | Код причины расторжения |
desiredTerminationDate | Желаемая дата расторжения |
bankDetails | Банковские реквизиты |
comment | Комментарий клиента |
documentIds | Идентификаторы документов |
status | SUBMITTED |
createdAt | Дата и время создания |
updatedAt | Дата и время последнего обновления |
FR.10. Возврат результата на Frontend
После успешного создания заявки API Gateway должен вернуть:
| Поле | Описание |
|---|---|
requestId | UUID заявки |
requestNumber | Номер заявки |
status | Статус заявки |
createdAt | Дата и время создания |
message | Текст для отображения пользователю |
FR.11. Отправка уведомления
После создания заявки backend-сервис должен инициировать отправку уведомления клиенту:
Заявка на расторжение договора принята в работу. Номер заявки: {requestNumber}.Ошибка отправки уведомления не должна откатывать созданную заявку.
FR.12. Идемпотентность
API Gateway должен передавать в gRPC-запрос idempotencyKey, полученный из HTTP-заголовка Idempotency-Key.
Если клиент повторно отправляет запрос с тем же ключом, backend-сервис должен вернуть результат ранее созданной заявки, а не создавать дубль.
FR.13. Логирование
API Gateway и backend-сервис должны логировать:
| Событие | Где логируется |
|---|---|
| Получение REST-запроса | API Gateway |
| Ошибка технической валидации | API Gateway |
| Вызов gRPC-метода | API Gateway |
| Ошибка бизнес-валидации | Contract Termination Service |
| Создание заявки | Contract Termination Service |
| Отправка уведомления | Contract Termination Service / Notification Service |
В логах не должны сохраняться полные банковские реквизиты.