Перейти к содержанию

Обработка агентом новой заявки#

Пользователи процесса#

Предусловия#

  • Заявка отправлена агенту на согласование (Статус заявки = AGENT_APPROVAL)

Точки входа#

Варианты завершения#

  • Заявка возвращена клиенту на доработку (Статус заявки = CUSTOMER_ADJUSTMENT)
  • Заявка отправлена на согласование клиенту (статус заявки = CUSTOMER_APPROVAL)

Процесс#

Общий вид#

Верхнеуровневый процесс обработки новой заявки агентом

# Шаг
1. Агент открывает заявку, проверяет её
1.1 Если к заявке есть замечания, Агент пишет их и отправляет на доработку клиенту. Конец сценария.
2 Агент заполняет поля заявки (маршрут, агентское вознаграждение, курс)
3 Агент отправляет заявку на согласование клиенту

Особенности процесса#

  • Пользователь с правом VIEW_ORDER
    • ролью CUSTOMER видит только "свои" заявки, у которых клиент order.document.customer связан с пользователем
    • ролью AGENT видит только "свои" заявки, у которых агент order.contract.document.agent - соответствуют пользователю
    • ролью PARTNER видит только заявки "своих" клиентов (у которых в карточке указан тот же партнёр, с которым связан пользователь-партнёр)
  • Пользователь с правом 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
Субагент
Атрибут объекта order.subagent
  • обязательное
  • не отображается клиенту

Наполнение выпадашки выбора субагента

  • макет

  • Система использует алгоритм автоподбора субагента, но не останавливается на первом подобранном варианте, а проверяет все строки маршрута, и формирует список для выбора из все маршрутов, подходящих для заявки. Для каждого субагента указан комментарий:

    • Рекомендованный - первый подходящий по алгоритму автоподбора субаагент (этого же субанета система выберет при автозаполнении субагента )
    • В белом списке - для субагента, которые есть в белом списке.
    • Из маршрута - для субагента, которые подходят по правилам маршрута кроме первого.
    • В чёрном списке - для субагентов, которые не прошли проверку по черному списку.
    • При этом, если субагент подходит под больше чем одно из условий для указания комментария, то комментарий устанавливается в порядке приоритета:
      • 1.В чёрном списке
      • 2.В белом списке
      • 3.Из маршрута
  • Система добавляет в список всех остальных субагентов, не подходящих по маршрутам и белым спискам, но связанных с агентом, который указан в выбранном контракте 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), система выполняет проверку: если в первоначальной заявке и в текущей совпадают Субагент, Плательщик, Банк счета плательщика, тогда
      • под полем показывается блок с предупреждением: Маршрут совпадает с первоначальной заявкой
      • после переоткрытия и обновления страницы заявки, блок с предупреждением не отображается.
Банк счета плательщика
Атрибут объекта 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
    • если валюты не равные, то значение, указанное пользователем на форме.

После сохранения заявки система:

  • переводит заявку в режим просмотра
  • показывает сообщение:

img_27.png

Документы#

Доступные функции при работе с документами в статусе NEW#

Просмотр и скачивание всех вложений, которые клиент прикрепил на этапе создания заявки доступно всем пользователям, которые могут просмотреть заявку

Отправка заявки на согласование клиенту#

# Шаг
1. Агент нажимает кнопку отправки заявки
2. Система делает недоступными все поля, кнопки и ссылки на форме, на всех закладках. Показывает лоадер на кнопке
3. Система проверят формат полей
2а. Если есть ошибки, система подсвечивает поля с ошибками. Конец процесса.
3. Система сохраняет заявку БД
4. Система проверят заполнение обязательных полей
4а. Если есть ошибки, система подсвечивает поля с ошибками. Конец процесса.
5. Система обновляет поля заявки и статус на CUSTOMER_APPROVAL
6. Система отправляет сообщение на почту клиенту
7. Система закрывает заявку, показывает список заявок и сообщение об успешной отправке

Проверка перед отправкой#

Перед отправкой система выполняет проверку:

  • формата и обязательность значений соответствуют описанию полей в разделе поля заявки
  • дата-время действия курса больше текущей даты-времени
  • контроль предельного значения ставки
  • Если обнаружены ошибки:
    • система показывает тултип на кнопке отправки: Заполните обязательные поля
    • форма переходит в режим редактирования (если она еще не в нем), подсвечиваются незаполненные поля. Пользователя перекидывает на вкладку «Параметры»

Контроль предельного значения ставки#

  • Указанный процент комиссии не меньше предельного значения ставки субагента, у которой:
    • subagent.costs[].currency = order.currencyCounterparty
    • subagent.costs[].minAmount <= order.payment.amountCounterparty
    • subagent.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_APPROVAL
  • order.verifiedAt - текущие дата и время
  • document.changedAt - текущие дата и время

Отправка сообщения на E-mail клиента#

Система отправляет сообщение на e-mail пользователя, создавшего заявку document.userCustomer