Обработка агентом новой заявки#
Пользователи процесса#
Предусловия#
- Заявка отправлена агенту на согласование (Статус заявки = AGENT_APPROVAL)
Точки входа#
- По ссылке из письма
- Выбрал заявку в статусе AGENT_APPROVAL из списка заявок
Варианты завершения#
- Заявка возвращена клиенту на доработку (Статус заявки = CUSTOMER_ADJUSTMENT)
- Заявка отправлена на согласование клиенту (статус заявки = CUSTOMER_APPROVAL)
Процесс#
Общий вид#
Верхнеуровневый процесс обработки новой заявки агентом
| # | Шаг |
|---|---|
| 1. | Агент открывает заявку, проверяет её |
| 1.1 | Если к заявке есть замечания, Агент пишет их и отправляет на доработку клиенту. Конец сценария. |
| 2 | Агент заполняет поля заявки (маршрут, агентское вознаграждение, курс) |
| 3 | Агент отправляет заявку на согласование клиенту |
Особенности процесса#
- Пользователь с правом VIEW_ORDER
- ролью CUSTOMER видит только "свои" заявки, у которых клиент
order.document.customerсвязан с пользователем - ролью AGENT видит только "свои" заявки, у которых агент
order.contract.document.agent- соответствуют пользователю - ролью PARTNER видит только заявки "своих" клиентов (у которых в карточке указан тот же партнёр, с которым связан пользователь-партнёр)
- ролью CUSTOMER видит только "свои" заявки, у которых клиент
- Пользователь с правом VIEW_ORDER_ALL видит все заявки
- Внешний вид формы аналогичен форме Процесса обработки исполнителем новой заявки, особенности описаны в разделе Особенности статуса AGENT_APPROVAL
- В зависимости от роли, у пользователя отличаются доступные действия в заявке. Описаны в разделе Особенности статуса AGENT_APPROVAL
- При открытии заявки пользователем, заявка открывается в режиме просмотра.
- Для перехода в режим редактирования пользователь нажимает кнопку
Редактировать. - В режиме редактирования система позволяет редактировать только часть полей, относящихся к Маршруту (Субагент, Плательщик, Счет плательщика) и Агентскому вознаграждению (Курс, Срок курса, Комиссия %, Накладные расходы):
- Работа с вложениями (просмотреть, скачать) доступна без перехода в режим редактирования.
Особенности сабмита формы
- пользователь может сохранить заявку, даже если он не заполнил все обязательные поля
- при сохранении (и, опосредованно, при отправке, так как отправка тригерит сохранение) валидируются заполненные поля на соответстиве типам и паттернам.
- при отрпавке заявки проверяется заполнены ли все обязательные поля
- нельзя сохранить заявку, если в ней есть заполненные поля, чьё содержимое не отвечает требованиям
- можно сохранить заявку, если в ней не заполнены обязательные поля
- нельзя отправить заявку, если в ней не заполнены обязательные поля
Интерфейс#
Особенности статуса NEW#
- При открытии деталки заявки в статусе AGENT_APPROVAL пользователем с ролью AGENT, если не заполнены все четыре поля:
Курс,Срок действия курса,Комиссия %,Накладные расходы, система:- открывает заявку в режиме редактирования
- заполняет эти поля как при нажатии на кнопку
Обновить
в хинте статуса заявки отображается подсказка Агент заполняет заявку и отправляет клиенту на согласование
В зависимости от роли отличаются доступные действия и кнопки в заявке:
Видимость кнопок описана в import_order.json:
- Кнопка
Редактировать- отображается агенту - Кнопка
Закрыть заявку- отображается агенту, исполнителю, клиенту - Кнопка
Отправить клиенту на согласование- отображается агенту - Кнопка
Вернуть клиенту на доработку- отображается агенту
Заголовок и номер заявки#
В зависимости от типа order.document.direction заявки заголовок:
IMPORT:Импортная заявка+№{order.document.number}EXPORT:Экспортная заявка+№{order.document.number}
Поля заявки#
Отображаются все поля заявки, которые описаны в процессе обработки исполнителем новой заявки, все поля заполненные клиентом и исполнителем недоступны для редактирования.
Поля доступные для редактирования Агентом:
Группа полей Маршрут#
- Договор
- Атрибут объекта
order.contract
- см. описание в process_order_approval_contractor.md, недоступно для редактирования
- Субагент
- Атрибут объекта
order.subagent
- обязательное
- не отображается клиенту
Наполнение выпадашки выбора субагента
-
Система использует алгоритм автоподбора субагента, но не останавливается на первом подобранном варианте, а проверяет все строки маршрута, и формирует список для выбора из все маршрутов, подходящих для заявки. Для каждого субагента указан комментарий:
Рекомендованный- первый подходящий по алгоритму автоподбора субаагент (этого же субанета система выберет при автозаполнении субагента )В белом списке- для субагента, которые есть в белом списке.Из маршрута- для субагента, которые подходят по правилам маршрута кроме первого.В чёрном списке- для субагентов, которые не прошли проверку по черному списку.- При этом, если субагент подходит под больше чем одно из условий для указания комментария, то комментарий устанавливается в порядке приоритета:
- 1.
В чёрном списке - 2.
В белом списке - 3.
Из маршрута
- 1.
- Система добавляет в список всех остальных субагентов, не подходящих по маршрутам и белым спискам,
но связанных с агентом, который указан в выбранном контракте
subagent.agents[] = order.contract.agentВарианты комментария для таких субагентов:В чёрном списке- для субагентов, которые не прошли проверку по черному списку.- Комментарий отсутствует - для всех остальных субагентов.
- порядок сортировки:
- сначала по комментарию:
РекомендованныйВ белом спискеИз маршрута- Комментарий отсутствует
В чёрном списке
- внутри каждой тз групп по комментарию сортировка по алфавиту
- сначала по комментарию:
При изменении значения поля пользователем: - система заполняет[changelog](../../changelog) плательщика и его счет - Поведение системы в зависимости от результата подбора субагента, плательщика, счета плательщика - система проверяет субагента в черном списке. Если субагент в чёрном списке: - показывает под полем блок с предупреждением - после переоткрытия и обновления страницы заявки, блок с предупреждением не отображается.
- Плательщик
- Атрибут объекта
order.subsidiary
- обязательное
- выбор из плательщиков, в списке для выбора отображаются:
- все приоритетные плательщики, связанные с выбранным субагентом помечается индикатором приоритета (см. алгоритм выбора плательщика для автоподбора
- не приоритетные плательщики, связанные с выбранным субагентом у которых есть счет в валюте заявке (см. алгоритм выбора плательщика для автоподбора
- если Плательщик не проходит проверку по черному списку, для плательщика указывается комментарий
В чёрном списке - если Плательщик указан в списке приоритетных и не проходит проверку по черному списку, для плательщика указывается комментарий
В чёрном списке, индикатор приоритета не отображается - приоритетные плательщики клиента отображаются сверху (сортировка по полю
subsidiary.priority), остальные ниже (сортировка тоже поsubsidiary.priority) - при изменении значения поля пользователем, система заполняет счет плательщика
- Расчетный счет плательщика
- Атрибут объекта
order.subsidiaryBankAccount
- обязательное
- не отображается клиенту
- выбор из Счетов плательщиков, у которых:
subsidiary.bankAccounts[].currency = order.currencyCounterparty- счет в валюте заявки.subsidiary.bankAccounts[].status = ACTIVE- счет должен быть активный.
- если у счета установлен признак приоритета,
subsidiary.bankAccounts[].isPriority = true, то в выпадашке такая строка помечается индикатором приоритета - если пользователь в поле вводит номер счета, название банка, SWIFT или их части, система показывает список, в котором номер счет, название банка или SWIFT содержат введенное пользователем значение.
- приоритетные счета отображаются сверху, остальные ниже
- сортировка по SWIFT банка, по алфавиту.
- при изменении значения поля пользователем:
- если заявка является заявкой на переисполнение (есть рекламация, которая ссылается на текущую заявку в complaint.reExecutionOrder),
система выполняет проверку: если в первоначальной заявке и в текущей совпадают
Субагент,Плательщик,Банк счета плательщика, тогда- под полем показывается блок с предупреждением:
Маршрут совпадает с первоначальной заявкой - после переоткрытия и обновления страницы заявки, блок с предупреждением не отображается.
- под полем показывается блок с предупреждением:
- если заявка является заявкой на переисполнение (есть рекламация, которая ссылается на текущую заявку в complaint.reExecutionOrder),
система выполняет проверку: если в первоначальной заявке и в текущей совпадают
- Банк счета плательщика
- Атрибут объекта
order.subsidiaryBankAccount.bank
- недоступно для редактирования
- отображается только клиенту начиная со статуса EXECUTIOM
- аналогично полю
Банк получателя(из справочника SWIFT)
Группа полей Агентское вознаграждение#
- отображаются в заявке всем пользователям, кроме COSTOMER
- Комиссия %
- Атрибут объекта
order.commission.percent
- обязательное
- инпут
- число
- минимальное значение - 0,00
- максимальное значение - 100
- разделитель групп разрядов - пробел
- десятичный разделитель - запятая
- 4 знака дробной части отображаются всегда:
- если пользователь вводит целое число, система добавляет в поле
,0000. Например: введено123456, отображается123 456,0000 - если пользователь вводит число одним заком поле запятой, система добавляет
0. Например: введено123456,3, отображается123 456,3000 - если пользователь вводит точку для разделения дробной части, система заменяет точку на запятую. Например: введено
123456.3000, отображается123 456,3000 - Ссылка на пример (в примере нет добавления
,00)
- если пользователь вводит целое число, система добавляет в поле
- при вставке в поле значения из буфера, значение вставляется только если его формат соответствует требованиям
При изменении значения поля пересчитывается блок итоговой информации.
Если пользователь вручную изменил значение поля, система очищает ссылки:
- на набор базовых ставок (
order.baseRateSet) - на запрос индивидуальных ставок (
order.individualRateSet)
- Накладные расходы
- Атрибут объекта
order.commission.amountOperatingCostCounterpartyCurrency
- не обязательное
- инпут
- число
- минимальное значение - 0,00
- максимальное значение - 99 999 999 999,99
- разделитель групп разрядов - пробел
- десятичный разделитель - запятая
- 2 знака дробной части отображаются всегда:
- если пользователь вводит целое число, система добавляет в поле
,00. Например: введено123456, отображается123 456,00 - если пользователь вводит число одним заком поле запятой, система добавляет
0. Например: введено123456,3, отображается123 456,30 - если пользователь вводит точку для разделения дробной части, система заменяет точку на запятую. Например: введено
123456.3, отображается123 456,30 - Ссылка на пример (в примере нет добавления
,00)
- если пользователь вводит целое число, система добавляет в поле
- при вставке в поле значения из буфера, значение вставляется только если его формат соответствует требованиям
При изменении значения поля пересчитывается блок итоговой информации.
Код валюты, отображаемый в поле, равен значению order.payment.currencyCounterparty (на отправку - Валюте получателя, на получение - Валюте отправителя)
Если пользователь вручную изменил значение поля, система очищает ссылки:
- на набор базовых ставок (
order.baseRateSet) - на запрос индивидуальных ставок (
order.individualRateSet)
- Курс
- Атрибут объекта
order.commission.exchangeRate
- обязательное
- инпут
- число
- минимальное значение - 0,00
- максимальное значение - 99 999 999 999,9999
- разделитель групп разрядов - пробел
- десятичный разделитель - запятая
- 4 знака дробной части отображаются всегда:
- если пользователь вводит целое число, система добавляет в поле
,0000. Например: введено123456, отображается123 456,0000 - если пользователь вводит число одним заком поле запятой, система добавляет
0. Например: введено123456,3, отображается123 456,3000 - если пользователь вводит точку для разделения дробной части, система заменяет точку на запятую. Например: введено
123456.3000, отображается123 456,3000 - Ссылка на пример (в примере нет добавления
,00)
- если пользователь вводит целое число, система добавляет в поле
- при вставке в поле значения из буфера, значение вставляется только если его формат соответствует требованиям
Если в заявке валюты order.currencyCounterparty и order.currencyCustomer равны, то поле не отображается.
При изменении значения поля:
- пересчитывается блок итоговой информации.
- пересчитывается значение поля срока действия курса
Действует до
Кнопка Обновить
- макет
- Отображается:
- в режиме редактирования
- пользователю с ролью, которая может редактировать заявку в этом статусе (см. import_order.json)
- при нажатии пользователем на кнопку, система:
- в процессе обработки: лоадер на полях
курсиСрок действия курса, все поля и кнопки неактивны - заполняет курс и его срок. Алгоритм заполнения аналогичен как при выборе договора
- в процессе обработки: лоадер на полях
- Действует до
- Атрибут объекта
order.commission.exchangeRateNotValidAfter(срок действия курса)
- обязательное
- инпут
- дата-время
- минимальное значение даты для выбора в выпадашке - текущие дата и время
- максимальное значение даты для выбора в выпадашке - 31.12.2100
- текст хинта и ошибки:
Укажите дату и время позже текущих - Заполняется автоматически При изменении значения поля Курс значением равным
{текущее дата-время} + SPA_EXCHANGE_RATE_VALIDITY_PERIOD_MINUTES
Итоговая информация по заявке#
См. описание работы блока итоговой информации
Просмотр и редактирование заявки#
Режим просмотра заявки#
- В режиме просмотра все поля недоступны для редактирования.
- При нажатии на кнопку
Редактироватьзаявка переходит в режим редактирования
Режим редактирования заявки#
- Доступны для редактирования только поля
Субагент,Плательщик,Счет плательщика,Комиссия %,Накладные расходы,Курс,Действует до. (см. в разделе Поля заявки) - Отображаются кнопки
ОтменитьиСохранить.Сохранитьстановится доступна только после изменения значения полей заявки.- при нажатии
Сохранитьсистема сохраняет заявку, возвращает форму в режим просмотра - при нажатии
Отменить, система сбрасывает изменения и возвращает форму в режим просмотра.
- При изменении значений полей от которых зависит блок итоговой информации, блок пересчитывает и обновляется.
Сохранение заявки#
Сохранение заявки выполняется:
- при нажатии пользователем кнопки
Сохранить - перед отправкой заявки исполнителем клиенту
При сохранении заявки, система:
- не выполняет проверку обязательности полей и наличия обязательных вложений
- выполняет проверку на соответствие типам и паттернам.
Соответствие полей формы схемам document и document-order описаны в разделе поля заявки
Кроме полей, введённых пользователем, система сохраняет:
order.document.changedAt- текущие дата времяorder.document.exchangeRate:- если в заявке валюты
order.currencyCounterpartyиorder.amountCounterpartyравны, то значение всегда 1 - если валюты не равные, то значение, указанное пользователем на форме.
- если в заявке валюты
После сохранения заявки система:
- переводит заявку в режим просмотра
- показывает сообщение:
Документы#
Доступные функции при работе с документами в статусе NEW#
Просмотр и скачивание всех вложений, которые клиент прикрепил на этапе создания заявки доступно всем пользователям, которые могут просмотреть заявку
Отправка заявки на согласование клиенту#
| # | Шаг |
|---|---|
| 1. | Агент нажимает кнопку отправки заявки |
| 2. | Система делает недоступными все поля, кнопки и ссылки на форме, на всех закладках. Показывает лоадер на кнопке |
| 3. | Система проверят формат полей |
| 2а. | Если есть ошибки, система подсвечивает поля с ошибками. Конец процесса. |
| 3. | Система сохраняет заявку БД |
| 4. | Система проверят заполнение обязательных полей |
| 4а. | Если есть ошибки, система подсвечивает поля с ошибками. Конец процесса. |
| 5. | Система обновляет поля заявки и статус на CUSTOMER_APPROVAL |
| 6. | Система отправляет сообщение на почту клиенту |
| 7. | Система закрывает заявку, показывает список заявок и сообщение об успешной отправке |
Проверка перед отправкой#
Перед отправкой система выполняет проверку:
- формата и обязательность значений соответствуют описанию полей в разделе поля заявки
- дата-время действия курса больше текущей даты-времени
- контроль предельного значения ставки
- Если обнаружены ошибки:
- система показывает тултип на кнопке отправки:
Заполните обязательные поля - форма переходит в режим редактирования (если она еще не в нем), подсвечиваются незаполненные поля. Пользователя перекидывает на вкладку «Параметры»
- система показывает тултип на кнопке отправки:
Контроль предельного значения ставки#
- Указанный процент комиссии не меньше предельного значения ставки субагента, у которой:
subagent.costs[].currency = order.currencyCounterpartysubagent.costs[].minAmount <= order.payment.amountCounterpartysubagent.costs[].maxAmount >= order.payment.amountCounterparty
Если найдена хотя бы одна subagent.costs[] для которой order.commission.percent < subagent.costs[].percent,
система показывает диалоговое окно подтверждения занижения предельного значения ставки.
- Если пользователь подтверждает:
- система сохраняет
- предельное значение ставки из настройки в заявку
order.commission.percentCost - пометку о подтверждении занижения предельного значения ставки
order.isBelowCost
- предельное значение ставки из настройки в заявку
- переводит заявку на следующий этап
- при открытии деталки заявки с сохраненной
order.commission.percentCost, в заявке отображается блок с информацией о том, что комиссия в заявке ниже предельного значения ставки. Блок отображается только для ролей CONTRACTOR, OBSERVER, COMPLIANCE
- система сохраняет
- Если пользователь отклоняет:
- система отображает в заявке блок с информацией о том, что комиссия в заявке ниже предельного значения ставки
- при открытии деталки заявки, блок с предупреждением не отображается
Если subagent.costs[] не найдено, проверка не выполняется.
Обновление полей заявки при отправке#
При отправке заявки исполнителю система записывает в заявку значения:
order.status- CUSTOMER_APPROVALorder.verifiedAt- текущие дата и времяdocument.changedAt- текущие дата и время
Отправка сообщения на E-mail клиента#
Система отправляет сообщение на e-mail пользователя, создавшего заявку document.userCustomer
