AAYMA
RU
Войти

Stockwise

Веб-сервис для закупщика: импорт Excel продаж и условий поставщиков, прогноз спроса с учётом аномалий, stockout и сезонности, рекомендации по заказу…

Рабочий MVP
Команда «horseaters» 9💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: 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.md

Stockwise — помощник закупщика для пополнения склада

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.

Технологии и архитектура

КомпонентТехнологии и назначение
FrontendNext.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.

  1. Подготовьте окружение. Скопируйте .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, запускаемого на компьютере, а не внутри контейнера.

  2. Запустите 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
    
  3. Создайте первого администратора и запустите API. Команда создания попросит пароль без отображения; повторно пользователя с тем же именем не создавайте.

    .\.venv\Scripts\python.exe -m backend.infrastructure.bootstrap_admin --username [email protected]
    .\.venv\Scripts\python.exe -m uvicorn backend.infrastructure.api.main:app --reload
    

    API: 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.

  4. Создайте аккаунт закупщика через 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
    
  5. В другом терминале запустите интерфейс:

    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.

Как проверить решение жюри

  1. Откройте http://localhost:3000 под закупщиком. Загрузите .xlsx с продажами и условиями поставщика, нажмите «Пересчитать потребность», откройте секцию «Результат расчёта», скорректируйте количество с причиной и примите рекомендацию. Сформируйте заказ и сохраните его UUID. Выйдите, войдите администратором, откройте /orders, найдите заказ по UUID и утвердите. Снова войдите закупщиком и скачайте XLSX с экрана заказа. Первая таблица «Рекомендации закупок» на главной странице — встроенный серверный набор; именно секция «Результат расчёта» отражает загруженные файлы.

  2. Отдельно запустите настоящий сквозной тест 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.

  3. Для ручной проверки на 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-версию в репозитории не указана. Проект можно запустить локально по инструкции выше.

Звёзды
⭐ 0
Форки
0
Язык
Python
Последний push
в прошлом месяце
Коммиты
80
Авторы
5
Файлы
309
Ветки
23

Авторы коммитов

Denis 35Yevgeniy Averyanov 14Abilkhayir Sarsenbay 14Yevgeniy Averyanov 9Abilkhaiyr Sarsenbay 8

История коммитов

  • 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 комментариев

Войдите, чтобы комментировать

Пока нет комментариев — будьте первым.