# Changelog Все значимые изменения в проекте документируются в этом файле. Формат основан на [Keep a Changelog](https://keepachangelog.com/ru/1.0.0/). --- ## [0.4.1] - 2026-02-02 ### Исправлено #### CI/CD Pipeline - Удалена зависимость от GitHub Actions (сеть блокирует доступ к GitHub) - `actions/checkout@v4` → `git clone` с переменными Gitea - `actions/setup-python@v4` → установка через `apt-get` - `docker/build-push-action@v5` → чистые `docker build/push` команды - Тесты используют `config.settings.test` (SQLite in-memory) вместо PostgreSQL service #### Code Quality - Исправлены ошибки ruff lint: - Сортировка импортов (I001) - Удалены неиспользуемые импорты и переменные (F401, F841) - Добавлены noqa для тестового кода (S106, S314) --- ## [0.4.0] - 2026-01-28 ### Добавлено #### Парсер ФНС бухгалтерской отчетности (`apps.parsers.clients.fns`) - **FNSExcelParser** — парсер Excel файлов бухгалтерской отчетности: - Формат файла: `fin_{external_id}_{ogrn}.xlsx` - Поддержка форм: №1 (Баланс), №2 (Прибыль/Убыток), №3 (Капитал), №4 (Денежные потоки), №6 (Целевое использование) - Автоматическое определение года и формы по структуре листа - Извлечение значений period_start/period_end для каждой строки - **Модели** (`models.py`): - `FinancialReport` — отчет с метаданными (external_id, ogrn, file_hash, status, source) - `FinancialReportLine` — строки отчета (form_code, line_code, year, period_start, period_end) - SHA256 хэш файла для дедупликации - Индексы: ogrn, year, form_code+line_code - **Сервисный слой** (`services.py`): - `FNSReportService` — сохранение отчетов, проверка дубликатов по хешу - Поиск по ОГРН - Bulk-сохранение строк отчета - **Celery задачи** (`tasks.py`): - `scan_fns_directory` — периодическое сканирование папки каждые 5 минут - `process_fns_file` — обработка одного файла - `process_fns_files_batch` — пакетная обработка через API - Перемещение файлов в `processed/` или `failed/` - **API endpoints** (`views.py`, `urls.py`): - `POST /api/v1/fns/upload/` — пакетная загрузка файлов - `GET /api/v1/fns/reports/` — список отчетов с фильтрацией - `GET /api/v1/fns/reports/{id}/` — детали отчета со строками - Swagger теги для группировки в документации - **Админка** (`admin.py`): - `FinancialReportAdmin` с inline для строк - Цветовая индикация статусов - Фильтры: status, source, ogrn #### Тестирование - 25 unit-тестов для парсера, схем и сервиса - Покрытие: валидация имени файла, парсинг значений, сохранение отчетов ### Конфигурация - `FNS_WATCH_DIRECTORY` — папка для мониторинга (`/src/input/fns`) - `FNS_PROCESSED_DIRECTORY` — папка обработанных файлов - `FNS_FAILED_DIRECTORY` — папка с ошибками - Celery Beat: `scan-fns-directory` каждые 5 минут --- ## [0.3.0] - 2026-01-27 ### Добавлено #### Парсер zakupki.gov.ru (`apps.parsers.clients.zakupki`) - **ZakupkiClient** — клиент для получения данных о закупках: - Интеграция через SOAP API (FTP закрыт с 01.01.2025) - Методы: `getDocsByOrgRegionRequest`, `getDocsByReestrNumberRequest` - Парсинг XML/ZIP архивов с поддержкой множественных кодировок (UTF-8, Windows-1251) - Поддержка прокси-серверов - Маппинг 80+ регионов РФ - **Модель ProcurementRecord** (`models.py`): - 18 полей: номер закупки, ИНН/КПП/ОГРН заказчика, НМЦ, тип закона (44-ФЗ/223-ФЗ), статус - Поля региона, года, месяца для фильтрации - `load_batch` для отслеживания пакетной загрузки - 3 индекса для оптимизации запросов - **Сервисный слой** (`services.py`): - `ProcurementService` — сохранение, поиск, отслеживание загрузок - `ParserLoadLogService` — логирование результатов парсинга - Bulk-операции с chunking и обработкой дубликатов - **Celery задачи** (`tasks.py`): - `parse_procurements` — загрузка по региону/году/месяцу с BackgroundJob tracking - `sync_procurements` — синхронизация помесячно с автопродолжением - **Админка** (`admin.py`): - Цветовая индикация статусов - Поиск по номеру закупки, ИНН, ОГРН, названию заказчика - Фильтры: тип закона, статус, регион, batch, дата создания - Read-only режим #### Тестирование - 71 тест (66 unit + 5 E2E) - `ProcurementRecordFactory` с Faker("ru_RU") - E2E тесты с реальными HTTP-запросами (активация: `RUN_E2E_TESTS=1`) - Покрытие: клиент, сервисы, задачи ### Требования для работы - Токен SOAP API (получается через Госуслуги на `https://zakupki.gov.ru/pmd/auth/welcome`) --- ## [0.2.0] - 2026-01-21 ### Добавлено #### Core Module (`apps.core`) - **Model Mixins** (`mixins.py`): - `TimestampMixin` — автоматические `created_at`, `updated_at` - `UUIDPrimaryKeyMixin` — UUID вместо auto-increment ID - `SoftDeleteMixin` — мягкое удаление с `is_deleted`, `deleted_at` - `AuditMixin` — отслеживание `created_by`, `updated_by` - `OrderableMixin` — поле `order` для сортировки - `StatusMixin` — статусы draft/active/inactive/archived - `SlugMixin` — URL-friendly идентификаторы - **Base Services** (`services.py`): - `BaseService` — базовый CRUD сервис - `BaseReadOnlyService` — только чтение - `TransactionMixin` — управление транзакциями - `BulkOperationsMixin` — массовые операции (bulk_create_chunked, bulk_update_or_create, bulk_delete, bulk_update_fields) - `QueryOptimizerMixin` — декларативная оптимизация запросов (select_related, prefetch_related, only, defer) - `BackgroundJobService` — управление фоновыми задачами - **Base ViewSets** (`viewsets.py`): - `BaseViewSet` — базовый CRUD ViewSet с пагинацией, фильтрацией, логированием - `ReadOnlyViewSet` — только чтение - `OwnerViewSet` — фильтрация по владельцу - `BulkMixin` — массовые операции через API (bulk_create, bulk_update, bulk_delete) - **Background Job Tracking** (`models.py`): - Модель `BackgroundJob` для отслеживания Celery задач - API endpoints: `GET /api/v1/jobs/`, `GET /api/v1/jobs/{task_id}/` - Статусы: pending, started, success, failure, revoked, retry - Прогресс выполнения и результаты - **Management Commands** (`management/commands/base.py`): - `BaseAppCommand` — базовый класс для команд - Поддержка `--dry-run`, `--silent` - Прогресс-бар, измерение времени, логирование - **Прочее**: - `exceptions.py` — кастомные исключения API - `permissions.py` — базовые permissions (IsOwner, IsAdminOrReadOnly и др.) - `pagination.py` — CursorPagination - `filters.py` — BaseFilterSet - `cache.py` — декораторы кэширования - `tasks.py` — BaseTask для Celery - `logging.py` — структурированное логирование - `middleware.py` — RequestIDMiddleware - `signals.py` — SignalDispatcher - `response.py` — унифицированные API ответы - `openapi.py` — декоратор для документации #### Тестирование - Переход на `factory_boy` + `faker` (вместо model_bakery + uuid) - Фабрики: `UserFactory`, `ProfileFactory` - 297 тестов #### Конфигурация - API versioning: `/api/v1/` - Отдельный `test.py` для настроек тестов - Обновлён `pyproject.toml` - Правила разработки в `.qoder/rules/main.md` ### Изменено - Структура тестов перенесена в `/tests/apps/` - Удалён `conftest.py` (pytest не используется) - Обновлены URLs с namespace ### Удалено - `ruff.toml` (конфигурация перенесена в pyproject.toml) - `CI_CD_SUMMARY.md` - `custom_test_runner.py` --- ## [0.1.0] - 2026-01-20 ### Добавлено - Начальная структура проекта - Приложение `user` с JWT аутентификацией - Базовые модели User и Profile - Docker конфигурация - Pre-commit hooks