AAYMA
RU
Войти

Центр закупок

Полноценная система пополнения склада для Электрокомплект: импорт данных 1С и Excel партнёра, расчёт рекомендаций по товару и складу с объяснением…

Доведённый продукт
Команда «ozLTeam» 18💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: ozLTeam
Кейс HackAlem.ai: Логистика — Электрокомплект · ekt.kz
Стадия: Доведённый продукт

Задача кейса: Автоматический расчёт заказов поставщикам для пополнения склада, с утверждением менеджером

Суть

Полноценная система пополнения склада для Электрокомплект: импорт данных 1С и Excel партнёра, расчёт рекомендаций по товару и складу с объяснением, черновики заказов по поставщику, ручная корректировка, утверждение менеджером и выгрузка CSV/XLSX, плюс AI-помощник закупщика.

Как устроено

Excel-книги партнёра (продажи, остатки, MOQ, сезонность, товар в пути по IEK и Systeme Electric) импортируются с предпросмотром в PostgreSQL. Фоновый расчёт через очередь arq на Redis исключает разовые выбросы, восстанавливает спрос за дни stockout, прогнозирует на горизонт поставки с сезонностью и ростом, учитывает резерв, поступления, страховой запас, MOQ и кратность. Рекомендации группируются в черновики по поставщику и складу и утверждаются вручную. AI-ассистент с бизнес-инструментами (провайдеры Anthropic, OpenAI, NVIDIA) читает сводки и предлагает действия с подтверждением.

Ключевые решения

  • восстановление спроса при stockout
  • исключение выбросов
  • сезонность и тренд
  • страховой запас
  • округление по MOQ и кратности
  • фоновая очередь arq
  • pgvector
  • AI agent tools

Особенности

Каждая рекомендация хранит полную трассу расчёта (продажи → исключённые выбросы → восстановленный спрос → прогноз → запас → округление), поэтому количество объясняется входными числами без LLM. Утверждение в приложении, приём в 1С и фактическое поступление разведены как отдельные события. Самый крупный репозиторий батча: 137 коммитов, 633 файла.

Стек

Python · FastAPI · SQLAlchemy · Alembic · PostgreSQL · pgvector · Redis · arq · React · TypeScript · Vite · Docker Compose

Модели

Anthropic · OpenAI · NVIDIA


Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-34b30c3c-ozlteam.

README

README.md

Центр закупок · HackAlem AI

Объяснимое пополнение склада: от данных 1С до проверенного заказа поставщику.

Проект для ТОО «Электрокомплект» (ekt.kz), трек 05 «Логистика» HackAlem AI. Пользователь — менеджер закупок: он получает рекомендации, видит расчёт по каждому товару, корректирует количество, утверждает заказ и выгружает его в CSV/XLSX.

Сегодня менеджер сводит данные в Excel вручную. Это занимает время, а разовые крупные отгрузки и периоды отсутствия товара искажают обычный спрос. Сервис автоматизирует расчёт и сохраняет его объяснение, чтобы менеджер мог регулярно пересматривать закупки и обоснованно управлять риском дефицита и избыточным запасом. Денежный эффект и точность прогноза на данных партнёра пока не измерены.

Компания-пользователь — Электрокомплект. Спрос — её отгрузки клиентам из собственной 1С. IEK и Systeme Electric — первые поставщики/бренды в переданных данных; архитектура поддерживает других поставщиков и склады компании.

Начало работы: начните с быстрого запуска и пройдите сценарий менеджера. Основной сценарий работает без ключей внешних AI-сервисов; для диалога с AI-помощником ключ нужен отдельно.

Содержание

Что можно сделать

ВозможностьРезультат для пользователя
Загрузить и проверить данныеПредпросмотр, ошибки, происхождение данных и ограничения по товарам до применения импорта.
Рассчитать потребностьКоличество по каждому товару и складу с учётом истории, запасов, поставок, сезонности, роста и условий закупки.
Понять рекомендациюИсходные продажи, исключённые выбросы, восстановленный спрос, прогноз, формула, округление и предупреждения.
Подготовить заказыГруппировка по поставщику и складу, ручная корректировка с причиной, явное утверждение.
Выгрузить результатCSV/XLSX утверждённой редакции; JSON-пакет для адаптера учётной системы доступен через API.
Спросить AI-помощникаСправка по приложению, чтение разрешённых сводок и предложения действий с подтверждением.
Вернуться к работеДанные, история расчётов, заказы и личные диалоги хранятся в PostgreSQL.

Заказ поставщику автоматически не отправляется. Утверждение в приложении, приём документа в 1С и фактическое поступление товара учитываются как разные события.

Быстрый запуск

Что понадобится

  • Git и доступ к этому репозиторию.
  • Docker с Compose v2; для macOS/Windows — запущенный Docker Desktop.
  • Свободные локальные порты 5173 и 7575.
  • Интернет для первой загрузки образов и зависимостей.

Python, Node.js, PostgreSQL и Redis на хост устанавливать не нужно. Команды ниже выполняются из корня репозитория.

macOS / Linux

git clone https://github.com/BAITC-Hacks/hack-34b30c3c-ozlteam.git
cd hack-34b30c3c-ozlteam

make dev
make seed
./scripts/dev.sh exec -T api python -m app.seed.replenishment

Если репозиторий уже скачан, используйте существующий каталог. Без Make те же действия:

./scripts/dev.sh up -d
./scripts/dev.sh exec -T api python -m app.seed.seed
./scripts/dev.sh exec -T api python -m app.seed.replenishment

Первый запуск собирает контейнеры, устанавливает зависимости, применяет миграции и поднимает сервисы. Если .env.local отсутствует, скрипт создаёт его из шаблона и генерирует JWT-секрет. Существующий файл сохраняется.

make seed создаёт права, роли и локального администратора. Следующая команда добавляет синтетические данные и ставит расчёт в очередь. Дождитесь его завершения в интерфейсе; для этого должны работать worker и Redis.

Windows / PowerShell

git clone https://github.com/BAITC-Hacks/hack-34b30c3c-ozlteam.git
cd hack-34b30c3c-ozlteam

.\scripts\dev.ps1 up -d
.\scripts\dev.ps1 exec -T api python -m app.seed.seed
.\scripts\dev.ps1 exec -T api python -m app.seed.replenishment

Для остальных Docker-команд в этом README заменяйте ./scripts/dev.sh на .\scripts\dev.ps1. Многострочные команды из блоков sh объединяйте в одну строку, удаляя завершающие \: это Bash-синтаксис продолжения строки.

Первый вход

После входа откройте «Поставки» (/shipments): карта, ожидаемое прибытие и риск дефицита связаны с заказом. Пока страница использует «Тестовые данные» и открывается с грузом в пути; варианты состояния доступны в свёрнутом блоке «Источник данных». По кнопке анализа настроенный AI-провайдер получает синтетический снимок заказа, рейса и запаса и возвращает настоящий ответ модели. Без работающего провайдера карта и расчёты доступны, анализ покажет ошибку. GPS и реальные учётные записи не изменяются. Старый адрес /routes/demo перенаправляет на /shipments.

Откройте приложение.

На новом окружении со стандартным шаблоном:

Введите пароль администратора выше. Если вы изменили настройки, используйте SEED_ADMIN_EMAIL и SEED_ADMIN_PASSWORD из своего .env.local. Повторный seed не меняет пароль уже существующего пользователя.

Это общедоступные учётные данные только для локального демо. Для общего стенда задайте собственные значения до первого seed.

АдресНазначение
http://127.0.0.1:5173Приложение
http://127.0.0.1:7575/docsИнтерактивная документация API
http://127.0.0.1:7575/openapi.jsonКонтракт OpenAPI
http://127.0.0.1:7575/api/health/readyГотовность API и PostgreSQL/pgvector

Что входит в демо

Сидер создаёт отдельный источник «ДЕМО: Электрокомплект, синтетические данные 2026-09-22», склад «Алматы (демо)», двух поставщиков и четыре товара с 730 днями истории. В набор включены сезонность, рост, stockout, разовая крупная продажа и товар в пути.

Дата среза фиксирована: 22.09.2026. Для повторения примера открывайте этот расчёт или создавайте новый на ту же дату. Расчёт на сегодняшнюю дату может показывать устаревшие остатки и другой результат.

Сидер можно запускать повторно: он не дублирует свой источник и данные. Исходные коммерческие Excel-файлы для этого демо не нужны; make mock также не требуется.

Как пользоваться: пошаговое демо

1. Проверить данные

Откройте Данные (/data) и найдите синтетический источник. В Справочниках (/data/catalogs) доступны товары, категории, поставщики и склады. В разделе Запасы (/inventory) можно сверить остатки, резерв, ожидаемые поступления и интервалы отсутствия товара.

С правом catalogs.write в справочниках доступны «Добавить запись», а в карточке — «Изменить», «В архив» и «Восстановить». Изменения сохраняются в БД и доступны помощнику; демо-названия автоматически не заменяются реальными. Для заказа выбирайте товар, поставщика и склад одного источника. Инструкция и ограничения ручных изменений.

Для демо выбирайте склад «Алматы (демо)». Если на стенд также загружены исходные книги партнёра, у них будет отдельный источник и собственные ограничения.

2. Открыть или запустить расчёт

Перейдите в Рекомендации (/recommendations):

  1. Откройте в истории расчёт на 2026-09-22, созданный сидером, и дождитесь статуса готовности.
  2. Для нового расчёта выберите склад, дату среза 2026-09-22 и при необходимости категорию; нажмите «Рассчитать».
  3. В дополнительных параметрах доступна глубина истории: по умолчанию 1095 дней, допустимо от 28 до 3650.
  4. Откройте результат. Строки сгруппированы по поставщику; доступны фильтры и постраничный просмотр.

