You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
# Система обработки банковских платежей
Приложение для обработки банковских платежей, для управления бонусами, комиссиями и предоставления информации о счёте. В приложении используются различные шаблоны проектирования для гибкой обработки платежей, управления ошибками и учёта пользователей.
## Содержание
- [Обзор](#обзор)
- [Тестовое задание](#тестовое-задание)
- [Функции](#функции)
- [Архитектура](#архитектура)
- [Как работает приложение](#как-работает-приложение)
## Обзор
Приложение служит системой обработки платежей с многоуровневой архитектурой, выполняющей бизнес-логику для онлайн и оффлайн транзакций. В логике обработки платежей учитываются бонусы и комиссии, а гибкость системы обеспечивается использованием шаблонов проектирования.
## Тестовое задание
Была поставлена следующая задача:
Начисление бонусов за покупку.
У клиента банка есть наличные/безналичные(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