На данном проекте учащийся сможет реализовать бэкенд-приложение с микросервисной архитектурой - прототип небольшого банка.
Реализуя проект, учащийся приобретет знания и навыки, необходимые для любого современного бэкенд-разработчика:
- Разработка REST-API с использованием Spring Boot
- Работа с базой данных с использованием инструментов миграции
- Знание микросервисной архитектуры
- Синхронное и асинхронное взаимодействие сервисов через брокеры сообщений
- Документирование API через Swagger/OpenAPI
- Настройка CI-пайплайнов, контейнеризация приложения
Получить представление о Spring, PostgreSQL, Kafka и микросервисной архитектуре.
- Пользователь отправляет заявку на кредит.
- МС Заявка осуществляет прескоринг заявки и, если прескоринг проходит, то заявка сохраняется в МС Сделка и отправляется в МС Калькулятор.
- МС Калькулятор возвращает через МС Заявку пользователю 4 предложения (сущность "LoanOffer") по кредиту с разными условиями (например, без страховки, со страховкой, с зарплатным клиентом, со страховкой и зарплатным клиентом) или отказ.
- Пользователь выбирает одно из предложений, отправляется запрос в МС Заявка, а оттуда в МС Сделка, где заявка на кредит и сам кредит сохраняются в базу.
- МС Досье отправляет клиенту письмо с текстом "Ваша заявка предварительно одобрена, завершите оформление".
- Клиент отправляет запрос в МС Сделка со всеми своими полными данными о работодателе и прописке. Происходит скоринг данных в МС Калькулятор, МС Калькулятор рассчитывает все данные по кредиту (ПСК, график платежей и т.д.), МС Сделка сохраняет обновленную заявку и сущность кредит, сделанную на основе CreditDto полученного из КК со статусом CALCULATED в БД.
- После валидации МС Досье отправляет письмо на почту клиенту с одобрением или отказом. Если кредит одобрен, то в письме присутствует ссылка на запрос "Сформировать документы".
- Клиент отправляет запрос на формирование документов в МС Досье, МС Досье отправляет клиенту на почту документы для подписания и ссылку на запрос на согласие с условиями.
- Клиент может отказаться от условий или согласиться. Если согласился, МС Досье на почту отправляет код и ссылку на подписание документов, куда клиент должен отправить полученный код в МС Сделка.
- Если полученный код совпадает с отправленным, МС Сделка выдает кредит (меняет статус сущности "Кредит" на ISSUED, а статус заявки на CREDIT_ISSUED).
- Оранжевый: МС Заявка
- Голубой: МС Сделка + БД
- Фиолетовый: МС Калькулятор
- Зеленый: МС Досье
- Красный: Конец флоу
- Иконка "человек": Пользовательское действие
- Иконка "зубчатое колесо": Действие системы
- Иконка "молния": Ошибка
- Иконка "прямоугольник с горизонтальными полосками": Выбор пользователя
- Иконка "конверт": Асинхронная отправка email-сообщения на почту
Правила скоринга
Правила прескоринга (можно придумать новые правила или изменить существующие):
- Имя, Фамилия - от 2 до 30 латинских букв. Отчество, при наличии - от 2 до 30 латинских букв.
- Сумма кредита - действительное число, большее или равное 30000.
- Срок кредита - целое число, большее или равное 6.
- Дата рождения - число в формате гггг-мм-дд, не позднее 18 лет с текущего дня.
- Email адрес - строка, подходящая под паттерн
^[a-zA-Z0-9_!#$%&'*+/=?{|}~^.-]+@[a-zA-Z0-9.-]+$` - Серия паспорта - 4 цифры, номер паспорта - 6 цифр.
Правила скоринга (можно придумать новые правила или изменить существующие):
- Рабочий статус: Безработный → отказ; Самозанятый → ставка увеличивается на 1; Владелец бизнеса → ставка увеличивается на 2.
- Позиция на работе: Менеджер среднего звена → ставка уменьшается на 2; Топ-менеджер → ставка уменьшается на 3.
- Сумма займа больше, чем 25 зарплат → отказ.
- Семейное положение: Замужем/женат → ставка уменьшается на 3; Разведен → ставка увеличивается на 1.
- Возраст менее 20 или более 65 лет → отказ.
- Пол: Женщина, возраст от 32 до 60 лет → ставка уменьшается на 3; Мужчина, возраст от 30 до 55 лет → ставка уменьшается на 3; Не бинарный → ставка увеличивается на 7.
- Стаж работы: Общий стаж менее 18 месяцев → отказ; Текущий стаж менее 3 месяцев → отказ.
API
- POST:
/calculator/offers- расчёт возможных условий кредита. - POST:
/calculator/calc- валидация присланных данных + полный расчет параметров кредита.
- POST:
/deal/statement- расчёт возможных условий кредита. - POST:
/deal/offer/select- выбор одного из предложений. - POST:
/deal/calculate/{statementId}- полный расчет параметров кредита. - POST:
/deal/document/{statementId}/send- запрос на отправку документов. - POST:
/deal/document/{statementId}/sign- запрос на подписание документов. - POST:
/deal/document/{statementId}/code- подписание документов. - GET:
/deal/admin/statement/{statementId}- получить заявку по id. - PUT:
/deal/admin/statement/{statementId}/status- обновить статус заявки.
- POST:
/statement- первичная валидация заявки, создание заявки. - POST:
/statement/offer- выбор одного из предложений.
DTO сущности
- LoanStatementRequestDto
{ "amount": "BigDecimal", "term": "Integer", "firstName": "String", "lastName": "String", "middleName": "String", "email": "String", "birthdate": "LocalDate", "passportSeries": "String", "passportNumber": "String" } - LoanOfferDto
{ "statementId": "UUID", "requestedAmount": "BigDecimal", "totalAmount": "BigDecimal", "term": "Integer", "monthlyPayment": "BigDecimal", "rate": "BigDecimal", "isInsuranceEnabled": "Boolean", "isSalaryClient": "Boolean" } - ScoringDataDto
{ "amount": "BigDecimal", "term": "Integer", "firstName": "String", "lastName": "String", "middleName": "String", "gender": "Enum", "birthdate": "LocalDate", "passportSeries": "String", "passportNumber": "String", "passportIssueDate": "LocalDate", "passportIssueBranch": "String", "maritalStatus": "Enum", "dependentAmount": "Integer", "employment": "EmploymentDto", "accountNumber": "String", "isInsuranceEnabled": "Boolean", "isSalaryClient": "Boolean" } - CreditDto
{ "amount": "BigDecimal", "term": "Integer", "monthlyPayment": "BigDecimal", "rate": "BigDecimal", "psk": "BigDecimal", "isInsuranceEnabled": "Boolean", "isSalaryClient": "Boolean", " paymentSchedule": "List<PaymentScheduleElementDto>" } - FinishRegistrationRequestDto
{ "gender": "Enum", "maritalStatus": "Enum", "dependentAmount": "Integer", "passportIssueDate": "LocalDate", "passportIssueBranch": "String", "employment": "EmploymentDto", "accountNumber": "String" } - EmploymentDto
{ "employmentStatus": "Enum", "employerINN": "String", "salary": "BigDecimal", "posit ion": "Enum", "workExperienceTotal": "Integer", "workExperienceCurrent": "Integer" } - PaymentScheduleElementDto
{ "number": "Integer", "date": "LocalDate", "totalPayment": "BigDecimal", "interestPayment": "BigDecimal", "debtPaymen t": "BigDecimal", "remainingDebt": "BigDecimal" } - StatementStatusHistoryDto
{ "status": "Enum", "time": "LocalDateTime", "changeType": "Enum" } - EmailMessage
{ "address": "String", "theme": "Enum", "statementId": "Long" }
Разработать приложение "Кредитный банк" с применением технологий и инструментов: Java 17+, SpringBoot 2.7.Х, PostgreSQL, Spring Data JPA, Swagger, Kafka, JUnit, Lombok


