Skip to content

Latest commit

 

History

History
135 lines (98 loc) · 8.08 KB

readme.md

File metadata and controls

135 lines (98 loc) · 8.08 KB
# Система обработки банковских платежей Приложение для обработки банковских платежей, для управления бонусами, комиссиями и предоставления информации о счёте. В приложении используются различные шаблоны проектирования для гибкой обработки платежей, управления ошибками и учёта пользователей. ## Содержание - [Обзор](#обзор) - [Тестовое задание](#тестовое-задание) - [Функции](#функции) - [Архитектура](#архитектура) - [Как работает приложение](#как-работает-приложение) ## Обзор Приложение служит системой обработки платежей с многоуровневой архитектурой, выполняющей бизнес-логику для онлайн и оффлайн транзакций. В логике обработки платежей учитываются бонусы и комиссии, а гибкость системы обеспечивается использованием шаблонов проектирования. ## Тестовое задание Была поставлена следующая задача: Начисление бонусов за покупку. У клиента банка есть наличные/безналичные(A) средства, которыми он расплачивается в Магазине(B), Онлайн Покупки(С). Банк(D) начисляет бонусы в виде 10% в (B) и 17% в (C). Покупки менее 20 рублей возвращаются комиссией 10% в Банк(D), пройдя поле Возврат(E), иначе начисляются бонусы равные 30% от суммы, если сумма покупки более 300 рублей. Задача. Написать REST контроллеры: 1. Оплата покупки - GET /api/payment/{Shop|Online}/{amount} 2. Количество бонусов на счете банка - GET /api/bankAccountOfEMoney 3. Количество наличных/безналичных денег - GET /api/money Требуется применить статусную модель. Для тестирования использовать следующие параметры: Изначальная сумма в (А) = 5000 рублей. 1. Online/100 2. Shop/120 3. Online/301 4. Online/17 5. Shop/1000 6. Online/21 7. Shop/570 8. Online/700 ## Функции - **Обработка платежей**: Обрабатывает платежи с разными правилами в зависимости от типа магазина и суммы. - **Управление бонусами**: Рассчитывает и управляет бонусами на основе условий транзакции. - **Рассчёт комиссий**: Применяет комиссии при выполнении условий. - **Обработка ошибок**: Обеспечивает структурированные ответы для управления исключениями. - **Гибкое управление состояниями**: Использует шаблоны проектирования для динамического выбора состояния обработки платежа. ## Архитектура Приложение структурировано на четыре основных слоя, что обеспечивает чёткое разделение обязанностей и модульность: ```plaintext +-------------------------------+ | Контроллерный слой | +-------------------------------+ | BankController | +-------------------------------+ | | v +-------------------------------+ | Сервисный слой | +-------------------------------+ | BankService | | GlobalExceptionHandler | +-------------------------------+ | | v +-----------------------------------------+ | Слой состояний и фабрики | +-----------------------------------------+ | PaymentState (интерфейс) | | PaymentStateFactory | | - OnlineState | | - ShopState | +-----------------------------------------+ | | v +-------------------------------+ | Слой данных | +-------------------------------+ | Bank | | Client | | PaymentResponse (DTO) | | BankRepository | | ClientRepository | +-------------------------------+ ``` ## Как работает система Контроллер BankController принимает входящие HTTP-запросы для выполнения платежей и получения информации о состоянии счета. Метод payment принимает параметры shopType (тип магазина) и amount (сумма), передает их в BankService и возвращает PaymentResponse с текущими данными. Сервис BankService реализует основную бизнес-логику для обработки платежей: Определяет состояние платежа с помощью PaymentStateFactory. Находит банковский счет клиента по ID (захардкоженный UUID) и выполняет списание средств, расчет бонусов и комиссий, в зависимости от типа магазина. Сохраняет обновленный объект Bank в базе данных и возвращает PaymentResponse с обновленными данными. PaymentStateFactory определяет, какой объект PaymentState (стратегия) использовать, в зависимости от условий: Если сумма меньше 20, возвращается refund. В противном случае возвращается стратегия в зависимости от типа магазина (online, shop). Реализации PaymentState (OnlineState и ShopState) обрабатывают логику для каждого типа магазина: OnlineState списывает средства с безналичного счета и начисляет бонусы в зависимости от суммы. ShopState списывает средства с наличного счета и начисляет бонусы по другим правилам. Глобальный обработчик исключений GlobalExceptionHandler перехватывает пользовательские исключения и возвращает клиенту информативные сообщения с кодами ошибок. Приложение использует шаблоны проектирования, такие как "Стратегия" и "Фабричный метод", для определения различных стратегий обработки платежей и обработки исключений. Основная бизнес-логика сосредоточена в BankService, а специализированные состояния (ShopState и OnlineState) реализуют специфичные правила для каждого типа магазина, обеспечивая гибкость и читаемость кода. # task