Первичная Аналитика проекта - Alex-mur/MIFI_Globus_Finance GitHub Wiki
Аналитика проекта "Финансовый мониторинг и отчетность"
Технологический стек
- Бэкенд: Java 17+, Spring Boot 3.x
- Фронтенд: ?
- База данных: PostgreSQL 15+
- Библиотеки отчетов: Apache POI (Excel), JasperReports (PDF) - Предварительно
- Аутентификация: Spring Security
- Сборка: Maven
- Деплой: Docker + Docker Compose
Логическая модель данных
Sequence diagram для создания транзакции
Архитектура приложения
Данная модель, как и вся первичная аналитика является лишь наброском, а не строгой определенной структурой
src/main/java/it/globus/finance/
├── config/
│ ├── JwtAuthenticationFilter.java
│ ├── SecurityConfiguration.java
│ └── SwaggerConfig.java # Документация API
│
├── controller/
│ ├── auth/
│ │ ├── AuthController.java
│ │ └── TestController.java
│ ├── transaction/
│ │ ├── TransactionController.java # Новый
│ │ └── ReportController.java # Новый
│ └── admin/
│ └── AdminController.java # Для админ-функций
│
├── dto/
│ ├── auth/
│ │ ├── JwtAuthenticationResponse.java
│ │ ├── SignInRequest.java
│ │ └── SignUpRequest.java
│ ├── transaction/ # Новый
│ │ ├── TransactionDto.java
│ │ ├── TransactionFilterDto.java
│ │ └── ReportRequestDto.java
│ └── response/ # Новый
│ └── ApiResponse.java # Стандартный формат ответа
│
├── exception/
│ ├── ErrorResponse.java
│ ├── GlobalExceptionHandler.java
│ └── custom/
│ ├── TransactionException.java # Новый
│ └── ReportGenerationException.java
│
├── model/
│ ├── entity/
│ │ ├── auth/
│ │ │ ├── User.java
│ │ │ └── Role.java
│ │ ├── transaction/ # Новый
│ │ │ ├── Transaction.java
│ │ │ ├── Bank.java
│ │ │ └── Category.java
│ │ └── audit/
│ │ └── AuditLog.java # Для логирования изменений
│ ├── enums/
│ │ ├── TransactionType.java # ПОСТУПЛЕНИЕ/СПИСАНИЕ
│ │ ├── TransactionStatus.java # Статусы операций
│ │ └── EntityType.java # Физ/Юр лицо
│ └── projection/ # Новый
│ └── TransactionStats.java # Для статистики
│
├── repository/
│ ├── auth/
│ │ └── UserRepository.java
│ ├── transaction/ # Новый
│ │ ├── TransactionRepository.java
│ │ ├── BankRepository.java
│ │ └── CategoryRepository.java
│ └── custom/ # Новый
│ └── TransactionCustomRepo.java # Для сложных запросов
│
├── service/
│ ├── auth/
│ │ ├── AuthenticationService.java
│ │ ├── JwtService.java
│ │ └── UserService.java
│ ├── transaction/ # Новый
│ │ ├── TransactionService.java
│ │ ├── ReportService.java
│ │ └── BankService.java
│ └── validator/ # Новый
│ └── TransactionValidator.java # Валидация транзакций
│
├── util/
│ ├── SecurityUtils.java
│ ├── ReportGenerator.java # Генерация PDF/Excel
│ └── FieldUpdater.java # Для частичного обновления
│
└── FinanceApplication.java
Ключевые компоненты:
-
Сущности для финансового мониторинга:
Transaction
- основная сущность операцийBank
- банки отправителей/получателейCategory
- категории транзакций
-
Слои для работы с транзакциями:
- Контроллеры, сервисы и репозитории
- Кастомный репозиторий для сложных фильтров
- DTO для запросов и ответов
-
Отчетность:
- Отдельный сервис и контроллер
- Утилита для генерации разных форматов
-
Валидация:
- Отдельный валидатор для бизнес-правил:
public void validateTransaction(TransactionDto dto) { if (dto.getStatus() == TransactionStatus.CONFIRMED && dto.getAmount() <= 0) { throw new TransactionException("Confirmed transaction must have positive amount"); } // Другие правила }
-
Фильтрация:
- Специальный DTO для параметров фильтрации:
public class TransactionFilterDto { private LocalDate startDate; private LocalDate endDate; private BigDecimal minAmount; private BigDecimal maxAmount; private TransactionType type; // Остальные поля }
Пример структуры Transaction entity:
@Entity
@Table(name = "transactions")
public class Transaction {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
private User user;
@Enumerated(EnumType.STRING)
private TransactionType type;
private BigDecimal amount;
private String comment;
@Enumerated(EnumType.STRING)
private TransactionStatus status;
@ManyToOne
private Bank senderBank;
private String senderAccount;
@ManyToOne
private Bank receiverBank;
private String receiverInn;
private String receiverAccount;
@ManyToOne
private Category category;
// Даты, аудит-поля и т.д.
}
Дополнительные улучшения:
- Разделение на подпакеты по функциональности (auth, transaction)
- Поддержка аудита изменений через
AuditLog
- Готовность к расширению (например, добавление модуля аналитики)
- Стандартизированная обработка ошибок
- Поддержка Swagger для API документации
Особенности реализации
-
Валидация:
- Регулярные выражения для ИНН:
^\d{11}$
- Телефон:
^(\+7|8)\d{10}$
- Дата:
^\d{2}\.\d{2}\.\d{4}$
- Регулярные выражения для ИНН:
-
Безопасность:
- HTTPS обязателен
- CSRF защита
- Хеширование паролей (BCrypt)
-
Производительность:
- Пагинация для списка транзакций ??
- Кэширование часто запрашиваемых отчетов ??
-
Масштабируемость:
- Разделение на микросервисы в будущем
- API-first подход
Основные API endpoints
-
Транзакции
POST /api/transactions
- Создание транзакцииPUT /api/transactions/{id}
- Обновление транзакцииGET /api/transactions
- Получение списка всех транзакцийGET /api/transactions/{id}
- Получить транзакцию по idDELETE /api/transactions/{id}
- Удаление (изменение статуса)POST /api/transactions/filter
- Получить транзакции по фильтрам
-
Отчеты
POST /api/reports/generate
- Генерация отчетаGET /api/reports/{id}/download
- Скачивание отчета
-
Аутентификация
POST /api/auth/login
- ВходPOST /api/auth/register
- Регистрация
План реализации по спринтам (Scrum)
Спринт 1 (3 дня)
Цель: Подготовка инфраструктуры и базовых компонентов
- Настройка Spring Boot проекта
- Конфигурация PostgreSQL + Liquibase
- Базовая аутентификация (Spring Security)
- Простые UI шаблоны *
Спринт 2 (5 дней)
Цель: Реализация CRUD для транзакций
- Модель и репозиторий Transaction
- API для создания/чтения транзакций
- Валидация входных данных
- Базовый UI для ввода транзакций *
Спринт 3 (5 дней)
Цель: Фильтрация и отчеты
- Реализация фильтров для транзакций
- Генерация отчетов в CSV/Excel/PDF
- Дашборды с графиками (Chart.js) *
Спринт 4 (3 дня)
Цель: Тестирование и доработки
- Юнит-тесты (JUnit 5)
- Интеграционные тесты
- Исправление багов
Спринт 5 (2 дня)
Цель: Деплой и презентация
- Docker-контейнеризация
- Демо-версия на облаке *
- Подготовка презентации