Расчёт выполняется в фоне и сохраняется. Обновление страницы не отменяет задачу. Если расчёт завершился ошибкой, сначала устраните указанную причину, затем создайте новый запуск.

3. Разобрать рекомендацию

Нажмите на название товара. В карточке рекомендации проверьте:

  • сколько было фактических продаж и какой объём исключён как разовый;
  • сколько спроса восстановлено за подтверждённые дни отсутствия;
  • какой прогноз получен на горизонт поставки и пересмотра;
  • какой остаток доступен после резерва и сколько товара поступит в срок;
  • страховой запас, MOQ, кратность и итог округления;
  • прогнозируемую дату дефицита и ограничения исходных данных.

Ключевой вопрос проверки: можно ли объяснить рекомендованное количество входными числами и правилами? Каждая рекомендация хранит подробности расчёта; менять её исходные числа через чат не требуется.

4. Создать черновики

Вернитесь к списку, отметьте готовые позиции с положительным количеством и нажмите «Создать черновики». Проверьте предпросмотр и подтвердите.

Сервер разделит выбранные строки по поставщику и складу. Выбор «доступных на странице» относится к текущей странице списка. Заблокированные позиции и нулевые рекомендации не допускаются в заказ. Уже использованная рекомендация показывает ссылку на существующий заказ.

5. Скорректировать и утвердить

Откройте черновик в Заказах (/orders):

  1. При необходимости измените количество, укажите причину и сохраните.
  2. Проверьте все строки и комментарий.
  3. Нажмите «Просмотреть и утвердить», затем «Утвердить заказ».
  4. Скачайте XLSX или CSV.

Алгоритм округляет рекомендацию по MOQ и кратности. При ручном изменении менеджер должен самостоятельно проверить условия поставщика: редактор не повторяет все правила округления расчёта.

Обновите страницу и снова откройте заказ: правки, утверждение и версия должны сохраниться. Экспорт соответствует утверждённой редакции. Если другой сотрудник уже изменил документ, приложение потребует перечитать актуальную версию.

6. Проверить AI-помощника

После настройки модели откройте /assistant:

  • «Как утвердить и выгрузить заказ?» — справочный ответ со ссылками на материалы приложения.
  • Выберите демонстрационный склад в контексте и разрешите передачу учётных сводок, затем спросите: «Какие позиции требуют внимания?»
  • Попросите объяснить открытую рекомендацию или подготовить черновики по готовым позициям.

Действия, меняющие данные, сначала показываются как предложение. Выполнение начинается после отдельного подтверждения пользователя. Утверждать заказ или отправлять его поставщику AI-помощник не может.

Отдельный быстрый пример

Страница /recommendations/demo позволяет рассчитать встроенный синтетический пример, скачать XLSX-шаблон, загрузить его обратно, изменить количества и экспортировать CSV.

Это отдельный упрощённый калькулятор: его расчёт не сохраняется в историю, а локальное подтверждение не создаёт заказ в PostgreSQL. Для проверки полного сценария используйте /recommendations и /orders.

Как рассчитывается заказ

Основной серверный алгоритм — robust-daily-v2, реализация. Он выполняется детерминированным Python-кодом. LLM помогает пользоваться результатом, но не вычисляет закупочное количество.

1. Зафиксировать данные

Расчёт ведётся для выбранного склада и товаров. При начале работы worker сохраняет снимок входов, ревизии источников, параметры и версию алгоритма. Повторное выполнение задачи использует тот же снимок. Незавершённый обмен данными блокирует расчёт.

Дата среза ограничивает факты продаж и запасов. Она не восстанавливает автоматически прежние версии исправленных документов и справочников; для исторического тестирования прогноза нужны архивные снимки.

2. Очистить разовые всплески

Продажи суммируются по товару, дню и обезличенному клиенту. Порог:

порог = max(5 × медиана положительных покупок,
            медиана + 8 × MAD)

MAD — медиана абсолютных отклонений от медианы. Покупки выше порога исключаются из регулярного спроса с сохранением даты, количества, порога и причины. Если у одного клиента есть минимум три крупные покупки за период не менее 28 дней, такой спрос считается повторяющимся и сохраняется.

При отсутствии клиентских ID доступно только выявление дневных выбросов; это ограничение показывается явно. Для очень короткой истории надёжность такого анализа ограничена. Нетто-возвраты учитываются, отрицательное итоговое значение дневного спроса ограничивается нулём.

3. Восстановить упущенный спрос

Для подтверждённых дней stockout оценивается спрос по доступным дням того же месяца и дня недели. Если таких дней меньше трёх, используются доступные дни того же дня недели, затем общий средний спрос.

Оценка может увеличить спрос, но не уменьшает фактические продажи. Если доступных наблюдений нет, позиция блокируется. Ноль в месячном остатке сам по себе не доказывает отсутствие товара весь месяц.

4. Учесть сезон, тренд и внешний прогноз

  • При истории от 540 дней строится месячный сезонный профиль товара.
  • При короткой истории используется профиль категории из достаточно длинных рядов выбранного среза; при отсутствии такого профиля — коэффициент 1 и предупреждение.
  • Базовый спрос рассчитывается по последним 56 дням очищенной истории с устранённой сезонностью.
  • Рост считается устойчивым, когда три последовательных 28-дневных блока возрастают более чем на 2% каждый, при достаточном числе наблюдений. Скорость роста ограничивается.
  • Внешний прогноз применяется только в заданном периоде. Прогноз товара имеет приоритет над категорией; режим позволяет дополнить внутренний тренд или заменить его дальнейшую экстраполяцию.

5. Рассчитать количество и риск

горизонт = срок поставки + период пересмотра
прогноз = сумма дневного прогнозируемого спроса на горизонте
страховой запас = средний дневной прогноз × дни страхового запаса
доступный остаток = max(0, остаток − резерв)

потребность = max(0,
  прогноз + страховой запас − доступный остаток − поступления в срок)

если потребность > 0:
  заказ = округлить вверх до кратности(max(потребность, MOQ))
иначе:
  заказ = 0

Период пересмотра и страховой запас задаются политикой категории. В пути учитываются подтверждённые/находящиеся в пути поставки после даты среза и внутри горизонта. Просроченные и слишком поздние поступления не закрывают текущую потребность.

Баланс моделируется по дням: поставка позднее даты дефицита может уменьшить общий объём заказа, но риск до её прихода остаётся. Срочность отражает момент прогнозируемого дефицита. Потребность до округления и прибавка до партии сохраняются отдельно.

Неизвестные обязательные условия, отсутствие необходимого остатка/истории или неподтверждённые данные партнёрского импорта блокируют позицию. Правила подробно описаны в документации расчёта.

Упрощённый /recommendations/demo использует собственную методику: окно до 365 дней и более простой порог выбросов. Его числа не следует сравнивать с серверной методикой как с одним и тем же алгоритмом.

AI-помощник закупщика

AI встроен в рабочий сценарий через страницу /assistant и боковую панель. Главный координатор выбирает одного из пяти специалистов: справка, данные 1С, запасы, спрос/расчёт, заказы. Это профили общего движка с разрешёнными инструментами.

Помощник может читать доступные сотруднику сводки и предложить три операции: применить проверенный пакет, запустить расчёт, создать черновики из готовых рекомендаций. Модель формирует план, а сервер проверяет схему, права, идентификаторы и допустимость операции. Каждое изменение требует подтверждения. Диалоги доступны только их владельцу.

Для OpenAI заполните в локальном .env.local:

LLM_PROVIDER=openai
LLM_MODEL=gpt-6-sol
OPENAI_REASONING_EFFORT=medium
OPENAI_API_KEY=ваш_ключ

Имя модели выше соответствует шаблону проекта; используйте модель, доступную вашему API-аккаунту. После изменения настроек:

make dev-env

Ключ не нужен для импорта, расчёта, заказов и экспорта. Без ключа ответы модели недоступны, остальные функции работают. В коде также есть адаптеры Anthropic, NVIDIA и OpenAI-совместимого API; настройки перечислены в .env.local.example.

Перед передачей учётных сводок пользователь даёт отдельное разрешение в контексте диалога. Права сотрудника проверяются сервером. Сырые книги, строки продаж и клиентские ID через инструменты модели не передаются. Сам текст вопроса отправляется провайдеру — секреты и персональные данные в него вставлять не следует.

В разработке проекта используется Codex. Это отдельно от AI-помощника внутри продукта. Устройство движка, инструменты, ограничения и проверочные запросы — в docs/ai-agents.md.

Загрузка своих данных и обмен с 1С

Нормализованный импорт

На /data добавьте источник, загрузите CSV в UTF-8 или XLSX, проверьте сопоставление полей, предпросмотр и ошибки. Затем явно примените проверенный файл. Лимиты обычного импорта: 25 МиБ и 10 000 нормализованных строк на запрос.

Контракт охватывает девять типов: категории, поставщики, склады, товары, продажи, остатки, поступления, интервалы отсутствия и прогноз прироста. Сначала должны быть известны справочники, на которые ссылаются факты. Поля, порядок загрузки и примеры — в docs/backend-data.md и Swagger.

Для больших обменов есть API версионированных пакетов: промежуточные передаются с complete=false, завершение — с complete=true. До завершения источник не допускается к расчёту.

Исходные Excel-книги партнёра

Для 12 книг IEK/Systeme Electric реализован отдельный пакетный адаптер: проверка состава, сопоставление кодов, сохранение происхождения, фоновые задачи и готовность товаров. Это широкие отчёты со своими профилями, отличающиеся от нормализованного шаблона.

Если книги доступны в вашем checkout, после основного запуска можно выполнить:

make seed-excel

Команда подключает TrackLogic только для чтения, проверяет манифест файлов и проходит штатный процесс импорта. Первая загрузка может занимать 8–10 минут; команда показывает прогресс и ожидает завершения. Повтор сохраняет UUID и не дублирует уже принятый пакет. После ошибки доступен явный повтор:

