Действия сотрудника (T20)¶
staff_actions.py — что сотрудник банка делает с заявкой в статусе in_review (SPEC §11): одобряет, меняет предложение, отказывает, запрашивает данные или перезапускает автоматический расчёт. Код причины и комментарий обязательны для каждого действия. Статус меняется только через transition и store_decision из workflow.py (WORKFLOW.md), поэтому каждое действие попадает в журнал.
Действия¶
| Действие | Переход | Что происходит |
|---|---|---|
approve |
in_review → offered |
Сотрудник оставляет все предложения системы или часть из них (offer_ids) |
change |
in_review → offered |
Сотрудник задаёт до 3 предложений: сумма, срок, при желании продукт и обеспечение. Каждое пересчитывается тем же quote (T16), по маршруту своей суммы, как предложения движка (quote_on_route, offers.py) |
decline |
in_review → declined |
Повторное обращение через 90 дней |
request_data |
in_review → needs_data |
Список документов попадает в Decision.requested_documents. Клиент отвечает выписками или продолжает без них, заявка пересчитывается (needs_data → enriching, T23, STATEMENTS.md) |
rerun |
in_review → submitted |
Повтор автоматического расчёта: число попыток обнуляется. Только для заявки без скоринга: обязательный источник был недоступен (route_source_unavailable), карта не подошла к признакам, или три автоматических расчёта упали (decision = null) |
Решение сотрудника — новый Decision поверх решения системы: статус, предложения, маршрут, а в reasons добавляется причина staff_<код>. В staff_text у неё название кода, должность и комментарий. В client_text — только то, что заявку рассмотрел специалист: код причины клиенту не показываем, среди кодов есть ПОД/ФТ (SPEC §1.11). Срок предложений (valid_until, 10 дней) считается от дня одобрения, а не от расчёта движка.
Чего нельзя. Сумма не может быть больше лимита: в контракте Offer.amount ≤ limit.limit, поэтому на сумму выше лимита API отвечает 422 с доступной суммой. Ставка выше потолка 30% или сумма ниже минимума продукта — тоже 422. Без скоринга (score = null) условия не посчитать: остаются отказ, запрос данных и перезапуск.
Полномочия и комитет¶
Каждое одобренное или изменённое предложение заново проходит матрицу полномочий: route_application(сумма предложения, ...) с грейдом, флагами и качеством данных из решения системы (ROUTING.md). Нужен самый строгий маршрут среди предложений.
- Маршрут
underwriter(илиauto) — решение применяется сразу, хватает одной подписи. - Маршрут
committee(сумма больше 15 млн ₽, или грейд D/E и сумма больше 5 млн ₽) — действие становится предложением комитету: оно сохраняется вloan_applications.pending_review, заявка остаётся вin_review. Решение применяется после второй подписи (sign).
Комитет — это две подписи (SPEC §15): андеррайтера и риск-менеджера, двух разных людей. Подписывать можно в любом порядке. Пока предложение ждёт подписи, другие действия по заявке недоступны (409). Второй подписант может отклонить предложение с кодом причины — тогда pending_review очищается, и заявку снова можно рассматривать.
Если сотрудник снизил сумму так, что она ушла из полномочий комитета, хватает одной подписи. Отказ и запрос данных — всегда одна подпись: это консервативные действия, им не нужны полномочия на сумму.
Коды причин¶
GET /api/v2/staff/reason-codes:
| Действие | Коды |
|---|---|
approve |
confirmed_by_review, flag_explained, data_verified |
change |
risk_not_in_model, term_for_cash_flow, collateral_added, product_changed, client_request |
decline |
fraud_suspected, aml_risk, business_risk, data_unreliable, repayment_capacity |
request_data |
statement_needed, documents_needed, revenue_unconfirmed |
rerun |
source_restored, technical_failure |
| отклонение решения комитетом | terms_disagreed, more_review_needed, authority_exceeded |
Комментарий — не короче 10 символов.
Насколько сотрудники согласны с системой¶
GET /api/v2/staff/overrides считает по всем применённым approve / change / decline (SPEC §11: «отдельно считаем, как часто андеррайтеры не соглашаются с системой»):
- согласие — одобрены все предложения системы, или отказ, когда предложений не было;
- несогласие (override) — одобрена только часть предложений, предложение изменено, или отказ, когда система предложения посчитала.
Ответ: decisions, overrides, override_rate, разбивка по действиям by_action и коды причин несогласий override_reasons. request_data и rerun — не решения, в счёт не идут. Флаг override хранится в событии review журнала.
Журнал¶
kind |
Когда | data |
|---|---|---|
review |
Действие применено | action, reason_code, comment, override, route, position, signatures (для комитета — обе) |
proposal |
Предложение комитету (первая подпись) | то же и offers |
signature |
Вторая подпись или отклонение | approve, comment, position, proposal; при отклонении reason_code |
После review идут обычные события decision и status от store_decision. Исполнитель — staff:<id>.
API (/api/v2, только сотрудник)¶
| Метод | Что |
|---|---|
POST /api/auth/staff |
{"password", "position"}: position — underwriter (по умолчанию) или risk_manager |
POST /applications/{id}/review |
{"action", "reason_code", "comment", "revision", "offer_ids"?, "changes"?, "documents"?}; changes — [{"amount", "term_months", "product"?, "collateral"?}]. Ответ {"outcome": "applied" | "proposed", "application"} |
POST /applications/{id}/review/sign |
{"approve", "comment", "revision", "reason_code"?} (код обязателен при approve = false). Ответ {"outcome": "applied" | "rejected", "application"} |
GET /staff/reason-codes |
Коды причин |
GET /staff/overrides |
Статистика несогласий |
Ошибки: 409 — устарел revision, заявка не в in_review или ждёт подписи; 422 — неверный код причины, короткий комментарий, сумма выше лимита, не та должность или тот же сотрудник на второй подписи. GET /applications/{id} для сотрудника отдаёт pending_review.
Упрощения¶
# SIMPLIFICATION:один парольSTAFF_PASSWORDна все должности; должность сотрудник выбирает при входе. В банке должность и полномочия берутся из справочника сотрудников, а комитет подписывает квалифицированной ЭП.# SIMPLIFICATION:коды причин — константы в коде, а не справочник кредитной политики с версиями вconfig/(перенос — отдельный PR в общую папку,docs/v2/NOTES.md, Unassigned).- Комитет — две подписи, а не заседание с протоколом (SPEC §15).
- Сотрудник не может одобрить сумму выше лимита: это потребовало бы изменить контракт
Offer.