T7: Final validation + README update

- pytest: 67/67 pass
- Manual CLI test: init, forecast, scenario, whatif, compare, info, analyze
  all work; Excel round-trip (export → init → import) preserves data
- README.md: обновлён под новую архитектуру domain/application/infrastructure
  с описанием слоёв, pydantic, Decimal, Repository, DI, schema versioning
  и расширенным списком команд (config sub-typer с account/transaction/etc)

Tests: 67/67 pass.
Project: refactor complete — все 5 направлений реализованы.
This commit is contained in:
2026-10-08 16:57:50 +03:00
parent b6b64a9878
commit 3ef10618dc
+90 -30
View File
@@ -1,8 +1,8 @@
# CashFlow Forecast # CashFlow Forecast
Личная финансовая модель с прогнозом денежных потоков, сценарным анализом и AI-ассистентом. Личная финансовая модель с прогнозом денежных потоков, сценарным анализом.
Python + JSON + Excel + AI. Python + Pydantic + JSON + Excel.
## Установка ## Установка
@@ -35,12 +35,17 @@ cf whatif --income 1.2 --expense 0.9 --growth 1.0 --months 12
# Сравнение всех сценариев # Сравнение всех сценариев
cf compare --months 12 cf compare --months 12
# Импорт/экспорт Excel # Сводка модели
cf import data.xlsx cf info
cf export exports/report.xlsx
# AI-анализ (заглушка, генерация промпта) # Редактирование модели
cf analyze cf config account-add --name "Main" --balance 5000
cf config transaction-add --account Main --amount -1200 --category rent
cf config rate-set USD RUB 80.0
# Импорт/экспорт Excel
cf import-xlsx data.xlsx
cf export-xlsx exports/report.xlsx
``` ```
### Пример: создание тестовых данных ### Пример: создание тестовых данных
@@ -48,43 +53,86 @@ cf analyze
Подготовьте Excel-файл с листами: `Accounts`, `Transactions`, `Recurring`, `Assets`, `Liabilities`. Заголовки колонок соответствуют полям моделей. Затем импортируйте: Подготовьте Excel-файл с листами: `Accounts`, `Transactions`, `Recurring`, `Assets`, `Liabilities`. Заголовки колонок соответствуют полям моделей. Затем импортируйте:
```bash ```bash
cf import my_finances.xlsx cf import-xlsx my_finances.xlsx
cf forecast --months 12 cf forecast --months 12
``` ```
## Архитектура
Проект разделён на три слоя по принципам Clean Architecture:
```
┌─────────────────────────────────────────────┐
│ domain/ — бизнес-модели │
│ Account, Transaction, Asset, Liability, │
│ Recurring, Scenario, FinancialModel, │
│ ExchangeRate, CurrencyConverter │
│ (pydantic.BaseModel, Decimal) │
└──────────────────┬──────────────────────────┘
│
┌──────────────────▼──────────────────────────┐
│ application/ — прикладные сервисы │
│ ForecastService, ScenarioService, │
│ ModelRepository (Protocol) │
└──────────────────┬──────────────────────────┘
│
┌──────────────────▼──────────────────────────┐
│ infrastructure/ — внешний мир │
│ cli/ (Typer), ai/ (Assistant), │
│ repositories/ (JsonFile, Excel) │
└─────────────────────────────────────────────┘
```
## Структура проекта ## Структура проекта
``` ```
├── cashflow_model/ # Модели данных (dataclass + JSON) cashflow-forecast/
├── domain/ # Бизнес-модели (pydantic + Decimal)
│ ├── account.py # Account │ ├── account.py # Account
│ ├── transaction.py # Transaction │ ├── transaction.py # Transaction
│ ├── recurring.py # RecurringCashflow │ ├── recurring.py # RecurringCashflow
│ ├── asset.py # Asset │ ├── asset.py # Asset
│ ├── liability.py # Liability │ ├── liability.py # Liability
│ ├── scenario.py # ForecastScenario │ ├── scenario.py # ForecastScenario
│ └── model.py # FinancialModel (корень, save/load JSON) │ ├── currency.py # ExchangeRate + CurrencyConverter
├── engine/ # Вычислительное ядро │ └── model.py # FinancialModel (корень)
│
├── application/ # Прикладные сервисы
│ ├── forecast.py # ForecastService — прогноз │ ├── forecast.py # ForecastService — прогноз
│ └── scenarios.py # ScenarioService — сценарии + what-if │ ├── scenarios.py # ScenarioService — сценарии + what-if
├── sync/ # Синхронизация с Excel │ └── repositories/
│ └── excel_sync.py # ExcelSync — import/export .xlsx │ └── model_repository.py # ModelRepository Protocol
├── ai/ # AI-ассистент │
│ ├── prompts.py # Шаблоны промптов ├── infrastructure/ # Адаптеры к внешнему миру
│ └── assistant.py # AssistantService (заглушка) │ ├── cli/ # Typer CLI (cf ...)
├── cli/ # CLI (Typer) │ │ ├── app.py # Entry point
│ └── main.py # Команды: cf init/forecast/scenario/... │ │ ├── commands/ # 9 файлов команд + config sub-typer
├── tests/ # Тесты pytest │ │ ├── paths.py # DATA_DIR, MODEL_PATH
│ ├── conftest.py # Фикстуры │ │ ├── services.py # Composition root + helpers
│ │ └── i18n.py # ru/en переводы
│ ├── ai/ # AI-ассистент (заглушка)
│ │ ├── prompts.py
│ │ └── assistant.py # AssistantService
│ └── repositories/ # Реализации ModelRepository
│ ├── json_file_repository.py
│ └── excel_repository.py
│
├── tests/ # pytest, 67 тестов
│ ├── conftest.py
│ ├── test_model.py │ ├── test_model.py
│ ├── test_forecast.py │ ├── test_forecast.py
│ ├── test_scenarios.py │ ├── test_scenarios.py
│ ├── test_excel_sync.py │ ├── test_currency.py
│ ├── test_ai.py │ ├── test_ai.py
│ └── test_cli.py │ ├── test_cli.py
├── data/ # JSON-модели │ ├── test_excel_sync.py # Тесты ExcelRepository
│ ├── test_i18n.py
│ └── test_repositories.py # Тесты репозиториев
│
├── data/ # JSON-модели (runtime, версионируется SCHEMA_VERSION=1)
├── exports/ # Экспортированные .xlsx ├── exports/ # Экспортированные .xlsx
├── .agent/ # Артефакты MetaAgent (планирование) ├── .agent/ # Артефакты MetaAgent v3.0
├── pyproject.toml # Зависимости и конфигурация ├── pyproject.toml # Зависимости + entry point `cf`
└── README.arch.md # Оригинальная архитектурная концепция └── README.arch.md # Оригинальная архитектурная концепция
``` ```
@@ -94,7 +142,7 @@ cf forecast --months 12
# Тесты # Тесты
pytest pytest
# Линтер # Линтер (если доступен ruff)
ruff check . ruff check .
# Автоформат # Автоформат
@@ -107,12 +155,24 @@ ruff format .
- openpyxl — работа с Excel - openpyxl — работа с Excel
- typer — CLI - typer — CLI
- rich — форматирование вывода - rich — форматирование вывода
- pydantic >= 2.0 — валидация моделей
- pytest — тесты - pytest — тесты
- ruff — линтер - ruff — линтер (опционально)
## Архитектурные решения
- **Слои**: `domain/` (модели), `application/` (сервисы), `infrastructure/` (адаптеры).
- **Pydantic v2**: все модели — `pydantic.BaseModel` с валидацией (balance >= 0, amount != 0, и т.п.).
- **Decimal**: все денежные поля — `Decimal`, арифметика без потери точности.
- **Repository pattern**: `ModelRepository` Protocol, реализации `JsonFileRepository` и `ExcelRepository`.
- **DI**: Composition root в `infrastructure/cli/services.py:build_services()`.
- **Schema versioning**: `FinancialModel.to_dict()` пишет `version: 1`; `from_dict()` поддерживает legacy v0.
- **i18n**: `infrastructure/cli/i18n.py`, ru (default) + en (fallback).
## Известные ограничения (MVP) ## Известные ограничения (MVP)
- **AI-ассистент** — заглушка. Промпты готовы, но не подключены к API. - **AI-ассистент** — заглушка (`ai_response: None`). Промпты готовы, но не подключены к API.
- **База данных** — JSON-файлы (не подходит для многопользовательской работы). - **Хранилище** — JSON-файлы (не подходит для многопользовательской работы).
- **Excel** — только `.xlsx` через openpyxl. - **Excel** — только `.xlsx` через openpyxl.
- **Лицензия** — не выбрана. - **Лицензия** — не выбрана.
- **CI/CD** — не настроен.