./scripts/seed-excel.sh --retry-failed

Зафиксированный набор даёт 2 поставщика, 7 категорий, 1 склад, 3 908 товаров и 248 467 принятых продаж. Это результат импорта, а не количество товаров, готовых к заказу.

Без дополнительных подтверждений все 3 908 товаров первоначально заблокированы для заказа: не хватает части актуальных остатков и условий. В исходных динамиках отсутствуют обезличенный клиент и цена, точные интервалы stockout и подтверждённый lead time. Эти сведения не подменяются выдуманными значениями. Полный сценарий демонстрируется на синтетических данных.

Подробности: пакетный импорт, состав и ограничения исходных данных. Коммерческие книги доступны в закрытом командном репозитории и не предназначены для открытой публикации.

Подключение 1С

На /data/integrations есть конструктор REST-отчётов: адрес JSON-отчёта, сопоставление полей, проверка и явное применение. Для исходящих запросов серверу задаются ONEC_ALLOWED_ORIGINS и секрет авторизации; в интерфейсе используется имя настройки, а не её значение.

Код также поддерживает входящие версионированные пакеты и исходящий JSON заказа с отдельным подтверждением обработки. Код 1С хранится строкой, внешний ID источника — отдельно, внутренние сущности используют UUIDv7. Реестр сопоставлений находится в нашем адаптере и БД.

Для конкретной конфигурации партнёра ещё требуется согласовать и проверить транспорт, ID документов/строк, единицы, знаки операций и формат заказа. Реальная база партнёра в рамках описанного демо не подключена. Автоматическое расписание REST-отчётов и обход страниц пока не реализованы. Инструкция интеграции.

Архитектура и API

Выгрузки / нормализованный API / REST-отчёты 1С
                  ↓
Импорт → сопоставление → проверка готовности → PostgreSQL
                                              ↓
React UI → FastAPI → фоновая задача → Redis / worker
                                              ↓
                          снимок → прогноз → рекомендации
                                              ↓
                      черновик → правка → утверждение → CSV/XLSX

AI-помощник → разрешённые бизнес-сервисы → сводки / предложение действия
СлойТехнологии и ответственность
ИнтерфейсReact, TypeScript, Vite; модульные страницы и общие компоненты.
APIFastAPI, Pydantic; авторизация, контракты, бизнес-сервисы.
Расчёт и импортPython, Decimal, openpyxl; алгоритм и обработка XLSX без внешней модели.
ХранилищеPostgreSQL 18, SQLAlchemy, Alembic; данные, снимки, заказы, диалоги.
Фоновые задачиRedis, arq, worker; состояние задач сохраняется в PostgreSQL.
AIАдаптеры провайдеров, серверная проверка планов и разрешённых инструментов.
ЗапускDocker Compose; зависимости зафиксированы в uv.lock и package-lock.json.

Предметные модули: backend/app/Domains/{DataImports,Integrations1C,Catalogs,Inventory,Replenishment,Procurement,Ai}. Контроллеры вызывают сервисы, SQL находится в репозиториях. Frontend: frontend/src/modules, переиспользуемые элементы — frontend/src/shared. Миграции — backend/migrations.

Для проверки API откройте Swagger, выполните POST /api/v1/auth/login с почтой и паролем, скопируйте access_token и вставьте его в Authorize. Рабочие endpoints требуют Bearer-сессию и права роли. Локальный администратор получает полный набор прав; purchaser — роль менеджера закупок.

Основные группы API: /api/v1/catalogs, /api/v1/imports, /api/v1/integrations/1c, /api/v1/inventory, /api/v1/replenishment/runs, /api/v1/recommendations, /api/v1/orders. Точные тела запросов и ответы генерируются из кода в OpenAPI.

Пароли хешируются Argon2; JWT ссылается на серверную сессию. Права читаются из БД. После выхода сессия удаляется. Данные закупок общие для одной компании; отдельная многокомпанейная изоляция не реализована.

Проверки

Команды выполняются после make dev. Тесты ниже используют синтетические данные; основные тесты алгоритма не обращаются к LLM.

Алгоритм, API и заказы

./scripts/dev.sh exec -T api pytest -q \
  tests/test_replenishment_engine.py \
  tests/test_replenishment_api.py \
  tests/test_replenishment.py \
  tests/test_procurement.py \
  tests/test_recommendation_explanation.py \
  tests/test_product_quality_contract.py

Здесь проверяются влияние входов, сезонность, рост, stockout, разовые/регулярные крупные продажи, сроки поступления, арифметика объяснения, права, группировка заказов, версии, утверждение и экспорт.

Сквозной сценарий с PostgreSQL

./scripts/dev.sh exec -T -e RUN_DB_TESTS=1 api pytest -q \
  tests/test_purchasing_database.py \
  tests/test_procurement_database.py

Проверяются обмен данными → расчёт → рекомендации → заказ → экспорт, повторы и сохранение. Это интеграционные тесты API и БД, а не автоматизированное прохождение браузера. Запускайте их на локальной тестовой базе, последовательно; они создают тестовые записи и выполняют предусмотренный откат/очистку. Без RUN_DB_TESTS=1 тесты БД пропускаются.

AI и полный набор

./scripts/dev.sh exec -T api pytest -q tests/test_agent_engine.py tests/test_agent_knowledge.py tests/test_agent_conversations.py
./scripts/dev.sh exec -T api pytest -q
./scripts/dev.sh exec -T api ruff check .
./scripts/dev.sh exec -T api ruff format --check .
./scripts/dev.sh exec -T api alembic check
./scripts/dev.sh exec -T frontend npm run build

Тесты движка AI используют подменные ответы провайдера. Для проверки конкретной внешней модели требуется настроенный ключ и ручной запрос в чат. Успешная сборка и тесты не заменяют приёмку прогноза на данных партнёра.

Настройки и сопровождение

.env.local и рабочие секреты исключены из Git; шаблон — .env.local.example.

НастройкаДля чего
SECURITY_JWT_SECRETПодпись сессий; генерируется скриптом при первом создании env.
SEED_ADMIN_EMAIL, SEED_ADMIN_PASSWORDУчётная запись первого администратора; пароль минимум 12 символов.
FRONTEND_PORT, API_PORTЛокальные порты интерфейса и API.
POSTGRES_DB, POSTGRES_USER, POSTGRES_PASSWORDБаза локального окружения. Изменение env не перенастраивает существующий volume.
LLM_PROVIDER, LLM_MODEL, ключ провайдераНеобязательные настройки AI-помощника.
ONEC_ALLOWED_ORIGINS, ONEC_AUTH_EKTРазрешённые адреса и серверная авторизация REST-отчётов 1С.
make dev-ps       # состояние контейнеров
make dev-logs     # все логи; Ctrl+C прекращает просмотр
make worker-logs  # фоновые расчёты и импорт
make dev-down    # остановка с сохранением данных
make dev         # повторный запуск
make dev-env     # применить изменённый .env.local
make dev-build   # пересобрать после изменения образов / Python-зависимостей

Данные находятся в Docker volumes postgres_data и uploads_data (с префиксом Compose-проекта). Обычная остановка их сохраняет; down -v удаляет volumes, поэтому для завершения демо используйте make dev-down.

Исходники подключены к контейнерам: Vite HMR и перезапуск Python сохраняют быструю разработку. После получения новых миграций:

./scripts/dev.sh exec -T api alembic upgrade head

Если изменился список задач worker, перезапустите его: ./scripts/dev.sh restart worker. После изменений Python-зависимостей требуется пересборка; frontend устанавливает зависимости из lock-файла при старте.

В проекте также есть PWA-оболочка и необязательный Telegram-бот (make dev-bot, требуется BOT_TOKEN; команды /start, /status). Они не нужны для проверки закупочного сценария. Загрузка учётных данных, расчёт и сохранение заказов требуют соединения с API.

Если что-то не работает

СимптомЧто проверить и сделать
Приложение ещё не открылось после первого запускаmake dev-ps, затем ./scripts/dev.sh logs --tail=100 migrate api frontend. Дождитесь установки зависимостей и готовности API.
Не удаётся войтиВыполнен ли make seed; верны ли почта и пароль. Замените предварительно заполненный demo-пароль на пароль администратора.
Вход возвращает 503В старом .env.local может быть пустой JWT-секрет. Создайте случайное значение, например openssl rand -hex 32, внесите его в файл и выполните make dev-env. Не публикуйте значение.
Изменение env не подействовалоВыполните make dev-env; обычный restart не обновляет переменные контейнера. Проверьте, не перекрывает ли их окружение shell.
Нет склада и рекомендацийВыполните сидер app.seed.replenishment, выберите «Алматы (демо)» и дату 2026-09-22.
Расчёт долго остаётся в очередиПроверьте worker и redis через make dev-ps, затем ./scripts/dev.sh logs --tail=100 worker.
Нельзя создать заказ по товаруОткройте причины блокировки. Нужны готовые данные, положительная потребность и рекомендация, ещё не включённая в заказ.
Все товары из исходных Excel заблокированыЭто ожидаемо без подтверждённых остатков и условий. Для полного демо используйте синтетический источник; для реального — дополните недостающие сведения.
Конфликт версии при изменении заказаОбновите документ, проверьте чужие изменения и повторите действие с актуальной версией.
Помощник не отвечаетПроверьте ключ, выбранную модель и доступ к провайдеру; после изменения env примените настройки.
Порт уже занятИзмените FRONTEND_PORT/API_PORT в env. При смене порта frontend также обновите CORS_ORIGINS; примените настройки и открывайте новый адрес.

Ограничения и следующий этап

