AAYMA
RU
Войти

ProofFlow

Локальное рабочее место закупщика: считает объяснимые черновики заказов поставщикам по SKU и складу, позволяет править и утверждать объёмы и…

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

О проекте

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

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

Суть

Локальное рабочее место закупщика: считает объяснимые черновики заказов поставщикам по SKU и складу, позволяет править и утверждать объёмы и выгружать CSV/XLSX; работает без LLM.

Как устроено

Импортёр нормализует JSON/CSV/XLSX/ZIP и книги партнёра в канонический JSON (products, sales, stockouts, inbound, category_policies и др.) и предупреждает о пропущенных полях. Детерминированный движок очищает спрос от разовых всплесков, восстанавливает спрос в периоды stockout, учитывает сезонность, тренд и заданный рост, прогнозирует на срок поставки плюс период обзора и страховой горизонт, вычитает остаток и датированные поступления и доводит объём до MOQ/кратности. Менеджер утверждает заказ в UI; экспорт защищён от формул, «паспорт расчёта» фиксирует исходные и утверждённые количества с SHA-256.

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

  • удаление разовых всплесков
  • восстановление спроса при stockout
  • сезонность и тренд
  • lead time + review period + safety horizon
  • MOQ/кратность упаковки
  • approval workflow
  • SHA-256 паспорт расчёта
  • защита от CSV/формульных инъекций

Особенности

Каждое требование кейса привязано к отдельному приёмочному тесту и к демо-SKU (DEMO-SEASON, DEMO-STOCKOUT, DEMO-SPIKE). Приложение не выдаёт отсутствующие данные за измеренные, поддерживает ru/kk/en и работает полностью офлайн. Сделано одним автором, коммиты разбиты по часам спринта.

Стек

Python · FastAPI · Uvicorn · SQLite · openpyxl · Pydantic · JavaScript · HTML/CSS · pytest · Docker


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

README

README.md

ProofFlow — объяснимые заказы на пополнение склада

Конкурсный проект команды ProofFlow для задачи Электрокомплект: расчёт черновиков заказов поставщикам по SKU и складам. Сервис показывает не только количество, но и причины рекомендации, происхождение данных и риск дефицита. Заказ не отправляется автоматически: сотрудник проверяет, при необходимости правит объём, утверждает и скачивает CSV/XLSX.

Для менеджера: меньше ручной сверки в Excel, видимые риски дефицита и понятная причина каждой закупки. Экономический эффект требует пилота; проценты экономии на предприятии не заявлены.

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

Нужен Python 3.12+; проверка во время конкурса проводилась в локальном окружении Python 3.14. Интернет нужен только для первоначальной установки пакетов. Runtime не вызывает OpenAI/NVIDIA или другие внешние API и не требует личной подписки участника.

python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements.lock
.\.venv\Scripts\python.exe server.py

Откройте http://127.0.0.1:8000. На Linux/macOS после создания окружения: ./.venv/bin/python -m pip install -r requirements.lock, затем ./.venv/bin/python server.py. Все приведённые ниже команды запускайте через это же окружение: системный Python может не содержать openpyxl.

Проверка без партнёрских данных: нажмите «Загрузить демо», изучите пометку «Синтетические данные», измените остаток или срок поставки одного товара, запустите расчёт, откройте объяснение позиции, скорректируйте заказ, утвердите и выгрузите файл. Шаблон данных можно скачать из интерфейса или GET /api/template и затем загрузить обратно. API-документация: http://127.0.0.1:8000/docs. Это полностью автономная демонстрация без партнёрских файлов и ключей.

Что проверить жюри

Требование кейсаПроверка
История, остатки, товары в пути, категории и прирост влияют на потребностьРаскройте «Данные и параметры товаров», измените остаток или рост товара и пересчитайте. Тест требования 1 меняет источники по отдельности.
Сезонность и устойчивый ростКнопкой i откройте DEMO-SEASON-01 и DEMO-GROW-02: история, прогноз и коэффициенты объясняют рекомендацию. Тест требования 2 проверяет календарную сезонность и тренд.
Компенсация спроса при stockoutDEMO-STOCKOUT-03 показывает восстановленный спрос за заданный период отсутствия товара; тест требования 3 сравнивает с сырыми продажами.
Исключение разового крупного заказаDEMO-SPIKE-04 показывает исключённый объём; повторяющийся спрос сохраняется. Тест требования 4 добавляет крупный заказ.
Поставщики и обоснование каждой позицииПроверьте группы, измените количество, утвердите, скачайте CSV/XLSX. Тест требования 5 проходит сценарий через API.

