🚀 Live Application (Render): https://amurcode.onrender.com
Локальный MVP для кейса БФТ и Минфина Амурской области. Приложение запускается одной командой, читает CSV из case/, держит данные в памяти и отдаёт Vue 3 UI без Vite, npm, PostgreSQL и отдельного ETL-сервиса.
Установка зависимостей:
python -m pip install -r requirements.txtОбычный локальный запуск:
python app.py 8000Открыть в браузере:
http://127.0.0.1:8000
python app.py запускает FastAPI через uvicorn. Для прямого ASGI-запуска используйте:
uvicorn analytics.api:app --host 127.0.0.1 --port 8000HOST и PORT можно задать переменными окружения. Legacy Handler сохранен для совместимости тестов и старого импорта app.
Первый экран построен вокруг задач, а не фильтров. Пользователь может нажать быстрый сценарий, ввести код или название в единую строку, получить короткий вывод на отчетную дату, посмотреть готовность данных, открыть карточку объекта со строками-источниками и скачать Excel-отчет.
Короткий вывод теперь строится как управленческая подсказка: система показывает, что требует внимания, и выводит главные риски. Риск не является юридическим выводом или автоматическим решением о нарушении; это приоритет для ручной проверки объекта.
После вывода появляется блок Что делать дальше: открыть главный риск, показать объекты без кассы/оплат/документов или скачать Excel. Пользователю не нужно помнить фильтры и формулировать следующий запрос вручную.
Первый быстрый сценарий Демо за 60 секунд открывает проблемные СКК, вкладку Проблемы, главные риски и плашку с шагами показа. Рекомендуемый путь: посмотреть короткий вывод, открыть главный риск, показать источник цифр в карточке объекта и скачать Excel.
Кнопка Контроль загрузки показывает управленческую сверку текущей выборки: сколько строк и источников попало в расчет, есть ли предупреждения качества, сколько объектов связано только по названию и сколько объектов видны только в одном источнике. Предупреждения считаются из накопленных проблем качества загрузки по исходным файлам и строкам; источник считается покрытым, если его записи попали в текущую выборку.
Тот же контроль доступен через GET /api/control?date=&template=&q=&code=&budget=&source= и добавлен в Excel отдельным листом Контроль загрузки.
Проверка проблемного объекта идет по короткому пути: открыть карточку объекта, посмотреть блок Почему такой риск, проверить документы и исходные строки, выбрать статус проверки, при необходимости назначить ответственного и добавить комментарий. Статусы сохраняются локально в data/reviews.json и не коммитятся.
В UI загрузка находится в Расширенные настройки -> Загрузить данные. Разрешенные источники: rcb, agreements, state_task_contracts, state_task_payments, buau. Разрешенные расширения: .csv и .xlsx, максимальный размер файла - 50 MB.
Файлы сохраняются локально в data/uploads/<source_type>/. Если имя уже занято, к имени добавляется timestamp suffix. Runtime-файлы data/reviews.json и data/uploads/ исключены из git.
Ошибки импорта возвращаются как JSON: invalid_extension, source_type_required, file_required, file_too_large.
Доступны готовые сценарии:
- Собрать отчет СКК.
- Собрать отчет КИК.
- Собрать отчет 2/3.
- Собрать отчет ОКВ.
- Демо за 60 секунд.
- Найти проблемные объекты.
- Проблемные СКК.
- Сравнить две даты.
- Найти объект.
UI использует /api/query?view=as_of&date=... и /api/compare. Старый периодический режим /api/query без view сохранен для совместимости.
Основной режим MVP - состояние на дату. РЧБ и соглашения считаются месячными срезами с семантикой balance_as_of: выбирается последний срез не позже выбранной даты, а не сумма срезов за период. Контракты, платежи и БУАУ считаются событиями с накоплением до выбранной даты.
Отчетные даты берутся только из РЧБ и соглашений через GET /api/catalog/reporting-dates, чтобы пользователь не выбирал одиночную дату платежа как дату месячного среза.
Колонки РЧБ для лимитов, БО и кассы ищутся по смысловому префиксу, например Лимиты ПБС и Подтв. лимитов по БО, поэтому файлы 2025 и 2026 годов читаются одним правилом.
Основной рабочий экспорт:
GET /api/export.xlsx?date=&template=&q=&code=&budget=&source=&post_filter=GET /api/export.xlsx?mode=compare&base=&target=&template=&q=&code=&budget=&source=GET /api/export.pdf?date=&template=&q=&code=&budget=&source=&post_filter=GET /api/export.pdf?mode=compare&base=&target=&template=&q=&code=&budget=&source=
Excel содержит листы Выводы, Итоги, Объекты, Проблемы, Исходные строки, Контроль загрузки, Методика. Файл оформлен как отчет: заголовки, фильтры, закрепленные строки, подсветка рисков, денежные форматы, блоки внимания, главные риски, контроль загрузки и следующие действия. CSV-экспорт в UI сохранен как дополнительная таблица.
PDF-экспорт доступен кнопкой Скачать PDF и теми же фильтрами, что Excel. Excel остается детальной рабочей таблицей для проверки строк, а PDF - коротким оформленным отчетом для показа или пересылки.
Excel требует openpyxl, PDF требует reportlab. Если reportlab не установлен, /api/export.pdf вернет понятную JSON-ошибку pdf_dependency_missing; остальное приложение и Excel продолжают работать. Для корректной кириллицы в PDF лучше иметь системный TTF-шрифт Windows, например Arial, Calibri или Tahoma.
Пользователь пишет обычный запрос в единую строку первого экрана. Система сама выбирает быстрый сценарий, rule-based разбор или LLM и применяет действие в UI.
Endpoint POST /api/assistant принимает обычный текст и возвращает intent, объяснение, действие для UI и follow-up кнопки. Без GROQ_API_KEY assistant работает по правилам. Если ключ задан, он может использовать Groq как enhancer, но суммы всё равно считает только backend.
Создайте локальный .env из примера:
Copy-Item .env.example .env
notepad .env.env локальный и не коммитится. GROQ_API_KEY используется только сервером, не возвращается в API и не нужен для обычных тестов. Без ключа помощник работает по правилам.
Опциональные переменные окружения:
GROQ_API_KEY=
GROQ_MODEL=llama-3.1-8b-instant
ASSISTANT_ENABLED=auto
RUN_LLM_TESTS=0В Groq не отправляются raw records. Используются только запрос пользователя, список шаблонов, список метрик, доступные даты, короткий RAG-контекст из docs/rag и агрегированные выводы для /api/explain.
GET /api/metaGET /api/query?view=as_of&date=&q=&code=&budget=&source=&template=&metrics=&post_filter=GET /api/query?q=&code=&budget=&source=&start=&end=&template=&metrics=legacy period modeGET /api/compare?base=&target=&q=&code=&budget=&source=&template=&metrics=GET /api/readiness?view=as_of&date=&template=&q=&code=&budget=GET /api/control?date=&template=&q=&code=&budget=&source=GET /api/reviewsGET /api/review?object_key=POST /api/reviewGET /api/object?date=&template=&object_key=&budget=GET /api/export.xlsx?date=&template=&q=&code=&budget=&source=&post_filter=GET /api/export.pdf?date=&template=&q=&code=&budget=&source=&post_filter=GET /api/export.pdf?mode=compare&base=&target=&template=&q=&code=&budget=&source=GET /api/qualityGET /api/trace?id=GET /api/catalog/datesGET /api/catalog/reporting-datesGET /api/catalog/sourcesGET /api/catalog/budgetsGET /api/catalog/templatesGET /api/catalog/metricsGET /api/catalog/objects?q=&template=GET /api/catalog/quick-actionsPOST /api/assistantPOST /api/explainPOST /api/import
/api/query добавляет к строкам risk_score, risk_level, risk_label, risk_explanation и общий блок attention_summary. /api/compare добавляет compare_insights с новыми проблемами, снижением риска, ростом риска и объектами, где план вырос без движения кассы.
Vue runtime хранится локально в /static/vendor/vue.global.prod.js, поэтому первый экран не зависит от CDN. Данные, проверки и загруженные файлы остаются локальными.
python -m unittest discover -s tests -vТекущий baseline после hardening phases: 102 tests OK, 1 skipped.
В набор входят backend-тесты, безбраузерные проверки Vue-логики через Node VM и Playwright-тесты реальных кликов в Chromium. Для новой машины:
python -m pip install playwright
python -m playwright install chromium- Данные хранятся in-memory.
- Денежные расчеты внутри backend выполняются через
Decimal, внешний JSON по-прежнему отдает money fields как numbers. - Trace показывает источник, файл и строку исходного CSV там, где она доступна.
- Векторная база не используется. Мини-RAG реализован чтением markdown из
docs/rag.
- Запустить
python -m unittest discover -s tests -v. - Запустить
python app.py 8000и открытьhttp://127.0.0.1:8000/. - Нажать
Демо за 60 секунд. - Убедиться, что открылась вкладка
Проблемы, видны главные риски и открывается карточка объекта. - Проверить блок
Почему такой риск, сохранить статус проверки и переоткрыть карточку. - Открыть
Контроль загрузки. - Скачать PDF и Excel; в Excel должны быть листы
Выводы,Итоги,Объекты,Проблемы,Исходные строки,Контроль загрузки,Методика. - Проверить, что в основных экранах не показаны machine fields:
snapshot,trace,pipeline,problem_reasons, коды факторов риска.