Это локально воспроизводимый MVP с сохраняемым закупочным сценарием, синтетической проверкой требований и адаптером переданных Excel-книг.

  • Нет подтверждённой промышленной связи с реальной базой 1С партнёра. Формат экспорта и обработку документов нужно согласовать и проверить на её конфигурации.
  • Нет измеренной точности прогноза или подтверждённого процента экономии. Следующий этап — историческая проверка на согласованных данных и сравнение с текущим расчётом менеджера.
  • Клиентские выбросы, точный stockout и срок поставки нельзя полностью проверить на исходных книгах без дополнительных сведений.
  • AI-помощник зависит от внешнего провайдера; качество конкретной модели требует отдельной проверки.
  • Интерфейс справочников поддерживает просмотр и поиск; изменение данных выполняется через импорт/API.
  • В репозитории есть вспомогательные и незавершённые экраны каркаса. В объём решения входят страницы, описанные в сценарии выше.
  • Публичный стенд в этом README не заявлен. Текущий Compose предназначен для локальной разработки: для размещения нужны production-конфигурация, HTTPS, собственные секреты и резервное копирование. .env.production.example сам по себе не создаёт production-развёртывание.

Документация

МатериалСодержание
Данные и обменНормализованные структуры, источники, импорт и версии.
РасчётМетодика и серверный API.
ЗаказыЧерновики, утверждение, экспорт и подтверждение 1С.
Пакетный импортИсходные Excel-книги, сопоставление и готовность товаров.
REST-отчёты 1СНастройка подключений и ограничения.
AI-помощникИнструменты, разрешения, контекст и проверка.
Карта данных партнёраСостав файлов и пробелы данных.
Направление проектаГраницы продукта и принятые решения.
Передача командеВход в разработку и рабочие правила.
Звёзды
⭐ 0
Форки
0
Язык
Python
Последний push
в прошлом месяце
Коммиты
137
Авторы
4
Файлы
633
Ветки
2

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

Stanislav Zhukov 76s.ermolaev 28panda 17s.ermolaev 16

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

  • 2026-09-23 17:55Expose mock-backed deliveries page in navigations.ermolaev
  • 2026-09-23 17:52Merge remote-tracking branch 'origin/main's.ermolaev
  • 2026-09-23 17:52Add manual catalog CRUD and verified supply simulations.ermolaev
  • 2026-09-23 17:51Align assistant toolbar with header on tablet widthsStanislav Zhukov
  • 2026-09-23 17:49Keep assistant orb in active mobile navigationStanislav Zhukov
  • 2026-09-23 17:47Resize assistant orb rings and move access noticeStanislav Zhukov
  • 2026-09-23 17:43Place assistant conversation title after toolbar actionsStanislav Zhukov
  • 2026-09-23 17:39Translate integration report previewStanislav Zhukov
Все коммиты (137)
  • 2026-09-23 17:38Translate import panel detailsStanislav Zhukov
  • 2026-09-23 17:38Add spacing around assistant access noticeStanislav Zhukov
  • 2026-09-23 17:36Finish translated assistant and import detailsStanislav Zhukov
  • 2026-09-23 17:36Merge branch 'main' of https://github.com/BAITC-Hacks/hack-34b30c3c-ozlteamStanislav Zhukov
  • 2026-09-23 17:36Merge remote-tracking branch 'origin/main'panda
  • 2026-09-23 17:36Fix logout redirect and remove misleading login passwordpanda
  • 2026-09-23 17:36Finish translated data source import formStanislav Zhukov
  • 2026-09-23 17:35Restore translated UI changes and refine assistant controlsStanislav Zhukov
  • 2026-09-23 17:35Translate catalogs search imports and integrationsStanislav Zhukov
  • 2026-09-23 17:35Translate dashboard fleet notes and report editorStanislav Zhukov
  • 2026-09-23 17:34Translate assistant answer controlsStanislav Zhukov
  • 2026-09-23 17:34Handle order lines without recommendationsStanislav Zhukov
  • 2026-09-23 17:33Merge branch 'main' of https://github.com/BAITC-Hacks/hack-34b30c3c-ozlteamStanislav Zhukov
  • 2026-09-23 17:33Merge remote-tracking branch 'origin/main'panda
  • 2026-09-23 17:32Translate procurement screens into RU KK ENStanislav Zhukov
  • 2026-09-23 17:32Merge origin/main and preserve draft and document workflowspanda
  • 2026-09-23 17:31Match assistant toolbar hover to header actionsStanislav Zhukov
  • 2026-09-23 17:31Add supplier draft tools and readable procurement documentspanda
  • 2026-09-23 17:31Add RU KK EN language switching to app shellStanislav Zhukov
  • 2026-09-23 17:28Space assistant tool check detailsStanislav Zhukov
  • 2026-09-23 17:28Merge branch 'main' of https://github.com/BAITC-Hacks/hack-34b30c3c-ozlteamStanislav Zhukov
  • 2026-09-23 17:27Keep failed assistant requests in chat and clarify tool checksStanislav Zhukov
  • 2026-09-23 17:26Merge remote-tracking branch 'origin/main's.ermolaev
  • 2026-09-23 17:26fix(procurement): show readable export fieldss.ermolaev
  • 2026-09-23 17:21Align assistant controls and keep welcome clear of noticesStanislav Zhukov
  • 2026-09-23 17:19Merge branch 'main' of https://github.com/BAITC-Hacks/hack-34b30c3c-ozlteamStanislav Zhukov
  • 2026-09-23 17:19Stack assistant errors in one compact notice slotStanislav Zhukov
  • 2026-09-23 17:17Tighten assistant context dialog spacingStanislav Zhukov
  • 2026-09-23 17:17Merge remote-tracking branch 'origin/main's.ermolaev
  • 2026-09-23 17:16fix(assistant): restore pending question and align chat below headers.ermolaev
  • 2026-09-23 17:15Add responsive breathing room around assistant orbStanislav Zhukov
  • 2026-09-23 17:15Merge branch 'main' of https://github.com/BAITC-Hacks/hack-34b30c3c-ozlteamStanislav Zhukov
  • 2026-09-23 17:14Align assistant dialog controls and prevent tooltip clippingStanislav Zhukov
  • 2026-09-23 17:14Merge remote-tracking branch 'origin/main's.ermolaev
  • 2026-09-23 17:14docs: move criteria mapping out of project READMEs.ermolaev
  • 2026-09-23 17:13Merge branch 'main' of https://github.com/BAITC-Hacks/hack-34b30c3c-ozlteamStanislav Zhukov
  • 2026-09-23 17:12Merge assistant dialogs with centered workspace layoutStanislav Zhukov
  • 2026-09-23 17:10fix(assistant): show submitted question immediately while awaiting replys.ermolaev
  • 2026-09-23 17:08docs: rewrite README for hackathon review and reproducible demos.ermolaev
  • 2026-09-23 17:08Polish assistant workspace and panelStanislav Zhukov
  • 2026-09-23 17:07fix(assistant): clear composer on submit and restore on failures.ermolaev
  • 2026-09-23 17:02fix(assistant): show planet only in empty chat and off-page launchers.ermolaev
  • 2026-09-23 17:01Merge remote-tracking branch 'origin/main's.ermolaev
  • 2026-09-23 17:01fix(assistant): keep chat primary and move controls into compact dialogss.ermolaev
  • 2026-09-23 16:59Merge branch 'main' of https://github.com/BAITC-Hacks/hack-34b30c3c-ozlteamStanislav Zhukov
  • 2026-09-23 16:58Use corporate procurement brand and unified iconStanislav Zhukov
  • 2026-09-23 16:57Polish select labels and toolbar hover statesStanislav Zhukov
  • 2026-09-23 16:52Merge remote-tracking branch 'origin/main's.ermolaev
  • 2026-09-23 16:52Simplify 1C report setup and establish minimalist product principless.ermolaev
  • 2026-09-23 16:50Merge branch 'main' of https://github.com/BAITC-Hacks/hack-34b30c3c-ozlteamStanislav Zhukov
  • 2026-09-23 16:48Rename product to План закупокStanislav Zhukov
  • 2026-09-23 16:46feat(assistant): preserve conversation drafts and reveal new answers smoothlys.ermolaev
  • 2026-09-23 16:42Merge remote-tracking branch 'origin/main'panda
  • 2026-09-23 16:42Avoid image rebuilds for routine development and env updatespanda
  • 2026-09-23 16:40Merge remote-tracking branch 'origin/main's.ermolaev
  • 2026-09-23 16:40Document Apple-inspired simplicity as product directions.ermolaev
  • 2026-09-23 16:39Merge branch 'main' of https://github.com/BAITC-Hacks/hack-34b30c3c-ozlteamStanislav Zhukov
  • 2026-09-23 16:38Explain global search matchesStanislav Zhukov
  • 2026-09-23 16:37Style native select pickers across frontendStanislav Zhukov
  • 2026-09-23 16:37Merge team updates and preserve persisted assistant in floating panels.ermolaev
  • 2026-09-23 16:35Add purchasing agent coordinator, scoped helpers and confirmed toolss.ermolaev
  • 2026-09-23 16:34Explain replenishment recommendations in plain languagepanda
  • 2026-09-23 16:32Merge remote-tracking branch 'origin/main'panda
  • 2026-09-23 16:31Add reproducible Excel test data seederpanda
  • 2026-09-23 16:30Align assistant panel composer controlsStanislav Zhukov
  • 2026-09-23 16:28Move desktop assistant to floating orb and align chat composerStanislav Zhukov
  • 2026-09-23 16:27Confirm logout and remember sidebar modeStanislav Zhukov
  • 2026-09-23 16:24Merge branch 'main' of https://github.com/BAITC-Hacks/hack-34b30c3c-ozlteamStanislav Zhukov
  • 2026-09-23 16:24Keep sidebar navigation as compact icon railStanislav Zhukov
  • 2026-09-23 16:20Shorten assistant sidebar labelStanislav Zhukov
  • 2026-09-23 16:20Restore readable mobile assistant hint above composerStanislav Zhukov
  • 2026-09-23 16:19Merge remote-tracking branch 'origin/main's.ermolaev
  • 2026-09-23 16:19Add configurable 1C REST report imports and field mapping UIs.ermolaev
  • 2026-09-23 16:13Hide keyboard hint under mobile assistant navigationStanislav Zhukov
  • 2026-09-23 16:12Remove assistant heading from chat viewStanislav Zhukov
  • 2026-09-23 16:11Show assistant backdrop only on welcome screenStanislav Zhukov
  • 2026-09-23 16:09Keep assistant chat anchored and fix frontend list stateStanislav Zhukov
  • 2026-09-23 16:08Merge branch 'main' of https://github.com/BAITC-Hacks/hack-34b30c3c-ozlteamStanislav Zhukov
  • 2026-09-23 16:07Add optional assistant backdrop and expanding composerStanislav Zhukov
  • 2026-09-23 16:07Merge remote-tracking branch 'origin/main'panda
  • 2026-09-23 16:05Merge remote-tracking branch 'origin/main'panda
  • 2026-09-23 16:05Reduce assistant orb in mobile navigationStanislav Zhukov
  • 2026-09-23 16:04Lighten assistant orb and use temporary assistant nameStanislav Zhukov
  • 2026-09-23 16:02Build animated assistant orb and refresh assistant pageStanislav Zhukov
  • 2026-09-23 16:02Add durable 1C workbook packages and supplier product catalogspanda
  • 2026-09-23 15:56Give Nova assistant a dimensional mobile orbStanislav Zhukov
  • 2026-09-23 15:54Complete frontend workflow and mobile assistant navigationStanislav Zhukov
  • 2026-09-23 15:46Merge branch 'main' of https://github.com/BAITC-Hacks/hack-34b30c3c-ozlteamStanislav Zhukov
  • 2026-09-23 15:45Label global search on narrow screensStanislav Zhukov
  • 2026-09-23 15:44Align AI assistant with replenishment workflows.ermolaev
  • 2026-09-23 15:44Complete frontend data views and embed assistant chatStanislav Zhukov
  • 2026-09-23 15:25Prevent duplicate recommendation orders and fix data navigationStanislav Zhukov
  • 2026-09-23 15:21Complete supplier order review workflowStanislav Zhukov
  • 2026-09-23 15:21Specify actionable frontend tasks and contract dependenciess.ermolaev
  • 2026-09-23 15:15Merge remote-tracking branch 'origin/main's.ermolaev
  • 2026-09-23 15:15Merge branch 'main' of https://github.com/BAITC-Hacks/hack-34b30c3c-ozlteamStanislav Zhukov
  • 2026-09-23 15:15Remove duplicate partner data archivess.ermolaev
  • 2026-09-23 15:14Merge latest main and preserve project documentsStanislav Zhukov
  • 2026-09-23 15:12Finalize team context and project alignment guidances.ermolaev
  • 2026-09-23 15:11Fix purchasing UI overflow and data view racesStanislav Zhukov
  • 2026-09-23 15:09Merge remote-tracking branch 'origin/main's.ermolaev
  • 2026-09-23 15:09Clarify replenishment data limitationss.ermolaev
  • 2026-09-23 15:08Remove obsolete logistics materialss.ermolaev
  • 2026-09-23 15:07Clarify replenishment project directions.ermolaev
  • 2026-09-23 15:04Align replenishment UI with persisted workflows.ermolaev
  • 2026-09-23 15:03Polish data source file pickerStanislav Zhukov
  • 2026-09-23 15:00Add purchasing overview, catalogs and recommendation detailStanislav Zhukov
  • 2026-09-23 14:56Make header actions and quick panels functionalStanislav Zhukov
  • 2026-09-23 14:49Fix login redirect loop after expired sessionStanislav Zhukov
  • 2026-09-23 14:48Fix order drafts and replenishment paginationStanislav Zhukov
  • 2026-09-23 14:42Add data import and inventory pagesStanislav Zhukov
  • 2026-09-23 14:37docs: align process status with merged procurement screenss.ermolaev
  • 2026-09-23 14:37Merge remote-tracking branch 'origin/main's.ermolaev
  • 2026-09-23 14:36docs: map partner reports to replenishment data flows.ermolaev
  • 2026-09-23 14:36Merge branch 'main' of https://github.com/BAITC-Hacks/hack-34b30c3c-ozlteamStanislav Zhukov
  • 2026-09-23 14:35Build replenishment and supplier order pagesStanislav Zhukov
  • 2026-09-23 14:30docs: add illustrated replenishment process diagrams.ermolaev
  • 2026-09-23 14:22Merge remote-tracking branch 'origin/main'panda
  • 2026-09-23 14:17feat: implement replenishment backend and 1C exchangepanda
  • 2026-09-23 14:11Document replenishment goods and data flowss.ermolaev
  • 2026-09-23 14:01Allow verified auto-push in team Git workflows.ermolaev
  • 2026-09-23 13:59Merge remote-tracking branch 'origin/main's.ermolaev
  • 2026-09-23 13:59Add team Git synchronization skills.ermolaev
  • 2026-09-23 13:58Merge branch 'main' of https://github.com/BAITC-Hacks/hack-34b30c3c-ozlteamStanislav Zhukov
  • 2026-09-23 13:57fixStanislav Zhukov
  • 2026-09-23 13:54Merge remote-tracking branch 'origin/main's.ermolaev
  • 2026-09-23 13:52Build replenishment MVP and document case handoffs.ermolaev
  • 2026-09-23 13:39Add procurement navigation and disable legacy sectionspanda
  • 2026-09-23 13:09Initial commitpanda