Все пять проверок находятся в tests/test_workflow_acceptance.py. Демонстрационные stockout-интервалы и клиентские пики заданы в синтетике; они не выдаются за реальные сведения партнёра.

Возможности рабочего места

  • Русский, қазақша и English; светлая и тёмная темы. Выбор сохраняется в браузере. После смены языка пересчитайте данные для новых серверных пояснений и языка экспорта.
  • Фильтры склада, категории и поставщика; редактируемые параметры товаров, политики категорий, MOQ и кратность упаковки.
  • История, прогноз, срочность и объяснение позиции. Покрытие данных показывает подтверждённость исходных полей, а не точность прогноза.
  • CSV/XLSX на языке расчёта. Неизвестные цены остаются пустыми; неполная сумма отмечается.
  • «Паспорт расчёта» — JSON с первоначальными и утверждёнными количествами, сверкой сумм и SHA-256 отпечатком. Это проверка изменений, не цифровая подпись или неизменяемый реестр. Описание отчёта.

Входные данные и метод

Канонический JSON состоит из as_of, products, sales, stockouts, inbound, category_policies, settings, metadata. Точная структура — docs/CONTRACT.md; происхождение и неполнота материалов партнёра — docs/DATA_MAPPING.md. JSON-шаблон из демо содержит только синтетические строки. Поддерживаемые форматы загрузки: JSON, CSV, XLSX и ZIP с известной структурой. Адаптер партнёрских книг работает только с распознанными листами и показывает предупреждения о пропущенных полях/файлах; неизвестную схему нельзя молча считать достоверной.

Расчёт выполняется локально, детерминированно и без LLM. Для каждой пары SKU/склад он очищает исторический спрос от обоснованно выделенных разовых всплесков, оценивает спрос, скрытый подтверждёнными периодами отсутствия товара, учитывает сезонность, устойчивый тренд и настроенный рост, затем прогнозирует потребность на срок поставки, период обзора и страховой горизонт. Текущий остаток и датированные ожидаемые поступления вычитаются в порядке их доступности; черновой заказ доводится до MOQ/кратности упаковки. Параметры алгоритма — инженерные настройки, не нормативы организатора. Подробности и формулы: docs/METHODOLOGY.md.

Если в исходных материалах нет реального остатка, периода отсутствия товара, ETA поставки, клиентского идентификатора или срока поставки, приложение не должно объявлять эти величины измеренными: предупреждения видны до расчёта, а менеджер может ввести недостающие параметры. Без подтверждённых stockout- интервалов компенсация lost sales не рассчитывается по реальным данным; демо отдельно показывает этот механизм на синтетическом примере.

Архитектура и безопасность

Технологии: Python, FastAPI/Uvicorn, SQLite, openpyxl, HTML/CSS/JavaScript, pytest. Расчёт и интерфейс работают локально без LLM-запросов и CDN.

  • importer.py — разбор и нормализация; исходные архивы не помещаются в Git.
  • engine.py — чистый расчёт и пояснения, без сети и записи в базу.
  • server.py — локальный FastAPI, предпросмотр, запуск, проверка/утверждение.
  • storage.py — SQLite в игнорируемой private_data/; детальные ряды SKU загружаются по запросу, чтобы не пересылать весь архив продаж в браузер.
  • exports.py — CSV/XLSX с защитой от формул в недоверенных текстовых полях.
  • evidence.py — сверка рекомендаций и утверждённых количеств, паспорт расчёта.
  • frontend/ — автономный интерфейс без CDN.

Поток данных и границы ответственности модулей — в docs/ARCHITECTURE.md. Матрица правил и ограничений — в docs/COMPLIANCE.md.

Путь к локальной базе можно задать перед запуском сервера. Например:

$env:PROOFFLOW_DATA_DIR = "C:\ProofFlowData"
.\.venv\Scripts\python.exe server.py

По умолчанию используется игнорируемая Git папка private_data/.

