О проекте
Команда: horseaters
Кейс HackAlem.ai: Логистика — Электрокомплект · ekt.kz
Стадия: Рабочий MVP
Задача кейса: Автоматический расчёт заказов поставщикам для пополнения склада, с утверждением менеджером
Суть
Веб-сервис для закупщика: импорт Excel продаж и условий поставщиков, прогноз спроса с учётом аномалий, stockout и сезонности, рекомендации по заказу с объяснением, ручная корректировка, утверждение админом и экспорт XLSX для 1С.
Как устроено
Импорт .xlsx девяти типов (продажи, остатки, stockout, в пути, сезонность, MOQ и др.) с валидацией и запретом ПДн. Доменные сервисы помечают разовые крупные продажи как аномалии, не считают нулевые продажи при stockout нулевым спросом, учитывают рост и сезонность; из потребности на горизонт со страховым запасом вычитаются остаток и поступления, результат округляется по MOQ и кратности. Рекомендации сохраняются с компонентами формулы, закупщик корректирует и принимает, из них формируются черновики заказов, которые утверждает только admin. Бэкенд на FastAPI по DDD-слоям с PostgreSQL/Alembic, фронт на Next.js; gpt-4o-mini используется только для подсказок.
Ключевые решения
- детекция аномальных продаж
- коррекция stockout
- сезонность и рост
- страховой запас
- округление MOQ и кратности
- DDD
- JWT/Argon2
Особенности
Продуманный workflow с версионированием корректировок, ролями buyer/admin и XLSX-экспортом с checksum; сквозной e2e-тест backend от импорта до экспорта. Сама команда отмечает, что первая таблица на главной показывает встроенный набор, а не загруженные данные.
Стек
Python · FastAPI · Pydantic · pandas · NumPy/SciPy · openpyxl · PostgreSQL 16 · SQLAlchemy 2 · Alembic · Next.js 15 · React 19 · TypeScript · TanStack Query · Zustand · Docker Compose
Модели
gpt-4o-mini
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-0d60a011-horseaters.
README
README.mdStockwise — помощник закупщика для пополнения склада
Stockwise помогает менеджеру закупок перейти от редкого ручного расчёта в Excel к воспроизводимым рекомендациям по заказам поставщикам. Сервис анализирует продажи и доступные запасы, отделяет разовые крупные сделки от регулярного спроса, учитывает периоды отсутствия товара и показывает, почему предлагает заказать именно такое количество. Цель — уменьшить одновременно дефицит и избыточные остатки.
Статус MVP: backend и Next.js-интерфейс связаны через API и JWT-сессию. Импорт, расчёт, принятие рекомендаций, заказ и XLSX-экспорт доступны в рабочем сценарии. При этом первая таблица на главной странице показывает отдельный встроенный набор
/api/v1/procurement/recommendations, а результаты нового расчёта — в секции ниже. Ограничения интерфейса перечислены в конце README.
Для кого и что реализовано
Основной пользователь — закупщик. Он загружает данные, запускает расчёт, изучает объяснения, при необходимости меняет количество и принимает рекомендации. Из принятых строк формируются черновики заказов по поставщику и складу. Администратор просматривает и утверждает заказ; закупщик после этого скачивает XLSX для учётной системы. Заказ не отправляется поставщику автоматически.
Backend поддерживает:
- импорт
.xlsxс валидацией, защитой от повторной загрузки и запретом явных персональных данных клиентов; - два режима истории спроса: транзакции и помесячные продажи;
- обработку возвратов, разовых крупных продаж, stockout, устойчивого роста и сезонности;
- учёт текущего остатка, товара в пути, материальной потребности, срока поставки, страхового запаса, MOQ и кратности упаковки;
- сохранение прогнозов, аномалий, компонентов формулы, уровня риска дефицита и помесячных трендов;
- фильтрацию и пагинацию рекомендаций, ручную корректировку с причиной и контролем версии, явное принятие;
- создание черновиков, утверждение только администратором и экспорт утверждённого заказа в XLSX с checksum;
- локальные аккаунты сотрудников, Argon2-хеширование паролей и короткоживущие JWT. Публичной регистрации нет.
Дополнительные AI-подсказки для интерфейса используют OpenAI gpt-4o-mini, если задан ключ; без него доступен детерминированный fallback. Расчёт рекомендуемого количества не зависит от LLM.
Как работает расчёт
Excel → проверка и импорт → очистка истории спроса → прогноз
→ учёт запасов и условий поставщика → рекомендация с объяснением
→ корректировка и принятие закупщиком → черновик
→ утверждение администратором → XLSX для ручного импорта в 1С
Для каждого артикула и склада сервис строит регулярный спрос по истории. Разовые крупные продажи помечаются как аномалии и не раздувают базовую потребность; возвраты учитываются отдельно. При stockout фактические нулевые продажи не считаются нулевым спросом. Прогноз учитывает рост и коэффициенты сезонности. Затем из потребности на горизонт планирования со страховым запасом вычитаются доступный остаток и ожидаемые поступления, добавляется материальная потребность; положительный результат округляется по MOQ и кратности поставщика. Результат сопровождается формулой и сохранёнными исходными компонентами. Подробные параметры и HTTP-контракт — в docs/http_api.md.
Технологии и архитектура
| Компонент | Технологии и назначение |
|---|---|
| Frontend | Next.js 15, React 19, TypeScript, Tailwind CSS, TanStack Query, Zustand, Zod; BFF с HttpOnly JWT-cookie |
| API и аналитика | Python, FastAPI, Pydantic, Pandas, NumPy/SciPy, Openpyxl |
| Данные | PostgreSQL 16, SQLAlchemy 2, Alembic; SQLite — только в части автоматических тестов |
| Авторизация | JWT (PyJWT), Argon2; роли buyer и admin |
| AI-подсказки | Опциональный OpenAI API (gpt-4o-mini) и fallback без ключа |
Backend организован в три слоя DDD: backend/domain содержит сущности и правила расчёта, backend/application — сценарии и порты репозиториев, backend/infrastructure — FastAPI, PostgreSQL-адаптеры, Excel и внешние сервисы. frontend/ — отдельное Next.js-приложение. Миграции запускаются явно: API не создаёт таблицы при старте.
Установка и запуск локально
Ниже команды для PowerShell на Windows. Нужны Python 3.11+, Node.js 20+ с npm и Docker с Compose. Команды выполняются из корня репозитория; для macOS/Linux замените путь к .venv/Scripts/python.exe на .venv/bin/python.
-
Подготовьте окружение. Скопируйте
.env.exampleв.env, задайте локальный адрес базы и замените примерJWT_SECRETслучайным секретом. Примерный секрет из шаблона намеренно не принимается..envне коммитьте.Copy-Item .env.example .env python -c "import secrets; print(secrets.token_urlsafe(48))"В
.envукажите, например:DATABASE_URL=postgresql+psycopg://postgres:postgres@localhost:5432/procurement JWT_SECRET=<сгенерированный_случайный_секрет>OPENAI_API_KEYнеобязателен. URL сlocalhostпредназначен для backend, запускаемого на компьютере, а не внутри контейнера. -
Запустите PostgreSQL и установите зависимости backend:
docker compose up -d db python -m venv .venv .\.venv\Scripts\python.exe -m pip install -r requirements-dev.txt .\.venv\Scripts\python.exe -m alembic upgrade head -
Создайте первого администратора и запустите API. Команда создания попросит пароль без отображения; повторно пользователя с тем же именем не создавайте.
.\.venv\Scripts\python.exe -m backend.infrastructure.bootstrap_admin --username [email protected] .\.venv\Scripts\python.exe -m uvicorn backend.infrastructure.api.main:app --reloadAPI:
http://localhost:8000; проверка готовности:/healthи/health/db; схема API:/openapi.json, Swagger UI:/docs. Для доступа к рабочим маршрутам нужен заголовокAuthorization: Bearer <access_token>. Вход —POST /api/auth/login; администратор создаёт закупщика черезPOST /api/auth/users. Подробности — в docs/authentication.md. -
Создайте аккаунт закупщика через
POST /api/auth/usersс токеном администратора. Публичной регистрации и отдельного экрана создания сотрудников нет. Например, выполните в новом PowerShell-терминале (подставьте пароли, заданные вами):$login = @{ username = '[email protected]'; password = '<пароль_админа>' } | ConvertTo-Json $admin = Invoke-RestMethod -Method Post -Uri http://localhost:8000/api/auth/login -ContentType 'application/json' -Body $login $buyer = @{ username = '[email protected]'; display_name = 'Закупщик'; password = '<пароль_от_12_символов>' } | ConvertTo-Json Invoke-RestMethod -Method Post -Uri http://localhost:8000/api/auth/users -ContentType 'application/json' -Headers @{ Authorization = "Bearer $($admin.access_token)" } -Body $buyer -
В другом терминале запустите интерфейс:
Copy-Item frontend/.env.example frontend/.env.local cd frontend npm ci npm run devОткройте
http://localhost:3000и войдите как закупщик. Next.js обращается к FastAPI через собственный/api-прокси и хранит JWT в HttpOnly cookie.SERVER_API_URLизfrontend/.env.localдолжен указывать на FastAPI, доступный процессу Next.js.
Как проверить решение жюри
-
Откройте
http://localhost:3000под закупщиком. Загрузите.xlsxс продажами и условиями поставщика, нажмите «Пересчитать потребность», откройте секцию «Результат расчёта», скорректируйте количество с причиной и примите рекомендацию. Сформируйте заказ и сохраните его UUID. Выйдите, войдите администратором, откройте/orders, найдите заказ по UUID и утвердите. Снова войдите закупщиком и скачайте XLSX с экрана заказа. Первая таблица «Рекомендации закупок» на главной странице — встроенный серверный набор; именно секция «Результат расчёта» отражает загруженные файлы. -
Отдельно запустите настоящий сквозной тест backend из корня проекта:
.\.venv\Scripts\python.exe -m unittest discover -s tests -p test_api_end_to_end_smoke.py -v .\.venv\Scripts\python.exe -m unittest discover -s tests -p test_auth_api.py -vПервый тест сам создаёт небольшие Excel-файлы, импортирует продажи и условия поставщика, запускает расчёт, проверяет прогноз и объяснение, меняет и принимает рекомендацию, создаёт заказ, проверяет запрет утверждения закупщиком, утверждает его администратором и скачивает XLSX. Он работает во временной SQLite-базе и подставляет тестовые роли; второй отдельно проверяет реальный JWT-вход, права и отклонение недействительных токенов. Для полного набора тестов:
.\.venv\Scripts\python.exe -m unittest discover -s tests -v. -
Для ручной проверки на PostgreSQL после локального запуска войдите через
POST /api/auth/login, создайте закупщика, загрузите.xlsxчерезPOST /api/imports, запуститеPOST /api/calculation-runs, получите рекомендации поGET /api/calculation-runs/{id}/recommendations, откройте объяснение, примите рекомендацию и создайте заказ черезPOST /api/orders. Администратор утверждает его черезPOST /api/orders/{id}/approve, после чего закупщик создаёт и скачивает экспорт черезPOST/GET /api/orders/{id}/export. Для начала достаточно столбцовДата,Артикул,Склад,Количествов истории продаж иАртикул,Поставщик,MOQв условиях поставщика. Файл должен содержать обезличенные сведения о клиентах.
Данные и интеграции
API принимает .xlsx для продаж, помесячных продаж, остатков, периодов stockout, товаров в пути, сезонности, условий поставщиков, прогноза роста и материальной потребности. Полный список типов импорта: sales, monthly_sales, inventory, stockout, in_transit, seasonality, supplier_terms, growth, material_requirements. Исходные файлы партнёра не включены в репозиторий; для разработки и тестов используются синтетические данные. Клиентские идентификаторы должны быть заранее обезличены; явные персональные колонки импорт отклоняет.
XLSX для 1С — проектный шаблон, а не универсальный формат обмена. На стороне конкретной 1С нужно настроить сопоставление справочников; контрольный пример и поля находятся в docs/excel-order-export.md. Отправки поставщику или записи в 1С по API нет.
Ограничения текущей версии
- Первая таблица главной страницы использует отдельный встроенный набор
/api/v1/procurement/recommendations, не связанный с загруженными файлами. В таблице результатов расчёта backend пока возвращает UUID товара и поставщика без названий и цен. Списка всех заказов и выбора произвольного подмножества рекомендаций для заказа нет: заказ ищут по UUID, а создание берёт все принятые рекомендации запуска. - Алгоритм опирается на качество и полноту загруженных данных. Периоды без продаж и без подтверждённого stockout нельзя трактовать как доказанный нулевой спрос; прогноз не является гарантией продаж.
- Проверка формата анонимного ID не доказывает обезличивание: это обязанность источника данных.
- Шаблон XLSX требует настройки импорта под конфигурацию 1С. Заказы не отправляются поставщику автоматически.
- Для production нужны HTTPS, секреты вне
.env, ограничение частоты попыток входа, процедуры восстановления доступа и отдельная проверка на предоставленном партнёром полном наборе данных.
Развёрнутая версия
Публичная ссылка на deployed-версию в репозитории не указана. Проект можно запустить локально по инструкции выше.
Авторы коммитов
История коммитов
- 2026-09-23 18:02docs: write hackathon README with setup and jury walkthroughDenis
- 2026-09-23 17:59Feature/connect front back (#20)Yevgeniy Averyanov
- 2026-09-23 17:59feat: implement user authentication and session management; add login/logout functionality and session context; enhance API proxy for user-related requestsYevgeniy Averyanov
- 2026-09-23 17:49refactor: remove unused demand analytics and order summary components; update inventory table and overview cards for improved functionality and UI consistency; add run recommendations tableYevgeniy Averyanov
- 2026-09-23 17:48feat: add JWT staff auth and admin-only order approvalDenis
- 2026-09-23 17:30feat: connect demand preparation and complete procurement backend flowDenis
- 2026-09-23 17:08test: cover domain algorithms database and API workflowDenis
- 2026-09-23 17:02fix: inventory management with demo mode support and improved quantity calculations (#18)Yevgeniy Averyanov
Все коммиты (80)
- 2026-09-23 17:02feat(api): connect workflows and separate export creation from download (#19)Abilkhaiyr Sarsenbay
- 2026-09-23 16:59merge: integrate main Excel export with API workflow endpointsAbilkhayir Sarsenbay
- 2026-09-23 16:57Merge branch 'main' into hotfix/frotnend-inventoryYevgeniy Averyanov
- 2026-09-23 16:56feat: add 1C-compatible Excel order export (#17)fallendwn
- 2026-09-23 16:56feat(api): connect workflows and separate export creation from downloadAbilkhayir Sarsenbay
- 2026-09-23 16:56fix: inventory management with demo mode support and improved quantity calculationsYevgeniy Averyanov
- 2026-09-23 16:50merge: resolve main conflicts for Excel exportDenis
- 2026-09-23 16:40feat: add 1C-compatible Excel order exportDenis
- 2026-09-23 16:39feat: add Demand Analytics widget and Supplier Orders component (#16)Yevgeniy Averyanov
- 2026-09-23 16:39Merge branch 'main' into feature/frontend-analytics-v1Yevgeniy Averyanov
- 2026-09-23 16:38Merge remote-tracking branch 'origin/main' into HEADDenis
- 2026-09-23 16:37Merge remote-tracking branch 'origin/main' into HEADDenis
- 2026-09-23 16:37merge: API foundation into main with AI dependenciesDenis
- 2026-09-23 16:36feat: add Demand Analytics widget and Supplier Orders componentYevgeniy Averyanov
- 2026-09-23 16:36feat: implement recommendation adjustment and order workflows APP-06 through APP-09 (#15)Abilkhaiyr Sarsenbay
- 2026-09-23 16:32feat: implement recommendation adjustment and order workflows APP-06 through APP-09Abilkhayir Sarsenbay
- 2026-09-23 16:32feat(api): add foundation and request response schemasDenis
- 2026-09-23 16:31feat: implement warehouse procurement backend API and AI-driven inventory analysis frontend components (#14)Yevgeniy Averyanov
- 2026-09-23 16:30Merge branch 'main' into feature/backend-llm-integrationYevgeniy Averyanov
- 2026-09-23 16:28feat: implement warehouse procurement backend API and AI-driven inventory analysis frontend componentsYevgeniy Averyanov
- 2026-09-23 16:22Merge remote-tracking branch 'origin/main' into feat/app-01-05Denis
- 2026-09-23 16:21feat: implement APP-01 through APP-05 application workflowsDenis
- 2026-09-23 16:16feat: implement demand preparation pipeline ALG-01 through ALG-05 (#13)Abilkhaiyr Sarsenbay
- 2026-09-23 16:15feat: implement demand preparation pipeline ALG-01 through ALG-05Abilkhayir Sarsenbay
- 2026-09-23 16:08feat: implement atomic Excel import workflowDenis
- 2026-09-23 16:07Merge branch 'feat/alg-06-09'Denis
- 2026-09-23 16:06feat: implement forecasting and replenishment algorithmsDenis
- 2026-09-23 15:56feat(repositories): implement source data read repositories (#12)Abilkhaiyr Sarsenbay
- 2026-09-23 15:53merge: resolve REP-02 conflicts with main and preserve inventory APIsAbilkhayir Sarsenbay
- 2026-09-23 15:46feat(repositories): implement source data read repositoriesAbilkhayir Sarsenbay
- 2026-09-23 15:45fix: preserve database health endpointsDenis
- 2026-09-23 15:42feat(infra): add docker and docker-compose infrastructure for frontend, backend, and postgres (#11)Yevgeniy Averyanov
- 2026-09-23 15:42Merge remote-tracking branch 'origin/main'Denis
- 2026-09-23 15:41Merge branch 'main' of https://github.com/BAITC-Hacks/hack-0d60a011-horseaters into feature/docker-infrastructureYevgeniy Averyanov
- 2026-09-23 15:41Merge branch 'feat/repo'Denis
- 2026-09-23 15:40feat: add inventory and order repositoriesDenis
- 2026-09-23 15:33feat(db): configure Alembic and add initial schema migration (#10)Abilkhaiyr Sarsenbay
- 2026-09-23 15:33Merge branch 'feat/repo'Denis
- 2026-09-23 15:32feat: add import batch repositoryDenis
- 2026-09-23 15:31feat(db): configure Alembic and add initial schema migrationAbilkhayir Sarsenbay
- 2026-09-23 15:28Merge branch 'feat/db'Denis
- 2026-09-23 15:27feat: add SQLAlchemy unit of workDenis
- 2026-09-23 15:24feat(infra): add docker and docker-compose infrastructure for frontend, backend, and postgresYevgeniy Averyanov
- 2026-09-23 15:20Merge branch 'codex/db-02-postgresql'Denis
- 2026-09-23 15:19feat: add local PostgreSQL runtime and health checksDenis
- 2026-09-23 15:15feat: enhance UI components and add new features (#8)Yevgeniy Averyanov
- 2026-09-23 15:14feat: add catalog and import domain and SQLAlchemy models (#9)Abilkhaiyr Sarsenbay
- 2026-09-23 15:14Merge branch 'main' into feature/frontend-redesign-v1Yevgeniy Averyanov
- 2026-09-23 15:13Merge remote-tracking branch 'origin/main' into feat/catalog-imports-domainAbilkhayir Sarsenbay
- 2026-09-23 15:11fix: register all models and share domain enumsAbilkhayir Sarsenbay
- 2026-09-23 15:11feat: enhance UI components and add new featuresYevgeniy Averyanov
- 2026-09-23 15:07Merge remote-tracking branch 'origin/main' into feat/catalog-imports-domainAbilkhayir Sarsenbay
- 2026-09-23 15:06Feat/models (#7)Abilkhaiyr Sarsenbay
- 2026-09-23 15:05feat: add catalog and import ORM and domain modelsAbilkhayir Sarsenbay
- 2026-09-23 15:02Feat/models (#6)fallendwn
- 2026-09-23 14:59fix: conflictsDenis
- 2026-09-23 14:57feat: add modelsDenis
- 2026-09-23 14:40Merge pull request #5 from BAITC-Hacks/feat/modelsfallendwn
- 2026-09-23 14:37feat: base, enums, orders modelsDenis
- 2026-09-23 14:28feat: configure PostgreSQL connection with psycopg (#4)Abilkhaiyr Sarsenbay
- 2026-09-23 14:27Merge branch 'main' of https://github.com/BAITC-Hacks/hack-0d60a011-horseaters into features/bdAbilkhayir Sarsenbay
- 2026-09-23 14:26feat: configure PostgreSQL connection with psycopgAbilkhayir Sarsenbay
- 2026-09-23 14:19feat: frontend init + add export order functionality and inventory filtering (#3)Yevgeniy Averyanov
- 2026-09-23 14:18feat: agents.md + db.md in docsDenis
- 2026-09-23 14:17feat: frontend init + add export order functionality and inventory filteringYevgeniy Averyanov
- 2026-09-23 13:40Merge branch 'main' of https://github.com/BAITC-Hacks/hack-0d60a011-horseatersDenis
- 2026-09-23 13:40feat: add basic placeholders for backend + update agents.mdDenis
- 2026-09-23 12:15Revert "feat: created front pages (#1)" (#2)Yevgeniy Averyanov
- 2026-09-23 12:15Revert "feat: created front pages (#1)"Yevgeniy Averyanov
- 2026-09-23 12:14feat: created front pages (#1)Yevgeniy Averyanov
- 2026-09-23 12:13feat: created front pagesAbilkhayir Sarsenbay
- 2026-09-23 11:32feat: gitignoreDenis
Структура репозитория (309 файлов)
.env.example .gitattributes .gitignore README.md agents.md alembic.ini backend/.dockerignore backend/Dockerfile backend/__init__.py backend/application/__init__.py backend/application/dto/__init__.py backend/application/dto/calculation.py backend/application/dto/imports.py backend/application/dto/order.py backend/application/dto/recommendation.py backend/application/ports/__init__.py backend/application/ports/export_artifacts.py backend/application/ports/imports.py backend/application/ports/order_exporter.py backend/application/ports/unit_of_work.py backend/application/services/__init__.py backend/application/services/calculation_pipeline.py backend/application/use_cases/__init__.py backend/application/use_cases/accept_recommendation.py backend/application/use_cases/adjust_recommendation.py backend/application/use_cases/approve_order.py backend/application/use_cases/create_orders.py backend/application/use_cases/download_order_export.py backend/application/use_cases/explain_recommendation.py backend/application/use_cases/export_order.py backend/application/use_cases/get_calculation_run.py backend/application/use_cases/get_demand_trends.py backend/application/use_cases/get_import_status.py backend/application/use_cases/get_order.py backend/application/use_cases/import_data.py backend/application/use_cases/import_file.py backend/application/use_cases/list_recommendations.py backend/application/use_cases/prepare_demand.py backend/application/use_cases/run_calculation.py backend/docker-entrypoint.sh backend/domain/__init__.py backend/domain/entities/__init__.py backend/domain/entities/_validation.py backend/domain/entities/base.py backend/domain/entities/calculation_run.py backend/domain/entities/catalog.py backend/domain/entities/demand_forecast.py backend/domain/entities/detected_anomaly.py backend/domain/entities/enums.py backend/domain/entities/imports.py backend/domain/entities/order_export.py backend/domain/entities/product.py backend/domain/entities/purchase_order.py backend/domain/entities/recommendation.py backend/domain/enums.py backend/domain/errors.py backend/domain/repositories/__init__.py backend/domain/repositories/calculation_run_repository.py backend/domain/repositories/filters.py backend/domain/repositories/import_repository.py backend/domain/repositories/inventory_repository.py backend/domain/repositories/material_requirement_repository.py backend/domain/repositories/order_repository.py backend/domain/repositories/product_repository.py backend/domain/repositories/recommendation_repository.py backend/domain/repositories/sales_repository.py backend/domain/repositories/seasonality_repository.py backend/domain/repositories/supplier_repository.py backend/domain/repositories/warehouse_repository.py backend/domain/services/__init__.py backend/domain/services/_demand_math.py backend/domain/services/anomaly.py backend/domain/services/demand_preparation.py backend/domain/services/explanation.py backend/domain/services/forecasting.py backend/domain/services/growth.py backend/domain/services/recommendation.py backend/domain/services/replenishment.py backend/domain/services/risk.py backend/domain/services/seasonality.py backend/domain/services/stockout.py backend/domain/value_objects/__init__.py backend/domain/value_objects/demand.py backend/domain/value_objects/quantity.py backend/domain/value_objects/sku.py backend/infrastructure/__init__.py backend/infrastructure/ai/__init__.py backend/infrastructure/ai/cache.py backend/infrastructure/ai/fallbacks.py backend/infrastructure/ai/schemas.py backend/infrastructure/ai/service.py backend/infrastructure/api/__init__.py backend/infrastructure/api/dependencies.py backend/infrastructure/api/errors.py backend/infrastructure/api/exceptions.py backend/infrastructure/api/main.py backend/infrastructure/api/routers/__init__.py backend/infrastructure/api/routers/ai.py backend/infrastructure/api/routers/auth.py backend/infrastructure/api/routers/calculation_runs.py backend/infrastructure/api/routers/health.py backend/infrastructure/api/routers/imports.py backend/infrastructure/api/routers/orders.py backend/infrastructure/api/routers/procurement.py backend/infrastructure/api/routers/recommendations.py backend/infrastructure/api/schemas/__init__.py backend/infrastructure/api/schemas/auth.py backend/infrastructure/api/schemas/calculations.py backend/infrastructure/api/schemas/errors.py backend/infrastructure/api/schemas/imports.py backend/infrastructure/api/schemas/orders.py backend/infrastructure/api/schemas/recommendations.py backend/infrastructure/api/schemas/workflows.py backend/infrastructure/auth_security.py backend/infrastructure/bootstrap_admin.py backend/infrastructure/config/__init__.py backend/infrastructure/config/settings.py backend/infrastructure/excel/__init__.py backend/infrastructure/excel/artifact_store.py backend/infrastructure/excel/exporter.py backend/infrastructure/excel/readers.py backend/infrastructure/persistence/__init__.py backend/infrastructure/persistence/_read_repository.py backend/infrastructure/persistence/application_uow.py backend/infrastructure/persistence/calculation_run_repository.py backend/infrastructure/persistence/check_connection.py backend/infrastructure/persistence/database.py backend/infrastructure/persistence/import_gateway.py backend/infrastructure/persistence/import_repository.py backend/infrastructure/persistence/inventory_repository.py backend/infrastructure/persistence/material_requirement_repository.py backend/infrastructure/persistence/migrations/env.py backend/infrastructure/persistence/migrations/script.py.mako backend/infrastructure/persistence/migrations/versions/0001_initial_schema.py backend/infrastructure/persistence/migrations/versions/0002_user_credentials.py backend/infrastructure/persistence/models/__init__.py backend/infrastructure/persistence/models/base.py backend/infrastructure/persistence/models/calculation.py backend/infrastructure/persistence/models/catalog.py backend/infrastructure/persistence/models/enums.py backend/infrastructure/persistence/models/imports.py backend/infrastructure/persistence/models/orders.py backend/infrastructure/persistence/order_repository.py backend/infrastructure/persistence/product_repository.py backend/infrastructure/persistence/recommendation_repository.py backend/infrastructure/persistence/sales_repository.py backend/infrastructure/persistence/seasonality_repository.py backend/infrastructure/persistence/supplier_repository.py backend/infrastructure/persistence/unit_of_work.py backend/infrastructure/persistence/warehouse_repository.py backend/requirements.txt docker-compose.yml docs/BACKEND_GAPS.md docs/authentication.md docs/database.md docs/demand_preparation.md docs/examples/order-export-1c.xlsx docs/excel-order-export.md docs/http_api.md docs/order_use_cases.md docs/repositories.md frontend/.dockerignore frontend/.env.example frontend/.gitignore frontend/Dockerfile frontend/README.md frontend/app/analytics/page.tsx frontend/app/api/[...segments]/route.ts frontend/app/layout.tsx frontend/app/orders/page.tsx frontend/app/page.tsx frontend/app/sandbox/page.tsx frontend/eslint.config.mjs frontend/next.config.ts frontend/package-lock.json frontend/package.json frontend/postcss.config.mjs frontend/public/.gitkeep frontend/src/app/providers/app-provider.tsx frontend/src/app/providers/index.ts frontend/src/app/providers/query-provider.tsx frontend/src/app/providers/theme-provider.tsx frontend/src/app/styles/globals.css frontend/src/entities/calculation-run/api/calculation-run.ts frontend/src/entities/calculation-run/index.ts frontend/src/entities/calculation-run/model/schema.ts frontend/src/entities/import-batch/api/import-batch.ts frontend/src/entities/import-batch/index.ts frontend/src/entities/import-batch/model/schema.ts frontend/src/entities/inventory/api/index.ts frontend/src/entities/inventory/api/inventory-api.ts frontend/src/entities/inventory/index.ts frontend/src/entities/inventory/lib/index.ts frontend/src/entities/inventory/lib/order.ts frontend/src/entities/inventory/model/index.ts frontend/src/entities/inventory/model/schema.ts frontend/src/entities/order/api/order.ts frontend/src/entities/order/index.ts frontend/src/entities/order/model/schema.ts frontend/src/entities/procurement-item/api/procurement-item.ts frontend/src/entities/procurement-item/index.ts frontend/src/entities/procurement-item/model/schema.ts frontend/src/entities/recommendation/api/recommendation.ts frontend/src/entities/recommendation/index.ts frontend/src/entities/recommendation/model/schema.ts frontend/src/entities/system/api/health.ts frontend/src/entities/system/index.ts frontend/src/entities/user/api/user.ts frontend/src/entities/user/index.ts frontend/src/entities/user/model/schema.ts frontend/src/entities/user/model/session-context.tsx frontend/src/features/adjust-recommendation/index.ts frontend/src/features/adjust-recommendation/model/schema.ts frontend/src/features/adjust-recommendation/ui/adjust-recommendation-action.tsx frontend/src/features/ai-analysis/api/ai-api.ts frontend/src/features/ai-analysis/index.ts frontend/src/features/ai-analysis/model/ai-store.ts frontend/src/features/ai-analysis/ui/ai-executive-banner.tsx frontend/src/features/ai-analysis/ui/sku-analysis-drawer.tsx frontend/src/features/ai-analysis/ui/supplier-letter-modal.tsx frontend/src/features/approve-order/index.ts frontend/src/features/approve-order/ui/approve-action.tsx frontend/src/features/auth-session/index.ts frontend/src/features/auth-session/model/login-schema.ts frontend/src/features/auth-session/ui/session-gate.tsx frontend/src/features/edit-inventory-item/index.ts frontend/src/features/edit-inventory-item/model/edit-store.ts frontend/src/features/edit-inventory-item/ui/edit-item-dialog.tsx frontend/src/features/export-order/index.ts frontend/src/features/export-order/ui/export-menu.tsx frontend/src/features/filter-inventory/index.ts frontend/src/features/filter-inventory/model/filter.ts frontend/src/features/filter-inventory/ui/filter-bar.tsx frontend/src/features/import-data/index.ts frontend/src/features/import-data/model/schema.ts frontend/src/features/import-data/ui/import-data-action.tsx frontend/src/features/run-calculation/index.ts frontend/src/features/run-calculation/model/run-session.ts frontend/src/features/run-calculation/model/schema.ts frontend/src/features/run-calculation/ui/calculation-run-badge.tsx frontend/src/features/run-calculation/ui/run-calculation-action.tsx frontend/src/features/select-items/index.ts frontend/src/features/select-items/model/selection-store.ts frontend/src/features/set-horizon/index.ts frontend/src/features/set-horizon/model/horizon-store.ts frontend/src/features/toggle-theme/index.ts frontend/src/features/toggle-theme/ui/theme-toggle.tsx frontend/src/pages-flat/analytics/index.ts frontend/src/pages-flat/analytics/ui/analytics-page.tsx frontend/src/pages-flat/inventory/index.ts frontend/src/pages-flat/inventory/ui/inventory-page.tsx frontend/src/pages-flat/orders/index.ts frontend/src/pages-flat/orders/ui/orders-page.tsx frontend/src/pages-flat/sandbox/index.ts frontend/src/pages-flat/sandbox/ui/sandbox-page.tsx frontend/src/shared/api/http.ts frontend/src/shared/api/index.ts frontend/src/shared/api/scalars.ts frontend/src/shared/lib/format.ts frontend/src/shared/lib/index.ts frontend/src/shared/ui/badge.tsx frontend/src/shared/ui/button.tsx frontend/src/shared/ui/card.tsx frontend/src/shared/ui/error-message.tsx frontend/src/shared/ui/index.ts frontend/src/shared/ui/input.tsx frontend/src/shared/ui/skeleton.tsx frontend/src/shared/ui/table.tsx frontend/src/widgets/app-shell/index.ts frontend/src/widgets/app-shell/ui/app-shell.tsx frontend/src/widgets/inventory-table/index.ts frontend/src/widgets/inventory-table/ui/inventory-table.tsx frontend/src/widgets/overview-cards/index.ts frontend/src/widgets/overview-cards/ui/overview-cards.tsx frontend/src/widgets/run-recommendations/index.ts frontend/src/widgets/run-recommendations/ui/run-recommendations-table.tsx frontend/tailwind.config.ts frontend/tsconfig.json requirements-dev.txt requirements.txt tests/test_ai_service.py tests/test_alg_06_09.py tests/test_algorithm_acceptance.py tests/test_api_end_to_end_smoke.py tests/test_api_foundation.py tests/test_api_workflows.py tests/test_application_calculation.py tests/test_auth_api.py tests/test_database.py tests/test_demand_preparation.py tests/test_domain_entities.py tests/test_domain_workflow_contracts.py tests/test_excel_import_reader.py tests/test_excel_order_export.py tests/test_health.py tests/test_import_api.py tests/test_import_repository.py tests/test_import_use_case.py tests/test_inventory_repository.py tests/test_migrations.py tests/test_migrations_postgresql.py tests/test_model_contracts.py tests/test_order_repository.py tests/test_order_use_cases.py tests/test_postgres_integration.py tests/test_procurement_router.py tests/test_read_repositories.py tests/test_settings.py tests/test_unit_of_work.py
Ветки (23)
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.