Структура репозитория (633 файлов)
.agents/skills/apple-design/SKILL.md
.agents/skills/apple-design/SOURCE.md
.agents/skills/backend-domains/SKILL.md
.agents/skills/card-loading-skeletons/SKILL.md
.agents/skills/contextual-back-navigation/SKILL.md
.agents/skills/dependency-awareness/SKILL.md
.agents/skills/frontend-modules/SKILL.md
.agents/skills/git-publish/SKILL.md
.agents/skills/git-team-workflow/SKILL.md
.agents/skills/project-alignment/SKILL.md
.agents/skills/project-alignment/agents/openai.yaml
.agents/skills/project-design/SKILL.md
.agents/skills/pwa-delivery/SKILL.md
.agents/skills/surgical-patches/SKILL.md
.agents/skills/swagger-openapi/SKILL.md
.agents/skills/task-delegation/SKILL.md
.agents/skills/telegram-bot/SKILL.md
.env.example
.env.local.example
.env.production.example
.gitignore
.lavish/ai-construction.html
.lavish/apple.html
.lavish/blocks-4.html
.lavish/cards-10.html
.lavish/crm-10.html
.lavish/elera/app.js
.lavish/elera/index.html
.lavish/elera/shell.css
.lavish/form-agent.html
.lavish/kompozicii.html
.lavish/koncepty-10.html
.lavish/napravleniya-2.html
.lavish/napravleniya.html
.lavish/notes-screen-variants.html
.lavish/page-elevated.html
AGENTS.md
CONTEXT.md
CONTEXT_HISTORY.md
Makefile
PROJECT_DIRECTION.md
README.md
TrackLogic/HackAlem AI_ Автоматизация формирования заказов поставщикам.docx.pdf
TrackLogic/IEK/MOQ  ИЭК.xlsx
TrackLogic/IEK/Динамика продаж_2025-2026.xlsx
TrackLogic/IEK/Ежемесячные остатки продукции за последние 2 года  ИЭК.xlsx
TrackLogic/IEK/Ежемесячные продажи в количественном выражении за последние 2 года.xlsx
TrackLogic/IEK/Путь ИЭК 22.09.2026.xlsx
TrackLogic/IEK/Сезонность ИЭК.xlsx
TrackLogic/Systeme electric/MOQ SystemElectric.xlsx
TrackLogic/Systeme electric/Динамика продаж_Syseme Electric_2025-2026.xlsx
TrackLogic/Systeme electric/Ежемесячные остатки SystemElectric 2024-2026.xlsx
TrackLogic/Systeme electric/Ежемесячные продажи в кол-м выражении SystemElectric 2024-2026.xlsx
TrackLogic/Systeme electric/Сезонность SystemElectric 2024-2026.xlsx
TrackLogic/Systeme electric/Товар в пути_SystemElectric на 22.09.2026.xlsx
TrackLogic/hackalem_ai_context.txt
backend/.dockerignore
backend/Dockerfile
backend/alembic.ini
backend/app/Domains/Ai/DTO/__init__.py
backend/app/Domains/Ai/DTO/agent_tools.py
backend/app/Domains/Ai/DTO/chat.py
backend/app/Domains/Ai/DTO/conversation.py
backend/app/Domains/Ai/__init__.py
backend/app/Domains/Ai/adapters/__init__.py
backend/app/Domains/Ai/adapters/anthropic_provider.py
backend/app/Domains/Ai/adapters/business_tools.py
backend/app/Domains/Ai/adapters/compatible_provider.py
backend/app/Domains/Ai/adapters/images.py
backend/app/Domains/Ai/adapters/nvidia_provider.py
backend/app/Domains/Ai/adapters/openai_provider.py
backend/app/Domains/Ai/contracts.py
backend/app/Domains/Ai/controllers/__init__.py
backend/app/Domains/Ai/controllers/conversations.py
backend/app/Domains/Ai/controllers/http.py
backend/app/Domains/Ai/dependencies.py
backend/app/Domains/Ai/models/conversation.py
backend/app/Domains/Ai/repositories/conversation_repository.py
backend/app/Domains/Ai/resources/__init__.py
backend/app/Domains/Ai/resources/chat.py
backend/app/Domains/Ai/resources/conversation.py
backend/app/Domains/Ai/services/__init__.py
backend/app/Domains/Ai/services/agent_engine.py
backend/app/Domains/Ai/services/assistant_service.py
backend/app/Domains/Ai/services/conversation_service.py
backend/app/Domains/Ai/services/knowledge_service.py
backend/app/Domains/Ai/services/supplier_matching.py
backend/app/Domains/Ai/services/test_order_context.py
backend/app/Domains/Catalogs/DTO/manual.py
backend/app/Domains/Catalogs/controllers/http.py
backend/app/Domains/Catalogs/models/__init__.py
backend/app/Domains/Catalogs/repositories/catalog_repository.py
backend/app/Domains/Catalogs/resources/catalog.py
backend/app/Domains/Catalogs/services/catalog_service.py
backend/app/Domains/DataImports/DTO/packages.py
backend/app/Domains/DataImports/DTO/rows.py
backend/app/Domains/DataImports/adapters/partner_workbooks.py
backend/app/Domains/DataImports/controllers/http.py
backend/app/Domains/DataImports/controllers/packages.py
backend/app/Domains/DataImports/models/__init__.py
backend/app/Domains/DataImports/models/packages.py
backend/app/Domains/DataImports/repositories/data_repository.py
backend/app/Domains/DataImports/repositories/package_repository.py
backend/app/Domains/DataImports/resources/imports.py
backend/app/Domains/DataImports/resources/packages.py
backend/app/Domains/DataImports/services/exchange_service.py
backend/app/Domains/DataImports/services/import_service.py
backend/app/Domains/DataImports/services/package_rules.py
backend/app/Domains/DataImports/services/package_service.py
backend/app/Domains/DataImports/services/parser.py
backend/app/Domains/DataImports/tasks.py
backend/app/Domains/Files/DTO/__init__.py
backend/app/Domains/Files/DTO/file.py
backend/app/Domains/Files/__init__.py
backend/app/Domains/Files/adapters/__init__.py
backend/app/Domains/Files/adapters/local_storage.py
backend/app/Domains/Files/adapters/previews.py
backend/app/Domains/Files/contracts.py
backend/app/Domains/Files/controllers/__init__.py
backend/app/Domains/Files/controllers/http.py
backend/app/Domains/Files/dependencies.py
backend/app/Domains/Files/models/__init__.py
backend/app/Domains/Files/models/file.py
backend/app/Domains/Files/repositories/__init__.py
backend/app/Domains/Files/repositories/file_repository.py
backend/app/Domains/Files/resources/__init__.py
backend/app/Domains/Files/resources/file.py
backend/app/Domains/Files/services/__init__.py
backend/app/Domains/Files/services/file_service.py
backend/app/Domains/Files/services/file_types.py
backend/app/Domains/Integrations1C/DTO/exchange.py
backend/app/Domains/Integrations1C/DTO/reports.py
backend/app/Domains/Integrations1C/controllers/http.py
backend/app/Domains/Integrations1C/controllers/reports.py
backend/app/Domains/Integrations1C/models/__init__.py
backend/app/Domains/Integrations1C/repositories/report_repository.py
backend/app/Domains/Integrations1C/resources/exchange.py
backend/app/Domains/Integrations1C/resources/reports.py
backend/app/Domains/Integrations1C/services/integration_service.py
backend/app/Domains/Integrations1C/services/report_service.py
backend/app/Domains/Inventory/business_time.py
backend/app/Domains/Inventory/controllers/http.py
backend/app/Domains/Inventory/models/__init__.py
backend/app/Domains/Inventory/repositories/inventory_repository.py
backend/app/Domains/Inventory/resources/inventory.py
backend/app/Domains/Inventory/services/inventory_service.py
backend/app/Domains/Inventory/services/sales_document_export.py
backend/app/Domains/Jobs/__init__.py
backend/app/Domains/Jobs/adapters/__init__.py
backend/app/Domains/Jobs/adapters/arq_queue.py
backend/app/Domains/Jobs/adapters/files_documents.py
backend/app/Domains/Jobs/contracts.py
backend/app/Domains/Jobs/controllers/__init__.py
backend/app/Domains/Jobs/controllers/http.py
backend/app/Domains/Jobs/dependencies.py
backend/app/Domains/Jobs/dispatch.py
backend/app/Domains/Jobs/models/__init__.py
backend/app/Domains/Jobs/models/job.py
backend/app/Domains/Jobs/repositories/__init__.py
backend/app/Domains/Jobs/repositories/job_repository.py
backend/app/Domains/Jobs/resources/__init__.py
backend/app/Domains/Jobs/resources/job.py
backend/app/Domains/Jobs/services/__init__.py
backend/app/Domains/Jobs/services/job_service.py
backend/app/Domains/Jobs/services/job_stream.py
backend/app/Domains/Jobs/tasks.py
backend/app/Domains/Jobs/worker.py
backend/app/Domains/Notes/DTO/__init__.py
backend/app/Domains/Notes/DTO/note.py
backend/app/Domains/Notes/__init__.py
backend/app/Domains/Notes/controllers/__init__.py
backend/app/Domains/Notes/controllers/http.py
backend/app/Domains/Notes/dependencies.py
backend/app/Domains/Notes/models/__init__.py
backend/app/Domains/Notes/models/note.py
backend/app/Domains/Notes/repositories/__init__.py
backend/app/Domains/Notes/repositories/note_repository.py
backend/app/Domains/Notes/resources/__init__.py
backend/app/Domains/Notes/resources/note.py
backend/app/Domains/Notes/services/__init__.py
backend/app/Domains/Notes/services/note_service.py
backend/app/Domains/Procurement/DTO/__init__.py
backend/app/Domains/Procurement/DTO/order.py
backend/app/Domains/Procurement/__init__.py
backend/app/Domains/Procurement/adapters/__init__.py
backend/app/Domains/Procurement/adapters/order_document.py
backend/app/Domains/Procurement/adapters/source.py
backend/app/Domains/Procurement/contracts.py
backend/app/Domains/Procurement/controllers/__init__.py
backend/app/Domains/Procurement/controllers/http.py
backend/app/Domains/Procurement/dependencies.py
backend/app/Domains/Procurement/models/__init__.py
backend/app/Domains/Procurement/models/order.py
backend/app/Domains/Procurement/repositories/__init__.py
backend/app/Domains/Procurement/repositories/order_repository.py
backend/app/Domains/Procurement/resources/__init__.py
backend/app/Domains/Procurement/resources/order.py
backend/app/Domains/Procurement/services/__init__.py
backend/app/Domains/Procurement/services/order_service.py
backend/app/Domains/Replenishment/DTO/__init__.py
backend/app/Domains/Replenishment/DTO/calculation.py
backend/app/Domains/Replenishment/__init__.py
backend/app/Domains/Replenishment/adapters/__init__.py
backend/app/Domains/Replenishment/adapters/xlsx.py
backend/app/Domains/Replenishment/controllers/__init__.py
backend/app/Domains/Replenishment/controllers/http.py
backend/app/Domains/Replenishment/controllers/preview.py
backend/app/Domains/Replenishment/dependencies.py
backend/app/Domains/Replenishment/models/__init__.py
backend/app/Domains/Replenishment/models/calculation.py
backend/app/Domains/Replenishment/repositories/__init__.py
backend/app/Domains/Replenishment/repositories/calculation_repository.py
backend/app/Domains/Replenishment/resources/__init__.py
backend/app/Domains/Replenishment/resources/calculation.py
backend/app/Domains/Replenishment/services/__init__.py
backend/app/Domains/Replenishment/services/calculation.py
backend/app/Domains/Replenishment/services/demo.py
backend/app/Domains/Replenishment/services/engine.py
backend/app/Domains/Replenishment/services/explanation.py
backend/app/Domains/Replenishment/services/replenishment_service.py
backend/app/Domains/Replenishment/tasks.py
backend/app/Domains/Security/DTO/__init__.py
backend/app/Domains/Security/DTO/auth.py
backend/app/Domains/Security/__init__.py
backend/app/Domains/Security/adapters/__init__.py
backend/app/Domains/Security/adapters/jwt.py
backend/app/Domains/Security/adapters/passwords.py
backend/app/Domains/Security/contracts.py
backend/app/Domains/Security/controllers/__init__.py
backend/app/Domains/Security/controllers/http.py
backend/app/Domains/Security/dependencies.py
backend/app/Domains/Security/models/__init__.py
backend/app/Domains/Security/models/session.py
backend/app/Domains/Security/repositories/__init__.py
backend/app/Domains/Security/repositories/session_repository.py
backend/app/Domains/Security/resources/__init__.py
backend/app/Domains/Security/resources/auth.py
backend/app/Domains/Security/services/__init__.py
backend/app/Domains/Security/services/security_service.py
backend/app/Domains/Users/DTO/__init__.py
backend/app/Domains/Users/DTO/user.py
backend/app/Domains/Users/__init__.py
backend/app/Domains/Users/dependencies.py
backend/app/Domains/Users/models/__init__.py
backend/app/Domains/Users/models/user.py
backend/app/Domains/Users/repositories/__init__.py
backend/app/Domains/Users/repositories/user_repository.py
backend/app/Domains/Users/services/__init__.py
backend/app/Domains/Users/services/user_service.py
backend/app/Domains/__init__.py
backend/app/__init__.py
backend/app/core/__init__.py
backend/app/core/access.py
backend/app/core/config.py
backend/app/core/database.py
backend/app/core/errors.py
backend/app/core/security_middleware.py
backend/app/main.py
backend/app/models.py
backend/app/seed/__init__.py
backend/app/seed/data/partner_workbooks.json
backend/app/seed/mock.py
backend/app/seed/partner_workbooks.py
backend/app/seed/replenishment.py
backend/app/seed/runner.py
backend/app/seed/seed.py
backend/migrations/env.py
backend/migrations/script.py.mako
backend/migrations/versions/0001_notes_vector.py
backend/migrations/versions/5eeb25201444_add_saved_1c_rest_report_profiles.py
backend/migrations/versions/75bdae661182_persist_agent_conversations_messages_.py
backend/migrations/versions/80569e449f7a_add_user_profile_and_security_sessions.py
backend/migrations/versions/9860745f4be3_add_replenishment_procurement_and_1c_.py
backend/migrations/versions/aa936937a028_allow_source_cancellations_and_rejected_.py
backend/migrations/versions/ad080ada50ca_add_users_roles_permissions.py
backend/migrations/versions/b735e3320afe_files_and_jobs.py
backend/migrations/versions/c381c7a048dd_manual_supplier_drafts_and_soft_delete.py
backend/migrations/versions/e27cb30a025e_add_durable_partner_workbook_import_.py
backend/pyproject.toml
backend/tests/test_agent_business_database.py
backend/tests/test_agent_conversations.py
backend/tests/test_agent_engine.py
backend/tests/test_agent_knowledge.py
backend/tests/test_agent_supplier_drafts.py
backend/tests/test_agent_test_context.py
backend/tests/test_agent_test_drafts.py
backend/tests/test_ai_providers.py
backend/tests/test_catalog_manual.py
backend/tests/test_catalog_manual_database.py
backend/tests/test_data_database.py
backend/tests/test_data_imports.py
backend/tests/test_database.py
backend/tests/test_files.py
backend/tests/test_import_packages.py
backend/tests/test_import_packages_database.py
backend/tests/test_inventory_business_dates.py
backend/tests/test_inventory_document_export.py
backend/tests/test_job_outbox_database.py
backend/tests/test_jobs.py
backend/tests/test_notes.py
backend/tests/test_order_documents.py
backend/tests/test_partner_seed.py
backend/tests/test_partner_workbooks.py
backend/tests/test_procurement.py
backend/tests/test_procurement_database.py
backend/tests/test_procurement_manual_database.py
backend/tests/test_product_quality_contract.py
backend/tests/test_purchasing_contract.py
backend/tests/test_purchasing_database.py
backend/tests/test_recommendation_explanation.py
backend/tests/test_replenishment.py
backend/tests/test_replenishment_api.py
backend/tests/test_replenishment_engine.py
backend/tests/test_rest_reports.py
backend/tests/test_rest_reports_database.py
backend/tests/test_security.py
backend/tests/test_security_database.py
backend/tests/test_security_headers.py
backend/tests/test_seed.py
backend/tests/test_supplier_catalog_filters.py
backend/tests/test_users.py
backend/tests/test_users_database.py
backend/uv.lock
bot/.dockerignore
bot/Dockerfile
bot/app/__init__.py
bot/app/config.py
bot/app/handlers/__init__.py
bot/app/handlers/common.py
bot/app/main.py
bot/app/services/__init__.py
bot/app/services/api.py
bot/pyproject.toml
bot/uv.lock
compose.yaml
docs/TEAM_HANDOFF.md
docs/ai-agents.md
docs/backend-data.md
docs/backend-procurement.md
docs/backend-replenishment.md
docs/catalog-manual-crud.md
docs/design-agent-handoff.md
docs/design-system.md
docs/design/tokens.css
docs/design/ui-kit.html
docs/frontend-backlog.md
docs/hackathon/acceptance-checklist.md
docs/hackathon/tracklogic.md
docs/logistic/README.md
docs/logistic/customs-pipeline.print.html
docs/logistic/customs-simple.print.html
docs/logistic/documents.md
docs/logistic/kz-borders.print.html
docs/logistic/rail.print.html
docs/logistic/source/build_pdf.py
docs/logistic/source/customs-pipeline.html
docs/logistic/source/customs-simple.html
docs/logistic/source/kz-borders.html
docs/logistic/source/rail.html
docs/logistic/source/rail_build.py
docs/logistic/source/restyle.py
docs/logistic/Границы Казахстана.pdf
docs/logistic/Железная дорога Китай — Казахстан.pdf
docs/logistic/Растаможка Китай — Казахстан.pdf
docs/logistic/Растаможка на пальцах.pdf
docs/onec-rest-reports.md
docs/partner-workbook-import.md
docs/rag.md
docs/replenishment-case.md
docs/replenishment-data-map.png
docs/replenishment-data-map.svg
docs/replenishment-process.md
docs/replenishment-process.png
docs/replenishment-process.svg
frontend/.dockerignore
frontend/Dockerfile
frontend/index.html
frontend/package-lock.json
frontend/package.json
frontend/public/icon-192.png
frontend/public/icon-512.png
frontend/public/icon.svg
frontend/src/app/App.tsx
frontend/src/app/AppLayout.module.css
frontend/src/app/AppLayout.tsx
frontend/src/app/FloatingAssistant.module.css
frontend/src/app/FloatingAssistant.tsx
frontend/src/app/MobileNav.module.css
frontend/src/app/MobileNav.tsx
frontend/src/app/PageHeader.module.css
frontend/src/app/PageHeader.tsx
frontend/src/app/RequireAuth.tsx
frontend/src/app/RightRail.module.css
frontend/src/app/RightRail.tsx
frontend/src/app/routes.tsx
frontend/src/app/styles.css
frontend/src/main.tsx
frontend/src/modules/assistant/api/assistant.ts
frontend/src/modules/assistant/api/simulation.ts
frontend/src/modules/assistant/api/workspace.ts
frontend/src/modules/assistant/components/AssistantAnswer.module.css
frontend/src/modules/assistant/components/AssistantAnswer.tsx
frontend/src/modules/assistant/components/AssistantPanel.module.css
frontend/src/modules/assistant/components/AssistantPanel.tsx
frontend/src/modules/assistant/components/AssistantWorkspace.tsx
frontend/src/modules/assistant/components/NovaOrb.module.css
frontend/src/modules/assistant/components/NovaOrb.tsx
frontend/src/modules/assistant/components/ProposalCard.tsx
frontend/src/modules/assistant/components/Workspace.module.css
frontend/src/modules/assistant/components/answerReveal.test.mjs
frontend/src/modules/assistant/components/answerReveal.ts
frontend/src/modules/assistant/hooks/useWorkspace.ts
frontend/src/modules/assistant/index.ts
frontend/src/modules/assistant/lib/drafts.ts
frontend/src/modules/assistant/lib/toolLabels.ts
frontend/src/modules/assistant/pages/AssistantPage.module.css
frontend/src/modules/assistant/pages/AssistantPage.tsx
frontend/src/modules/auth/api/auth.ts
frontend/src/modules/auth/hooks/useAuth.ts
frontend/src/modules/auth/index.ts
frontend/src/modules/auth/pages/LoginPage.module.css
frontend/src/modules/auth/pages/LoginPage.tsx
frontend/src/modules/catalogs/api/catalogs.ts
frontend/src/modules/catalogs/components/CatalogEditor.module.css
frontend/src/modules/catalogs/components/CatalogEditor.tsx
frontend/src/modules/catalogs/index.ts
frontend/src/modules/catalogs/manual.ts
frontend/src/modules/catalogs/pages/CatalogsPage.module.css
frontend/src/modules/catalogs/pages/CatalogsPage.tsx
frontend/src/modules/catalogs/quality.ts
frontend/src/modules/dashboard/index.ts
frontend/src/modules/dashboard/pages/DashboardPage.module.css
frontend/src/modules/dashboard/pages/DashboardPage.tsx
frontend/src/modules/data/api/data.ts
frontend/src/modules/data/api/packages.ts
frontend/src/modules/data/api/reports.ts
frontend/src/modules/data/components/PackageImportForm.tsx
frontend/src/modules/data/components/PackageImports.module.css
frontend/src/modules/data/components/PackageImportsPanel.tsx
frontend/src/modules/data/components/PackageReadiness.tsx
frontend/src/modules/data/components/RestReportEditor.module.css
frontend/src/modules/data/components/RestReportEditor.tsx
frontend/src/modules/data/components/RestReportPreview.module.css
frontend/src/modules/data/components/RestReportPreview.tsx
frontend/src/modules/data/components/RestReports.module.css
frontend/src/modules/data/index.ts
frontend/src/modules/data/lib/reportPresentation.test.mjs
frontend/src/modules/data/lib/reportPresentation.ts
frontend/src/modules/data/pages/DataSourcesPage.module.css
frontend/src/modules/data/pages/DataSourcesPage.tsx
frontend/src/modules/data/pages/RestIntegrationsPage.module.css
frontend/src/modules/data/pages/RestIntegrationsPage.tsx
frontend/src/modules/data/types.ts
frontend/src/modules/fleet/api/analysis.ts
frontend/src/modules/fleet/components/EventFeed.module.css
frontend/src/modules/fleet/components/EventFeed.tsx
frontend/src/modules/fleet/components/GeoMap.module.css
frontend/src/modules/fleet/components/GeoMap.tsx
frontend/src/modules/fleet/components/NewTripModal.module.css
frontend/src/modules/fleet/components/NewTripModal.tsx
frontend/src/modules/fleet/components/OrdersCard.module.css
frontend/src/modules/fleet/components/OrdersCard.tsx
frontend/src/modules/fleet/components/SimControls.module.css
frontend/src/modules/fleet/components/SimControls.tsx
frontend/src/modules/fleet/components/TripList.module.css
frontend/src/modules/fleet/components/TripList.tsx
frontend/src/modules/fleet/components/TripSummary.module.css
frontend/src/modules/fleet/components/TripSummary.tsx
frontend/src/modules/fleet/components/VerdictCard.module.css
frontend/src/modules/fleet/components/VerdictCard.tsx
frontend/src/modules/fleet/components/eventIcon.tsx
frontend/src/modules/fleet/data/fleet.ts
frontend/src/modules/fleet/data/geo.ts
frontend/src/modules/fleet/data/places.ts
frontend/src/modules/fleet/data/playbook.ts
frontend/src/modules/fleet/data/trips.ts
frontend/src/modules/fleet/hooks/useAnalysis.ts
frontend/src/modules/fleet/hooks/useFleetSim.ts
frontend/src/modules/fleet/index.ts
frontend/src/modules/fleet/lib/context.ts
frontend/src/modules/fleet/lib/factory.ts
frontend/src/modules/fleet/lib/format.ts
frontend/src/modules/fleet/lib/projection.ts
frontend/src/modules/fleet/lib/route.ts
frontend/src/modules/fleet/lib/simulator.ts
frontend/src/modules/fleet/lib/supplyDemo.ts
frontend/src/modules/fleet/pages/RoutesPage.module.css
frontend/src/modules/fleet/pages/RoutesPage.tsx
frontend/src/modules/fleet/pages/ShipmentsPage.module.css
frontend/src/modules/fleet/pages/ShipmentsPage.tsx
frontend/src/modules/fleet/types.ts
frontend/src/modules/global-search/GlobalSearch.module.css
frontend/src/modules/global-search/GlobalSearch.tsx
frontend/src/modules/global-search/index.ts
frontend/src/modules/inventory/api/inventory.ts
frontend/src/modules/inventory/components/SalesTable.module.css
frontend/src/modules/inventory/components/SalesTable.tsx
frontend/src/modules/inventory/index.ts
frontend/src/modules/inventory/pages/InventoryPage.module.css
frontend/src/modules/inventory/pages/InventoryPage.tsx
frontend/src/modules/notes/api/notes.ts
frontend/src/modules/notes/components/NoteForm.module.css
frontend/src/modules/notes/components/NoteForm.tsx
frontend/src/modules/notes/components/NoteList.tsx
frontend/src/modules/notes/hooks/useNotes.ts
frontend/src/modules/notes/index.ts
frontend/src/modules/notes/pages/NotesPage.module.css
frontend/src/modules/notes/pages/NotesPage.tsx
frontend/src/modules/notes/types.ts
frontend/src/modules/orders/api/orders.ts
frontend/src/modules/orders/index.ts
frontend/src/modules/orders/pages/OrdersPage.module.css
frontend/src/modules/orders/pages/OrdersPage.tsx
frontend/src/modules/orders/types.ts
frontend/src/modules/overview/api/overview.ts
frontend/src/modules/overview/index.ts
frontend/src/modules/overview/pages/OverviewPage.module.css
frontend/src/modules/overview/pages/OverviewPage.tsx
frontend/src/modules/rail-documents/DocumentsPanel.module.css
frontend/src/modules/rail-documents/DocumentsPanel.tsx
frontend/src/modules/rail-documents/api/files.ts
frontend/src/modules/rail-documents/index.ts
frontend/src/modules/replenishment/api/replenishment.ts
frontend/src/modules/replenishment/api/runs.ts
frontend/src/modules/replenishment/components/DemandChart.module.css
frontend/src/modules/replenishment/components/DemandChart.tsx
frontend/src/modules/replenishment/components/RecommendationGroup.tsx
frontend/src/modules/replenishment/index.ts
frontend/src/modules/replenishment/lib/exportCsv.ts
frontend/src/modules/replenishment/lib/presentation.ts
frontend/src/modules/replenishment/pages/RecommendationDetailPage.module.css
frontend/src/modules/replenishment/pages/RecommendationDetailPage.tsx
frontend/src/modules/replenishment/pages/ReplenishmentPage.module.css
frontend/src/modules/replenishment/pages/ReplenishmentPage.tsx
frontend/src/modules/replenishment/pages/RunsPage.module.css
frontend/src/modules/replenishment/pages/RunsPage.tsx
frontend/src/modules/replenishment/runTypes.ts
frontend/src/modules/replenishment/types.ts
frontend/src/modules/ui-kit/index.ts
frontend/src/modules/ui-kit/pages/UiKitPage.module.css
frontend/src/modules/ui-kit/pages/UiKitPage.tsx
frontend/src/shared/api/client.ts
frontend/src/shared/i18n/I18nContext.tsx
frontend/src/shared/i18n/LanguageSwitcher.tsx
frontend/src/shared/navigation/returnPath.ts
frontend/src/shared/pwa/PwaUpdate.tsx
frontend/src/shared/styles/base.css
frontend/src/shared/styles/tokens.css
frontend/src/shared/ui/ActionPreview/ActionPreview.module.css
frontend/src/shared/ui/ActionPreview/ActionPreview.tsx
frontend/src/shared/ui/ActionPreview/index.ts
frontend/src/shared/ui/AiBlock/AiBlock.module.css
frontend/src/shared/ui/AiBlock/AiBlock.tsx
frontend/src/shared/ui/Alert/Alert.module.css
frontend/src/shared/ui/Alert/Alert.tsx
frontend/src/shared/ui/Alert/index.ts
frontend/src/shared/ui/Avatar/Avatar.module.css
frontend/src/shared/ui/Avatar/Avatar.tsx
frontend/src/shared/ui/Avatar/index.ts
frontend/src/shared/ui/Badge/Badge.module.css
frontend/src/shared/ui/Badge/Badge.tsx
frontend/src/shared/ui/Breadcrumbs/Breadcrumbs.module.css
frontend/src/shared/ui/Breadcrumbs/Breadcrumbs.tsx
frontend/src/shared/ui/Breadcrumbs/index.ts
frontend/src/shared/ui/Breakdown/Breakdown.module.css
frontend/src/shared/ui/Breakdown/Breakdown.tsx
frontend/src/shared/ui/Button/Button.module.css
frontend/src/shared/ui/Button/Button.tsx
frontend/src/shared/ui/Button/index.ts
frontend/src/shared/ui/Card/Card.module.css
frontend/src/shared/ui/Card/Card.tsx
frontend/src/shared/ui/Chip/Chip.module.css
frontend/src/shared/ui/Chip/Chip.tsx
frontend/src/shared/ui/Chip/index.ts
frontend/src/shared/ui/Controls/Controls.module.css
frontend/src/shared/ui/Controls/Controls.tsx
frontend/src/shared/ui/Controls/index.ts
frontend/src/shared/ui/EmptyState/EmptyState.module.css
frontend/src/shared/ui/EmptyState/EmptyState.tsx
frontend/src/shared/ui/ErrorState/ErrorState.module.css
frontend/src/shared/ui/ErrorState/ErrorState.tsx
frontend/src/shared/ui/Field/Field.module.css
frontend/src/shared/ui/Field/Field.tsx
frontend/src/shared/ui/FormControls/FormControls.module.css
frontend/src/shared/ui/FormControls/FormControls.tsx
frontend/src/shared/ui/FormControls/index.ts
frontend/src/shared/ui/IconButton/IconButton.module.css
frontend/src/shared/ui/IconButton/IconButton.tsx
frontend/src/shared/ui/IconButton/index.ts
frontend/src/shared/ui/Insight/Insight.module.css
frontend/src/shared/ui/Insight/Insight.tsx
frontend/src/shared/ui/Modal/Modal.module.css
frontend/src/shared/ui/Modal/Modal.tsx
frontend/src/shared/ui/Modal/ModalPresets.tsx
frontend/src/shared/ui/Modal/index.ts
frontend/src/shared/ui/Modal/modal-stack.tsx
frontend/src/shared/ui/Progress/Progress.module.css
frontend/src/shared/ui/Progress/Progress.tsx
frontend/src/shared/ui/Progress/index.ts
frontend/src/shared/ui/ResultNotice/ResultNotice.module.css
frontend/src/shared/ui/ResultNotice/ResultNotice.tsx
frontend/src/shared/ui/ResultNotice/index.ts
frontend/src/shared/ui/Search/Search.module.css
frontend/src/shared/ui/Search/Search.tsx
frontend/src/shared/ui/Search/index.ts
frontend/src/shared/ui/Skeleton/Skeleton.module.css
frontend/src/shared/ui/Skeleton/Skeleton.tsx
frontend/src/shared/ui/Slider/Slider.module.css
frontend/src/shared/ui/Slider/Slider.tsx
frontend/src/shared/ui/Slider/index.ts
frontend/src/shared/ui/Spinner/Spinner.module.css
frontend/src/shared/ui/Spinner/Spinner.tsx
frontend/src/shared/ui/StatRow/StatRow.module.css
frontend/src/shared/ui/StatRow/StatRow.tsx
frontend/src/shared/ui/Table/Table.module.css
frontend/src/shared/ui/Table/Table.tsx
frontend/src/shared/ui/Tabs/Tabs.module.css
frontend/src/shared/ui/Tabs/Tabs.tsx
frontend/src/shared/ui/Tabs/index.ts
frontend/src/shared/ui/ThinkingSteps/ThinkingSteps.module.css
frontend/src/shared/ui/ThinkingSteps/ThinkingSteps.tsx
frontend/src/shared/ui/ThinkingSteps/index.ts
frontend/src/shared/ui/Tile/Tile.module.css
frontend/src/shared/ui/Tile/Tile.tsx
frontend/src/shared/ui/cx.ts
frontend/src/shared/ui/index.ts
frontend/tests/assistant-drafts.test.mjs
frontend/tests/recommendation-presentation.test.mjs
frontend/tsconfig.json
frontend/vite.config.ts
scripts/dev.ps1
scripts/dev.sh
scripts/seed-excel.sh
Ветки (2)

Обсуждение 0 комментариев

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

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