По умолчанию сервис слушает только 127.0.0.1. Не публикуйте его в интернет: в проекте нет многопользовательской аутентификации. Dockerfile — удобство локального запуска, не конфигурация защищённого публичного сервиса. Файлы поставщиков и данные клиентов остаются локальными; если поле клиента присутствует, в расчёте допускается только обезличенный ID. Номер документа не выдается за идентификатор клиента. Не загружайте персональные сведения в общедоступные экземпляры приложения.

Проверка и ограничения

.\.venv\Scripts\python.exe scripts/preflight.py
.\.venv\Scripts\python.exe scripts/verify_live_flow.py
.\.venv\Scripts\python.exe scripts/benchmark.py

preflight.py запускает весь локальный тестовый набор и проверку синтаксиса JS (если установлен Node.js). verify_live_flow.py сам поднимает сервер на свободном localhost-порту, проверяет загрузку, расчёт, детали, утверждение, CSV/XLSX и паспорт расчёта, затем останавливает его. Временная база изолирована от ваших рабочих данных. Параметры --locale kk и --locale en выбирают язык проверки. benchmark.py печатает только агрегированные количества и время работы; для проверки предоставленных партнёром файлов передайте пути к ним аргументами. Ни один из этих сценариев не делает push, не отправляет заказ и не заменяет форму сдачи на платформе.

Опциональный локальный контейнер (Docker не обязателен для оценки и не был проверен на конкурсной машине):

docker build -t proofflow .
docker run --rm -p 127.0.0.1:8000:8000 proofflow

Запускайте контейнер только через localhost: публичная публикация этого однопользовательского сервиса без аутентификации небезопасна. Данные в контейнере без тома не сохраняются между запусками.

Ограничения: прогноз статистический, не гарантия спроса; качество зависит от истории и достоверности остатков. Клиентский выброс определяется уверенно только при доступном обезличенном ID; при его отсутствии возможен отдельный анализ аномального документа с явной оговоркой. Цена нужна лишь для ориентировочной суммы: она не влияет на количество, а отсутствующая цена не выдумывается. Рекомендация — черновик для человека, а не автоматический заказ поставщику. Файловый экспорт не является проверенным коннектором 1С: см. docs/1C_COMPATIBILITY.md.

Происхождение и ход разработки

Основная функция написана во время соревновательной части в официальном репозитории команды. Ранее созданный TransClaim — отдельный железнодорожный продукт; его код и готовая функциональность сюда не переносились. Используются общедоступные Python-библиотеки FastAPI, Uvicorn, openpyxl, Pydantic, Pytest с лицензиями их авторов. Рабочие решения и ограничения фиксируются в docs/TEAM_MEMORY.md; факты о часовом прогрессе — в docs/SPRINT.md.

Локальные иконки Phosphor распространяются по MIT с сохранённым уведомлением: происхождение и лицензия визуальных ресурсов. Короткий сценарий демо помогает воспроизвести основной поток.

После финального push необходимо отдельно нажать «Сдать решение» для выбранной задачи на платформе организатора до объявленного freeze. История Git сама по себе не заменяет сдачу.

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

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

waynescript1-ctrl 8

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

  • 2026-09-23 17:43feat: complete explainable replenishment workbench and release gateswaynescript1-ctrl
  • 2026-09-23 16:57feat(hour-4): complete purchasing workbench with languages themes and evidencewaynescript1-ctrl
  • 2026-09-23 16:34feat: import partner workbooks and harden explainable procurementwaynescript1-ctrl
  • 2026-09-23 15:55feat(hour-3): canonical import gateway and data provenance checkswaynescript1-ctrl
  • 2026-09-23 15:41feat: localize procurement decisions and bound calculation resourceswaynescript1-ctrl
  • 2026-09-23 15:32feat: harden procurement API and prove task acceptancewaynescript1-ctrl
  • 2026-09-23 14:56feat(hour-2): explainable procurement engine and local workflow APIwaynescript1-ctrl
  • 2026-09-23 14:00feat(hour-1): working replenishment baseline and regression testswaynescript1-ctrl
Структура репозитория (123 файлов)
.dockerignore
.env.example
.gitignore
AGENTS.md
Dockerfile
README.md
demo_data.py
docs/1C_COMPATIBILITY.md
docs/ARCHITECTURE.md
docs/ASSET_LICENSES.md
docs/COMPLIANCE.md
docs/CONTRACT.md
docs/DATA_MAPPING.md
docs/DEMO.md
docs/EVIDENCE.md
docs/METHODOLOGY.md
docs/OFFICIAL_MATERIALS.md
docs/PARTNER_AUDIT.md
docs/PERFORMANCE.md
docs/REQUIREMENT_TRACE.md
docs/SPRINT.md
docs/SUBMISSION.md
docs/TEAM_MEMORY.md
engine.py
evidence.py
exports.py
frontend/app.js
frontend/assets/icons/LICENSE-phosphor.txt
frontend/assets/icons/arrow-clockwise-duotone.svg
frontend/assets/icons/arrow-clockwise-regular.svg
frontend/assets/icons/arrow-right-duotone.svg
frontend/assets/icons/arrow-right-regular.svg
frontend/assets/icons/basket-duotone.svg
frontend/assets/icons/basket-regular.svg
frontend/assets/icons/buildings-duotone.svg
frontend/assets/icons/buildings-regular.svg
frontend/assets/icons/caret-down-duotone.svg
frontend/assets/icons/caret-down-regular.svg
frontend/assets/icons/chart-line-up-duotone.svg
frontend/assets/icons/chart-line-up-regular.svg
frontend/assets/icons/check-circle-duotone.svg
frontend/assets/icons/check-circle-regular.svg
frontend/assets/icons/clipboard-text-duotone.svg
frontend/assets/icons/clipboard-text-regular.svg
frontend/assets/icons/download-simple-duotone.svg
frontend/assets/icons/download-simple-regular.svg
frontend/assets/icons/file-csv-duotone.svg
frontend/assets/icons/file-csv-regular.svg
frontend/assets/icons/file-xls-duotone.svg
frontend/assets/icons/file-xls-regular.svg
frontend/assets/icons/globe-duotone.svg
frontend/assets/icons/globe-regular.svg
frontend/assets/icons/info-duotone.svg
frontend/assets/icons/info-regular.svg
frontend/assets/icons/lightning-duotone.svg
frontend/assets/icons/lightning-regular.svg
frontend/assets/icons/magnifying-glass-duotone.svg
frontend/assets/icons/magnifying-glass-regular.svg
frontend/assets/icons/moon-duotone.svg
frontend/assets/icons/moon-regular.svg
frontend/assets/icons/package-duotone.svg
frontend/assets/icons/package-regular.svg
frontend/assets/icons/shield-check-duotone.svg
frontend/assets/icons/shield-check-regular.svg
frontend/assets/icons/sliders-horizontal-duotone.svg
frontend/assets/icons/sliders-horizontal-regular.svg
frontend/assets/icons/squares-four-duotone.svg
frontend/assets/icons/squares-four-regular.svg
frontend/assets/icons/sun-duotone.svg
frontend/assets/icons/sun-regular.svg
frontend/assets/icons/target-duotone.svg
frontend/assets/icons/target-regular.svg
frontend/assets/icons/truck-duotone.svg
frontend/assets/icons/truck-regular.svg
frontend/assets/icons/upload-simple-duotone.svg
frontend/assets/icons/upload-simple-regular.svg
frontend/assets/icons/warning-circle-duotone.svg
frontend/assets/icons/warning-circle-regular.svg
frontend/i18n.js
frontend/index.html
frontend/lib/api.js
frontend/lib/format.js
frontend/lib/intro.js
frontend/lib/money.js
frontend/lib/state.js
frontend/lib/views.js
frontend/lib/workflow.js
frontend/package.json
frontend/styles.css
frontend/tests/approval.test.js
frontend/tests/money.test.js
importer.py
localization.py
partner_xlsx.py
procurement.py
quality.py
requirements.lock
requirements.txt
scripts/benchmark.py
scripts/preflight.py
scripts/verify_live_flow.py
server.py
storage.py
tests/test_acceptance.py
tests/test_api.py
tests/test_api_security.py
tests/test_baseline.py
tests/test_end_to_end.py
tests/test_engine.py
tests/test_engine_limits.py
tests/test_engine_localization.py
tests/test_evidence.py
tests/test_evidence_api.py
tests/test_export_i18n.py
tests/test_export_provenance.py
tests/test_forecast_regressions.py
tests/test_i18n.py
tests/test_importer_gateway.py
tests/test_partner_xlsx.py
tests/test_privacy.py
tests/test_quality.py
tests/test_security_performance.py
tests/test_workflow_acceptance.py

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

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

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